puchar/app/admin.py

141 lines
4.8 KiB
Python
Raw Normal View History

2021-08-30 02:29:20 +02:00
from django.apps import apps
from django.contrib import admin
2021-12-09 01:26:37 +01:00
from django.shortcuts import HttpResponse
2021-08-30 02:29:20 +02:00
from django.contrib.admin.sites import AlreadyRegistered
from .models import Announcement, Edition, School, Student
from django.db import transaction
2021-12-09 01:26:37 +01:00
from io import BytesIO
import xlsxwriter
2021-08-30 02:29:20 +02:00
class EditionModelAdmin(admin.ModelAdmin):
list_display = ('__str__', 'active')
ordering = ('-active', '-year')
change_form_template = 'admin/edition_buttons.html'
def response_change(self, request, obj):
2021-12-09 01:26:37 +01:00
if '_update-student-scores' in request.POST:
2021-08-30 02:29:20 +02:00
file = obj.scores.open(mode='r')
content = filter(lambda x: x != '', file.read().split('\n'))
file.close()
rows = [x.split(',') for x in content]
with transaction.atomic():
for index, row in enumerate(rows):
if index == 0:
continue
2022-12-05 04:12:09 +01:00
Student.objects.filter(identifier=row[0]).update(
score_first=row[1], score_second=row[2])
2021-08-30 02:29:20 +02:00
2021-12-09 01:26:37 +01:00
if '_update-disable-submissions' in request.POST and obj.active and obj.submissions:
2021-08-30 02:29:20 +02:00
if obj.active is True:
schools = School.objects.all()
with transaction.atomic():
for school in schools:
school.updateTeam()
obj.submissions = False
obj.save()
2021-12-09 01:26:37 +01:00
if '_generate-student-list' in request.POST:
year = obj.year
students = Student.objects.filter(identifier__startswith=year)
2022-12-05 04:12:09 +01:00
schools_set = {int(student.identifier.split('-')
[1]) for student in students}
2021-12-09 01:26:37 +01:00
output = BytesIO()
workbook = xlsxwriter.Workbook(output)
worksheet = workbook.add_worksheet("Lista uczniów")
worksheet.write(0, 0, 'Identyfikator')
worksheet.write(0, 1, 'Wynik - eliminacje')
worksheet.write(0, 2, 'Wynik - finał')
worksheet.write(0, 3, 'Imię')
worksheet.write(0, 4, 'Nazwisko')
worksheet.write(0, 5, 'Klasa')
worksheet.write(0, 6, 'Szkoła - nazwa')
worksheet.write(0, 7, 'Szkoła - miejscowość')
worksheet.write(0, 8, 'Szkoła - adres')
row = 1
for school_id in schools_set:
for student in sorted(Student.objects.filter(identifier__startswith=f'{year}-{school_id}-'), key=lambda x: x.identifier.split('-')[2]):
2022-12-05 04:12:09 +01:00
# Identyfikator
worksheet.write(row, 0, student.identifier)
# Wynik - eliminacje
worksheet.write(row, 1, student.score_first)
# Wynik - finał
worksheet.write(row, 2, student.score_second)
2021-12-09 01:26:37 +01:00
worksheet.write(row, 3, student.name) # Imię
worksheet.write(row, 4, student.surname) # Nazwisko
worksheet.write(row, 5, student.grade) # Klasa
2022-12-05 04:12:09 +01:00
# Szkoła - nazwa
worksheet.write(row, 6, student.school_name)
# Szkoła - miejscowość
worksheet.write(row, 7, student.school_town)
# Szkoła - adres
worksheet.write(row, 8, student.school_address)
2021-12-09 01:26:37 +01:00
row += 1
workbook.close()
xlsx_data = output.getvalue()
response = HttpResponse(content_type='application/vnd.ms-excel')
response['Content-Disposition'] = 'attachment; filename=Uczniowie.xlsx'
response.write(xlsx_data)
return response
2021-08-30 02:29:20 +02:00
2021-12-09 15:08:17 +01:00
return super().response_change(request, obj)
2022-12-05 04:12:09 +01:00
class StudentYearFilter(admin.SimpleListFilter):
title = 'aktualna edycja'
parameter_name = 'aktualna edycja'
def lookups(self, request, model_admin):
return (
('Yes', 'Jedynie aktualna edycja'),
)
def queryset(self, request, queryset):
value = self.value()
year = Edition.current().year
if value == 'Yes':
return queryset.filter(identifier__startswith=str(year))
return queryset
2021-08-30 02:29:20 +02:00
class StudentModelAdmin(admin.ModelAdmin):
list_display = ('identifier', '__str__', 'grade')
search_fields = ('identifier', 'name', 'surname', 'grade')
2022-12-05 04:12:09 +01:00
ordering = ('-identifier',)
list_filter = (StudentYearFilter,)
2021-08-30 02:29:20 +02:00
admin.site.register(Student, StudentModelAdmin)
admin.site.register(Edition, EditionModelAdmin)
app_models = apps.get_app_config('app').get_models()
for model in app_models:
try:
admin.site.register(model)
except AlreadyRegistered:
pass
admin.site.site_header = 'Puchar Dyrektora LO V'
admin.site.site_title = 'Puchar LO V'
admin.site.index_title = 'Panel administracyjny'
admin.site.site_url = '/'
admin.site.enable_nav_sidebar = False