Skip to content
Snippets Groups Projects
Commit cd0b6697 authored by Todd Dembrey's avatar Todd Dembrey
Browse files

Refactor to move the related listing to a mixin

parent deaa89a7
No related branches found
No related tags found
No related merge requests found
from django.utils.html import mark_safe
from wagtail.contrib.modeladmin.helpers import PermissionHelper from wagtail.contrib.modeladmin.helpers import PermissionHelper
from wagtail.contrib.modeladmin.options import ModelAdmin, ModelAdminGroup from wagtail.contrib.modeladmin.options import ModelAdmin, ModelAdminGroup
from opentech.apply.review.admin import ReviewFormAdmin from opentech.apply.review.admin import ReviewFormAdmin
from opentech.apply.utils.admin import ListRelatedMixin
from .admin_helpers import ( from .admin_helpers import (
ButtonsWithPreview, ButtonsWithPreview,
FormsFundRoundListFilter, FormsFundRoundListFilter,
...@@ -57,7 +56,7 @@ class NoDeletePermission(PermissionHelper): ...@@ -57,7 +56,7 @@ class NoDeletePermission(PermissionHelper):
return False return False
class ApplicationFormAdmin(ModelAdmin): class ApplicationFormAdmin(ListRelatedMixin, ModelAdmin):
model = ApplicationForm model = ApplicationForm
menu_icon = 'form' menu_icon = 'form'
list_display = ('name', 'used_by') list_display = ('name', 'used_by')
...@@ -70,24 +69,17 @@ class ApplicationFormAdmin(ModelAdmin): ...@@ -70,24 +69,17 @@ class ApplicationFormAdmin(ModelAdmin):
('labbaseform', 'lab'), ('labbaseform', 'lab'),
] ]
def get_queryset(self, request):
qs = super().get_queryset(request)
related = [f'{form}_set__{field}' for form, field in self.related_models]
return qs.prefetch_related(*related)
def _list_related(self, obj, form, field):
return ', '.join(getattr(obj, f'{form}_set').values_list(f'{field}__title', flat=True))
def used_by(self, obj):
rows = list()
for form, field in self.related_models:
related = self._list_related(obj, form, field)
if related:
rows.append(related)
return mark_safe('<br>'.join(rows))
class ApplyAdminGroup(ModelAdminGroup): class ApplyAdminGroup(ModelAdminGroup):
menu_label = 'Apply' menu_label = 'Apply'
menu_icon = 'folder-open-inverse' menu_icon = 'folder-open-inverse'
items = (RoundAdmin, SealedRoundAdmin, FundAdmin, LabAdmin, RFPAdmin, ApplicationFormAdmin, ReviewFormAdmin, CategoryAdmin) items = (
RoundAdmin,
SealedRoundAdmin,
FundAdmin,
LabAdmin,
RFPAdmin,
ApplicationFormAdmin,
ReviewFormAdmin,
CategoryAdmin,
)
from django.utils.html import mark_safe
class ListRelatedMixin:
"""Provides a used_by column which can be found by defining related models in the
following format:
related_models = [
(<related_name>, <field_name>),
]
e.g. This would be object.<related_name>_set.field
"""
def get_queryset(self, request):
qs = super().get_queryset(request)
related = [f'{form}_set__{field}' for form, field in self.related_models]
return qs.prefetch_related(*related)
def _list_related(self, obj, form, field):
return ', '.join(getattr(obj, f'{form}_set').values_list(f'{field}__title', flat=True))
def used_by(self, obj):
rows = list()
for form, field in self.related_models:
related = self._list_related(obj, form, field)
if related:
rows.append(related)
return mark_safe('<br>'.join(rows))
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment