added related entries table
This commit is contained in:
Binary file not shown.
@@ -33,6 +33,16 @@ def get_entries_by_criteria(request, criteria):
|
|||||||
results = request.dbsession.execute(query).fetchall()
|
results = request.dbsession.execute(query).fetchall()
|
||||||
return results
|
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):
|
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;"""
|
||||||
@@ -107,6 +117,10 @@ def delete_tag(request, id):
|
|||||||
query = "DELETE FROM tags WHERE id = :id ;"
|
query = "DELETE FROM tags WHERE id = :id ;"
|
||||||
execute_query(request, query, {'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):
|
def delete_topic(request, topic):
|
||||||
query = "DELETE FROM topics WHERE topic = :topic ;"
|
query = "DELETE FROM topics WHERE topic = :topic ;"
|
||||||
execute_query(request, query, {'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
|
query = "UPDATE tags SET %s WHERE id = :id;" % s
|
||||||
execute_query(request, query, new_values)
|
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):
|
def update_topic(request, topic, new_values):
|
||||||
# formater les champs
|
# formater les champs
|
||||||
s = ''
|
s = ''
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ def includeme(config):
|
|||||||
config.add_route('image_edit', '/image_edit/{filename}')
|
config.add_route('image_edit', '/image_edit/{filename}')
|
||||||
config.add_route('login', '/login')
|
config.add_route('login', '/login')
|
||||||
config.add_route('logout', '/logout')
|
config.add_route('logout', '/logout')
|
||||||
|
config.add_route('related_edit', '/related_edit/{topic}/{id}/{id_related}')
|
||||||
config.add_route('settings', '/settings')
|
config.add_route('settings', '/settings')
|
||||||
config.add_route('stats_pages', '/stats_pages')
|
config.add_route('stats_pages', '/stats_pages')
|
||||||
config.add_route('tag_edit', '/tag_edit/{topic}/{id}')
|
config.add_route('tag_edit', '/tag_edit/{topic}/{id}')
|
||||||
|
|||||||
@@ -24,14 +24,16 @@
|
|||||||
<hr/>
|
<hr/>
|
||||||
|
|
||||||
{% if entry.source_link != '' %}
|
{% if entry.source_link != '' %}
|
||||||
<ul>
|
<p><b>{{ scr_label }}</b> : <a href="{{ entry.source_link }}">{{ entry.source_title }}</a> - {{ entry.source_site }}</p>
|
||||||
<li><b>{{ scr_label }}</b> : <a href="{{ entry.source_link }}">{{ entry.source_title }}</a> - {{ entry.source_site }}</li>
|
|
||||||
</ul>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if entry.related %}
|
{% if relateds %}
|
||||||
|
<div><b>{{ rel_label }}</b> : </div>
|
||||||
<ul>
|
<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>
|
</ul>
|
||||||
|
<br>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|||||||
@@ -44,11 +44,6 @@
|
|||||||
<input class="form-control" name="source_title" type="text" value="{{entry.source_title}}">
|
<input class="form-control" name="source_title" type="text" value="{{entry.source_title}}">
|
||||||
</div>
|
</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">
|
<div class="mb-3">
|
||||||
<label class="form-label required-field" for="status">Statut</label>
|
<label class="form-label required-field" for="status">Statut</label>
|
||||||
<select class="form-control" id="status" name="status" value="{{ entry.status}}">
|
<select class="form-control" id="status" name="status" value="{{ entry.status}}">
|
||||||
@@ -81,11 +76,43 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</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>
|
target="_blank">Markdown</a></li></p>
|
||||||
|
|
||||||
</form>
|
</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 -->
|
<!-- Modal : Confirmation SUPRESSION -->
|
||||||
<div id="confirmDelete" class="modal">
|
<div id="confirmDelete" class="modal">
|
||||||
<div class="modal-dialog">
|
<div class="modal-dialog">
|
||||||
|
|||||||
53
cao_sunyata/templates/related_edit.jinja2
Normal file
53
cao_sunyata/templates/related_edit.jinja2
Normal 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 %}
|
||||||
@@ -45,7 +45,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
</form>
|
</form>
|
||||||
|
<br>
|
||||||
<h3>Liste des Tags</h3>
|
<h3>Liste des Tags</h3>
|
||||||
<p><a href="{{ request.route_url('tag_edit', topic=entry.topic, id='0') }}" class="btn btn-success" role="button">
|
<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>
|
<span class="ti ti-plus"></span> Nouveau</a>
|
||||||
|
|||||||
@@ -23,20 +23,19 @@ def blog(request):
|
|||||||
rel_label = 'Nội dung liên quan'
|
rel_label = 'Nội dung liên quan'
|
||||||
else:
|
else:
|
||||||
scr_label = 'Source'
|
scr_label = 'Source'
|
||||||
rel_label = 'Contenu corrélé'
|
rel_label = 'Contenu(s) corrélé(s)'
|
||||||
|
|
||||||
# insèrer le path de static/img
|
# insèrer le path de static/img
|
||||||
body = entry.body.replace('static/', "%s/static/" % request.application_url)
|
body = entry.body.replace('static/', "%s/static/" % request.application_url)
|
||||||
# convertir de markdown en HTML
|
# convertir de markdown en HTML
|
||||||
body_html = markdown.markdown(body, extensions=['footnotes'])
|
body_html = markdown.markdown(body, extensions=['footnotes'])
|
||||||
# lire le contenu correle
|
# lire les contenus correles
|
||||||
if entry.related != '0':
|
relateds = get_entries_related(request, entry.id)
|
||||||
related = get_entries_by_id(request, entry.related)
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'page_title': entry.title,
|
'page_title': entry.title,
|
||||||
'entry': entry,
|
'entry': entry,
|
||||||
'related': related,
|
'relateds': relateds,
|
||||||
'scr_label': scr_label,
|
'scr_label': scr_label,
|
||||||
'rel_label': rel_label,
|
'rel_label': rel_label,
|
||||||
'body_html': body_html,
|
'body_html': body_html,
|
||||||
@@ -101,13 +100,16 @@ def blog_edit(request):
|
|||||||
entry['editor'] = ''
|
entry['editor'] = ''
|
||||||
page_title = 'Nouvelle page'
|
page_title = 'Nouvelle page'
|
||||||
url_retour = request.route_url('topic', topic=topic)
|
url_retour = request.route_url('topic', topic=topic)
|
||||||
|
relateds = []
|
||||||
else:
|
else:
|
||||||
# modify post
|
# modify post
|
||||||
entry = get_entries_by_id(request, blog_id)
|
entry = get_entries_by_id(request, blog_id)
|
||||||
if not entry:
|
if not entry:
|
||||||
request.session.flash("Page non trouvée : %s" % blog_id, 'warning')
|
request.session.flash("Page non trouvée : %s" % blog_id, 'warning')
|
||||||
return HTTPFound(url_retour)
|
return HTTPFound(url_retour)
|
||||||
|
|
||||||
|
# lire les contenus correles
|
||||||
|
relateds = get_entries_related(request, entry.id)
|
||||||
page_title = 'Modifier : ' + entry.title
|
page_title = 'Modifier : ' + entry.title
|
||||||
entry_slug = urlify(entry.title)
|
entry_slug = urlify(entry.title)
|
||||||
url_retour = request.route_url('blog', id=blog_id, slug=entry_slug)
|
url_retour = request.route_url('blog', id=blog_id, slug=entry_slug)
|
||||||
@@ -160,6 +162,66 @@ def blog_edit(request):
|
|||||||
'blog_id': blog_id,
|
'blog_id': blog_id,
|
||||||
'entry': entry,
|
'entry': entry,
|
||||||
'tags': tags,
|
'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,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user