summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2018-05-11 12:33:54 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2018-06-12 08:44:18 +0200
commit83d4e47b7e0ee3946e07d1c5de04597a06613cf0 (patch)
tree67981f597f7b7a98b782d2db02687d83f1024772
parent3d12b0ac2e97ab43a555106f404ed7cf442caf17 (diff)
downloadIshtar-83d4e47b7e0ee3946e07d1c5de04597a06613cf0.tar.bz2
Ishtar-83d4e47b7e0ee3946e07d1c5de04597a06613cf0.zip
Migrate single image to M2M (refs #4076)
-rw-r--r--archaeological_context_records/migrations/0022_migrate_image.py27
-rw-r--r--archaeological_context_records/migrations/0023_auto_20180511_1232.py31
-rw-r--r--archaeological_context_records/models.py7
-rw-r--r--archaeological_finds/migrations/0025_migrate_image.py32
-rw-r--r--archaeological_finds/migrations/0026_auto_20180511_1233.py31
-rw-r--r--archaeological_finds/models_finds.py6
-rw-r--r--archaeological_operations/migrations/0028_migrate_image.py26
-rw-r--r--archaeological_operations/migrations/0029_auto_20180511_1232.py31
-rw-r--r--archaeological_operations/models.py7
-rw-r--r--ishtar_common/models.py3
-rw-r--r--ishtar_common/utils.py17
-rw-r--r--ishtar_common/utils_migrations.py48
12 files changed, 248 insertions, 18 deletions
diff --git a/archaeological_context_records/migrations/0022_migrate_image.py b/archaeological_context_records/migrations/0022_migrate_image.py
new file mode 100644
index 000000000..87ac0cc55
--- /dev/null
+++ b/archaeological_context_records/migrations/0022_migrate_image.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.10 on 2018-05-11 12:03
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+from ishtar_common.utils_migrations import migrate_simple_image_to_m2m
+
+
+def migrate_image(apps, schema_editor):
+ ContextRecord = apps.get_model('archaeological_context_records',
+ 'ContextRecord')
+ IshtarImage = apps.get_model('ishtar_common', 'IshtarImage')
+ ContextRecordImage = apps.get_model('archaeological_context_records',
+ 'ContextRecordImage')
+ migrate_simple_image_to_m2m(ContextRecord, IshtarImage, ContextRecordImage)
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_context_records', '0021_auto_20180509_1736'),
+ ]
+
+ operations = [
+ migrations.RunPython(migrate_image),
+ ]
diff --git a/archaeological_context_records/migrations/0023_auto_20180511_1232.py b/archaeological_context_records/migrations/0023_auto_20180511_1232.py
new file mode 100644
index 000000000..e6d69127f
--- /dev/null
+++ b/archaeological_context_records/migrations/0023_auto_20180511_1232.py
@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.10 on 2018-05-11 12:32
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_context_records', '0022_migrate_image'),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='contextrecord',
+ name='image',
+ ),
+ migrations.RemoveField(
+ model_name='contextrecord',
+ name='thumbnail',
+ ),
+ migrations.RemoveField(
+ model_name='historicalcontextrecord',
+ name='image',
+ ),
+ migrations.RemoveField(
+ model_name='historicalcontextrecord',
+ name='thumbnail',
+ ),
+ ]
diff --git a/archaeological_context_records/models.py b/archaeological_context_records/models.py
index 396b91f67..1ae661524 100644
--- a/archaeological_context_records/models.py
+++ b/archaeological_context_records/models.py
@@ -33,8 +33,8 @@ from ishtar_common.utils import cached_label_changed
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, ThroughImage
+ post_save_cache, ValueGetter, BulkUpdatedItem, IshtarImage, RelationItem, \
+ ThroughImage
from archaeological_operations.models import Operation, Period, Parcel, \
ArchaeologicalSite
@@ -206,8 +206,7 @@ class CRBulkView(object):
class ContextRecord(BulkUpdatedItem, BaseHistorizedItem,
- ImageModel, OwnPerms, ValueGetter, ShortMenuItem,
- RelationItem):
+ OwnPerms, ValueGetter, ShortMenuItem, RelationItem):
SHOW_URL = 'show-contextrecord'
SLUG = 'contextrecord'
EXTERNAL_ID_KEY = 'context_record_external_id'
diff --git a/archaeological_finds/migrations/0025_migrate_image.py b/archaeological_finds/migrations/0025_migrate_image.py
new file mode 100644
index 000000000..dccbb444b
--- /dev/null
+++ b/archaeological_finds/migrations/0025_migrate_image.py
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.10 on 2018-05-11 12:07
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+from ishtar_common.utils_migrations import migrate_simple_image_to_m2m
+
+
+def migrate_image(apps, schema_editor):
+ Find = apps.get_model('archaeological_finds', 'Find')
+ IshtarImage = apps.get_model('ishtar_common', 'IshtarImage')
+ FindImage = apps.get_model('archaeological_finds',
+ 'FindImage')
+ migrate_simple_image_to_m2m(Find, IshtarImage, FindImage)
+
+ Treatment = apps.get_model('archaeological_finds', 'Treatment')
+ IshtarImage = apps.get_model('ishtar_common', 'IshtarImage')
+ TreatmentImage = apps.get_model('archaeological_finds',
+ 'TreatmentImage')
+ migrate_simple_image_to_m2m(Treatment, IshtarImage, TreatmentImage)
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_finds', '0024_auto_20180509_1742'),
+ ]
+
+ operations = [
+ migrations.RunPython(migrate_image),
+ ]
diff --git a/archaeological_finds/migrations/0026_auto_20180511_1233.py b/archaeological_finds/migrations/0026_auto_20180511_1233.py
new file mode 100644
index 000000000..15581ae8b
--- /dev/null
+++ b/archaeological_finds/migrations/0026_auto_20180511_1233.py
@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.10 on 2018-05-11 12:33
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_finds', '0025_migrate_image'),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='find',
+ name='image',
+ ),
+ migrations.RemoveField(
+ model_name='find',
+ name='thumbnail',
+ ),
+ migrations.RemoveField(
+ model_name='historicalfind',
+ name='image',
+ ),
+ migrations.RemoveField(
+ model_name='historicalfind',
+ name='thumbnail',
+ ),
+ ]
diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py
index dcf542f79..2b903e66a 100644
--- a/archaeological_finds/models_finds.py
+++ b/archaeological_finds/models_finds.py
@@ -32,7 +32,7 @@ from django.utils.translation import ugettext_lazy as _
from ishtar_common.data_importer import post_importer_action, ImporterError
from ishtar_common.utils import cached_label_changed, post_save_point
-from ishtar_common.models import GeneralType, HierarchicalType, ImageModel, \
+from ishtar_common.models import GeneralType, HierarchicalType, \
BaseHistorizedItem, ShortMenuItem, LightHistorizedItem, \
HistoricalRecords, OwnPerms, Source, Person, Basket, post_save_cache, \
ValueGetter, get_current_profile, IshtarImage, ThroughImage
@@ -580,8 +580,8 @@ class FBulkView(object):
"""
-class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, ImageModel,
- OwnPerms, ShortMenuItem):
+class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, OwnPerms,
+ ShortMenuItem):
EXTERNAL_ID_KEY = 'find_external_id'
CHECK_DICT = dict(CHECK_CHOICES)
SHOW_URL = 'show-find'
diff --git a/archaeological_operations/migrations/0028_migrate_image.py b/archaeological_operations/migrations/0028_migrate_image.py
new file mode 100644
index 000000000..a7a0e0495
--- /dev/null
+++ b/archaeological_operations/migrations/0028_migrate_image.py
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.10 on 2018-05-11 10:49
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+from ishtar_common.utils_migrations import migrate_simple_image_to_m2m
+
+
+def migrate_image(apps, schema_editor):
+ Operation = apps.get_model('archaeological_operations', 'Operation')
+ IshtarImage = apps.get_model('ishtar_common', 'IshtarImage')
+ OperationImage = apps.get_model('archaeological_operations',
+ 'OperationImage')
+ migrate_simple_image_to_m2m(Operation, IshtarImage, OperationImage)
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_operations', '0027_auto_20180509_1723'),
+ ]
+
+ operations = [
+ migrations.RunPython(migrate_image),
+ ]
diff --git a/archaeological_operations/migrations/0029_auto_20180511_1232.py b/archaeological_operations/migrations/0029_auto_20180511_1232.py
new file mode 100644
index 000000000..5f1a2c19a
--- /dev/null
+++ b/archaeological_operations/migrations/0029_auto_20180511_1232.py
@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.10 on 2018-05-11 12:32
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_operations', '0028_migrate_image'),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='historicaloperation',
+ name='image',
+ ),
+ migrations.RemoveField(
+ model_name='historicaloperation',
+ name='thumbnail',
+ ),
+ migrations.RemoveField(
+ model_name='operation',
+ name='image',
+ ),
+ migrations.RemoveField(
+ model_name='operation',
+ name='thumbnail',
+ ),
+ ]
diff --git a/archaeological_operations/models.py b/archaeological_operations/models.py
index 5ff3ddc2f..44406fd89 100644
--- a/archaeological_operations/models.py
+++ b/archaeological_operations/models.py
@@ -38,8 +38,7 @@ 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, \
- RelationItem, ThroughImage
+ post_save_cache, PersonType, IshtarImage, RelationItem, ThroughImage
class RemainType(GeneralType):
@@ -279,8 +278,8 @@ class ClosedItem(object):
return {'date': date, 'user': user}
-class Operation(ClosedItem, BaseHistorizedItem, ImageModel, OwnPerms,
- ValueGetter, ShortMenuItem, DashboardFormItem, RelationItem):
+class Operation(ClosedItem, BaseHistorizedItem, OwnPerms, ValueGetter,
+ ShortMenuItem, DashboardFormItem, RelationItem):
QUALITY_DICT = dict(QUALITY)
SHOW_URL = 'show-operation'
TABLE_COLS = ['year', 'towns', 'common_name', 'operation_type',
diff --git a/ishtar_common/models.py b/ishtar_common/models.py
index 0e8d96ddb..53f4e1c11 100644
--- a/ishtar_common/models.py
+++ b/ishtar_common/models.py
@@ -865,6 +865,9 @@ class ItemKey(models.Model):
def get_image_path(instance, filename):
+ # when using migrations instance is not a real ImageModel instance
+ if not hasattr(instance, '_get_image_path'):
+ return u"upload/{}".format(filename)
return instance._get_image_path(filename)
diff --git a/ishtar_common/utils.py b/ishtar_common/utils.py
index 52ea98547..2af5212ca 100644
--- a/ishtar_common/utils.py
+++ b/ishtar_common/utils.py
@@ -424,7 +424,7 @@ def get_field_labels_from_path(model, path):
return labels
-def create_default_areas(models=None):
+def create_default_areas(models=None, verbose=False):
# can be used on migrations if models are provided
if not models:
from ishtar_common.models import Area, Town, Department, State
@@ -444,7 +444,8 @@ def create_default_areas(models=None):
areas['state-{}'.format(state.pk)] = area
if created:
idx += 1
- print("\n* {} state areas added".format(idx))
+ if verbose:
+ print("\n* {} state areas added".format(idx))
idx, idx2 = 0, 0
for dep in Department.objects.all():
@@ -464,10 +465,11 @@ def create_default_areas(models=None):
idx2 += 1
area.parent = areas[state_slug]
area.save()
- print(
- "* {} department areas added with {} associations to state".format(
- idx, idx2)
- )
+ if verbose:
+ print(
+ "* {} department areas added with {} associations to state".format(
+ idx, idx2)
+ )
idx = 0
for town in Town.objects.all():
@@ -484,7 +486,8 @@ def create_default_areas(models=None):
areas[code_dep_dom].towns.add(town)
idx += 1
- print("* {} town associated to department area".format(idx))
+ if verbose:
+ print("* {} town associated to department area".format(idx))
def get_relations_for_graph(rel_model, obj_pk, above_relations=None,
diff --git a/ishtar_common/utils_migrations.py b/ishtar_common/utils_migrations.py
new file mode 100644
index 000000000..9f514ea48
--- /dev/null
+++ b/ishtar_common/utils_migrations.py
@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.core.files import File
+import os
+
+
+def migrate_simple_image_to_m2m(base_model, image_model, rel_model,
+ verbose=False):
+ missing, moved = 0, 0
+ for item in base_model.objects.all():
+ if not item.image:
+ continue
+
+ image_instance = image_model.objects.create()
+
+ try:
+ image_instance.image.save(
+ os.path.basename(item.image.path),
+ File(open(item.image.path))
+ )
+ image_instance.thumbnail.save(
+ os.path.basename(item.thumbnail.path),
+ File(open(item.thumbnail.path))
+ )
+ except IOError:
+ # image not on hard-drive
+ item.image = None
+ item.thumbnail = None
+ item.save()
+ image_instance.delete()
+ missing += 1
+ continue
+
+ image_instance.save()
+
+ rel_model.objects.create(item=item, image=image_instance, is_main=True)
+
+ # clean
+ item.image = None
+ item.thumbnail = None
+ item.save()
+ moved += 1
+ if verbose:
+ print("")
+ print(base_model)
+ print("{} missing".format(missing))
+ print("{} moved".format(moved))