Skip to content
Snippets Groups Projects
Commit 3b9d7034 authored by Jonathan Weth's avatar Jonathan Weth :keyboard:
Browse files

Merge branch 'dev' into feature/pwa-optimization

# Conflicts:
#	schoolapps/dashboard/views.py
#	schoolapps/schoolapps/settings.py
#	schoolapps/schoolapps/urls.py
#	schoolapps/templates/common/404.html
parents 949b260a 71a2753c
No related branches found
No related tags found
1 merge request!86Merge school-apps
......@@ -16,3 +16,4 @@ dynselect2/src/*
dynselect2/bundle.js
package-lock.json
schoolapps/latex/
schoolapps/log.django
# Releases/Änderungen
## 1.0-beta "Aebli"
_Veröffentlicht_
## 1.0 "Aebli"
Veröffentlicht unter [v1.0](https://github.com/Katharineum/school-apps/releases/tag/v1.0)
### Funktionen
- AUB (Antrag auf Unterrichtsbefreiung)
- Antragstellung mit anschließender Bearbeitungs- und Löschfunktion
- Genehmigen bzw. Ablehnen von Anträgen in zwei Runden
- Archivfunktion für alte Anträge
- Automatische Benachrichtigung bei Genehmigung bzw. Ablehnung per E-Mail an den Antragssteller
- Timetable (Stundenplan, basierend auf UNTIS 2020)
- Anzeige aller Studenpläne (Schüler, Lehrer, Räume) inkl. Mobilversion
- Anzeige des Vertretungsplans über Tabelle (Webapp) oder PDF
- Direkte Einbindung von Vertretungen in die Regelpläne ("SMART PLAN")
- Bereitstellung eines Tagesplanes für jeden Nutzer ("Mein Plan", SMART PLAN für einen Wochentag)
- Speisepläne
- Hochladen von Speiseplänen im PDF-Format für jeweils eine Kalenderwoche
- Bereitstellung einer PDF-URL, welche dynamisch den aktuellen Plan anzeigt
- Support
- REBUS: Fehlermeldeportal mit dreistufiger Kategoriesierungsmöglichkeit
- Feedback: Feedbackformular mit Sternewertung
- FAQ: Datenbankgestütztet FAQ-Anzeige inkl. Fragemöglichkeit
- Benachrichtigungen für REBUS, Feedback und FAQ via E-Mail
## 1.0.1 "Aebli"
Veröffentlicht unter [v1.0](https://github.com/Katharineum/school-apps/releases/tag/v1.0.1)
### Änderungen
Diverse Nachbesserungen des Releases 1.0 "Aebli"
* Umgestaltung des Menüs
* Umgestaltung des Footers
* Nächsten Tag im Vertretungsplan und Mein Plan bereits ab 15:35 Uhr des Vortages anzeigen
* Verbesserungen bei REBUS
* Anpassung für OTRS
* Kleine Designänderungen (Timetable, AUB, FAQ)
* Beheben von kleinen Bugs (Timetable, Speiseplan)
## 1.0.2 "Aebli"
### Änderungen
Weitere Nachbesserungen der Releases 1.0 sowie 1.0.1 "Aebli"
* Ferien/Feiertage werden nun angezeigt
* Icon für Nimbus im Footer hinzugefügt
* Vertretungsplantabelle mobil optimiert
* Sortierung der AUBs geändert
* Darstellung der REBUS-E-Mails verbessert
* Weitere Kategorien für "Fehler melden" hinzugefügt (Drucker, etc.)
* Designanpassungen im Vertretungsplan-PDF (u. a. Minimierung des Platzbedarfes)
* Entfernung des Hinweises "erste Version"
* SMART PLAN wird ab Freitag, 15:35 Uhr bereits für die nächste Woche angezeigt
* Umbenennung von class.pdf in aktuell.pdf
* Interne Optimierungen und Verbesserungen sowie Fehlerbehebungen
## 1.1 "Aebli"
### Änderungen
Weitere Verbesserungen der vorangegeangen Versionen dieses Releases.
* Überarbeitung des PDF-Vertretungsplans
+ Ausblenden der Stunden, die durch Veranstaltungen entfallen
+ Ausblenden der Änderungen an Verfügungsstunden
+ Ausblenden von nicht betroffenen Parallelkursen bei Vertretungen
+ Zusammenfassen von Stundenblöcken (statt zwei Einzelstunden wird eine Doppelstunde angezeigt)
+ Zusammenfassen der Seiten für mehrere Tage, sodass der zweite Tag bereits auf der Seite anfängt, auf der der erste Tag endet
* Behebung kleinerer Fehler
+ Support-Seiten waren auch ohne Anmeldung nutzbar
+ Pläne sind auf der Übersichtsseite sortiert
© 2018 by Jonathan Weth, Frank-Poetzsch-Heffter, Computer-AG, Katharineum zu Lübeck
© 2019 by Hangzhi Yu, Julian Leucker, Jonathan Weth, Frank Poetzsch-Heffter, Computer-AG, Katharineum zu Lübeck
\ No newline at end of file
## Installation
**Hinweis:** Es werden nur Linux-basierte Systeme unterstützt (in dieser Anleitung wird sich auf Debian-basierte Systeme wie Ubuntu oder Linux Mint bezogen). Außerdem werden Root-Rechte benötigt.
### Grundsystem
```
sudo apt install python3 python3-dev python3-pip git mariadb-server python3-venv libldap2-dev libsasl2-dev libmysqlclient-dev pandoc texlive texlive-fonts-extra texlive-lang-german texlive-latex-extra
```
### MySQL-Datenbank
1. Datenbanken `schoolapps` und `Untis` (`utf8_general_ci`) anlegen
2. Benutzer `www-data` anlegen
3. Benutzer `www-data` alle Rechte auf `schoolapps` geben
4. Benutzer `untis-read` anlegen
5. Benutzer `untis-read` Leserechte auf UNTIS-DB geben
```
mysql -u root -p
CREATE DATABASE schoolapps;
CREATE DATABASE Untis;
CREATE USER 'www-data'@'localhost' IDENTIFIED BY 'grummelPASS1531';
GRANT ALL PRIVILEGES ON schoolapps.* TO 'www-data'@'localhost';
CREATE USER 'untis-read'@'localhost' IDENTIFIED BY 'grummelPASS1531';
GRANT SELECT ON Untis.* TO 'untis-read'@'localhost';
```
Hinweis: In Testumgebungen kann untis-read auch entfallen und
stattdessen www-data auch für den Zugriff auf die Datenbank `Untis` verwendet werden:
```
GRANT SELECT ON Untis.* TO 'www-data'@'localhost';
```
### UNTIS-Beispieldaten importieren
Zum Testen kann die Datei `untiskath.sql` vom Forum in die Datenbank `Untis` importiert werden.
### SchoolApps clonen
```
git clone git@github.com:Katharineum/school-apps.git
```
### Django installieren
- Zum Installationsordner wechseln, dann:
```
python3 -m venv env
source env/bin/activate
pip install -r requirements.txt
```
- `example_secure_settings.py` zu `secure_settings.py` kopieren und anpassen (hier müssen auch die passenden DB-Zugangsdaten eingetragen werden)
### Migrations durchführen/auflösen
Leider kommt es bei einer Erstinstallation von SchoolApps immer noch zu Problemen mit den Migrations. Sollte es Schwierigkeiten geben, @hansegucker kontaktieren.
Für die Migration folgende Befehle im aktivierten VirtualEnv ausführen:
```
python3 schoolapps/manage.py makemigrations
python3 schoolapps/manage.py migrate
```
### Testlauf
- Administratornutzer erstellen
```
python3 schoolapps/manage.py createsuperuser
```
- Django-Devserver starten
```
python3 schoolapps/manage.py runserver
```
- Einstellungen anpassen (http://127.0.0.1:8080/settings, siehe auch "Kanboard-Verbindung einrichten")
- SchoolApps benutzen 😃
### Mail-Verbindung einrichten (REBUS+Feedback)
1. Zu den [Einstellungen](localhost:8000/settings) navigieren (/settings)
2. Die richtigen E-Mailadressen eintragen
## LDAP (info.katharineum.de)
**WICHTIG:** LDAP funktioniert nur mit Nutzern, die folgende Gruppe haben: `info-admins`
#### Adresse lokal von info.katharineum.de
`localhost:389`
#### BIND-Nutzer
DN: `uid=readldap,ou=people,dc=skole,dc=skolelinux,dc=no`
PW: `grummelPASS1531`
#### Basis-DN
`dc=skole,dc=skolelinux,dc=no`
#### SSH-Tunnel herstellen
```sudo ssh -L 389:localhost:389 <user>@info.katharineum.de -N ```
(`<user>` durch Nutzer mit Gruppe `info-admins` ersetzen)
#### Verbindung testen
1. Tunnel erstellen (siehe Befehl)
2. Apache Active Directory (AD) zum Testen öffnen (Download unter http://directory.apache.org/studio/)
3. Verbindung in AD mit oben genannten Daten herstellen
![](https://user-images.githubusercontent.com/24552951/62492340-a02d9a80-b7ce-11e9-836d-f3846908641a.png)
## Apps
siehe Wiki
## Installation
**Hinweis:** Es werden nur Linux-basierte Systeme unterstützt (in dieser Anleitung wird sich auf Debian-basierte Systeme wie Ubuntu oder Linux Mint bezogen). Außerdem werden Root-Rechte benötigt.
### Grundsystem
```
sudo apt install python3 python3-dev python3-pip git mariadb-server python3-venv libldap2-dev libsasl2-dev libmysqlclient-dev pandoc texlive texlive-fonts-extra texlive-lang-german texlive-latex-extra
```
SchoolApps ist ein modulares System zum Bereitstellen von speziellen Anwendungen für den Schulalltag. Besonderer Fokus liegt dabei auf dem Stundenplansystem.
### MySQL-Datenbank
1. Datenbanken `schoolapps` und `Untis` (`utf8_general_ci`) anlegen
2. Benutzer `www-data` anlegen
3. Benutzer `www-data` alle Rechte auf `schoolapps` geben
4. Benutzer `untis-read` anlegen
5. Benutzer `untis-read` Leserechte auf UNTIS-DB geben
© 2018 by Jonathan Weth, Frank-Poetzsch-Heffter, Computer-AG, Katharineum zu Lübeck
```
mysql -u root -p
CREATE DATABASE schoolapps;
CREATE DATABASE Untis;
CREATE USER 'www-data'@'localhost' IDENTIFIED BY 'grummelPASS1531';
GRANT ALL PRIVILEGES ON schoolapps.* TO 'www-data'@'localhost';
CREATE USER 'untis-read'@'localhost' IDENTIFIED BY 'grummelPASS1531';
GRANT SELECT ON Untis.* TO 'untis-read'@'localhost';
```
Hinweis: In Testumgebungen kann untis-read auch entfallen und
stattdessen www-data auch für den Zugriff auf die Datenbank `Untis` verwendet werden:
```
GRANT SELECT ON Untis.* TO 'www-data'@'localhost';
```
### UNTIS-Beispieldaten importieren
Zum Testen kann die Datei `untiskath.sql` vom Forum in die Datenbank `Untis` importiert werden.
### SchoolApps clonen
```
git clone git@github.com:Katharineum/school-apps.git
```
### Django installieren
- Zum Installationsordner wechseln, dann:
```
python3 -m venv env
source env/bin/activate
pip install -r requirements.txt
```
- `example_secure_settings.py` zu `secure_settings.py` kopieren und anpassen (hier müssen auch die passenden DB-Zugangsdaten eingetragen werden)
### Migrations durchführen/auflösen
Leider kommt es bei einer Erstinstallation von SchoolApps immer noch zu Problemen mit den Migrations. Sollte es Schwierigkeiten geben, @hansegucker kontaktieren.
Für die Migration folgende Befehle im aktivierten VirtualEnv ausführen:
```
python3 schoolapps/manage.py makemigrations
python3 schoolapps/manage.py migrate
```
### Testlauf
- Administratornutzer erstellen
```
python3 schoolapps/manage.py createsuperuser
```
- Django-Devserver starten
```
python3 schoolapps/manage.py runserver
```
- Einstellungen anpassen (http://127.0.0.1:8080/settings, siehe auch "Kanboard-Verbindung einrichten")
- SchoolApps benutzen 😃
### Mail-Verbindung einrichten (REBUS+Feedback)
1. Zu den [Einstellungen](localhost:8000/settings) navigieren (/settings)
2. Die richtigen E-Mailadressen eintragen
## LDAP (info.katharineum.de)
**WICHTIG:** LDAP funktioniert nur mit Nutzern, die folgende Gruppe haben: `info-admins`
#### Adresse lokal von info.katharineum.de
`localhost:389`
#### BIND-Nutzer
DN: `uid=readldap,ou=people,dc=skole,dc=skolelinux,dc=no`
PW: `grummelPASS1531`
#### Basis-DN
`dc=skole,dc=skolelinux,dc=no`
#### SSH-Tunnel herstellen
```sudo ssh -L 389:localhost:389 <user>@info.katharineum.de -N ```
(`<user>` durch Nutzer mit Gruppe `info-admins` ersetzen)
#### Verbindung testen
1. Tunnel erstellen (siehe Befehl)
2. Apache Active Directory (AD) zum Testen öffnen (Download unter http://directory.apache.org/studio/)
3. Verbindung in AD mit oben genannten Daten herstellen
© 2019 by Hangzhi Yu, Julian Leucker, Jonathan Weth, Frank Poetzsch-Heffter, Computer-AG, Katharineum zu Lübeck
\ No newline at end of file
......@@ -52,10 +52,5 @@ def test_notification(request):
print(reverse("aub_details", args=[1]))
return redirect(reverse('dashboard'))
def error_404(request, exception):
return render(request, 'common/404.html')
def offline(request):
return render(request, 'common/offline.html')
\ No newline at end of file
......@@ -17,6 +17,8 @@ POST_MORTEM = True
ALLOWED_HOSTS = [
'info.katharineum.de',
'178.63.239.184',
'159.69.181.50',
'localhost',
'127.0.0.1',
'13049d63.ngrok.io'
......@@ -170,6 +172,8 @@ if DEBUG:
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
# DBSETTINGS_USE_CACHE = False
# PWA
PWA_APP_NAME = 'SchoolApps'
PWA_APP_DESCRIPTION = "Eine Sammlung an nützlichen Apps für den Schulalltag am Katharineum zu Lübeck"
......@@ -201,5 +205,24 @@ PWA_APP_DIR = 'ltr'
PWA_SERVICE_WORKER_PATH = os.path.join(BASE_DIR, 'static/common', 'serviceworker.js')
PWA_APP_LANG = 'de-DE'
# DB
#DBSETTINGS_USE_CACHE = False
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'level': 'INFO',
'class': 'logging.StreamHandler',
},
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': 'log.django',
},
},
'loggers': {
'django': {
'handlers': ['console', 'file'],
'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'),
},
},
}
......@@ -21,6 +21,7 @@ from django.contrib.staticfiles.views import serve
from django.urls import path
from django.conf.urls.static import static
from django.conf import settings
from django.shortcuts import render
from django.views import defaults
from schoolapps.settings import BASE_DIR
......@@ -32,10 +33,12 @@ def manifest(request):
handler404 = 'dashboard.views.error_404'
def custom_page_not_found(request, exception):
print(exception)
return render(request, '404.html', context={"martor": False})
def custom_page_not_found(request):
return defaults.page_not_found(request, None, "common/404.html")
handler404 = custom_page_not_found
urlpatterns = [
#############
......
{% include "partials/header.html" %}
<main>
<h3>Leider existiert diese Seite nicht. (Fehler 404)</h3>
<p class="flow-text">
Beim Aufrufen dieser Seite ist ein Fehler aufgetreten. Wahrscheinlich existiert die gewünschte Seite unter der
Adresse "<code id="url"></code>" nicht.
Solltest du der Meinung sein, dass diese Seite eigentlich existieren müsste, wende dich bitte an die
<a href="mailto:support@katharineum.de">Computer-AG</a>.
</p>
</main>
<script>
document.getElementById("url").innerHTML = window.location.pathname;
</script>
{% include 'partials/footer.html' %}
{#<!DOCTYPE html>#}
{#<html lang="de">#}
{#<head>#}
{# <meta charset="utf-8">#}
{# <meta http-equiv="X-UA-Compatible" content="IE=edge">#}
{# <meta name="viewport" content="width=device-width,initial-scale=1">#}
{# <meta name="description" content="Selbst programmierte Anwendungen für den Schullaltag am Katharineum zu Lübeck">#}
{# <title>SchoolApps – Katharineum zu Lübeck</title>#}
{##}
{# <!-- Android -->#}
{# <meta name="theme-color" content="#da1f3d">#}
{# <meta name="mobile-web-app-capable" content="yes">#}
{##}
{# <!-- iOS -->#}
{# <meta name="apple-mobile-web-app-title" content="SchoolApps">#}
{# <meta name="apple-mobile-web-app-capable" content="yes">#}
{# <meta name="apple-mobile-web-app-status-bar-style" content="default">#}
{##}
{# <!-- Windows -->#}
{# <meta name="msapplication-navbutton-color" content="#da1f3d">#}
{# <meta name="msapplication-TileColor" content="#da1f3d">#}
{# <meta name="msapplication-TileImage" content="ms-icon-144x144.png">#}
{# <meta name="msapplication-config" content="browserconfig.xml">#}
{##}
{# <!-- Pinned Sites -->#}
{# <meta name="application-name" content="SchoolApps">#}
{# <meta name="msapplication-tooltip" content="SchoolApps">#}
{# <meta name="msapplication-starturl" content="/">#}
{##}
{# <!-- Tap highlighting -->#}
{# <meta name="msapplication-tap-highlight" content="no">#}
{##}
{# <!-- UC Mobile Browser -->#}
{# <meta name="full-screen" content="yes">#}
{# <meta name="browsermode" content="application">#}
{##}
{##}
{# <!-- Main Link Tags -->#}
{# <link href="/static/icons/favicon_16.png" rel="icon" type="image/png" sizes="16x16">#}
{# <link href="/static/icons/favicon_32.png" rel="icon" type="image/png" sizes="32x32">#}
{# <link href="/static/icons/favicon_48.pngg" rel="icon" type="image/png" sizes="48x48">#}
{##}
{# <!-- iOS -->#}
{# <!-- non-retina iPad iOS 7 -->#}
{# <link rel="apple-touch-icon" href="/static/icons/apple_76.png" sizes="76x76">#}
{# <!-- retina iPhone vor iOS 7 -->#}
{# <link rel="apple-touch-icon" href="/static/icons/apple_114.png" sizes="114x114">#}
{# <!-- retina iPad iOS 7 -->#}
{# <link rel="apple-touch-icon" href="/static/icons/apple_152.png" sizes="152x152">#}
{# <!-- retina iPad iOS 7 für iPhone 6 Plus -->#}
{# <link rel="apple-touch-icon" href="/static/icons/apple_180.png" sizes="180x180">#}
{##}
{##}
{# <!-- Pinned Tab -->#}
{##}
{##}
{# <!-- Android -->#}
{# <link href="/static/icons/android_192.png" rel="icon" sizes="192x192">#}
{##}
{# <!-- Others -->#}
{##}
{##}
{##}
{# <!-- Favicon -->#}
{# <link rel="shortcut icon" type="image/x-icon" href="/static/common/favicon.ico">#}
{# <link rel="manifest" href="/static/common/manifest.json">#}
{##}
{# <!--------->#}
{# <!-- CSS -->#}
{# <!--------->#}
{# <link href="/static/css/materialdesignicons-webfont/material-icons.css" rel="stylesheet">#}
{# <link rel="stylesheet" type="text/css" media="screen"#}
{# href="/static/css/materialize.min.css">#}
{# <link rel="stylesheet" type="text/css" href="/static/common/style.css">#}
{# <script src="/static/js/jquery/jquery-3.3.1.slim.min.js"></script>#}
{##}
{##}
{# <!-- location (for "active" in sidenav -->#}
{# <meta name="active-loaction" content="404">#}
{##}
{##}
{#</head>#}
{#<body>#}
{##}
{#<header>#}
{# <!-- Menu button (sidenav) -->#}
{# <div class="container">#}
{# <a href="#" data-target="slide-out" class="top-nav sidenav-trigger hide-on-large-only">#}
{# <i class="material-icons">menu</i>#}
{# </a>#}
{# </div>#}
{##}
{# <!-- Nav bar (logged in as, logout) -->#}
{# <nav class="primary-color">#}
{# <a class="brand-logo" href="/">SchoolApps</a>#}
{# </nav>#}
{##}
{# <div id="print-header" class="row">#}
{# <div class="col s6 logo">#}
{# <img src="/static/common/logo.png">#}
{# </div>#}
{# <div class="col s6 right-align">#}
{# <a href="/"><strong>SchoolApps</strong></a><br>#}
{# Katharineum zu Lübeck#}
{# </div>#}
{# </div>#}
{##}
{# <!-- Main nav (sidenav) -->#}
{# <ul id="slide-out" class="sidenav sidenav-fixed">#}
{# <li class="logo">#}
{# <a id="logo-container" href="/" class="brand-logo">#}
{# <img src="/static/common/logo.png" alt="Logo des Katharineums">#}
{# </a>#}
{# </li>#}
{# </ul>#}
{#</header>#}
{% include "partials/header.html" %}
<main>
<h3>Leider existiert diese Seite nicht. (Fehler 404)</h3>
<p class="flow-text">
Beim Aufrufen dieser Seite ist ein Fehler aufgetreten. Wahrscheinlich existiert die gewünschte Seite unter der Adresse "<code id="url"></code>" nicht.
Solltest du der Meinung sein, dass diese Seite eigentlich existieren müsste, wende dich bitte an die
<a href="mailto:support@katharineum.de">Computer-AG</a>.
</p>
</main>
<script>
document.getElementById("url").innerHTML = window.location.pathname;
</script>
{% include 'partials/footer.html' %}
......@@ -6,7 +6,10 @@ register = template.Library()
def get_url_name(request): # Only one argument.
"""Gets url_name"""
return resolve(request.path_info).url_name
try:
return resolve(request.path_info).url_name
except Exception as e:
return e
register.filter("url_name", get_url_name)
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