Commit 787a4383 authored by Robert Czechowski's avatar Robert Czechowski

Views aus Apps 'benutzer' und 'mitglieder' in neue Apps 'mitgliederverwaltung'...

Views aus Apps 'benutzer' und 'mitglieder' in neue Apps 'mitgliederverwaltung' und 'mitgliedskonto' überführen
parent b39c5b13
......@@ -49,8 +49,9 @@ Dafür bitte eine neue App erstellen und in INSTALLED_APPS eintragen
python3 manage.py startapp <name>
Bestehende Apps als Referenz sind: `mitglieder`, `benutzer`, `umsaetze`.
Bestehende Apps als Referenz sind:
`benutzer`, `mitglieder`, `mitgliederverwaltung`, `mitgliedskonto`, `profil`, `umsaetze`.
Für alle weiteren Schritte, bitte die Django-Dokumentation zu rate
ziehen: https://docs.djangoproject.com/en/1.11/
ziehen: https://docs.djangoproject.com/en/2.2/
from django.shortcuts import render, get_object_or_404
from django.contrib.auth.decorators import login_required, user_passes_test
from django.http import Http404
import re
from django.shortcuts import render
from .models import BenutzerMitglied
from mitglieder.models import Mitglied
from django.contrib.auth.models import User
from django import forms
from bwinfalumni.settings import DEBUG
# Keine automatisch erzeugte Form, um eigene Prüfung an benutzernamen zu implementieren und
# Djangos automatische "Benutzername existiert schon"-Kontrolle zu umgehen.
class BenutzerForm(forms.Form):
username = forms.CharField(label='Login-Name', max_length=200)
email = forms.EmailField(label='Email-Adresse', max_length=200)
@login_required
def index(request):
benutzer = request.user
errormessage = ""
successmessage = ""
if request.method == 'POST':
form = BenutzerForm(request.POST)
if form.is_valid():
if not re.compile("^\w+$").match(form.cleaned_data['username']):
errormessage = "Der eingegebene Login-Name ist ungültig. (Alphanumerisch + Unterstrich)"
else:
errormessage = "Die eingegebenen Daten sind ungültig. " + form.errors.as_json(escape_html=True)
if errormessage == "" and not benutzer.username == form.cleaned_data['username']:
sameName = User.objects.filter(username__exact=form.cleaned_data['username'])
if len(sameName) > 0:
errormessage = "Dieser Login-Name existiert bereits."
if errormessage == "":
benutzer.username = form.cleaned_data['username']
benutzer.email = form.cleaned_data['email']
benutzer.save()
successmessage = "Daten wurden erfolgreich aktualisiert."
form = BenutzerForm({
'username': benutzer.username,
'email': benutzer.email,
})
try:
mitglied = benutzer.benutzermitglied.mitglied
except:
raise Http404("Keine Benutzerinformationen vorhanden.")
return render(request, 'benutzer/uebersicht.html', {'benutzer': benutzer,
'mitglied': mitglied,
'form': form,
'errormessage': errormessage,
'successmessage': successmessage,
})
@login_required
@user_passes_test(lambda u: u.is_superuser or u.groups.filter(name='vorstand').exists())
def listusers(request):
all_mitglieder = Mitglied.objects.order_by('mitgliedsnummer')
return render(request, 'benutzer/mitgliederliste.html', {'mitglieder': all_mitglieder})
@login_required
def showuser(request, userid):
benutzer = get_object_or_404(User, id__exact = userid)
try:
mitglied = benutzer.benutzermitglied.mitglied
except:
raise Http404("Keine Benutzerinformationen vorhanden.")
return render(request, 'benutzer/anzeige.html', {'benutzer': benutzer,
'mitglied': mitglied,
})
class UserForm(forms.ModelForm):
class Meta:
model = User
fields = ['username', 'email']
class UserInfoForm(forms.ModelForm):
class Meta:
model = BenutzerMitglied
fields = ['mitglied']
@login_required
@user_passes_test(lambda u: u.is_superuser or u.groups.filter(name='vorstand').exists())
def addbenutzer(request, mitgliedsnummer = -1):
if not DEBUG:
raise Http404("Benutzer-Anlegen zur Zeit noch nicht verfügbar.")
if request.method == 'POST':
bform = UserForm(request.POST)
biform = UserInfoForm(request.POST)
errormessage = ""
successmessage = ""
if not bform.is_valid():
errormessage = "Die eingegebenen Daten sind ungültig. " + bform.errors.as_json(escape_html=True)
elif not biform.is_valid():
errormessage = "Die eingegebenen Daten sind ungültig. " + biform.errors.as_json(escape_html=True)
else:
bform.instance.is_staff = True
bform.save()
biform.instance.user = bform.instance
biform.save()
if errormessage == "":
successmessage = "Benutzer wurde erfolgreich hinzugefügt."
return render(request, 'benutzer/adddone.html', {'errormessage': errormessage,
'successmessage': successmessage,})
else: # GET or something
bform = UserForm()
if mitgliedsnummer == -1:
biform = UserInfoForm()
else:
biform = UserInfoForm({'mitglied': get_object_or_404(Mitglied, mitgliedsnummer__exact = mitgliedsnummer)})
return render(request, 'benutzer/addform.html', {'bform': bform,
'biform': biform})
# Create your views here.
......@@ -35,6 +35,8 @@ INSTALLED_APPS = [
'mitglieder.apps.MitgliederConfig',
'benutzer.apps.BenutzerConfig',
'profil.apps.ProfilConfig',
'mitgliederverwaltung.apps.MitgliederverwaltungConfig',
'mitgliedskonto.apps.MitgliedskontoConfig',
'mailinglistenadressen.apps.MailinglistenadressenConfig',
'django.contrib.auth',
'django.contrib.contenttypes',
......
......@@ -37,8 +37,8 @@
<h2>Admin-Bereich</h2>
<p>
<ul>
<li><a href="{% url 'mitglieder:index' %}">Mitgliederübersicht</a></li>
<li><a href="{% url 'benutzer:benutzerliste' %}">Benutzerübersicht</a></li>
<li><a href="{% url 'mitgliedskonto:index' %}">Mitgliederübersicht</a></li>
<li><a href="{% url 'mitgliederverwaltung:benutzerliste' %}">Benutzerübersicht</a></li>
<li><a href="{% url 'umsaetze:index' %}">Umsatzübersicht</a></li>
</ul>
</p>
......
......@@ -19,9 +19,9 @@ from django.contrib.auth import views as auth_views
urlpatterns = [
url(r'^umsaetze/', include('umsaetze.urls', namespace='umsaetze')),
url(r'^mitglieder/', include('mitglieder.urls', namespace='mitglieder')),
url(r'^benutzer/', include('benutzer.urls', namespace='benutzer')),
url(r'^profil/', include('profil.urls', namespace='profil')),
url(r'^verwaltung/', include('mitgliederverwaltung.urls', namespace='mitgliederverwaltung')),
url(r'^konto/', include('mitgliedskonto.urls', namespace='mitgliedskonto')),
url(r'^mailinglistenadressen/', include('mailinglistenadressen.urls', namespace='mailinglistenadressen')),
url(r'^accounts/logout/$', auth_views.LogoutView.as_view(), { 'template_name': 'registration/logout.html',}, name='logout' ),
......
from django.shortcuts import render,get_object_or_404
from django.http import HttpResponse, Http404
from django.template import loader
from django.contrib.auth.decorators import login_required, user_passes_test
from django.shortcuts import render
from django.contrib.auth.models import User
from .models import Mitglied, MitgliedskontoBuchung, MitgliedskontoBuchungstyp
from benutzer.models import BenutzerMitglied
from django.core.mail.backends.smtp import EmailBackend
from datetime import date
from django import forms
from django.shortcuts import redirect
from django.forms import ModelForm
from django.core.mail import send_mail
from bwinfalumni.settings import DEBUG
#from django.core.urlresolvers import reverse
# in neuern django versionen from django.urls import reverse
from django.urls import reverse
@login_required
def index(request):
benutzer = request.user
if not benutzer.is_superuser and not benutzer.groups.filter(name='vorstand').exists():
try:
mitglied = benutzer.benutzermitglied.mitglied
except:
raise Http404("Keine Benutzerinformationen vorhanden.")
return redirect(reverse('mitglieder:detail', kwargs={'mitgliedsnummer':mitglied.mitgliedsnummer}))
all_mitglieder = Mitglied.objects.order_by('mitgliedsnummer')
return render(request, 'mitglieder/mitgliederliste.html', {'mitglieder': all_mitglieder})
class MitgliedskontoBuchungForm(ModelForm):
class Meta:
model = MitgliedskontoBuchung
fields = ['typ', 'cent_wert', 'kommentar', 'buchungsdatum']
@login_required
def detail(request, mitgliedsnummer):
benutzer = request.user
if not benutzer.is_superuser and not benutzer.groups.filter(name='vorstand').exists():
try:
mitglied = benutzer.benutzermitglied.mitglied
except:
raise Http404("Keine Benutzerinformationen vorhanden.")
if mitglied.mitgliedsnummer != int(mitgliedsnummer):
raise Http404("Kein Zugriff (" + str(mitglied.mitgliedsnummer) + ")")
mitglied = get_object_or_404(Mitglied, mitgliedsnummer__exact = mitgliedsnummer)
if request.method == 'POST':
mkbuchung = MitgliedskontoBuchungForm(request.POST)
if mkbuchung.is_valid():
buchung = mkbuchung.save(commit=False)
buchung.mitglied = mitglied
buchung.save()
mkbuchung = MitgliedskontoBuchungForm()
else:
mkbuchung = MitgliedskontoBuchungForm()
all_transactions = []
value = 0
for buchung in mitglied.mitgliedskontobuchung_set.all().order_by('buchungsdatum'):
value += buchung.cent_wert
all_transactions.append({'amount': buchung.cent_wert / 100.0,
'comment': buchung.kommentar,
'value': value / 100.0,
'date': buchung.buchungsdatum,
'type': buchung.typ.typname,
})
return render(request, 'mitglieder/mitglied.html', {'mitglied': mitglied, 'transactions': all_transactions, 'before': 0.0, 'after': value/100.0, 'form': mkbuchung})
class MitgliedForm(forms.ModelForm):
class Meta:
model = Mitglied
fields = ['mitgliedsnummer', 'vorname', 'nachname', 'beitrittsdatum']
class AddUserForm(forms.Form):
adduserp = forms.BooleanField(label='Benutzer-Account anlegen', required=False)
class UserForm(forms.ModelForm):
class Meta:
model = User
fields = ['username', 'email']
@login_required
@user_passes_test(lambda u: u.is_superuser or u.groups.filter(name='vorstand').exists())
def addmitglied(request):
if not DEBUG:
raise Http404("Mitglieder-Anlegen zur Zeit noch nicht verfügbar.")
if request.method == 'POST':
mform = MitgliedForm(request.POST)
pform = AddUserForm(request.POST)
bform = UserForm(request.POST)
errormessage = ""
successmessage = ""
if not mform.is_valid():
errormessage = "Die eingegebenen Daten sind ungültig. " + mform.errors.as_json(escape_html=True)
elif not pform.is_valid():
errormessage = "Die eingegebenen Daten sind ungültig. " + pform.errors.as_json(escape_html=True)
else:
mform.save()
if pform.cleaned_data['adduserp']:
if not bform.is_valid():
errormessage = "Die eingegebenen Daten sind ungültig. " + bform.errors.as_json(escape_html=True)
else:
bform.instance.is_staff = True
bform.save()
benutzerinfo = BenutzerInformation()
benutzerinfo.user = bform.instance
benutzerinfo.mitglied = mform.instance
benutzerinfo.save()
if errormessage == "":
successmessage = "Mitglied wurde erfolgreich hinzugefügt."
return render(request, 'mitglieder/adddone.html', {'errormessage': errormessage,
'successmessage': successmessage,})
else: # GET or something
hochste_mitgliedernummer = Mitglied.objects.order_by('mitgliedsnummer').reverse()[0].mitgliedsnummer;
return render(request, 'mitglieder/addform.html', {'mform': MitgliedForm({'mitgliedsnummer': hochste_mitgliedernummer + 1,
'beitrittsdatum': date.today()}),
'pform': AddUserForm(),
'bform': UserForm()})
class BeitraegeForm(ModelForm):
class Meta:
model = MitgliedskontoBuchung
fields = ['kommentar', 'buchungsdatum']
@login_required
@user_passes_test(lambda u: u.is_superuser or u.groups.filter(name='vorstand').exists())
def beitraegeeinziehen(request):
if request.method == 'POST':
bform = BeitraegeForm(request.POST)
errormessage = ""
successmessage = ""
if not bform.is_valid():
errormessage = "Die eingegebenen Daten sind ungültig. " + mform.errors.as_json(escape_html=True)
else:
typ = MitgliedskontoBuchungstyp(typname = bform.cleaned_data['kommentar'])
typ.save()
today = date.today()
mitglieder = Mitglied.objects.filter(beitrittsdatum__lte = today).exclude(austrittsdatum__lte = today)
numBeitraege = 0
for mitglied in mitglieder:
buchung = MitgliedskontoBuchung(mitglied = mitglied,
typ = typ,
cent_wert = -mitglied.beitrag_cent,
kommentar = bform.cleaned_data['kommentar'],
buchungsdatum = bform.cleaned_data['buchungsdatum'])
buchung.save()
numBeitraege += 1
if errormessage == "":
successmessage = "Beitraeg von " + str(numBeitraege) + " Mitgliedern wurden erfolgreich abgebucht."
return render(request, 'mitglieder/adddone.html', {'errormessage': errormessage,
'successmessage': successmessage,})
else:
return render(request, 'mitglieder/beitraege.html', {'bform': BeitraegeForm({'kommentar': "Mitgliedsbeitrag " + str(date.today().year),
'buchungsdatum': date.today()})})
class EmailForm(forms.Form):
betreff = forms.CharField()
text = forms.CharField(widget=forms.Textarea)
@login_required
@user_passes_test(lambda u: u.is_superuser or u.groups.filter(name='vorstand').exists())
def zahlungsaufforderungen(request, template, schulden):
if request.method == 'POST':
cform = EmailForm(request.POST)
errormessage = ""
successmessage = ""
if not cform.is_valid():
errormessage = "Es müssen Text und Titel angegeben werden. " + mform.errors.as_json(escape_html=True)
else:
today = date.today()
mitglieder = Mitglied.objects.filter(beitrittsdatum__lte = today).exclude(austrittsdatum__lte = today)
numEmails = 0
failEmails = 0
with open('listen/maillog', 'a', encoding='utf8') as f:
for mitglied in mitglieder:
kontostand = 0
buchungen = mitglied.mitgliedskontobuchung_set.all()
for buchung in buchungen:
kontostand += buchung.cent_wert
if kontostand < 0 or not schulden:
data = {'vorname': mitglied.vorname,
'nachname': mitglied.nachname,
'anrede': mitglied.anrede,
'mitgliedsnummer': mitglied.mitgliedsnummer,
'datum': str(date.today()),
'kontostand': kontostand / 100.0,
'schulden': -kontostand / 100.0,
'email': mitglied.email}
betreff = cform.cleaned_data['betreff'].format(**data)
text = cform.cleaned_data['text'].format(**data)
try:
send_mail(betreff, text, 'vorstand@alumni.bwinf.de', [mitglied.email])
f.write("Date: " + str(date.today()) + "\n")
f.write("To: " + mitglied.email + "\n")
f.write("From: vorstand@alumni.bwinf.de\n")
f.write("Subject: " + betreff + "\n\n")
f.write(text + "\n\n")
numEmails += 1
except:
f.write("ERROR: Could not send mail to: " + mitglied.email + "(" + str(date.today()) + ": " + betreff + ")\n\n")
failEmails += 1;
if errormessage == "":
successmessage = "E-Mail an " + str(numEmails) + " Mitglieder wurde erfolgreich versandt. " + str(failEmails) + " E-Mails konnten nicht versandt werden."
return render(request, 'mitglieder/adddone.html', {'errormessage': errormessage,
'successmessage': successmessage,})
else:
text = ""
with open ("mitglieder/" + template + ".txt", "r", encoding='utf8') as templatefile:
text = templatefile.read()
return render(request, 'mitglieder/email.html', {'cform': EmailForm({'betreff': "Mitgliedsbeitrag BwInf Alumni und Freunde e. V.",
'text': text}), 'schulden': schulden})
# Create your views here.
from django.contrib import admin
# Register your models here.
from django.apps import AppConfig
class MitgliederverwaltungConfig(AppConfig):
name = 'mitgliederverwaltung'
from django.db import models
# Create your models here.
......@@ -12,16 +12,16 @@
{% if mitglieder %}
<ul class="bl">
{% for mitglied in mitglieder %}
<li><a href="{% url 'mitglieder:detail' mitglied.mitgliedsnummer %}">{{ mitglied }}</a>
<li><a href="{% url 'mitgliedskonto:detail' mitglied.mitgliedsnummer %}">{{ mitglied }}</a>
<ul class="bl">
{% for benutzermitglied in mitglied.benutzermitglied_set.all %}
<li><a href="{% url 'benutzer:detail' benutzermitglied.benutzer.id %}">{{ benutzermitglied.benutzer.username }}</a></li>
<li><a href="{% url 'mitgliederverwaltung:detail' benutzermitglied.benutzer.id %}">{{ benutzermitglied.benutzer.username }}</a></li>
{% endfor %}
<li><a href="{% url 'benutzer:addmitgliedsnummer' mitglied.mitgliedsnummer %}">+</a></li>
<li><a href="{% url 'mitgliederverwaltung:addmitgliedsnummer' mitglied.mitgliedsnummer %}">+</a></li>
</ul>
</li>
{% endfor %}
<li><a href="{% url 'mitglieder:add' %}">+</a>
<li><a href="{% url 'mitgliedskonto:add' %}">+</a>
</ul>
{% endif %}
......
from django.test import TestCase
# Create your tests here.
......@@ -2,7 +2,7 @@ from django.conf.urls import url
from . import views
app_name = 'benutzer'
app_name = 'mitgliederverwaltung'
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^alle/$', views.listusers, name='benutzerliste'),
......
from django.shortcuts import render, get_object_or_404
from django.contrib.auth.decorators import login_required, user_passes_test
from django.http import Http404
import re
from benutzer.models import BenutzerMitglied
from mitglieder.models import Mitglied
from django.contrib.auth.models import User
from django import forms
from bwinfalumni.settings import DEBUG
# Keine automatisch erzeugte Form, um eigene Prüfung an benutzernamen zu implementieren und
# Djangos automatische "Benutzername existiert schon"-Kontrolle zu umgehen.
class BenutzerForm(forms.Form):
username = forms.CharField(label='Login-Name', max_length=200)
email = forms.EmailField(label='Email-Adresse', max_length=200)
@login_required
def index(request):
benutzer = request.user
errormessage = ""
successmessage = ""
if request.method == 'POST':
form = BenutzerForm(request.POST)
if form.is_valid():
if not re.compile("^\w+$").match(form.cleaned_data['username']):
errormessage = "Der eingegebene Login-Name ist ungültig. (Alphanumerisch + Unterstrich)"
else:
errormessage = "Die eingegebenen Daten sind ungültig. " + form.errors.as_json(escape_html=True)
if errormessage == "" and not benutzer.username == form.cleaned_data['username']:
sameName = User.objects.filter(username__exact=form.cleaned_data['username'])
if len(sameName) > 0:
errormessage = "Dieser Login-Name existiert bereits."
if errormessage == "":
benutzer.username = form.cleaned_data['username']
benutzer.email = form.cleaned_data['email']
benutzer.save()
successmessage = "Daten wurden erfolgreich aktualisiert."
form = BenutzerForm({
'username': benutzer.username,
'email': benutzer.email,
})
try:
mitglied = benutzer.benutzermitglied.mitglied
except:
raise Http404("Keine Benutzerinformationen vorhanden.")
return render(request, 'mitgliederverwaltung/uebersicht.html', {'benutzer': benutzer,
'mitglied': mitglied,
'form': form,
'errormessage': errormessage,
'successmessage': successmessage,
})
@login_required
@user_passes_test(lambda u: u.is_superuser or u.groups.filter(name='vorstand').exists())
def listusers(request):
all_mitglieder = Mitglied.objects.order_by('mitgliedsnummer')
return render(request, 'mitgliederverwaltung/mitgliederliste.html', {'mitglieder': all_mitglieder})
@login_required
def showuser(request, userid):
benutzer = get_object_or_404(User, id__exact = userid)
try:
mitglied = benutzer.benutzermitglied.mitglied
except:
raise Http404("Keine Benutzerinformationen vorhanden.")
return render(request, 'mitgliederverwaltung/anzeige.html', {'benutzer': benutzer,
'mitglied': mitglied,
})
# TODO: What is actually still to be done here?
class UserForm(forms.ModelForm):
class Meta:
model = User
fields = ['username', 'email']
class UserInfoForm(forms.ModelForm):
class Meta:
model = BenutzerMitglied
fields = ['mitglied']
@login_required
@user_passes_test(lambda u: u.is_superuser or u.groups.filter(name='vorstand').exists())
def addbenutzer(request, mitgliedsnummer = -1):
if not DEBUG:
raise Http404("Benutzer-Anlegen zur Zeit noch nicht verfügbar.")
if request.method == 'POST':
bform = UserForm(request.POST)
biform = UserInfoForm(request.POST)
errormessage = ""
successmessage = ""
if not bform.is_valid():
errormessage = "Die eingegebenen Daten sind ungültig. " + bform.errors.as_json(escape_html=True)
elif not biform.is_valid():
errormessage = "Die eingegebenen Daten sind ungültig. " + biform.errors.as_json(escape_html=True)
else:
bform.instance.is_staff = True
bform.save()
biform.instance.user = bform.instance
biform.save()
if errormessage == "":
successmessage = "Benutzer wurde erfolgreich hinzugefügt."
return render(request, 'mitgliederverwaltung/adddone.html', {'errormessage': errormessage,
'successmessage': successmessage,})
else: # GET or something
bform = UserForm()
if mitgliedsnummer == -1:
biform = UserInfoForm()
else: