/
nmktth
/
web-development-sem-4
Обзор
Документация
Войти
/
nmktth
/
web-development-sem-4
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
realty/admin.py
202 строки
6 KB
artem
feat: complete Realty frontend, accessibility and lab reports
02 июн 2026, 08:46
02 июн 2026, 08:46
873b76d
Код
Авторство
О чём код?
from django.contrib import admin from django.contrib.auth.admin import UserAdmin as BaseUserAdmin import io import os from django.conf import settings from django.http import FileResponse from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import A4 from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont from .models import ( Advertisement, Chat, Complaint, Favorite, Message, NeighborRequest, User, News, ) # Register your models here. # Функция для генерации PDF def export_to_pdf(modeladmin, request, queryset): font_path = os.path.join( settings.BASE_DIR, 'realty', 'static', 'fonts', 'NotoSans-Regular.ttf') font_name = 'NotoSans' try: pdfmetrics.registerFont(TTFont(font_name, font_path)) except Exception as e: print(f"!!! ОШИБКА: Шрифт не найден по пути {font_path}. Ошибка: {e}") font_name = 'Helvetica' buffer = io.BytesIO() p = canvas.Canvas(buffer, pagesize=A4) p.setFont(font_name, 12) p.drawString(50, 800, "ОТЧЕТ ПО ОБЪЯВЛЕНИЯМ (PDF)") p.setFont(font_name, 12) y = 750 for obj in queryset: line = f"ID: { obj.id} | Price: { obj.price} | City: { obj.city} | Title: { obj.title[ :30]}..." p.drawString(50, y, line) y -= 25 if y < 50: p.showPage() p.setFont(font_name, 12) y = 800 p.showPage() p.save() buffer.seek(0) return FileResponse( buffer, as_attachment=True, filename='realty_report.pdf') export_to_pdf.short_description = "Сгенерировать PDF-отчет" class MessageInline(admin.TabularInline): model = Message extra = 0 raw_id_fields = ('sender',) @admin.register(User) class UserAdmin(BaseUserAdmin): list_display = ( 'get_full_name_custom', 'email', 'role', 'is_active', 'date_joined') list_filter = ('role', 'is_active', 'groups') search_fields = ('last_name', 'first_name', 'email') date_hierarchy = 'date_joined' filter_horizontal = ('groups', 'user_permissions') readonly_fields = ('date_joined', 'last_login') @admin.display(description="Полное имя", ordering='last_name') def get_full_name_custom(self, obj): full_name = f"{obj.last_name} {obj.first_name} {obj.middle_name}" return full_name.strip() if full_name.strip() else "Не указано" fieldsets = ( ("Учетные данные", { 'fields': ('username', 'password', 'email') }), ("Личная информация", { 'fields': ( 'last_name', 'first_name', 'middle_name', 'about' ) }), ("Права и роли", { 'fields': ( 'role', 'is_active', 'is_staff', 'is_superuser', 'groups' ) }), ("Даты", { 'fields': ('date_joined', 'last_login') }), ) @admin.register(Advertisement) class AdvertisementAdmin(admin.ModelAdmin): list_display = ('title', 'user_email', 'price', 'city', 'is_active', 'views_count_styled') list_filter = ('type', 'deal_type', 'city', 'is_active') search_fields = ('title', 'description', 'user__email', 'city') raw_id_fields = ('user',) date_hierarchy = 'created_at' list_display_links = ('title',) readonly_fields = ('views_count',) actions = [export_to_pdf] @admin.display(description="Автор (Email)", ordering='user__email') def user_email(self, obj): return obj.user.email @admin.display(description="Популярность") def views_count_styled(self, obj): return f"🔥 { obj.views_count}" if obj.views_count > 100 else obj.views_count @admin.register(Chat) class ChatAdmin(admin.ModelAdmin): list_display = ('id', 'user_1', 'user_2', 'advertisement', 'created_at') raw_id_fields = ('user_1', 'user_2', 'advertisement') search_fields = ('user_1__email', 'user_2__email', 'advertisement__title') inlines = [MessageInline] @admin.register(Message) class MessageAdmin(admin.ModelAdmin): list_display = ('sender', 'get_chat_info', 'is_read', 'sent_at') list_filter = ('is_read', 'sent_at') raw_id_fields = ('chat', 'sender') search_fields = ('text', 'sender__email') @admin.display(description="Информация о чате") def get_chat_info(self, obj): return f"Чат #{ obj.chat.id} (Объявление: { obj.chat.advertisement.title})" @admin.register(NeighborRequest) class NeighborRequestAdmin(admin.ModelAdmin): list_display = ('user', 'city', 'looking_for_apartment', 'is_active') list_filter = ('city', 'looking_for_apartment', 'is_active') raw_id_fields = ('user',) search_fields = ('user__email', 'description') @admin.register(Complaint) class ComplaintAdmin(admin.ModelAdmin): list_display = ('complainant', 'content_type', 'content_id', 'status', 'created_at') list_filter = ('status', 'content_type') raw_id_fields = ('complainant',) search_fields = ('reason', 'complainant__email') list_editable = ('status',) @admin.register(Favorite) class FavoriteAdmin(admin.ModelAdmin): list_display = ('user', 'advertisement', 'created_at') raw_id_fields = ('user', 'advertisement') search_fields = ('user__email', 'advertisement__title') @admin.register(News) class NewsAdmin(admin.ModelAdmin): list_display = ('title', 'created_at') search_fields = ('title', 'content')