diff --git a/jdav_web/media/memberlists/memberlist_template.tex b/jdav_web/media/memberlists/memberlist_template.tex new file mode 100644 index 0000000..e0c629c --- /dev/null +++ b/jdav_web/media/memberlists/memberlist_template.tex @@ -0,0 +1,21 @@ +\documentclass{article} + +\usepackage{booktabs} +\usepackage{cmbright} +\usepackage[margin=1in,landscape]{geometry} + +\begin{document} +\noindent +{\LARGE\textsc{MEMBERLIST-TITLE}}\\ +\textit{Erstellt: MEMBERLIST-DATE}\\ +MEMBERLIST-COMMENTS +\begin{table}[h] + \begin{tabular}{llll} + \toprule + Name & Vorname & Geburtsdatum & Kommentare \\ + \midrule + \input{TABLE-NAME} + \bottomrule + \end{tabular} +\end{table} +\end{document} diff --git a/jdav_web/members/admin.py b/jdav_web/members/admin.py index 078ea1f..0a35d1c 100644 --- a/jdav_web/members/admin.py +++ b/jdav_web/members/admin.py @@ -1,6 +1,19 @@ +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.utils.translation import ugettext_lazy as translate +from django.db.models import TextField +from django.forms import Textarea -from .models import Member, Group +from .models import Member, Group, MemberList, MemberOnList # Register your models here. @@ -14,6 +27,96 @@ 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 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-Disposition'] = 'attachment; filename='+filename_pdf + + return response admin.site.register(Member, MemberAdmin) admin.site.register(Group, GroupAdmin) +admin.site.register(MemberList, MemberListAdmin) diff --git a/jdav_web/members/models.py b/jdav_web/members/models.py index 1dc3516..0dc545a 100644 --- a/jdav_web/members/models.py +++ b/jdav_web/members/models.py @@ -1,3 +1,4 @@ +from datetime import datetime from django.db import models from django.utils.translation import ugettext_lazy as _ @@ -43,3 +44,22 @@ class Member(models.Model): class Meta: verbose_name = _('member') verbose_name_plural = _('members') + +class MemberList(models.Model): + """Lets the user create a list of members in pdf format. """ + name = models.CharField(verbose_name='List Name', default='', max_length=50) + date = models.DateField(default=datetime.today) + comment = models.TextField(_('Comments'), default='') + + def __str__(self): + """String represenation""" + return self.name + + +class MemberOnList(models.Model): + """ + Connects members to a list of members. + """ + member = models.ForeignKey(Member) + memberlist = models.ForeignKey(MemberList) + comments = models.TextField(_('Comment'), default='')