diff --git a/api/admin.py b/api/admin.py index c5e1fba..2d214d0 100644 --- a/api/admin.py +++ b/api/admin.py @@ -12,5 +12,9 @@ class APITokenAdmin(admin.ModelAdmin): readonly_fields = [ "token" ] + search_fields = [ + "token" + ] + admin.site.register(APIUserToken, APITokenAdmin) diff --git a/codelist/admin.py b/codelist/admin.py index f306b04..55ce827 100644 --- a/codelist/admin.py +++ b/codelist/admin.py @@ -35,6 +35,13 @@ class KonovaCodeAdmin(admin.ModelAdmin): "parent", ] + search_fields = [ + "id", + "atom_id", + "long_name", + "short_name", + ] + #admin.site.register(KonovaCodeList, KonovaCodeListAdmin) admin.site.register(KonovaCode, KonovaCodeAdmin) diff --git a/compensation/admin.py b/compensation/admin.py index 735ffb4..6519a1e 100644 --- a/compensation/admin.py +++ b/compensation/admin.py @@ -2,28 +2,48 @@ from django.contrib import admin from compensation.models import Compensation, CompensationAction, CompensationState, Payment, \ EcoAccountDeduction, EcoAccount -from konova.admin import BaseObjectAdmin +from konova.admin import BaseObjectAdmin, BaseResourceAdmin -class CompensationStateAdmin(admin.ModelAdmin): +class AbstractCompensationAdmin(BaseObjectAdmin): list_display = [ "id", - "biotope_type", - "surface", + "identifier", + "title", + "created", + "deleted", ] + def get_fields(self, request, obj=None): + return super().get_fields(request, obj) + [ + "identifier", + "title", + "comment", + "after_states", + "before_states", + ] -class CompensationActionAdmin(admin.ModelAdmin): - list_display = [ - "id", - "action_type", - "amount", - "unit", - "comment", + def get_readonly_fields(self, request, obj=None): + return super().get_readonly_fields(request, obj) + [ + "after_states", + "before_states", + ] + + +class CompensationAdmin(AbstractCompensationAdmin): + autocomplete_fields = [ + "intervention", ] + def get_fields(self, request, obj=None): + return super().get_fields(request, obj) + [ + "is_cef", + "is_coherence_keeping", + "intervention", + ] + -class CompensationAdmin(BaseObjectAdmin): +class EcoAccountAdmin(AbstractCompensationAdmin): list_display = [ "id", "identifier", @@ -32,14 +52,16 @@ class CompensationAdmin(BaseObjectAdmin): "deleted", ] - -class EcoAccountAdmin(admin.ModelAdmin): - list_display = [ - "id", - "identifier", - "title", + filter_horizontal = [ + "users" ] + def get_fields(self, request, obj=None): + return super().get_fields(request, obj) + [ + "deductable_surface", + "users" + ] + class PaymentAdmin(admin.ModelAdmin): list_display = [ @@ -49,18 +71,56 @@ class PaymentAdmin(admin.ModelAdmin): ] -class EcoAccountDeductionAdmin(admin.ModelAdmin): +class EcoAccountDeductionAdmin(BaseResourceAdmin): list_display = [ "id", "account", "intervention", "surface", ] + search_fields = [ + "account__identifier", + "account__title", + "intervention__identifier", + "intervention__title", + "surface", + ] + autocomplete_fields = [ + "account", + "intervention", + ] + + def get_fields(self, request, obj=None): + return super().get_fields(request, obj) + [ + "account", + "intervention", + "surface", + ] + + +class CompensationStateAdmin(admin.ModelAdmin): + list_display = [ + "id", + "biotope_type", + "surface", + ] + + +class CompensationActionAdmin(admin.ModelAdmin): + list_display = [ + "id", + "action_type", + "amount", + "unit", + "comment", + ] admin.site.register(Compensation, CompensationAdmin) -admin.site.register(Payment, PaymentAdmin) -admin.site.register(CompensationAction, CompensationActionAdmin) -admin.site.register(CompensationState, CompensationStateAdmin) admin.site.register(EcoAccount, EcoAccountAdmin) admin.site.register(EcoAccountDeduction, EcoAccountDeductionAdmin) + +# For a more cleaner admin interface these rarely used admin views are not important for deployment +#admin.site.register(Payment, PaymentAdmin) +#admin.site.register(CompensationAction, CompensationActionAdmin) +#admin.site.register(CompensationState, CompensationStateAdmin) \ No newline at end of file diff --git a/compensation/models/action.py b/compensation/models/action.py index 95fe280..087f48b 100644 --- a/compensation/models/action.py +++ b/compensation/models/action.py @@ -59,7 +59,7 @@ class CompensationAction(BaseResource): objects = CompensationActionManager() def __str__(self): - return "{} | {} {}".format(self.action_type, self.amount, self.unit) + return f"{self.action_type} | {self.amount} {self.unit}" @property def unit_humanize(self): diff --git a/compensation/models/eco_account.py b/compensation/models/eco_account.py index 84a6140..afe556f 100644 --- a/compensation/models/eco_account.py +++ b/compensation/models/eco_account.py @@ -46,7 +46,7 @@ class EcoAccount(AbstractCompensation, ShareableObjectMixin, RecordableObjectMix objects = EcoAccountManager() def __str__(self): - return "{}".format(self.identifier) + return f"{self.identifier} ({self.title})" def clean(self): # Deductable surface can not be larger than added states after surface diff --git a/compensation/models/state.py b/compensation/models/state.py index 858ac3d..ce0fc69 100644 --- a/compensation/models/state.py +++ b/compensation/models/state.py @@ -44,4 +44,4 @@ class CompensationState(UuidModel): objects = CompensationStateManager() def __str__(self): - return "{} | {} m²".format(self.biotope_type, self.surface) + return f"{self.biotope_type} | {self.surface} m²" diff --git a/ema/admin.py b/ema/admin.py index 6020a80..7cd5a7f 100644 --- a/ema/admin.py +++ b/ema/admin.py @@ -1,10 +1,17 @@ from django.contrib import admin -from compensation.admin import CompensationAdmin +from compensation.admin import AbstractCompensationAdmin from ema.models import Ema -class EmaAdmin(CompensationAdmin): - pass +class EmaAdmin(AbstractCompensationAdmin): + filter_horizontal = [ + "users" + ] + + def get_fields(self, request, obj=None): + return super().get_fields(request, obj) + [ + "users" + ] admin.site.register(Ema, EmaAdmin) diff --git a/intervention/admin.py b/intervention/admin.py index bae8983..3d874df 100644 --- a/intervention/admin.py +++ b/intervention/admin.py @@ -13,6 +13,26 @@ class InterventionAdmin(BaseObjectAdmin): "deleted", ] + filter_horizontal = [ + "users" + ] + + def get_fields(self, request, obj=None): + return super().get_fields(request, obj) + [ + "identifier", + "title", + "comment", + "checked", + "recorded", + "users", + ] + + def get_readonly_fields(self, request, obj=None): + return super().get_readonly_fields(request, obj) + [ + "checked", + "recorded", + ] + class InterventionDocumentAdmin(AbstractDocumentAdmin): pass @@ -48,7 +68,9 @@ class RevocationAdmin(admin.ModelAdmin): admin.site.register(Intervention, InterventionAdmin) -admin.site.register(Responsibility, ResponsibilityAdmin) -admin.site.register(Legal, LegalAdmin) -admin.site.register(Revocation, RevocationAdmin) -admin.site.register(InterventionDocument, InterventionDocumentAdmin) + +# Outcommented for a cleaner admin backend on production +#admin.site.register(Responsibility, ResponsibilityAdmin) +#admin.site.register(Legal, LegalAdmin) +#admin.site.register(Revocation, RevocationAdmin) +#admin.site.register(InterventionDocument, InterventionDocumentAdmin) diff --git a/intervention/models/intervention.py b/intervention/models/intervention.py index 398c00f..4753920 100644 --- a/intervention/models/intervention.py +++ b/intervention/models/intervention.py @@ -51,7 +51,7 @@ class Intervention(BaseObject, ShareableObjectMixin, RecordableObjectMixin, Chec objects = InterventionManager() def __str__(self): - return "{} ({})".format(self.identifier, self.title) + return f"{self.identifier} ({self.title})" def save(self, *args, **kwargs): """ Custom save functionality diff --git a/konova/admin.py b/konova/admin.py index 02568de..a64d524 100644 --- a/konova/admin.py +++ b/konova/admin.py @@ -62,16 +62,35 @@ class DeadlineAdmin(admin.ModelAdmin): ] -class BaseObjectAdmin(admin.ModelAdmin): +class BaseResourceAdmin(admin.ModelAdmin): + fields = [ + "created", + "modified", + ] readonly_fields = [ "modified", - "deleted", "created", ] -admin.site.register(Geometry, GeometryAdmin) -admin.site.register(Parcel, ParcelAdmin) -admin.site.register(District, DistrictAdmin) -admin.site.register(GeometryConflict, GeometryConflictAdmin) -admin.site.register(Deadline, DeadlineAdmin) +class BaseObjectAdmin(BaseResourceAdmin): + search_fields = [ + "identifier", + "title", + ] + + def get_fields(self, request, obj=None): + return super().get_fields(request, obj) + ["deleted"] + + def get_readonly_fields(self, request, obj=None): + return super().get_readonly_fields(request, obj) + [ + "deleted", + ] + + +# Outcommented for a cleaner admin backend on production +#admin.site.register(Geometry, GeometryAdmin) +#admin.site.register(Parcel, ParcelAdmin) +#admin.site.register(District, DistrictAdmin) +#admin.site.register(GeometryConflict, GeometryConflictAdmin) +#admin.site.register(Deadline, DeadlineAdmin) diff --git a/news/admin.py b/news/admin.py index b4508cc..cada8c4 100644 --- a/news/admin.py +++ b/news/admin.py @@ -4,11 +4,23 @@ from news.models import ServerMessage class ServerMessageAdmin(admin.ModelAdmin): + readonly_fields = [ + "modified", + "created", + ] list_display = [ "id", "subject", "publish_on", "is_active", ] + search_fields = [ + "subject" + ] + + def save_model(self, request, obj, form, change): + obj.save(user=request.user) + admin.site.register(ServerMessage, ServerMessageAdmin) + diff --git a/news/models.py b/news/models.py index 0a9d6dd..b9a26e0 100644 --- a/news/models.py +++ b/news/models.py @@ -2,6 +2,7 @@ from django.db import models from django.utils.translation import gettext_lazy as _ from konova.models import BaseResource +from user.models import UserActionLogEntry class ServerMessageImportance(models.TextChoices): @@ -23,3 +24,13 @@ class ServerMessage(BaseResource): publish_on = models.DateTimeField() unpublish_on = models.DateTimeField() importance = models.CharField(max_length=100, choices=ServerMessageImportance.choices) + + def save(self, user=None, *args, **kwargs): + user = kwargs.pop("user", None) + if user is not None: + if self.created is None: + self.created = UserActionLogEntry.get_created_action(user) + else: + self.modified = UserActionLogEntry.get_edited_action(user) + + super().save(*args, **kwargs) diff --git a/user/admin.py b/user/admin.py index 92266b9..3e60861 100644 --- a/user/admin.py +++ b/user/admin.py @@ -19,6 +19,40 @@ class UserAdmin(admin.ModelAdmin): "last_name", "email", ] + fields = [ + "username", + "first_name", + "last_name", + "email", + "is_active", + "is_staff", + "is_superuser", + "api_token", + "groups", + "notifications", + "date_joined", + "last_login", + ] + search_fields = [ + "username", + "first_name", + "last_name", + "email", + ] + filter_horizontal = [ + "groups", + "notifications", + ] + readonly_fields = [ + "date_joined", + "last_login", + ] + autocomplete_fields = [ + "api_token", + ] + exclude = [ + "user_permissions", + ] class UserActionLogEntryAdmin(admin.ModelAdmin): @@ -30,6 +64,8 @@ class UserActionLogEntryAdmin(admin.ModelAdmin): ] -admin.site.register(UserNotification, UserNotificationAdmin) -admin.site.register(UserActionLogEntry, UserActionLogEntryAdmin) -admin.site.register(User, UserAdmin) \ No newline at end of file +admin.site.register(User, UserAdmin) + +# Outcommented for a cleaner admin backend on production +#admin.site.register(UserNotification, UserNotificationAdmin) +#admin.site.register(UserActionLogEntry, UserActionLogEntryAdmin) diff --git a/user/models/user_action.py b/user/models/user_action.py index d902c5d..14d8f41 100644 --- a/user/models/user_action.py +++ b/user/models/user_action.py @@ -10,6 +10,8 @@ import uuid from django.db import models from django.utils.translation import gettext_lazy as _ +from konova.sub_settings.django_settings import DEFAULT_DATE_FORMAT, DEFAULT_DATE_TIME_FORMAT + class UserAction(models.TextChoices): """ @@ -49,6 +51,9 @@ class UserActionLogEntry(models.Model): "-timestamp", ) + def __str__(self): + return f"{self.timestamp.strftime(DEFAULT_DATE_TIME_FORMAT)} | {self.action} | {self.user}" + @property def action_humanize(self): """ Returns humanized version of enum