From 04dbd17a38a66cbfe6c0c17582e501369493bf6b Mon Sep 17 00:00:00 2001 From: katspaugh <381895+katspaugh@users.noreply.github.com> Date: Fri, 20 Sep 2024 10:32:10 +0200 Subject: [PATCH] Feat(Safe Apps): admin chains with names (#1234) * Feat(Safe Apps): admin chains with names * Types --- src/safe_apps/admin.py | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/safe_apps/admin.py b/src/safe_apps/admin.py index 93222a6c..380d574d 100644 --- a/src/safe_apps/admin.py +++ b/src/safe_apps/admin.py @@ -1,11 +1,32 @@ -from typing import Any +from typing import Any, List +from django import forms from django.contrib import admin from django.db.models import Model, QuerySet +from chains.models import Chain + from .models import Client, Feature, Provider, SafeApp, SocialProfile, Tag +# Custom form for SafeApp to use Chain model in a multi-select field +class SafeAppForm(forms.ModelForm[SafeApp]): + chain_ids = forms.ModelMultipleChoiceField( + queryset=Chain.objects.all(), widget=forms.SelectMultiple, required=True + ) + + class Meta: + model = SafeApp + fields = "__all__" + + def clean_chain_ids(self) -> List[int]: + """ + Override clean_chain_ids to store the selected Chain IDs as a list of integers. + """ + chain_ids = self.cleaned_data["chain_ids"] + return [chain.id for chain in chain_ids] + + class ChainIdFilter(admin.SimpleListFilter): title = "Chains" parameter_name = "chain_ids" @@ -43,6 +64,7 @@ class SocialProfileInline(admin.TabularInline[Model, Model]): @admin.register(SafeApp) class SafeAppAdmin(admin.ModelAdmin[SafeApp]): + form = SafeAppForm # Use the custom form for SafeApp list_display = ("name", "url", "chain_ids", "listed") list_filter = (ChainIdFilter,) search_fields = ("name", "url")