from django.contrib import admin from .models import Betrieb, Partei, PresidentCandidate, Question, Angestellter,\ Aufsicht, Betriebsaufsicht, Betriebsabrechnung, Betriebskredit from startpage.models import Banned from django.contrib.admin import helpers from django.shortcuts import render from django.template.defaulttags import register from django.db import models from django import forms from easy_select2 import apply_select2 class ZugeteiltFilter(admin.SimpleListFilter): title = 'Zugeteilt' parameter_name = 'zugeteilt' default_value = ('Alle', None) def lookups(self, request, model_admin): return ( ('Alle', 'Alle'), ('True', 'Zugeteilt'), # ('More', 'Mehrfach zugeteilt'), ('False', 'Nicht zugeteilt'), ) def queryset(self, request, queryset): if self.value() == 'True': print("filter auf true") return queryset.filter(betriebe__gt=0).distinct() elif self.value() == 'False': print("filter auf false") return queryset.filter(betriebe__exact=None).distinct() elif self.value() is None: return queryset elif self.value() == 'All': return queryset def choices(self, cl): for lookup, title in self.lookup_choices: yield { 'selected': self.value() == lookup or (self.value() is None and lookup == self.default_value[0]), 'query_string': cl.get_query_string({ self.parameter_name: lookup, }, []), 'display': title } @register.filter def get_item(dictionary, key): return dictionary.get(key) def ban_ip(modeladmin, request, queryset): for obj in queryset: banned = Banned(ip_address=obj.ip_address, reason="") banned.save() modeladmin.message_user(request, "Ausgewählte Urheber erfolgreich verbannt.") ban_ip.short_description = "Urheber ausgewählter Eintrage verbannen" def create_overview(modeladmin, request, queryset): if request.POST.get('back'): pass else: raummap = {} for b in queryset: if b.raum in raummap: raummap[b.raum]["anzahl"] += 1 raummap[b.raum]["belegung"] += b.raumforderung else: raummap[b.raum] = {"anzahl": 1, "belegung": b.raumforderung} context = {'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, 'betriebe': queryset, 'arbeitnehmer_gesamt': sum([b.arbeitnehmerzahl for b in queryset]), 'raummap': raummap, 'title': "Betriebsübersicht", 'kreditgesamt': sum([b.kredit for b in queryset])} return render(request, 'meingoethopia/betriebe_overview.html', context) create_overview.short_description = "Übersicht erstellen" def sum_umsatz(modeladmin, request, queryset): if request.POST.get('back'): pass else: betriebe = queryset klassen = {} umsatz_gesamt = 0 for b in betriebe: u = sum([a.umsatz for a in b.betriebsabrechnung_set.all()]) umsatz_gesamt += u try: u2 = u / b.angestellte.count() except ZeroDivisionError: u2 = 0 for a in b.angestellte.all(): if a.klasse not in klassen: klassen[a.klasse] = u2 else: klassen[a.klasse] += u2 anteile = {k: round((v / umsatz_gesamt) * 100, 2) for k, v in klassen.items()} context = {'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, 'umsatz_gesamt': umsatz_gesamt, 'klassen': anteile, 'title': "Umsatzübersicht"} return render(request, 'meingoethopia/umsatz_view.html', context) sum_umsatz.short_description = "Umsatzverteilung berechnen" class AufsichtInline(admin.TabularInline): model = Betriebsaufsicht extra = 0 formfield_overrides = { models.ManyToManyField: {'widget': forms.CheckboxSelectMultiple}, models.ForeignKey: {'widget': apply_select2(forms.Select)} } class BetriebsabrechnungInline(admin.TabularInline): model = Betriebsabrechnung extra = 0 formfield_overrides = { models.ManyToManyField: {'widget': forms.CheckboxSelectMultiple}, models.ForeignKey: {'widget': apply_select2(forms.Select)} } template = "meingoethopia/betriebsabrechnung.html" class BetriebskreditInline(admin.TabularInline): model = Betriebskredit extra = 0 formfield_overrides = { models.ManyToManyField: {'widget': forms.CheckboxSelectMultiple}, models.ForeignKey: {'widget': apply_select2(forms.Select)} } # Register your models here. class BetriebAdmin(admin.ModelAdmin): list_display = ('name', 'manager', 'show_aufsichten', 'raum', 'arbeiter_effektiv', 'punkt', 'approved', 'beaufsichtigt') list_filter = ('confirmed', 'approved', 'raum') search_fields = ('name', 'manager', 'raum', 'aufsicht') formfield_overrides = { models.ManyToManyField: {'widget': forms.CheckboxSelectMultiple}, models.ForeignKey: {'widget': apply_select2(forms.Select)} } actions = [ban_ip, create_overview, sum_umsatz] filter_horizontal = ('angestellte',) inlines = [BetriebsabrechnungInline, BetriebskreditInline, AufsichtInline] class ParteiAdmin(admin.ModelAdmin): list_display = ('name', 'abbreviation', 'chef', 'description', 'confirmed', 'approved') list_filter = ('confirmed', 'approved') actions = [ban_ip] class PresidentAdmin(admin.ModelAdmin): list_display = ('name', 'confirmed', 'approved') list_filter = ('confirmed', 'approved') actions = [ban_ip] class QuestionAdmin(admin.ModelAdmin): list_display = ('subject', 'answered') list_filter = ('answered',) actions = [ban_ip] class AngestellterAdmin(admin.ModelAdmin): list_display = ('name', 'klasse', 'is_teacher', 'show_betriebe', 'zugeteilt') list_filter = (ZugeteiltFilter,) search_fields = ('name', 'klasse') class AufsichtAdmin(admin.ModelAdmin): list_display = ('name', 'show_stunden') search_fields = ('name',) formfield_overrides = { models.ManyToManyField: {'widget': forms.CheckboxSelectMultiple}, models.ForeignKey: {'widget': apply_select2(forms.Select)} } admin.site.register(Betrieb, BetriebAdmin) admin.site.register(Partei, ParteiAdmin) admin.site.register(PresidentCandidate, PresidentAdmin) admin.site.register(Question, QuestionAdmin) admin.site.register(Angestellter, AngestellterAdmin) admin.site.register(Aufsicht, AufsichtAdmin)