diff --git a/dreams/features.py b/dreams/features.py
index 0cd85a0..e3145f5 100644
--- a/dreams/features.py
+++ b/dreams/features.py
@@ -1,7 +1,9 @@
-from frontend.classes import NavSection, NavItem
+from frontend.classes import NavSection, NavItem, DashboardSection
from django.urls import reverse_lazy
+# Sidebar navigation items
+
dreams_section = NavSection("Dreams")
dreams_items = {
@@ -13,4 +15,10 @@ dreams_items = {
for _, item in dreams_items.items():
dreams_section.add_item(item)
-NAV_SECTIONS = [dreams_section]
\ No newline at end of file
+NAV_SECTIONS = [dreams_section]
+
+# Dashboard sections
+
+dreams_section = DashboardSection("Dreams", "dreams/dashboard_section.html")
+
+DASHBOARD_SECTIONS = [dreams_section]
\ No newline at end of file
diff --git a/dreams/templates/dreams/dashboard_section.html b/dreams/templates/dreams/dashboard_section.html
new file mode 100644
index 0000000..c46eca7
--- /dev/null
+++ b/dreams/templates/dreams/dashboard_section.html
@@ -0,0 +1,78 @@
+{% load dream_stats %}
+
+
+
+
+
+
+
+
+
Dream count (total)
+
{% total_dreams %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Dreams (weekly)
+
{% weekly_dreams %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Special Dreams (lucid / wet)
+
+
+ {% special_dreams_weekly as weekly %}
+
+ {{ weekly.0 }} / {{ weekly.1 }} (weekly)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Most Common Theme (weekly)
+ {% most_common_theme_weekly as theme %}
+
+ {{ theme.0 }} ({{ theme.1 }})
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/classes.py b/frontend/classes.py
index 5e45322..f5148ad 100644
--- a/frontend/classes.py
+++ b/frontend/classes.py
@@ -1,3 +1,6 @@
+from django.template.loader import render_to_string
+
+
class NavSection:
def __init__(self, name, order=100):
self.name = name
@@ -16,22 +19,37 @@ class NavSection:
self.items.sort(key=lambda x: x.order)
for item in self.items:
- html += """
+ html += (
+ """
-
+
{item.name}
"""
+ )
return html
+
class NavItem:
def __init__(self, name, url, icon="fas fa-fw fa-smile", title=None, order=100):
self.name = name
self.url = url
self.icon = icon
self.title = title or name
- self.order = order
\ No newline at end of file
+ self.order = order
+
+
+class DashboardSection:
+ def __init__(self, name, template, context=None):
+ self.name = name
+ self.template = template
+ self.context = context or {}
+
+ def get_html(self, request):
+ return render_to_string(self.template, self.context, request)
diff --git a/frontend/templates/frontend/dashboard.html b/frontend/templates/frontend/dashboard.html
index 7bd1bcc..759ebca 100644
--- a/frontend/templates/frontend/dashboard.html
+++ b/frontend/templates/frontend/dashboard.html
@@ -1,178 +1,6 @@
{% extends "frontend/base.html" %}
-{% load mood_stats %}
-{% load dream_stats %}
+{% load dashboard %}
{% block "content" %}
- Moods
-
-
-
-
-
-
-
-
-
-
-
Status count (total)
-
{% total_moods %}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Current Streak Length
-
- {% current_streak %} days
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Average mood (weekly)
-
-
- {% average_mood_weekly as mood %} {% closest_mood mood as moodobj %}
-
- {{ moodobj }} ({{ mood|floatformat:2 }})
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Most Common Activity (weekly)
- {% most_common_activity_weekly as activity %}
-
- {{ activity.0 }}({{ activity.1 }})
-
-
-
-
-
-
-
-
-
-
-
-
- Dreams
-
-
-
-
-
-
-
-
-
Dream count (total)
-
{% total_dreams %}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Dreams (weekly)
-
{% weekly_dreams %}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Special Dreams (lucid / wet)
-
-
- {% special_dreams_weekly as weekly %}
-
- {{ weekly.0 }} / {{ weekly.1 }} (weekly)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Most Common Theme (weekly)
- {% most_common_theme_weekly as theme %}
-
- {{ theme.0 }} ({{ theme.1 }})
-
-
-
-
-
-
-
-
-
-
-{% endblock %}
+ {% dashboard as dashboard %}
+ {{ dashboard | safe }}
+{% endblock "content" %}
diff --git a/frontend/templatetags/dashboard.py b/frontend/templatetags/dashboard.py
new file mode 100644
index 0000000..390c13e
--- /dev/null
+++ b/frontend/templatetags/dashboard.py
@@ -0,0 +1,33 @@
+from django import template
+from django.conf import settings
+
+from importlib import import_module
+
+register = template.Library()
+
+
+@register.simple_tag(takes_context=True)
+def dashboard(context):
+ sections = []
+
+ for module in settings.CORE_MODULES + settings.ENABLED_MODULES:
+ try:
+ features = import_module(f"{module}.features")
+ try:
+ sections += features.DASHBOARD_SECTIONS
+ except Exception:
+ pass
+ except Exception:
+ pass
+
+ dashboard_html = ""
+
+ for section in sections:
+ dashboard_html += f"{section.name}
"
+
+ dashboard_html += section.get_html(context["request"])
+
+ if section != sections[-1]:
+ dashboard_html += '
'
+
+ return dashboard_html
diff --git a/mood/features.py b/mood/features.py
index 5261b76..71f193b 100644
--- a/mood/features.py
+++ b/mood/features.py
@@ -1,18 +1,28 @@
-from frontend.classes import NavSection, NavItem
+from frontend.classes import NavSection, NavItem, DashboardSection
from django.urls import reverse_lazy
+# Sidebar navigation items
+
mood_section = NavSection("Mood")
mood_items = {
"mood_status_list": NavItem("Status List", reverse_lazy("mood:status_list")),
"mood_activity_list": NavItem("Activities", reverse_lazy("mood:activity_list")),
"mood_mood_list": NavItem("Moods", reverse_lazy("mood:mood_list")),
- "mood_notification_list": NavItem("Notifications", reverse_lazy("mood:notification_list")),
- "mood_statistics": NavItem("Statistics", reverse_lazy("mood:statistics"))
+ "mood_notification_list": NavItem(
+ "Notifications", reverse_lazy("mood:notification_list")
+ ),
+ "mood_statistics": NavItem("Statistics", reverse_lazy("mood:statistics")),
}
for _, item in mood_items.items():
mood_section.add_item(item)
-NAV_SECTIONS = [mood_section]
\ No newline at end of file
+NAV_SECTIONS = [mood_section]
+
+# Dashboard sections
+
+mood_section = DashboardSection("Moods", "mood/dashboard_section.html")
+
+DASHBOARD_SECTIONS = [mood_section]
diff --git a/mood/templates/mood/dashboard_section.html b/mood/templates/mood/dashboard_section.html
new file mode 100644
index 0000000..d559f9a
--- /dev/null
+++ b/mood/templates/mood/dashboard_section.html
@@ -0,0 +1,94 @@
+{% load mood_stats %}
+
+
+
+
+
+
+
+
+
+
+
+
Status count (total)
+
{% total_moods %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Current Streak Length
+
+ {% current_streak %} days
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Average mood (weekly)
+
+
+ {% average_mood_weekly as mood %} {% closest_mood mood as moodobj %}
+
+ {{ moodobj }} ({{ mood|floatformat:2 }})
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Most Common Activity (weekly)
+ {% most_common_activity_weekly as activity %}
+
+ {{ activity.0 }}({{ activity.1 }})
+
+
+
+
+
+
+
+
+
+