From 97d3e9dfb682d1b6ce23df3f51bd09e156897723 Mon Sep 17 00:00:00 2001 From: Tom Teichler <tom.teichler@teckids.org> Date: Wed, 17 Jul 2019 01:06:04 +0200 Subject: [PATCH] Implement view for person. Closes #10. --- biscuit/core/static/css/style.css | 3 + biscuit/core/static/img/fallback.png | Bin 0 -> 19126 bytes biscuit/core/tables.py | 6 +- biscuit/core/templates/core/base.html | 3 +- biscuit/core/templates/core/person.html | 83 ++++++++++++++++++++++++ biscuit/core/urls.py | 2 + biscuit/core/views.py | 20 +++++- 7 files changed, 112 insertions(+), 5 deletions(-) create mode 100644 biscuit/core/static/css/style.css create mode 100644 biscuit/core/static/img/fallback.png create mode 100644 biscuit/core/templates/core/person.html diff --git a/biscuit/core/static/css/style.css b/biscuit/core/static/css/style.css new file mode 100644 index 000000000..e74da4373 --- /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 GIT binary patch literal 19126 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 literal 0 HcmV?d00001 diff --git a/biscuit/core/tables.py b/biscuit/core/tables.py index 5d6f480c2..f4a8e508a 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 a55cafddd..320c74455 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 000000000..af0dc9312 --- /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 1fac42e09..781d9f223 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('', views.index, name='index'), ] diff --git a/biscuit/core/views.py b/biscuit/core/views.py index e4c0929c4..8154e4aaf 100644 --- a/biscuit/core/views.py +++ b/biscuit/core/views.py @@ -1,6 +1,9 @@ from django.contrib.auth.decorators import login_required -from django.shortcuts import render +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 @@ -21,3 +24,18 @@ def persons(request): context['persons_table'] = persons_table return render(request, 'core/persons.html', context) + +@login_required +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.html', context) -- GitLab