Merge pull request #36 from Schlabonski/member_lists

adapt automated list creation to official DAV style
v1-0-stable
Schlabonski 9 years ago committed by GitHub
commit ae4f6aee04

@ -1,21 +1,76 @@
\documentclass{article} \documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{booktabs} \usepackage{booktabs}
\usepackage{amssymb}
\usepackage{cmbright} \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} \begin{document}
\noindent % HEADER RIGHT
{\LARGE\textsc{MEMBERLIST-TITLE}}\\ \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}\\ \textit{Erstellt: MEMBERLIST-DATE}\\
MEMBERLIST-COMMENTS
\begin{table}[h] % DESCRIPTION TABLE
\begin{tabular}{llll} \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 \toprule
Name & Vorname & Geburtsdatum & Kommentare \\ \textbf{Name} & \textbf{Anschrift} & \textbf{Telefon} & \textbf{E-Mail} \\
\midrule \midrule
\input{TABLE-NAME} \input{TABLE-NAME}
\bottomrule \bottomrule
\end{tabular} \end{tabular*}
\end{table} \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} \end{document}

@ -38,11 +38,12 @@ class MemberListAdminForm(forms.ModelForm):
model = MemberList model = MemberList
exclude = ['add_member'] exclude = ['add_member']
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(MemberListAdminForm, self).__init__(*args, **kwargs) super(MemberListAdminForm, self).__init__(*args, **kwargs)
if self.instance.pk: self.fields['jugendleiter'].queryset = Member.objects.filter(group__name='Jugendleiter')
pass #self.fields['add_member'].queryset = Member.objects.filter(prename__startswith='F')
#self.fields['add_member'].queryset = Member.objects.filter(prename__startswith='F')
class MemberOnListInline(admin.StackedInline): class MemberOnListInline(admin.StackedInline):
model = MemberOnList model = MemberOnList
@ -54,9 +55,10 @@ class MemberOnListInline(admin.StackedInline):
} }
class MemberListAdmin(admin.ModelAdmin): class MemberListAdmin(admin.ModelAdmin):
inlines = [MemberOnListInline]
form = MemberListAdminForm form = MemberListAdminForm
list_display = ['__str__', 'date']
actions = ['convert_to_pdf'] actions = ['convert_to_pdf']
inlines = [MemberOnListInline]
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(MemberListAdmin, self).__init__(*args, **kwargs) super(MemberListAdmin, self).__init__(*args, **kwargs)
@ -66,10 +68,9 @@ class MemberListAdmin(admin.ModelAdmin):
""" """
for memberlist in queryset: for memberlist in queryset:
# build a unique filename # create a unique filename
filename = memberlist.name + "_" + datetime.today().strftime("%d_%m_%Y") filename = memberlist.name + "_" + datetime.today().strftime("%d_%m_%Y")
filename = filename.replace(' ', '_') filename = filename.replace(' ', '_')
filename_table = 'table_' + filename filename_table = 'table_' + filename
filename_tex = filename + '.tex' filename_tex = filename + '.tex'
filename_pdf = filename + '.pdf' filename_pdf = filename + '.pdf'
@ -78,9 +79,9 @@ class MemberListAdmin(admin.ModelAdmin):
with open('media/memberlists/'+filename_table, 'w+') as f: with open('media/memberlists/'+filename_table, 'w+') as f:
for memberonlist in memberlist.memberonlist_set.all(): for memberonlist in memberlist.memberonlist_set.all():
# write table of members in latex compatible format # write table of members in latex compatible format
line = '{0} & {1} & {2} & {3} \\\\ \n'.format(memberonlist.member.prename, line = '{0} {1} & {2}, {3} & {4} & {5} \\\\ \n'.format(memberonlist.member.prename,
memberonlist.member.lastname, memberonlist.member.lastname, memberonlist.member.street,
memberonlist.member.birth_date.strftime('%d.%m.%Y'), memberonlist.comments) memberonlist.member.town, memberonlist.member.phone_number, memberonlist.member.email)
f.write(line) f.write(line)
# copy and adapt latex memberlist template # copy and adapt latex memberlist template
@ -92,13 +93,36 @@ class MemberListAdmin(admin.ModelAdmin):
template_content = f.read() template_content = f.read()
# adapt template # 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', template_content = template_content.replace('MEMBERLIST-DATE',
memberlist.date.strftime('%d.%m.%Y')) datetime.today().strftime('%d.%m.%Y'))
template_content = template_content.replace('MEMBERLIST-COMMENTS', time_period = memberlist.date.strftime('%d.%m.%Y')
memberlist.comment) 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', template_content = template_content.replace('TABLE-NAME',
filename_table) filename_table)
# write adapted template to file # write adapted template to file
with open('media/memberlists/' + filename_tex, 'w') as f: with open('media/memberlists/' + filename_tex, 'w') as f:
f.write(template_content) f.write(template_content)

@ -1,9 +1,11 @@
from datetime import datetime from datetime import datetime
import uuid import uuid
from django import forms
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.utils import timezone from django.utils import timezone
from multiselectfield import MultiSelectField
class Group(models.Model): class Group(models.Model):
""" """
@ -83,10 +85,20 @@ class Member(models.Model):
class MemberList(models.Model): class MemberList(models.Model):
"""Lets the user create a list of members in pdf format. """ """Lets the user create a list of members in pdf format. """
name = models.CharField(verbose_name=_('Listname'), default='',
name = models.CharField(verbose_name='Activity', default='',
max_length=50) max_length=50)
date = models.DateField(default=datetime.today, verbose_name=_('date')) place = models.CharField(verbose_name=_('Place'), default='', max_length=50)
comment = models.TextField(_('Comments'), default='') destination = models.CharField(verbose_name=_('Destination (optional)'), default='', max_length=50, blank=True)
date = models.DateField(default=datetime.today)
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): def __str__(self):
"""String represenation""" """String represenation"""
@ -103,7 +115,7 @@ class MemberOnList(models.Model):
""" """
member = models.ForeignKey(Member, verbose_name=_('Member')) member = models.ForeignKey(Member, verbose_name=_('Member'))
memberlist = models.ForeignKey(MemberList) memberlist = models.ForeignKey(MemberList)
comments = models.TextField(_('Comment'), default='') comments = models.TextField(_('Comment'), default='', blank=True)
class Meta: class Meta:
verbose_name = _('Member') verbose_name = _('Member')

Loading…
Cancel
Save