hoeny pad admin

This commit is contained in:
Parsa Nazer
2025-02-18 22:23:45 +03:30
parent 7617431f2b
commit 4e825711d3
2 changed files with 203 additions and 80 deletions
+67 -28
View File
@@ -16,7 +16,7 @@ import json
def dashboard_callback(request, context): def dashboard_callback(request, context):
print(context)
pending_count = OrderModel.objects.filter(status='ADMIN_PENDING').count() pending_count = OrderModel.objects.filter(status='ADMIN_PENDING').count()
open_tickets_count = Ticket.objects.filter(status__in=['open', 'in_progress']).count() open_tickets_count = Ticket.objects.filter(status__in=['open', 'in_progress']).count()
context.update(random_data()) context.update(random_data())
@@ -213,35 +213,74 @@ from django.contrib import messages
from django.shortcuts import redirect from django.shortcuts import redirect
from django.views.generic import RedirectView, TemplateView from django.views.generic import RedirectView, TemplateView
from unfold.views import UnfoldModelAdminViewMixin from unfold.views import UnfoldModelAdminViewMixin
class FakeAdminLoginView(LoginView): from django.views import View
template_name = "admin/fake_login.html" from django.shortcuts import render, redirect, get_object_or_404
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) # class FakeAdminLoginView(View):
print(self.get_form()) # template_name = "admin/fake_login.html"
context.update({ # def get_context_data(self, **kwargs):
**admin_site.each_context(self.request), # context = super().get_context_data(**kwargs)
"title": "Log in",
# 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, "site_header": admin_site.site_header,
"form": self.get_form(), "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 return context
def form_valid(self, form): def get(self, request):
# Log the honeypot attempt # Log empty attempt (optional)
username = form.cleaned_data.get("username") ip = request.META.get("REMOTE_ADDR")
ip = self.request.META.get("REMOTE_ADDR") print(f"Honeypot page accessed from IP: {ip}")
return render(request, 'admin/fake_login.html', self.get_context(request))
def post(self, request):
username = request.POST.get("username")
password = request.POST.get("password") # Never actually used
ip = request.META.get("REMOTE_ADDR")
print(f"Honeypot triggered! IP: {ip}, Username: {username}") print(f"Honeypot triggered! IP: {ip}, Username: {username}")
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.")
# Add error message and redirect back to fake login # Redirect back to fake login page with context
messages.error(self.request, "Please enter a correct شماره تماس and password. Note that both fields may be case-sensitive.") return render(request, 'admin/fake_login.html', self.get_context(request))
return redirect('/admin')
def form_invalid(self, form):
# 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')
+127 -43
View File
@@ -1,60 +1,144 @@
{% extends "admin/login.html" %} {% extends 'unfold/layouts/skeleton.html' %}
{% load i18n static %} {% load i18n static %}
{% block content %} {% block extrastyle %}
<div class="flex min-h-screen"> {{ block.super }}
<div class="w-full max-w-md mx-auto p-6"> {{ form.media }}
<div class="mb-8 text-center"> {% endblock %}
{% include "unfold/helpers/logo.html" %}
</div>
{% if messages %} {% block bodyclass %}{{ block.super }}bg-base-50 login dark:bg-base-900{% endblock %}
<div class="bg-red-50 text-red-600 p-4 rounded-lg mb-4 text-sm"> <!-- Unfold's error class -->
{% for message in messages %} {% block usertools %}{% endblock %}
{{ message }}
{% endfor %} {% block nav-global %}{% endblock %}
{% block nav-sidebar %}{% endblock %}
{% block content_title %}{% endblock %}
{% block breadcrumbs %}{% endblock %}
{% block title %}
{{ title }} | {{ site_title }}
{% endblock %}
{% block base %}
<div id="page" class="flex min-h-screen">
<div class="flex flex-grow items-center justify-center mx-auto px-4 relative">
<div class="w-full sm:w-96">
<h1 class="font-semibold mb-10">
<span class="block text-font-important-light dark:text-font-important-dark">{% trans 'Welcome back to' %}</span>
<span class="block text-primary-600 text-xl dark:text-primary-500">{{ site_title|default:_('Django site admin') }}</span>
</h1>
{% include "unfold/helpers/messages.html" %}
{% if form.errors or form.non_field_errors %}
<div class="flex flex-col gap-4 mb-8 *:mb-0">
{% include "unfold/helpers/messages/errornote.html" with errors=form.errors %}
{% include "unfold/helpers/messages/error.html" with errors=form.non_field_errors %}
{% if user.is_authenticated %}
{% blocktranslate trimmed asvar message %}
You are authenticated as {{ username }}, but are not authorized to
access this page. Would you like to login to a different account?
{% endblocktranslate %}
{% include "unfold/helpers/messages/error.html" with error=message %}
{% endif %}
</div> </div>
{% endif %} {% endif %}
<form method="post" class="space-y-4"> {% block login_before %}{% endblock %}
<form action="{{ app_path }}" method="post" id="login-form">
{% csrf_token %} {% csrf_token %}
asdfadsf
<!-- Username Input (Matches Unfold's Styling) --> <div class="flex flex-col group mb-6 last:mb-4">
<div> <label for="id_username" class="block text-font-important-light dark:text-font-important-dark font-semibold mb-2">
<label for="id_username" class="block text-sm font-medium text-gray-700 mb-2"> شماره تماس
{% trans "Username" %}
<span class="text-red-600">*</span>
</label> </label>
<input
type="text"
name="username" <input type="text" name="username" autofocus="" autocapitalize="none" autocomplete="username" maxlength="12" class="border border-base-200 bg-white font-medium min-w-20 placeholder-base-400 rounded shadow-sm text-font-default-light text-sm focus:ring focus:ring-primary-300 focus:border-primary-600 focus:outline-none group-[.errors]:border-red-600 group-[.errors]:focus:ring-red-200 dark:bg-base-900 dark:border-base-700 dark:text-font-default-dark dark:focus:border-primary-600 dark:focus:ring-primary-700 dark:focus:ring-opacity-50 dark:group-[.errors]:border-red-500 dark:group-[.errors]:focus:ring-red-600/40 px-3 py-2 w-full" required="" id="id_username">
id="id_username"
class="w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500" <!-- Unfold's input classes -->
required
>
</div> </div>
<!-- Password Input -->
<div>
<label for="id_password" class="block text-sm font-medium text-gray-700 mb-2">
{% trans "Password" %} <div class="flex flex-col group mb-6 last:mb-4">
<label for="id_password" class="block text-font-important-light dark:text-font-important-dark font-semibold mb-2">
Password
<span class="text-red-600">*</span>
</label> </label>
<input
type="password"
name="password" <input type="password" name="password" autocomplete="current-password" class="border border-base-200 bg-white font-medium min-w-20 placeholder-base-400 rounded shadow-sm text-font-default-light text-sm focus:ring focus:ring-primary-300 focus:border-primary-600 focus:outline-none group-[.errors]:border-red-600 group-[.errors]:focus:ring-red-200 dark:bg-base-900 dark:border-base-700 dark:text-font-default-dark dark:focus:border-primary-600 dark:focus:ring-primary-700 dark:focus:ring-opacity-50 dark:group-[.errors]:border-red-500 dark:group-[.errors]:focus:ring-red-600/40 px-3 py-2 w-full" required="" id="id_password">
id="id_password"
class="w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
required
>
</div> </div>
<!-- Submit Button -->
<button
type="submit"
class="w-full bg-blue-600 text-white py-2 px-4 rounded-lg hover:bg-blue-700 focus:ring-2 focus:ring-blue-500" <!-- Unfold's button classes -->
>
{% trans "Log in" %}
<div class="submit-row">
<button type="submit" class="bg-primary-600 border border-transparent flex flex-row font-semibold group items-center justify-center py-2 rounded text-sm text-white w-full">
{% translate 'Log in' %}
<i class="material-symbols-outlined ml-2 relative right-0 text-lg transition-all group-hover:-right-1">arrow_forward</i>
</button> </button>
</form>
</div> </div>
{% if password_reset_url %}
<div class="password-reset-link">
<a href="{{ password_reset_url }}" class="border border-base-200 font-medium hidden mt-4 px-3 py-2 rounded text-center text-sm text-base-500 transition-all w-full hover:bg-base-50 lg:block lg:w-auto dark:border-base-700 dark:text-font-default-dark dark:hover:text-base-200 dark:hover:bg-base-900">
{% translate 'Forgotten your password or username?' %}
</a>
</div>
{% endif %}
</form>
{% block login_after %}{% endblock %}
</div>
<div class="absolute flex flex-row items-center justify-between left-0 m-4 right-0 top-0">
{% if site_url %}
<a href="{{ site_url }}" class="flex font-medium items-center text-sm text-primary-600 dark:text-primary-500">
<span class="material-symbols-outlined mr-2">arrow_back</span> {% trans 'Return to site' %}
</a>
{% endif %}
{% if not theme %}
{% include "unfold/helpers/theme_switch.html" %}
{% endif %}
</div>
</div>
{% if image %}
<div class="bg-cover flex-grow hidden max-w-3xl xl:max-w-4xl xl:block" style="background-image: url('{{ image }}')">
</div>
{% endif %}
</div> </div>
{% endblock %} {% endblock %}