perfs: less queryset in VirtualMember clean method (#46974)

This commit is contained in:
Lauréline Guérin 2020-09-25 14:54:29 +02:00
parent d7a75f172c
commit 52b48d6b78
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
1 changed files with 13 additions and 33 deletions

View File

@ -506,47 +506,27 @@ class VirtualMember(models.Model):
def clean(self):
error_msg = [_('This agenda does not have the same meeting types provided by the virtual agenda.')]
error = False
virtual_meetingtypes = self.virtual_agenda.iter_meetingtypes(excluded_agenda=self.real_agenda)
for meetingtype in virtual_meetingtypes:
try:
MeetingType.objects.get(
agenda=self.real_agenda,
label=meetingtype.label,
slug=meetingtype.slug,
duration=meetingtype.duration,
deleted=False,
)
except MeetingType.DoesNotExist:
error = True
if not virtual_meetingtypes:
return
virtual_meetingtypes = set([(mt.label, mt.slug, mt.duration) for mt in virtual_meetingtypes])
real_meetingtypes = self.real_agenda.iter_meetingtypes()
real_meetingtypes = set([(mt.label, mt.slug, mt.duration) for mt in real_meetingtypes])
if virtual_meetingtypes - real_meetingtypes:
# missing meeting type in real agenda
for mt in virtual_meetingtypes - real_meetingtypes:
error_msg += [
_(
'Meeting type "%(label)s" (%(duration)s minutes) '
'(identifier: %(slug)s) does no exist.'
)
% {'label': meetingtype.label, 'duration': meetingtype.duration, 'slug': meetingtype.slug}
% {'label': mt[0], 'slug': mt[1], 'duration': mt[2]}
]
if error:
raise ValidationError(error_msg)
num_virt_meetingtypes = len(virtual_meetingtypes)
if (
num_virt_meetingtypes
and num_virt_meetingtypes
!= MeetingType.objects.filter(agenda=self.real_agenda, deleted=False).count()
):
extra_qs = MeetingType.objects.filter(agenda=self.real_agenda)
for virt_meetingtype in virtual_meetingtypes:
extra_qs = extra_qs.exclude(
slug=virt_meetingtype.slug,
label=virt_meetingtype.label,
duration=virt_meetingtype.duration,
)
for extra_meeting_type in extra_qs:
error = True
error_msg += ['Extra meeting type, "%s".' % extra_meeting_type.label]
if error:
elif real_meetingtypes - virtual_meetingtypes:
# extra meeting type in real agenda
for mt in real_meetingtypes - virtual_meetingtypes:
error_msg += ['Extra meeting type, "%s".' % mt[0]]
raise ValidationError(error_msg)