Skip to content

Commit 1aff32e

Browse files
committed
customisable statistics page
1 parent 7c9888a commit 1aff32e

File tree

6 files changed

+105
-13
lines changed

6 files changed

+105
-13
lines changed

application/pay_parking/parking/admin.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@
1212
from pay_parking.change_list import CustomChangeList
1313
from django.urls import reverse
1414
from django.utils.safestring import mark_safe
15+
from pay_parking.admin import CustomModelAdmin
1516

1617

17-
class ParkingAdmin(admin.ModelAdmin):
18+
class ParkingAdmin(CustomModelAdmin):
1819
list_display = (
1920
'parking_zone',
2021
'address',
@@ -47,16 +48,13 @@ def get_readonly_fields(self, request, obj=None):
4748
return ('available_lots', 'payments_link')
4849
else:
4950
return ()
50-
51+
5152
@admin.display(description='Оплаты')
5253
def payments_link(self, parking):
5354
url = reverse("admin:paying_payment_changelist")
5455
url += f'?parking_id={parking.id}'
5556
link = f'<a href="{url}">Ссылка</a>'
5657
return mark_safe(link)
5758

58-
show_facets = admin.ShowFacets.NEVER
59-
list_per_page = 10
60-
6159

6260
admin.site.register(Parking, ParkingAdmin)

application/pay_parking/pay_parking/admin.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
11
from django.contrib import admin
2+
from django.urls import path
3+
from django.shortcuts import render
4+
from django.contrib.admin.views.main import ERROR_FLAG
5+
from django.template.response import SimpleTemplateResponse
6+
from django.contrib.admin.options import IncorrectLookupParameters
7+
from django.http import HttpResponseRedirect
28

39

410
class UserSite(admin.AdminSite):
@@ -9,3 +15,40 @@ def has_permission(self, request):
915

1016

1117
user_site = UserSite('')
18+
19+
20+
class CustomModelAdmin(admin.ModelAdmin):
21+
show_facets = admin.ShowFacets.NEVER
22+
list_per_page = 10
23+
24+
def get_urls(self):
25+
info = self.opts.app_label, self.opts.model_name
26+
new_urls = [
27+
path(
28+
'customisable_statistics/',
29+
self.admin_site.admin_view(self.customisable_statistics),
30+
name="%s_%s_customisable_statistics" % info
31+
),
32+
]
33+
return new_urls + super().get_urls()
34+
35+
def customisable_statistics(self, request):
36+
try:
37+
cl = self.get_changelist_instance(request)
38+
except IncorrectLookupParameters:
39+
if ERROR_FLAG in request.GET:
40+
return SimpleTemplateResponse(
41+
"admin/invalid_setup.html",
42+
{
43+
"title": _("Database error"),
44+
},
45+
)
46+
return HttpResponseRedirect(request.path + "?" + ERROR_FLAG + "=1")
47+
queryset = cl.queryset # уже отфильтрованный
48+
49+
context = dict(
50+
self.admin_site.each_context(request),
51+
cl=cl,
52+
title='Кастомизируемая статистика'
53+
)
54+
return render(request, "admin/customisable_statistics.html", context)

application/pay_parking/paying/admin.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,12 @@
1616
MaxPricePerHourFilter, MinPricePerHourFilter
1717
)
1818
from pay_parking.filters import FakeFilterWithForm
19-
from django.shortcuts import render, get_object_or_404, redirect
19+
from django.shortcuts import get_object_or_404
2020
from .models import User, Parking
21+
from pay_parking.admin import CustomModelAdmin
2122

22-
class PaymentAdmin(admin.ModelAdmin):
23+
24+
class PaymentAdmin(CustomModelAdmin):
2325
# actions = None
2426
form = AdminPaymentForm
2527
list_display = (
@@ -92,8 +94,6 @@ def get_readonly_fields(self, request, obj=None):
9294
else:
9395
return ()
9496

95-
show_facets = admin.ShowFacets.NEVER
96-
list_per_page = 10
9797

9898
def get_changelist(self, request, **kwargs):
9999
change_list_class = CustomChangeList
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{% extends 'admin/change_list_object_tools.html' %}
2+
3+
{% load i18n admin_urls %}
4+
5+
{% block object-tools-items %}
6+
<li>
7+
<a href="{% url cl.opts|admin_urlname:'customisable_statistics' %}" class="viewlink">
8+
Кастомизируемая статистика
9+
</a>
10+
</li>
11+
{{ block.super }}
12+
{% endblock %}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
{% extends 'admin/base_site.html' %}
2+
3+
{% load i18n admin_list static admin_urls %}
4+
5+
{% block extrastyle %}
6+
{{ block.super }}
7+
<link rel="stylesheet" href="{% static 'admin/css/changelists.css' %}" />
8+
{% endblock %}
9+
10+
{% block content %}
11+
<div id="content-main">
12+
<div class="module{% if cl.has_filters %} filtered{% endif %}" id="changelist">
13+
{% block filters %}
14+
{% if cl.has_filters %}
15+
<search id="changelist-filter" aria-labelledby="changelist-filter-header">
16+
<h2 id="changelist-filter-header">{% translate 'Filter' %}</h2>
17+
{% if cl.is_facets_optional or cl.has_active_filters %}
18+
<div id="changelist-filter-extra-actions">
19+
{% if cl.has_active_filters %}
20+
<h3><a href="{{ cl.clear_all_filters_qs }}">&#10006; {% translate 'Clear all filters' %}</a></h3>
21+
{% endif %}
22+
</div>
23+
{% endif %}
24+
{% for spec in cl.filter_specs %}
25+
{% admin_list_filter cl spec %}
26+
{% endfor %}
27+
</search>
28+
{% endif %}
29+
{% endblock %}
30+
</div>
31+
</div>
32+
{% endblock %}
33+
34+
{% block breadcrumbs %}
35+
<div class="breadcrumbs">
36+
<a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
37+
&rsaquo; <a href="{% url 'admin:app_list' app_label=cl.opts.app_label %}">{{ cl.opts.app_config.verbose_name }}</a>
38+
&rsaquo; <a href="{% url cl.opts|admin_urlname:'changelist' %}">{{ cl.opts.verbose_name_plural|capfirst }}</a>
39+
&rsaquo; {{ title|capfirst }}
40+
</div>
41+
{% endblock %}

application/pay_parking/users/admin.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@
1212
MaxUpdatedAtFiler, MinUpdatedAtFiler,
1313
MaxLastLoginFiler, MinLastLoginFiler
1414
)
15+
from pay_parking.admin import CustomModelAdmin
1516

1617

17-
class UserAdmin(admin.ModelAdmin):
18+
class UserAdmin(CustomModelAdmin):
1819
form = CustomUserCreationForm
1920
list_display = (
2021
'email',
@@ -55,9 +56,6 @@ def get_changelist(self, request, **kwargs):
5556
change_list_class.filter_form_class = UserFilterForm
5657
return change_list_class
5758

58-
show_facets = admin.ShowFacets.NEVER
59-
list_per_page = 10
60-
6159

6260
admin.site.register(User, UserAdmin)
6361
# admin.site.unregister(Group)

0 commit comments

Comments
 (0)