From c2c1019d935979d31707d482f17f4f7a6cda369a Mon Sep 17 00:00:00 2001 From: Phuoc Cao Date: Sat, 31 Jan 2026 17:18:55 +0100 Subject: [PATCH] added search form --- cao_sunyata/models/__init__.py | 2 +- cao_sunyata/models/entries.py | 40 ++++++++++++------ cao_sunyata/routes.py | 1 + cao_sunyata/templates/blog_search.jinja2 | 52 ++++++++++++++++++++++++ cao_sunyata/templates/layout.jinja2 | 2 + cao_sunyata/templates/settings.jinja2 | 1 - cao_sunyata/views/blog.py | 17 ++++++++ cao_sunyata/views/default.py | 2 +- setup.py | 6 +-- 9 files changed, 105 insertions(+), 18 deletions(-) create mode 100644 cao_sunyata/templates/blog_search.jinja2 diff --git a/cao_sunyata/models/__init__.py b/cao_sunyata/models/__init__.py index 24773c2..7487b01 100644 --- a/cao_sunyata/models/__init__.py +++ b/cao_sunyata/models/__init__.py @@ -59,7 +59,7 @@ def includeme(config): config.include('pyramid_tm') # use pyramid_retry to retry a request when transient exceptions occur - config.include('pyramid_retry') + # config.include('pyramid_retry') session_factory = get_session_factory(get_engine(settings)) config.registry['dbsession_factory'] = session_factory diff --git a/cao_sunyata/models/entries.py b/cao_sunyata/models/entries.py index 9478d71..f897443 100644 --- a/cao_sunyata/models/entries.py +++ b/cao_sunyata/models/entries.py @@ -1,4 +1,6 @@ # -*- coding: utf8 -*- +from sqlalchemy import text + from .default import ( execute_query, ) @@ -16,23 +18,23 @@ def get_entries_by_topic(request, topic, tag): query = query + " AND tag = '{0}'".format(tag) query = query + " ORDER BY tag, title;" - results = request.dbsession.execute(query).fetchall() + results = request.dbsession.execute(text(query)).fetchall() return results def get_entries_related(request, _id): query = """SELECT *, strftime('%d/%m/%Y', edited) AS edit_date FROM entries_related WHERE id=:id;""" - results = request.dbsession.execute(query, {'id':_id}).fetchall() + results = request.dbsession.execute(text(query), {'id':_id}).fetchall() return results def get_entries_related_by_id(request, _id, id_related): query = """SELECT *, strftime('%d/%m/%Y', edited) AS edit_date FROM entries_related WHERE id=:id AND id_related=:id_related;""" - results = request.dbsession.execute(query, {'id':_id, 'id_related':id_related}).first() + results = request.dbsession.execute(text(query), {'id':_id, 'id_related':id_related}).first() return results def get_entries_by_id(request, _id): query = """SELECT *, strftime('%d/%m/%Y', created) AS create_date, strftime('%d/%m/%Y', edited) AS edit_date FROM entries WHERE id=:id;""" - results = request.dbsession.execute(query, {'id':_id}).first() + results = request.dbsession.execute(text(query), {'id':_id}).first() return results def get_entries_count_by_topic(request): @@ -41,7 +43,7 @@ def get_entries_count_by_topic(request): INNER JOIN topics ON entries.topic_id = topics.topic INNER JOIN tags ON entries.tag = tags.tag GROUP BY entries.tag ORDER BY entries.topic_id, entries.tag;""" - results = request.dbsession.execute(query,).fetchall() + results = request.dbsession.execute(text(query),).fetchall() return results def get_last_created(request): @@ -52,7 +54,7 @@ def get_last_created(request): query = query + " AND status='publié'" query = query + " ORDER BY created DESC LIMIT 15;" - results = request.dbsession.execute(query).fetchall() + results = request.dbsession.execute(text(query)).fetchall() return results def get_last_edited(request): @@ -63,36 +65,50 @@ def get_last_edited(request): query = query + " AND status='publié'" query = query + " ORDER BY edited DESC LIMIT 10;" - results = request.dbsession.execute(query).fetchall() + results = request.dbsession.execute(text(query)).fetchall() return results def get_activities(request): # gest the Activities section query = "SELECT * FROM entries WHERE topic_id = '_admin' AND title like 'Activities - column%' ORDER BY title;" - results = request.dbsession.execute(query,).all() + results = request.dbsession.execute(text(query)).all() return results +def get_entries_by_criteria(request, criteria): + search = "%{}%".format(criteria) + query = f"SELECT *, strftime('%d/%m/%Y', edited) AS edit_date FROM entries WHERE title like '{search}' or body like '{search}'" + if request.authenticated_userid == None: + # if user is anonym, display only published posts + query = query + " AND status='publié'" + else: + if request.authenticated_userid != 'admin': + # if user is not 'admin', hide admin posts + query = query + " AND tag != '_admin'" + query = query + " ORDER BY title;" + results = request.dbsession.execute(query).fetchall() + return results + def get_tags_byTopic(request, topic): # get tags query = "SELECT * FROM tags WHERE topic=:topic ORDER BY tag_name;" - results = request.dbsession.execute(query, {'topic':topic}).all() + results = request.dbsession.execute(text(query), {'topic':topic}).all() return results def get_tags_byId(request, id): query = "SELECT * FROM tags WHERE id=:id;" - results = request.dbsession.execute(query, {'id':id}).first() + results = request.dbsession.execute(text(query), {'id':id}).first() return results def get_topic_byTopic(request, id): # get the name of a given topic query = "SELECT * FROM topics WHERE topic=:topic;" - results = request.dbsession.execute(query, {'topic':id}).first() + results = request.dbsession.execute(text(query), {'topic':id}).first() return results def get_topics(request): # get all topics query = "SELECT * FROM topics ORDER BY topic_name;" - results = request.dbsession.execute(query, {'topic':id}).all() + results = request.dbsession.execute(text(query), {'topic':id}).all() return results def delete_entry(request, id): diff --git a/cao_sunyata/routes.py b/cao_sunyata/routes.py index 498416b..0d924d5 100644 --- a/cao_sunyata/routes.py +++ b/cao_sunyata/routes.py @@ -4,6 +4,7 @@ def includeme(config): config.add_route('blog', '/blog/{id:\d+}/{slug}') config.add_route('blog_copy', '/blog_copy/{topic}/{id}') config.add_route('blog_edit', '/blog_edit/{topic}/{id}') + config.add_route('blog_search', '/blog_search') config.add_route('contact', '/contact') config.add_route('images', '/images') config.add_route('image_edit', '/image_edit/{filename}') diff --git a/cao_sunyata/templates/blog_search.jinja2 b/cao_sunyata/templates/blog_search.jinja2 new file mode 100644 index 0000000..f6873fe --- /dev/null +++ b/cao_sunyata/templates/blog_search.jinja2 @@ -0,0 +1,52 @@ +{% extends "layout.jinja2" %} + + {% block content %} + +
+
+ +
+ +
+
+ + + +
+ + +
+ {% if items : %} + + + + + + + + + + + {% for entry in items %} + + + + + + {% endfor %} + +
TitreTagsDate
+ + {{ entry.title }} + + {{ entry.tag }}{{ entry.edit_date }}
+ {% else %} +

Aucune entrée trouvée pour : [{{ criteria }}]

+ {% endif %} +
+
+
+ +
+
+ {% endblock %} \ No newline at end of file diff --git a/cao_sunyata/templates/layout.jinja2 b/cao_sunyata/templates/layout.jinja2 index 3383796..e4992ee 100644 --- a/cao_sunyata/templates/layout.jinja2 +++ b/cao_sunyata/templates/layout.jinja2 @@ -188,6 +188,8 @@ {% endif %}
  • Paramètres
  • +
  • + Recherche
  • Se déconnecter
  • diff --git a/cao_sunyata/templates/settings.jinja2 b/cao_sunyata/templates/settings.jinja2 index 5876b49..72025a7 100644 --- a/cao_sunyata/templates/settings.jinja2 +++ b/cao_sunyata/templates/settings.jinja2 @@ -51,7 +51,6 @@

    Versions des packages

      -
    • cao_sunyata {{ app_version }}
    • Pyramid {{ pyramid_version }}
    • Bootstrap v5.3.0
    • jQuery v3.4.0
    • diff --git a/cao_sunyata/views/blog.py b/cao_sunyata/views/blog.py index f461b4a..4e6f3f2 100644 --- a/cao_sunyata/views/blog.py +++ b/cao_sunyata/views/blog.py @@ -165,6 +165,23 @@ def blog_edit(request): 'relateds': relateds, } +@view_config(route_name='blog_search', renderer='../templates/blog_search.jinja2') +def blog_search(request): + + criteria = '' + + items = [] + if 'form.submitted' in request.params: + criteria = request.params['criteria'] + # si afficher tous les fiches ? + items = get_entries_by_criteria(request, criteria) + + return { + 'page_title': "Rechercher", + 'items': items, + 'criteria': criteria, + } + @view_config(route_name='related_edit', renderer='../templates/related_edit.jinja2', permission='view') def related_edit(request): # get tag parameters from request diff --git a/cao_sunyata/views/default.py b/cao_sunyata/views/default.py index 831f97f..8f915d1 100644 --- a/cao_sunyata/views/default.py +++ b/cao_sunyata/views/default.py @@ -92,7 +92,7 @@ def settings(request): sqlalchemy_version = pkg_resources.get_distribution("sqlalchemy").version sqlite_version = sqlite3.sqlite_version python_version = sys.version - app_version = pkg_resources.require("cao_sunyata")[0].version + app_version = '1.0' # pkg_resources.require("cao_sunyata")[0].version return { 'page_title': "Paramètres", diff --git a/setup.py b/setup.py index fec285c..3a5780e 100644 --- a/setup.py +++ b/setup.py @@ -15,11 +15,11 @@ requires = [ 'pyramid_debugtoolbar', 'waitress', 'pyramid_mailer', - 'pyramid_retry', + # 'pyramid_retry', 'pyramid_tm', - 'SQLAlchemy==1.4.54', + 'SQLAlchemy==1.4.54', 'transaction', - 'zope.sqlalchemy==2.0', + 'zope.sqlalchemy==2.0', # last version supporting python 3.9 'webhelpers2', # various web building related helpers 'passlib', 'python-magic',