diff --git a/apps/establishment/admin.py b/apps/establishment/admin.py index 4b845c60..38016a18 100644 --- a/apps/establishment/admin.py +++ b/apps/establishment/admin.py @@ -4,6 +4,7 @@ from django.contrib.contenttypes.admin import GenericTabularInline from django.utils.translation import gettext_lazy as _ from comment.models import Comment +from utils.admin import BaseModelAdminMixin from establishment import models from main.models import Award from review import models as review_models @@ -57,7 +58,7 @@ class EstablishmentAdmin(admin.ModelAdmin): @admin.register(models.Position) -class PositionAdmin(admin.ModelAdmin): +class PositionAdmin(BaseModelAdminMixin): """Position admin.""" @@ -68,7 +69,7 @@ class PlateInline(admin.TabularInline): @admin.register(models.Menu) -class MenuAdmin(admin.ModelAdmin): +class MenuAdmin(BaseModelAdminMixin): """Menu admin.""" list_display = ['id', 'category_translated'] inlines = [ diff --git a/apps/news/admin.py b/apps/news/admin.py index 91fb284c..a6ca3279 100644 --- a/apps/news/admin.py +++ b/apps/news/admin.py @@ -3,6 +3,7 @@ from django.conf import settings from news import models from .tasks import send_email_with_news +from utils.admin import BaseModelAdminMixin @admin.register(models.NewsType) @@ -24,7 +25,7 @@ send_email_action.short_description = "Send the selected news by email" @admin.register(models.News) -class NewsAdmin(admin.ModelAdmin): +class NewsAdmin(BaseModelAdminMixin): """News admin.""" raw_id_fields = ('address',) actions = [send_email_action] diff --git a/apps/review/admin.py b/apps/review/admin.py index 5820f557..03c2419a 100644 --- a/apps/review/admin.py +++ b/apps/review/admin.py @@ -1,8 +1,9 @@ """Admin page for app Review""" from . import models from django.contrib import admin +from utils.admin import BaseModelAdminMixin @admin.register(models.Review) -class ReviewAdminModel(admin.ModelAdmin): +class ReviewAdminModel(BaseModelAdminMixin): """Admin model for model Review.""" diff --git a/apps/utils/admin.py b/apps/utils/admin.py new file mode 100644 index 00000000..43680e20 --- /dev/null +++ b/apps/utils/admin.py @@ -0,0 +1,36 @@ +"""Mixins for admin models.""" +from django.contrib import admin +from django.db.models import ForeignKey + + +class BaseModelAdminMixin(admin.ModelAdmin): + """ + Class that overridden ModelAdmin and adds to readonly_fields attr + persisted fields like created_by, modified_by. + """ + + _PERSISTENT_READ_ONLY_FIELDS = ['created_by', 'modified_by'] + + def _get_fk_field_names(self, fields: iter): + """ + Return an iterable object which contains FK model fields. + :param fields: iterable + :return: iterable + """ + foreign_key_fields = [] + for field in fields: + if isinstance(field, ForeignKey): + foreign_key_fields.append(field.name) + return foreign_key_fields + + def get_readonly_fields(self, request, obj=None): + """ + Hook for specifying custom readonly fields. + """ + _readonly_fields = list(self.readonly_fields) + fk_field_names = self._get_fk_field_names(self.model._meta.fields) + + for field_name in fk_field_names: + if field_name in self._PERSISTENT_READ_ONLY_FIELDS: + _readonly_fields.append(field_name) + return tuple(_readonly_fields)