diff --git a/LICENSE b/LICENSE index adb0f049cef97c77fc32907ac5a53395a9f9b3f1..aa886076688c17a10c97645f2141bf5196717103 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,8 @@ MIT License Copyright (c) 2019 Dominik George <dominik.george@teckids.org> +Copyright (c) 2019 Tom Teichler <tom.teichler@teckids.org> +Copyright (c) 2019 Martin Gummi <martin.gummi@teckids.org> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/biscuit/core/locale/de/LC_MESSAGES/django.po b/biscuit/core/locale/de/LC_MESSAGES/django.po new file mode 100644 index 0000000000000000000000000000000000000000..1cf3588bda95bf1e63becc27f4d4953d0867881a --- /dev/null +++ b/biscuit/core/locale/de/LC_MESSAGES/django.po @@ -0,0 +1,137 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: BiscuIT - School Information System (SIS)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-07-17 01:40+0200\n" +"PO-Revision-Date: 2019-07-17 01:48+0200\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Last-Translator: Tom Teichler <tom.teichler@teckids.org>\n" +"Language-Team: \n" +"X-Generator: Poedit 2.2.3\n" + +#: biscuit/core/menus.py:14 +msgid "Interfaces" +msgstr "Schnittstellen" + +#: biscuit/core/menus.py:18 biscuit/core/templates/core/persons.html:5 +msgid "Persons" +msgstr "Personen" + +#: biscuit/core/models.py:10 +msgid "female" +msgstr "weiblich" + +#: biscuit/core/models.py:11 +msgid "male" +msgstr "männlich" + +#: biscuit/core/models.py:15 +msgid "Is person active?" +msgstr "Ist die Person aktiv?" + +#: biscuit/core/models.py:17 +msgid "First name" +msgstr "Vorname" + +#: biscuit/core/models.py:18 +msgid "Last name" +msgstr "Nachname" + +#: biscuit/core/models.py:20 +msgid "Additional name(s)" +msgstr "Zusätzliche Namen" + +#: biscuit/core/models.py:23 +msgid "Short name" +msgstr "Kurzname" + +#: biscuit/core/models.py:26 +msgid "Street" +msgstr "Straße" + +#: biscuit/core/models.py:28 +msgid "Street number" +msgstr "Hausnummer" + +#: biscuit/core/models.py:30 +msgid "Postal code" +msgstr "Postleitzahl" + +#: biscuit/core/models.py:32 +msgid "Place" +msgstr "Ort" + +#: biscuit/core/models.py:34 +msgid "Home phone" +msgstr "Festnetz" + +#: biscuit/core/models.py:36 +msgid "Mobile phone" +msgstr "Handy" + +#: biscuit/core/models.py:38 +msgid "E-mail address" +msgstr "E-Mail-Adresse" + +#: biscuit/core/models.py:41 +msgid "Date of birth" +msgstr "Geburtsdatum" + +#: biscuit/core/models.py:43 +msgid "Sex" +msgstr "Geschlecht" + +#: biscuit/core/models.py:45 +msgid "Photo" +msgstr "Foto" + +#: biscuit/core/models.py:48 +msgid "Reference ID of import source" +msgstr "Referenz-ID der Import-Quelle" + +#: biscuit/core/models.py:50 +msgid "Guardians / Parents" +msgstr "Erziehungsberechtigte / Eltern" + +#: biscuit/core/models.py:59 +msgid "Long name of group" +msgstr "Langer Name der Gruppe" + +#: biscuit/core/models.py:61 +msgid "Short name of group" +msgstr "Kurzer Name der Gruppe" + +#: biscuit/core/templates/core/person.html:10 +msgid "Edit person" +msgstr "Person editiern" + +#: biscuit/core/templates/core/person.html:13 +msgid "Contact details" +msgstr "Kontaktdetails" + +#: biscuit/core/templates/core/person.html:75 +msgid "Person not found" +msgstr "Person nicht gefunden" + +#: biscuit/core/templates/core/person.html:78 +msgid "" +"\n" +" There is no person with this id.\n" +" " +msgstr "" +"\n" +" Es existiert keine Person mit dieser ID.\n" +" " + +#: biscuit/core/templates/core/persons.html:9 +msgid "List of all persons" +msgstr "Liste aller Personen" diff --git a/biscuit/core/static/css/style.css b/biscuit/core/static/css/style.css new file mode 100644 index 0000000000000000000000000000000000000000..e74da43733d521bde563adfb94b4f4bf5a6465e4 --- /dev/null +++ b/biscuit/core/static/css/style.css @@ -0,0 +1,3 @@ +img.person-img { + max-height: 300px; +} diff --git a/biscuit/core/static/img/fallback.png b/biscuit/core/static/img/fallback.png new file mode 100644 index 0000000000000000000000000000000000000000..a39964ba07f9a6aea6b53943f8e79199cb204c87 Binary files /dev/null and b/biscuit/core/static/img/fallback.png differ diff --git a/biscuit/core/tables.py b/biscuit/core/tables.py index 5d6f480c2031ec85750c017a3ed1c89d1c5b3412..f4a8e508a4af78c69c81d75a77c00d2b1b3249e8 100644 --- a/biscuit/core/tables.py +++ b/biscuit/core/tables.py @@ -1,11 +1,11 @@ from django.utils.translation import ugettext_lazy as _ import django_tables2 as tables -#from django_tables2.utils import A +from django_tables2.utils import A class PersonsTable(tables.Table): class Meta: attrs = {'class': 'table table-striped table-bordered table-hover table-responsive-xl'} - first_name = tables.Column(verbose_name=_('First name')) - last_name = tables.Column(verbose_name=_('Last name')) + first_name = tables.LinkColumn('person_by_id', args=[A('id')]) + last_name = tables.LinkColumn('person_by_id', args=[A('id')]) diff --git a/biscuit/core/templates/core/base.html b/biscuit/core/templates/core/base.html index a55cafdddc8a1f8988fc69a43756851b1c05eb83..320c744556f6d6905c85ddfc11dbdceb7916ee41 100644 --- a/biscuit/core/templates/core/base.html +++ b/biscuit/core/templates/core/base.html @@ -5,8 +5,9 @@ {% block bootstrap4_title %}BiscuIT School Information System{% endblock %} {% block bootstrap4_extra_head %} + {% fa_css %} {% include_css "DataTables-Bootstrap4" %} - <link rel="stylesheet" href="{% static 'style.css' %}" /> + <link rel="stylesheet" href="{% static 'css/style.css' %}" /> <link rel="shortcut icon" href="#" /> {% endblock %} diff --git a/biscuit/core/templates/core/person.html b/biscuit/core/templates/core/person.html new file mode 100644 index 0000000000000000000000000000000000000000..af0dc931229f7db879629fee4e2c7e09f2193b61 --- /dev/null +++ b/biscuit/core/templates/core/person.html @@ -0,0 +1,83 @@ +{% extends "core/base.html" %} +{% load bootstrap4 font_awesome i18n staticfiles %} + +{% block content %} +<div class="col-sm-12 col-md-12"> + {% if person %} + <h2>{{ person.first_name }} {{ person.last_name }}</h2> + <p> + <a href="{{ '#' }}"> + {% blocktrans %}Edit person{% endblocktrans %} + </a> + </p> + <h3>{% blocktrans %}Contact details{% endblocktrans %}</h3> + <table class="table table-responsive-xl table-border table-striped"> + <tr> + <td rowspan="6"> + {% if person.photo %} + <img class="person-img" src="{{ person.photo.url }}" alt="{{ person.first_name }} {{ person.last_name }}" /> + {% else %} + <img class="person-img" src="{% static 'img/fallback.png' %}" alt="{{ person.first_name }} {{ person.last_name }}" /> + {% endif %} + </td> + <td>{% fa 'user' %}</td> + <td>{{ person.first_name }}</td> + <td>{{ person.additional_name }}</td> + <td>{{ person.last_name }}</td> + </tr> + <tr> + <td>{% fa 'venus-mars' %}</td> + <td colspan="3">{{ person.get_sex_display }}</td> + </tr> + <tr> + <td>{% fa 'fa-home' %}</td> + <td colspan="2">{{ person.street }} {{ person.housenumber }}</td> + <td colspan="2">{{ person.postal_code }} {{ person.place }}</td> + </tr> + <tr> + <td>{% fa 'phone-square' %}</td> + <td>{{ person.phone_number }}</td> + <td>{{ person.mobile_number }}</td> + </tr> + <tr> + <td>{% fa 'envelope' %}</td> + <td colspan="3">{{ person.email }}</td> + </tr> + <tr> + <td>{% fa 'gift' %}</td> + <td colspan="3">{{ person.date_of_birth|date }}</td> + </tr> + {% comment %} + <tr> + <td>{% fa 'graduation-cap' %}</td> + <td>Class</td> + <td>Teacher</td> + </tr> + {% endcomment %} + </table> + + {# Will be implemted soon #} + <table class="table table-responsive-xl table-border table-striped"> + <tr> + <td>Member</td> + <td> + <h4>Groups</h4> + <ul> + <li><a href="#">Foo</a></li> + <li><a href="#">Foo</a></li> + <li><a href="#">Foo</a></li> + <li><a href="#">Foo</a></li> + </td> + </tr> + </table> + {% else %} + <h2>{% blocktrans %}Person not found{% endblocktrans %}</h2> + + <p> + {% blocktrans %} + There is no person with this id. + {% endblocktrans %} + </p> + {% endif %} +</div> +{% endblock %} diff --git a/biscuit/core/urls.py b/biscuit/core/urls.py index cde54b7e54b1bd3dec3b4ca10275023518aa4e1c..8edfec2230df9f94650ca96bf12b83f9548029c6 100644 --- a/biscuit/core/urls.py +++ b/biscuit/core/urls.py @@ -10,6 +10,8 @@ urlpatterns = [ path('admin/', admin.site.urls), path('accounts/', include('django.contrib.auth.urls')), path('persons', views.persons, name='persons'), + path('person', views.person, name='person'), + path('person/<int:id_>', views.person, name='person_by_id'), path('person_card/<int:id>', views.person_card, name='person_card_by_id'), path('', views.index, name='index'), ] diff --git a/biscuit/core/views.py b/biscuit/core/views.py index a62f6a4777d57329be466a07979a35e4e71f9008..138b7d76a88bcfb688dd281306fec648163fc8f5 100644 --- a/biscuit/core/views.py +++ b/biscuit/core/views.py @@ -1,14 +1,18 @@ from django.contrib.auth.decorators import login_required -from django.shortcuts import render -from django_tables2 import RequestConfig +from django.utils.translation import gettext as _ from django.http import Http404 +from django.shortcuts import redirect, render +from django_tables2 import RequestConfig +from django.urls import reverse from .models import Person from .tables import PersonsTable + def index(request): context = {} return render(request, 'core/index.html', context) + @login_required def persons(request): context = {} @@ -23,6 +27,7 @@ def persons(request): return render(request, 'core/persons.html', context) + @login_required def person_card(request, id=None): context = {} @@ -34,10 +39,23 @@ def person_card(request, id=None): # Get person and check access try: person = Person.objects.get(id=id) - except ObjectDoesNotExist as e: + except Person.DoesNotExist as e: + # Turn not-found object into a 404 error + raise Http404 from e + + return render(request, 'core/person_card.html', context) + + +def person(request, id_): + context = {} + + # Get person and check access + try: + person = Person.objects.get(pk=id_) + except Person.DoesNotExist as e: # Turn not-found object into a 404 error raise Http404 from e context['person'] = person - return render(request, 'core/person_card.html', context) + return render(request, 'core/person.html', context)