diff options
| author | Étienne Loks <etienne.loks@iggdrasil.net> | 2020-12-23 08:48:56 +0100 | 
|---|---|---|
| committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2021-02-28 12:15:23 +0100 | 
| commit | a91c54dbb338a075a2dbf2e9ddc2d4acff225f2e (patch) | |
| tree | c87061a9c41e9ff76fb25526a34c764e59985b38 | |
| parent | b9579090f654eed8fc9ff656cfd415327f890e6a (diff) | |
| download | Ishtar-a91c54dbb338a075a2dbf2e9ddc2d4acff225f2e.tar.bz2 Ishtar-a91c54dbb338a075a2dbf2e9ddc2d4acff225f2e.zip | |
Container: fix index generation
3 files changed, 28 insertions, 4 deletions
| diff --git a/archaeological_warehouse/management/commands/migrate_to_new_container_management.py b/archaeological_warehouse/management/commands/migrate_to_new_container_management.py index 44895ce69..24ec078bf 100644 --- a/archaeological_warehouse/management/commands/migrate_to_new_container_management.py +++ b/archaeological_warehouse/management/commands/migrate_to_new_container_management.py @@ -58,7 +58,10 @@ class Command(BaseCommand):          for idx, container in enumerate(to_update.values("id").all()):              sys.stdout.write("* Updating: {}/{}\r".format(idx + 1, to_be_done))              sys.stdout.flush() -            container = models.Container.objects.get(pk=container["id"]) +            try: +                container = models.Container.objects.get(pk=container["id"]) +            except models.Container.DoesNotExist: +                continue  # already merged              if container.responsible_id not in potential_duplicate:                  potential_duplicate[container.responsible_id] = {}              parent = None diff --git a/archaeological_warehouse/migrations/0107_auto_20201222_1339.py b/archaeological_warehouse/migrations/0107_auto_20201222_1339.py index f51036b59..6bd418541 100644 --- a/archaeological_warehouse/migrations/0107_auto_20201222_1339.py +++ b/archaeological_warehouse/migrations/0107_auto_20201222_1339.py @@ -3,6 +3,26 @@  from __future__ import unicode_literals  from django.db import migrations, models +from django.db.models import Max, Q + + +def fix_index(apps, schema_editor): +    Container = apps.get_model('archaeological_warehouse', 'Container') +    for c in Container.objects.all(): +        q = Container.objects.filter( +            Q(responsible_id=c.responsible_id, index=c.index) | +            Q(location_id=c.location_id, index=c.index) +        ).exclude(id=c.id) +        if q.count(): +            max_index = Container.objects.filter( +                responsible_id=c.responsible_id).exclude( +                id=c.id).all().aggregate(Max("index"))["index__max"] + 1 +            while Container.objects.filter( +                    location_id=c.location_id, +                    index=max_index).exclude(id=c.id).count(): +                max_index += 1 +            c.index = max_index +            c.save()  class Migration(migrations.Migration): @@ -27,6 +47,7 @@ class Migration(migrations.Migration):              name='max_division_number',              field=models.IntegerField(default=0, help_text='Automatically generated', verbose_name='Maximum number of divisions'),          ), +        migrations.RunPython(fix_index),          migrations.AlterUniqueTogether(              name='container',              unique_together=set([('index', 'location'), ('location', 'container_type', 'parent', 'reference')]), diff --git a/archaeological_warehouse/models.py b/archaeological_warehouse/models.py index 3e45b3c90..017c39092 100644 --- a/archaeological_warehouse/models.py +++ b/archaeological_warehouse/models.py @@ -453,11 +453,11 @@ class Warehouse(Address, DocumentItem, GeoItem, CompleteIdentifierItem,              container.save()  # force label regeneration          for container in list(item.containers.all()):              if Container.objects.filter(index=container.index, -                                        responsible=self).count(): +                                        location=self).count():                  container.index = Container.objects.filter( -                    responsible=self).all().aggregate( +                    location=self).exclude(id=container.id).all().aggregate(                      Max("index"))["index__max"] + 1 -            container.responsible = self +            container.location = self              container.save()          for wdiv in WarehouseDivisionLink.objects.filter(warehouse=item).all():              wdiv.delete() | 
