You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kompass/jdav_web/members/admin.py

152 lines
5.5 KiB
Python

from datetime import datetime
import glob
import os
import subprocess
import shutil
import time
from django.http import HttpResponse
from wsgiref.util import FileWrapper
from django import forms
from django.contrib import admin
from django.contrib.admin import DateFieldListFilter
from django.utils.translation import ugettext_lazy as translate
from django.db.models import TextField
from django.forms import Textarea
from .models import (Member, Group, MemberList, MemberOnList, Klettertreff,
KlettertreffAttendee)
# Register your models here.
class MemberAdmin(admin.ModelAdmin):
fields = ['prename', 'lastname', 'email', 'street', 'town', 'phone_number', 'phone_number_parents', 'birth_date', 'group',
'gets_newsletter', 'comments']
list_display = ('name', 'street', 'town', 'phone_number', 'phone_number_parents', 'birth_date', 'gets_newsletter', 'comments')
list_filter = ('group', 'gets_newsletter')
class GroupAdmin(admin.ModelAdmin):
fields = ['name', 'min_age']
list_display = ('name', 'min_age')
class MemberListAdminForm(forms.ModelForm):
class Meta:
model = MemberList
exclude = ['add_member']
def __init__(self, *args, **kwargs):
super(MemberListAdminForm, self).__init__(*args, **kwargs)
if self.instance.pk:
pass
#self.fields['add_member'].queryset = Member.objects.filter(prename__startswith='F')
class MemberOnListInline(admin.StackedInline):
model = MemberOnList
extra = 0
formfield_overrides = {
TextField: {'widget': Textarea(
attrs={'rows': 1,
'cols': 40})},
}
class MemberListAdmin(admin.ModelAdmin):
form = MemberListAdminForm
actions = ['convert_to_pdf']
inlines = [MemberOnListInline]
def __init__(self, *args, **kwargs):
super(MemberListAdmin, self).__init__(*args, **kwargs)
def convert_to_pdf(self, request, queryset):
"""Converts a member list to pdf.
"""
for memberlist in queryset:
# build a unique filename
filename = memberlist.name + "_" + datetime.today().strftime("%d_%m_%Y")
filename = filename.replace(' ', '_')
filename_table = 'table_' + filename
filename_tex = filename + '.tex'
filename_pdf = filename + '.pdf'
# open temporary file for table
with open('media/memberlists/'+filename_table, 'w+') as f:
for memberonlist in memberlist.memberonlist_set.all():
# write table of members in latex compatible format
line = '{0} & {1} & {2} & {3} \\\\ \n'.format(memberonlist.member.prename,
memberonlist.member.lastname,
memberonlist.member.birth_date.strftime('%d.%m.%Y'), memberonlist.comments)
f.write(line)
# copy and adapt latex memberlist template
shutil.copy('media/memberlists/memberlist_template.tex',
'media/memberlists/'+filename_tex)
# read in template
with open('media/memberlists/'+filename_tex, 'r') as f:
template_content = f.read()
# adapt template
template_content = template_content.replace('MEMBERLIST-TITLE', memberlist.name)
template_content = template_content.replace('MEMBERLIST-DATE',
memberlist.date.strftime('%d.%m.%Y'))
template_content = template_content.replace('MEMBERLIST-COMMENTS',
memberlist.comment)
template_content = template_content.replace('TABLE-NAME',
filename_table)
# write adapted template to file
with open('media/memberlists/' + filename_tex, 'w') as f:
f.write(template_content)
# compile using pdflatex
oldwd = os.getcwd()
os.chdir('media/memberlists')
subprocess.call(['pdflatex', filename_tex])
time.sleep(1)
# do some cleanup
for f in glob.glob('*.log'):
os.remove(f)
for f in glob.glob('*.aux'):
os.remove(f)
os.remove(filename_tex)
os.remove(filename_table)
os.chdir(oldwd)
# provide the user with the resulting pdf file
with open('media/memberlists/'+filename_pdf, 'rb') as pdf:
response = HttpResponse(FileWrapper(pdf))#, content='application/pdf')
response['Content-Type'] = 'application/pdf'
response['Content-Disposition'] = 'attachment; filename='+filename_pdf
return response
class KlettertreffAdminForm(forms.ModelForm):
class Meta:
model = Klettertreff
exclude = []
def __init__(self, *args, **kwargs):
super(KlettertreffAdminForm, self).__init__(*args, **kwargs)
self.fields['jugendleiter'].queryset = Member.objects.filter(group__name='Jugendleiter')
class KlettertreffAttendeeInline(admin.StackedInline):
model = KlettertreffAttendee
extra = 0
class KlettertreffAdmin(admin.ModelAdmin):
form = KlettertreffAdminForm
exclude = []
inlines = [KlettertreffAttendeeInline]
list_display = ['__str__', 'date', 'get_jugendleiter']
list_filter = [('date', DateFieldListFilter)]
admin.site.register(Member, MemberAdmin)
admin.site.register(Group, GroupAdmin)
admin.site.register(MemberList, MemberListAdmin)
admin.site.register(Klettertreff, KlettertreffAdmin)