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