added search form

This commit is contained in:
Phuoc Cao
2026-01-31 17:18:55 +01:00
parent 1f29a12983
commit c2c1019d93
9 changed files with 105 additions and 18 deletions

View File

@@ -59,7 +59,7 @@ def includeme(config):
config.include('pyramid_tm') config.include('pyramid_tm')
# use pyramid_retry to retry a request when transient exceptions occur # 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)) session_factory = get_session_factory(get_engine(settings))
config.registry['dbsession_factory'] = session_factory config.registry['dbsession_factory'] = session_factory

View File

@@ -1,4 +1,6 @@
# -*- coding: utf8 -*- # -*- coding: utf8 -*-
from sqlalchemy import text
from .default import ( from .default import (
execute_query, execute_query,
) )
@@ -16,23 +18,23 @@ def get_entries_by_topic(request, topic, tag):
query = query + " AND tag = '{0}'".format(tag) query = query + " AND tag = '{0}'".format(tag)
query = query + " ORDER BY tag, title;" query = query + " ORDER BY tag, title;"
results = request.dbsession.execute(query).fetchall() results = request.dbsession.execute(text(query)).fetchall()
return results return results
def get_entries_related(request, _id): def get_entries_related(request, _id):
query = """SELECT *, strftime('%d/%m/%Y', edited) AS edit_date FROM entries_related WHERE id=: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 return results
def get_entries_related_by_id(request, _id, id_related): 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;""" 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 return results
def get_entries_by_id(request, _id): def get_entries_by_id(request, _id):
query = """SELECT *, strftime('%d/%m/%Y', created) AS create_date, query = """SELECT *, strftime('%d/%m/%Y', created) AS create_date,
strftime('%d/%m/%Y', edited) AS edit_date FROM entries WHERE id=:id;""" 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 return results
def get_entries_count_by_topic(request): 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 topics ON entries.topic_id = topics.topic
INNER JOIN tags ON entries.tag = tags.tag INNER JOIN tags ON entries.tag = tags.tag
GROUP BY entries.tag ORDER BY entries.topic_id, entries.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 return results
def get_last_created(request): def get_last_created(request):
@@ -52,7 +54,7 @@ def get_last_created(request):
query = query + " AND status='publié'" query = query + " AND status='publié'"
query = query + " ORDER BY created DESC LIMIT 15;" query = query + " ORDER BY created DESC LIMIT 15;"
results = request.dbsession.execute(query).fetchall() results = request.dbsession.execute(text(query)).fetchall()
return results return results
def get_last_edited(request): def get_last_edited(request):
@@ -63,36 +65,50 @@ def get_last_edited(request):
query = query + " AND status='publié'" query = query + " AND status='publié'"
query = query + " ORDER BY edited DESC LIMIT 10;" query = query + " ORDER BY edited DESC LIMIT 10;"
results = request.dbsession.execute(query).fetchall() results = request.dbsession.execute(text(query)).fetchall()
return results return results
def get_activities(request): def get_activities(request):
# gest the Activities section # gest the Activities section
query = "SELECT * FROM entries WHERE topic_id = '_admin' AND title like 'Activities - column%' ORDER BY title;" 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 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): def get_tags_byTopic(request, topic):
# get tags # get tags
query = "SELECT * FROM tags WHERE topic=:topic ORDER BY tag_name;" 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 return results
def get_tags_byId(request, id): def get_tags_byId(request, id):
query = "SELECT * FROM tags WHERE id=: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 return results
def get_topic_byTopic(request, id): def get_topic_byTopic(request, id):
# get the name of a given topic # get the name of a given topic
query = "SELECT * FROM topics WHERE topic=: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 return results
def get_topics(request): def get_topics(request):
# get all topics # get all topics
query = "SELECT * FROM topics ORDER BY topic_name;" 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 return results
def delete_entry(request, id): def delete_entry(request, id):

View File

@@ -4,6 +4,7 @@ def includeme(config):
config.add_route('blog', '/blog/{id:\d+}/{slug}') config.add_route('blog', '/blog/{id:\d+}/{slug}')
config.add_route('blog_copy', '/blog_copy/{topic}/{id}') config.add_route('blog_copy', '/blog_copy/{topic}/{id}')
config.add_route('blog_edit', '/blog_edit/{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('contact', '/contact')
config.add_route('images', '/images') config.add_route('images', '/images')
config.add_route('image_edit', '/image_edit/{filename}') config.add_route('image_edit', '/image_edit/{filename}')

View File

@@ -0,0 +1,52 @@
{% extends "layout.jinja2" %}
{% block content %}
<div class="card mb-0">
<div class="card-body">
<form id="search-form" class="form-horizontal" role="form" action="/blog_search" method="post">
<div class="mb-3">
<div class="input-group mb-3">
<input type="text" class="form-control" name="criteria">
<button class="btn btn-primary" type="submit" name="form.submitted">Rechercher</button>
</div>
</form>
<div class="row">
{% if items : %}
<table class="table table-sm">
<thead>
<tr>
<th>Titre</th>
<th>Tags</th>
<th>Date</th>
<th></th>
</tr>
</thead>
<tbody class="table-group-divider">
{% for entry in items %}
<tr>
<td>
<a href="{{ request.route_url('blog', id=entry.id, slug='slug') }}">
{{ entry.title }}
</a>
</td>
<td>{{ entry.tag }}</td>
<td>{{ entry.edit_date }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
<p>Aucune entrée trouvée pour : [<span class="text-danger">{{ criteria }}</span>]</p>
{% endif %}
</div>
<br />
<br />
</div>
</div>
{% endblock %}

View File

@@ -188,6 +188,8 @@
{% endif %} {% endif %}
<li><a class="dropdown-item" href="{{request.route_url('settings')}}"> <li><a class="dropdown-item" href="{{request.route_url('settings')}}">
<i class="ti ti-settings fs-6"></i> Paramètres</a></li> <i class="ti ti-settings fs-6"></i> Paramètres</a></li>
<li><a class="dropdown-item" href="{{request.route_url('blog_search')}}">
<i class="ti ti-search fs-6"></i> Recherche</a></li>
<li><a class="dropdown-item" href="{{request.route_url('logout')}}"> <li><a class="dropdown-item" href="{{request.route_url('logout')}}">
<i class="ti ti-logout fs-6"></i> Se déconnecter</a></li> <i class="ti ti-logout fs-6"></i> Se déconnecter</a></li>
</ul> </ul>

View File

@@ -51,7 +51,6 @@
<div class="pt-4"> <div class="pt-4">
<h4>Versions des packages</h4> <h4>Versions des packages</h4>
<ul> <ul>
<li>cao_sunyata {{ app_version }}</li>
<li>Pyramid {{ pyramid_version }}</li> <li>Pyramid {{ pyramid_version }}</li>
<li>Bootstrap v5.3.0</li> <li>Bootstrap v5.3.0</li>
<li>jQuery v3.4.0</li> <li>jQuery v3.4.0</li>

View File

@@ -165,6 +165,23 @@ def blog_edit(request):
'relateds': relateds, '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') @view_config(route_name='related_edit', renderer='../templates/related_edit.jinja2', permission='view')
def related_edit(request): def related_edit(request):
# get tag parameters from request # get tag parameters from request

View File

@@ -92,7 +92,7 @@ def settings(request):
sqlalchemy_version = pkg_resources.get_distribution("sqlalchemy").version sqlalchemy_version = pkg_resources.get_distribution("sqlalchemy").version
sqlite_version = sqlite3.sqlite_version sqlite_version = sqlite3.sqlite_version
python_version = sys.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 { return {
'page_title': "Paramètres", 'page_title': "Paramètres",

View File

@@ -15,11 +15,11 @@ requires = [
'pyramid_debugtoolbar', 'pyramid_debugtoolbar',
'waitress', 'waitress',
'pyramid_mailer', 'pyramid_mailer',
'pyramid_retry', # 'pyramid_retry',
'pyramid_tm', 'pyramid_tm',
'SQLAlchemy==1.4.54', 'SQLAlchemy==1.4.54',
'transaction', 'transaction',
'zope.sqlalchemy==2.0', 'zope.sqlalchemy==2.0', # last version supporting python 3.9
'webhelpers2', # various web building related helpers 'webhelpers2', # various web building related helpers
'passlib', 'passlib',
'python-magic', 'python-magic',