mamweb/seminar/admin.py

319 lines
12 KiB
Python
Raw Permalink Normal View History

2014-11-17 12:05:46 +01:00
# -*- coding: utf-8 -*-
from django.contrib import admin
from django import forms
from django.forms import widgets
import reversion
from solo.admin import SingletonModelAdmin
from ckeditor.widgets import CKEditorWidget
from django.db.models import Count
from django.db import models
2015-05-21 17:44:51 +02:00
from seminar.models import Skola, Resitel, Rocnik, Cislo, Problem, Reseni, PrilohaReseni, Nastaveni, Soustredeni, Soustredeni_Ucastnici
import autocomplete_light
2015-05-21 17:44:51 +02:00
### Globální nastavení
admin.site.register(Nastaveni, SingletonModelAdmin)
2014-11-17 12:05:46 +01:00
2015-03-13 20:08:18 +01:00
2015-05-26 23:49:17 +02:00
### UTILS (pro verbose_name a help_text)
def field_labels(model, fieldname):
f = [i for i in model._meta.fields if i.name == fieldname][0]
return {'label': f.verbose_name.capitalize(), 'help_text': f.help_text, }
2015-05-27 09:20:15 +02:00
def create_modeladmin(modeladmin, model, name = None, verbose_name = None, verbose_name_plural = None):
class Meta:
proxy = True
app_label = model._meta.app_label
Meta.verbose_name = verbose_name
Meta.verbose_name_plural = verbose_name_plural
attrs = {'__module__': '', 'Meta': Meta}
newmodel = type(name, (model,), attrs)
admin.site.register(newmodel, modeladmin)
return modeladmin
2015-05-21 17:44:51 +02:00
### INLINES
2014-11-17 12:05:46 +01:00
2015-05-21 17:44:51 +02:00
class ResitelInline(admin.TabularInline):
model = Resitel
fields = ['jmeno', 'prijmeni', 'skola', 'mesto', 'rok_maturity', ]
readonly_fields = ['jmeno', 'prijmeni', 'skola', 'mesto', 'rok_maturity', ]
extra = 0
2015-05-21 17:44:51 +02:00
def has_add_permission(self, req): return False
2014-11-17 12:05:46 +01:00
2015-05-21 17:44:51 +02:00
class CisloInline(admin.TabularInline):
model = Cislo
fields = ['cislo', 'datum_vydani', 'datum_deadline', 'verejne_db', 'poznamka']
readonly_fields = ['cislo']
extra = 0
formfield_overrides = {
models.TextField: {'widget': forms.TextInput},
}
2015-05-21 17:44:51 +02:00
def has_add_permission(self, req): return False
class PrilohaReseniInline(admin.StackedInline):
model = PrilohaReseni
fields = ['timestamp', 'soubor', 'poznamka']
readonly_fields = ['timestamp']
formfield_overrides = {
models.TextField: {'widget': forms.TextInput},
}
2015-05-21 17:44:51 +02:00
extra = 0
class ReseniKProblemuInline(admin.TabularInline):
form = autocomplete_light.modelform_factory(Reseni, autocomplete_fields=['resitel'], fields=['resitel'])
model = Reseni
fields = ['resitel', 'forma', 'body', 'cislo_body', 'timestamp', 'poznamka']
readonly_fields = ['timestamp']
extra = 0
formfield_overrides = {
models.TextField: {'widget': forms.TextInput},
}
2015-05-21 17:44:51 +02:00
def get_queryset(self, request):
qs = super(ReseniKProblemuInline, self).get_queryset(request)
return qs.select_related('problem', 'cislo_body', 'resitel')
# Potenciální DB HOG (cislo_body se dotazovalo na cisla pri kazdem zobrazeni jejich selectu ...)
def formfield_for_dbfield(self, db_field, **kwargs):
formfield = super(ReseniKProblemuInline, self).formfield_for_dbfield(db_field, **kwargs)
if db_field.name == 'cislo_body':
# dirty trick so queryset is evaluated and cached in .choices
formfield.choices = formfield.choices
return formfield
2015-05-21 17:44:51 +02:00
class ReseniKResiteliInline(admin.TabularInline):
model = Reseni
fields = ['problem', 'forma', 'body', 'cislo_body', 'timestamp', 'poznamka']
readonly_fields = ['timestamp', 'problem']
extra = 0
formfield_overrides = {
models.TextField: {'widget': forms.TextInput},
}
2015-05-21 17:44:51 +02:00
def has_add_permission(self, req): return False
2014-11-17 12:05:46 +01:00
def get_queryset(self, request):
qs = super(ReseniKResiteliInline, self).get_queryset(request)
return qs.select_related('problem', 'cislo_body', 'resitel')
# Potenciální DB HOG (cislo_body se dotazovalo na cisla pri kazdem zobrazeni jejich selectu ...)
def formfield_for_dbfield(self, db_field, **kwargs):
formfield = super(ReseniKResiteliInline, self).formfield_for_dbfield(db_field, **kwargs)
if db_field.name == 'cislo_body':
# dirty trick so queryset is evaluated and cached in .choices
formfield.choices = formfield.choices
return formfield
2015-05-21 17:44:51 +02:00
class Soustredeni_UcastniciInline(admin.TabularInline):
form = autocomplete_light.modelform_factory(Soustredeni_Ucastnici, autocomplete_fields=['resitel'], fields=['resitel'])
model = Soustredeni_Ucastnici
fields = ['resitel', 'poznamka', ]
extra = 0
formfield_overrides = {
models.TextField: {'widget': forms.TextInput},
}
2014-11-17 12:05:46 +01:00
def get_queryset(self, request):
qs = super(Soustredeni_UcastniciInline, self).get_queryset(request)
return qs.select_related('resitel', 'soustredeni')
2014-11-17 12:05:46 +01:00
2015-03-13 20:08:18 +01:00
### Resitel
2015-05-14 16:18:43 +02:00
class ResitelAdmin(reversion.VersionAdmin):
2015-05-17 14:39:57 +02:00
form = autocomplete_light.modelform_factory(Resitel, autocomplete_fields=['skola'], fields=['skola'])
2014-11-17 12:05:46 +01:00
fieldsets = [
(None, {'fields': ['jmeno', 'prijmeni', 'user']}),
(u'Škola', {'fields': ['skola', 'rok_maturity']}),
(u'Seminář', {'fields': ['datum_souhlasu_udaje', 'datum_souhlasu_zasilani', 'datum_prihlaseni', 'zasilat']}),
(u'Osobní údaje', {'fields': ['pohlavi_muz', 'datum_narozeni', 'email', 'telefon']}),
(u'Adresa', {'fields': ['ulice', 'mesto', 'psc', 'stat']}),
]
list_display = ['jmeno', 'prijmeni', 'user', 'pohlavi_muz', 'skola', 'rok_maturity', 'pocet_reseni']
2015-03-13 20:08:18 +01:00
list_filter = ['pohlavi_muz', 'rok_maturity', 'zasilat']
search_fields = ['jmeno', 'prijmeni', 'ulice', 'user', 'mesto', 'email']
2015-05-21 17:44:51 +02:00
inlines = [ReseniKResiteliInline]
2014-11-17 12:05:46 +01:00
def get_queryset(self, request):
qs = super(ResitelAdmin, self).get_queryset(request)
return qs.select_related('skola', 'user').annotate(pocet_reseni=Count('reseni'))
def pocet_reseni(self, obj):
return obj.pocet_reseni
2014-11-17 12:05:46 +01:00
admin.site.register(Resitel, ResitelAdmin)
2015-03-13 20:08:18 +01:00
2015-05-21 17:44:51 +02:00
### Skola
class SkolaAdmin(reversion.VersionAdmin):
fieldsets = [
(None, {'fields': ['nazev', 'kratky_nazev', 'je_zs', 'je_ss']}),
(u'Interní ID', {'fields': ['aesop_id', 'izo'], 'classes': ['collapse']}),
(u'Adresa', {'fields': ['ulice', 'mesto', 'psc', 'stat']}),
(None, {'fields': ['poznamka']}),
]
list_display = ['nazev', 'aesop_id', 'mesto', 'ulice', 'stat', 'je_zs', 'je_ss']
list_filter = ['stat', 'je_zs', 'je_ss']
search_fields = ['nazev', 'mesto', 'ulice']
inlines = [ResitelInline]
admin.site.register(Skola, SkolaAdmin)
2015-03-13 20:08:18 +01:00
### Cislo
2015-05-14 16:18:43 +02:00
class CisloAdmin(reversion.VersionAdmin):
2015-03-13 20:08:18 +01:00
fieldsets = [
2015-05-21 17:44:51 +02:00
(None, {'fields': ['cislo', 'rocnik', 'verejne_db', 'poznamka']}),
2015-03-13 20:08:18 +01:00
(u'Data', {'fields': ['datum_vydani', 'datum_deadline']}),
]
2015-05-14 16:18:43 +02:00
list_display = ['kod', 'rocnik', 'cislo', 'datum_vydani', 'datum_deadline', 'verejne']
2015-03-13 20:08:18 +01:00
list_filter = ['rocnik']
2015-05-14 16:57:12 +02:00
view_on_site = Cislo.verejne_url
def get_queryset(self, request):
qs = super(CisloAdmin, self).get_queryset(request)
return qs.select_related('rocnik')
2015-03-13 20:08:18 +01:00
admin.site.register(Cislo, CisloAdmin)
### Rocnik
2015-05-14 16:18:43 +02:00
class RocnikAdmin(reversion.VersionAdmin):
2015-03-13 20:08:18 +01:00
fieldsets = [
(None, {'fields': ['rocnik', 'prvni_rok']}),
]
2015-05-14 16:18:43 +02:00
list_display = ['rocnik', 'prvni_rok', 'verejne']
2015-03-13 20:08:18 +01:00
inlines = [CisloInline]
2015-05-14 16:57:12 +02:00
view_on_site = Rocnik.verejne_url
2015-03-13 20:08:18 +01:00
admin.site.register(Rocnik, RocnikAdmin)
### PrilohaReseni
2015-05-21 17:44:51 +02:00
# NOTE: Nemá pravděpodobně smysl používat
# class PrilohaReseniAdmin(reversion.VersionAdmin):
# readonly_fields = ['timestamp', 'reseni']
# fieldsets = [
# (None, {'fields': ['reseni', 'soubor', 'timestamp']}),
# (u'Poznámky', {'fields': ['poznamka']}),
# ]
# list_display = ['reseni', 'soubor', 'timestamp']
# list_filter = ['reseni', 'timestamp']
# search_fields = []
#
# admin.site.register(PrilohaReseni, PrilohaReseniAdmin)
2015-03-13 20:08:18 +01:00
### Reseni
2015-05-14 16:18:43 +02:00
class ReseniAdmin(reversion.VersionAdmin):
2015-05-21 17:44:51 +02:00
form = autocomplete_light.modelform_factory(Reseni, autocomplete_fields=['problem', 'resitel'], fields=['problem', 'resitel'])
2015-03-13 20:08:18 +01:00
fieldsets = [
(None, {'fields': ['problem', 'resitel', 'forma', 'body', 'cislo_body', 'timestamp']}),
2015-05-14 16:18:43 +02:00
(u'Poznámky', {'fields': ['poznamka']}),
2015-03-13 20:08:18 +01:00
]
2015-05-17 14:39:57 +02:00
readonly_fields = ['timestamp']
list_display = ['problem', 'resitel', 'forma', 'body', 'timestamp', 'cislo_body']
list_filter = ['body', 'timestamp', 'forma']
2015-03-13 20:08:18 +01:00
search_fields = []
inlines = [PrilohaReseniInline]
def get_queryset(self, request):
qs = super(ReseniAdmin, self).get_queryset(request)
return qs.select_related('resitel', 'problem', 'cislo_body')
2015-03-13 20:08:18 +01:00
admin.site.register(Reseni, ReseniAdmin)
### Problem
from autocomplete_light.contrib.taggit_field import TaggitField, TaggitWidget
2015-05-17 14:39:57 +02:00
#TODO: Autocomplete autor/opravovatel
2015-05-27 09:20:15 +02:00
class ProblemAdminForm(forms.ModelForm):
text_zadani = forms.CharField(widget=CKEditorWidget(), required=False, **field_labels(Problem, 'text_zadani'))
text_reseni = forms.CharField(widget=CKEditorWidget(), required=False, **field_labels(Problem, 'text_reseni'))
text_org = forms.CharField(widget=CKEditorWidget(), required=False, **field_labels(Problem, 'text_org'))
zamereni = TaggitField(widget=TaggitWidget('TagAutocomplete'), required=False)
class Meta:
model = Problem
exclude = []
2015-05-14 16:18:43 +02:00
class ProblemAdmin(reversion.VersionAdmin):
form = ProblemAdminForm
2015-03-13 20:08:18 +01:00
fieldsets = [
(None, {'fields': ['nazev', 'typ', 'stav', 'autor', 'zamereni', 'body', 'timestamp', 'import_dakos_id']}),
2015-05-26 23:37:54 +02:00
(u'Vydání', {'fields': ['cislo_zadani', 'kod', 'cislo_reseni', 'opravovatel',]}),
(None, {'fields': ['text_zadani', 'text_reseni', 'text_org',]}),
2015-03-13 20:08:18 +01:00
]
readonly_fields = ['timestamp', 'import_dakos_id']
2015-05-14 16:57:12 +02:00
list_select_related = True
2015-05-27 09:20:15 +02:00
search_fields = ['nazev', 'text_zadani', 'text_reseni', 'text_org']
2015-05-14 16:57:12 +02:00
view_on_site = Problem.verejne_url
2015-03-13 20:08:18 +01:00
def get_queryset(self, request):
qs = super(ProblemAdmin, self).get_queryset(request)
2015-05-27 09:20:15 +02:00
return qs.select_related('autor', 'opravovatel', 'cislo_zadani', 'cislo_reseni')
def pocet_reseni(self, obj):
return obj.pocet_reseni
2015-05-27 09:20:15 +02:00
class ProblemNavrhAdmin(ProblemAdmin):
list_display = ['nazev', 'typ', 'stav', 'autor', 'timestamp']
list_filter = ['typ', 'stav', 'timestamp']
def get_queryset(self, request):
qs = super(ProblemNavrhAdmin, self).get_queryset(request)
return qs.filter(stav__in=[Problem.STAV_NAVRH, Problem.STAV_SMAZANY])
2015-05-14 16:18:43 +02:00
2015-05-27 09:20:15 +02:00
create_modeladmin(ProblemNavrhAdmin, Problem, 'ProblemNavrh', verbose_name=u'Problém (návrh)', verbose_name_plural=u'Problémy (návrhy)')
class ProblemZadanyAdmin(ProblemAdmin):
list_display = ['nazev', 'typ', 'autor', 'opravovatel', 'kod', 'cislo_zadani', 'pocet_reseni', 'verejne']
list_filter = ['typ', 'cislo_zadani__rocnik']
inlines = [ReseniKProblemuInline]
def get_queryset(self, request):
qs = super(ProblemZadanyAdmin, self).get_queryset(request)
return qs.filter(stav=Problem.STAV_ZADANY).annotate(pocet_reseni=Count('reseni'))
create_modeladmin(ProblemZadanyAdmin, Problem, 'ProblemZadany', verbose_name=u'Problém (zadaný)', verbose_name_plural=u'Problémy (zadané)')
2015-05-14 16:18:43 +02:00
2015-05-27 09:20:15 +02:00
#admin.site.register(Problem, ProblemAdmin)
2015-05-14 16:18:43 +02:00
### Soustredeni
2015-05-26 23:09:37 +02:00
class SoustredeniAdminForm(forms.ModelForm):
text = forms.CharField(widget=CKEditorWidget(), required=False, **field_labels(Soustredeni, 'text'))
2015-05-26 23:09:37 +02:00
class Meta:
model = Soustredeni
exclude = []
2015-05-14 16:18:43 +02:00
class SoustredeniAdmin(reversion.VersionAdmin):
2015-05-26 23:09:37 +02:00
form = SoustredeniAdminForm
2015-05-14 16:18:43 +02:00
fieldsets = [
2015-05-26 23:09:37 +02:00
(None, {'fields': ['rocnik', 'misto', 'verejne_db', 'text']}),
2015-05-14 16:18:43 +02:00
(u'Data', {'fields': ['datum_zacatku', 'datum_konce']}),
]
list_display = ['rocnik', 'misto', 'datum_zacatku', 'verejne']
2015-05-21 17:44:51 +02:00
inlines = [Soustredeni_UcastniciInline]
2015-05-14 16:18:43 +02:00
list_filter = ['rocnik']
2015-05-14 16:57:12 +02:00
view_on_site = Soustredeni.verejne_url
2015-05-14 16:18:43 +02:00
admin.site.register(Soustredeni, SoustredeniAdmin)
2015-05-21 17:44:51 +02:00