import json import random from functools import lru_cache from django.contrib.humanize.templatetags.humanize import intcomma from django.utils.safestring import mark_safe from django.utils.translation import gettext_lazy as _ from django.views.generic import RedirectView, TemplateView # Import Filer admin classes from filer.admin.fileadmin import FileAdmin from filer.admin.folderadmin import FolderAdmin from filer.admin.imageadmin import ImageAdmin from filer.models import File, Folder, Image def dashboard_callback(request, context): context.update(random_data()) return context import json import random from functools import lru_cache from django.contrib.humanize.templatetags.humanize import intcomma from django.utils.safestring import mark_safe from django.utils.translation import gettext_lazy as _ from django.views.generic import RedirectView, TemplateView from unfold.views import UnfoldModelAdminViewMixin from unfold.sites import UnfoldAdminSite from django import forms from django.conf import settings from unfold.forms import AuthenticationForm class LoginForm(AuthenticationForm): password = forms.CharField(widget=forms.PasswordInput(render_value=True)) def __init__(self, request=None, *args, **kwargs): super().__init__(request, *args, **kwargs) # Change the label of the username field to "Email" self.fields["username"].label = "Email" class FormulaAdminSite(UnfoldAdminSite): login_form = LoginForm project_admin_site = FormulaAdminSite() # # Register Filer models with the admin site # project_admin_site.register(Folder, FolderAdmin) # project_admin_site.register(File, FileAdmin) # project_admin_site.register(Image, ImageAdmin) class HomeView(RedirectView): pattern_name = "admin:index" def variables(request): return {"plausible_domain": settings.PLAUSIBLE_DOMAIN} # class MyClassBasedView(UnfoldModelAdminViewMixin, TemplateView): # title = "Custom Title" # required: custom page header title # # required: tuple of permissions # permission_required = ( # "formula.view_driver", # "formula.add_driver", # "formula.change_driver", # "formula.delete_driver", # ) # template_name = "formula/driver_custom_page.html" def dashboard_callback(request, context): context.update(random_data()) return context @lru_cache def random_data(): WEEKDAYS = [ "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", ] positive = [[1, random.randrange(8, 28)] for i in range(1, 28)] negative = [[-1, -random.randrange(8, 28)] for i in range(1, 28)] average = [r[1] - random.randint(3, 5) for r in positive] performance_positive = [[1, random.randrange(8, 28)] for i in range(1, 28)] performance_negative = [[-1, -random.randrange(8, 28)] for i in range(1, 28)] return { "navigation": [ {"title": _("Dashboard"), "link": "/", "active": True}, {"title": _("Analytics"), "link": "#"}, {"title": _("Settings"), "link": "#"}, ], "filters": [ {"title": _("All"), "link": "#", "active": True}, { "title": _("New"), "link": "#", }, ], "kpi": [ { "title": "Product A Performance", "metric": f"${intcomma(f'{random.uniform(1000, 9999):.02f}')}", "footer": mark_safe( f'+{intcomma(f"{random.uniform(1, 9):.02f}")}% progress from last week' ), "chart": json.dumps( { "labels": [WEEKDAYS[day % 7] for day in range(1, 28)], "datasets": [{"data": average, "borderColor": "#9333ea"}], } ), }, { "title": "Product B Performance", "metric": f"${intcomma(f'{random.uniform(1000, 9999):.02f}')}", "footer": mark_safe( f'+{intcomma(f"{random.uniform(1, 9):.02f}")}% progress from last week' ), }, { "title": "Product C Performance", "metric": f"${intcomma(f'{random.uniform(1000, 9999):.02f}')}", "footer": mark_safe( f'+{intcomma(f"{random.uniform(1, 9):.02f}")}% progress from last week' ), }, ], "progress": [ { "title": "🦆 Social marketing e-book", "description": f"${intcomma(f'{random.uniform(1000, 9999):.02f}')}", "value": random.randint(10, 90), }, { "title": "🦍 Freelancing tasks", "description": f"${intcomma(f'{random.uniform(1000, 9999):.02f}')}", "value": random.randint(10, 90), }, { "title": "🐋 Development coaching", "description": f"${intcomma(f'{random.uniform(1000, 9999):.02f}')}", "value": random.randint(10, 90), }, { "title": "🦑 Product consulting", "description": f"${intcomma(f'{random.uniform(1000, 9999):.02f}')}", "value": random.randint(10, 90), }, { "title": "🐨 Other income", "description": f"${intcomma(f'{random.uniform(1000, 9999):.02f}')}", "value": random.randint(10, 90), }, { "title": "🐶 Course sales", "description": f"${intcomma(f'{random.uniform(1000, 9999):.02f}')}", "value": random.randint(10, 90), }, { "title": "🐻‍❄️ Ads revenue", "description": f"${intcomma(f'{random.uniform(1000, 9999):.02f}')}", "value": random.randint(10, 90), }, { "title": "🦩 Customer Retention Rate", "description": f"${intcomma(f'{random.uniform(1000, 9999):.02f}')}", "value": random.randint(10, 90), }, { "title": "🦊 Marketing ROI", "description": f"${intcomma(f'{random.uniform(1000, 9999):.02f}')}", "value": random.randint(10, 90), }, { "title": "🦁 Affiliate partnerships", "description": f"${intcomma(f'{random.uniform(1000, 9999):.02f}')}", "value": random.randint(10, 90), }, ], "chart": json.dumps( { "labels": [WEEKDAYS[day % 7] for day in range(1, 28)], "datasets": [ { "label": "Example 1", "type": "line", "data": average, "borderColor": "var(--color-primary-500)", }, { "label": "Example 2", "data": positive, "backgroundColor": "var(--color-primary-700)", }, { "label": "Example 3", "data": negative, "backgroundColor": "var(--color-primary-300)", }, ], } ), "performance": [ { "title": _("Last week revenue"), "metric": "$1,234.56", "footer": mark_safe( '+3.14% progress from last week' ), "chart": json.dumps( { "labels": [WEEKDAYS[day % 7] for day in range(1, 28)], "datasets": [ { "data": performance_positive, "borderColor": "var(--color-primary-700)", } ], } ), }, { "title": _("Last week expenses"), "metric": "$1,234.56", "footer": mark_safe( '+3.14% progress from last week' ), "chart": json.dumps( { "labels": [WEEKDAYS[day % 7] for day in range(1, 28)], "datasets": [ { "data": performance_negative, "borderColor": "var(--color-primary-300)", } ], } ), }, ], }