manager: add error when deleting an EventType linked to an Agenda (#85974)
gitea/chrono/pipeline/head This commit looks good
Details
gitea/chrono/pipeline/head This commit looks good
Details
This commit is contained in:
parent
d428ef8385
commit
9945568a57
|
@ -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')
|
||||
|
||||
|
|
|
@ -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]
|
||||
|
|
Loading…
Reference in New Issue