Plain is headed towards 1.0! Subscribe for development updates →

 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        }