import random
from babel.dates import format_date
from django.http.response import HttpResponse
from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _
from shuup.admin.base import Activity, AdminModule, MenuEntry, Notification, SearchResult
from shuup.admin.dashboard import DashboardMoneyBlock, DashboardNumberBlock, DashboardValueBlock
from shuup.admin.utils.urls import admin_url
from shuup.testing.text_data import random_title
from shuup.utils.http import get_client_ip
from shuup.utils.i18n import get_current_babel_locale
[docs]
class DemoModule(AdminModule):
name = _("Demo")
[docs]
def get_urls(self):
return [
admin_url("test/$", lambda request: HttpResponse(f"herrrp {request}")),
]
[docs]
def check_demo_optin(self, request):
"""
Check whether or not the user has opted in to see demo content.
This may be toggled with ?demo=0 or ?demo=1, and it's a persistent
session flag.
:param request: HTTP request
:type request: django.http.HttpRequest
:return: Opt-in flag
:rtype: bool
"""
demo = request.GET.get("demo")
if demo is not None:
request.session["demo"] = bool(int(demo))
return bool(request.session.get("demo"))
[docs]
def get_search_results(self, request, query):
if not self.check_demo_optin(request):
return
for word in query.split():
if word:
yield SearchResult(word, url=f"https://google.com/?q={word}")
yield SearchResult(word[::-1], url=f"https://google.com/?q={word[::-1]}")
yield SearchResult(
f"Create test: {query}",
url="http://about:blank",
icon="fa fa-plus",
is_action=True,
)
[docs]
def get_notifications(self, request):
if not self.check_demo_optin(request):
return
yield Notification(text=f"Your IP is {get_client_ip(request)}")
yield Notification(
title="Dice",
text=f"Your lucky number is {random.randint(1, 43)}",
kind="success",
)
yield Notification(title="Stock Alert", text="Items X, Y, Z are running low", kind="warning")
yield Notification(
title="Outstanding Orders",
text="10 orders have not been touched in 7 days",
kind="danger",
)
[docs]
def get_dashboard_blocks(self, request):
if not self.check_demo_optin(request):
return
locale = get_current_babel_locale()
n = now()
weekday = format_date(n, "EEEE", locale=locale)
today = format_date(n, locale=locale)
yield DashboardValueBlock(
id="test-x",
color="blue",
title=f"Happy {weekday}!",
value=today,
icon="fa fa-calendar",
)
yield DashboardNumberBlock(
id="test-x",
color="red",
title="Visitors Yesterday",
value=random.randint(2200, 10000),
icon="fa fa-globe",
)
yield DashboardNumberBlock(
id="test-x",
color="gray",
title="Registered Users",
value=1240,
icon="fa fa-user",
)
yield DashboardNumberBlock(id="test-x", color="orange", title="Orders", value=32, icon="fa fa-inbox")
yield DashboardMoneyBlock(
id="test-x",
color="green",
title="Open Orders Value",
value=32000,
currency="USD",
icon="fa fa-line-chart",
)
yield DashboardNumberBlock(
id="test-x",
color="yellow",
title="Current Visitors",
value=6,
icon="fa fa-users",
)
yield DashboardMoneyBlock(
id="test-x",
color="none",
title="Sales this week",
value=430.30,
currency="USD",
icon="fa fa-dollar",
)
yield DashboardValueBlock(
id="test-1",
value="\u03c0",
title="The most delicious number",
color="purple",
icon="fa fa-smile-o",
)
[docs]
def get_activity(self, request, cutoff):
if not self.check_demo_optin(request):
return
t = now().replace(minute=0, second=0)
yield Activity(t, f"It was {t}")