diff options
| -rw-r--r-- | archaeological_context_records/migrations/0022_migrate_image.py | 27 | ||||
| -rw-r--r-- | archaeological_context_records/migrations/0023_auto_20180511_1232.py | 31 | ||||
| -rw-r--r-- | archaeological_context_records/models.py | 7 | ||||
| -rw-r--r-- | archaeological_finds/migrations/0025_migrate_image.py | 32 | ||||
| -rw-r--r-- | archaeological_finds/migrations/0026_auto_20180511_1233.py | 31 | ||||
| -rw-r--r-- | archaeological_finds/models_finds.py | 6 | ||||
| -rw-r--r-- | archaeological_operations/migrations/0028_migrate_image.py | 26 | ||||
| -rw-r--r-- | archaeological_operations/migrations/0029_auto_20180511_1232.py | 31 | ||||
| -rw-r--r-- | archaeological_operations/models.py | 7 | ||||
| -rw-r--r-- | ishtar_common/models.py | 3 | ||||
| -rw-r--r-- | ishtar_common/utils.py | 17 | ||||
| -rw-r--r-- | ishtar_common/utils_migrations.py | 48 | 
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))  | 
