diff --git a/caotek_mesavoirs/layout.py b/caotek_mesavoirs/layout.py index 3157355..761365b 100644 --- a/caotek_mesavoirs/layout.py +++ b/caotek_mesavoirs/layout.py @@ -7,10 +7,13 @@ from .views.default import ( to_percent, to_decimal, ) +from .models.contents import ( + get_docs_themes, +) @layout_config(template='templates/global_layout.pt') class GlobalLayout(object): - # page_title = "Pagode Tinh-Do" + # page_title = "Cao's blog" def __init__(self, context, request): self.context = context @@ -30,8 +33,8 @@ class GlobalLayout(object): return to_percent(x, d) def isAnonymous(self): - user = self.request.authenticated_userid - return user is None + logged_in = self.request.authenticated_userid + return logged_in is None def isAdmin(self): logged_in = self.request.authenticated_userid @@ -42,3 +45,13 @@ class GlobalLayout(object): is_admin = True return is_admin + + def get_themes(self): + # lire toutes les themes + logged_in = self.request.authenticated_userid + themes = get_docs_themes(self.request, logged_in) + dossiers = [] + for theme in themes: + dossiers.append(theme.theme) + return dossiers + diff --git a/caotek_mesavoirs/models/contents.py b/caotek_mesavoirs/models/contents.py new file mode 100644 index 0000000..58271b4 --- /dev/null +++ b/caotek_mesavoirs/models/contents.py @@ -0,0 +1,84 @@ +# -*- coding: utf8 -*- +from sqlalchemy import text +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import ( + scoped_session, + sessionmaker, +) + +from zope.sqlalchemy import ZopeTransactionExtension, mark_changed + +from datetime import * +import transaction +from urllib.request import urlopen + +from .default import ( + execute_query, +) + +def get_docs(request, doc_id): + """Lire les doc""" + if doc_id == 0: + query = "SELECT * FROM docs ORDER BY theme, intitule;" + results = request.dbsession.execute(query).fetchall() + else: + query = "SELECT * FROM docs where doc_id = :doc_id;" + results = request.dbsession.execute(query, {'doc_id': doc_id}).first() + return results + +def get_docs_bytheme(request, theme, logged_in): + """Lire les doc""" + if logged_in == None: + anon = "AND statut = 'public' " + else: + anon = "" + if theme == 'BLOG': + query = "SELECT * FROM docs WHERE theme=:theme %s ORDER BY cree_le DESC LIMIT 10;" % anon + else: + query = "SELECT * FROM docs WHERE theme=:theme ORDER BY intitule;" + results = request.dbsession.execute(query, {'theme': theme}).fetchall() + return results + +def get_docs_tags(request): + query = "SELECT * FROM docs_tags;" + results = request.dbsession.execute(query).fetchall() + return results + +def get_docs_themes(request, logged_in): + if logged_in == None: + query = "SELECT * FROM docs_themes WHERE statut = 'public';" + else: + query = "SELECT * FROM docs_themes;" + results = request.dbsession.execute(query).fetchall() + return results + +def get_docs_bycritere(request, critere, logged_in): + if logged_in == None: + query = "SELECT * FROM docs WHERE (texte like :critere) OR (intitule like :critere) AND statut = 'public';" + else: + query = "SELECT * FROM docs WHERE (texte like :critere) OR (intitule like :critere);" + results = request.dbsession.execute(query, {'critere': '%' + critere + '%'}).fetchall() + return results + +def update_doc(request, doc_id, new_values): + """créér ou modifier le doc""" + # formater les champs + s = '' + for param in new_values.keys(): + if s: + s += ",%s=:%s" % (param, param) + else: + s = "%s=:%s" % (param, param) + + if doc_id == '0': + query = "INSERT INTO docs SET %s;" % s + else: + new_values['doc_id'] = doc_id + query = "update docs SET %s WHERE doc_id = :doc_id;" % s + execute_query(request, query, new_values) + +def delete_doc(request, doc_id): + """supprimer la doc""" + query = "delete from docs where doc_id = :doc_id;" + execute_query(request, query, {'doc_id': doc_id}) + diff --git a/caotek_mesavoirs/models/default.py b/caotek_mesavoirs/models/default.py index 1a27860..d9e9e08 100644 --- a/caotek_mesavoirs/models/default.py +++ b/caotek_mesavoirs/models/default.py @@ -17,62 +17,3 @@ def execute_query(request, query, params): mark_changed(request.dbsession) transaction.commit() -def get_docs(request, doc_id): - """Lire les doc""" - if doc_id == 0: - query = "SELECT * FROM docs ORDER BY theme, intitule;" - results = request.dbsession.execute(query).fetchall() - else: - query = "SELECT * FROM docs where doc_id = :doc_id;" - results = request.dbsession.execute(query, {'doc_id': doc_id}).first() - return results - -def get_docs_bytheme(request, theme): - """Lire les doc""" - if theme == 'BLOG': - query = "SELECT * FROM docs WHERE theme=:theme ORDER BY cree_le DESC LIMIT 10;" - else: - query = "SELECT * FROM docs WHERE theme=:theme ORDER BY intitule;" - results = request.dbsession.execute(query, {'theme': theme}).fetchall() - return results - -def get_docs_tags(request): - query = "SELECT * FROM docs_tags;" - results = request.dbsession.execute(query).fetchall() - return results - -def get_docs_themes(request): - query = "SELECT * FROM docs_themes;" - results = request.dbsession.execute(query).fetchall() - return results - -def get_docs_bycritere(request, critere, logged_in): - if logged_in == None: - query = "SELECT * FROM docs JOIN docs_themes ON docs.theme = docs_themes.theme WHERE (docs.texte like :critere) OR (docs.intitule like :critere) AND docs_themes.visible = 'oui';" - else: - query = "SELECT * FROM docs JOIN docs_themes ON docs.theme = docs_themes.theme WHERE (docs.texte like :critere) OR (docs.intitule like :critere);" - results = request.dbsession.execute(query, {'critere': '%' + critere + '%'}).fetchall() - return results - -def update_doc(request, doc_id, new_values): - """créér ou modifier le doc""" - # formater les champs - s = '' - for param in new_values.keys(): - if s: - s += ",%s=:%s" % (param, param) - else: - s = "%s=:%s" % (param, param) - - if doc_id == '0': - query = "INSERT INTO docs SET %s;" % s - else: - new_values['doc_id'] = doc_id - query = "update docs SET %s WHERE doc_id = :doc_id;" % s - execute_query(request, query, new_values) - -def delete_doc(request, doc_id): - """supprimer la doc""" - query = "delete from docs where doc_id = :doc_id;" - execute_query(request, query, {'doc_id': doc_id}) - diff --git a/caotek_mesavoirs/routes.py b/caotek_mesavoirs/routes.py index 763e647..e65768a 100644 --- a/caotek_mesavoirs/routes.py +++ b/caotek_mesavoirs/routes.py @@ -2,7 +2,8 @@ def includeme(config): config.add_static_view('static', 'static', cache_max_age=3600) config.add_route('home', '/') config.add_route('apropos', 'apropos') - config.add_route('archives', '/archives') + # contents + config.add_route('folder', '/folder/{theme}') config.add_route('doc_edit', '/doc_edit/{doc_id}') config.add_route('doc_view', '/doc_view/{doc_id}') config.add_route('doc_search', '/doc_search') diff --git a/caotek_mesavoirs/static/css/style.less b/caotek_mesavoirs/static/css/style.less index 54fc08f..69307f8 100644 --- a/caotek_mesavoirs/static/css/style.less +++ b/caotek_mesavoirs/static/css/style.less @@ -8,6 +8,7 @@ border-radius: 0; min-height: 70px; font-size: 20px !important; + letter-spacing: 5px; } .navbar li a, .navbar { @@ -49,6 +50,12 @@ color: #000000 !important; } +.menu-item { + font-size: 20px !important; + letter-spacing: 5px; +} + + @media (min-width: 1200px) { .container{ max-width: 900px; diff --git a/caotek_mesavoirs/templates/archives.pt b/caotek_mesavoirs/templates/archives.pt deleted file mode 100644 index 0214798..0000000 --- a/caotek_mesavoirs/templates/archives.pt +++ /dev/null @@ -1,37 +0,0 @@ -
-
- -
-
-
- - -
- -
-
-
- - - - - - - -
${ligne.intitule}${ligne.tag1}${ligne.cree_le.strftime("%d-%m-%Y")}${ligne.modif_le.strftime("%d-%m-%Y")}
-
- -
-
-
- -
- diff --git a/caotek_mesavoirs/templates/doc_edit.pt b/caotek_mesavoirs/templates/contents/doc_edit.pt similarity index 87% rename from caotek_mesavoirs/templates/doc_edit.pt rename to caotek_mesavoirs/templates/contents/doc_edit.pt index 7b4a11d..8dd65b0 100644 --- a/caotek_mesavoirs/templates/doc_edit.pt +++ b/caotek_mesavoirs/templates/contents/doc_edit.pt @@ -1,4 +1,4 @@ -
+
@@ -50,6 +50,16 @@
+
+ +
+ +
+
diff --git a/caotek_mesavoirs/templates/doc_search.pt b/caotek_mesavoirs/templates/contents/doc_search.pt similarity index 97% rename from caotek_mesavoirs/templates/doc_search.pt rename to caotek_mesavoirs/templates/contents/doc_search.pt index 56b88c5..a98bd82 100644 --- a/caotek_mesavoirs/templates/doc_search.pt +++ b/caotek_mesavoirs/templates/contents/doc_search.pt @@ -1,4 +1,4 @@ -
+
diff --git a/caotek_mesavoirs/templates/doc_view.pt b/caotek_mesavoirs/templates/contents/doc_view.pt similarity index 64% rename from caotek_mesavoirs/templates/doc_view.pt rename to caotek_mesavoirs/templates/contents/doc_view.pt index 2d5a981..5415e26 100644 --- a/caotek_mesavoirs/templates/doc_view.pt +++ b/caotek_mesavoirs/templates/contents/doc_view.pt @@ -1,4 +1,4 @@ -
+

@@ -10,8 +10,12 @@ Page text goes here.


- Dernière modification le ${modif_le}
+ Dernière modification le ${doc.modif_le.strftime('%d/%m/%Y')}
Tags : ${tags} + +
+ Status : ${doc.statut} +


diff --git a/caotek_mesavoirs/templates/contents/folder.pt b/caotek_mesavoirs/templates/contents/folder.pt new file mode 100644 index 0000000..6711f91 --- /dev/null +++ b/caotek_mesavoirs/templates/contents/folder.pt @@ -0,0 +1,19 @@ +
+
+ +
+ + + + + + +
${ligne.intitule}${ligne.tag1}${ligne.cree_le.strftime("%d-%m-%Y")}
+
+ +
+
+
+ +
+ diff --git a/caotek_mesavoirs/templates/global_layout.pt b/caotek_mesavoirs/templates/global_layout.pt index 7f56b35..ffcbe2f 100644 --- a/caotek_mesavoirs/templates/global_layout.pt +++ b/caotek_mesavoirs/templates/global_layout.pt @@ -65,6 +65,11 @@

+
+ + ${item}  + +

${page_title}

-

+


-


+

© 2017 - Phuoc Cao |  à propos |  recherche diff --git a/caotek_mesavoirs/templates/home.pt b/caotek_mesavoirs/templates/home.pt index 79c957a..0609de7 100644 --- a/caotek_mesavoirs/templates/home.pt +++ b/caotek_mesavoirs/templates/home.pt @@ -10,7 +10,7 @@

Derniers posts

- | Voir les archives | + | Voir tous les posts | Créer un nouveau post |

diff --git a/caotek_mesavoirs/templates/panels/dropdown_menu_panel.pt b/caotek_mesavoirs/templates/panels/dropdown_menu_panel.pt index 2db1cc4..b2f8b33 100644 --- a/caotek_mesavoirs/templates/panels/dropdown_menu_panel.pt +++ b/caotek_mesavoirs/templates/panels/dropdown_menu_panel.pt @@ -11,7 +11,7 @@
  • Mes préférences
  • Markdown syntax
  • Gestion des membres
  • -
  • Portefeuille
  • +
  • Portfolio
  • diff --git a/caotek_mesavoirs/templates/portfolio/portfolio.pt b/caotek_mesavoirs/templates/portfolio/portfolio.pt index 9acce31..01667f1 100644 --- a/caotek_mesavoirs/templates/portfolio/portfolio.pt +++ b/caotek_mesavoirs/templates/portfolio/portfolio.pt @@ -59,10 +59,10 @@

    - Allocation globale : 60% actions + 5% REITS + 35% obligations
    - Allocation actions D (1/2) : 60% US (18%) + 30% Europe (12%)
    - Allocation actions C (1/2) : 100% World (30%)
    - [Cette allocation est inspirée de celle du
    Fond souverain Norvégien] + Allocation globale : 70% actions + 30% obligations
    + [Inspirée du + Fond souverain Norvégien]
    + Allocation actions : 80% Monde (56%) + 20% Croissance (14%)

  • diff --git a/caotek_mesavoirs/views/contents.py b/caotek_mesavoirs/views/contents.py new file mode 100644 index 0000000..d4aa2e8 --- /dev/null +++ b/caotek_mesavoirs/views/contents.py @@ -0,0 +1,142 @@ +# -*- coding: utf8 -*- +from pyramid.response import Response +from pyramid.renderers import render, get_renderer +from pyramid.view import ( + view_config, + forbidden_view_config, +) +from pyramid.httpexceptions import ( + HTTPFound, + HTTPNotFound, + HTTPForbidden, +) + +from ..models.contents import * + +def isAnonymous(self): + logged_in = self.request.authenticated_userid + return logged_in is None + +@view_config(route_name='folder', renderer='../templates/contents/folder.pt') +def folder(request): + theme = request.matchdict['theme'] + logged_in = request.authenticated_userid + + # lire toutes les docs du theme + docs = get_docs_bytheme(request, theme, logged_in) + + return { + 'page_title': "Contenu de %s" % theme.upper(), + 'docs': docs, + } + +@view_config(route_name='doc_edit', renderer='../templates/contents/doc_edit.pt', permission='view') +def doc_edit(request): + doc_id = request.matchdict['doc_id'] + url = request.route_url('doc_edit',doc_id=doc_id) + logged_in = request.authenticated_userid + + message = "" + themes = get_docs_themes(request, logged_in) + tags = get_docs_tags(request) + statuts = ['private', 'public'] + + if doc_id == '0': + titre = "Nouveau doc" + # nouveau + doc = {} + doc['intitule'] = '' + doc['texte'] = '' + doc['theme'] = '' + doc['tag1'] = '' + doc['tag2'] = '' + doc['statut'] = 'private' + else: + titre = "Modifier : %s" % str(doc_id) + doc = get_docs(request, doc_id) + + if 'form.submitted' in request.params: + new_values = {} + for param, db_value in doc.items(): + if param in request.params and request.params[param] != db_value: + new_values[param] = request.params[param] + + if new_values: + update_doc(request, doc_id, new_values) + if doc_id != '0': + return HTTPFound(location=request.route_url('doc_view', doc_id=doc_id)) + else: + return HTTPFound(location=request.route_url('folder',theme=request.params['theme'])) + + if 'form.deleted' in request.params: + if doc_id != '0': + delete_doc(request, doc_id) + request.session.flash(u"<%s> est supprimée avec succès." % doc.intitule, 'success') + return HTTPFound(location=request.route_url('folder',theme=doc.theme)) + + return { + 'page_title': titre, + 'url': url, + 'message': message, + 'doc_id': doc_id, + 'doc': doc, + 'themes': themes, + 'tags': tags, + 'statuts': statuts, + } + +@view_config(route_name='doc_search', renderer='../templates/contents/doc_search.pt') +def doc_search(request): + + logged_in = request.authenticated_userid + critere = '' + docs = [] + + if 'form.submitted' in request.params: + critere = request.params['critere'] + # si afficher tous les fiches ? + docs = get_docs_bycritere(request, critere, logged_in) + + return { + 'page_title': "Rechercher", + 'docs': docs, + 'critere': critere, + } + +@view_config(route_name='doc_view', renderer='../templates/contents/doc_view.pt') +def doc_view(request): + + doc_id = request.matchdict['doc_id'] + + # lire le document + doc = get_docs(request, doc_id) + + if isAnonymous and doc.statut == 'private': + # si anonyme, interdire de voir les docs privés + return HTTPFound(location=request.route_url('home')) + + if doc_id == '2': + # mouvements portfolio, retour vers portfolio + url_retour = request.route_url('portfolio') + else: + url_retour = request.route_url('folder',theme=doc.theme) + tags = doc.tag1 + if doc.tag2: + tags += ', ' + doc.tag2 + + # insèrer le path de static/img + texte = doc.texte.replace('static/img/', "%s/static/img/" % request.application_url) + + # convertir mardown en HTML + from markdown2 import Markdown + markdowner = Markdown() + texte = markdowner.convert(texte) + + return { + 'page_title': doc.intitule, + 'doc_id': doc_id, + 'doc': doc, + 'texte': texte, + 'tags': tags, + 'url_retour':url_retour, + } diff --git a/caotek_mesavoirs/views/default.py b/caotek_mesavoirs/views/default.py index 2a89756..d4368cf 100644 --- a/caotek_mesavoirs/views/default.py +++ b/caotek_mesavoirs/views/default.py @@ -16,17 +16,17 @@ from pyramid_mailer.message import Message, Attachment from sqlalchemy.exc import DBAPIError from ..security import groupfinder -from ..models.default import * from ..models.members import ( get_member_by_email ) +from ..models.contents import ( + get_docs_bytheme +) # import datetime import time import hashlib import locale -import json -import yfinance as yf def to_decimal(x): import decimal @@ -68,106 +68,19 @@ def to_percent(x, d): @view_config(route_name='home', renderer='../templates/home.pt') def home(request): + logged_in = request.authenticated_userid member = get_member_by_email(request, 'ctphuoc@gmail.com') id_photo = member.photo_instagram # lire toutes les docs - items = get_docs_bytheme(request, 'BLOG') + items = get_docs_bytheme(request, 'BLOG', logged_in) return { - 'page_title': "Un geek à la retraite", + 'page_title': "Méditer, c’est ouvrir la cage", 'items': items, 'id_photo': id_photo, } -@view_config(route_name='archives', renderer='../templates/archives.pt') -def archives(request): - theme = 'blog' - - if 'theme' in request.params: - theme = request.params["theme"] - - # lire la table des themes - themes = get_docs_themes(request) - - # lire toutes les docs du theme - docs = get_docs_bytheme(request, theme) - - return { - 'page_title': "Archives de %s" % theme, - 'docs': docs, - 'themes': themes, - 'theme': theme, - } - -@view_config(route_name='doc_edit', renderer='../templates/doc_edit.pt', permission='view') -def doc_edit(request): - doc_id = request.matchdict['doc_id'] - url = request.route_url('doc_edit',doc_id=doc_id) - - message = "" - themes = get_docs_themes(request) - tags = get_docs_tags(request) - - if doc_id == '0': - titre = "Nouveau doc" - # nouveau - doc = {} - doc['intitule'] = '' - doc['texte'] = '' - doc['theme'] = '' - doc['tag1'] = '' - doc['tag2'] = '' - else: - titre = "Modifier : %s" % str(doc_id) - doc = get_docs(request, doc_id) - - if 'form.submitted' in request.params: - new_values = {} - for param, db_value in doc.items(): - if param in request.params and request.params[param] != db_value: - new_values[param] = request.params[param] - - if new_values: - update_doc(request, doc_id, new_values) - if doc_id != '0': - return HTTPFound(location=request.route_url('doc_view', doc_id=doc_id)) - else: - return HTTPFound(location=request.route_url('archives',theme=request.params['theme'])) - - if 'form.deleted' in request.params: - if doc_id != '0': - delete_doc(request, doc_id) - request.session.flash(u"<%s> est supprimée avec succès." % doc.intitule, 'success') - return HTTPFound(location=request.route_url('archives',theme=doc.theme)) - - return { - 'page_title': titre, - 'url': url, - 'message': message, - 'doc_id': doc_id, - 'doc': doc, - 'themes': themes, - 'tags': tags, - } - -@view_config(route_name='doc_search', renderer='../templates/doc_search.pt') -def doc_search(request): - - logged_in = request.authenticated_userid - critere = '' - docs = [] - - if 'form.submitted' in request.params: - critere = request.params['critere'] - # si afficher tous les fiches ? - docs = get_docs_bycritere(request, critere, logged_in) - - return { - 'page_title': "Rechercher", - 'docs': docs, - 'critere': critere, - } @view_config(route_name='apropos', renderer='../templates/apropos.pt') def apropos(request): @@ -177,40 +90,6 @@ def apropos(request): 'page_title': "A propos", } - -@view_config(route_name='doc_view', renderer='../templates/doc_view.pt') -def doc_view(request): - - logged_in = request.authenticated_userid - doc_id = request.matchdict['doc_id'] - - doc = get_docs(request, doc_id) - if logged_in == None and doc.theme == 'memo': - # si anonyme, interdire de voir les memo - return HTTPFound(location=request.route_url('home')) - - url_retour = request.route_url('archives',theme=doc.theme) - tags = doc.tag1 - if doc.tag2: - tags += ', ' + doc.tag2 - - # insèrer le path de static/img - texte = doc.texte.replace('static/img/', "%s/static/img/" % request.application_url) - - # convertir mardown en HTML - from markdown2 import Markdown - markdowner = Markdown() - texte = markdowner.convert(texte) - - return { - 'page_title': doc.intitule, - 'doc_id': doc_id, - 'texte': texte, - 'modif_le': doc.modif_le.strftime('%d/%m/%Y'), - 'tags': tags, - 'url_retour':url_retour - } - def envoyerMail(request, destinataire, objet, corps): body = """