diff options
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 |
commit | 3808df22596ff03e8b24c9b97506f68c86197c60 (patch) | |
tree | 87dc15b6b07b78eb8aed52a707c9adab5ae89a9f /ishtar_common/models.py | |
parent | 2ebb25f9a93d9b840162ca035c243354a3169a87 (diff) | |
download | Ishtar-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.py | 79 |
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: |