added BaseModelAdminMixin

This commit is contained in:
Anatoly 2019-10-29 14:01:27 +03:00
parent 338c4a4901
commit 8cf2cebe85
4 changed files with 43 additions and 4 deletions

View File

@ -4,6 +4,7 @@ from django.contrib.contenttypes.admin import GenericTabularInline
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from comment.models import Comment from comment.models import Comment
from utils.admin import BaseModelAdminMixin
from establishment import models from establishment import models
from main.models import Award from main.models import Award
from review import models as review_models from review import models as review_models
@ -57,7 +58,7 @@ class EstablishmentAdmin(admin.ModelAdmin):
@admin.register(models.Position) @admin.register(models.Position)
class PositionAdmin(admin.ModelAdmin): class PositionAdmin(BaseModelAdminMixin):
"""Position admin.""" """Position admin."""
@ -68,7 +69,7 @@ class PlateInline(admin.TabularInline):
@admin.register(models.Menu) @admin.register(models.Menu)
class MenuAdmin(admin.ModelAdmin): class MenuAdmin(BaseModelAdminMixin):
"""Menu admin.""" """Menu admin."""
list_display = ['id', 'category_translated'] list_display = ['id', 'category_translated']
inlines = [ inlines = [

View File

@ -3,6 +3,7 @@ from django.conf import settings
from news import models from news import models
from .tasks import send_email_with_news from .tasks import send_email_with_news
from utils.admin import BaseModelAdminMixin
@admin.register(models.NewsType) @admin.register(models.NewsType)
@ -24,7 +25,7 @@ send_email_action.short_description = "Send the selected news by email"
@admin.register(models.News) @admin.register(models.News)
class NewsAdmin(admin.ModelAdmin): class NewsAdmin(BaseModelAdminMixin):
"""News admin.""" """News admin."""
raw_id_fields = ('address',) raw_id_fields = ('address',)
actions = [send_email_action] actions = [send_email_action]

View File

@ -1,8 +1,9 @@
"""Admin page for app Review""" """Admin page for app Review"""
from . import models from . import models
from django.contrib import admin from django.contrib import admin
from utils.admin import BaseModelAdminMixin
@admin.register(models.Review) @admin.register(models.Review)
class ReviewAdminModel(admin.ModelAdmin): class ReviewAdminModel(BaseModelAdminMixin):
"""Admin model for model Review.""" """Admin model for model Review."""

36
apps/utils/admin.py Normal file
View File

@ -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)