added related entries table

This commit is contained in:
2025-09-25 11:50:50 +02:00
parent 39862b54a9
commit 75d6e4662d
8 changed files with 193 additions and 18 deletions

Binary file not shown.

View File

@@ -33,6 +33,16 @@ def get_entries_by_criteria(request, criteria):
results = request.dbsession.execute(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()
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()
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;"""
@@ -107,6 +117,10 @@ def delete_tag(request, id):
query = "DELETE FROM tags WHERE id = :id ;"
execute_query(request, query, {'id': id})
def delete_related(request, id, id_related):
query = "DELETE FROM entries_related WHERE id = :id AND id_related = :id_related;"
execute_query(request, query, {'id': id, 'id_related': id_related})
def delete_topic(request, topic):
query = "DELETE FROM topics WHERE topic = :topic ;"
execute_query(request, query, {'topic': topic})
@@ -149,6 +163,22 @@ def update_tag(request, id, new_values):
query = "UPDATE tags SET %s WHERE id = :id;" % s
execute_query(request, query, new_values)
def create_related(request, id, id_related, new_values):
# formater les champs
s = ''
for param in new_values.keys():
if s:
s += ",%s=:%s" % (param, param)
else:
s = "%s=:%s" % (param, param)
# import pdb;pdb.set_trace()
query = "INSERT INTO entries_related (id, id_related, title_related, author_related, edited, creator) " \
"VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}')".format(
new_values['id'], new_values['id_related'], new_values['title_related'], new_values['author_related'],
new_values['edited'], new_values['creator'])
execute_query(request, query, new_values)
def update_topic(request, topic, new_values):
# formater les champs
s = ''

View File

@@ -10,6 +10,7 @@ def includeme(config):
config.add_route('image_edit', '/image_edit/{filename}')
config.add_route('login', '/login')
config.add_route('logout', '/logout')
config.add_route('related_edit', '/related_edit/{topic}/{id}/{id_related}')
config.add_route('settings', '/settings')
config.add_route('stats_pages', '/stats_pages')
config.add_route('tag_edit', '/tag_edit/{topic}/{id}')

View File

@@ -24,14 +24,16 @@
<hr/>
{% if entry.source_link != '' %}
<ul>
<li><b>{{ scr_label }}</b> : <a href="{{ entry.source_link }}">{{ entry.source_title }}</a> - {{ entry.source_site }}</li>
</ul>
<p><b>{{ scr_label }}</b> : <a href="{{ entry.source_link }}">{{ entry.source_title }}</a> - {{ entry.source_site }}</p>
{% endif %}
{% if entry.related %}
{% if relateds %}
<div><b>{{ rel_label }}</b> : </div>
<ul>
<li><b>{{ rel_label }}</b> : <a href="{{ request.route_url('blog', id=related.id, slug=related.title) }}">{{ related.title }}</a> - {{ related.author }}</li>
{% for entry in relateds %}
<li><a href="{{ request.route_url('blog', id=entry.id_related, slug=entry.title_related) }}">{{ entry.title_related }}</a> - {{ entry.author_related }}</li>
{% endfor %}
</ul>
<br>
{% endif %}
<p>

View File

@@ -44,11 +44,6 @@
<input class="form-control" name="source_title" type="text" value="{{entry.source_title}}">
</div>
<div class="mb-3">
<label class="form-label for="author">Contenu corrélé</label>
<input class="form-control" name="related" type="text" value="{{entry.related}}">
</div>
<div class="mb-3">
<label class="form-label required-field" for="status">Statut</label>
<select class="form-control" id="status" name="status" value="{{ entry.status}}">
@@ -81,11 +76,43 @@
{% endif %}
</div>
<p class="text-center">Apprendre la syntaxe de <a href="https://daringfireball.net/projects/markdown/syntax"
<p class="text-end">La syntaxe de <a href="https://daringfireball.net/projects/markdown/syntax"
target="_blank">Markdown</a></li></p>
</form>
<h3>Contenus corrélés</h3>
<p><a href="{{ request.route_url('related_edit', topic=entry.topic_id, id=entry.id, id_related='0') }}" class="btn btn-success" role="button">
<span class="ti ti-plus"></span> Nouveau</a>
</p>
<table class="table table-striped table-bordered table-sm">
<thead>
<tr>
<th>Id</th>
<th>Titre</th>
<th>Auteur</th>
<th>Modifié le</th>
<th>Par</th>
</tr>
</thead>
<tbody class="table-group-divider">
{% for related in relateds %}
<tr>
<td>{{ related.id_related }}</td>
<td>
<a href="{{ request.route_url('related_edit', topic=entry.topic_id, id=related.id, id_related=related.id_related) }}">
{{ related.title_related }}
</a>
</td>
<td>{{ related.author_related }}</td>
<td>{{ related.edit_date }}</td>
<td>{{ related.creator }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<!-- Modal : Confirmation SUPRESSION -->
<div id="confirmDelete" class="modal">
<div class="modal-dialog">

View File

@@ -0,0 +1,53 @@
{% extends "layout.jinja2" %}
{% block content %}
<div class="card mb-0">
<div class="card-body">
<form action="{{ url }}" method="post" class="form needs-validation">
<div class="mb-3">
<label class="form-label required-field" for="id_related">Id du contenu corrélé</label>
<input class="form-control" name="id_related" type="text" value="{{entry.id_related}}" required>
</div>
<div class="mb-3">
<a class="btn btn-light" href="{{ url_retour }}">
<span class="ti ti-chevron-left"></span> Retour</a>
{% if entry.id_related == '0' %}
<button class="btn btn-primary" type="submit" name="form.submitted">
<span class="ti ti-check"></span> Enregistrer</button>
{% else %}
<button class="btn btn-danger" type="button" data-bs-toggle="modal" data-bs-target="#confirmDelete">
<span class="ti ti-x"></span> Supprimer</button>
{% endif %}
</div>
</form>
<!-- Modal : Confirmation SUPRESSION -->
<div id="confirmDelete" class="modal">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Supprimer le contenu corrélé</h4>
</div>
<div class="modal-body">
<!-- The form is placed inside the body of modal -->
<p>Etes-vous certain(e) de vouloir supprimer le contenu <b>{{ entry.id_related }}</b> ?</p>
</div>
<div class="modal-footer">
<form id="confirmForm" method="post">
<button type="submit" class="btn btn-danger" name="form.deleted">Supprimer</button>
<button type="button" class="btn btn-success" data-bs-dismiss="modal">Fermer</button>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -45,7 +45,7 @@
</div>
</form>
<br>
<h3>Liste des Tags</h3>
<p><a href="{{ request.route_url('tag_edit', topic=entry.topic, id='0') }}" class="btn btn-success" role="button">
<span class="ti ti-plus"></span> Nouveau</a>

View File

@@ -23,20 +23,19 @@ def blog(request):
rel_label = 'Nội dung liên quan'
else:
scr_label = 'Source'
rel_label = 'Contenu corrélé'
rel_label = 'Contenu(s) corrélé(s)'
# insèrer le path de static/img
body = entry.body.replace('static/', "%s/static/" % request.application_url)
# convertir de markdown en HTML
body_html = markdown.markdown(body, extensions=['footnotes'])
# lire le contenu correle
if entry.related != '0':
related = get_entries_by_id(request, entry.related)
# lire les contenus correles
relateds = get_entries_related(request, entry.id)
return {
'page_title': entry.title,
'entry': entry,
'related': related,
'relateds': relateds,
'scr_label': scr_label,
'rel_label': rel_label,
'body_html': body_html,
@@ -101,13 +100,16 @@ def blog_edit(request):
entry['editor'] = ''
page_title = 'Nouvelle page'
url_retour = request.route_url('topic', topic=topic)
relateds = []
else:
# modify post
entry = get_entries_by_id(request, blog_id)
if not entry:
request.session.flash("Page non trouvée : %s" % blog_id, 'warning')
return HTTPFound(url_retour)
# lire les contenus correles
relateds = get_entries_related(request, entry.id)
page_title = 'Modifier : ' + entry.title
entry_slug = urlify(entry.title)
url_retour = request.route_url('blog', id=blog_id, slug=entry_slug)
@@ -160,6 +162,66 @@ def blog_edit(request):
'blog_id': blog_id,
'entry': entry,
'tags': tags,
'relateds': relateds,
}
@view_config(route_name='related_edit', renderer='../templates/related_edit.jinja2', permission='view')
def related_edit(request):
# get tag parameters from request
topic = request.matchdict['topic']
id_related = request.matchdict['id_related']
id = request.matchdict['id']
id_related = request.matchdict['id_related']
url = request.route_url('related_edit', topic=topic, id=id, id_related=id_related)
url_retour = request.route_url('blog_edit',topic=topic, id=id)
if id_related == '0':
# create a new related
entry = {}
entry['id'] = id
entry['id_related'] = '0'
entry['tag_name'] = ''
page_title = "Nouveau Contenu corrélé"
else:
# modify post
entry = get_entries_related_by_id(request, id, id_related)
if not entry:
request.session.flash(u"Contenu non trouvé : %s, %s" % (id, id_related), 'warning')
return HTTPFound(location=request.route_url('related_edit', id=id, id_related=id_related))
page_title = "Modification du contenu corrélé " + str(entry.id_related)
if 'form.submitted' in request.params :
id_related = request.params["id_related"]
if id_related != '0' :
# lire le post correle
related = get_entries_by_id(request, id_related)
if related:
# post trouvé
new_values = {}
new_values['id'] = id
new_values['id_related'] = id_related
new_values['title_related'] = related.title
new_values['author_related'] = related.author
new_values['edited'] = datetime.datetime.now()
new_values['creator'] = request.authenticated_userid
create_related(request, id, id_related, new_values)
request.session.flash(u"La fiche a été mise à jour avec succès.", 'success')
return HTTPFound(location=url_retour)
else:
request.session.flash("Le contenu corrélé est invalide !", 'danger')
return HTTPFound(location=url_retour)
if 'form.deleted' in request.params:
delete_related(request, id, id_related)
request.session.flash("La fiche a été supprimée avec succès.", 'success')
return HTTPFound(location=url_retour)
return {
'page_title': page_title,
'url': url,
'url_retour': url_retour,
'entry': entry,
}