1fromenumimportEnum 2 3fromplain.httpimportHttpRequest 4fromplain.templatesimportTemplate 5fromplain.viewsimportView 6 7 8classCard: 9classSizes(Enum):10# Four column grid11SMALL=112MEDIUM=213LARGE=314FULL=41516template_name="admin/cards/card.html"17size:Sizes=Sizes.SMALL18# unique_id: str # Use for tying to dashboards, require it1920# Required fields21title:str2223# Optional fields24description:str=""25text:str=""26link:str=""27number:int|None=None28displays:list[str]|Enum|None=None2930# These will be accessible at render time31view:View32request:HttpRequest3334defrender(self,view,request):35self.view=view36self.request=request37returnTemplate(self.template_name).render(self.get_template_context())3839@classmethod40defview_name(cls)->str:41returnf"card_{cls.get_slug()}"4243defget_template_context(self):44context={}4546context["size"]=self.size47context["title"]=self.get_title()48context["slug"]=self.get_slug()49context["description"]=self.get_description()50context["number"]=self.get_number()51context["text"]=self.get_text()52context["link"]=self.get_link()53context["displays"]=self.get_displays()54context["current_display"]=self.get_current_display()5556returncontext5758defget_title(self)->str:59returnself.title6061@classmethod62defget_slug(cls)->str:63returnf"{cls.__module__}.{cls.__name__}".lower().replace(".","_")6465defget_description(self)->str:66returnself.description6768defget_number(self)->int|None:69returnself.number7071defget_text(self)->str:72returnself.text7374defget_link(self)->str:75returnself.link7677defget_current_display(self)->str:78returnself.request.GET.get(f"{self.get_slug()}.display","")7980defget_displays(self)->list[str]|Enum|None:81ifhasattr(self.displays,"copy"):82# Avoid mutating the class attribute83returnself.displays.copy()84else:85returnself.displays