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 order.models import OrderModel
from ticket.models import Ticket
from account.models import SecurityBreachAttemptModel
import json
def dashboard_callback(request, context):
pending_count = OrderModel.objects.filter(status='ADMIN_PENDING').count()
open_tickets_count = Ticket.objects.filter(status__in=['open', 'in_progress']).count()
context.update(random_data())
context.update({'pending_count': pending_count})
context.update({'open_tickets_count': open_tickets_count})
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, -positive[i -1][1]] 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, -performance_positive[i - 1][1]] for i in range(1, 28)]
response = {
"navigation": [
{"title": _("Dashboard"), "link": "/", "active": True},
{"title": _("Products"), "link": "/admin/product/productmodel/"},
{"title": _("Orders"), "link": "/admin/order/ordermodel/"},
],
"kpi": [
{
"title": "IPhone 16 Pro Max",
"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": "Macbook Pro M3",
"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": "Apple Watch 8",
"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": "📱 Phone and Mobile",
"description": "$2,499.99",
"value": 20,
},
{
"title": "⌚ Watch and Smart Watch",
"description": "$1,799.49",
"value": 60,
},
{
"title": "💻 Laptop and Mac Book",
"description": "$3,499.99",
"value": 85,
},
{
"title": "📹 Camera and Video Recorder",
"description": "$2,299.99",
"value": 50,
},
{
"title": "📷 Camera and Picture Capture",
"description": "$1,799.00",
"value": 10,
},
{
"title": "📚 Course Sales and Learning",
"description": "$1,299.49",
"value": 20,
},
{
"title": "📈 Ads Revenue and Marketing",
"description": "$3,199.99",
"value": 90,
},
{
"title": "📊 Customer Retention and Engagement",
"description": "$1,649.00",
"value": 80,
},
{
"title": "📣 Marketing ROI and Campaigns",
"description": "$2,199.75",
"value": 45,
},
{
"title": "🤝 Affiliate Partnerships and Collaborations",
"description": "$2,899.95",
"value": 78,
},
],
"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)",
},
],
}
),
},
],
}
return response
# views.py
from django.contrib.auth.views import LoginView
from django.contrib.admin.sites import site as admin_site
from django.contrib import messages
from django.shortcuts import redirect
from django.views.generic import RedirectView, TemplateView
from unfold.views import UnfoldModelAdminViewMixin
from django.views import View
from django.shortcuts import render, redirect, get_object_or_404
# class FakeAdminLoginView(View):
# template_name = "admin/fake_login.html"
# def get_context_data(self, **kwargs):
# context = super().get_context_data(**kwargs)
# context.update({
# **admin_site.each_context(self.request),
# "title": "Log in",
# "site_header": admin_site.site_header,
# "form": self.get_form(),
# })
# return context
# def post(self):
# # Log the honeypot attempt
# username = form.cleaned_data.get("username")
# ip = self.request.META.get("REMOTE_ADDR")
# print(f"Honeypot triggered! IP: {ip}, Username: {username}")
# # Add error message and redirect back to fake login
# messages.error(self.request, "Please enter a correct شماره تماس and password. Note that both fields may be case-sensitive.")
# return redirect('/admin')
from django.views import View
from django.contrib import messages
from django.shortcuts import render, redirect
from django.contrib.admin.sites import site as admin_site
class FakeAdminLoginView(View):
def get_unfold_context(self, request):
"""Replicates Unfold's template context"""
return {
"site_title": admin_site.site_title,
"site_header": admin_site.site_header,
"unfold": {
"title": admin_site.site_title,
"navigation": [],
"theme": "light", # Match your Unfold config
"color_scheme": "light", # Match your Unfold config
}
}
def get_context(self, request):
"""Combine Unfold context with default admin context"""
context = admin_site.each_context(request)
context.update(self.get_unfold_context(request))
return context
def get(self, request):
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
ip = x_forwarded_for.split(',')[0]
else:
ip = request.META.get("REMOTE_ADDR")
hacker, created = SecurityBreachAttemptModel.objects.get_or_create(ip=ip)
return render(request, 'admin/fake_login.html', self.get_context(request))
def post(self, request):
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
ip = x_forwarded_for.split(',')[0]
else:
ip = request.META.get("REMOTE_ADDR")
hacker, created = SecurityBreachAttemptModel.objects.get_or_create(ip=ip)
hacker.trys += 1
hacker.save()
messages.error(request, "Please correct the error below.")
messages.error(request, "Please enter the correct شماره تماس and password for a staff account. Note that both fields may be case-sensitive.")
return render(request, 'admin/fake_login.html', self.get_context(request))