Amélioration relation imports récurrents / étiquettes

- les imports récurrents sont mis à jour quand on renomme ou supprime une étiquette
- ajout de liens pour naviguer entre deux de ces objets
This commit is contained in:
Jean-Marie Favreau 2024-11-27 16:25:59 +01:00
parent c9275c5ea0
commit 41f6dbc352
5 changed files with 39 additions and 10 deletions

View File

@ -39,13 +39,13 @@
<li><strong>Adresse naviguable&nbsp;:</strong> <a href="{{ object.browsable_url }}">{{ object.browsable_url }}</a></li> <li><strong>Adresse naviguable&nbsp;:</strong> <a href="{{ object.browsable_url }}">{{ object.browsable_url }}</a></li>
<li><strong>Valeurs par défaut&nbsp;:</strong> <li><strong>Valeurs par défaut&nbsp;:</strong>
<ul> <ul>
<li><strong>Publié&nbsp;:</strong> {{ object.defaultPublished }}</li> <li><strong>Publié&nbsp;:</strong> {{ object.defaultPublished|yesno:"Oui,Non" }}</li>
<li><strong>Localisation&nbsp;:</strong> {{ object.defaultLocation }}</li> {% if object.defaultLocation %}<li><strong>Localisation&nbsp;:</strong> {{ object.defaultLocation }}</li>{% endif %}
<li><strong>Catégorie&nbsp;:</strong> {{ object.defaultCategory }}</li> <li><strong>Catégorie&nbsp;:</strong> {{ object.defaultCategory }}</li>
<li><strong>Organisateur&nbsp;:</strong> <a href="{{ object.defaultOrganiser.get_absolute_url }}">{{ object.defaultOrganiser }}</a></li> {% if object.defaultOrganiser %}<li><strong>Organisateur&nbsp;:</strong> <a href="{{ object.defaultOrganiser.get_absolute_url }}">{{ object.defaultOrganiser }}</a></li>{% endif %}
<li><strong>Étiquettes&nbsp;:</strong> <li><strong>Étiquettes&nbsp;:</strong>
{% for tag in object.defaultTags %} {% for tag in object.defaultTags %}
{{ tag|tw_highlight }}{% if not forloop.last %}, {% endif %} <a href="{% url 'view_tag' tag %}">{{ tag|tw_highlight }}</a>{% if not forloop.last %}, {% endif %}
{% endfor %} {% endfor %}
</li> </li>
</ul> </ul>

View File

@ -62,6 +62,12 @@
{% endif %} {% endif %}
<footer> <footer>
{% if user.is_authenticated and rimports %}
<p>Cette étiquette est ajoutée par défaut {% if rimports.count == 1 %}à l'import récurrent{% else %}aux imports récurrents&nbsp;:{% endif %}
{% for ri in rimports %}
<a href="{{ ri.get_absolute_url }}">{{ ri.name }}</a>{% if not forloop.last %}, {% endif %}
{% endfor %}</p>
{% endif %}
{% include 'agenda_culturel/paginator.html' %} {% include 'agenda_culturel/paginator.html' %}
</footer> </footer>
</article> </article>

View File

@ -20,6 +20,12 @@
{% else %} sera bien sûr conservé, mais perdra cette étiquette. {% else %} sera bien sûr conservé, mais perdra cette étiquette.
{% endif %}</p> {% endif %}</p>
{% endif %} {% endif %}
{% if nbi > 0 %}
<p>Remarquez qu'elle est associée à {{ nbi }} import{{ nbs|pluralize }} récurrent{{ nbs|pluralize }}, qui
{% if nbi > 1 %} seront bien sûr conservés, mais perdront cette étiquette.
{% else %} sera bien sûr conservé, mais perdra cette étiquette.
{% endif %}</p>
{% endif %}
{% if obj %} {% if obj %}
<p>Différentes informations sont associées à cette étiquette (description, suggestion d'inclusion, etc) <p>Différentes informations sont associées à cette étiquette (description, suggestion d'inclusion, etc)
seront également perdues lors de cette suppression.</p> seront également perdues lors de cette suppression.</p>

View File

@ -17,7 +17,7 @@
<article> <article>
<header> <header>
<h1>Renommer l'étiquette {{ tag }}</em></h1> <h1>Renommer l'étiquette {{ tag }}</em></h1>
<p>En renommant l'étiquette {{ tag }}, vous remplacerez cette étiquette par la nouvelle pour tous les événements concernés.</p> <p>En renommant l'étiquette {{ tag }}, vous remplacerez cette étiquette par la nouvelle pour tous les événements et tous les imports récurrents concernés.</p>
</header> </header>

View File

@ -1971,10 +1971,10 @@ def view_tag(request, t):
except EmptyPage: except EmptyPage:
response = paginator.page(paginator.num_pages) response = paginator.page(paginator.num_pages)
rimports = RecurrentImport.objects.filter(defaultTags__contains=[t])
tag = Tag.objects.filter(name=t).first() tag = Tag.objects.filter(name=t).first()
context = {"tag": t, "paginator_filter": response, "object": tag} context = {"tag": t, "paginator_filter": response, "object": tag, "rimports": rimports}
return render(request, "agenda_culturel/tag.html", context) return render(request, "agenda_culturel/tag.html", context)
@ -2037,11 +2037,21 @@ def rename_tag(request, t):
e.tags += [new_name] e.tags += [new_name]
Event.objects.bulk_update(events, fields=["tags"]) Event.objects.bulk_update(events, fields=["tags"])
# find all recurrent imports and fix them
rimports = RecurrentImport.objects.filter(defaultTags__contains=[t])
for ri in rimports:
ri.tags = [te for te in ri.defaultTags if te != t]
if not new_name in ri.tags:
ri.tags += [new_name]
RecurrentImport.objects.bulk_update(rimports, fields=["defaultTags"])
# find tag object # find tag object
tag_object = Tag.objects.filter(name=t).first() tag_object = Tag.objects.filter(name=t).first()
if tag_object: if tag_object:
tag_object.name = new_name tag_object.name = new_name
tag_object.save() tag_object.save()
messages.success( messages.success(
request, request,
(_( (_(
@ -2060,8 +2070,6 @@ def rename_tag(request, t):
@permission_required("agenda_culturel.delete_tag") @permission_required("agenda_culturel.delete_tag")
def delete_tag(request, t): def delete_tag(request, t):
respage = reverse_lazy("view_all_tags") respage = reverse_lazy("view_all_tags")
nb = Event.objects.filter(tags__contains=[t]).count()
obj = Tag.objects.filter(name=t).first()
if request.method == "POST": if request.method == "POST":
@ -2071,6 +2079,12 @@ def delete_tag(request, t):
e.tags = [te for te in e.tags if te != t] e.tags = [te for te in e.tags if te != t]
Event.objects.bulk_update(events, fields=["tags"]) Event.objects.bulk_update(events, fields=["tags"])
# remove tag from recurrent imports
rimports = RecurrentImport.objects.filter(defaultTags__contains=[t])
for ri in rimports:
ri.tags = [te for te in ri.defaultTags if te != t]
RecurrentImport.objects.bulk_update(rimports, fields=["defaultTags"])
# find tag object # find tag object
tag_object = Tag.objects.filter(name=t).first() tag_object = Tag.objects.filter(name=t).first()
if tag_object: if tag_object:
@ -2084,11 +2098,14 @@ def delete_tag(request, t):
) )
return HttpResponseRedirect(respage) return HttpResponseRedirect(respage)
else: else:
nb = Event.objects.filter(tags__contains=[t]).count()
obj = Tag.objects.filter(name=t).first()
nbi = RecurrentImport.objects.filter(defaultTags__contains=[t]).count()
cancel_url = request.META.get("HTTP_REFERER", "") cancel_url = request.META.get("HTTP_REFERER", "")
if cancel_url == "": if cancel_url == "":
cancel_url = respage cancel_url = respage
return render( return render(
request, request,
"agenda_culturel/tag_confirm_delete_by_name.html", "agenda_culturel/tag_confirm_delete_by_name.html",
{"tag": t, "nb": nb, "cancel_url": cancel_url, "obj": obj}, {"tag": t, "nb": nb, "nbi": nbi, "cancel_url": cancel_url, "obj": obj},
) )