summaryrefslogtreecommitdiff
path: root/ishtar_common/models.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2020-03-06 11:41:54 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2020-03-06 11:44:44 +0100
commit3808df22596ff03e8b24c9b97506f68c86197c60 (patch)
tree87dc15b6b07b78eb8aed52a707c9adab5ae89a9f /ishtar_common/models.py
parent2ebb25f9a93d9b840162ca035c243354a3169a87 (diff)
downloadIshtar-3808df22596ff03e8b24c9b97506f68c86197c60.tar.bz2
Ishtar-3808df22596ff03e8b24c9b97506f68c86197c60.zip
Sheet actions: add duplicate for site, operation, document and context record
Diffstat (limited to 'ishtar_common/models.py')
-rw-r--r--ishtar_common/models.py79
1 files changed, 54 insertions, 25 deletions
diff --git a/ishtar_common/models.py b/ishtar_common/models.py
index 7238d7782..dc2fef815 100644
--- a/ishtar_common/models.py
+++ b/ishtar_common/models.py
@@ -1212,7 +1212,7 @@ class HistoryError(Exception):
return repr(self.value)
-PRIVATE_FIELDS = ('id', 'history_modifier', 'order')
+PRIVATE_FIELDS = ('id', 'history_modifier', 'order', 'uuid')
class BulkUpdatedItem(object):
@@ -2127,6 +2127,34 @@ class CascasdeUpdate:
post_save_geo(item.__class__, instance=item)
+def duplicate_item(item, user=None, data=None):
+ model = item.__class__
+ new = model.objects.get(pk=item.pk)
+
+ for field in model._meta.fields:
+ # pk is in PRIVATE_FIELDS so: new.pk = None and a new
+ # item will be created on save
+ if field.name == "uuid":
+ new.uuid = uuid.uuid4()
+ elif field.name in PRIVATE_FIELDS:
+ setattr(new, field.name, None)
+ if user:
+ new.history_user = user
+ if data:
+ for k in data:
+ setattr(new, k, data[k])
+ new.save()
+
+ # m2m fields
+ m2m = [field.name for field in model._meta.many_to_many
+ if field.name not in PRIVATE_FIELDS]
+ for field in m2m:
+ for val in getattr(item, field).all():
+ if val not in getattr(new, field).all():
+ getattr(new, field).add(val)
+ return new
+
+
class BaseHistorizedItem(StatisticItem, TemplateItem, FullSearch, Imported,
JsonData, FixAssociated, CascasdeUpdate):
"""
@@ -2194,29 +2222,7 @@ class BaseHistorizedItem(StatisticItem, TemplateItem, FullSearch, Imported,
return {}
def duplicate(self, user=None, data=None):
- model = self.__class__
- new = model.objects.get(pk=self.pk)
-
- for field in model._meta.fields:
- # pk is in PRIVATE_FIELDS so: new.pk = None and a new
- # item will be created on save
- if field.name in PRIVATE_FIELDS:
- setattr(new, field.name, None)
- if user:
- new.history_user = user
- if data:
- for k in data:
- setattr(new, k, data[k])
- new.save()
-
- # m2m fields
- m2m = [field.name for field in model._meta.many_to_many
- if field.name not in PRIVATE_FIELDS]
- for field in m2m:
- for val in getattr(self, field).all():
- if val not in getattr(new, field).all():
- getattr(new, field).add(val)
- return new
+ return duplicate_item(self, user, data)
def update_external_id(self, save=False):
if not self.EXTERNAL_ID_KEY or (
@@ -5233,7 +5239,12 @@ class Document(BaseHistorizedItem, QRCodeItem, OwnPerms, ImageModel,
text=_(u"Bulk update"), target="many",
rights=['change_document', 'change_own_document'])
QUICK_ACTIONS = [
- QA_EDIT
+ QA_EDIT,
+ QuickAction(
+ url="document-qa-duplicate", icon_class="fa fa-clone",
+ text=_("Duplicate"), target="one",
+ rights=['change_document',
+ 'change_own_document']),
]
SERIALIZATION_FILES = ["image", "thumbnail", "associated_file"]
@@ -5321,6 +5332,8 @@ class Document(BaseHistorizedItem, QRCodeItem, OwnPerms, ImageModel,
return "{}-{:04d}".format(self.operation.code_patriarche or '',
self.index)
"""
+ def duplicate_item(self, user=None, data=None):
+ return duplicate_item(self, user, data)
def public_representation(self):
site = Site.objects.get_current()
@@ -5352,6 +5365,22 @@ class Document(BaseHistorizedItem, QRCodeItem, OwnPerms, ImageModel,
"thumbnail": thumbnail,
}
+ def get_extra_actions(self, request):
+ """
+ For sheet template
+ """
+ # url, base_text, icon, extra_text, extra css class, is a quick action
+ actions = super(Document, self).get_extra_actions(request)
+ # is_locked = self.is_locked(request.user)
+
+ can_edit_document = self.can_do(request, 'change_document')
+ if can_edit_document:
+ actions += [
+ (reverse("document-qa-duplicate", args=[self.pk]),
+ _("Duplicate"), "fa fa-clone", "", "", True),
+ ]
+ return actions
+
@property
def thumbnail_path(self):
if not self.thumbnail: