From e4207d86856eb764cf0c86fb97dbede8dce1eabf Mon Sep 17 00:00:00 2001 From: George Silva <863039+george-silva@users.noreply.github.com> Date: Tue, 22 Oct 2024 14:54:12 -0300 Subject: [PATCH] admin improvements 3 (#1830) --- poetry.lock | 18 +++++++++++---- pyproject.toml | 1 + src/planscape/datasets/admin.py | 3 ++- src/planscape/datasets/forms.py | 33 ++++++++++++++++++++++++++- src/planscape/datasets/models.py | 1 + src/planscape/organizations/models.py | 1 + src/planscape/planscape/settings.py | 1 + 7 files changed, 52 insertions(+), 6 deletions(-) diff --git a/poetry.lock b/poetry.lock index c92b148ac..6ff16adc9 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. [[package]] name = "affine" @@ -897,6 +897,16 @@ files = [ [package.dependencies] Django = ">=2.2" +[[package]] +name = "django-json-widget" +version = "2.0.1" +description = "Django json widget is an alternative widget that makes it easy to edit the jsonfield field of django." +optional = false +python-versions = "*" +files = [ + {file = "django-json-widget-2.0.1.tar.gz", hash = "sha256:adb4cab17fe5a04139037d7d84725369530ef35b912c3790d3a7b13f99351358"}, +] + [[package]] name = "django-password-policies-validator" version = "1.0.2" @@ -2022,9 +2032,9 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, {version = ">=1.22.4", markers = "python_version < \"3.11\""}, {version = ">=1.23.2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" @@ -2388,8 +2398,8 @@ files = [ annotated-types = ">=0.6.0" pydantic-core = "2.23.4" typing-extensions = [ - {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, {version = ">=4.6.1", markers = "python_version < \"3.13\""}, + {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, ] [package.extras] @@ -4016,4 +4026,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "0d6fdfc42818dcfaa7a2557cbb6b3c9ad423979b82338f5b568d354061db5a5a" +content-hash = "7a374ba9778921b82405e0f51202d7d8482c176576c5565bd62ce0eb388e2a95" diff --git a/pyproject.toml b/pyproject.toml index 632b85955..1ca0b653c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -61,6 +61,7 @@ whitenoise = "^6.7.0" djangorestframework-types = "^0.8.0" toml = "^0.10.2" rio-cogeo = "^5.3.6" +django-json-widget = "^2.0.1" [tool.poetry.group.dev.dependencies] colorama = "^0.4.6" diff --git a/src/planscape/datasets/admin.py b/src/planscape/datasets/admin.py index 73b818d9c..7f3ef0ec6 100644 --- a/src/planscape/datasets/admin.py +++ b/src/planscape/datasets/admin.py @@ -1,6 +1,6 @@ from typing import Any, Dict from django.contrib import admin -from datasets.forms import DatasetAdminForm, CategoryAdminForm +from datasets.forms import DataLayerAdminForm, DatasetAdminForm, CategoryAdminForm from datasets.models import Category, DataLayer, Dataset from treebeard.admin import TreeAdmin from treebeard.forms import movenodeform_factory @@ -31,6 +31,7 @@ def get_changeform_initial_data(self, request) -> Dict[str, Any]: class DataLayerAdmin(admin.ModelAdmin): + form = DataLayerAdminForm search_fields = [ "organization__name__icontains", "dataset__name__icontains", diff --git a/src/planscape/datasets/forms.py b/src/planscape/datasets/forms.py index bb11c73ed..db596f824 100644 --- a/src/planscape/datasets/forms.py +++ b/src/planscape/datasets/forms.py @@ -1,7 +1,8 @@ from django import forms -from datasets.models import Category, Dataset +from datasets.models import Category, DataLayer, Dataset from treebeard.forms import movenodeform_factory +from django_json_widget.widgets import JSONEditorWidget class DatasetAdminForm(forms.ModelForm): @@ -40,3 +41,33 @@ class Meta: "name", "order", ) + + +class DataLayerAdminForm(forms.ModelForm): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields["created_by"].disabled = True + self.fields["original_name"].disabled = True + self.fields["mimetype"].disabled = True + self.fields["url"].disabled = True + self.fields["geometry"].disabled = True + + class Meta: + model = DataLayer + widgets = { + "info": JSONEditorWidget, + "metadata": JSONEditorWidget, + } + fields = ( + "organization", + "created_by", + "dataset", + "category", + "name", + "info", + "metadata", + "original_name", + "mimetype", + "url", + "geometry", + ) diff --git a/src/planscape/datasets/models.py b/src/planscape/datasets/models.py index 71565bd0a..b500d2755 100644 --- a/src/planscape/datasets/models.py +++ b/src/planscape/datasets/models.py @@ -216,5 +216,6 @@ def __str__(self) -> str: return f"{self.name} [{self.type}]" class Meta(TypedModelMeta): + ordering = ("organization", "dataset", "id") verbose_name = "Datalayer" verbose_name_plural = "Datalayers" diff --git a/src/planscape/organizations/models.py b/src/planscape/organizations/models.py index f69711f09..89761f0cb 100644 --- a/src/planscape/organizations/models.py +++ b/src/planscape/organizations/models.py @@ -45,6 +45,7 @@ def __str__(self): return f"{self.name} [{self.type}]" class Meta(TypedModelMeta): + ordering = ("id",) verbose_name = "Organization" verbose_name_plural = "Organizations" constraints = [ diff --git a/src/planscape/planscape/settings.py b/src/planscape/planscape/settings.py index 893d09957..bd6872bd4 100644 --- a/src/planscape/planscape/settings.py +++ b/src/planscape/planscape/settings.py @@ -68,6 +68,7 @@ "django.contrib.staticfiles", "django.contrib.gis", "django_extensions", + "django_json_widget", "actstream", "password_policies", "rest_framework",