From 3f14d0f6481f1781d598d29b79a96fb7ee727320 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Wed, 9 May 2018 17:49:16 +0200 Subject: Standardize related field item for imagee collections (refs #4076) --- .../migrations/0021_auto_20180423_1838.py | 43 -------------- .../migrations/0021_auto_20180509_1736.py | 43 ++++++++++++++ archaeological_context_records/models.py | 16 ++--- .../migrations/0024_auto_20180423_1838.py | 61 ------------------- .../migrations/0024_auto_20180509_1742.py | 69 ++++++++++++++++++++++ archaeological_finds/models_finds.py | 13 ++-- archaeological_finds/models_treatments.py | 16 +++-- .../migrations/0027_auto_20180423_1838.py | 53 ----------------- .../migrations/0027_auto_20180509_1723.py | 61 +++++++++++++++++++ archaeological_operations/models.py | 26 ++++---- .../migrations/0017_auto_20180423_1838.py | 31 ---------- .../migrations/0017_auto_20180509_1747.py | 35 +++++++++++ archaeological_warehouse/models.py | 9 ++- example_project/settings.py | 4 +- ishtar_common/models.py | 10 ++++ ishtar_common/wizards.py | 2 + 16 files changed, 255 insertions(+), 237 deletions(-) delete mode 100644 archaeological_context_records/migrations/0021_auto_20180423_1838.py create mode 100644 archaeological_context_records/migrations/0021_auto_20180509_1736.py delete mode 100644 archaeological_finds/migrations/0024_auto_20180423_1838.py create mode 100644 archaeological_finds/migrations/0024_auto_20180509_1742.py delete mode 100644 archaeological_operations/migrations/0027_auto_20180423_1838.py create mode 100644 archaeological_operations/migrations/0027_auto_20180509_1723.py delete mode 100644 archaeological_warehouse/migrations/0017_auto_20180423_1838.py create mode 100644 archaeological_warehouse/migrations/0017_auto_20180509_1747.py diff --git a/archaeological_context_records/migrations/0021_auto_20180423_1838.py b/archaeological_context_records/migrations/0021_auto_20180423_1838.py deleted file mode 100644 index c26e46c07..000000000 --- a/archaeological_context_records/migrations/0021_auto_20180423_1838.py +++ /dev/null @@ -1,43 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.10 on 2018-04-23 18:38 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('ishtar_common', '0048_auto_20180423_1838'), - ('archaeological_context_records', '0020_auto_20180430_1318'), - ] - - operations = [ - migrations.CreateModel( - name='ContextRecordImage', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('is_main', models.BooleanField(default=False, verbose_name='Main image')), - ], - ), - migrations.RemoveField( - model_name='contextrecord', - name='images', - ), - migrations.AddField( - model_name='contextrecord', - name='images', - field=models.ManyToManyField(blank=True, through='archaeological_context_records.ContextRecordImage', to='ishtar_common.IshtarImage', verbose_name='Images'), - ), - migrations.AddField( - model_name='contextrecordimage', - name='context_record', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_context_records.ContextRecord'), - ), - migrations.AddField( - model_name='contextrecordimage', - name='image', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ishtar_common.IshtarImage'), - ), - ] diff --git a/archaeological_context_records/migrations/0021_auto_20180509_1736.py b/archaeological_context_records/migrations/0021_auto_20180509_1736.py new file mode 100644 index 000000000..d1267c67a --- /dev/null +++ b/archaeological_context_records/migrations/0021_auto_20180509_1736.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.10 on 2018-05-09 17:36 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('ishtar_common', '0050_licensetype_url'), + ('archaeological_context_records', '0020_auto_20180430_1318'), + ] + + operations = [ + migrations.CreateModel( + name='ContextRecordImage', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('is_main', models.BooleanField(default=False, verbose_name='Main image')), + ('image', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ishtar_common.IshtarImage')), + ], + options={ + 'ordering': ('-is_main', 'image__name'), + 'abstract': False, + }, + ), + migrations.RemoveField( + model_name='contextrecord', + name='images', + ), + migrations.AddField( + model_name='contextrecord', + name='images', + field=models.ManyToManyField(blank=True, through='archaeological_context_records.ContextRecordImage', to='ishtar_common.IshtarImage', verbose_name='Images'), + ), + migrations.AddField( + model_name='contextrecordimage', + name='item', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='associated_images', to='archaeological_context_records.ContextRecord'), + ), + ] diff --git a/archaeological_context_records/models.py b/archaeological_context_records/models.py index bdb21ea39..396b91f67 100644 --- a/archaeological_context_records/models.py +++ b/archaeological_context_records/models.py @@ -34,7 +34,7 @@ from ishtar_common.models import GeneralType, BaseHistorizedItem, \ HistoricalRecords, OwnPerms, ShortMenuItem, Source, GeneralRelationType,\ GeneralRecordRelations, post_delete_record_relation, get_image_path, \ ImageModel, post_save_cache, ValueGetter, BulkUpdatedItem, IshtarImage, \ - RelationItem + RelationItem, ThroughImage from archaeological_operations.models import Operation, Period, Parcel, \ ArchaeologicalSite @@ -485,11 +485,8 @@ class ContextRecord(BulkUpdatedItem, BaseHistorizedItem, return True def _get_base_image_path(self): - ope = self.operation - return u"operation/{}/{}/{}/{}".format( - ope.year, ope.reference, self.SLUG, - slugify(self.label or u"00") - ) + return self.operation._get_base_image_path() + \ + u"/{}/{}".format(self.SLUG, slugify(self.label or u"00")) @property def reference(self): @@ -565,10 +562,9 @@ class ContextRecord(BulkUpdatedItem, BaseHistorizedItem, post_save.connect(cached_label_changed, sender=ContextRecord) -class ContextRecordImage(models.Model): - image = models.ForeignKey(IshtarImage, on_delete=models.CASCADE) - context_record = models.ForeignKey(ContextRecord, on_delete=models.CASCADE) - is_main = models.BooleanField(_(u"Main image"), default=False) +class ContextRecordImage(ThroughImage): + item = models.ForeignKey(ContextRecord, on_delete=models.CASCADE, + related_name='associated_images') class RelationType(GeneralRelationType): diff --git a/archaeological_finds/migrations/0024_auto_20180423_1838.py b/archaeological_finds/migrations/0024_auto_20180423_1838.py deleted file mode 100644 index faed5b69f..000000000 --- a/archaeological_finds/migrations/0024_auto_20180423_1838.py +++ /dev/null @@ -1,61 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.10 on 2018-04-23 18:38 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('ishtar_common', '0048_auto_20180423_1838'), - ('archaeological_finds', '0023_auto_20180413_1637'), - ] - - operations = [ - migrations.CreateModel( - name='FindImage', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('is_main', models.BooleanField(default=False, verbose_name='Main image')), - ('image', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ishtar_common.IshtarImage')), - ], - ), - migrations.CreateModel( - name='TreatmentImage', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('is_main', models.BooleanField(default=False, verbose_name='Main image')), - ('image', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ishtar_common.IshtarImage')), - ], - ), - migrations.RemoveField( - model_name='find', - name='images', - ), - migrations.AddField( - model_name='find', - name='images', - field=models.ManyToManyField(blank=True, through='archaeological_finds.FindImage', to='ishtar_common.IshtarImage', verbose_name='Images'), - ), - migrations.RemoveField( - model_name='treatment', - name='images', - ), - migrations.AddField( - model_name='treatment', - name='images', - field=models.ManyToManyField(blank=True, through='archaeological_finds.TreatmentImage', to='ishtar_common.IshtarImage', verbose_name='Images'), - ), - migrations.AddField( - model_name='treatmentimage', - name='treatment', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_finds.Treatment'), - ), - migrations.AddField( - model_name='findimage', - name='treatment', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_finds.Find'), - ), - ] diff --git a/archaeological_finds/migrations/0024_auto_20180509_1742.py b/archaeological_finds/migrations/0024_auto_20180509_1742.py new file mode 100644 index 000000000..9b5367b0b --- /dev/null +++ b/archaeological_finds/migrations/0024_auto_20180509_1742.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.10 on 2018-05-09 17:42 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('ishtar_common', '0050_licensetype_url'), + ('archaeological_finds', '0023_auto_20180413_1637'), + ] + + operations = [ + migrations.CreateModel( + name='FindImage', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('is_main', models.BooleanField(default=False, verbose_name='Main image')), + ('image', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ishtar_common.IshtarImage')), + ], + options={ + 'ordering': ('-is_main', 'image__name'), + 'abstract': False, + }, + ), + migrations.CreateModel( + name='TreatmentImage', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('is_main', models.BooleanField(default=False, verbose_name='Main image')), + ('image', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ishtar_common.IshtarImage')), + ], + options={ + 'ordering': ('-is_main', 'image__name'), + 'abstract': False, + }, + ), + migrations.RemoveField( + model_name='find', + name='images', + ), + migrations.AddField( + model_name='find', + name='images', + field=models.ManyToManyField(blank=True, through='archaeological_finds.FindImage', to='ishtar_common.IshtarImage', verbose_name='Images'), + ), + migrations.RemoveField( + model_name='treatment', + name='images', + ), + migrations.AddField( + model_name='treatment', + name='images', + field=models.ManyToManyField(blank=True, through='archaeological_finds.TreatmentImage', to='ishtar_common.IshtarImage', verbose_name='Images'), + ), + migrations.AddField( + model_name='treatmentimage', + name='item', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='associated_images', to='archaeological_finds.Treatment'), + ), + migrations.AddField( + model_name='findimage', + name='item', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='associated_images', to='archaeological_finds.Find'), + ), + ] diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py index 94a8ccedc..dcf542f79 100644 --- a/archaeological_finds/models_finds.py +++ b/archaeological_finds/models_finds.py @@ -35,7 +35,7 @@ from ishtar_common.utils import cached_label_changed, post_save_point from ishtar_common.models import GeneralType, HierarchicalType, ImageModel, \ BaseHistorizedItem, ShortMenuItem, LightHistorizedItem, \ HistoricalRecords, OwnPerms, Source, Person, Basket, post_save_cache, \ - ValueGetter, get_current_profile, IshtarImage + ValueGetter, get_current_profile, IshtarImage, ThroughImage from archaeological_operations.models import AdministrativeAct, Operation from archaeological_context_records.models import ContextRecord, Dating @@ -929,8 +929,8 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, ImageModel, return u"detached/{}".format(self.SLUG) ope = bf.context_record.operation find_idx = u'{:0' + str(settings.ISHTAR_FINDS_INDEX_ZERO_LEN) + 'd}' - return (u"operation/{}/{}/{}/" + find_idx).format( - ope.year, ope.reference, self.SLUG, self.index) + return (u"{}/{}/" + find_idx).format( + ope._get_base_image_path(), self.SLUG, self.index) @property def administrative_index(self): @@ -1433,10 +1433,9 @@ def base_find_find_changed(sender, **kwargs): m2m_changed.connect(base_find_find_changed, sender=Find.base_finds.through) -class FindImage(models.Model): - image = models.ForeignKey(IshtarImage, on_delete=models.CASCADE) - treatment = models.ForeignKey(Find, on_delete=models.CASCADE) - is_main = models.BooleanField(_(u"Main image"), default=False) +class FindImage(ThroughImage): + item = models.ForeignKey(Find, on_delete=models.CASCADE, + related_name='associated_images') class FindSource(Source): diff --git a/archaeological_finds/models_treatments.py b/archaeological_finds/models_treatments.py index f96a0febf..2baced6e1 100644 --- a/archaeological_finds/models_treatments.py +++ b/archaeological_finds/models_treatments.py @@ -30,7 +30,8 @@ from django.utils.translation import ugettext_lazy as _, ugettext from ishtar_common.utils import cached_label_changed, get_current_year from ishtar_common.models import GeneralType, ImageModel, BaseHistorizedItem, \ OwnPerms, HistoricalRecords, Person, Organization, Source, \ - ValueGetter, post_save_cache, ShortMenuItem, DashboardFormItem, IshtarImage + ValueGetter, post_save_cache, ShortMenuItem, DashboardFormItem, \ + IshtarImage, ThroughImage from archaeological_warehouse.models import Warehouse, Container from archaeological_finds.models_finds import Find, FindBasket, TreatmentType from archaeological_operations.models import ClosedItem, Operation @@ -190,8 +191,7 @@ class Treatment(DashboardFormItem, ValueGetter, BaseHistorizedItem, return u'{} | {}'.format(u"-".join(items), self.treatment_types_lbl()) def _get_base_image_path(self,): - return u"treatment/{}/{}".format( - self.year, self.index) + return u"{}/{}/{}".format(self.SLUG, self.year, self.index) def treatment_types_lbl(self): """ @@ -307,10 +307,9 @@ def pre_delete_treatment(sender, **kwargs): pre_delete.connect(pre_delete_treatment, sender=Treatment) -class TreatmentImage(models.Model): - image = models.ForeignKey(IshtarImage, on_delete=models.CASCADE) - treatment = models.ForeignKey(Treatment, on_delete=models.CASCADE) - is_main = models.BooleanField(_(u"Main image"), default=False) +class TreatmentImage(ThroughImage): + item = models.ForeignKey(Treatment, on_delete=models.CASCADE, + related_name='associated_images') class AbsFindTreatments(models.Model): @@ -642,8 +641,7 @@ class TreatmentSource(Source): return self.treatment def _get_base_image_path(self): - return u"treatment/{}/{}/source".format( - self.treatment.year, self.treatment.index) + return u"{}/source".format(self.treatment._get_base_image_path()) class TreatmentFileSource(Source): diff --git a/archaeological_operations/migrations/0027_auto_20180423_1838.py b/archaeological_operations/migrations/0027_auto_20180423_1838.py deleted file mode 100644 index c9af8c928..000000000 --- a/archaeological_operations/migrations/0027_auto_20180423_1838.py +++ /dev/null @@ -1,53 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.10 on 2018-04-23 18:38 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('ishtar_common', '0048_auto_20180423_1838'), - ('archaeological_operations', '0026_auto_20180430_1318'), - ] - - operations = [ - migrations.CreateModel( - name='OperationImage', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('is_main', models.BooleanField(default=False, verbose_name='Main image')), - ('image', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ishtar_common.IshtarImage')), - ], - ), - migrations.CreateModel( - name='SiteImage', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('is_main', models.BooleanField(default=False, verbose_name='Main image')), - ('image', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ishtar_common.IshtarImage')), - ('site', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_operations.ArchaeologicalSite')), - ], - ), - migrations.RemoveField( - model_name='operation', - name='images', - ), - migrations.AddField( - model_name='operation', - name='images', - field=models.ManyToManyField(blank=True, through='archaeological_operations.OperationImage', to='ishtar_common.IshtarImage', verbose_name='Images'), - ), - migrations.AddField( - model_name='operationimage', - name='operation', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_operations.Operation'), - ), - migrations.AddField( - model_name='archaeologicalsite', - name='images', - field=models.ManyToManyField(blank=True, through='archaeological_operations.SiteImage', to='ishtar_common.IshtarImage', verbose_name='Images'), - ), - ] diff --git a/archaeological_operations/migrations/0027_auto_20180509_1723.py b/archaeological_operations/migrations/0027_auto_20180509_1723.py new file mode 100644 index 000000000..181b6aa55 --- /dev/null +++ b/archaeological_operations/migrations/0027_auto_20180509_1723.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.10 on 2018-05-09 17:23 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('ishtar_common', '0050_licensetype_url'), + ('archaeological_operations', '0026_auto_20180430_1318'), + ] + + operations = [ + migrations.CreateModel( + name='OperationImage', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('is_main', models.BooleanField(default=False, verbose_name='Main image')), + ('image', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ishtar_common.IshtarImage')), + ], + options={ + 'ordering': ('-is_main', 'image__name'), + 'abstract': False, + }, + ), + migrations.CreateModel( + name='SiteImage', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('is_main', models.BooleanField(default=False, verbose_name='Main image')), + ('image', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ishtar_common.IshtarImage')), + ('item', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='associated_images', to='archaeological_operations.ArchaeologicalSite')), + ], + options={ + 'ordering': ('-is_main', 'image__name'), + 'abstract': False, + }, + ), + migrations.RemoveField( + model_name='operation', + name='images', + ), + migrations.AddField( + model_name='operation', + name='images', + field=models.ManyToManyField(blank=True, through='archaeological_operations.OperationImage', to='ishtar_common.IshtarImage', verbose_name='Images'), + ), + migrations.AddField( + model_name='operationimage', + name='item', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='associated_images', to='archaeological_operations.Operation'), + ), + migrations.AddField( + model_name='archaeologicalsite', + name='images', + field=models.ManyToManyField(blank=True, through='archaeological_operations.SiteImage', to='ishtar_common.IshtarImage', verbose_name='Images'), + ), + ] diff --git a/archaeological_operations/models.py b/archaeological_operations/models.py index aa9103f61..5ff3ddc2f 100644 --- a/archaeological_operations/models.py +++ b/archaeological_operations/models.py @@ -38,8 +38,8 @@ from ishtar_common.models import GeneralType, BaseHistorizedItem, \ SourceType, Person, Organization, Town, Dashboard, IshtarUser, ValueGetter,\ DocumentTemplate, ShortMenuItem, DashboardFormItem, GeneralRelationType,\ GeneralRecordRelations, post_delete_record_relation, OperationType, \ - ImageModel, post_save_cache, PersonType, IshtarImage, get_image_path, \ - RelationItem + ImageModel, post_save_cache, PersonType, IshtarImage, \ + RelationItem, ThroughImage class RemainType(GeneralType): @@ -220,10 +220,9 @@ class ArchaeologicalSite(BaseHistorizedItem): ) -class SiteImage(models.Model): - image = models.ForeignKey(IshtarImage, on_delete=models.CASCADE) - site = models.ForeignKey(ArchaeologicalSite, on_delete=models.CASCADE) - is_main = models.BooleanField(_(u"Main image"), default=False) +class SiteImage(ThroughImage): + item = models.ForeignKey(ArchaeologicalSite, on_delete=models.CASCADE, + related_name='associated_images') def get_values_town_related(item, prefix, values): @@ -246,6 +245,7 @@ def get_values_town_related(item, prefix, values): number=dpt).count()]) return values + QUALITY = (('ND', _(u"Not documented")), ('A', _(u"Arbitrary")), ('R', _(u"Reliable")),) @@ -613,8 +613,7 @@ class Operation(ClosedItem, BaseHistorizedItem, ImageModel, OwnPerms, return True def _get_base_image_path(self): - return u"operation/{}/{}".format( - self.year, self.reference) + return u"{}/{}/{}".format(self.SLUG, self.year, self.reference) def get_town_label(self): lbl = unicode(_('Intercommunal')) @@ -979,14 +978,9 @@ def operation_post_save(sender, **kwargs): post_save.connect(operation_post_save, sender=Operation) -class OperationImage(models.Model): - image = models.ForeignKey(IshtarImage, on_delete=models.CASCADE) - operation = models.ForeignKey(Operation, on_delete=models.CASCADE, - related_name='associated_images') - is_main = models.BooleanField(_(u"Main image"), default=False) - - class Meta: - ordering = ('operation', '-is_main', 'image__name') +class OperationImage(ThroughImage): + item = models.ForeignKey(Operation, on_delete=models.CASCADE, + related_name='associated_images') class RelationType(GeneralRelationType): diff --git a/archaeological_warehouse/migrations/0017_auto_20180423_1838.py b/archaeological_warehouse/migrations/0017_auto_20180423_1838.py deleted file mode 100644 index fe183c312..000000000 --- a/archaeological_warehouse/migrations/0017_auto_20180423_1838.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.10 on 2018-04-23 18:38 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('ishtar_common', '0048_auto_20180423_1838'), - ('archaeological_warehouse', '0016_auto_20180403_1120'), - ] - - operations = [ - migrations.CreateModel( - name='WarehouseImage', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('is_main', models.BooleanField(default=False, verbose_name='Main image')), - ('image', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ishtar_common.IshtarImage')), - ('warehouse', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_warehouse.Warehouse')), - ], - ), - migrations.AddField( - model_name='warehouse', - name='images', - field=models.ManyToManyField(blank=True, through='archaeological_warehouse.WarehouseImage', to='ishtar_common.IshtarImage', verbose_name='Images'), - ), - ] diff --git a/archaeological_warehouse/migrations/0017_auto_20180509_1747.py b/archaeological_warehouse/migrations/0017_auto_20180509_1747.py new file mode 100644 index 000000000..76b384374 --- /dev/null +++ b/archaeological_warehouse/migrations/0017_auto_20180509_1747.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.10 on 2018-05-09 17:47 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('ishtar_common', '0050_licensetype_url'), + ('archaeological_warehouse', '0016_auto_20180403_1120'), + ] + + operations = [ + migrations.CreateModel( + name='WarehouseImage', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('is_main', models.BooleanField(default=False, verbose_name='Main image')), + ('image', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ishtar_common.IshtarImage')), + ('item', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='associated_images', to='archaeological_warehouse.Warehouse')), + ], + options={ + 'ordering': ('-is_main', 'image__name'), + 'abstract': False, + }, + ), + migrations.AddField( + model_name='warehouse', + name='images', + field=models.ManyToManyField(blank=True, through='archaeological_warehouse.WarehouseImage', to='ishtar_common.IshtarImage', verbose_name='Images'), + ), + ] diff --git a/archaeological_warehouse/models.py b/archaeological_warehouse/models.py index a860497e0..4edfe0d15 100644 --- a/archaeological_warehouse/models.py +++ b/archaeological_warehouse/models.py @@ -31,7 +31,7 @@ from ishtar_common.utils import cached_label_changed from ishtar_common.models import GeneralType, get_external_id, \ LightHistorizedItem, OwnPerms, Address, Person, post_save_cache, \ - ImageModel, DashboardFormItem, IshtarImage + ImageModel, DashboardFormItem, IshtarImage, ThroughImage class WarehouseType(GeneralType): @@ -204,10 +204,9 @@ class Warehouse(Address, DashboardFormItem, OwnPerms): return -class WarehouseImage(models.Model): - image = models.ForeignKey(IshtarImage, on_delete=models.CASCADE) - warehouse = models.ForeignKey(Warehouse, on_delete=models.CASCADE) - is_main = models.BooleanField(_(u"Main image"), default=False) +class WarehouseImage(ThroughImage): + item = models.ForeignKey(Warehouse, on_delete=models.CASCADE, + related_name='associated_images') class Collection(LightHistorizedItem): diff --git a/example_project/settings.py b/example_project/settings.py index d5efd2891..241e330f9 100644 --- a/example_project/settings.py +++ b/example_project/settings.py @@ -15,8 +15,8 @@ TEST_VIEWS = True if "test" in sys.argv: sys.path.insert(0, '..') -IMAGE_MAX_SIZE = (1024, 768) # put None if no resizing -THUMB_MAX_SIZE = (300, 300) +IMAGE_MAX_SIZE = (1280, 960) # put None if no resizing +THUMB_MAX_SIZE = (600, 600) CACHE_SMALLTIMEOUT = 60 CACHE_TIMEOUT = 3600 diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 35be3ffc0..d4d6d2c79 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -3065,6 +3065,16 @@ class IshtarImage(ImageModel): ordering = ('name',) +class ThroughImage(models.Model): + image = models.ForeignKey( + IshtarImage, on_delete=models.CASCADE) + is_main = models.BooleanField(_(u"Main image"), default=False) + + class Meta: + ordering = ('-is_main', 'image__name') + abstract = True + + if settings.COUNTRY == 'fr': class Arrondissement(models.Model): name = models.CharField(u"Nom", max_length=30) diff --git a/ishtar_common/wizards.py b/ishtar_common/wizards.py index 2182e9060..f200447e4 100644 --- a/ishtar_common/wizards.py +++ b/ishtar_common/wizards.py @@ -789,6 +789,8 @@ class Wizard(NamedUrlWizardView): for old_item in old_m2ms[key]: is_ok = True for k in value: + if not hasattr(old_item, k): + continue if is_ok and getattr(old_item, k) != value[k]: is_ok = False continue -- cgit v1.2.3