diff --git a/ohmg/api/schemas.py b/ohmg/api/schemas.py index 428ba8a7..84d7083e 100644 --- a/ohmg/api/schemas.py +++ b/ohmg/api/schemas.py @@ -497,7 +497,7 @@ def resolve_id(obj): @staticmethod def resolve_layers(obj): - return natsorted(obj.layer_set.all(), key=lambda k: k.title) + return natsorted(obj.get_layers(), key=lambda k: k.title) @staticmethod def resolve_name(obj): @@ -651,7 +651,9 @@ def resolve_loaded_by(obj): @staticmethod def resolve_locks(obj): locks = [ - i for i in SessionLock.objects.all().prefetch_related() if i.target and i.target.map.pk == obj.pk + i + for i in SessionLock.objects.all().prefetch_related() + if i.target and i.target.map.pk == obj.pk ] return locks diff --git a/ohmg/core/management/commands/oneoffs.py b/ohmg/core/management/commands/oneoffs.py index db1a0cc4..93af59f4 100644 --- a/ohmg/core/management/commands/oneoffs.py +++ b/ohmg/core/management/commands/oneoffs.py @@ -26,6 +26,7 @@ def add_arguments(self, parser): "fix-full-region-files", "set-tilejson", "delete-duplicate-regions", + "add-masks-to-layers", ], help="Choose what operation to run.", ) @@ -408,3 +409,24 @@ def old_ds_to_new(file_set): if not dry_run: delete_ps.delete() print("deleted") + + ## Mar 11th, 2026 + elif operation == "add-masks-to-layers": + from django.contrib.gis.geos import GEOSGeometry + + from ohmg.core.models import Layer, LayerSet + + for ls in LayerSet.objects.all(): + print(ls) + if ls.multimask: + for k, v in ls.multimask.items(): + print(k) + ## there SHOULD only be one layer here, but per ticket + ## #308 some regions got duplicated, and some of the + ## duplicates got georeferenced :(. Can't clean all of + ## that up now, so... using filter here + layers = Layer.objects.filter(slug=k, region__document__map=ls.map) + for layer in layers: + layer.mask = GEOSGeometry(json.dumps(v["geometry"])) + layer.save(skip_map_lookup_update=True) + print("") diff --git a/ohmg/core/migrations/0009_layer_mask.py b/ohmg/core/migrations/0009_layer_mask.py new file mode 100644 index 00000000..420aa891 --- /dev/null +++ b/ohmg/core/migrations/0009_layer_mask.py @@ -0,0 +1,19 @@ +# Generated by Django 4.2.27 on 2026-03-11 17:19 + +import django.contrib.gis.db.models.fields +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0008_auto_20250915_1937'), + ] + + operations = [ + migrations.AddField( + model_name='layer', + name='mask', + field=django.contrib.gis.db.models.fields.PolygonField(blank=True, null=True, srid=4326), + ), + ] diff --git a/ohmg/core/models.py b/ohmg/core/models.py index be2e2325..a9b7e97d 100644 --- a/ohmg/core/models.py +++ b/ohmg/core/models.py @@ -4,7 +4,7 @@ import urllib.parse from datetime import datetime from pathlib import Path -from typing import Union +from typing import Iterable, Union from django.conf import settings from django.contrib.auth import get_user_model @@ -284,7 +284,7 @@ def stats(self): main_layerset = self.get_layerset("main-content") if main_layerset: - main_lyrs_ct = main_layerset.layer_set.count() + main_lyrs_ct = main_layerset.get_layers().count() else: main_lyrs_ct = 0 mm_ct, mm_todo, mm_percent = 0, 0, 0 @@ -441,7 +441,7 @@ def update_item_lookup(self): multimask_ct, multimask_rank = 0, 0 main_layerset = self.get_layerset("main-content") if main_layerset: - main_lyrs_ct = main_layerset.layer_set.count() + main_lyrs_ct = main_layerset.get_layers().count() else: main_lyrs_ct = 0 @@ -833,6 +833,7 @@ class Meta: null=True, blank=True, ) + mask = models.PolygonField(blank=True, null=True) file = models.FileField( upload_to="layers", null=True, @@ -922,7 +923,7 @@ def set_layerset(self, layerset): logger.info( f"Layer {self.pk} removed from existing multimask in LayerSet {existing_obj.pk}" ) - if existing_obj.layer_set.all().count() == 1: + if existing_obj.get_layers().count() == 1: delete_existing = True self.layerset2 = layerset self.save(update_fields=["layerset2"]) @@ -1050,13 +1051,15 @@ def __str__(self): def layer_display_list(self): """For display in the admin interface only.""" li = [ - f"