diff options
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: | 
