Plain is headed towards 1.0! Subscribe for development updates →

 1from enum import Enum
 2
 3from plain.http import HttpRequest
 4from plain.templates import Template
 5from plain.views import View
 6
 7
 8class Card:
 9    class Sizes(Enum):
10        # Four column grid
11        SMALL = 1
12        MEDIUM = 2
13        LARGE = 3
14        FULL = 4
15
16    template_name = "admin/cards/card.html"
17    size: Sizes = Sizes.SMALL
18    # unique_id: str  # Use for tying to dashboards, require it
19
20    # Required fields
21    title: str
22
23    # Optional fields
24    description: str = ""
25    text: str = ""
26    link: str = ""
27    number: int | None = None
28    displays: list[str] | Enum | None = None
29
30    # These will be accessible at render time
31    view: View
32    request: HttpRequest
33
34    def render(self, view, request):
35        self.view = view
36        self.request = request
37        return Template(self.template_name).render(self.get_template_context())
38
39    @classmethod
40    def view_name(cls) -> str:
41        return f"card_{cls.get_slug()}"
42
43    def get_template_context(self):
44        context = {}
45
46        context["size"] = self.size
47        context["title"] = self.get_title()
48        context["slug"] = self.get_slug()
49        context["description"] = self.get_description()
50        context["number"] = self.get_number()
51        context["text"] = self.get_text()
52        context["link"] = self.get_link()
53        context["displays"] = self.get_displays()
54        context["current_display"] = self.get_current_display()
55
56        return context
57
58    def get_title(self) -> str:
59        return self.title
60
61    @classmethod
62    def get_slug(cls) -> str:
63        return f"{cls.__module__}.{cls.__name__}".lower().replace(".", "_")
64
65    def get_description(self) -> str:
66        return self.description
67
68    def get_number(self) -> int | None:
69        return self.number
70
71    def get_text(self) -> str:
72        return self.text
73
74    def get_link(self) -> str:
75        return self.link
76
77    def get_current_display(self) -> str:
78        return self.request.GET.get(f"{self.get_slug()}.display", "")
79
80    def get_displays(self) -> list[str] | Enum | None:
81        if hasattr(self.displays, "copy"):
82            # Avoid mutating the class attribute
83            return self.displays.copy()
84        else:
85            return self.displays