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 |