foerderbarometer/input/admin.py

262 lines
8.0 KiB
Python
Raw Normal View History

2020-11-24 12:44:07 +00:00
import csv
2020-09-21 12:27:16 +00:00
from django.contrib import admin
2020-11-24 12:44:07 +00:00
from django.http import HttpResponse
from django.db import models
from django import forms
from django.contrib.admin.helpers import ActionForm
from .forms import BaseProjectForm
from .models import (
Account,
Project,
ProjectCategory,
ProjectRequest,
ProjectDeclined,
WikimediaProject,
HonoraryCertificate,
Library,
ELiterature,
Software,
IFG,
Travel,
Email,
BusinessCard,
List,
Literature,
)
2020-10-06 12:55:46 +00:00
2020-11-24 12:44:07 +00:00
def export_as_csv(self, request, queryset):
meta = self.model._meta
field_names = [field.name for field in meta.fields]
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename={}.csv'.format(meta)
writer = csv.writer(response)
writer.writerow(field_names)
for obj in queryset:
row = writer.writerow([getattr(obj, field) for field in field_names])
return response
export_as_csv.short_description = "Ausgewähltes zu CSV exportieren"
2020-11-24 12:44:07 +00:00
admin.site.add_action(export_as_csv)
@admin.register(ProjectCategory, WikimediaProject)
class ProjectCategoryAdmin(admin.ModelAdmin):
list_display = ['name', 'order', 'project_count']
def get_queryset(self, request):
return super().get_queryset(request).annotate(
project_count=models.Count('projects'),
)
@admin.display(description='# Projekte', ordering='project_count')
def project_count(self, obj):
return obj.project_count
class ProjectAdminForm(BaseProjectForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for field, model in self.categories.items():
if self.initial[f'{field}_other']:
self.initial[field] = [*self.initial[field], model.other]
2020-10-06 11:17:28 +00:00
@admin.register(Project)
class ProjectAdmin(admin.ModelAdmin):
form = ProjectAdminForm
search_fields = ('name', 'pid','finance_id', 'realname', 'start', 'end', 'participants_estimated', 'participants_real', 'cost', 'status', 'end_quartal')
list_display = ('name', 'pid','finance_id', 'realname', 'start', 'end', 'participants_estimated', 'participants_real', 'cost', 'status', 'end_quartal')
date_hierarchy = 'end'
readonly_fields = ('end_quartal', 'project_of_year', 'pid', 'finance_id')
fieldsets = [
('Kontakt', {'fields': (
'realname',
'email',
)}),
('Projekt', {'fields': (
'name',
'description',
'start',
'end',
'otrs',
'plan',
'page',
'urls',
'group',
'location',
'participants_estimated',
'participants_real',
'insurance',
'insurance_technic',
'support',
'cost',
'categories',
'categories_other',
'wikimedia_projects',
'wikimedia_projects_other',
'notes',
)}),
('Mailing', {'fields': (
'mail_state',
'end_mail_send',
'survey_mail_send',
'survey_mail_date',
)}),
('Bewilligung', {'fields': (
'granted',
'granted_date',
'granted_from',
'intern_notes',
)}),
('Accounting', {'fields': (
'account',
'status',
*readonly_fields,
)}),
]
class Media:
js = ('dropdown/js/otrs_link.js',)
granted = True
def get_queryset(self, request):
return super().get_queryset(request).filter(granted=self.granted)
@admin.register(ProjectRequest)
class ProjectRequestAdmin(ProjectAdmin):
granted = None
@admin.register(ProjectDeclined)
class ProjectDeclinedAdmin(ProjectAdmin):
granted = False
@admin.register(BusinessCard)
class BusinessCardAdmin(admin.ModelAdmin):
2025-08-19 12:10:15 +00:00
save_as = True
search_fields = ('realname', 'service_id', 'granted', 'granted_date', 'project')
list_display = ('realname', 'service_id', 'granted', 'granted_date', 'project', 'terms_accepted')
list_display_links = ('realname', 'service_id')
# action = ['export_as_csv']
date_hierarchy = 'granted_date'
readonly_fields = ['service_id']
class Media:
js = ('dropdown/js/base.js',)
@admin.register(Literature)
class LiteratureAdmin(admin.ModelAdmin):
save_as = True
search_fields = ('realname', 'service_id', 'granted', 'granted_date')
list_display = ('realname', 'service_id', 'granted', 'granted_date', 'terms_accepted')
list_display_links = ('realname', 'service_id')
date_hierarchy = 'granted_date'
readonly_fields = ['service_id']
@admin.register(Account)
class AccountAdmin(admin.ModelAdmin):
save_as = True
@admin.register(HonoraryCertificate)
class HonoraryCertificateAdmin(admin.ModelAdmin):
save_as = True
search_fields = ['realname', 'granted', 'project__name', 'project__pid']
2023-02-27 17:09:29 +00:00
list_display = ('realname', 'granted','project')
date_hierarchy = 'granted_date'
autocomplete_fields = ['project']
class Media:
js = ('dropdown/js/otrs_link.js',)
@admin.register(Library, ELiterature, Software)
class LibraryAdmin(admin.ModelAdmin):
save_as = True
search_fields = ('realname', 'service_id', 'granted', 'granted_date')
list_display = ('realname', 'service_id', 'granted', 'granted_date')
list_display_links = ('realname', 'service_id')
date_hierarchy = 'granted_date'
readonly_fields = ['service_id']
exclude = ['type']
def get_queryset(self, request):
return super().get_queryset(request).filter(type=self.model.TYPE)
def formfield_for_dbfield(self, db_field, request, **kwargs):
if db_field.name == 'library':
kwargs['label'] = self.model.LIBRARY_LABEL
kwargs['help_text'] = self.model.LIBRARY_HELP_TEXT
elif db_field.name == 'duration':
kwargs['help_text'] = self.model.DURATION_HELP_TEXT
return super().formfield_for_dbfield(db_field, request, **kwargs)
@admin.register(IFG)
class IFGAdmin(admin.ModelAdmin):
save_as = True
search_fields = ('realname', 'service_id', 'granted', 'granted_date')
list_display = ('realname', 'service_id', 'granted', 'granted_date')
list_display_links = ('realname', 'service_id')
date_hierarchy = 'granted_date'
readonly_fields = ['service_id']
@admin.register(Travel)
class TravelAdmin(admin.ModelAdmin):
save_as = True
search_fields = ['realname', 'service_id', 'granted_date', 'project__name', 'project__pid']
list_display = ('realname', 'service_id', 'granted', 'granted_date', 'project_end', 'project', 'project_end_quartal')
list_display_links = ('realname', 'project')
date_hierarchy = 'project_end'
autocomplete_fields = ['project']
2025-08-19 12:10:36 +00:00
readonly_fields = ['service_id', 'project_end', 'project_end_quartal']
class Media:
js = ('dropdown/js/otrs_link.js',)
@admin.register(Email)
class EmailAdmin(admin.ModelAdmin):
save_as = True
search_fields = ('realname', 'service_id', 'granted', 'granted_date')
list_display = ('realname', 'service_id', 'granted', 'granted_date', 'terms_accepted')
list_display_links = ('realname', 'service_id')
date_hierarchy = 'granted_date'
radio_fields = {'adult': admin.VERTICAL}
readonly_fields = ['service_id']
2023-02-27 17:09:29 +00:00
class Media:
js = ('dropdown/js/base.js',)
2020-10-06 11:17:28 +00:00
@admin.register(List)
class ListAdmin(admin.ModelAdmin):
save_as = True
search_fields = ('realname', 'service_id', 'granted', 'granted_date')
list_display = ('realname', 'service_id', 'granted', 'granted_date', 'terms_accepted')
list_display_links = ('realname', 'service_id')
date_hierarchy = 'granted_date'
readonly_fields = ['service_id']
class ApproveActionForm(ActionForm):
"""
Extra control rendered next to the bulk actions dropdown.
Admin must choose an Account (Kostenstelle) when approving requests.
"""
account_code = forms.ModelChoiceField(queryset=Account.objects.all(), required=True,
label='Kostenstelle (Account)')