diff options
Diffstat (limited to 'ishtar_common/models.py')
| -rw-r--r-- | ishtar_common/models.py | 76 | 
1 files changed, 66 insertions, 10 deletions
| diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 1aa94836f..6eb36acdb 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -254,7 +254,7 @@ class OwnPerms(object):                     action_own_name, request.session)                  and self.is_own(request.user.ishtaruser)) -    def is_own(self, user): +    def is_own(self, user, alt_query_own=None):          """          Check if the current object is owned by the user          """ @@ -264,7 +264,10 @@ class OwnPerms(object):              ishtaruser = user.ishtaruser          else:              return False -        query = self.get_query_owns(ishtaruser) +        if not alt_query_own: +            query = self.get_query_owns(ishtaruser) +        else: +            query = getattr(self, alt_query_own)(ishtaruser)          if not query:              return False          query &= Q(pk=self.pk) @@ -2181,7 +2184,11 @@ class CustomForm(models.Model):              return []          res = []          for model_name in register_fields[app_name]: -            ct = ContentType.objects.get(app_label=app_name, model=model_name) +            q = ContentType.objects.filter(app_label=app_name, +                                           model=model_name) +            if not q.count(): +                continue +            ct = q.all()[0]              for json_field in JsonDataField.objects.filter(                      content_type=ct).all():                  res.append((json_field.pk, u"{} ({})".format( @@ -3293,6 +3300,7 @@ post_save.connect(post_save_userprofile, sender=UserProfile)  class IshtarUser(FullSearch): +    SLUG = "ishtaruser"      TABLE_COLS = ('username', 'person__name', 'person__surname',                    'person__email', 'person__person_types_list',                    'person__attached_to__name') @@ -3428,7 +3436,7 @@ class IshtarUser(FullSearch):          return self.person.full_label() -class Basket(FullSearch): +class Basket(FullSearch, OwnPerms):      """      Abstract class for a basket      Subclass must be defined with an "items" ManyToManyField @@ -3441,9 +3449,13 @@ class Basket(FullSearch):          verbose_name=_(u"Owner"))      available = models.BooleanField(_(u"Available"), default=True)      shared_with = models.ManyToManyField( -        IshtarUser, verbose_name=_(u"Shared with"), blank=True, +        IshtarUser, verbose_name=_(u"Shared (read) with"), blank=True,          related_name='shared_%(class)ss'      ) +    shared_write_with = models.ManyToManyField( +        IshtarUser, verbose_name=_(u"Shared (read/edit) with"), blank=True, +        related_name='shared_write_%(class)ss' +    )      TABLE_COLS = ['label', 'user'] @@ -3462,12 +3474,17 @@ class Basket(FullSearch):          if not request.user or not getattr(request.user, 'ishtaruser', None):              return Q(pk=None)          ishtaruser = request.user.ishtaruser -        return Q(user=ishtaruser) | Q(shared_with=ishtaruser) +        return Q(user=ishtaruser) | Q(shared_with=ishtaruser) | Q( +            shared_write_with=ishtaruser)      @property      def cached_label(self):          return unicode(self) +    @property +    def full_label(self): +        return u"{} - {}".format(self.label, self.user) +      @classmethod      def get_short_menu_class(cls, pk):          return 'basket' @@ -3477,6 +3494,38 @@ class Basket(FullSearch):          return "{}-{}".format(datetime.date.today().strftime(              "%Y-%m-%d"), slugify(self.label)) +    @classmethod +    def get_query_owns(cls, ishtaruser): +        return Q(user=ishtaruser) | Q(shared_with=ishtaruser) | Q( +            shared_write_with=ishtaruser) + +    @classmethod +    def get_write_query_owns(cls, ishtaruser): +        return Q(user=ishtaruser) + +    def duplicate(self, label=None, ishtaruser=None): +        """ +        Duplicate the basket. Items in basket are copied but not shared users +        :param label: if provided use the name +        :param ishtaruser: if provided an alternate user is used +        :return: the new basket +        """ +        items = list(self.items.all()) +        new_item = self +        new_item.pk = None +        if ishtaruser: +            new_item.user = ishtaruser +        if not label: +            label = new_item.label +        while self.__class__.objects.filter( +                label=label, user=new_item.user).count(): +            label += unicode(_(u" - duplicate")) +        new_item.label = label +        new_item.save() +        for item in items: +            new_item.items.add(item) +        return new_item +  class AuthorType(GeneralType):      order = models.IntegerField(_(u"Order"), default=1) @@ -3844,11 +3893,18 @@ class Document(OwnPerms, ImageModel, FullSearch, Imported):      def get_query_owns(cls, ishtaruser):          Operation = cls.operations.rel.related_model          ArchaeologicalSite = cls.sites.rel.related_model -        q = cls._construct_query_own( -            'operations__', Operation._get_query_owns_dicts(ishtaruser) -        ) | cls._construct_query_own( -            'sites__', ArchaeologicalSite._get_query_owns_dicts(ishtaruser) +        query_own_list = ( +            ('operations__', Operation._get_query_owns_dicts(ishtaruser)), +            ('sites__', ArchaeologicalSite._get_query_owns_dicts(ishtaruser)),          ) +        q = None +        for prefix, owns in query_own_list: +            subq = cls._construct_query_own(prefix, owns) +            if subq: +                if not q: +                    q = subq +                else: +                    q |= subq          return q      def get_associated_operation(self): | 
