diff --git a/helpdesk/migrations/0009_migrate_queuemembership.py b/helpdesk/migrations/0009_migrate_queuemembership.py index 62144de7..5bf1f176 100644 --- a/helpdesk/migrations/0009_migrate_queuemembership.py +++ b/helpdesk/migrations/0009_migrate_queuemembership.py @@ -2,6 +2,7 @@ from __future__ import unicode_literals from django.db import migrations from django.conf import settings +from django.db.utils import IntegrityError from django.utils.translation import ugettext_lazy as _ @@ -24,14 +25,20 @@ def create_and_assign_permissions(apps, schema_editor): Queue = apps.get_model('helpdesk', 'Queue') for q in Queue.objects.all(): - # Prepare the permission associated to this Queue - basename = "queue_access_%s" % q.slug - q.permission_name = "helpdesk.%s" % basename - Permission.objects.create( - name=_("Permission for queue: ") + q.title, - content_type=ContentType.objects.get(model="queue"), - codename=basename, - ) + if not q.permission_name: + basename = q.prepare_permission_name + else: + basename = q.permission_name[9:] + + try: + Permission.objects.create( + name=_("Permission for queue: ") + q.title, + content_type=ContentType.objects.get(model="queue"), + codename=basename, + ) + except IntegrityError: + # Seems that it already existed, safely ignore it + pass q.save() # Second step: map the permissions according to QueueMembership diff --git a/helpdesk/models.py b/helpdesk/models.py index 664fec8d..8f496bde 100644 --- a/helpdesk/models.py +++ b/helpdesk/models.py @@ -240,6 +240,15 @@ class Queue(models.Model): return u'%s <%s>' % (self.title, self.email_address) from_address = property(_from_address) + def prepare_permission_name(self): + """Prepare internally the codename for the permission and store it in permission_name. + :return: The codename that can be used to create a new Permission object. + """ + # Prepare the permission associated to this Queue + basename = "queue_access_%s" % self.slug + self.permission_name = "helpdesk.%s" % basename + return basename + def save(self, *args, **kwargs): if self.email_box_type == 'imap' and not self.email_box_imap_folder: self.email_box_imap_folder = 'INBOX' @@ -263,15 +272,17 @@ class Queue(models.Model): elif self.email_box_type == 'pop3' and not self.email_box_ssl: self.email_box_port = 110 - if not self.id and helpdesk_settings.HELPDESK_ENABLE_PER_QUEUE_STAFF_PERMISSION: - # Prepare the permission associated to this Queue - basename = "queue_access_%s" % self.slug - self.permission_name = "helpdesk.%s" % basename - Permission.objects.create( - name=_("Permission for queue: ") + self.title, - content_type=ContentType.objects.get(model="queue"), - codename=basename, - ) + if not self.id: + # Always prepare the permission codename + basename = self.prepare_permission_name() + + # Create the permission only if the flag is active + if helpdesk_settings.HELPDESK_ENABLE_PER_QUEUE_STAFF_PERMISSION: + Permission.objects.create( + name=_("Permission for queue: ") + self.title, + content_type=ContentType.objects.get(model="queue"), + codename=basename, + ) super(Queue, self).save(*args, **kwargs)