Plain is headed towards 1.0! Subscribe for development updates →

 1from enum import Enum
 2
 3from plain.http import HttpRequest
 4from plain.staff.dates import DatetimeRange, DatetimeRangeAliases
 5from plain.templates import Template
 6from plain.utils.text import slugify
 7from plain.views import View
 8
 9
10class Card:
11    class Sizes(Enum):
12        # Four column grid
13        SMALL = 1
14        MEDIUM = 2
15        LARGE = 3
16        FULL = 4
17
18    template_name = "staff/cards/card.html"
19    size: Sizes = Sizes.SMALL
20    # unique_id: str  # Use for tying to dashboards, require it
21
22    # Required fields
23    title: str
24
25    # Optional fields
26    slug: str = ""
27    description: str = ""
28    text: str = ""
29    link: str = ""
30    number: int | None = None
31
32    # All cards can utilize a date range
33    # which by default is the range of the page it's on
34    fixed_datetime_range: DatetimeRangeAliases | DatetimeRange | None = None
35
36    # These will be accessible at render time
37    view: View
38    request: HttpRequest
39    datetime_range: DatetimeRange
40
41    def render(self, view, request, datetime_range):
42        self.view = view
43        self.request = request
44
45        if self.fixed_datetime_range:
46            self.datetime_range = DatetimeRangeAliases.to_range(
47                self.fixed_datetime_range
48            )
49            # If fixed, show that on the card too (I guess you could use description for this)
50        else:
51            self.datetime_range = datetime_range
52        return Template(self.template_name).render(self.get_template_context())
53
54    @classmethod
55    def view_name(cls) -> str:
56        return f"card_{cls.get_slug()}"
57
58    def get_template_context(self):
59        context = {}
60        context["title"] = self.get_title()
61        context["slug"] = self.get_slug()
62        context["description"] = self.get_description()
63        context["number"] = self.get_number()
64        context["text"] = self.get_text()
65        context["link"] = self.get_link()
66        context["fixed_datetime_range"] = self.fixed_datetime_range
67        return context
68
69    def get_title(self) -> str:
70        return self.title
71
72    def get_slug(self) -> str:
73        return self.slug or slugify(self.title)
74
75    def get_description(self) -> str:
76        return self.description
77
78    def get_number(self) -> int | None:
79        return self.number
80
81    def get_text(self) -> str:
82        return self.text
83
84    def get_link(self) -> str:
85        return self.link