From e025a39a4ab752fcbd588a06b1ad699bff91db76 Mon Sep 17 00:00:00 2001 From: Schlabonski Date: Sat, 14 Jan 2017 17:19:16 +0100 Subject: [PATCH] adapt automated list creation to official DAV style --- .../media/memberlists/memberlist_template.tex | 71 ++++++++++++++++--- jdav_web/members/admin.py | 50 +++++++++---- jdav_web/members/models.py | 16 ++++- 3 files changed, 113 insertions(+), 24 deletions(-) diff --git a/jdav_web/media/memberlists/memberlist_template.tex b/jdav_web/media/memberlists/memberlist_template.tex index e0c629c..67c2456 100644 --- a/jdav_web/media/memberlists/memberlist_template.tex +++ b/jdav_web/media/memberlists/memberlist_template.tex @@ -1,21 +1,76 @@ \documentclass{article} +\usepackage[utf8]{inputenc} \usepackage{booktabs} +\usepackage{amssymb} \usepackage{cmbright} -\usepackage[margin=1in,landscape]{geometry} +\usepackage{graphicx} +\usepackage{textpos} +\usepackage[colorlinks]{hyperref} +\usepackage{float} +\usepackage[margin=1in]{geometry} +\newcommand{\picpos}[4]{ + \begin{textblock*}{#1}(#2, #3) + \includegraphics[width=\textwidth]{#4} + \end{textblock*} +} + +\renewcommand{\arraystretch}{1.5} + +\newcommand{\tickedbox}{ + \makebox[0pt][l]{$\square$}\raisebox{.15ex}{\hspace{0.1em}$\checkmark$} +} +\newcommand{\checkbox}{ + \makebox[0pt][l]{$\square$} +} \begin{document} -\noindent -{\LARGE\textsc{MEMBERLIST-TITLE}}\\ +% HEADER RIGHT +\picpos{4.5cm}{11.5cm}{0cm}{dav_logo.png} +\begin{textblock*}{5cm}(11.5cm, 2.3cm) + \begin{flushright} + \small + \noindent Deutscher Alpenverein e. V. \\ + Sektion Ludwigsburg\\ + Imbröderstraße 14\\ + 71634 Ludwigsburg\\ + Tel.: 07141 927893\\ + Fax: 07141 924042\\ + info@alpenverein-ludwigsburg.de\\ + \end{flushright} +\end{textblock*} + +% HEADLINE +{\noindent\LARGE\textsc{Teilnehmerliste \\Sektionsveranstaltung}}\\ \textit{Erstellt: MEMBERLIST-DATE}\\ -MEMBERLIST-COMMENTS -\begin{table}[h] - \begin{tabular}{llll} + +% DESCRIPTION TABLE +\begin{table}[H] + \begin{tabular}{ll} + \large Aktivität: & ACTIVITY \\ + \large Gruppe: & GROUP \\ + \large Ziel: & DESTINATION \\ + \large Stützpunkt: & PLACE \\ + \large Zeitraum: & TIME-PERIOD \\ + \large Betreuer: & JUGENDLEITER \\ + \end{tabular} +\end{table} + +\noindent TOUR-TYPE +\begin{table}[H] + \begin{tabular*}{1\linewidth}{@{\extracolsep{\fill}}llll} \toprule - Name & Vorname & Geburtsdatum & Kommentare \\ + \textbf{Name} & \textbf{Anschrift} & \textbf{Telefon} & \textbf{E-Mail} \\ \midrule \input{TABLE-NAME} \bottomrule - \end{tabular} + \end{tabular*} \end{table} + +\vspace{1cm} + +\noindent Bitte die ausgefüllte Teilnehmerliste vor Antritt der Aktivität per E-Mail an +\href{mailto:info@alpenverein-ludwigsburg.de}{info@alpenverein.de} und +\href{mailto:vorstand@alpenverein-ludwigsburg.de}{vorstand@alpenverein-ludwigsburg.de} senden. + \end{document} diff --git a/jdav_web/members/admin.py b/jdav_web/members/admin.py index 0394801..64f1a19 100644 --- a/jdav_web/members/admin.py +++ b/jdav_web/members/admin.py @@ -36,11 +36,12 @@ class MemberListAdminForm(forms.ModelForm): 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') + self.fields['jugendleiter'].queryset = Member.objects.filter(group__name='Jugendleiter') + #self.fields['add_member'].queryset = Member.objects.filter(prename__startswith='F') + class MemberOnListInline(admin.StackedInline): model = MemberOnList @@ -52,9 +53,10 @@ class MemberOnListInline(admin.StackedInline): } class MemberListAdmin(admin.ModelAdmin): + inlines = [MemberOnListInline] form = MemberListAdminForm + list_display = ['__str__', 'date'] actions = ['convert_to_pdf'] - inlines = [MemberOnListInline] def __init__(self, *args, **kwargs): super(MemberListAdmin, self).__init__(*args, **kwargs) @@ -64,10 +66,9 @@ class MemberListAdmin(admin.ModelAdmin): """ for memberlist in queryset: - # build a unique filename + # create 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' @@ -76,9 +77,9 @@ class MemberListAdmin(admin.ModelAdmin): 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) + line = '{0} {1} & {2}, {3} & {4} & {5} \\\\ \n'.format(memberonlist.member.prename, + memberonlist.member.lastname, memberonlist.member.street, + memberonlist.member.town, memberonlist.member.phone_number, memberonlist.member.email) f.write(line) # copy and adapt latex memberlist template @@ -90,13 +91,36 @@ class MemberListAdmin(admin.ModelAdmin): template_content = f.read() # adapt template - template_content = template_content.replace('MEMBERLIST-TITLE', memberlist.name) + template_content = template_content.replace('ACTIVITY', memberlist.name) + groups = ', '.join(g.name for g in memberlist.groups.all()) + template_content = template_content.replace('GROUP', groups) + template_content = template_content.replace('DESTINATION', memberlist.destination) + template_content = template_content.replace('PLACE', memberlist.place) template_content = template_content.replace('MEMBERLIST-DATE', - memberlist.date.strftime('%d.%m.%Y')) - template_content = template_content.replace('MEMBERLIST-COMMENTS', - memberlist.comment) + datetime.today().strftime('%d.%m.%Y')) + time_period = memberlist.date.strftime('%d.%m.%Y') + if memberlist.end != memberlist.date: + time_period += " - " + memberlist.end.strftime('%d.%m.%Y') + template_content = template_content.replace('TIME-PERIOD', time_period) + jugendleiter = ', '.join(j.name for j in memberlist.jugendleiter.all()) + template_content = template_content.replace('JUGENDLEITER', jugendleiter) + + # create tickboxes for tour type + tour_type = '' + for tt in ['Gemeinschaftstour', 'Führungstour', 'Ausbildung']: + print(memberlist.tour_type) + if tt in memberlist.tour_type: + tour_type += '\\tickedbox ' + tt + else: + tour_type += '\\checkbox' + tour_type += '\\enspace ' + tt + + tour_type += '\\qquad \\qquad ' + template_content = template_content.replace('TOUR-TYPE', tour_type) + 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) diff --git a/jdav_web/members/models.py b/jdav_web/members/models.py index 41987eb..9815bae 100644 --- a/jdav_web/members/models.py +++ b/jdav_web/members/models.py @@ -1,9 +1,11 @@ from datetime import datetime import uuid +from django import forms from django.db import models from django.utils.translation import ugettext_lazy as _ from django.utils import timezone +from multiselectfield import MultiSelectField class Group(models.Model): """ @@ -83,10 +85,18 @@ class Member(models.Model): class MemberList(models.Model): """Lets the user create a list of members in pdf format. """ - name = models.CharField(verbose_name='List Name', default='', + name = models.CharField(verbose_name='Activity', default='', max_length=50) + place = models.CharField(verbose_name=_('Place'), default='', max_length=50) + destination = models.CharField(verbose_name=_('Destination (optional)'), default='', max_length=50, blank=True) date = models.DateField(default=datetime.today) - comment = models.TextField(_('Comments'), default='') + end = models.DateField(verbose_name=_('End (optional)'), blank=True, default=datetime.today) + #comment = models.TextField(_('Comments'), default='', blank=True) + groups = models.ManyToManyField(Group) + jugendleiter = models.ManyToManyField(Member) + tour_type_choices = (('Gemeinschaftstour','Gemeinschaftstour'), ('Führungstour', 'Führungstour'), + ('Ausbildung', 'Ausbildung')) + tour_type = MultiSelectField(choices=tour_type_choices, default='', max_choices=1) def __str__(self): """String represenation""" @@ -99,7 +109,7 @@ class MemberOnList(models.Model): """ member = models.ForeignKey(Member) memberlist = models.ForeignKey(MemberList) - comments = models.TextField(_('Comment'), default='') + comments = models.TextField(_('Comment'), default='', blank=True) class Klettertreff(models.Model):