diff options
| author | Étienne Loks <etienne.loks@iggdrasil.net> | 2017-04-02 21:46:17 +0200 | 
|---|---|---|
| committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2017-04-02 21:46:17 +0200 | 
| commit | 3565d1fee6f675646f60c1690bb1c81549b227a9 (patch) | |
| tree | 4f2ee141e36477a65a5ee1bede267bf31e425cd9 | |
| parent | 25bfdf136bd2bd7658878d25e337b02b8150915d (diff) | |
| download | Ishtar-3565d1fee6f675646f60c1690bb1c81549b227a9.tar.bz2 Ishtar-3565d1fee6f675646f60c1690bb1c81549b227a9.zip | |
Finds: do not resize the image and regenerate a thumb on find duplication (refs #3579)
| -rw-r--r-- | archaeological_finds/models_finds.py | 24 | ||||
| -rw-r--r-- | archaeological_finds/tests.py | 22 | ||||
| -rw-r--r-- | ishtar_common/models.py | 4 | 
3 files changed, 40 insertions, 10 deletions
| diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py index 19464838b..1b492148a 100644 --- a/archaeological_finds/models_finds.py +++ b/archaeological_finds/models_finds.py @@ -847,16 +847,20 @@ class Find(BaseHistorizedItem, ImageModel, OwnPerms, ShortMenuItem):      def duplicate(self, user):          model = self.__class__ -        # base fields -        table_cols = [field.name for field in model._meta.fields -                      if field.name not in PRIVATE_FIELDS or -                      field.name == 'order'] -        dct = dict([(attr, getattr(self, attr)) for attr in -                    table_cols]) -        dct['order'] += 1 -        dct['history_modifier'] = user -        new = self.__class__(**dct) -        new.save() + +        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) +        new.order = self.order + 1 +        new.history_order = user +        new.image.name = self.image.name +        # force_copy is necessary to not regenerate a thumb and resize +        # again the image +        new.save(force_copy=True)          # m2m fields          m2m = [field.name for field in model._meta.many_to_many diff --git a/archaeological_finds/tests.py b/archaeological_finds/tests.py index e274c757f..1268b4f03 100644 --- a/archaeological_finds/tests.py +++ b/archaeological_finds/tests.py @@ -21,6 +21,7 @@ import json  from django.conf import settings  from django.contrib.auth.models import User +from django.core.files import File  from django.core.files.uploadedfile import SimpleUploadedFile  from django.core.urlresolvers import reverse  from django.test.client import Client @@ -474,8 +475,14 @@ class PackagingTest(FindInit, TestCase):      model = models.Find      def setUp(self): +        img = settings.ROOT_PATH + \ +            '../ishtar_common/static/media/images/ishtar-bg.jpg' +          self.create_finds({"label": u"Find 1"}, force=True)          self.create_finds({"label": u"Find 2"}, force=True) +        self.finds[0].image.save('ishtar-bg.jpg', File(open(img))) +        self.finds[0].save() +          self.basket = models.FindBasket.objects.create(              label="My basket", user=IshtarUser.objects.get(                  pk=self.get_default_user().pk)) @@ -490,11 +497,26 @@ class PackagingTest(FindInit, TestCase):          treatment_type = models.TreatmentType.objects.get(txt_idx='packaging')          treatment = models.Treatment()          items_nb = models.Find.objects.count() + +        first_find = self.finds[0] +          treatment.save(user=self.get_default_user(), items=self.basket)          self.assertEqual(items_nb + self.basket.items.count(),                           models.Find.objects.count(),                           msg="Packaging doesn't generate enough new finds")          treatment.treatment_types.add(treatment_type) + +        resulting_find = models.Find.objects.get( +            upstream_treatment__upstream=first_find, +            base_finds__pk=first_find.base_finds.all()[0].pk +        ) + +        # image names used to be altered on save: check for this bug +        self.assertEqual( +            resulting_find.image.name, +            models.Find.objects.get(pk=first_find.pk).image.name +        ) +          # new version of the find is in the basket          for item in self.basket.items.all():              self.assertNotIn( diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 66433747c..7873b63f8 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -769,6 +769,10 @@ class ImageModel(models.Model):          return SimpleUploadedFile('temp', temp.read())      def save(self, *args, **kwargs): +        if 'force_copy' in kwargs: +            kwargs.pop('force_copy') +            super(ImageModel, self).save(*args, **kwargs) +            return          # manage images          if self.has_changed('image') and self.image:              # convert to jpg | 
