manager: add error when deleting an EventType linked to an Agenda (#85974)
gitea/chrono/pipeline/head This commit looks good Details

This commit is contained in:
Yann Weber 2024-01-22 15:11:16 +01:00 committed by Yann Weber
parent d428ef8385
commit 9945568a57
2 changed files with 65 additions and 4 deletions

View File

@ -44,6 +44,7 @@ from django.utils.encoding import force_str
from django.utils.formats import date_format
from django.utils.functional import cached_property
from django.utils.html import format_html
from django.utils.safestring import SafeString
from django.utils.translation import gettext_lazy as _
from django.utils.translation import ngettext
from django.views.generic import (
@ -884,6 +885,41 @@ class EventsTypeDeleteView(DeleteView):
raise PermissionDenied()
return super().dispatch(request, *args, **kwargs)
def can_be_deleted(self):
return self.get_object().agendas.count() == 0
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
if self.can_be_deleted():
return ctx
obj = self.get_object()
ctx['cannot_delete'] = True
title = '<h3>%(title)s</h3>' % {
'title': _('Cannot delete event type "%(event_type_name)s"') % {'event_type_name': obj}
}
msg = _('Following agendas are style using this event type :')
lst = '<ul><li>%(agendas)s</li></ul>' % {
'agendas': '</li><li>'.join(
[
'<a href="%s">%s</a>'
% (reverse('chrono-manager-agenda-view', kwargs={'pk': agenda.pk}), agenda)
for agenda in obj.agendas.all()
]
)
}
ctx['cannot_delete_msg'] = SafeString(
'%(title)s %(msg)s %(agendas)s' % {'title': title, 'msg': msg, 'agendas': lst}
)
return ctx
def post(self, *args, **kwargs):
if self.can_be_deleted():
return super().post(*args, **kwargs)
raise PermissionDenied()
def get_success_url(self):
return reverse('chrono-manager-events-type-list')

View File

@ -164,10 +164,7 @@ def test_delete_events_type(app, admin_user):
def test_delete_referenced_events_type(app):
events_type = EventsType.objects.create(label='Foobar')
events_type.save()
agenda = Agenda(label='Foo Bar', events_type=events_type)
agenda.save()
agenda = Agenda.objects.create(label='Foo Bar', events_type=events_type)
events_type.delete()
@ -176,6 +173,34 @@ def test_delete_referenced_events_type(app):
assert agenda.events_type is None
def test_delete_referenced_events_type_error(app, admin_user):
events_type = EventsType.objects.create(label='Foobar')
agenda = Agenda.objects.create(label='Foo Bar', events_type=events_type)
app = login(app)
resp = app.get('/manage/events-types/', status=200)
resp = resp.click(href='/manage/events-type/%s/delete/' % events_type.pk)
resp.form.submit(status=403)
assert EventsType.objects.get(pk=events_type.pk)
assert 'Cannot delete event type "' in resp
assert '<a href="/manage/agendas/%s/">%s</a>' % (agenda.pk, agenda) in resp
agenda.delete()
# Now deletion should be OK
resp = app.get('/manage/events-types/', status=200)
resp = resp.click(href='/manage/events-type/%s/delete/' % events_type.pk)
assert 'Cannot delete event type "' not in resp
assert '<a href="/manage/agendas/%s/">%s</a>' % (agenda.pk, agenda) not in resp
resp.form.submit()
assert EventsType.objects.exists() is False
def test_delete_events_type_as_manager(app, manager_user):
agenda = Agenda(label='Foo Bar')
agenda.view_role = manager_user.groups.all()[0]