summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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
commit3565d1fee6f675646f60c1690bb1c81549b227a9 (patch)
tree4f2ee141e36477a65a5ee1bede267bf31e425cd9
parent25bfdf136bd2bd7658878d25e337b02b8150915d (diff)
downloadIshtar-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.py24
-rw-r--r--archaeological_finds/tests.py22
-rw-r--r--ishtar_common/models.py4
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