Skip to content
Snippets Groups Projects
Verified Commit bc23eecc authored by Nik | Klampfradler's avatar Nik | Klampfradler
Browse files

Add manual addition of guardians through person view, advances #9.

parent 20a32aa6
No related branches found
No related tags found
No related merge requests found
......@@ -101,6 +101,11 @@ class TeckidsParent(ldapdb.models.Model, TeckidsLdapMixin):
home_phone = CharField(db_column='homePhone', max_length=20, verbose_name=_('Telefon (Festnetz privat)'))
mobile = CharField(db_column='mobile', max_length=20, verbose_name=_('Handy'))
def clean(self):
# Set default cn if not given
if not self.cn:
self.cn = "%s %s" % (self.given_name, self.sn)
class TeckidsGroup(ldapdb.models.Model, TeckidsLdapMixin):
class Meta:
managed = False
......
from django import forms
from django.utils.translation import ugettext_lazy as _
import phonenumbers
def is_phonenumber(number):
try:
phonenumbers.parse(number, 'DE')
except:
raise forms.ValidationError(_('%s ist keine gültige Telefonnummer!') % number)
class AddGuardianForm(forms.Form):
given_name = forms.CharField(label=_('Vorname'), max_length=100)
sn = forms.CharField(label=_('Nachname'), max_length=100)
mail = forms.EmailField(label=_('E-Mail-Adresse'))
mobile = forms.CharField(label=_('Handynummer'), validators=[is_phonenumber], required=False)
street = forms.CharField(label=_('Straße und Hausnummer'), required=False)
postal_code = forms.CharField(label=_('Postleitzahl (PLZ)'), required=False)
place = forms.CharField(label=_('Ort'), required=False)
{% extends "ticdesk_org/base.html" %}
{% load bootstrap3 i18n %}
{% block person_content %}
{% if person %}
<h2>{{ person.cn }}</h2>
<h3>{% blocktrans %}Erziehungsberechtigte hinzufügen{% endblocktrans %}</h3>
{% if error %}
<div class="panel panel-danger">
<div class="panel-heading">
{% blocktrans %}Fehler{% endblocktrans %}
</div>
<div class="panel-body">
<p>
{{ error }}
</p>
</div>
</div>
{% endif %}
<form method="post">
{% csrf_token %}
{% bootstrap_form add_guardian_form %}
<input type="submit" value="{% blocktrans %}Hinzufügen{% endblocktrans %}" />
</form>
{% endblock %}
......@@ -76,6 +76,13 @@
{% endif %}
<h3>{% blocktrans %}Kontaktdaten der Erziehungsberechtigten{% endblocktrans %}</h3>
<p>
<a href="{% url 'org:add_guardian_by_uid' person.uid %}">
{% blocktrans %}Erziehungsberechtigte hinzufügen{% endblocktrans %}
</a>
</p>
{% for guardian in person.guardians_parents %}
<table class="table table-responsive table-border table-striped">
<tr>
......
......@@ -7,5 +7,6 @@ urlpatterns = [
url(r'^persons/(?P<group>[a-z][a-z0-9-]+)$', views.persons, name='persons_by_group'),
url(r'^person$', views.person, name='person'),
url(r'^person/(?P<uid>[a-z][a-z0-9]+)$', views.person, name='person_by_uid'),
url(r'^person/(?P<uid>[a-z][a-z0-9]+)/guardians/add$', views.add_guardian, name='add_guardian_by_uid'),
url(r'^map$', views.map, name='map'),
]
......@@ -77,6 +77,10 @@ def may_see_person(person, user):
logger.warning("%s tried to access disallowed person %s" % (user.uid, person.dn))
return False
def may_modify_person(person, user):
# FIXME be more restrictive here
return may_see_person(person, user)
def filter_disallowed_persons(persons, user):
return [person for person in persons if may_see_person(person, user)]
......
......@@ -6,11 +6,13 @@ from django.template.loader import get_template
from django.urls import reverse
from django_tables2 import RequestConfig
from .forms import AddGuardianForm
from .tables import PersonTable
from .util import filter_disallowed_persons, get_relevant_groups, may_see_group, may_see_person, render_latex, tex_to_pdf
from .util import filter_disallowed_persons, get_relevant_groups, may_see_group, may_see_person, may_modify_person, render_latex, tex_to_pdf
TeckidsPerson = apps.get_model('ticdesk_account', 'TeckidsPerson')
TeckidsGroup = apps.get_model('ticdesk_account', 'TeckidsGroup')
TeckidsParent = apps.get_model('ticdesk_account', 'TeckidsParent')
def person(request, uid=None):
context = {}
......@@ -142,3 +144,63 @@ def map(request):
context['relevant_groups'] = get_relevant_groups(request.user)
return render(request, 'ticdesk_org/map.html', context)
def add_guardian(request):
context = {}
# Do not allow not logged-in users
if request.user.is_anonymous():
return HttpResponse(status=403)
# Get person and check access
try:
person = TeckidsPerson.objects.get(uid=uid)
except ObjectDoesNotExist:
# Turn not-found object into a 404 error
return HttpResponseNotFound(render(request, 'ticdesk_org/person.html', context))
if not may_modify_person(person, request.user):
return HttpResponse(status=403)
else:
# Save person once to clean it, then add to context
try:
person.save()
except:
# Not being able to save here does not matter
pass
context['person'] = person
# Prepare the form
initial = {
'sn': person.sn,
'street': person.home_postal_street,
'postal_code': person.home_postal_code,
'place': person.home_postal_place,
}
add_guardian_form = AddGuardianForm(initial=initial)
if request.method == 'POST':
add_guardian_form = AddGuardianForm(request.POST, initial=initial)
if add_guardian_form.is_valid():
# Create new TeckidsParent
parent = TeckidsParent.objects.create()
parent.given_name = add_guardian_form.cleaned_data['given_name']
parent.sn = add_guardian_form.cleaned_data['sn']
if add_guardian_form.cleaned_data['street']:
parent.home_postal_address = '%s, %s %s' % (add_guardian_form.cleaned_data['street'],
add_guardian_form.cleaned_data['postal_code'],
add_guardian_form.cleaned_data['place'])
parent.mail = add_guardian_form.cleaned_data['mail']
parent.mobile = add_guardian_form.cleaned_data['mobile']
parent.save()
# Link parent to person
person.guardians.append(parent.dn)
person.save()
# Redirect to person detail page
return redirect(reverse('org:person_by_uid', args=[request.user.username]))
return render(request, 'ticdesk_org/add_guardian.html', context)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment