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): |