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):
print(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())
@@ -213,35 +213,74 @@ from django.contrib import messages
from django.shortcuts import redirect
from django.views.generic import RedirectView, TemplateView
from unfold.views import UnfoldModelAdminViewMixin
class FakeAdminLoginView(LoginView):
template_name = "admin/fake_login.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
print(self.get_form())
context.update({
**admin_site.each_context(self.request),
"title": "Log in",
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,
"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
def form_valid(self, form):
# Log the honeypot attempt
username = form.cleaned_data.get("username")
ip = self.request.META.get("REMOTE_ADDR")
def get(self, request):
# Log empty attempt (optional)
ip = 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}")
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
messages.error(self.request, "Please enter a correct شماره تماس and password. Note that both fields may be case-sensitive.")
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')
# Redirect back to fake login page with context
return render(request, 'admin/fake_login.html', self.get_context(request))
+127 -43
View File
@@ -1,60 +1,144 @@
{% extends "admin/login.html" %}
{% extends 'unfold/layouts/skeleton.html' %}
{% load i18n static %}
{% block content %}
<div class="flex min-h-screen">
<div class="w-full max-w-md mx-auto p-6">
<div class="mb-8 text-center">
{% include "unfold/helpers/logo.html" %}
</div>
{% block extrastyle %}
{{ block.super }}
{{ form.media }}
{% endblock %}
{% if messages %}
<div class="bg-red-50 text-red-600 p-4 rounded-lg mb-4 text-sm"> <!-- Unfold's error class -->
{% for message in messages %}
{{ message }}
{% endfor %}
{% block bodyclass %}{{ block.super }}bg-base-50 login dark:bg-base-900{% endblock %}
{% block usertools %}{% endblock %}
{% 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>
{% endif %}
<form method="post" class="space-y-4">
{% block login_before %}{% endblock %}
<form action="{{ app_path }}" method="post" id="login-form">
{% csrf_token %}
asdfadsf
<!-- Username Input (Matches Unfold's Styling) -->
<div>
<label for="id_username" class="block text-sm font-medium text-gray-700 mb-2">
{% trans "Username" %}
<div class="flex flex-col group mb-6 last:mb-4">
<label for="id_username" class="block text-font-important-light dark:text-font-important-dark font-semibold mb-2">
شماره تماس
<span class="text-red-600">*</span>
</label>
<input
type="text"
name="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
>
<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">
</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>
<input
type="password"
name="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
>
<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">
</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>
</form>
</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>
{% endblock %}