diff --git a/opentech/apply/funds/admin.py b/opentech/apply/funds/admin.py index b21270ac4adadb2e1fd7326794085b34fd73234e..559a76bf512d52c8f94da44f33c9761a8374f645 100644 --- a/opentech/apply/funds/admin.py +++ b/opentech/apply/funds/admin.py @@ -1,9 +1,8 @@ -from django.utils.html import mark_safe - from wagtail.contrib.modeladmin.helpers import PermissionHelper from wagtail.contrib.modeladmin.options import ModelAdmin, ModelAdminGroup from opentech.apply.review.admin import ReviewFormAdmin +from opentech.apply.utils.admin import ListRelatedMixin from .admin_helpers import ( ButtonsWithPreview, FormsFundRoundListFilter, @@ -57,7 +56,7 @@ class NoDeletePermission(PermissionHelper): return False -class ApplicationFormAdmin(ModelAdmin): +class ApplicationFormAdmin(ListRelatedMixin, ModelAdmin): model = ApplicationForm menu_icon = 'form' list_display = ('name', 'used_by') @@ -70,22 +69,17 @@ class ApplicationFormAdmin(ModelAdmin): ('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: - rows.append(self._list_related(obj, form, field)) - return mark_safe('<br>'.join(rows)) - class ApplyAdminGroup(ModelAdminGroup): menu_label = 'Apply' menu_icon = 'folder-open-inverse' - items = (RoundAdmin, SealedRoundAdmin, FundAdmin, LabAdmin, RFPAdmin, ApplicationFormAdmin, ReviewFormAdmin, CategoryAdmin) + items = ( + RoundAdmin, + SealedRoundAdmin, + FundAdmin, + LabAdmin, + RFPAdmin, + ApplicationFormAdmin, + ReviewFormAdmin, + CategoryAdmin, + ) diff --git a/opentech/apply/funds/models/forms.py b/opentech/apply/funds/models/forms.py index 84154539fb4ecafa7a0d54132b65a1233abd47b0..24650f12215d49ded3c8b044f2079786075d877f 100644 --- a/opentech/apply/funds/models/forms.py +++ b/opentech/apply/funds/models/forms.py @@ -69,7 +69,9 @@ class AbstractRelatedReviewForm(Orderable): form = models.ForeignKey('review.ReviewForm', on_delete=models.PROTECT) panels = [ - FieldPanel('form') + FilteredFieldPanel('form', filter_query={ + 'roundbasereviewform__isnull': True, + }) ] @property diff --git a/opentech/apply/review/admin.py b/opentech/apply/review/admin.py index 47f71bd59934029cd1e7061fa593d2c555dee700..8986ee3dfee19e57b00136895c9aebcf49c68e10 100644 --- a/opentech/apply/review/admin.py +++ b/opentech/apply/review/admin.py @@ -4,6 +4,7 @@ from wagtail.contrib.modeladmin.options import ModelAdmin from wagtail.contrib.modeladmin.views import CreateView, InstanceSpecificView from opentech.apply.review.models import ReviewForm +from opentech.apply.utils.admin import ListRelatedMixin from .admin_helpers import ButtonsWithClone @@ -14,12 +15,19 @@ class CloneView(CreateView, InstanceSpecificView): self.instance.pk = None -class ReviewFormAdmin(ModelAdmin): +class ReviewFormAdmin(ListRelatedMixin, ModelAdmin): model = ReviewForm menu_icon = 'form' + list_display = ('name', 'used_by') button_helper_class = ButtonsWithClone clone_view_class = CloneView + related_models = [ + ('applicationbasereviewform', 'application'), + ('roundbasereviewform', 'round'), + ('labbasereviewform', 'lab'), + ] + def get_admin_urls_for_registration(self): urls = super().get_admin_urls_for_registration() diff --git a/opentech/apply/utils/admin.py b/opentech/apply/utils/admin.py new file mode 100644 index 0000000000000000000000000000000000000000..c45eb156efd9a291754a515055ae0e7f2c93fda5 --- /dev/null +++ b/opentech/apply/utils/admin.py @@ -0,0 +1,28 @@ +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))