Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions ohmg/api/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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

Expand Down
22 changes: 22 additions & 0 deletions ohmg/core/management/commands/oneoffs.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.",
)
Expand Down Expand Up @@ -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("")
19 changes: 19 additions & 0 deletions ohmg/core/migrations/0009_layer_mask.py
Original file line number Diff line number Diff line change
@@ -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),
),
]
17 changes: 10 additions & 7 deletions ohmg/core/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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"])
Expand Down Expand Up @@ -1050,13 +1051,15 @@ def __str__(self):
def layer_display_list(self):
"""For display in the admin interface only."""
li = [
f"<li><a href='/admin/core/layer/{i.pk}/change'>{i}</a></li>"
for i in self.layer_set.all()
f"<li><a href='/admin/core/layer/{i.pk}/change'>{i}</a></li>" for i in self.get_layers()
]
return mark_safe("<ul>" + "".join(li) + "</ul>")

layer_display_list.short_description = "Layers"

def get_layers(self) -> Iterable[Layer]:
return self.layer_set.all()

@cached_property
def centroid(self):
return Polygon.from_bbox(self.extent).centroid
Expand Down Expand Up @@ -1139,7 +1142,7 @@ def update_multimask_from_geojson(self, multimask_geojson):

def save(self, set_tilejson: bool = False, *args, **kwargs):
if self._state.adding is False:
extents = self.layer_set.all().values_list("extent", flat=True)
extents = self.get_layers().values_list("extent", flat=True)
layer_extents = []
for extent in extents:
if extent:
Expand Down
2 changes: 1 addition & 1 deletion ohmg/core/signals.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,5 +61,5 @@ def handle_layer_deletion(sender, instance, **kwargs):

# remove layerset if this was the last layer attached to it
if instance.layerset2:
if instance.layerset2.layer_set.all().count() == 0:
if instance.layerset2.get_layers().count() == 0:
instance.layerset2.delete()
2 changes: 1 addition & 1 deletion ohmg/extensions/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ def get(self, request, mapid, layerset_category):
"label": f"Mosaic of {ls.category.display_name.lower()}, {ls.map}",
"items": [
IIIFResource(i.pk, trimmed=trim, extended=extended).get_annotation()
for i in [k for k in ls.layer_set.all()]
for i in [k for k in ls.get_layers()]
],
}
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
export let MAP;
export let MAIN_LAYERSET;
export let KEYMAP_LAYERSET;
export let OTHER_MAPS;
export let PARCEL_LAYER;

let previewMode = 'n/a';
Expand Down
12 changes: 12 additions & 0 deletions ohmg/georeference/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
)
from ohmg.core.models import (
Document,
Map,
Region,
)
from ohmg.core.storages import get_file_url
Expand Down Expand Up @@ -210,12 +211,23 @@ def get(self, request, docid):
parcel_layer = region.map.get_locale().get_parcels()
parcel_json = parcel_layer.serialize() if parcel_layer else None

place = region.map.locales.first()
other_maps = []
if place:
other_maps = list(
Map.objects.filter(locales__id__exact=place.id, hidden=False)
.exclude(pk=region.map.pk)
.values_list("identifier", "title")
)
other_maps = [{"identifier": i[0], "title": i[1]} for i in other_maps]

georeference_params = {
"CONTEXT": generate_ohmg_context(request),
"REGION": region_json,
"MAP": map_json,
"MAIN_LAYERSET": main_layerset,
"KEYMAP_LAYERSET": keymap_layerset,
"OTHER_MAPS": other_maps,
"PARCEL_LAYER": parcel_json,
}

Expand Down