1import datetime
2
3from .base import Card
4
5
6class ChartCard(Card):
7 template_name = "staff/cards/chart.html"
8
9 def get_template_context(self):
10 context = super().get_template_context()
11 context["chart_data"] = self.get_chart_data()
12 return context
13
14 def get_chart_data(self) -> dict:
15 raise NotImplementedError
16
17
18class DailyTrendCard(ChartCard):
19 def get_values(self) -> dict[datetime.date, int]:
20 raise NotImplementedError
21
22 def get_chart_data(self) -> dict:
23 date_labels = [date.strftime("%Y-%m-%d") for date in self.datetime_range]
24 date_values = self.get_values()
25 # Convert all to dates
26 # date_values = {
27 # date.date() if isinstance(date, datetime.datetime) else date: value
28 # for date, value in date_values.items()
29 # }
30
31 for date in self.datetime_range:
32 if date not in date_values:
33 date_values[date] = 0
34
35 # Sort the date values
36 data = [date_values[date] for date in sorted(date_values.keys())]
37
38 return {
39 "type": "bar",
40 "data": {
41 "labels": date_labels,
42 "datasets": [
43 {
44 "data": data,
45 }
46 ],
47 },
48 # Hide the label
49 # "options": {"legend": {"display": False}},
50 # Hide the scales
51 "options": {
52 "plugins": {"legend": {"display": False}},
53 "scales": {
54 "x": {
55 "display": False,
56 },
57 "y": {
58 "suggestedMin": 0,
59 },
60 },
61 "maintainAspectRatio": False,
62 "elements": {
63 "bar": {"borderRadius": "3", "backgroundColor": "rgb(28, 25, 23)"}
64 },
65 },
66 }