perfs: less queryset in VirtualMember clean method (#46974)
This commit is contained in:
parent
d7a75f172c
commit
52b48d6b78
|
@ -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)
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue