summaryrefslogtreecommitdiff
path: root/ishtar_common/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common/models.py')
-rw-r--r--ishtar_common/models.py76
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):