115 Commits

Author SHA1 Message Date
0d3c47d8b3 Code cleanup using panda-bears 2020-01-16 20:24:29 +01:00
95f5e0b920 small fixes for django 2.0 2019-03-14 18:41:11 +01:00
b12203911e Moved shellscript functionality to an Makefile 2019-03-14 18:38:24 +01:00
a733130b65 Changed Middleware definition to new Django style 2019-01-31 20:36:47 +01:00
483e6f215d Fixed: Middleware process_response got not executed. 2019-01-12 16:26:13 +01:00
2bdf8c9692 Workaround: get easy-thumbnails from git for django 2.1 compatibility. 2019-01-06 11:41:08 +01:00
36e24b7da8 Update dependencies to Django2
PostgreSQL psycopg2 dependecy changed to wheel distribution.
2019-01-02 12:07:52 +01:00
79a5cdb868 removed compiled translations 2019-01-02 11:55:11 +01:00
5ed8976074 fixed add_page and edit_page URL definitions to work with "/" path. 2019-01-01 18:30:52 +01:00
12930c2ec6 fixed format of <date datetime""> output. 2018-12-30 11:22:17 +01:00
e792da7459 Don't try to show the next event if we can't find one. 2018-12-30 11:20:41 +01:00
b01dc33cb4 fixed path to changed virtenv 2018-12-30 11:20:00 +01:00
1bdce47375 Default to new and empty Page Elements instead of None.
Fixes an issue when we try to acces Page.title in the template.
2018-12-29 18:11:11 +01:00
bb7d4c8a08 fix for django-extra-views 0.12.0 Updated class EventSeriesForm to use factory_kwargs. 2018-12-19 18:06:15 +01:00
a3ac722acf * Bugfix import the _() translation in mixins. 2018-06-08 09:05:45 +02:00
1313d96e8f * fixed 404 errors in the gallery. 2018-06-07 14:18:18 +02:00
f2836baae5 * removed gender, address and phone number from the forms.
* birthday, first and last name fields will be set to None if you uncheck membership.
2018-05-16 12:40:34 +02:00
d67719cc17 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	.gitignore
#	src/membership/forms.py
#	src/membership/templates/membership/membership_form.html
#	src/membership/templates/membership/register_form.html
2018-05-16 12:03:10 +02:00
12773463a6 * removed gender, address and phone number from the forms.
* birthday, first and last name fields will be set to None if you uncheck membership.
2018-05-16 11:59:08 +02:00
ba4620705f Catch an KyuDanRanking.DoesNotExist exception if the user has never played a game of mahjongg by now. 2018-05-08 12:31:46 +02:00
40d2120d7e Merge branch 'dsgvo' 2018-05-08 12:15:12 +02:00
f7e9585932 removed unneeded import 2018-05-08 12:12:15 +02:00
99ceb54db1 User must confirm that he have read and understood the privacy plicity. This policity and the stautes are now linked in the help_text. 2018-05-08 12:09:56 +02:00
f841c1736e User must confirm that he have read and understood the privacy plicity. This policity and the stautes are now linked in the help_text. 2018-05-08 12:07:39 +02:00
436a77d036 removed social auth methods for login 2018-05-07 23:37:48 +02:00
a10b2706c3 removed <p> Tags to guarantee vaild HTML output. 2018-05-04 12:59:38 +02:00
afc471d27f Added a themed an customizeable logged out message page. 2018-05-04 12:53:23 +02:00
1d18356c8c fixed: load all toplevel pages from the db, but only show active pages in the top menu. 2018-05-04 11:57:19 +02:00
5a32dbf0af Changed membership forms, text can now be changed via admin tool. 2018-05-04 11:34:57 +02:00
65b8208987 Better age check 2018-05-03 16:35:40 +02:00
4f61b1e73b Dirty check club member must be at least 16 years old. 2018-05-03 16:23:39 +02:00
df4d8c83a6 First draft of a disclaimer (german) 2018-05-03 10:32:27 +02:00
f2533273e9 You can only fill in your personal data if you apply for a full membership. 2018-05-03 10:12:23 +02:00
595341a53b Added a admin action to cleanup personal data from inactive members. 2018-05-03 09:45:06 +02:00
af46768e7d Don't display full name anywhere. 2018-05-01 20:27:57 +02:00
10bb990539 Don't display members real name anywhere! 2018-05-01 20:27:22 +02:00
90cefd8739 Track without cookies. 2018-04-30 11:37:32 +02:00
a4c4f96c06 Personal data is only needed for a club membership. 2018-04-30 11:12:20 +02:00
19bbb5a226 All personal data can only seen by yourself. 2018-04-30 10:16:04 +02:00
3a3c8ec0c5 Merge branch 'master' into css3_redesign
# Conflicts:
#	requirements/base.txt
#	src/content/locale/de/LC_MESSAGES/django.mo
#	src/content/locale/de/LC_MESSAGES/django.po
#	src/events/locale/de/LC_MESSAGES/django.mo
#	src/events/locale/de/LC_MESSAGES/django.po
#	src/kasu/locale/de/LC_MESSAGES/django.po
#	src/mahjong_ranking/locale/de/LC_MESSAGES/django.mo
#	src/mahjong_ranking/locale/de/LC_MESSAGES/django.po
#	src/maistar_ranking/locale/de/LC_MESSAGES/django.po
#	src/membership/locale/de/LC_MESSAGES/django.mo
#	src/membership/locale/de/LC_MESSAGES/django.po
#	src/utils/locale/de/LC_MESSAGES/django.po
2018-04-30 08:29:14 +02:00
4aab611026 requirements changed to django<2.0 for compatibility reasons. 2018-04-28 11:11:12 +02:00
d5995bc612 Updated all translations 2018-04-27 10:34:37 +02:00
3ef947f128 Event gallery shows most recent albums first.
Doubled the shown events in the gallery to 24 per page.
2018-04-27 10:20:29 +02:00
28f7292c9d Fixed typo Player List (Spieler Liste) is now
Players list (Spielerliste)
2018-04-27 10:12:39 +02:00
7b631230da Added the full address to the next/upcoming event in the redbox. 2018-04-27 10:11:19 +02:00
6804319c28 adapted cleanup script to new file locations and parameters. 2018-04-27 10:10:02 +02:00
a2df81d62e Fixed: Changed the environ to ORIGINAL_RECIPIENT 2018-01-17 16:19:48 +01:00
afd163298c * Throw 404 instead of a 503 in Event Mixins if the related event does
not exist.
* Changes in the KyuDanRanking View to be more stable if we get bogus
kwargs.
2018-01-10 02:02:35 +01:00
cce6ac6014 Merge remote-tracking branch 'origin/master' into riichi_2018
# Conflicts:
#	src/events/mixins.py
#	src/kasu/settings.py
#	src/mahjong_ranking/management/commands/export_ranking.py
#	src/mahjong_ranking/management/commands/resetdanranking.py
#	src/mahjong_ranking/management/commands/update_ranking.py
#	src/mahjong_ranking/managers.py
#	src/mahjong_ranking/models.py
#	src/mahjong_ranking/views.py
2018-01-04 08:39:49 +01:00
192721452e * Kommentare wenn Dan/Kyu Punktabzüge verringert werden um nicht unter
0 zu fallen.
* Neue Middleware die REMOTE_IP aus dem X-Forward-For Header setzt.
  Damit funktioniert das Kommentarsystem nun auch hinter nginx.
2017-12-29 10:03:08 +01:00
10c27784ee XLSX Export vereinheitlicht.
Spieler Hanchanlisten können nun als XLSX exportiert werden.
Anpassungen in den Einstellungen für die parametisierten Kyu/Dan Berechnung.
2017-12-26 21:45:39 +01:00
8ab99ec039 Noch mehr Einstellungen für Kasu Ranking, um es an das neue Dan System anpassen zu können. 2017-12-22 10:54:11 +01:00
1fdf88c6d2 Diverse Umbauarbeiten für das neue Ranking. 2017-12-22 10:51:20 +01:00
b20b988e5d Pinned Django on < 2.0 for better compatibility.
Mainlined traslation code for better DRY workflow.
Fixed the EventDetail Mixin.
2017-12-07 22:54:18 +01:00
cf0e5e778c added on_delete in models an migrations for django 2.0
compatibility.
2017-12-07 22:08:47 +01:00
c7b714c41b Added a setting where the exported excel files should be stored.
Added a option to send the exported excel as mail attachment.
2017-12-07 09:40:35 +01:00
f51155cfac Fixed queryset so that EventDetailView will work too. 2017-11-24 19:48:21 +01:00
1315bc4225 Fixed Hanchan count and filter from last merge. 2017-11-24 19:47:28 +01:00
97749bfd2e Squashed commit of the following:
commit bb5081a78b
Author: Xeniac <xeniac@posteo.at>
Date:   Thu Nov 23 22:02:40 2017 +0100

    Added a setting where the exported excel files should be stored.
    Added a option to send the exported excel as mail attachment.

commit 854fd38740
Author: Xeniac <xeniac@posteo.at>
Date:   Thu Nov 23 22:01:38 2017 +0100

    Fixed: enumerate the Seasonrankings starting with 1
    Fixed: Logging error when a value changed from/to None

commit 6de1ecb102
Author: Christian Berg <xeniac@posteo.at>
Date:   Thu Nov 23 14:15:36 2017 +0100

    add a latest method to query the latest x events

commit bf12060c3b
Author: Christian Berg <xeniac@posteo.at>
Date:   Thu Nov 23 14:15:12 2017 +0100

    add a latest method to query the latest x events

commit 5ad628f33a
Author: Christian Berg <xeniac@posteo.at>
Date:   Mon Nov 20 07:47:47 2017 +0100

    Changed PlayerDanScore to only list non-legacy hanchans

commit 36272c60d6
Author: Christian Berg <xeniac@posteo.at>
Date:   Mon Nov 20 07:42:44 2017 +0100

    fixed import of MIN_HANCHANS_FOR_LADDER that moved to settings

commit c428f6ed1f
Author: Christian Berg <xeniac@posteo.at>
Date:   Mon Nov 20 07:41:04 2017 +0100

    Updated docstrings for new since and until kwargs

commit 9276e97c36
Author: Christian Berg <xeniac@posteo.at>
Date:   Mon Nov 20 07:33:54 2017 +0100

    added a since parameter to the hanchan queries to return only hanchans since the give date and time

commit fd244f10e8
Author: Christian Berg <xeniac@posteo.at>
Date:   Sun Nov 19 16:55:10 2017 +0100

    new command: resetdanranking YYYY-MM-DD, sets every dan player to 1st dan with zero dan_points at the given date.

commit 0a45cf1fd8
Author: Christian Berg <xeniac@posteo.at>
Date:   Sun Nov 19 16:14:59 2017 +0100

    added new fields to KyuDanRanking that allow to pick up the calculation from the last state of the KyuDanRanking.
    last_hanchan_date: it contains the start of the latest hanchan content for this players ranking.
    wins_in_row: to save the currents wins in a row

    Added option to calcuclate rankings until a given datetime.
2017-11-23 22:26:22 +01:00
84880281c6 Added a setting where the exported excel files should be stored.
Added a option to send the exported excel as mail attachment.
2017-11-23 22:02:40 +01:00
cffbd30d7e Fixed: enumerate the Seasonrankings starting with 1
Fixed: Logging error when a value changed from/to None
2017-11-23 22:01:38 +01:00
3a611ca9da add a latest method to query the latest x events 2017-11-23 14:15:36 +01:00
68c484afc9 add a latest method to query the latest x events 2017-11-23 14:15:12 +01:00
92470514c4 Changed PlayerDanScore to only list non-legacy hanchans 2017-11-20 07:47:47 +01:00
d33e5fc8c6 fixed import of MIN_HANCHANS_FOR_LADDER that moved to settings 2017-11-20 07:42:44 +01:00
bb110da5a2 Updated docstrings for new since and until kwargs 2017-11-20 07:41:04 +01:00
35a51091bf added a since parameter to the hanchan queries to return only hanchans since the give date and time 2017-11-20 07:33:54 +01:00
c0c48f950a new command: resetdanranking YYYY-MM-DD, sets every dan player to 1st dan with zero dan_points at the given date. 2017-11-19 16:55:10 +01:00
d9e0d5596c added new fields to KyuDanRanking that allow to pick up the calculation from the last state of the KyuDanRanking.
last_hanchan_date: it contains the start of the latest hanchan content for this players ranking.
wins_in_row: to save the currents wins in a row

Added option to calcuclate rankings until a given datetime.
2017-11-19 16:14:59 +01:00
a3c02ae73a FIXED: DateTimeField Hanchan.start received a naive datetime 2017-11-13 22:59:13 +01:00
e6f2528a0e Moved configuration to settings 2017-11-13 21:02:12 +01:00
638ec96c25 Code cleanup some small changes in the formatting. 2017-11-07 06:52:55 +01:00
34d327f183 Code cleanup some small changes in the formatting. 2017-11-07 06:48:14 +01:00
002eb40ea5 Fixed: SplitDateTime Widgets always complains about the date/time format. 2017-11-05 21:58:12 +01:00
d97c9db539 Fixed Typer Error "can't compare datetime.datetime to datetime.date".
Add a datetime to the hanchan queue instead of an date.
2017-11-05 10:22:39 +01:00
7ef69849a4 Sitemaps for page that should be public viewable 2017-11-03 07:16:47 +01:00
8719c2377a export_ranking now exports KyuDanRankings and SeasonRankings. 2017-11-03 07:15:28 +01:00
abeb86d48f recalculating only the new hanchans shoud do the trick now.
the racalc cronjob reports erronous partly recalculations now.
A lot of code cleanups
2017-11-01 09:53:52 +01:00
42a6ebedf9 TODO ergänzt mit meldungen von coala.io
scripte nach bin/ verschoben
2017-09-08 07:51:07 +02:00
b3ab9798b5 Another Step in the Quest to clean up the code base. 2017-09-08 07:19:50 +02:00
ce218080b2 Removed manual references on the CKEditor, they will be injected by
django-ckeditor
2017-06-26 17:12:57 +02:00
63e099b7c5 Coala .coafile hinzugefügt für einfache überwachung der Codestandards. 2017-06-09 17:19:44 +02:00
a26a91c360 Eine Menge Aufräumarbeiten.
* Eine Testsuite um Mahrjong Ranking Berechnungen zu testen
* Erste Arbeiten um die Workarounds aus dem "utils" Paket los zu werden.
* Vieles am Code umformatiert für PEP8 conformität
2017-06-07 13:25:30 +02:00
cf0bbb4c8f Abhängikeiten aktualisiert.
Social Auth Module haben den Eigentümer verändert,die Paketnamen wurden angepasst
Abhängigkeiten für Python 3 kompatible Module aktualisiert
Versionseinschränkungen für Django Update entfernt.
2017-05-10 10:21:38 +02:00
321531c160 Anpassungen des Codes an Django 1.11 mit Python 3
Grapelli wurde entfernt, das neue Django Admin ist hübsch genug.
2017-05-10 10:15:39 +02:00
5437b7b8de Neues Kommando: update-ranking
Aktualisiert alle Kyu-/Dan Rankings mit einem einfachen Befehl in der Shell.

random-ranking wurde gelöscht, es wird nicht mehr verwendet.
2017-05-10 10:13:23 +02:00
10bdaaa98c Adapted Code for Django 1.11 and Python 3,
updated the CKEditor
2017-05-10 10:10:11 +02:00
9b4ab374c6 Auswahl wird auf aktivierte Accounts mit aktiver Mitgliedschaft beschränkt. 2017-03-13 09:33:27 +01:00
ae87414584 Migration auf dne neuen Social-Auth Code. 2017-02-18 19:59:27 +01:00
120b4ea17f requirements in des Repository aufgenommen, auch diese sollter versioniert sein. 2017-02-18 19:41:27 +01:00
fcb15c7e7e * Aktelle Vorlagen in den src Ordner verschoben, damit sie in der Versionierung enthalten sind.
* INSTALLED_APPS auf PROJECT_APPS + PREREQ_APPS damit Vorlagen aus den kasu/templates Ordner bevorzugt werden. So lassen sich Vorlagen von 3rd Party Apps überschreiben, wie z.b. django-contrib-comments.

* Javascript Code für Google Maps entfernt, dies funktioniert mit Content Security Policy nicht mehr so gut und wird eh nicht gebraucht.

* Javascript für das Hanchan Formular vom header an des Ende des body gesetzt, der Code darf erst ausgeführt werden, wenn das Formular aufgebaut wurde.
2017-02-18 16:15:35 +01:00
299418ee62 Abhängikieten aktualisiert python-social-auth 0.3 und aufwärts haben fehlerhafte Abhängikeiten 2017-01-12 20:14:15 +01:00
e5f0d7f6fe renamed club.jpg to about.jpg, that's the new slug for the about page on kasu.at 2016-10-14 21:35:44 +02:00
53974dcd48 Add /rankings/ to the disallow list.
It's content that don't belong to an searchindex.
2016-10-14 21:34:39 +02:00
222dd060b1 Added Datefields for creation and last modied metadata. It's currently used for the sitemap.xml. 2016-10-14 21:27:58 +02:00
bbe16b2d13 added localized deschription fields osed for the meta description tag on the page for SEO. 2016-10-14 21:25:23 +02:00
ba44e97e9a Django Sitemap Framework integriert 2016-10-11 23:54:18 +02:00
8595959872 Added "Host: Directive" for Yandex. This line is useless, but prevents their "webmaster central" to send me unneccesary "warnings". "Host: kasu.at" literaly says that this site is available under kasu.at, not www.kasu.at 2016-09-17 10:39:01 +02:00
9b0967adc8 Some changes that the settings to reduce the logic in the local_settings.py 2016-09-16 19:37:37 +02:00
ac78dc3d75 Helptext now appears beside a Checkbox/Circle, not as a prargraph below anymore. 2016-09-16 19:36:13 +02:00
57b7d5a84b Added database migrations for the previous changes. 2016-09-16 19:34:24 +02:00
6b37aa84b0 Updated german translation 2016-09-16 19:30:09 +02:00
Christian Berg
0c7bd466c7 Kleinigkeiten und Tippfehler in den Templates für die Registrierung geändert. 2016-09-16 19:17:39 +02:00
0bdd409dc2 User Registration now uses all possibilities of the Membership Model. So you could apply for a membership with one step.
Fixed an error in the cleanup-registration command.
Also more stuff has been translated
2016-09-16 18:57:28 +02:00
Christian Berg
9c4ec20394 adding GPLv3 License to the Project 2016-09-16 18:01:58 +02:00
Christian Berg
6f1512906d Änderungen am layout wie die config Dateien abgelegt werden, um passwörter leichter aus dem öffentlichen GIT repository verschwinden zu lassen 2016-09-14 00:57:57 +02:00
Christian Berg
12c9a6e0e9 Aktuelle Fassung der Kasu.at Homepage. Kleine kosmetische Optimierungen. 2016-09-13 23:11:00 +02:00
Christian Berg
8cac20dd2b FIXED: 9th Dan is the highest possible Dan, so you can't advanced higher with 3 wins in an row. 2016-04-09 23:58:52 +02:00
Christian Berg
b1586efbab Fehler bei Vergabe von Bonuspunkte korrigiert.
Kommentare für Bonuspunkte werden jetzt als Kommentar beim Spieler hinterlassen, nicht als Kommentar in der Hanchan.
FIXED: 3_in_a_row counter wurde nicht zurückgesetzt wenn Bonuspunkte vergeben wurden.
FIXED: Durchschnittliche Platzierung während eines Events wurde nur als Ganzzahl berechnet. Wird nun als Fießkomma berechnet und gesichert.
2016-01-09 22:55:26 +01:00
Christian Berg
088efe2f39 Abhänigikeiten richtig gestellt.
Django benötigt flup. Kasu verwendet jetzt PostgreSQL, MySQL Abhängigkeit entfernt.
2016-01-09 22:48:48 +01:00
Christian Berg
b9ec418e5e 2 Fehler behoben:
1.  Internet Explorer unterstützung für <main> Tag ist fehlerhaft, wurde per CSS Definituon behoben.
2.  Templates für registrierung versehntlich gelöscht, wurden im membership Modul wieder hergestellt.
2015-08-23 21:04:20 +02:00
Christian Berg
836eee983d Milestone 08-14
* Mahjong Ranking wurde stark vereinfacht um Fehler besser vorzubeugen.
* Online WYSIWYG Editor auf CKEditor umgeändert, damit online bearbeiten für unbedarfte besser funktioniert.
* Viele kleine Optimierungen am CSS für bessere Performance.
* CSS wird jetzt aus LESS Code generiert
* Für dise Arbeit wird jetzt grunt und node package management lokal verwendet.
2015-08-23 16:37:39 +02:00
Christian Berg
79eaeb34ad Fehlerbereinigung.
Mahjong Ranking berechnet nun die richtigen Ränge zu den legendären Kyu/Dan Punkten.

Stablie Version bevor die Datenstruktur des Mahjongrankings vereinfacht wird.
2015-08-18 20:25:37 +02:00
Christian Berg
bafbf38612 Vereinfachung Membership ist nun ein custom login model, keine Abhängikeiten mehr zu auth.User.
absofort können alle Benutzer ins Ranking eingetragen werden und nicht mehr nur "zahlende Mitglieder".
2015-08-10 20:49:07 +02:00
Christian Berg
b96b485b61 Anpassungen für das Hosting bei Djangoeurope und damit verbundenen Versionen Django 1.8 und Python 2.7 2015-08-05 18:55:53 +02:00
63 changed files with 1262 additions and 2155 deletions

View File

@@ -5,4 +5,4 @@ language = python
bears = PEP8Bear,PyLintBear,PyUnusedCodeBear bears = PEP8Bear,PyLintBear,PyUnusedCodeBear
use_spaces = True use_spaces = True
pylint_cli_options = --load-plugins pylint_django pylint_cli_options = --load-plugins pylint_django
pylint_disable = E1101,R0201,R0901,R0903 #pylint_disable = E1101,R0201,R0901,R0903

1
.gitignore vendored
View File

@@ -71,3 +71,4 @@ backup/
.[a-zA-Z]* .[a-zA-Z]*
local_settings.py local_settings.py
sample.xlsx sample.xlsx
venv/

80
Makefile Normal file
View File

@@ -0,0 +1,80 @@
ASSESTS=requirements static
DEV_REQUIREMENTS=requirements/development.txt
DJANGO_SETTINGS_MODULE="kasu.settings"
EXCLUDE_FILES=*.pyc
PROJECT_PATH=$(CURDIR)
PYTHON=${VENV_PATH}/bin/python3
REQUIREMENTS=requirements/base.txt
SRC_PATH=${PROJECT_PATH}/src
MANAGE_PY=${PYTHON} -Wa ${SRC_PATH}/manage.py
SSH_LOGIN=kasu@kasu.at
VENV_PATH=$(PROJECT_PATH)/venv
.PHONY: clean venv
all: cleanup migrate testserver
venv: $(VENV_PATH)/bin/activate
$(VENV_PATH)/bin/activate:
@test -d $(VENV_PATH) || python3 -m venv --clear $(VENV_PATH)
dev-requirements: venv ${DEV_REQUIREMENTS}
${PYTHON} -m pip install -qU pip
${PYTHON} -m pip install -qUr ${DEV_REQUIREMENTS}
requirements: venv ${REQUIREMENTS}
${PYTHON} -m pip install -qU pip
${PYTHON} -m pip install -qUr ${REQUIREMENTS}
grunt:
-grunt
requirements_remote:
@echo "Installing requirements"
ssh ${SSH_LOGIN} "virtualenv/bin/pip install -qUr ${REQUIREMENTS}"
sync_assets:
@echo "Syncing project assets ..."
rsync -qr --copy-links --delete ${ASSESTS} ${SSH_LOGIN}:~/
sync_src:
@echo "Syncing Sourcecode ..."
find . -name EXCLUDE_FILES -exec rm -rf {} \;
rsync -qr --copy-links --delete ${SRC_PATH} ${SSH_LOGIN}:~/ --exclude 'src/kasu/local_settings.py'
restart_remote:
@echo "Rebuild and reload django..."
ssh ${SSH_LOGIN} "~/virtualenv/bin/python ~/src/manage.py collectstatic -l --noinput -v0"
ssh ${SSH_LOGIN} "~/init/kasu restart"
sync: sync_assets requirements_remote sync_src restart_remote
testserver: venv
${MANAGE_PY} runserver 127.0.0.1:8000
messages: venv
@echo "aktualisiere Übersetzungen..."
@(for d in ${SRC_PATH}/*; do \
test -d $$d/locale && cd $$d && ${VENV_PATH}/bin/django-admin.py makemessages -l de;\
done)
${MANAGE_PY} compilemessages -v0
cleanup-pyc:
@echo "lösche den Python Compiler Cache..."
find ${SRC_PATH} -name ${EXCLUDE_FILES} -exec rm -rf {} \;
collectstatic: venv
@echo "aktualisiere Statics"
${MANAGE_PY} collectstatic --noinput -c -v0
thumbnails: venv
@echo "Erstelle Vorschaubilder"
${MANAGE_PY} thumbnail_cleanup
cleanup: requirements messages cleanup-pyc collectstatic thumbnails
migrate: venv
${MANAGE_PY} migrate
migrations: venv
${MANAGE_PY} makemigrations

1072
TODO

File diff suppressed because it is too large Load Diff

View File

@@ -1,26 +0,0 @@
#!/bin/bash
source .virtualenv/bin/activate
echo "aktualisiere Übersetzungen..."
cd src
unset DJANGO_SETTINGS_MODULE
for dir in *
do
if [ -d ${dir}/locale ]
then
echo -n "$dir: "
cd ${dir}
django-admin.py makemessages -l de
cd ..
fi
done
sleep 5s
export DJANGO_SETTINGS_MODULE="kasu.settings"
./manage.py compilemessages
echo "lösche den Python Compiler Cache..."
find . -name "*.pyc" -exec rm -rf {} \;
echo "Aktualisiere Statics"
./manage.py collectstatic --noinput -c
echo "Erstelle Vorschaubilder"
./manage.py thumbnail_cleanup
touch kasu/wsgi.py

View File

@@ -1,23 +0,0 @@
#!/bin/bash
SSH_LOGIN="kasu@s21.wservices.ch"
SYNC_ASSESTS="requirements static"
SYNC_SOURCECODE="src"
EXCLUDE_FILES="*.pyc"
grunt
echo "Syncing project assets ..."
rsync -r --copy-links --delete ${SYNC_ASSESTS} ${SSH_LOGIN}:~/
echo "Installing dependecies"
ssh ${SSH_LOGIN} "virtualenv/bin/pip install --upgrade -r requirements/base.txt"
echo "Syncing Sourcecode ..."
find . -name "*.pyc" -exec rm -rf {} \;
rsync -r --copy-links --delete ${SYNC_SOURCECODE} ${SSH_LOGIN}:~/ --exclude 'src/kasu/local_settings.py'
echo "Rebuild and reload django..."
ssh ${SSH_LOGIN} "rm src/kasu/settings/development.*"
ssh ${SSH_LOGIN} "~/virtualenv/bin/python ~/src/manage.py collectstatic -l --noinput -v1"
ssh ${SSH_LOGIN} "~/init/kasu restart"

View File

@@ -1,6 +0,0 @@
#!/bin/sh
export DJANGO_SETTINGS_MODULE=kasu.settings
source .virtualenv/bin/activate
./manage.py runserver 0.0.0.0:8000

View File

@@ -1,5 +1,5 @@
beautifulsoup4 beautifulsoup4
django < 2.0 django < 3.0
django-appconf django-appconf
django-ckeditor django-ckeditor
django-contrib-comments django-contrib-comments
@@ -8,11 +8,12 @@ django-compressor
django-extra-views django-extra-views
django-markdown django-markdown
django-recaptcha django-recaptcha
easy-thumbnails git+https://github.com/SmileyChris/easy-thumbnails.git
icalendar icalendar
openpyxl
markdown markdown
pillow pillow
psycopg2 psycopg2-binary
PyJWT PyJWT
pytz pytz
requests requests

View File

@@ -4,5 +4,5 @@ django-rosetta
sqlparse sqlparse
# Code Linting # Code Linting
coala-bears pylint>=2.0
pylint-django pylint-django

View File

@@ -5,6 +5,7 @@ from django.core.cache import cache
from . import models from . import models
from utils import STATUS_PUBLISHED from utils import STATUS_PUBLISHED
def content_menus(request): def content_menus(request):
""" Generate the menu tree and add these info to the template context. """ Generate the menu tree and add these info to the template context.
@@ -18,8 +19,8 @@ def content_menus(request):
:param request: a Django request object :param request: a Django request object
:return: a dict with the template variables mentioned above :return: a dict with the template variables mentioned above
""" """
current_page = None current_page = models.Page()
current_top_page = None current_top_page = models.Page()
current_path = request.path_info[1:request.path_info.rfind('.')] current_path = request.path_info[1:request.path_info.rfind('.')]
# erzeuge das Top-Level Menü # erzeuge das Top-Level Menü

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: kasu.content\n" "Project-Id-Version: kasu.content\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-05-08 00:17+0200\n" "POT-Creation-Date: 2019-12-13 23:38+0100\n"
"PO-Revision-Date: 2018-01-12 15:25+0105\n" "PO-Revision-Date: 2018-01-12 15:25+0105\n"
"Last-Translator: b'Christian Berg <kasu@xendynastie.at>'\n" "Last-Translator: b'Christian Berg <kasu@xendynastie.at>'\n"
"Language-Team: Deutsch <>\n" "Language-Team: Deutsch <>\n"
@@ -20,252 +20,245 @@ msgstr ""
"X-Generator: Poedit 1.8.9\n" "X-Generator: Poedit 1.8.9\n"
"X-Translated-Using: django-rosetta 0.7.14\n" "X-Translated-Using: django-rosetta 0.7.14\n"
#: .\content\feeds.py:18 #: feeds.py:18
msgid "Current news from Kasu" msgid "Current news from Kasu"
msgstr "Aktuelle Nachrichten von Kasu" msgstr "Aktuelle Nachrichten von Kasu"
#: .\content\feeds.py:51 #: feeds.py:51
msgid "Latest comments on kasu.at" msgid "Latest comments on kasu.at"
msgstr "Neueste Kommentare auf Kasu.at " msgstr "Neueste Kommentare auf Kasu.at "
#: .\content\feeds.py:52 #: feeds.py:52
msgid "Kasu - latest comments" msgid "Kasu - latest comments"
msgstr "Kasu - neue Kommentare" msgstr "Kasu - neue Kommentare"
#: .\content\forms.py:57 .\content\models.py:318 #: forms.py:57 models.py:318
msgid "Please upload a PDF-File to this PDF-Page." msgid "Please upload a PDF-File to this PDF-Page."
msgstr "Bitte eine PDF Datei für diese PDF Seite hochladen." msgstr "Bitte eine PDF Datei für diese PDF Seite hochladen."
#: .\content\models.py:76 #: models.py:76
msgid "Headline" msgid "Headline"
msgstr "Schlagzeile" msgstr "Schlagzeile"
#: .\content\models.py:78 #: models.py:78
msgid "Content" msgid "Content"
msgstr "Inhalt" msgstr "Inhalt"
#: .\content\models.py:82 .\content\models.py:150 #: models.py:82 models.py:150 templates/content/article_detail.html:28
#: .\content\templates\content\article_detail.html:25
msgid "Category" msgid "Category"
msgstr "Kategorie" msgstr "Kategorie"
#: .\content\models.py:83 .\content\models.py:143 #: models.py:83 models.py:143
msgid "Image" msgid "Image"
msgstr "Bild" msgstr "Bild"
#: .\content\models.py:85 .\content\models.py:145 #: models.py:85 models.py:145
msgid "Slug" msgid "Slug"
msgstr "Slug" msgstr "Slug"
#: .\content\models.py:88 .\content\templates\content\article_detail.html:23 #: models.py:88 templates/content/article_detail.html:21
msgid "Author" msgid "Author"
msgstr "Autor" msgstr "Autor"
#: .\content\models.py:89 #: models.py:89
msgid "Status" msgid "Status"
msgstr "Status" msgstr "Status"
#: .\content\models.py:91 #: models.py:91
msgid "Created" msgid "Created"
msgstr "Erstellt" msgstr "Erstellt"
#: .\content\models.py:92 #: models.py:92
msgid "Modified" msgid "Modified"
msgstr "Bearbeitet" msgstr "Bearbeitet"
#: .\content\models.py:97 #: models.py:97
msgid "Article" msgid "Article"
msgstr "Artikel" msgstr "Artikel"
#: .\content\models.py:98 #: models.py:98
msgid "Articles" msgid "Articles"
msgstr "Artikel" msgstr "Artikel"
#: .\content\models.py:139 .\content\models.py:140 #: models.py:139 models.py:140
msgid "Name" msgid "Name"
msgstr "Name" msgstr "Name"
#: .\content\models.py:141 .\content\models.py:142 #: models.py:141 models.py:142
msgid "Description" msgid "Description"
msgstr "Beschreibung" msgstr "Beschreibung"
#: .\content\models.py:151 #: models.py:151
msgid "Categories" msgid "Categories"
msgstr "Kategorien" msgstr "Kategorien"
#: .\content\models.py:182 .\content\models.py:188 #: models.py:182 models.py:188
msgid "The short name for the menu-entry of this page" msgid "The short name for the menu-entry of this page"
msgstr "Ein kurzer Name für den Menüeintrag" msgstr "Ein kurzer Name für den Menüeintrag"
#: .\content\models.py:193 .\content\models.py:198 #: models.py:193 models.py:198
msgid "The page title as you'd like it to be seen by the public" msgid "The page title as you'd like it to be seen by the public"
msgstr "Der Seitentitel der öffentlich angezeigt werden soll" msgstr "Der Seitentitel der öffentlich angezeigt werden soll"
#: .\content\models.py:200 #: models.py:200
msgid "slug" msgid "slug"
msgstr "Slug" msgstr "Slug"
#: .\content\models.py:203 #: models.py:203
msgid "" msgid ""
"The name of the page as it will appear in URLs e.g http://domain.com/blog/" "The name of the page as it will appear in URLs e.g http://domain.com/blog/"
"[my-slug]/" "[my-slug]/"
msgstr "Wie die Seite in der URL aufscheint also http://domain.com/blog/[slug]" msgstr "Wie die Seite in der URL aufscheint also http://domain.com/blog/[slug]"
#: .\content\models.py:212 #: models.py:212
msgid "Path" msgid "Path"
msgstr "Pfad" msgstr "Pfad"
#: .\content\models.py:224 #: models.py:224
msgid "Position" msgid "Position"
msgstr "Position" msgstr "Position"
#: .\content\models.py:229 #: models.py:229
msgid "status" msgid "status"
msgstr "Status" msgstr "Status"
#: .\content\models.py:232 .\content\models.py:234 #: models.py:232 models.py:234
msgid "search description" msgid "search description"
msgstr "Beschreibung für Suchfunktion" msgstr "Beschreibung für Suchfunktion"
#: .\content\models.py:237 #: models.py:237
msgid "content type" msgid "content type"
msgstr "Inhaltstyp" msgstr "Inhaltstyp"
#: .\content\models.py:242 #: models.py:242
msgid "enable comments" msgid "enable comments"
msgstr "Kommentare möglich" msgstr "Kommentare möglich"
#: .\content\models.py:247 #: models.py:247
msgid "Template" msgid "Template"
msgstr "Vorlage" msgstr "Vorlage"
#: .\content\models.py:255 #: models.py:255
msgid "first created at" msgid "first created at"
msgstr "erstellt am" msgstr "erstellt am"
#: .\content\models.py:260 #: models.py:260
msgid "latest updated at" msgid "latest updated at"
msgstr "letzte Aktualisierung am" msgstr "letzte Aktualisierung am"
#: .\content\models.py:331 #: models.py:331
msgid "Page" msgid "Page"
msgstr "Seite" msgstr "Seite"
#: .\content\models.py:332 #: models.py:332
msgid "Pages" msgid "Pages"
msgstr "Seiten" msgstr "Seiten"
#: .\content\templates\content\article_archive.html:5 #: templates/content/article_archive.html:5
#: .\content\templates\content\article_archive.html:20 #: templates/content/article_archive.html:20
msgid "Article Archive" msgid "Article Archive"
msgstr "Nachrichtenarchiv" msgstr "Nachrichtenarchiv"
#: .\content\templates\content\article_archive.html:35 #: templates/content/article_archive.html:35
#: .\content\templates\content\article_archive_month.html:5 #: templates/content/article_archive_month.html:5
#: .\content\templates\content\article_archive_year.html:7 #: templates/content/article_archive_year.html:7
msgid "Archive" msgid "Archive"
msgstr "Archiv" msgstr "Archiv"
#: .\content\templates\content\article_archive.html:56 #: templates/content/article_archive.html:56
msgid "All Categories" msgid "All Categories"
msgstr "Alle Kategorien" msgstr "Alle Kategorien"
#: .\content\templates\content\article_archive.html:71 #: templates/content/article_archive.html:71
msgid "created on" msgid "created on"
msgstr "erstellt am" msgstr "erstellt am"
#: .\content\templates\content\article_archive.html:73 #: templates/content/article_archive.html:73
msgid "by" msgid "by"
msgstr "von" msgstr "von"
#: .\content\templates\content\article_archive.html:74 #: templates/content/article_archive.html:74
#: .\content\templates\content\article_archive.html:75 #: templates/content/article_archive.html:75
msgid "comments" msgid "comments"
msgstr "Kommentare" msgstr "Kommentare"
#: .\content\templates\content\article_archive.html:81 #: templates/content/article_archive.html:81
msgid "Read More" msgid "Read More"
msgstr "Mehr lesen" msgstr "Mehr lesen"
#: .\content\templates\content\article_archive.html:86 #: templates/content/article_archive.html:86
msgid "We're sorry. Your search yielded no results." msgid "We're sorry. Your search yielded no results."
msgstr "Es tut uns leid. Deine Suche ergab keine Treffer." msgstr "Es tut uns leid. Deine Suche ergab keine Treffer."
#: .\content\templates\content\article_archive.html:104 #: templates/content/article_archive.html:104
msgid "Add Article" msgid "Add Article"
msgstr "neuer Artikel " msgstr "neuer Artikel "
#: .\content\templates\content\article_archive_month.html:7 #: templates/content/article_archive_month.html:7
msgid "back" msgid "back"
msgstr "Zurück" msgstr "Zurück"
#: .\content\templates\content\article_detail.html:24 #: templates/content/article_detail.html:25
msgid "Created on" msgid "Created on"
msgstr "Erstellt am" msgstr "Erstellt am"
#: .\content\templates\content\article_detail.html:36 #: templates/content/article_detail.html:39
msgid "share on" msgid "share on"
msgstr "Teile auf" msgstr "Teile auf"
#: .\content\templates\content\article_detail.html:51 .\content\views.py:156 #: templates/content/article_detail.html:48 views.py:156
msgid "Edit Article" msgid "Edit Article"
msgstr "Artikel bearbeiten" msgstr "Artikel bearbeiten"
#: .\content\templates\content\article_form.html:32 #: templates/content/article_form.html:32 templates/content/page_form.html:42
#: .\content\templates\content\page_form.html:42 #: templates/content/page_form.html:49
#: .\content\templates\content\page_form.html:49
msgid "German" msgid "German"
msgstr "Deutsch" msgstr "Deutsch"
#: .\content\templates\content\article_form.html:33 #: templates/content/article_form.html:33 templates/content/page_form.html:43
#: .\content\templates\content\page_form.html:43 #: templates/content/page_form.html:57
#: .\content\templates\content\page_form.html:57
msgid "English" msgid "English"
msgstr "Englisch" msgstr "Englisch"
#: .\content\templates\content\article_form.html:59 #: templates/content/article_form.html:59 templates/content/page_form.html:66
#: .\content\templates\content\page_form.html:66
msgid "reset" msgid "reset"
msgstr "Zurücksetzen" msgstr "Zurücksetzen"
#: .\content\templates\content\article_form.html:60 #: templates/content/article_form.html:60 templates/content/page_form.html:67
#: .\content\templates\content\page_form.html:67
msgid "save" msgid "save"
msgstr "Speichern" msgstr "Speichern"
#: .\content\templates\content\page_form.html:5 #: templates/content/page_form.html:5 templates/content/page_form.html:35
#: .\content\templates\content\page_form.html:35
msgid "Edit Page" msgid "Edit Page"
msgstr "Seite bearbeiten" msgstr "Seite bearbeiten"
#: .\content\templates\content\page_form.html:5 #: templates/content/page_form.html:5 templates/content/page_form.html:19
#: .\content\templates\content\page_form.html:19 #: templates/content/page_form.html:35
#: .\content\templates\content\page_form.html:35
msgid "Add Page" msgid "Add Page"
msgstr "Seite hinzufügen" msgstr "Seite hinzufügen"
#: .\content\templates\content\page_form.html:18 #: templates/content/page_form.html:18
msgid "Edit" msgid "Edit"
msgstr "Bearbeiten" msgstr "Bearbeiten"
#: .\content\templates\content\page_form.html:37 #: templates/content/page_form.html:37
msgid "HTML Specific" msgid "HTML Specific"
msgstr "HTML spezifisch" msgstr "HTML spezifisch"
#: .\content\views.py:53 #: views.py:53
msgid "This Category does not exist." msgid "This Category does not exist."
msgstr "Diese Kategorie existiert nicht." msgstr "Diese Kategorie existiert nicht."
#: .\content\views.py:157 #: views.py:157
msgid "Create Article" msgid "Create Article"
msgstr "Artikel erstellen" msgstr "Artikel erstellen"
#: .\content\views.py:233 #: views.py:237
#, python-format #, python-format
msgid "No Page found matching the Path %s" msgid "No Page found matching the Path %s"
msgstr "Keine Seite unter dem Pfad %s gefunden" msgstr "Keine Seite unter dem Pfad %s gefunden"
#: .\content\views.py:262 #: views.py:266
#, python-format #, python-format
msgid "No PDF Document found matching the Path %s" msgid "No PDF Document found matching the Path %s"
msgstr "Kein PDF Dokument unter dem Pfad %s gefunden." msgstr "Kein PDF Dokument unter dem Pfad %s gefunden."

View File

@@ -0,0 +1,58 @@
# Generated by Django 2.1.5 on 2019-01-06 18:54
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('content', '0007_auto_20171214_1215'),
]
operations = [
migrations.AlterField(
model_name='article',
name='status',
field=models.SmallIntegerField(choices=[(-1, 'Rejected'), (0, 'Waiting...'), (1, 'Published')], default=1, verbose_name='Status'),
),
migrations.AlterField(
model_name='page',
name='date_created',
field=models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='erstellt am'),
),
migrations.AlterField(
model_name='page',
name='date_modified',
field=models.DateTimeField(auto_now=True, verbose_name='letzte Aktualisierung am'),
),
migrations.AlterField(
model_name='page',
name='description_de',
field=models.TextField(blank=True, verbose_name='Beschreibung für Suchfunktion'),
),
migrations.AlterField(
model_name='page',
name='description_en',
field=models.TextField(blank=True, verbose_name='Beschreibung für Suchfunktion'),
),
migrations.AlterField(
model_name='page',
name='slug',
field=models.SlugField(help_text='Wie die Seite in der URL aufscheint also http://domain.com/blog/[slug]', max_length=100, verbose_name='Slug'),
),
migrations.AlterField(
model_name='page',
name='status',
field=models.SmallIntegerField(choices=[(-1, 'Rejected'), (0, 'Waiting...'), (1, 'Published')], default=0, verbose_name='Status'),
),
migrations.AlterField(
model_name='page',
name='title_de',
field=models.CharField(help_text='Der Seitentitel der öffentlich angezeigt werden soll', max_length=255, verbose_name='Titel'),
),
migrations.AlterField(
model_name='page',
name='title_en',
field=models.CharField(blank=True, help_text='Der Seitentitel der öffentlich angezeigt werden soll', max_length=255, verbose_name='Title'),
),
]

View File

@@ -69,7 +69,7 @@
<h3><a href="{{article.get_absolute_url}}">{{article.headline}}</a></h3> <h3><a href="{{article.get_absolute_url}}">{{article.headline}}</a></h3>
<ul class="info"> <ul class="info">
<li><span class="fa fa-calendar-o" title="{% trans 'created on' %}"></span> <time <li><span class="fa fa-calendar-o" title="{% trans 'created on' %}"></span> <time
datetime="{{article.date_created|date:'c'}}">{{ article.date_created|date }}</time></li> datetime="{{article.date_created|date:'Y-m-d\TH:i:sO'}}">{{ article.date_created|date }}</time></li>
<li><span class="fa fa-user" title="{% trans 'by' %}"></span> {{ article.author }}</li> <li><span class="fa fa-user" title="{% trans 'by' %}"></span> {{ article.author }}</li>
<li><span class="fa fa-comments" title="{% trans 'comments' %}"></span> <a <li><span class="fa fa-comments" title="{% trans 'comments' %}"></span> <a
href="{{article.get_absolute_url}}#comments" >{{comment_count}} {% trans "comments" %}</a></li> href="{{article.get_absolute_url}}#comments" >{{comment_count}} {% trans "comments" %}</a></li>

View File

@@ -1,5 +1,4 @@
{% extends "base.html" %} {% extends "base.html" %}{% load i18n comments thumbnail %}
{% load i18n comments thumbnail %}
{% block title %}{{ article.headline }}{% endblock %} {% block title %}{{ article.headline }}{% endblock %}
@@ -11,8 +10,7 @@
<meta property="og:url" content="http://www.kasu.at{{ article.get_absolute_url }}"/> <meta property="og:url" content="http://www.kasu.at{{ article.get_absolute_url }}"/>
<meta property="og:image" content="http://www.kasu.at{{article.get_image|thumbnail_url:'article'}}"/> <meta property="og:image" content="http://www.kasu.at{{article.get_image|thumbnail_url:'article'}}"/>
<meta property="og:description" content="{{article.content|striptags|truncatewords:25|force_escape}}"/> <meta property="og:description" content="{{article.content|striptags|truncatewords:25|force_escape}}"/>
<link rel="image_src" type="image/jpeg" href="{{article.get_image|thumbnail_url:'article'}}" /> <link rel="image_src" type="image/jpeg" href="{{article.get_image|thumbnail_url:'article'}}"/>{% endblock %}
{% endblock %}
{% block itemscope %}itemscope itemtype="http://schema.org/Article"{% endblock %} {% block itemscope %}itemscope itemtype="http://schema.org/Article"{% endblock %}
@@ -20,34 +18,31 @@
<h1 itemprop="name">{{article.headline}}</h1> <h1 itemprop="name">{{article.headline}}</h1>
<div id="teaser_text"> <div id="teaser_text">
<ul class="info"> <ul class="info">
<li><span class="fa fa-user"></span> <strong>{% trans 'Author' %}:</strong> <a href="{% url 'membership-details' article.author %}" itemprop="author">{{article.author}}</a></li> <li><span class="fa fa-user"></span> <strong>{% trans 'Author' %}:</strong>
<li><span class="fa fa-calendar-o"></span> <strong>{% trans 'Created on' %}: </strong><time datetime="{{article.date_created|date:'Y-m-d H:i'}}">{{ article.date_created|date:'DATE_FORMAT' }}</time></li> <a href="{% url 'membership-details' article.author %}" itemprop="author">{{article.author}}</a>
<li><span class="fa fa-tag"></span> <strong>{% trans "Category"%}: </strong><a href="{{ article.category.get_absolute_url }}" itemprop="articleSection">{{article.category.name}}</a></li> </li>
<li><span class="fa fa-calendar-o"></span>
<strong>{% trans 'Created on' %}:</strong>
<time datetime="{{article.date_created|date:'Y-m-d\TH:i:sO'}}">{{ article.date_created|date:'DATE_FORMAT' }}</time>
</li>
<li><span class="fa fa-tag"></span> <strong>{% trans "Category"%}:</strong>
<a href="{{ article.category.get_absolute_url }}" itemprop="articleSection">{{article.category.name}}</a>
</li>
</ul> </ul>
</div> </div>{% endblock %}
{% endblock %}
{% block maincontent %} {% block maincontent %}
<div itemprop="articleBody" class="grid_12"> <div itemprop="articleBody" class="grid_12">
<img alt="{{article.category.name}}" src="{{article.get_image|thumbnail_url:'article'}}" class="posting_image" itemprop="image"/> <img alt="{{article.category.name}}" src="{{article.get_image|thumbnail_url:'article'}}" class="posting_image" itemprop="image"/> {{ article.content }}
{{ article.content }}
</div> </div>
<p class="right"> <p class="right">
<strong>{% trans 'share on' %}:</strong> <strong>{% trans 'share on' %}:</strong>
<a class="button" href="https://plus.google.com/share?url=http%3A%2F%2Fwww.kasu.at{{article.get_absolute_url|urlencode}}" <a class="button" href="https://plus.google.com/share?url=http%3A%2F%2Fwww.kasu.at{{article.get_absolute_url|urlencode}}" onclick="javascript:window.open(this.href,'', 'menubar=no,toolbar=no,resizable=yes,scrollbars=yes,height=600,width=600');return false;"><span class="fa fa-google-plus"></span> Google+</a>
onclick="javascript:window.open(this.href,'', 'menubar=no,toolbar=no,resizable=yes,scrollbars=yes,height=600,width=600');return false;"><span class="fa fa-google-plus"></span> Google+</a>
<a class="button" href="https://twitter.com/share?url=http%3A%2F%2Fwww.kasu.at{{article.get_absolute_url|urlencode}}" target='_blank'><span class="fa fa-twitter"></span> Twitter</a> <a class="button" href="https://twitter.com/share?url=http%3A%2F%2Fwww.kasu.at{{article.get_absolute_url|urlencode}}" target='_blank'><span class="fa fa-twitter"></span> Twitter</a>
<a class="button" href="http://facebook.com/sharer.php?u=http%3A%2F%2Fwww.kasu.at{{article.get_absolute_url|urlencode}}?t={{article.headline|urlencode}}" target="_blank"><span class="fa fa-facebook"></span> Facebook</a> <a class="button" href="http://facebook.com/sharer.php?u=http%3A%2F%2Fwww.kasu.at{{article.get_absolute_url|urlencode}}?t={{article.headline|urlencode}}" target="_blank"><span class="fa fa-facebook"></span> Facebook</a>
</p> </p>{% endblock %}
{% endblock %}
{% block comments%} {% block comments%}{% render_comment_list for article %}{% render_comment_form for article %}{% endblock %}
{% render_comment_list for article %}
{% render_comment_form for article %}
{% endblock %}
{% block buttonbar %} {% block buttonbar %}{% if perms.content.change_article %}
{% if perms.content.change_article %} <a href="{% url 'edit-article' article.id %}" class="button"><span class="fa fa-pencil"></span> {% trans "Edit Article" %}</a>{% endif %}{% endblock %}
<a href="{% url 'edit-article' article.id %}" class="button"><span class="fa fa-pencil"></span> {% trans "Edit Article" %}</a>
{% endif %}
{% endblock %}

View File

@@ -179,6 +179,7 @@ class PageAddForm(WYSIWYGEditorMixin, generic.CreateView):
def get_initial(self): def get_initial(self):
"""Try to get the path of the parent page as initial data.""" """Try to get the path of the parent page as initial data."""
if self.kwargs['path']:
path = os.path.splitext(self.kwargs['path'])[0] path = os.path.splitext(self.kwargs['path'])[0]
if path.startswith('/'): if path.startswith('/'):
path = path[1:] path = path[1:]
@@ -186,6 +187,8 @@ class PageAddForm(WYSIWYGEditorMixin, generic.CreateView):
path = path[:-1] path = path[:-1]
parent = models.Page.objects.get(path=path) parent = models.Page.objects.get(path=path)
return {'parent': parent} return {'parent': parent}
else:
return None
class PageEditForm(WYSIWYGEditorMixin, generic.UpdateView): class PageEditForm(WYSIWYGEditorMixin, generic.UpdateView):
@@ -204,7 +207,8 @@ class PageEditForm(WYSIWYGEditorMixin, generic.UpdateView):
:param queryset: Get the single item from this filtered queryset. :param queryset: Get the single item from this filtered queryset.
:return: :return:
""" """
path = os.path.splitext(self.kwargs['path'])[0] path = self.kwargs['path'] or 'index.html'
path = os.path.splitext(path)[0]
queryset = queryset or self.get_queryset() queryset = queryset or self.get_queryset()
if path.startswith('/'): if path.startswith('/'):
path = path[1:] path = path[1:]

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: kasu.events\n" "Project-Id-Version: kasu.events\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-05-08 00:17+0200\n" "POT-Creation-Date: 2019-12-13 23:38+0100\n"
"PO-Revision-Date: 2018-01-12 15:25+0105\n" "PO-Revision-Date: 2018-01-12 15:25+0105\n"
"Last-Translator: b'Christian Berg <kasu@xendynastie.at>'\n" "Last-Translator: b'Christian Berg <kasu@xendynastie.at>'\n"
"Language-Team: Kasu <verein@kasu.at>\n" "Language-Team: Kasu <verein@kasu.at>\n"
@@ -19,58 +19,59 @@ msgstr ""
"X-Generator: Poedit 1.8.9\n" "X-Generator: Poedit 1.8.9\n"
"X-Translated-Using: django-rosetta 0.7.14\n" "X-Translated-Using: django-rosetta 0.7.14\n"
#: .\events\admin.py:14 .\events\models.py:82 #: admin.py:14 models.py:82
msgid "Event Series" msgid "Event Series"
msgstr "Veranstaltungsreihen" msgstr "Veranstaltungsreihen"
#: .\events\forms.py:17 #: forms.py:17
msgid "Images" msgid "Images"
msgstr "Bilder" msgstr "Bilder"
#: .\events\forms.py:46 #: forms.py:46
msgid "start" msgid "start"
msgstr "Beginn" msgstr "Beginn"
#: .\events\forms.py:49 #: forms.py:49
msgid "end" msgid "end"
msgstr "Ende" msgstr "Ende"
#: .\events\models.py:52 .\events\models.py:176 .\events\models.py:217 #: mixins.py:76
msgid "Event does not exist"
msgstr "Veranstaltung gibt es nicht"
#: models.py:52 models.py:176 models.py:217
msgid "Name" msgid "Name"
msgstr "Name" msgstr "Name"
#: .\events\models.py:53 .\events\models.py:177 .\events\models.py:225 #: models.py:53 models.py:177 models.py:225
msgid "Description" msgid "Description"
msgstr "Beschreibung" msgstr "Beschreibung"
#: .\events\models.py:55 .\events\templates\events\event_detail.html:29 #: models.py:55 templates/events/event_detail.html:29
#: .\events\templates\events\event_detail.html:87 #: templates/events/event_detail.html:87 templates/events/event_list.html:28
#: .\events\templates\events\event_list.html:28 #: templates/events/photo_upload.html:13
#: .\events\templates\events\photo_upload.html:13
msgid "Start" msgid "Start"
msgstr "Beginn" msgstr "Beginn"
#: .\events\models.py:56 .\events\templates\events\event_detail.html:30 #: models.py:56 templates/events/event_detail.html:30
#: .\events\templates\events\event_detail.html:89 #: templates/events/event_detail.html:89
msgid "End" msgid "End"
msgstr "Ende" msgstr "Ende"
#: .\events\models.py:57 .\events\models.py:185 #: models.py:57 models.py:185 templates/events/event_detail.html:34
#: .\events\templates\events\event_detail.html:34 #: templates/events/event_detail.html:80 templates/events/event_detail.html:92
#: .\events\templates\events\event_detail.html:80
#: .\events\templates\events\event_detail.html:92
msgid "Homepage" msgid "Homepage"
msgstr "Homepage" msgstr "Homepage"
#: .\events\models.py:59 .\events\models.py:179 .\events\models.py:219 #: models.py:59 models.py:179 models.py:219
msgid "Image" msgid "Image"
msgstr "Bild" msgstr "Bild"
#: .\events\models.py:66 #: models.py:66
msgid "Mahjong Tournament" msgid "Mahjong Tournament"
msgstr "Mahjong Turnier" msgstr "Mahjong Turnier"
#: .\events\models.py:68 #: models.py:68
msgid "" msgid ""
"This event is a tournament, different rules apply for the kyu " "This event is a tournament, different rules apply for the kyu "
"ranking." "ranking."
@@ -78,11 +79,11 @@ msgstr ""
"Diese Veranstaltung ist ein Turnier, es gelten andere Regeln für das Kyu " "Diese Veranstaltung ist ein Turnier, es gelten andere Regeln für das Kyu "
"Ranking." "Ranking."
#: .\events\models.py:72 #: models.py:72
msgid "Mahjong Season" msgid "Mahjong Season"
msgstr "Mahjong Saison" msgstr "Mahjong Saison"
#: .\events\models.py:83 #: models.py:83
msgid "" msgid ""
"Wenn dieser Event zu einer Veranstaltungsreihe gehört werden Ort, " "Wenn dieser Event zu einer Veranstaltungsreihe gehört werden Ort, "
"Beschreibung, Bild und Homepage von dem hier angegebenen Event " "Beschreibung, Bild und Homepage von dem hier angegebenen Event "
@@ -91,248 +92,227 @@ msgstr ""
"Wenn dieser Termin zu einer Veranstaltungsreihe gehört werden Ort, " "Wenn dieser Termin zu einer Veranstaltungsreihe gehört werden Ort, "
"Beschreibung, Bild und Homepage von dem hier angegebenen Event übernommen." "Beschreibung, Bild und Homepage von dem hier angegebenen Event übernommen."
#: .\events\models.py:92 .\events\models.py:195 .\events\models.py:248 #: models.py:92 models.py:195 models.py:248
msgid "first created at" msgid "first created at"
msgstr "erstellt am" msgstr "erstellt am"
#: .\events\models.py:97 .\events\models.py:200 .\events\models.py:253 #: models.py:97 models.py:200 models.py:253
msgid "latest updated at" msgid "latest updated at"
msgstr "letzte Aktualisierung am" msgstr "letzte Aktualisierung am"
#: .\events\models.py:103 #: models.py:103
msgid "Event" msgid "Event"
msgstr "Termin" msgstr "Termin"
#: .\events\models.py:104 #: models.py:104
msgid "Events" msgid "Events"
msgstr "Termine" msgstr "Termine"
#: .\events\models.py:117 #: models.py:117
msgid "A event can't end before it had started" msgid "A event can't end before it had started"
msgstr "Eine Veranstaltung kann nicht enden bevor sie begonnen hat" msgstr "Eine Veranstaltung kann nicht enden bevor sie begonnen hat"
#: .\events\models.py:186 #: models.py:186
msgid "Postal Code" msgid "Postal Code"
msgstr "Postleitzahl" msgstr "Postleitzahl"
#: .\events\models.py:187 #: models.py:187
msgid "Street Address" msgid "Street Address"
msgstr "Straße" msgstr "Straße"
#: .\events\models.py:188 #: models.py:188
msgid "Locality" msgid "Locality"
msgstr "Ort" msgstr "Ort"
#: .\events\models.py:189 #: models.py:189
msgid "Country" msgid "Country"
msgstr "Land" msgstr "Land"
#: .\events\models.py:204 #: models.py:204
msgid "Venue" msgid "Venue"
msgstr "Veranstaltungsort" msgstr "Veranstaltungsort"
#: .\events\models.py:205 #: models.py:205
msgid "Venues" msgid "Venues"
msgstr "Veranstaltungsorte" msgstr "Veranstaltungsorte"
#: .\events\models.py:232 #: models.py:232
msgid "Startpage" msgid "Startpage"
msgstr "Startseite" msgstr "Startseite"
#: .\events\models.py:235 #: models.py:235
msgid "Display this Photo on the Startpage Teaser" msgid "Display this Photo on the Startpage Teaser"
msgstr "Foto als Teaser auf der Startseite verwenden." msgstr "Foto als Teaser auf der Startseite verwenden."
#: .\events\models.py:237 #: models.py:237
msgid "Published on" msgid "Published on"
msgstr "Veröffentlicht am" msgstr "Veröffentlicht am"
#: .\events\models.py:239 #: models.py:239
msgid "Number of views" msgid "Number of views"
msgstr "Wie oft gesehen" msgstr "Wie oft gesehen"
#: .\events\models.py:263 .\events\templates\events\event_archive.html:38 #: models.py:263 templates/events/event_archive.html:38
#: .\events\templates\events\event_list.html:18 #: templates/events/event_list.html:18
msgid "Event Image" msgid "Event Image"
msgstr "Veranstaltungsbild" msgstr "Veranstaltungsbild"
#: .\events\models.py:264 #: models.py:264
msgid "Event Images" msgid "Event Images"
msgstr "Veranstaltungsbilder" msgstr "Veranstaltungsbilder"
#: .\events\templates\events\event_archive.html:5 #: templates/events/event_archive.html:5 templates/events/event_archive.html:9
#: .\events\templates\events\event_archive.html:9
msgid "Event Archive" msgid "Event Archive"
msgstr "Veranstaltungsarchiv" msgstr "Veranstaltungsarchiv"
#: .\events\templates\events\event_archive.html:42 #: templates/events/event_archive.html:42 templates/events/event_detail.html:85
#: .\events\templates\events\event_detail.html:85 #: templates/events/event_list.html:22 templates/events/photo_detail.html:53
#: .\events\templates\events\event_list.html:22
#: .\events\templates\events\photo_detail.html:53
msgid "Date" msgid "Date"
msgstr "Datum" msgstr "Datum"
#: .\events\templates\events\event_archive.html:47 #: templates/events/event_archive.html:47
msgid "Time" msgid "Time"
msgstr "Zeit" msgstr "Zeit"
#: .\events\templates\events\event_archive.html:49 #: templates/events/event_archive.html:49 templates/events/photo_upload.html:16
#: .\events\templates\events\photo_upload.html:16
msgid "from" msgid "from"
msgstr "von" msgstr "von"
#: .\events\templates\events\event_archive.html:49 #: templates/events/event_archive.html:49 templates/events/photo_upload.html:16
#: .\events\templates\events\photo_upload.html:16
msgid "to" msgid "to"
msgstr "bis" msgstr "bis"
#: .\events\templates\events\event_archive.html:57 #: templates/events/event_archive.html:57 templates/events/event_detail.html:31
#: .\events\templates\events\event_detail.html:31 #: templates/events/event_detail.html:72 templates/events/event_list.html:32
#: .\events\templates\events\event_detail.html:72 #: templates/events/photo_upload.html:23
#: .\events\templates\events\event_list.html:32
#: .\events\templates\events\photo_upload.html:23
msgid "Location" msgid "Location"
msgstr "Ort" msgstr "Ort"
#: .\events\templates\events\event_archive.html:58 #: templates/events/event_archive.html:58 templates/events/event_list.html:35
#: .\events\templates\events\event_list.html:35 #: templates/events/photo_upload.html:25 templates/events/photo_upload.html:26
#: .\events\templates\events\photo_upload.html:25
#: .\events\templates\events\photo_upload.html:26
msgid "Comments" msgid "Comments"
msgstr "Kommentare" msgstr "Kommentare"
#: .\events\templates\events\event_archive.html:59 #: templates/events/event_archive.html:59 templates/events/event_detail.html:36
#: .\events\templates\events\event_detail.html:36 #: templates/events/event_detail.html:48 templates/events/photo_list.html:4
#: .\events\templates\events\event_detail.html:48 #: templates/events/photo_upload.html:28 templates/events/photo_upload.html:29
#: .\events\templates\events\photo_list.html:4
#: .\events\templates\events\photo_upload.html:28
#: .\events\templates\events\photo_upload.html:29
msgid "Photos" msgid "Photos"
msgstr "Fotos" msgstr "Fotos"
#: .\events\templates\events\event_archive.html:60 #: templates/events/event_archive.html:60
#: .\events\templates\events\event_archive.html:61 #: templates/events/event_archive.html:61 templates/events/event_detail.html:35
#: .\events\templates\events\event_detail.html:35 #: templates/events/event_detail.html:51
#: .\events\templates\events\event_detail.html:51
msgid "Hanchans" msgid "Hanchans"
msgstr "Hanchans" msgstr "Hanchans"
#: .\events\templates\events\event_detail.html:37 #: templates/events/event_detail.html:37
msgid "tourney" msgid "tourney"
msgstr "Turnier" msgstr "Turnier"
#: .\events\templates\events\event_detail.html:37 #: templates/events/event_detail.html:37
msgid "other rules apply here" msgid "other rules apply here"
msgstr "hier gelten andere Regeln" msgstr "hier gelten andere Regeln"
#: .\events\templates\events\event_detail.html:45 #: templates/events/event_detail.html:45
msgid "Info" msgid "Info"
msgstr "Info" msgstr "Info"
#: .\events\templates\events\event_detail.html:54 #: templates/events/event_detail.html:54
msgid "Mai-Star Games" msgid "Mai-Star Games"
msgstr "Mai-Star Spiele" msgstr "Mai-Star Spiele"
#: .\events\templates\events\event_detail.html:57 #: templates/events/event_detail.html:57
msgid "Event Ranking" msgid "Event Ranking"
msgstr "Veranstaltungs Wertung" msgstr "Veranstaltungs Wertung"
#: .\events\templates\events\event_detail.html:100 #: templates/events/event_detail.html:100
msgid "Share on Facebook" msgid "Share on Facebook"
msgstr "Auf Facebook teilen" msgstr "Auf Facebook teilen"
#: .\events\templates\events\event_detail.html:104 #: templates/events/event_detail.html:104
msgid "Share on Google+" msgid "Share on Google+"
msgstr "Auf Google+ teilen" msgstr "Auf Google+ teilen"
#: .\events\templates\events\event_detail.html:109 #: templates/events/event_detail.html:109
msgid "Share on Twitter" msgid "Share on Twitter"
msgstr "Auf Twitter teilen" msgstr "Auf Twitter teilen"
#: .\events\templates\events\event_detail.html:113 #: templates/events/event_detail.html:113
msgid "Show on Google Maps" msgid "Show on Google Maps"
msgstr "Auf Google Maps zeigen" msgstr "Auf Google Maps zeigen"
#: .\events\templates\events\event_detail.html:127 #: templates/events/event_detail.html:127 templates/events/event_form.html:9
#: .\events\templates\events\event_form.html:9 .\events\views.py:62 #: views.py:62
msgid "Edit Event" msgid "Edit Event"
msgstr "Termin bearbeiten" msgstr "Termin bearbeiten"
#: .\events\templates\events\event_detail.html:131 #: templates/events/event_detail.html:131
msgid "Add Dates" msgid "Add Dates"
msgstr "Termine hinzufügen" msgstr "Termine hinzufügen"
#: .\events\templates\events\event_form.html:9 #: templates/events/event_form.html:9 templates/events/page.html:9 views.py:64
#: .\events\templates\events\page.html:9 .\events\views.py:64
msgid "Add Event" msgid "Add Event"
msgstr "Neuer Termin" msgstr "Neuer Termin"
#: .\events\templates\events\event_form.html:18 #: templates/events/event_form.html:18 templates/events/photo_list.html:35
#: .\events\templates\events\photo_list.html:35
msgid "reset" msgid "reset"
msgstr "Zurücksetzen" msgstr "Zurücksetzen"
#: .\events\templates\events\event_form.html:19 #: templates/events/event_form.html:19
#: .\events\templates\events\eventseries_form.html:25 #: templates/events/eventseries_form.html:25
msgid "save" msgid "save"
msgstr "Speichern" msgstr "Speichern"
#: .\events\templates\events\event_list.html:4 #: templates/events/event_list.html:4 templates/events/event_list.html:5
#: .\events\templates\events\event_list.html:5
msgid "Upcoming Events" msgid "Upcoming Events"
msgstr "Bevorstehende Veranstaltungen" msgstr "Bevorstehende Veranstaltungen"
#: .\events\templates\events\eventseries_form.html:24 #: templates/events/eventseries_form.html:24
msgid "back" msgid "back"
msgstr "Zurück" msgstr "Zurück"
#: .\events\templates\events\photo_confirm_delete.html:17 #: templates/events/photo_confirm_delete.html:17
msgid "Cancel" msgid "Cancel"
msgstr "Abbrechen" msgstr "Abbrechen"
#: .\events\templates\events\photo_confirm_delete.html:21 #: templates/events/photo_confirm_delete.html:21
#: .\events\templates\events\photo_list.html:21 #: templates/events/photo_list.html:21
msgid "Delete" msgid "Delete"
msgstr "Löschen" msgstr "Löschen"
#: .\events\templates\events\photo_detail.html:44 #: templates/events/photo_detail.html:44
msgid "previous" msgid "previous"
msgstr "Zurück" msgstr "Zurück"
#: .\events\templates\events\photo_detail.html:52 #: templates/events/photo_detail.html:52
msgid "Photographer" msgid "Photographer"
msgstr "Fotograf" msgstr "Fotograf"
#: .\events\templates\events\photo_detail.html:58 #: templates/events/photo_detail.html:58
msgid "share on" msgid "share on"
msgstr "Teile auf" msgstr "Teile auf"
#: .\events\templates\events\photo_detail.html:81 #: templates/events/photo_detail.html:81
msgid "download" msgid "download"
msgstr "Herunterladen" msgstr "Herunterladen"
#: .\events\templates\events\photo_detail.html:82 #: templates/events/photo_detail.html:82
msgid "Rotate counter clockwise" msgid "Rotate counter clockwise"
msgstr "mit dem Uhrzeiger drehen" msgstr "mit dem Uhrzeiger drehen"
#: .\events\templates\events\photo_detail.html:83 #: templates/events/photo_detail.html:83
msgid "Rotate clockwise" msgid "Rotate clockwise"
msgstr "gegen den Uhrzeiger drehen" msgstr "gegen den Uhrzeiger drehen"
#: .\events\templates\events\photo_detail.html:84 #: templates/events/photo_detail.html:84
msgid "Save" msgid "Save"
msgstr "Speichern" msgstr "Speichern"
#: .\events\templates\events\photo_list.html:36 #: templates/events/photo_list.html:36 templates/events/photo_upload.html:35
#: .\events\templates\events\photo_upload.html:35 #: templates/events/photo_upload.html:49
#: .\events\templates\events\photo_upload.html:49
msgid "Upload" msgid "Upload"
msgstr "Hochladen" msgstr "Hochladen"
#: .\events\views.py:150
msgid "Event does not exist"
msgstr "Veranstaltung gibt es nicht"
#~ msgid " Edit" #~ msgid " Edit"
#~ msgstr "Bearbeiten" #~ msgstr "Bearbeiten"

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,9 @@
"""Mixins for Events.""" """Mixins for Events."""
from django.db.models import Q
from django.http import Http404 from django.http import Http404
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.utils.translation import ugettext as _
from . import models from . import models
@@ -54,6 +57,20 @@ class EventDetailMixin(object):
self.event = get_object_or_404(models.Event, pk=self.kwargs['pk']) self.event = get_object_or_404(models.Event, pk=self.kwargs['pk'])
queryset = self.model.objects.all() queryset = self.model.objects.all()
else: else:
self.event = get_object_or_404(models.Event, pk=self.kwargs['event']) self.event = get_object_or_404(models.Event,
pk=self.kwargs['event'])
queryset = self.model.objects.filter(event=self.event) queryset = self.model.objects.filter(event=self.event)
return queryset.prefetch_related() return queryset.prefetch_related()
class EventPhotoMixin(EventDetailMixin):
def get_queryset(self):
try:
self.event = models.Event.objects.get(id=self.kwargs['event'])
return models.Photo.objects.filter(
Q(event=self.event) |
Q(event__event_series=self.event)
)
except models.Event.DoesNotExist:
raise Http404(_('Event does not exist'))

View File

@@ -40,7 +40,7 @@
<h4><a href="{{ event.get_absolute_url }}">{{ event.name }}</a></h4> <h4><a href="{{ event.get_absolute_url }}">{{ event.name }}</a></h4>
<p> <p>
<span class="fa fa-calendar-o" title="{% trans 'Date' %}" aria-label="{% trans 'Date' %}"></span> <span class="fa fa-calendar-o" title="{% trans 'Date' %}" aria-label="{% trans 'Date' %}"></span>
<time datetime="{{event.start|date:'c'}}"> <time datetime="{{event.start|date:'Y-m-d\TH:i:sO'}}">
{{ event.start|date:'D' }} {{ event.start|date:'D' }}
{{ event.start|date:'SHORT_DATE_FORMAT' }} {{hanchan.start|time:'H:i'}} {{ event.start|date:'SHORT_DATE_FORMAT' }} {{hanchan.start|time:'H:i'}}
</time> </time>

View File

@@ -20,7 +20,7 @@
<h4><a href="{{ event.get_absolute_url }}">{{ event.name }}</a></h4> <h4><a href="{{ event.get_absolute_url }}">{{ event.name }}</a></h4>
<ul class="info"> <ul class="info">
<li><span class="fa fa-calendar-o" title="{% trans 'Date' %}" aria-label="{% trans 'Date' %}"></span> <li><span class="fa fa-calendar-o" title="{% trans 'Date' %}" aria-label="{% trans 'Date' %}"></span>
<time datetime="{{event.start|date:'c'}}"> <time datetime="{{event.start|date:'Y-m-d\TH:i:sO'}}">
{{ event.start|date:'D' }} {{ event.start|date:'D' }}
{{ event.start|date:'SHORT_DATE_FORMAT' }} {{ event.start|date:'SHORT_DATE_FORMAT' }}
</time> </time>

View File

@@ -5,7 +5,8 @@ from django.contrib.auth import get_user_model
from django.contrib.auth.mixins import PermissionRequiredMixin from django.contrib.auth.mixins import PermissionRequiredMixin
from django.urls import reverse from django.urls import reverse
from django.db.models import Q from django.db.models import Q
from django.http import HttpResponse, Http404 from django.http import Http404
from django.http import HttpResponse
from django.shortcuts import redirect from django.shortcuts import redirect
from django.utils import timezone from django.utils import timezone
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
@@ -75,13 +76,16 @@ class EventForm(PermissionRequiredMixin, mixins.EventDetailMixin,
class EventGallery(generic.ListView): class EventGallery(generic.ListView):
"""Display a overview of all event photo albums.""" """Display a overview of all event photo albums."""
template_name = 'events/photo_gallery.html' template_name = 'events/photo_gallery.html'
paginate_by = 24
def get_queryset(self):
queryset = models.Event.objects.filter( queryset = models.Event.objects.filter(
start__lt=timezone.now(), start__lt=timezone.now(),
event_series__isnull=True, event_series__isnull=True,
photo_count__gt=0 photo_count__gt=0
) )
queryset = queryset.order_by('-start') queryset = queryset.order_by('-start')
paginate_by = 24 return queryset
class EventListIcal(generic.View): class EventListIcal(generic.View):
@@ -110,7 +114,7 @@ class EventListIcal(generic.View):
return response return response
class EventPhoto(mixins.EventDetailMixin, generic.UpdateView): class EventPhoto(mixins.EventPhotoMixin, generic.UpdateView):
"""Display the requested Photo and allows rotation if the user has change """Display the requested Photo and allows rotation if the user has change
permissions.""" permissions."""
form_class = forms.EditPhotoForm form_class = forms.EditPhotoForm
@@ -127,7 +131,7 @@ class EventPhoto(mixins.EventDetailMixin, generic.UpdateView):
return generic.UpdateView.post(self, request, *args, **kwargs) return generic.UpdateView.post(self, request, *args, **kwargs)
class EventPhotoList(mixins.EventDetailMixin, generic.ListView): class EventPhotoList(mixins.EventPhotoMixin, generic.ListView):
"""List all Photos of the event or event series in an album.""" """List all Photos of the event or event series in an album."""
context_object_name = 'photo_list' context_object_name = 'photo_list'
event = None event = None
@@ -139,16 +143,6 @@ class EventPhotoList(mixins.EventDetailMixin, generic.ListView):
initial={'event': self.event, 'photographer': self.request.user}) initial={'event': self.event, 'photographer': self.request.user})
return context return context
def get_queryset(self):
try:
self.event = models.Event.objects.get(id=self.kwargs['event'])
return models.Photo.objects.filter(
Q(event=self.event) |
Q(event__event_series=self.event)
)
except models.Event.DoesNotExist:
raise Http404(_('Event does not exist'))
class EventPhotoUpload(mixins.EventDetailMixin, generic.FormView): class EventPhotoUpload(mixins.EventDetailMixin, generic.FormView):
form_class = forms.PhotoUploadForm form_class = forms.PhotoUploadForm
@@ -187,10 +181,9 @@ class EventSeriesForm(mixins.EventDetailMixin, PermissionRequiredMixin,
InlineFormSetView): InlineFormSetView):
model = models.Event model = models.Event
inline_model = models.Event inline_model = models.Event
fk_name = 'event_series'
fields = ('start', 'end') fields = ('start', 'end')
form_class = forms.EventForm form_class = forms.EventForm
extra = 3 factory_kwargs = {'extra': 3, 'fk_name': 'event_series'}
permission_required = 'events.add_event' permission_required = 'events.add_event'
template_name = 'events/eventseries_form.html' template_name = 'events/eventseries_form.html'
@@ -202,5 +195,7 @@ class EventSeriesForm(mixins.EventDetailMixin, PermissionRequiredMixin,
class UpcomingEvents(generic.ListView): class UpcomingEvents(generic.ListView):
queryset = models.Event.objects.upcoming(limit=None)
paginate_by = 16 paginate_by = 16
def get_queryset(self):
return models.Event.objects.upcoming(limit=None)

View File

@@ -7,9 +7,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: kasu.utils\n" "Project-Id-Version: kasu.utils\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-05-08 00:17+0200\n" "POT-Creation-Date: 2019-12-13 23:38+0100\n"
"PO-Revision-Date: 2016-09-28 00:24+0200\n" "PO-Revision-Date: 2018-12-30 11:14+0105\n"
"Last-Translator: Christian Berg <xeniac.at@gmail.com>\n" "Last-Translator: b' <kasu@xendynastie.at>'\n"
"Language-Team: Kasu <verein@kasu.at>\n" "Language-Team: Kasu <verein@kasu.at>\n"
"Language: de\n" "Language: de\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -17,172 +17,183 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 1.8.9\n" "X-Generator: Poedit 1.8.9\n"
"X-Translated-Using: django-rosetta 0.7.6\n" "X-Translated-Using: django-rosetta 0.9.0\n"
#: .\kasu\settings.py:141 #: settings.py:140
msgid "German" msgid "German"
msgstr "Deutsch" msgstr "Deutsch"
#: .\kasu\settings.py:141 #: settings.py:140
msgid "English" msgid "English"
msgstr "Englisch" msgstr "Englisch"
#: .\kasu\templates\404.html:8 #: templates/404.html:8
msgid "The page your requested does not exist on this server." msgid "The page your requested does not exist on this server."
msgstr "Die angeforderte Seite existiert auf diesem Server nicht." msgstr "Die angeforderte Seite existiert auf diesem Server nicht."
#: .\kasu\templates\base.html:22 #: templates/base.html:22
msgid "Current News" msgid "Current News"
msgstr "Aktuelle Neuigkeiten" msgstr "Aktuelle Neuigkeiten"
#: .\kasu\templates\base.html:24 .\kasu\templates\index.html:40 #: templates/base.html:24 templates/index.html:40
msgid "Recent Comments" msgid "Recent Comments"
msgstr "Kürzliche Kommentare" msgstr "Kürzliche Kommentare"
#: .\kasu\templates\base.html:45 #: templates/base.html:45
msgid "Menu" msgid "Menu"
msgstr "Menü" msgstr "Menü"
#: .\kasu\templates\base.html:69 #: templates/base.html:69
msgid "Current Event" msgid "Current Event"
msgstr "Aktuelle Veranstaltung" msgstr "Aktuelle Veranstaltung"
#: .\kasu\templates\base.html:72 #: templates/base.html:72
msgid "Since" msgid "Since"
msgstr "seit" msgstr "seit"
#: .\kasu\templates\base.html:73 .\kasu\templates\base.html:87 #: templates/base.html:73 templates/base.html:87
msgid "Start" msgid "Start"
msgstr "Beginn" msgstr "Beginn"
#: .\kasu\templates\base.html:76 .\kasu\templates\base.html:90 #: templates/base.html:76 templates/base.html:90
msgid "Location" msgid "Location"
msgstr "Ort" msgstr "Ort"
#: .\kasu\templates\base.html:81 .\kasu\templates\base.html:94 #: templates/base.html:81 templates/base.html:94
msgid "More Details" msgid "More Details"
msgstr "Mehr Details" msgstr "Mehr Details"
#: .\kasu\templates\base.html:83 #: templates/base.html:83
msgid "Next Event" msgid "Next Event"
msgstr "Nächste Veranstaltung" msgstr "Nächste Veranstaltung"
#: .\kasu\templates\base.html:86 #: templates/base.html:86
msgid "in" msgid "in"
msgstr "in" msgstr "in"
#: .\kasu\templates\base.html:97 #: templates/base.html:97
msgid "Upcoming events" msgid "Upcoming events"
msgstr "Bevorstehende Veranstaltungen" msgstr "Bevorstehende Veranstaltungen"
#: .\kasu\templates\base.html:147 #: templates/base.html:107
msgid "No events found"
msgstr "Keine Veranstaltungen gefunden"
#: templates/base.html:149
msgid "Add Subpage" msgid "Add Subpage"
msgstr "Unterseite Hinzufügen" msgstr "Unterseite Hinzufügen"
#: .\kasu\templates\base.html:152 #: templates/base.html:154
msgid "Edit Page" msgid "Edit Page"
msgstr "Seite bearbeiten" msgstr "Seite bearbeiten"
#: .\kasu\templates\base.html:160 #: templates/base.html:162
msgid "Imprint" msgid "Imprint"
msgstr "Impressum" msgstr "Impressum"
#: .\kasu\templates\base.html:161 #: templates/base.html:163
msgid "contact" msgid "contact"
msgstr "Kontakt" msgstr "Kontakt"
#: .\kasu\templates\base.html:166 #: templates/base.html:168
msgid "Language" msgid "Language"
msgstr "Sprache" msgstr "Sprache"
#: .\kasu\templates\base.html:175 #: templates/base.html:177
msgid "Go" msgid "Go"
msgstr "Los" msgstr "Los"
#: .\kasu\templates\base.html:180 #: templates/base.html:182
msgid "Logged in as" msgid "Logged in as"
msgstr "Angemeldet als" msgstr "Angemeldet als"
#: .\kasu\templates\base.html:182 #: templates/base.html:184
msgid "Admin" msgid "Admin"
msgstr "Admin" msgstr "Admin"
#: .\kasu\templates\base.html:183 #: templates/base.html:185
msgid "Logout" msgid "Logout"
msgstr "Abmelden" msgstr "Abmelden"
#: .\kasu\templates\base.html:185 #: templates/base.html:187
msgid "no user logged in" msgid "no user logged in"
msgstr "Niemand angemeldet" msgstr "Niemand angemeldet"
#: .\kasu\templates\base.html:186 .\kasu\templates\comments\form.html:43 #: templates/base.html:188 templates/comments/form.html:43
msgid "register" msgid "register"
msgstr "Registrieren" msgstr "Registrieren"
#: .\kasu\templates\base.html:187 .\kasu\templates\comments\form.html:44 #: templates/base.html:189 templates/comments/form.html:44
msgid "login" msgid "login"
msgstr "anmelden" msgstr "anmelden"
#: .\kasu\templates\comments\form.html:5 #: templates/comments/form.html:5
msgid "New Comment" msgid "New Comment"
msgstr "Neuer Kommentar" msgstr "Neuer Kommentar"
#: .\kasu\templates\comments\form.html:20 #: templates/comments/form.html:20
msgid "now" msgid "now"
msgstr "Jetzt" msgstr "Jetzt"
#: .\kasu\templates\comments\form.html:25 #: templates/comments/form.html:25
msgid "Preview" msgid "Preview"
msgstr "Vorschau" msgstr "Vorschau"
#: .\kasu\templates\comments\form.html:26 #: templates/comments/form.html:26
msgid "Post" msgid "Post"
msgstr "Schreiben" msgstr "Schreiben"
#: .\kasu\templates\comments\form.html:34 #: templates/comments/form.html:34
msgid "not logged in" msgid "not logged in"
msgstr "Nicht angemeldet" msgstr "Nicht angemeldet"
#: .\kasu\templates\comments\form.html:38 #: templates/comments/form.html:38
msgid "Register now, or Login to leave a comment here." msgid "Register now, or Login to leave a comment here."
msgstr "Jetzt registrieren, oder anmelden um einen Kommentar zu schreiben." msgstr "Jetzt registrieren, oder anmelden um einen Kommentar zu schreiben."
#: .\kasu\templates\comments\list.html:2 .\kasu\templates\index.html:25 #: templates/comments/list.html:2 templates/index.html:25
msgid "Comments" msgid "Comments"
msgstr "Kommentare" msgstr "Kommentare"
#: .\kasu\templates\comments\posted.html:4 #: templates/comments/posted.html:4 templates/comments/posted.html:7
#: .\kasu\templates\comments\posted.html:7
msgid "Thank you for your comment" msgid "Thank you for your comment"
msgstr "Danke für deinen Kommentar." msgstr "Danke für deinen Kommentar."
#: .\kasu\templates\comments\preview.html:4 #: templates/comments/preview.html:4 templates/comments/preview.html:6
#: .\kasu\templates\comments\preview.html:6
msgid "Preview your comment" msgid "Preview your comment"
msgstr "Vorschau deines Kommentars" msgstr "Vorschau deines Kommentars"
#: .\kasu\templates\comments\preview.html:10 #: templates/comments/preview.html:10
msgid "Please correct the error below" msgid "Please correct the error below"
msgid_plural "Please correct the errors below" msgid_plural "Please correct the errors below"
msgstr[0] "Bitte den Fehler weiter unten beheben" msgstr[0] "Bitte den Fehler weiter unten beheben"
msgstr[1] "Bitte die Fehler weiter unten beheben" msgstr[1] "Bitte die Fehler weiter unten beheben"
#: .\kasu\templates\index.html:4 #: templates/index.html:4
msgid "traditional Asian game culture" msgid "traditional Asian game culture"
msgstr "traditionelle asiatische Spielkultur" msgstr "traditionelle asiatische Spielkultur"
#: .\kasu\templates\index.html:33 #: templates/index.html:33
msgid "Read More" msgid "Read More"
msgstr "Mehr lesen" msgstr "Mehr lesen"
#: .\kasu\templates\index.html:47 #: templates/index.html:47
#, python-format #, fuzzy, python-format
#| msgid ""
#| "\n"
#| " From <a href=\"%(user_link)s\">%(author)s</a> in\n"
#| " <a href=\"%(comment_link)s\">&ldquo;%(object)s&rdquo;</"
#| "a>\n"
#| " since\n"
#| " <time datetime=\"%(submit_date)s\">%(since)s</time>\n"
#| " "
msgid "" msgid ""
"\n" "\n"
" From <a href=\"%(user_link)s\">%(author)s</a> in\n" " From <a href=\"%(user_link)s\">%(author)s</a> in\n"
" <a href=\"%(comment_link)s\">&ldquo;%(object)s&rdquo;</a>\n" " <a href=\"%(comment_link)s\">&ldquo;%(object)s&rdquo;</a>\n"
" since\n" " since\n"
" <time datetime=\"%(submit_date)s\">%(since)s</time>\n" " <time datetime=\"%(submit_date|date:'Y-m-d\\TH:i:sO')s\">"
"%(since)s</time>\n"
" " " "
msgstr "" msgstr ""
"\n" "\n"
@@ -192,23 +203,23 @@ msgstr ""
" <time datetime=\"%(submit_date)s\">%(since)s</time>\n" " <time datetime=\"%(submit_date)s\">%(since)s</time>\n"
" " " "
#: .\kasu\templates\index.html:59 #: templates/index.html:59
msgid "Kasu in the social network" msgid "Kasu in the social network"
msgstr "Kasu im sozialem Netzwerk" msgstr "Kasu im sozialem Netzwerk"
#: .\kasu\templates\index.html:62 .\kasu\templates\index.html:65 #: templates/index.html:62 templates/index.html:65
msgid "Visit us on" msgid "Visit us on"
msgstr "Besuche uns auf" msgstr "Besuche uns auf"
#: .\kasu\templates\index.html:74 #: templates/index.html:74
msgid "Add Article" msgid "Add Article"
msgstr "Artikel hinzufügen" msgstr "Artikel hinzufügen"
#: .\kasu\templates\paginator.html:8 #: templates/paginator.html:8
msgid "Previous" msgid "Previous"
msgstr "Vorherige" msgstr "Vorherige"
#: .\kasu\templates\paginator.html:20 #: templates/paginator.html:20
msgid "Next" msgid "Next"
msgstr "Nächste" msgstr "Nächste"

View File

@@ -68,17 +68,16 @@ CACHES = {
} }
# Request Middleware # Request Middleware
MIDDLEWARE_CLASSES = [ MIDDLEWARE = [
'csp.middleware.CSPMiddleware', 'csp.middleware.CSPMiddleware',
'django.middleware.security.SecurityMiddleware', 'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware', 'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware', 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.contrib.messages.middleware.MessageMiddleware', 'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.locale.LocaleMiddleware',
'utils.middleware.SetRemoteAddrFromForwardedFor', 'utils.middleware.SetRemoteAddrFromForwardedFor',
'mahjong_ranking.middleware.DenormalizationUpdateMiddleware', 'mahjong_ranking.middleware.DenormalizationUpdateMiddleware',
] ]

View File

@@ -71,7 +71,7 @@
<ul class="fa-ul"> <ul class="fa-ul">
<li><span class="fa-li fa fa-clock-o"></span><strong>{% trans "Since" %}:</strong> {{current_event.start|timesince}}</li> <li><span class="fa-li fa fa-clock-o"></span><strong>{% trans "Since" %}:</strong> {{current_event.start|timesince}}</li>
<li><span class="fa-li fa fa-calendar"></span><strong>{% trans "Start" %}:</strong> <li><span class="fa-li fa fa-calendar"></span><strong>{% trans "Start" %}:</strong>
<time datetime="{{current_event.start|date:'c'}}">{{current_event.start|date:'DATETIME_FORMAT'}}</time> <time datetime="{{current_event.start|date:'Y-m-d\TH:i:sO'}}">{{current_event.start|date:'DATETIME_FORMAT'}}</time>
</li> </li>
<li><span class="fa-li fa fa-map-marker"></span><strong>{% trans "Location" %}:</strong> {{ current_event.location }} <li><span class="fa-li fa fa-map-marker"></span><strong>{% trans "Location" %}:</strong> {{ current_event.location }}
- {{current_event.location.street_address}}, {{current_event.location.postal_code}} {{current_event.location.locality}} - {{current_event.location.street_address}}, {{current_event.location.postal_code}} {{current_event.location.locality}}
@@ -79,13 +79,13 @@
</ul> </ul>
<div class="right"><a class="button" href="{{current_event.get_absolute_url}}"> <div class="right"><a class="button" href="{{current_event.get_absolute_url}}">
{% trans "More Details" %} <span class="fa fa-arrow-right"></span></a></div> {% trans "More Details" %} <span class="fa fa-arrow-right"></span></a></div>
{% else %} {% elif next_event %}
<h2>{% trans "Next Event" %}</h2> <h2>{% trans "Next Event" %}</h2>
<h3>{{ next_event.name}}</h3> <h3>{{ next_event.name}}</h3>
<ul class="fa-ul"> <ul class="fa-ul">
<li><span class="fa-li fa fa-clock-o"></span><strong>{% trans "in" %}:</strong> {{next_event.start|timeuntil}}</li> <li><span class="fa-li fa fa-clock-o"></span><strong>{% trans "in" %}:</strong> {{next_event.start|timeuntil}}</li>
<li><span class="fa-li fa fa-calendar"></span><strong>{% trans "Start" %}:</strong> <li><span class="fa-li fa fa-calendar"></span><strong>{% trans "Start" %}:</strong>
<time datetime="{{next_event.start|date:'c'}}">{{next_event.start|date:'DATETIME_FORMAT' }}</time> <time datetime="{{next_event.start|date:'Y-m-d\TH:i:sO'}}">{{next_event.start|date:'DATETIME_FORMAT' }}</time>
</li> </li>
<li><span class="fa-li fa fa-map-marker"></span><strong>{% trans "Location" %}:</strong> {{ next_event.location }} <li><span class="fa-li fa fa-map-marker"></span><strong>{% trans "Location" %}:</strong> {{ next_event.location }}
- {{next_event.location.street_address}}, {{next_event.location.postal_code}} {{next_event.location.locality}} - {{next_event.location.street_address}}, {{next_event.location.postal_code}} {{next_event.location.locality}}
@@ -101,8 +101,10 @@
{% for event in upcoming_events %} {% for event in upcoming_events %}
<li><span class="fa-li fa fa-calendar-o"></span> <li><span class="fa-li fa fa-calendar-o"></span>
<a href="{{ event.get_absolute_url}}"> <a href="{{ event.get_absolute_url}}">
<time datetime="{{event.start|date:'c'}}">{{event.start|date:'D d. M:'}}</time> <time datetime="{{event.start|date:'Y-m-d\TH:i:sO'}}">{{event.start|date:'D d. M:'}}</time>
{{event.name}}</a></li> {{event.name}}</a></li>
{% empty %}
<li>{% trans 'No events found' %}.</li>
{% endfor %} {% endfor %}
</ul> </ul>
{% endblock %} {% endblock %}

View File

@@ -7,7 +7,7 @@
</div> </div>
<header class="comment_header"> <header class="comment_header">
<h3><a href="{{ comment.user.get_profile.get_absolute_url }}" class="user">{{comment.user}}</a></h3> <h3><a href="{{ comment.user.get_profile.get_absolute_url }}" class="user">{{comment.user}}</a></h3>
<time datetime="{{comment.submit_date|date:'Y-m-d'}}" class="submit_date">{{comment.submit_date|timesince}}</time> <time datetime="{{comment.submit_date|date:'Y-m-d\TH:i:sO'}}" class="submit_date">{{comment.submit_date|timesince}}</time>
</header> </header>
<div class="comment_text">{{comment.comment}}</div> <div class="comment_text">{{comment.comment}}</div>
</article> </article>

View File

@@ -17,7 +17,7 @@
<h2><a href="{{article.get_absolute_url}}">{{article.headline}}</a></h2> <h2><a href="{{article.get_absolute_url}}">{{article.headline}}</a></h2>
<ul class="info"> <ul class="info">
<li><span class="fa fa-calendar"></span> <li><span class="fa fa-calendar"></span>
<time datetime="{{article.date_created|date:'Y-m-d H:i'}}">{{ article.date_created|date:'DATE_FORMAT' }}</time> <time datetime="{{article.date_created|date:'Y-m-d\TH:i:sO'}}">{{ article.date_created|date:'DATE_FORMAT' }}</time>
</li> </li>
<li><span class="fa fa-user"></span> {{ article.author }} <li><span class="fa fa-user"></span> {{ article.author }}
</li> </li>
@@ -48,7 +48,7 @@
From <a href="{{user_link}}">{{author}}</a> in From <a href="{{user_link}}">{{author}}</a> in
<a href="{{comment_link}}">&ldquo;{{object}}&rdquo;</a> <a href="{{comment_link}}">&ldquo;{{object}}&rdquo;</a>
since since
<time datetime="{{submit_date}}">{{since}}</time> <time datetime="{{submit_date|date:'Y-m-d\TH:i:sO'}}">{{since}}</time>
{% endblocktrans %} {% endblocktrans %}
</li> </li>
{% endfor %} {% endfor %}

View File

@@ -29,13 +29,13 @@ sitemaps = {
urlpatterns = [ # Ignore PyLintBear (C0103) urlpatterns = [ # Ignore PyLintBear (C0103)
url(r'^$', views.StartPage.as_view()), url(r'^$', views.StartPage.as_view()),
url(r'^404/$', TemplateView.as_view(template_name='404.html')), url(r'^404/$', TemplateView.as_view(template_name='404.html')),
url(r'^add_page/(?P<path>[\+\.\-\d\w\/]+)/$', url(r'^add_page/(?P<path>[\+\.\-\d\w\/]*)$',
views.PageAddForm.as_view(), name='add-page'), views.PageAddForm.as_view(), name='add-page'),
url(r'^admin/doc/', include('django.contrib.admindocs.urls')), url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
url(r'^admin/', admin.site.urls), url(r'^admin/', admin.site.urls),
url(r'^ckeditor/', include('ckeditor_uploader.urls')), url(r'^ckeditor/', include('ckeditor_uploader.urls')),
url(r'^comments/', include('django_comments.urls')), url(r'^comments/', include('django_comments.urls')),
url(r'^edit_page/(?P<path>[\+\.\-\d\w\/]+)/$', url(r'^edit_page/(?P<path>[\+\.\-\d\w\/]*)$',
views.PageEditForm.as_view(), name='edit-page'), views.PageEditForm.as_view(), name='edit-page'),
url(r'^events/', include('events.urls')), url(r'^events/', include('events.urls')),
url(r'^events.ics$', EventListIcal.as_view(), name='events-ical'), url(r'^events.ics$', EventListIcal.as_view(), name='events-ical'),

View File

@@ -14,8 +14,8 @@ if VENV_PATH not in sys.path:
if SOURCE_PATH not in sys.path: if SOURCE_PATH not in sys.path:
sys.path.append(SOURCE_PATH) sys.path.append(SOURCE_PATH)
from django.core.wsgi import get_wsgi_application # Ignore PyLintBear (C0413) # Ignore PyLintBear (C0413) from django.core.wsgi import get_wsgi_application
os.environ['DJANGO_SETTINGS_MODULE'] = 'kasu.settings' os.environ['DJANGO_SETTINGS_MODULE'] = 'kasu.settings'
application = get_wsgi_application() # Ignore PyLintBear (C0103) # Ignore PyLintBear (C0103) application = get_wsgi_application()

View File

@@ -80,7 +80,8 @@ class Workbook(object):
:rtype: object :rtype: object
""" """
self.workbook = openpyxl.Workbook() self.workbook = openpyxl.Workbook()
[self.workbook.add_named_style(style) for style in XLSX_STYLES.values()] [self.workbook.add_named_style(style)
for style in XLSX_STYLES.values()]
[self.workbook.remove(sheet) for sheet in self.workbook.worksheets] [self.workbook.remove(sheet) for sheet in self.workbook.worksheets]
def generate_sheet(self, title, columns_settings, object_list, def generate_sheet(self, title, columns_settings, object_list,
@@ -135,7 +136,8 @@ class Workbook(object):
# write table footer # write table footer
for column, settings in enumerate(columns_settings, 1): for column, settings in enumerate(columns_settings, 1):
cell = ws.cell(column=column, row=row, value=settings.get('footer')) cell = ws.cell(column=column, row=row,
value=settings.get('footer'))
cell.style = settings['style'] cell.style = settings['style']
row += 1 row += 1

View File

@@ -21,6 +21,8 @@ def recalculate(modeladmin, request, queryset): # Ignore PyLintBear (W0613)
for ladder_ranking in queryset: for ladder_ranking in queryset:
set_dirty(user=ladder_ranking.user_id, set_dirty(user=ladder_ranking.user_id,
season=ladder_ranking.season) season=ladder_ranking.season)
recalculate.short_description = _("Recalculate") recalculate.short_description = _("Recalculate")

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: kasu.mahjong_ranking\n" "Project-Id-Version: kasu.mahjong_ranking\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-05-08 00:17+0200\n" "POT-Creation-Date: 2019-12-13 23:38+0100\n"
"PO-Revision-Date: 2018-05-08 00:20+0105\n" "PO-Revision-Date: 2018-05-08 00:20+0105\n"
"Last-Translator: b'Christian Berg <kasu@xendynastie.at>'\n" "Last-Translator: b'Christian Berg <kasu@xendynastie.at>'\n"
"Language-Team: Kasu <verein@kasu.at>\n" "Language-Team: Kasu <verein@kasu.at>\n"
@@ -19,382 +19,374 @@ msgstr ""
"X-Generator: Poedit 1.8.9\n" "X-Generator: Poedit 1.8.9\n"
"X-Translated-Using: django-rosetta 0.8.1\n" "X-Translated-Using: django-rosetta 0.8.1\n"
#: .\mahjong_ranking\admin.py:24 #: admin.py:24
msgid "Recalculate" msgid "Recalculate"
msgstr "Neuberechnen" msgstr "Neuberechnen"
#: .\mahjong_ranking\admin.py:34 #: admin.py:34
msgid "Confirm" msgid "Confirm"
msgstr "Bestätigen" msgstr "Bestätigen"
#: .\mahjong_ranking\admin.py:44 #: admin.py:44
msgid "Set unconfirmed" msgid "Set unconfirmed"
msgstr "Als unbestätigt markieren" msgstr "Als unbestätigt markieren"
#: .\mahjong_ranking\forms.py:22 #: forms.py:22
msgid "start" msgid "start"
msgstr "Beginn" msgstr "Beginn"
#: .\mahjong_ranking\models.py:91 #: models.py:91 templates/mahjong_ranking/player_dan_score.html:14
#: .\mahjong_ranking\templates\mahjong_ranking\player_dan_score.html:14 #: templates/mahjong_ranking/player_invalid_score.html:13
#: .\mahjong_ranking\templates\mahjong_ranking\player_invalid_score.html:13 #: templates/mahjong_ranking/player_kyu_score.html:15
#: .\mahjong_ranking\templates\mahjong_ranking\player_kyu_score.html:15 #: templates/mahjong_ranking/player_ladder_score.html:15
#: .\mahjong_ranking\templates\mahjong_ranking\player_ladder_score.html:15 #: templates/mahjong_ranking/seasonranking_list.html:10
#: .\mahjong_ranking\templates\mahjong_ranking\seasonranking_list.html:10
msgid "Start" msgid "Start"
msgstr "Beginn" msgstr "Beginn"
#: .\mahjong_ranking\models.py:92 #: models.py:92
msgid "This is crucial to get the right Hanchans that scores" msgid "This is crucial to get the right Hanchans that scores"
msgstr "Wichtig damit die richtigen Hanchans in die Wertung kommen." msgstr "Wichtig damit die richtigen Hanchans in die Wertung kommen."
#: .\mahjong_ranking\models.py:99 #: models.py:99
msgid "Player 1" msgid "Player 1"
msgstr "Spieler 1" msgstr "Spieler 1"
#: .\mahjong_ranking\models.py:100 .\mahjong_ranking\models.py:102 #: models.py:100 models.py:102 models.py:119 models.py:121 models.py:138
#: .\mahjong_ranking\models.py:119 .\mahjong_ranking\models.py:121 #: models.py:140 models.py:157 models.py:159
#: .\mahjong_ranking\models.py:138 .\mahjong_ranking\models.py:140 #: templates/mahjong_ranking/eventhanchan_list.html:19
#: .\mahjong_ranking\models.py:157 .\mahjong_ranking\models.py:159 #: templates/mahjong_ranking/eventranking_list.html:21
#: .\mahjong_ranking\templates\mahjong_ranking\eventhanchan_list.html:19 #: templates/mahjong_ranking/hanchan_confirm_delete.html:16
#: .\mahjong_ranking\templates\mahjong_ranking\eventranking_list.html:21 #: templates/mahjong_ranking/hanchan_form.html:19
#: .\mahjong_ranking\templates\mahjong_ranking\hanchan_confirm_delete.html:16 #: templates/mahjong_ranking/kyudanranking_list.html:30
#: .\mahjong_ranking\templates\mahjong_ranking\hanchan_form.html:19 #: templates/mahjong_ranking/seasonranking_list.html:31
#: .\mahjong_ranking\templates\mahjong_ranking\kyudanranking_list.html:30
#: .\mahjong_ranking\templates\mahjong_ranking\seasonranking_list.html:31
msgid "Score" msgid "Score"
msgstr "Punkte" msgstr "Punkte"
#: .\mahjong_ranking\models.py:112 .\mahjong_ranking\models.py:131 #: models.py:112 models.py:131 models.py:150 models.py:169 models.py:171
#: .\mahjong_ranking\models.py:150 .\mahjong_ranking\models.py:169 #: templates/mahjong_ranking/hanchan_form.html:20
#: .\mahjong_ranking\models.py:171 #: templates/mahjong_ranking/player_dan_score.html:18
#: .\mahjong_ranking\templates\mahjong_ranking\hanchan_form.html:20 #: templates/mahjong_ranking/player_invalid_score.html:17
#: .\mahjong_ranking\templates\mahjong_ranking\player_dan_score.html:18
#: .\mahjong_ranking\templates\mahjong_ranking\player_invalid_score.html:17
msgid "Comment" msgid "Comment"
msgstr "Kommentar" msgstr "Kommentar"
#: .\mahjong_ranking\models.py:118 #: models.py:118
msgid "Player 2" msgid "Player 2"
msgstr "Spieler 2" msgstr "Spieler 2"
#: .\mahjong_ranking\models.py:137 #: models.py:137
msgid "Player 3" msgid "Player 3"
msgstr "Spieler 3" msgstr "Spieler 3"
#: .\mahjong_ranking\models.py:156 #: models.py:156
msgid "Player 4" msgid "Player 4"
msgstr "Spieler 4" msgstr "Spieler 4"
#: .\mahjong_ranking\models.py:173 #: models.py:173
msgid "Has been Confirmed" msgid "Has been Confirmed"
msgstr "Wurde bestätigt" msgstr "Wurde bestätigt"
#: .\mahjong_ranking\models.py:174 #: models.py:174
msgid "Only valid and confirmed Hanchans will be counted in the rating." msgid "Only valid and confirmed Hanchans will be counted in the rating."
msgstr "Nur gültige und bestätigte Hanchans kommen in die Wertung." msgstr "Nur gültige und bestätigte Hanchans kommen in die Wertung."
#: .\mahjong_ranking\models.py:179 .\mahjong_ranking\models.py:607 #: models.py:179 models.py:607 templates/mahjong_ranking/ladder_redbox.html:29
#: .\mahjong_ranking\templates\mahjong_ranking\ladder_redbox.html:29 #: templates/mahjong_ranking/player_ladder_score.html:63
#: .\mahjong_ranking\templates\mahjong_ranking\player_ladder_score.html:63
msgid "Season" msgid "Season"
msgstr "Saison" msgstr "Saison"
#: .\mahjong_ranking\models.py:184 #: models.py:184
msgid "Hanchan" msgid "Hanchan"
msgstr "Hanchan" msgstr "Hanchan"
#: .\mahjong_ranking\models.py:185 #: models.py:185 templates/mahjong_ranking/eventranking_list.html:17
#: .\mahjong_ranking\templates\mahjong_ranking\eventranking_list.html:17
msgid "Hanchans" msgid "Hanchans"
msgstr "Hanchans" msgstr "Hanchans"
#: .\mahjong_ranking\models.py:188 #: models.py:188
msgid "Hanchan from {0:%Y-%m-%d} at {0:%H:%M} with {1}" msgid "Hanchan from {0:%Y-%m-%d} at {0:%H:%M} with {1}"
msgstr "Hanchan vom {0:%Y-%m-%d} um {0:%H:%M} mit {1}" msgstr "Hanchan vom {0:%Y-%m-%d} um {0:%H:%M} mit {1}"
#: .\mahjong_ranking\models.py:215 #: models.py:215
#, python-format #, python-format
msgid "%s can't attend the same game multiple times" msgid "%s can't attend the same game multiple times"
msgstr "%s kann an einem Spiel nicht mehrfach teilnehmen." msgstr "%s kann an einem Spiel nicht mehrfach teilnehmen."
#: .\mahjong_ranking\models.py:223 #: models.py:223
msgid "Games in the future may not be added, Dr. Brown" msgid "Games in the future may not be added, Dr. Brown"
msgstr "Spiele aus der Zukunft dürfen noch nicht erfasst werden. Dr. Brown." msgstr "Spiele aus der Zukunft dürfen noch nicht erfasst werden. Dr. Brown."
#: .\mahjong_ranking\models.py:225 #: models.py:225
msgid "Only games during the event are allowed" msgid "Only games during the event are allowed"
msgstr "Nur Spiele während der Veranstaltung zählen." msgstr "Nur Spiele während der Veranstaltung zählen."
#: .\mahjong_ranking\models.py:228 #: models.py:228
msgid "Gamescore is lower then 100.000 Pt." msgid "Gamescore is lower then 100.000 Pt."
msgstr "Spielstand ist weniger als 100.000 Punkte" msgstr "Spielstand ist weniger als 100.000 Punkte"
#: .\mahjong_ranking\models.py:230 #: models.py:230
msgid "Gamescore is over 100.000 Pt." msgid "Gamescore is over 100.000 Pt."
msgstr "Spielstand ist über 100.000 Punkte." msgstr "Spielstand ist über 100.000 Punkte."
#: .\mahjong_ranking\models.py:362 #: models.py:362
msgid "Kyū/Dan Ranking" msgid "Kyū/Dan Ranking"
msgstr "Kyū/Dan Wertung" msgstr "Kyū/Dan Wertung"
#: .\mahjong_ranking\models.py:363 #: models.py:363
msgid "Kyū/Dan Rankings" msgid "Kyū/Dan Rankings"
msgstr "Kyū/Dan Wertungen" msgstr "Kyū/Dan Wertungen"
#: .\mahjong_ranking\templates\mahjong_ranking\eventhanchan_form.html:11 #: templates/mahjong_ranking/eventhanchan_form.html:11
#: .\mahjong_ranking\templates\mahjong_ranking\eventhanchan_list.html:55 #: templates/mahjong_ranking/eventhanchan_list.html:55
msgid "Edit Hanchans" msgid "Edit Hanchans"
msgstr "Hanchans bearbeiten" msgstr "Hanchans bearbeiten"
#: .\mahjong_ranking\templates\mahjong_ranking\eventhanchan_form.html:49 #: templates/mahjong_ranking/eventhanchan_form.html:49
#: .\mahjong_ranking\templates\mahjong_ranking\hanchan_form.html:58 #: templates/mahjong_ranking/hanchan_form.html:58
msgid "Total" msgid "Total"
msgstr "Total" msgstr "Total"
#: .\mahjong_ranking\templates\mahjong_ranking\eventhanchan_form.html:51 #: templates/mahjong_ranking/eventhanchan_form.html:51
msgid "Difference" msgid "Difference"
msgstr "Unterschied" msgstr "Unterschied"
#: .\mahjong_ranking\templates\mahjong_ranking\eventhanchan_form.html:103 #: templates/mahjong_ranking/eventhanchan_form.html:103
#: .\mahjong_ranking\templates\mahjong_ranking\eventhanchan_list.html:56 #: templates/mahjong_ranking/eventhanchan_list.html:56
#: .\mahjong_ranking\templates\mahjong_ranking\eventranking_list.html:52 #: templates/mahjong_ranking/eventranking_list.html:52
#: .\mahjong_ranking\templates\mahjong_ranking\hanchan_form.html:4 #: templates/mahjong_ranking/hanchan_form.html:4
#: .\mahjong_ranking\templates\mahjong_ranking\hanchan_form.html:14 #: templates/mahjong_ranking/hanchan_form.html:14
msgid "Add Hanchan" msgid "Add Hanchan"
msgstr "Hanchan hinzufügen" msgstr "Hanchan hinzufügen"
#: .\mahjong_ranking\templates\mahjong_ranking\eventhanchan_form.html:105 #: templates/mahjong_ranking/eventhanchan_form.html:105
#: .\mahjong_ranking\templates\mahjong_ranking\eventhanchan_list.html:37 #: templates/mahjong_ranking/eventhanchan_list.html:37
#: .\mahjong_ranking\templates\mahjong_ranking\hanchan_confirm_delete.html:4 #: templates/mahjong_ranking/hanchan_confirm_delete.html:4
#: .\mahjong_ranking\templates\mahjong_ranking\hanchan_confirm_delete.html:33 #: templates/mahjong_ranking/hanchan_confirm_delete.html:33
#: .\mahjong_ranking\templates\mahjong_ranking\player_dan_score.html:44 #: templates/mahjong_ranking/player_dan_score.html:44
#: .\mahjong_ranking\templates\mahjong_ranking\player_invalid_score.html:33 #: templates/mahjong_ranking/player_invalid_score.html:33
#: .\mahjong_ranking\templates\mahjong_ranking\player_kyu_score.html:41 #: templates/mahjong_ranking/player_kyu_score.html:41
#: .\mahjong_ranking\templates\mahjong_ranking\player_ladder_score.html:52 #: templates/mahjong_ranking/player_ladder_score.html:52
msgid "Delete Hanchan" msgid "Delete Hanchan"
msgstr "Hanchan löschen" msgstr "Hanchan löschen"
#: .\mahjong_ranking\templates\mahjong_ranking\eventhanchan_form.html:118 #: templates/mahjong_ranking/eventhanchan_form.html:118
#: .\mahjong_ranking\templates\mahjong_ranking\hanchan_form.html:71 #: templates/mahjong_ranking/hanchan_form.html:71
msgid "back" msgid "back"
msgstr "Zurück" msgstr "Zurück"
#: .\mahjong_ranking\templates\mahjong_ranking\eventhanchan_form.html:119 #: templates/mahjong_ranking/eventhanchan_form.html:119
#: .\mahjong_ranking\templates\mahjong_ranking\hanchan_form.html:72 #: templates/mahjong_ranking/hanchan_form.html:72
msgid "save" msgid "save"
msgstr "Speichern" msgstr "Speichern"
#: .\mahjong_ranking\templates\mahjong_ranking\eventhanchan_list.html:7 #: templates/mahjong_ranking/eventhanchan_list.html:7
msgid "Played Hanchans" msgid "Played Hanchans"
msgstr "Gespielte Hanchans" msgstr "Gespielte Hanchans"
#: .\mahjong_ranking\templates\mahjong_ranking\eventhanchan_list.html:18 #: templates/mahjong_ranking/eventhanchan_list.html:18
#: .\mahjong_ranking\templates\mahjong_ranking\hanchan_confirm_delete.html:15 #: templates/mahjong_ranking/hanchan_confirm_delete.html:15
msgid "Place" msgid "Place"
msgstr "Platz" msgstr "Platz"
#: .\mahjong_ranking\templates\mahjong_ranking\eventhanchan_list.html:21 #: templates/mahjong_ranking/eventhanchan_list.html:21
#: .\mahjong_ranking\templates\mahjong_ranking\hanchan_confirm_delete.html:18 #: templates/mahjong_ranking/hanchan_confirm_delete.html:18
#: .\mahjong_ranking\templates\mahjong_ranking\player_dan_score.html:17 #: templates/mahjong_ranking/player_dan_score.html:17
msgid "Dan Points" msgid "Dan Points"
msgstr "Dan Punkte" msgstr "Dan Punkte"
#: .\mahjong_ranking\templates\mahjong_ranking\eventhanchan_list.html:23 #: templates/mahjong_ranking/eventhanchan_list.html:23
#: .\mahjong_ranking\templates\mahjong_ranking\hanchan_confirm_delete.html:20 #: templates/mahjong_ranking/hanchan_confirm_delete.html:20
#: .\mahjong_ranking\templates\mahjong_ranking\player_invalid_score.html:16 #: templates/mahjong_ranking/player_invalid_score.html:16
#: .\mahjong_ranking\templates\mahjong_ranking\player_kyu_score.html:18 #: templates/mahjong_ranking/player_kyu_score.html:18
msgid "Kyu Points" msgid "Kyu Points"
msgstr "Kyu Punkte" msgstr "Kyu Punkte"
#: .\mahjong_ranking\templates\mahjong_ranking\eventhanchan_list.html:43 #: templates/mahjong_ranking/eventhanchan_list.html:43
#: .\mahjong_ranking\templates\mahjong_ranking\hanchan_form.html:4 #: templates/mahjong_ranking/hanchan_form.html:4
#: .\mahjong_ranking\templates\mahjong_ranking\hanchan_form.html:14 #: templates/mahjong_ranking/hanchan_form.html:14
#: .\mahjong_ranking\templates\mahjong_ranking\player_dan_score.html:47 #: templates/mahjong_ranking/player_dan_score.html:47
#: .\mahjong_ranking\templates\mahjong_ranking\player_invalid_score.html:36 #: templates/mahjong_ranking/player_invalid_score.html:36
#: .\mahjong_ranking\templates\mahjong_ranking\player_kyu_score.html:44 #: templates/mahjong_ranking/player_kyu_score.html:44
#: .\mahjong_ranking\templates\mahjong_ranking\player_ladder_score.html:55 #: templates/mahjong_ranking/player_ladder_score.html:55
msgid "Edit Hanchan" msgid "Edit Hanchan"
msgstr "Hanchan bearbeiten" msgstr "Hanchan bearbeiten"
#: .\mahjong_ranking\templates\mahjong_ranking\eventhanchan_list.html:48 #: templates/mahjong_ranking/eventhanchan_list.html:48
msgid "No Hanchan has been added to this event yet." msgid "No Hanchan has been added to this event yet."
msgstr "Für diese Veranstaltung wurde noch keine Hanchan eingetragen." msgstr "Für diese Veranstaltung wurde noch keine Hanchan eingetragen."
#: .\mahjong_ranking\templates\mahjong_ranking\eventhanchan_list.html:54 #: templates/mahjong_ranking/eventhanchan_list.html:54
#: .\mahjong_ranking\templates\mahjong_ranking\eventranking_list.html:51 #: templates/mahjong_ranking/eventranking_list.html:51
msgid "Edit Event" msgid "Edit Event"
msgstr "Veranstaltung bearbeiten" msgstr "Veranstaltung bearbeiten"
#: .\mahjong_ranking\templates\mahjong_ranking\eventranking_list.html:4 #: templates/mahjong_ranking/eventranking_list.html:4
#: .\mahjong_ranking\templates\mahjong_ranking\eventranking_list.html:5 #: templates/mahjong_ranking/eventranking_list.html:5
msgid "Tournament Ranking" msgid "Tournament Ranking"
msgstr "Turnierwertung" msgstr "Turnierwertung"
#: .\mahjong_ranking\templates\mahjong_ranking\eventranking_list.html:12 #: templates/mahjong_ranking/eventranking_list.html:12
#: .\mahjong_ranking\templates\mahjong_ranking\kyudanranking_list.html:25 #: templates/mahjong_ranking/kyudanranking_list.html:25
#: .\mahjong_ranking\templates\mahjong_ranking\seasonranking_list.html:23 #: templates/mahjong_ranking/seasonranking_list.html:23
msgid "Rank" msgid "Rank"
msgstr "Rang" msgstr "Rang"
#: .\mahjong_ranking\templates\mahjong_ranking\eventranking_list.html:13 #: templates/mahjong_ranking/eventranking_list.html:13
#: .\mahjong_ranking\templates\mahjong_ranking\kyudanranking_list.html:17 #: templates/mahjong_ranking/kyudanranking_list.html:17
#: .\mahjong_ranking\templates\mahjong_ranking\seasonranking_list.html:24 #: templates/mahjong_ranking/seasonranking_list.html:24
msgid "Avatar" msgid "Avatar"
msgstr "Avatar" msgstr "Avatar"
#: .\mahjong_ranking\templates\mahjong_ranking\eventranking_list.html:14 #: templates/mahjong_ranking/eventranking_list.html:14
#: .\mahjong_ranking\templates\mahjong_ranking\kyudanranking_list.html:20 #: templates/mahjong_ranking/kyudanranking_list.html:20
#: .\mahjong_ranking\templates\mahjong_ranking\seasonranking_list.html:25 #: templates/mahjong_ranking/seasonranking_list.html:25
msgid "Nickname" msgid "Nickname"
msgstr "Spitzname" msgstr "Spitzname"
#: .\mahjong_ranking\templates\mahjong_ranking\eventranking_list.html:15 #: templates/mahjong_ranking/eventranking_list.html:15
msgid "Name" msgid "Name"
msgstr "Name" msgstr "Name"
#: .\mahjong_ranking\templates\mahjong_ranking\eventranking_list.html:16 #: templates/mahjong_ranking/eventranking_list.html:16
#: .\mahjong_ranking\templates\mahjong_ranking\seasonranking_list.html:26 #: templates/mahjong_ranking/seasonranking_list.html:26
msgid "Average" msgid "Average"
msgstr "Durchschnitt" msgstr "Durchschnitt"
#: .\mahjong_ranking\templates\mahjong_ranking\eventranking_list.html:20 #: templates/mahjong_ranking/eventranking_list.html:20
#: .\mahjong_ranking\templates\mahjong_ranking\player_dan_score.html:15 #: templates/mahjong_ranking/player_dan_score.html:15
#: .\mahjong_ranking\templates\mahjong_ranking\player_invalid_score.html:15 #: templates/mahjong_ranking/player_invalid_score.html:15
#: .\mahjong_ranking\templates\mahjong_ranking\player_kyu_score.html:16 #: templates/mahjong_ranking/player_kyu_score.html:16
#: .\mahjong_ranking\templates\mahjong_ranking\player_ladder_score.html:16 #: templates/mahjong_ranking/player_ladder_score.html:16
#: .\mahjong_ranking\templates\mahjong_ranking\seasonranking_list.html:30 #: templates/mahjong_ranking/seasonranking_list.html:30
msgid "Placement" msgid "Placement"
msgstr "Platzierung" msgstr "Platzierung"
#: .\mahjong_ranking\templates\mahjong_ranking\eventranking_list.html:22 #: templates/mahjong_ranking/eventranking_list.html:22
#: .\mahjong_ranking\templates\mahjong_ranking\seasonranking_list.html:32 #: templates/mahjong_ranking/seasonranking_list.html:32
msgid "count" msgid "count"
msgstr "Anzahl" msgstr "Anzahl"
#: .\mahjong_ranking\templates\mahjong_ranking\eventranking_list.html:23 #: templates/mahjong_ranking/eventranking_list.html:23
#: .\mahjong_ranking\templates\mahjong_ranking\seasonranking_list.html:33 #: templates/mahjong_ranking/seasonranking_list.html:33
msgid "good" msgid "good"
msgstr "gut" msgstr "gut"
#: .\mahjong_ranking\templates\mahjong_ranking\eventranking_list.html:24 #: templates/mahjong_ranking/eventranking_list.html:24
#: .\mahjong_ranking\templates\mahjong_ranking\seasonranking_list.html:34 #: templates/mahjong_ranking/seasonranking_list.html:34
msgid "won" msgid "won"
msgstr "gewonnen" msgstr "gewonnen"
#: .\mahjong_ranking\templates\mahjong_ranking\hanchan_confirm_delete.html:39 #: templates/mahjong_ranking/hanchan_confirm_delete.html:39
msgid "Cancel" msgid "Cancel"
msgstr "Abbruch" msgstr "Abbruch"
#: .\mahjong_ranking\templates\mahjong_ranking\hanchan_confirm_delete.html:40 #: templates/mahjong_ranking/hanchan_confirm_delete.html:40
msgid "Delete" msgid "Delete"
msgstr "Löschen" msgstr "Löschen"
#: .\mahjong_ranking\templates\mahjong_ranking\hanchan_form.html:18 #: templates/mahjong_ranking/hanchan_form.html:18
msgid "Player" msgid "Player"
msgstr "Spieler" msgstr "Spieler"
#: .\mahjong_ranking\templates\mahjong_ranking\kyudanranking_list.html:4 #: templates/mahjong_ranking/kyudanranking_list.html:4
#: .\mahjong_ranking\templates\mahjong_ranking\kyudanranking_list.html:9 #: templates/mahjong_ranking/kyudanranking_list.html:9
#| msgid "Player List"
msgid "Players list" msgid "Players list"
msgstr "Spielerliste" msgstr "Spielerliste"
#: .\mahjong_ranking\templates\mahjong_ranking\kyudanranking_list.html:35 #: templates/mahjong_ranking/kyudanranking_list.html:35
msgid "Games Total" msgid "Games Total"
msgstr "Spiele total" msgstr "Spiele total"
#: .\mahjong_ranking\templates\mahjong_ranking\ladder_redbox.html:3 #: templates/mahjong_ranking/ladder_redbox.html:3
msgid "Latest Hanchans" msgid "Latest Hanchans"
msgstr "Letzten Hanchans" msgstr "Letzten Hanchans"
#: .\mahjong_ranking\templates\mahjong_ranking\ladder_redbox.html:15 #: templates/mahjong_ranking/ladder_redbox.html:15
msgid "Latest Events" msgid "Latest Events"
msgstr "Letzte Veranstaltungen" msgstr "Letzte Veranstaltungen"
#: .\mahjong_ranking\templates\mahjong_ranking\ladder_redbox.html:27 #: templates/mahjong_ranking/ladder_redbox.html:27
msgid "Ladder Archive" msgid "Ladder Archive"
msgstr "Ladder Archiv" msgstr "Ladder Archiv"
#: .\mahjong_ranking\templates\mahjong_ranking\player_dan_score.html:4 #: templates/mahjong_ranking/player_dan_score.html:4
#: .\mahjong_ranking\templates\mahjong_ranking\player_dan_score.html:5 #: templates/mahjong_ranking/player_dan_score.html:5
msgid "Dan Score for" msgid "Dan Score for"
msgstr "Dan Wertung für" msgstr "Dan Wertung für"
#: .\mahjong_ranking\templates\mahjong_ranking\player_dan_score.html:8 #: templates/mahjong_ranking/player_dan_score.html:8
msgid "Hanchans that apply to the Dan Score" msgid "Hanchans that apply to the Dan Score"
msgstr "Hanchans welche zur Dan Wertung zählen" msgstr "Hanchans welche zur Dan Wertung zählen"
#: .\mahjong_ranking\templates\mahjong_ranking\player_dan_score.html:12 #: templates/mahjong_ranking/player_dan_score.html:12
#: .\mahjong_ranking\templates\mahjong_ranking\player_kyu_score.html:13 #: templates/mahjong_ranking/player_kyu_score.html:13
#: .\mahjong_ranking\templates\mahjong_ranking\player_ladder_score.html:13 #: templates/mahjong_ranking/player_ladder_score.html:13
msgid "Date" msgid "Date"
msgstr "Datum" msgstr "Datum"
#: .\mahjong_ranking\templates\mahjong_ranking\player_dan_score.html:13 #: templates/mahjong_ranking/player_dan_score.html:13
#: .\mahjong_ranking\templates\mahjong_ranking\player_invalid_score.html:12 #: templates/mahjong_ranking/player_invalid_score.html:12
#: .\mahjong_ranking\templates\mahjong_ranking\player_kyu_score.html:14 #: templates/mahjong_ranking/player_kyu_score.html:14
#: .\mahjong_ranking\templates\mahjong_ranking\player_ladder_score.html:14 #: templates/mahjong_ranking/player_ladder_score.html:14
msgid "Event" msgid "Event"
msgstr "Veranstaltung" msgstr "Veranstaltung"
#: .\mahjong_ranking\templates\mahjong_ranking\player_dan_score.html:16 #: templates/mahjong_ranking/player_dan_score.html:16
#: .\mahjong_ranking\templates\mahjong_ranking\player_invalid_score.html:14 #: templates/mahjong_ranking/player_invalid_score.html:14
#: .\mahjong_ranking\templates\mahjong_ranking\player_kyu_score.html:17 #: templates/mahjong_ranking/player_kyu_score.html:17
#: .\mahjong_ranking\templates\mahjong_ranking\player_ladder_score.html:17 #: templates/mahjong_ranking/player_ladder_score.html:17
msgid "Players" msgid "Players"
msgstr "Spieler" msgstr "Spieler"
#: .\mahjong_ranking\templates\mahjong_ranking\player_invalid_score.html:4 #: templates/mahjong_ranking/player_invalid_score.html:4
#: .\mahjong_ranking\templates\mahjong_ranking\player_invalid_score.html:6 #: templates/mahjong_ranking/player_invalid_score.html:6
msgid "Unconfirmed Hanchans from" msgid "Unconfirmed Hanchans from"
msgstr "Nicht bestätigte Hanchans von" msgstr "Nicht bestätigte Hanchans von"
#: .\mahjong_ranking\templates\mahjong_ranking\player_invalid_score.html:9 #: templates/mahjong_ranking/player_invalid_score.html:9
msgid "Invalid hanchans with" msgid "Invalid hanchans with"
msgstr "Ungültige Hanchans mit" msgstr "Ungültige Hanchans mit"
#: .\mahjong_ranking\templates\mahjong_ranking\player_kyu_score.html:4 #: templates/mahjong_ranking/player_kyu_score.html:4
#: .\mahjong_ranking\templates\mahjong_ranking\player_kyu_score.html:6 #: templates/mahjong_ranking/player_kyu_score.html:6
msgid "Kyu Score for" msgid "Kyu Score for"
msgstr "Kyu Wertung für" msgstr "Kyu Wertung für"
#: .\mahjong_ranking\templates\mahjong_ranking\player_kyu_score.html:9 #: templates/mahjong_ranking/player_kyu_score.html:9
msgid "Hanchans that apply to the Kyu Score" msgid "Hanchans that apply to the Kyu Score"
msgstr "Hanchans welche zur Kyu Wertung zählen" msgstr "Hanchans welche zur Kyu Wertung zählen"
#: .\mahjong_ranking\templates\mahjong_ranking\player_ladder_score.html:4 #: templates/mahjong_ranking/player_ladder_score.html:4
#: .\mahjong_ranking\templates\mahjong_ranking\player_ladder_score.html:5 #: templates/mahjong_ranking/player_ladder_score.html:5
msgid "Ladder Score for" msgid "Ladder Score for"
msgstr "Ladder Wertung für" msgstr "Ladder Wertung für"
#: .\mahjong_ranking\templates\mahjong_ranking\player_ladder_score.html:8 #: templates/mahjong_ranking/player_ladder_score.html:8
msgid "Hanchans that apply to the Ladder Score" msgid "Hanchans that apply to the Ladder Score"
msgstr "Hanchans welche in der Ladder zählen" msgstr "Hanchans welche in der Ladder zählen"
#: .\mahjong_ranking\templates\mahjong_ranking\player_ladder_score.html:71 #: templates/mahjong_ranking/player_ladder_score.html:71
msgid "Go" msgid "Go"
msgstr "Los" msgstr "Los"
#: .\mahjong_ranking\templates\mahjong_ranking\seasonranking_list.html:11 #: templates/mahjong_ranking/seasonranking_list.html:11
msgid "End" msgid "End"
msgstr "Ende" msgstr "Ende"
#: .\mahjong_ranking\templates\mahjong_ranking\seasonranking_list.html:12 #: templates/mahjong_ranking/seasonranking_list.html:12
msgid "Participants" msgid "Participants"
msgstr "Teilnehmer" msgstr "Teilnehmer"
#: .\mahjong_ranking\views.py:104 #: views.py:116
#, python-format #, python-format
msgid "%s has been updated successfully." msgid "%s has been updated successfully."
msgstr "%s wurde erfolgreich aktualisiert." msgstr "%s wurde erfolgreich aktualisiert."
#: .\mahjong_ranking\views.py:107 #: views.py:119
#, python-format #, python-format
msgid "%s has been added successfully. You can now add a new one." msgid "%s has been added successfully. You can now add a new one."
msgstr "%s wurde erfolgreich hinzugefügt. Du kannst eine neue eintragen." msgstr "%s wurde erfolgreich hinzugefügt. Du kannst eine neue eintragen."
#: .\mahjong_ranking\views.py:207 #: views.py:219
msgid "No user found matching the name {}" msgid "No user found matching the name {}"
msgstr "Kein Benutzer mit dem Namen %s gefunden" msgstr "Kein Benutzer mit dem Namen %s gefunden"

View File

@@ -3,11 +3,13 @@ Rest all dan points to 0 at a given date.
""" """
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from datetime import date, datetime, time from datetime import datetime
from datetime import time
from mahjong_ranking import models from mahjong_ranking import models
from django.utils.dateparse import parse_date from django.utils.dateparse import parse_date
from django.utils import timezone from django.utils import timezone
class Command(BaseCommand): class Command(BaseCommand):
""" Recalculate all Kyu/Dan Rankings """ """ Recalculate all Kyu/Dan Rankings """
@@ -22,7 +24,8 @@ class Command(BaseCommand):
legacy_attrs.remove('legacy_date') legacy_attrs.remove('legacy_date')
reset_date = timezone.make_aware(datetime.combine( reset_date = timezone.make_aware(datetime.combine(
options.get('reset_date'), time(23, 59, 59))) options.get('reset_date'), time(23, 59, 59)))
models.KyuDanRanking.objects.update(until=reset_date, force_recalc=True) models.KyuDanRanking.objects.update(
until=reset_date, force_recalc=True)
for ranking in models.KyuDanRanking.objects.filter(dan__gt=0): for ranking in models.KyuDanRanking.objects.filter(dan__gt=0):
print(ranking) print(ranking)
ranking.dan = 1 ranking.dan = 1

View File

@@ -1,12 +1,27 @@
"""Middleware to defer slow denormalization at the end of a request.""" """Middleware to defer slow denormalization at the end of a request."""
from django.core.cache import cache from django.core.cache import cache
from mahjong_ranking import models from mahjong_ranking import models
from . import LOGGER from . import LOGGER
from . import LOGGER
class DenormalizationUpdateMiddleware(object): # Ignore PyLintBear (R0903) class DenormalizationUpdateMiddleware:
"""To recalculate everything in the queues at the end of a POST request.""" """To recalculate everything in the queues at the end of a POST request."""
def __init__(self, get_response=None):
self.get_response = get_response
super().__init__()
def __call__(self, request):
response = None
if hasattr(self, 'process_request'):
response = self.process_request(request)
response = response or self.get_response(request)
if hasattr(self, 'process_response'):
response = self.process_response(request, response)
return response
def process_response(self, request, response): # Ignore PyLintBear (R0201) def process_response(self, request, response): # Ignore PyLintBear (R0201)
"""Check and process the recalculation queues on each POST request. """Check and process the recalculation queues on each POST request.
@@ -16,7 +31,6 @@ class DenormalizationUpdateMiddleware(object): # Ignore PyLintBear (R0903)
""" """
event_queue = set() event_queue = set()
season_queue = set() season_queue = set()
if request.method != 'POST': if request.method != 'POST':
return response return response

View File

@@ -29,7 +29,8 @@ class EventRanking(models.Model):
Sie beschränken sich aber auf einen Event und werden nur dann angestossen, Sie beschränken sich aber auf einen Event und werden nur dann angestossen,
wenn der Event als Turnier markiert wurde. wenn der Event als Turnier markiert wurde.
""" """
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT) user = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.PROTECT)
event = models.ForeignKey(Event, on_delete=models.CASCADE) event = models.ForeignKey(Event, on_delete=models.CASCADE)
placement = models.PositiveIntegerField(blank=True, null=True) placement = models.PositiveIntegerField(blank=True, null=True)
avg_placement = models.FloatField(default=4) avg_placement = models.FloatField(default=4)
@@ -428,7 +429,8 @@ class KyuDanRanking(models.Model):
).order_by('-start') ).order_by('-start')
last_hanchan_this_event = hanchans_this_event[0] last_hanchan_this_event = hanchans_this_event[0]
# Das braucht nur am Ende eines Turnieres gemacht werden. # Das braucht nur am Ende eines Turnieres gemacht werden.
if hanchan != last_hanchan_this_event: return False if hanchan != last_hanchan_this_event:
return False
event_ranking = EventRanking.objects.get( event_ranking = EventRanking.objects.get(
user=self.user, user=self.user,
event=hanchan.event event=hanchan.event
@@ -603,7 +605,8 @@ class KyuDanRanking(models.Model):
class SeasonRanking(models.Model): class SeasonRanking(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT) user = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.PROTECT)
season = models.PositiveSmallIntegerField(_('Season')) season = models.PositiveSmallIntegerField(_('Season'))
placement = models.PositiveIntegerField(blank=True, null=True) placement = models.PositiveIntegerField(blank=True, null=True)
avg_placement = models.FloatField(blank=True, null=True) avg_placement = models.FloatField(blank=True, null=True)

View File

@@ -5,7 +5,7 @@
{% for hanchan in latest_hanchan_list %} {% for hanchan in latest_hanchan_list %}
<li><span class="fa-li fa fa-table"></span> <li><span class="fa-li fa fa-table"></span>
<a href="{% url 'event-hanchan-list' hanchan.event_id %}"> <a href="{% url 'event-hanchan-list' hanchan.event_id %}">
<time datetime="{{ hanchan.start|date:'c' }}">{{ hanchan.start|date:'D' }} <time datetime="{{ hanchan.start|date:'Y-m-d\TH:i:sO' }}">{{ hanchan.start|date:'D' }}
{{ hanchan.start|date:'SHORT_DATE_FORMAT' }} {{hanchan.start|time:'H:i'}} {{ hanchan.start|date:'SHORT_DATE_FORMAT' }} {{hanchan.start|time:'H:i'}}
</time></a>:<br /> </time></a>:<br />
<small>{{hanchan.player_names}}</small> <small>{{hanchan.player_names}}</small>
@@ -18,7 +18,7 @@
<li> <li>
<span class="fa-li fa fa-calendar-o"></span> <span class="fa-li fa fa-calendar-o"></span>
<a href="{% url 'event-hanchan-list' event.pk %}"> <a href="{% url 'event-hanchan-list' event.pk %}">
<time datetime="{{event.start|date:'c'}}">{{ event.start|date:'D' }} {{ event.start|date:'SHORT_DATE_FORMAT' }}</time>: <time datetime="{{event.start|date:'Y-m-d\TH:i:sO'}}">{{ event.start|date:'D' }} {{ event.start|date:'SHORT_DATE_FORMAT' }}</time>:
{{event.name}}</a></li> {{event.name}}</a></li>
{% endfor %} {% endfor %}
</ul> </ul>

View File

@@ -49,7 +49,7 @@
</tr> </tr>
{% empty %} {% empty %}
<tr> <tr>
<td colspan="9">Leider hat es noch niemand in das Ranking geschafft. <td colspan="8">Leider hat es noch niemand in das Ranking geschafft.
Ein Spieler wird erst ins Ranking genommen wenn er 5 Hanchans absolviert hat. Ein Spieler wird erst ins Ranking genommen wenn er 5 Hanchans absolviert hat.
</td> </td>
</tr> </tr>

View File

@@ -36,4 +36,3 @@ urlpatterns = [ # Ignore PyLintBear (C0103)
url(r'^mahjong/(?P<order_by>[\+\-][a-z_]+)/$', url(r'^mahjong/(?P<order_by>[\+\-][a-z_]+)/$',
views.KyuDanRankingList.as_view(), name="kyudanranking-list"), views.KyuDanRankingList.as_view(), name="kyudanranking-list"),
] ]

View File

@@ -160,7 +160,6 @@ class EventHanchanForm(EventDetailMixin, PermissionRequiredMixin,
return self.render_to_response(context) return self.render_to_response(context)
class EventHanchanList(EventDetailMixin, generic.ListView): class EventHanchanList(EventDetailMixin, generic.ListView):
"List all hanchans played on a given event." "List all hanchans played on a given event."
model = models.Hanchan model = models.Hanchan

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: kasu.mahjong_ranking\n" "Project-Id-Version: kasu.mahjong_ranking\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-05-08 00:17+0200\n" "POT-Creation-Date: 2019-12-13 23:38+0100\n"
"PO-Revision-Date: 2016-09-28 00:24+0200\n" "PO-Revision-Date: 2016-09-28 00:24+0200\n"
"Last-Translator: Christian Berg <xeniac.at@gmail.com>\n" "Last-Translator: Christian Berg <xeniac.at@gmail.com>\n"
"Language-Team: Kasu <verein@kasu.at>\n" "Language-Team: Kasu <verein@kasu.at>\n"
@@ -19,208 +19,205 @@ msgstr ""
"X-Generator: Poedit 1.8.9\n" "X-Generator: Poedit 1.8.9\n"
"X-Translated-Using: django-rosetta 0.7.2\n" "X-Translated-Using: django-rosetta 0.7.2\n"
#: .\maistar_ranking\admin.py:24 #: admin.py:24
msgid "Recalculate" msgid "Recalculate"
msgstr "Neuberechnen" msgstr "Neuberechnen"
#: .\maistar_ranking\forms.py:35 #: forms.py:35
#, python-format #, python-format
msgid "%s may only participate once." msgid "%s may only participate once."
msgstr "%s darf nur einmal teilnehmen." msgstr "%s darf nur einmal teilnehmen."
#: .\maistar_ranking\models.py:21 #: models.py:21
msgid "Comment" msgid "Comment"
msgstr "Kommentar" msgstr "Kommentar"
#: .\maistar_ranking\models.py:24 #: models.py:24
msgid "Player 1" msgid "Player 1"
msgstr "Spieler 1" msgstr "Spieler 1"
#: .\maistar_ranking\models.py:26 .\maistar_ranking\models.py:33 #: models.py:26 models.py:33 models.py:40 models.py:47 models.py:54
#: .\maistar_ranking\models.py:40 .\maistar_ranking\models.py:47 #: models.py:61 templates/maistar_ranking/ranking_list.html:19
#: .\maistar_ranking\models.py:54 .\maistar_ranking\models.py:61
#: .\maistar_ranking\templates\maistar_ranking\ranking_list.html:19
msgid "Score" msgid "Score"
msgstr "Punkte" msgstr "Punkte"
#: .\maistar_ranking\models.py:31 #: models.py:31
msgid "Player 2" msgid "Player 2"
msgstr "Spieler 2" msgstr "Spieler 2"
#: .\maistar_ranking\models.py:38 #: models.py:38
msgid "Player 3" msgid "Player 3"
msgstr "Spieler 3" msgstr "Spieler 3"
#: .\maistar_ranking\models.py:45 #: models.py:45
msgid "Player 4" msgid "Player 4"
msgstr "Spieler 4" msgstr "Spieler 4"
#: .\maistar_ranking\models.py:52 #: models.py:52
msgid "Player 5" msgid "Player 5"
msgstr "Spieler 5" msgstr "Spieler 5"
#: .\maistar_ranking\models.py:59 #: models.py:59
msgid "Player 6" msgid "Player 6"
msgstr "Spieler 6" msgstr "Spieler 6"
#: .\maistar_ranking\models.py:65 #: models.py:65
msgid "Has been confirmed" msgid "Has been confirmed"
msgstr "Wurde bestätigt" msgstr "Wurde bestätigt"
#: .\maistar_ranking\models.py:67 #: models.py:67
msgid "the game only counts whe it has been confirmed" msgid "the game only counts whe it has been confirmed"
msgstr "das Spiel zählt nur wenn es bestätigt wurde" msgstr "das Spiel zählt nur wenn es bestätigt wurde"
#: .\maistar_ranking\models.py:70 .\maistar_ranking\models.py:153 #: models.py:70 models.py:153 templates/maistar_ranking/player_game_list.html:6
#: .\maistar_ranking\templates\maistar_ranking\player_game_list.html:6 #: templates/maistar_ranking/ranking_list.html:4
#: .\maistar_ranking\templates\maistar_ranking\ranking_list.html:4 #: templates/maistar_ranking/ranking_list.html:72
#: .\maistar_ranking\templates\maistar_ranking\ranking_list.html:72
msgid "Season" msgid "Season"
msgstr "Saison" msgstr "Saison"
#: .\maistar_ranking\models.py:80 #: models.py:80
msgid "Mai-Star Game with {0} from {1:%Y-%m-%d}" msgid "Mai-Star Game with {0} from {1:%Y-%m-%d}"
msgstr "Mai-Star Spiel mit {0} vom {1:%Y-%m-%d}" msgstr "Mai-Star Spiel mit {0} vom {1:%Y-%m-%d}"
#: .\maistar_ranking\templates\maistar_ranking\game_form.html:5 #: templates/maistar_ranking/game_form.html:5
#: .\maistar_ranking\templates\maistar_ranking\game_form.html:16 #: templates/maistar_ranking/game_form.html:16
#: .\maistar_ranking\templates\maistar_ranking\game_list.html:27 #: templates/maistar_ranking/game_list.html:27
#: .\maistar_ranking\templates\maistar_ranking\player_game_list.html:44 #: templates/maistar_ranking/player_game_list.html:44
msgid "Edit Game" msgid "Edit Game"
msgstr "Spiel bearbeiten" msgstr "Spiel bearbeiten"
#: .\maistar_ranking\templates\maistar_ranking\game_form.html:5 #: templates/maistar_ranking/game_form.html:5
#: .\maistar_ranking\templates\maistar_ranking\game_form.html:16 #: templates/maistar_ranking/game_form.html:16
#: .\maistar_ranking\templates\maistar_ranking\game_list.html:41 #: templates/maistar_ranking/game_list.html:41
msgid "Add Game" msgid "Add Game"
msgstr "Spiel hinzufügen" msgstr "Spiel hinzufügen"
#: .\maistar_ranking\templates\maistar_ranking\game_form.html:76 #: templates/maistar_ranking/game_form.html:76
msgid "Back" msgid "Back"
msgstr "Zurück" msgstr "Zurück"
#: .\maistar_ranking\templates\maistar_ranking\game_form.html:77 #: templates/maistar_ranking/game_form.html:77
msgid "Save" msgid "Save"
msgstr "Speichern" msgstr "Speichern"
#: .\maistar_ranking\templates\maistar_ranking\game_list.html:4 #: templates/maistar_ranking/game_list.html:4
#: .\maistar_ranking\templates\maistar_ranking\player_game_list.html:6 #: templates/maistar_ranking/player_game_list.html:6
msgid "Mai-Star Games" msgid "Mai-Star Games"
msgstr "Mai-Star Spiele" msgstr "Mai-Star Spiele"
#: .\maistar_ranking\templates\maistar_ranking\game_list.html:7 #: templates/maistar_ranking/game_list.html:7
msgid "Played Mai-Star Games" msgid "Played Mai-Star Games"
msgstr "Gespielte Mai-Star Spiele" msgstr "Gespielte Mai-Star Spiele"
#: .\maistar_ranking\templates\maistar_ranking\game_list.html:11 #: templates/maistar_ranking/game_list.html:11
msgid "Game" msgid "Game"
msgstr "Spiel" msgstr "Spiel"
#: .\maistar_ranking\templates\maistar_ranking\game_list.html:14 #: templates/maistar_ranking/game_list.html:14
msgid "Place" msgid "Place"
msgstr "Platz" msgstr "Platz"
#: .\maistar_ranking\templates\maistar_ranking\game_list.html:19 #: templates/maistar_ranking/game_list.html:19
#: .\maistar_ranking\templates\maistar_ranking\player_game_list.html:36 #: templates/maistar_ranking/player_game_list.html:36
msgid "Points" msgid "Points"
msgstr "Punkte" msgstr "Punkte"
#: .\maistar_ranking\templates\maistar_ranking\game_list.html:24 #: templates/maistar_ranking/game_list.html:24
#: .\maistar_ranking\templates\maistar_ranking\player_game_list.html:41 #: templates/maistar_ranking/player_game_list.html:41
msgid "Delete Game" msgid "Delete Game"
msgstr "Spiel löschen" msgstr "Spiel löschen"
#: .\maistar_ranking\templates\maistar_ranking\game_list.html:33 #: templates/maistar_ranking/game_list.html:33
msgid "No Mai-Star games have been added to this event yet." msgid "No Mai-Star games have been added to this event yet."
msgstr "Für diese Veranstaltung wurden noch keine Mai-Star Spiele erfasst." msgstr "Für diese Veranstaltung wurden noch keine Mai-Star Spiele erfasst."
#: .\maistar_ranking\templates\maistar_ranking\game_list.html:40 #: templates/maistar_ranking/game_list.html:40
msgid "Edit Event" msgid "Edit Event"
msgstr "Veranstaltung bearbeiten" msgstr "Veranstaltung bearbeiten"
#: .\maistar_ranking\templates\maistar_ranking\hanchan_confirm_delete.html:4 #: templates/maistar_ranking/hanchan_confirm_delete.html:4
#: .\maistar_ranking\templates\maistar_ranking\hanchan_confirm_delete.html:10 #: templates/maistar_ranking/hanchan_confirm_delete.html:10
msgid "Delete game" msgid "Delete game"
msgstr "Spiel löschen" msgstr "Spiel löschen"
#: .\maistar_ranking\templates\maistar_ranking\hanchan_confirm_delete.html:13 #: templates/maistar_ranking/hanchan_confirm_delete.html:13
msgid "Cancel" msgid "Cancel"
msgstr "Abbrechen" msgstr "Abbrechen"
#: .\maistar_ranking\templates\maistar_ranking\hanchan_confirm_delete.html:14 #: templates/maistar_ranking/hanchan_confirm_delete.html:14
msgid "Delete" msgid "Delete"
msgstr "Löschen" msgstr "Löschen"
#: .\maistar_ranking\templates\maistar_ranking\page.html:5 #: templates/maistar_ranking/page.html:5
msgid "Archive" msgid "Archive"
msgstr "Archiv" msgstr "Archiv"
#: .\maistar_ranking\templates\maistar_ranking\page.html:7 #: templates/maistar_ranking/page.html:7
msgid "Add Event" msgid "Add Event"
msgstr "Veranstaltung hinzufügen" msgstr "Veranstaltung hinzufügen"
#: .\maistar_ranking\templates\maistar_ranking\player_game_list.html:4 #: templates/maistar_ranking/player_game_list.html:4
msgid "Ladder Score for" msgid "Ladder Score for"
msgstr "Ladder Wertung für" msgstr "Ladder Wertung für"
#: .\maistar_ranking\templates\maistar_ranking\player_game_list.html:9 #: templates/maistar_ranking/player_game_list.html:9
msgid "Mai-Star Games with" msgid "Mai-Star Games with"
msgstr "Mai-Star Spiele mit" msgstr "Mai-Star Spiele mit"
#: .\maistar_ranking\templates\maistar_ranking\player_game_list.html:14 #: templates/maistar_ranking/player_game_list.html:14
msgid "Date" msgid "Date"
msgstr "Datum" msgstr "Datum"
#: .\maistar_ranking\templates\maistar_ranking\player_game_list.html:15 #: templates/maistar_ranking/player_game_list.html:15
msgid "Event" msgid "Event"
msgstr "Veranstaltung" msgstr "Veranstaltung"
#: .\maistar_ranking\templates\maistar_ranking\player_game_list.html:16 #: templates/maistar_ranking/player_game_list.html:16
msgid "Players" msgid "Players"
msgstr "Spieler" msgstr "Spieler"
#: .\maistar_ranking\templates\maistar_ranking\ranking_list.html:4 #: templates/maistar_ranking/ranking_list.html:4
msgid "Mai-Star Ranking" msgid "Mai-Star Ranking"
msgstr "Mai-Star Platzierung" msgstr "Mai-Star Platzierung"
#: .\maistar_ranking\templates\maistar_ranking\ranking_list.html:10 #: templates/maistar_ranking/ranking_list.html:10
#: .\maistar_ranking\templates\maistar_ranking\ranking_list.html:18 #: templates/maistar_ranking/ranking_list.html:18
msgid "Placement" msgid "Placement"
msgstr "Platzierung" msgstr "Platzierung"
#: .\maistar_ranking\templates\maistar_ranking\ranking_list.html:11 #: templates/maistar_ranking/ranking_list.html:11
msgid "Avatar" msgid "Avatar"
msgstr "Avatar" msgstr "Avatar"
#: .\maistar_ranking\templates\maistar_ranking\ranking_list.html:12 #: templates/maistar_ranking/ranking_list.html:12
msgid "Nickname" msgid "Nickname"
msgstr "Spitzname" msgstr "Spitzname"
#: .\maistar_ranking\templates\maistar_ranking\ranking_list.html:13 #: templates/maistar_ranking/ranking_list.html:13
msgid "Name" msgid "Name"
msgstr "Name" msgstr "Name"
#: .\maistar_ranking\templates\maistar_ranking\ranking_list.html:14 #: templates/maistar_ranking/ranking_list.html:14
msgid "Average" msgid "Average"
msgstr "Durchschnitt" msgstr "Durchschnitt"
#: .\maistar_ranking\templates\maistar_ranking\ranking_list.html:15 #: templates/maistar_ranking/ranking_list.html:15
msgid "Games" msgid "Games"
msgstr "Spiele" msgstr "Spiele"
#: .\maistar_ranking\templates\maistar_ranking\ranking_list.html:20 #: templates/maistar_ranking/ranking_list.html:20
msgid "count" msgid "count"
msgstr "Anzahl" msgstr "Anzahl"
#: .\maistar_ranking\templates\maistar_ranking\ranking_list.html:21 #: templates/maistar_ranking/ranking_list.html:21
msgid "good" msgid "good"
msgstr "Gut" msgstr "Gut"
#: .\maistar_ranking\templates\maistar_ranking\ranking_list.html:22 #: templates/maistar_ranking/ranking_list.html:22
msgid "won" msgid "won"
msgstr "Gewonnen" msgstr "Gewonnen"
#: .\maistar_ranking\templates\maistar_ranking\ranking_list.html:43 #: templates/maistar_ranking/ranking_list.html:43
msgid "" msgid ""
"Unfortunately, nobody has it been done in the ranking.\n" "Unfortunately, nobody has it been done in the ranking.\n"
" A player must have 6 games done, to be added to the ranking." " A player must have 6 games done, to be added to the ranking."
@@ -229,15 +226,15 @@ msgstr ""
"als 6 Spiele innerhalb einer Saison absolviert haben, werden für das " "als 6 Spiele innerhalb einer Saison absolviert haben, werden für das "
"Endergebnis nicht gewertet." "Endergebnis nicht gewertet."
#: .\maistar_ranking\templates\maistar_ranking\ranking_list.html:52 #: templates/maistar_ranking/ranking_list.html:52
msgid "Latest Games" msgid "Latest Games"
msgstr "Letzten Spiele" msgstr "Letzten Spiele"
#: .\maistar_ranking\templates\maistar_ranking\ranking_list.html:63 #: templates/maistar_ranking/ranking_list.html:63
msgid "Latest Events" msgid "Latest Events"
msgstr "Letzten Veranstaltungen" msgstr "Letzten Veranstaltungen"
#: .\maistar_ranking\templates\maistar_ranking\ranking_list.html:70 #: templates/maistar_ranking/ranking_list.html:70
msgid "Ladder Archive" msgid "Ladder Archive"
msgstr "Archiv" msgstr "Archiv"

View File

@@ -149,7 +149,8 @@ class Game(models.Model):
class Ranking(models.Model): class Ranking(models.Model):
"""the player scores in the ladder for one season. """ """the player scores in the ladder for one season. """
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT) user = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.PROTECT)
season = models.PositiveSmallIntegerField(_("Season")) season = models.PositiveSmallIntegerField(_("Season"))
placement = models.PositiveIntegerField(blank=True, null=True) placement = models.PositiveIntegerField(blank=True, null=True)
avg_placement = models.PositiveSmallIntegerField(blank=True, null=True) avg_placement = models.PositiveSmallIntegerField(blank=True, null=True)

View File

@@ -5,7 +5,6 @@ from django.urls import reverse
from events.models import Event from events.models import Event
class MaistarGamesSitemap(GenericSitemap): class MaistarGamesSitemap(GenericSitemap):
@staticmethod @staticmethod
def items(): def items():

View File

@@ -51,17 +51,22 @@ def clear_personal_data(modeladmin, request, queryset):
raise PermissionDenied raise PermissionDenied
for membership in queryset: for membership in queryset:
if membership.membership == False: if membership.membership == False:
[ setattr(membership, fieldname, None) for fieldname in membership.nullable_personal_data ] [setattr(membership, fieldname, None)
[ setattr(membership, fieldname, "") for fieldname in membership.blankable_personal_data ] for fieldname in membership.nullable_personal_data]
[setattr(membership, fieldname, "")
for fieldname in membership.blankable_personal_data]
membership.is_active = False membership.is_active = False
membership.confirmed = False membership.confirmed = False
membership.membership = False membership.membership = False
membership.save() membership.save()
cleared_memberships += 1 cleared_memberships += 1
else: else:
modeladmin.message_user(request, _("Can't remove personal data from active member %s.") % membership.username, messages.ERROR) modeladmin.message_user(request, _(
"Can't remove personal data from active member %s.") % membership.username, messages.ERROR)
if cleared_memberships > 0: if cleared_memberships > 0:
modeladmin.message_user(request, _("Cleared %d personal data profiles.") % cleared_memberships, messages.INFO) modeladmin.message_user(request, _(
"Cleared %d personal data profiles.") % cleared_memberships, messages.INFO)
clear_personal_data.short_description = _("Clear personal Data") clear_personal_data.short_description = _("Clear personal Data")

View File

@@ -3,7 +3,7 @@ Created on 03.10.2011
@author: Christian @author: Christian
""" """
from datetime import date, timedelta from datetime import date
from captcha.fields import ReCaptchaField from captcha.fields import ReCaptchaField
from django import forms from django import forms
from django.conf import settings from django.conf import settings
@@ -25,18 +25,14 @@ class MembershipForm(forms.ModelForm):
help_text=_('Input format: yyyy-mm-dd') help_text=_('Input format: yyyy-mm-dd')
) )
email = forms.EmailField(label=_('Email'), required=True) email = forms.EmailField(label=_('Email'), required=True)
required_membership_fields = ( required_membership_fields = ('first_name', 'last_name', 'birthday')
'first_name', 'last_name', 'birthday',
'street_name', 'post_code', 'city'
)
class Meta: class Meta:
"""get the user model dyamicly""" """get the user model dyamicly"""
model = auth.get_user_model() model = auth.get_user_model()
fields = ( fields = (
'username', 'gender', 'first_name', 'last_name', 'email', 'avatar', 'username', 'email', 'avatar',
'website', 'membership', 'birthday', 'telephone', 'street_name', 'membership', 'first_name', 'last_name', 'birthday',
'post_code', 'city'
) )
def clean(self): def clean(self):
@@ -86,7 +82,6 @@ class RegistrationForm(MembershipForm):
"""Metadata to localize and customize the ModelForm.""" """Metadata to localize and customize the ModelForm."""
model = auth.get_user_model() model = auth.get_user_model()
fields = ('first_name', 'last_name', 'username', 'email', fields = ('first_name', 'last_name', 'username', 'email',
'username', 'gender', 'first_name', 'last_name', 'email',
'avatar', 'avatar',
'membership', 'birthday', 'telephone', 'membership', 'birthday', 'telephone',
'street_name', 'street_name',

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: kasu.membership\n" "Project-Id-Version: kasu.membership\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-05-08 00:17+0200\n" "POT-Creation-Date: 2019-12-13 23:38+0100\n"
"PO-Revision-Date: 2018-05-08 00:19+0105\n" "PO-Revision-Date: 2018-05-08 00:19+0105\n"
"Last-Translator: b'Christian Berg <kasu@xendynastie.at>'\n" "Last-Translator: b'Christian Berg <kasu@xendynastie.at>'\n"
"Language-Team: Kasu <verein@kasu.at>\n" "Language-Team: Kasu <verein@kasu.at>\n"
@@ -19,101 +19,95 @@ msgstr ""
"X-Generator: Poedit 1.8.9\n" "X-Generator: Poedit 1.8.9\n"
"X-Translated-Using: django-rosetta 0.8.1\n" "X-Translated-Using: django-rosetta 0.8.1\n"
#: .\membership\__init__.py:11 #: __init__.py:11
msgid "Male" msgid "Male"
msgstr "Männlich" msgstr "Männlich"
#: .\membership\__init__.py:12 #: __init__.py:12
msgid "Female" msgid "Female"
msgstr "Weiblich" msgstr "Weiblich"
#: .\membership\admin.py:22 #: admin.py:22
msgid "Activate selected User" msgid "Activate selected User"
msgstr "Ausgewählte Benutzer freischalten" msgstr "Ausgewählte Benutzer freischalten"
#: .\membership\admin.py:39 #: admin.py:39
msgid "Cleanup selected Activation Requests" msgid "Cleanup selected Activation Requests"
msgstr "Ausgewählte Aktivierungsanfragen bereinigen" msgstr "Ausgewählte Aktivierungsanfragen bereinigen"
#: .\membership\admin.py:62 #: admin.py:62
#, python-format #, python-format
msgid "Can't remove personal data from active member %s." msgid "Can't remove personal data from active member %s."
msgstr "" msgstr ""
"Persönliche Daten von aktiven Mitglied %s können nicht entfernt werden." "Persönliche Daten von aktiven Mitglied %s können nicht entfernt werden."
#: .\membership\admin.py:64 #: admin.py:64
#, python-format #, python-format
msgid "Cleared %d personal data profiles." msgid "Cleared %d personal data profiles."
msgstr "Persönliche Daten in %d Profilen entfernt." msgstr "Persönliche Daten in %d Profilen entfernt."
#: .\membership\admin.py:66 #: admin.py:66
msgid "Clear personal Data" msgid "Clear personal Data"
msgstr "Persönliche Daten bereinigen" msgstr "Persönliche Daten bereinigen"
#: .\membership\admin.py:75 #: admin.py:75
msgid "Group" msgid "Group"
msgstr "Gruppe" msgstr "Gruppe"
#: .\membership\admin.py:76 #: admin.py:76
msgid "Groups" msgid "Groups"
msgstr "Gruppen" msgstr "Gruppen"
#: .\membership\admin.py:102 .\membership\forms.py:78 #: admin.py:102 forms.py:73 models.py:163 models.py:218
#: .\membership\models.py:163 .\membership\models.py:218
msgid "Membership" msgid "Membership"
msgstr "Mitgliedschaft" msgstr "Mitgliedschaft"
#: .\membership\admin.py:107 #: admin.py:107
msgid "Permissions" msgid "Permissions"
msgstr "Berechtigung" msgstr "Berechtigung"
#: .\membership\admin.py:109 #: admin.py:109
msgid "Important dates" msgid "Important dates"
msgstr "Wichtige Daten" msgstr "Wichtige Daten"
#: .\membership\forms.py:24 #: forms.py:23 templates/membership/membership_detail.html:46
#: .\membership\templates\membership\membership_detail.html:46
msgid "birthday" msgid "birthday"
msgstr "Geburtstag" msgstr "Geburtstag"
#: .\membership\forms.py:26 #: forms.py:25
msgid "Input format: yyyy-mm-dd" msgid "Input format: yyyy-mm-dd"
msgstr "Eingabeformat: tt.mm.jjjj" msgstr "Eingabeformat: tt.mm.jjjj"
#: .\membership\forms.py:28 #: forms.py:27 templates/membership/membership_detail.html:48
#: .\membership\templates\membership\membership_detail.html:48
msgid "Email" msgid "Email"
msgstr "E-Mail" msgstr "E-Mail"
#: .\membership\forms.py:45 #: forms.py:40
msgid "" msgid ""
"For your membership, we need this. Please fill out this field " "For your membership, we need this. Please fill out this field "
"yet." "yet."
msgstr "Diese Angabe wird für eine Mitgliedschaft benötigt, bitte ausfüllen." msgstr "Diese Angabe wird für eine Mitgliedschaft benötigt, bitte ausfüllen."
#: .\membership\forms.py:69 #: forms.py:64
msgid "password" msgid "password"
msgstr "Passwort" msgstr "Passwort"
#: .\membership\forms.py:71 #: forms.py:66
msgid "password (again)" msgid "password (again)"
msgstr "Passwort (wiederholen)" msgstr "Passwort (wiederholen)"
#: .\membership\forms.py:73 #: forms.py:68
msgid "Privacy policy" msgid "Privacy policy"
msgstr "Datenschutzerklärung" msgstr "Datenschutzerklärung"
#: .\membership\forms.py:75 #: forms.py:70
#, python-format #, python-format
msgid "I have read and understood the <a href=\"%s\">privacy policy</a>" msgid "I have read and understood the <a href=\"%s\">privacy policy</a>"
msgstr "" msgstr ""
"Ich habe die <a href=\"%s\"> Datenschutzerklärung</a> gelesen und verstanden" "Ich habe die <a href=\"%s\"> Datenschutzerklärung</a> gelesen und verstanden"
#: .\membership\forms.py:80 #: forms.py:75
#, python-format #, python-format
#| msgid ""
#| "Yes, I confirm that I am in agreement with the statutes and would "
#| "like to become a member."
msgid "" msgid ""
"Yes, I confirm that I am in agreement with the <a href=\"%s\">statutes</a> " "Yes, I confirm that I am in agreement with the <a href=\"%s\">statutes</a> "
"and would like to become a member." "and would like to become a member."
@@ -121,114 +115,115 @@ msgstr ""
"Ja, ich bin mit den <a href=\"%s\">Statuen</a> einverstanden und möchte " "Ja, ich bin mit den <a href=\"%s\">Statuen</a> einverstanden und möchte "
"Mitglied werden." "Mitglied werden."
#: .\membership\forms.py:105 #: forms.py:99
msgid "This username is already taken. Please choose another." msgid "This username is already taken. Please choose another."
msgstr "" msgstr "Diesen Benutzername ist schon vergeben. Bitte einen anderen auswählen."
"Diesen Benutzername ist schon vergeben. Bitte einen anderen auswählen."
#: .\membership\forms.py:112 #: forms.py:106
msgid "" msgid ""
"This email address is already in use. Please supply a different " "This email address is already in use. Please supply a different "
"email address." "email address."
msgstr "Die E-Mail Adresse wird schon verwendet. Bitte eine andere angeben." msgstr "Die E-Mail Adresse wird schon verwendet. Bitte eine andere angeben."
#: .\membership\forms.py:122 #: forms.py:116
msgid "The two password fields didn't match." msgid "The two password fields didn't match."
msgstr "Die beiden Passwörter passen nicht." msgstr "Die beiden Passwörter passen nicht."
#: .\membership\models.py:84 #: models.py:84
msgid "user" msgid "user"
msgstr "Benutzer" msgstr "Benutzer"
#: .\membership\models.py:86 #: models.py:86
msgid "activation key" msgid "activation key"
msgstr "Aktivierungsschlüssel" msgstr "Aktivierungsschlüssel"
#: .\membership\models.py:90 #: models.py:90
msgid "pending activation" msgid "pending activation"
msgstr "Ausstehende Aktivierung" msgstr "Ausstehende Aktivierung"
#: .\membership\models.py:91 #: models.py:91
msgid "pending activations" msgid "pending activations"
msgstr "Wartende Aktivierungen" msgstr "Wartende Aktivierungen"
#: .\membership\models.py:94 #: models.py:94
#, python-format #, python-format
msgid "user registration for %s" msgid "user registration for %s"
msgstr "Benutzerregistrierung für %s" msgstr "Benutzerregistrierung für %s"
#: .\membership\models.py:149 #: models.py:149
msgid "Gender" msgid "Gender"
msgstr "Geschlecht" msgstr "Geschlecht"
#: .\membership\models.py:165 #: models.py:165
msgid "" msgid ""
"Yes, I confirm that I am in agreement with the statutes and would " "Yes, I confirm that I am in agreement with the statutes and would "
"like to become a member." "like to become a member."
msgstr "Ja, ich bin mit den Statuen einverstanden und möchte Mitglied werden." msgstr "Ja, ich bin mit den Statuen einverstanden und möchte Mitglied werden."
#: .\membership\models.py:169 #: models.py:169
msgid "Birthday Date" msgid "Birthday Date"
msgstr "Geburtstag" msgstr "Geburtstag"
#: .\membership\models.py:173 #: models.py:173 templates/membership/membership_detail.html:49
#: .\membership\templates\membership\membership_detail.html:49
msgid "Telephone" msgid "Telephone"
msgstr "Telefon" msgstr "Telefon"
#: .\membership\models.py:179 #: models.py:179 templates/membership/membership_detail.html:47
#: .\membership\templates\membership\membership_detail.html:47
msgid "Address" msgid "Address"
msgstr "Adresse" msgstr "Adresse"
#: .\membership\models.py:185 #: models.py:185
msgid "Postcode" msgid "Postcode"
msgstr "Postleitzahl" msgstr "Postleitzahl"
#: .\membership\models.py:190 #: models.py:190
msgid "Town/City" msgid "Town/City"
msgstr "Ort" msgstr "Ort"
#: .\membership\models.py:198 #: models.py:198
msgid "Paid until" msgid "Paid until"
msgstr "Bezahlt bis" msgstr "Bezahlt bis"
#: .\membership\models.py:204 #: models.py:204
msgid "Confirmed" msgid "Confirmed"
msgstr "Bestätigt" msgstr "Bestätigt"
#: .\membership\models.py:206 #: models.py:206
msgid "This person has paid the membership fee." msgid "This person has paid the membership fee."
msgstr "Diese Person hat ihre Mitgliedschaft bezahlt" msgstr "Diese Person hat ihre Mitgliedschaft bezahlt"
#: .\membership\models.py:219 #: models.py:219
msgid "Memberships" msgid "Memberships"
msgstr "Mitgliedschaften" msgstr "Mitgliedschaften"
#: .\membership\templates\membership\email\activation_email.txt:2 #: templates/membership/email/activation_email.txt:2
#, python-format #, python-format
msgid "Welcome %(user)s," msgid "Welcome %(user)s,"
msgstr "Herzlich willkommen %(user)s," msgstr "Herzlich willkommen %(user)s,"
#: .\membership\templates\membership\email\activation_email.txt:4 #: templates/membership/email/activation_email.txt:4
#, python-format #, python-format
msgid "" msgid ""
"We received an account request on %(site.domain)s for your email address.\n" "We received an account request on %(site.domain)s for your email address.\n"
"To activate your account please visit the following link:" "To activate your account please visit the following link:"
msgstr "" msgstr ""
"Jemand (hoffentlich du selbst) möchte mit dieser E-Mail Adresse einen neuen Benutzer Account für %(site.domain)s anlegen.\n" "Jemand (hoffentlich du selbst) möchte mit dieser E-Mail Adresse einen neuen "
"Solltest du diesen Account aktivieren wollen, klicke bitte auf den unten stehenden Link, oder kopiere diesen in die Adresszeile deines Browsers:" "Benutzer Account für %(site.domain)s anlegen.\n"
"Solltest du diesen Account aktivieren wollen, klicke bitte auf den unten "
"stehenden Link, oder kopiere diesen in die Adresszeile deines Browsers:"
#: .\membership\templates\membership\email\activation_email.txt:9 #: templates/membership/email/activation_email.txt:9
#, python-format #, python-format
msgid "" msgid ""
"If you do not want to open an account on %(site.domain)s, please ignore this email.\n" "If you do not want to open an account on %(site.domain)s, please ignore this "
"email.\n"
"Your information will then be deleted in a few days time." "Your information will then be deleted in a few days time."
msgstr "" msgstr ""
"Wenn du keinen Zugang für %(site.domain)s eröffnen willst, ignoriere diese E-Mail bitte.\n" "Wenn du keinen Zugang für %(site.domain)s eröffnen willst, ignoriere diese E-"
"Mail bitte.\n"
"Die Zugangsdaten werden dann in ein paar Tagen automatisch gelöscht." "Die Zugangsdaten werden dann in ein paar Tagen automatisch gelöscht."
#: .\membership\templates\membership\email\activation_email.txt:12 #: templates/membership/email/activation_email.txt:12
#, python-format #, python-format
msgid "" msgid ""
"Best Regards,\n" "Best Regards,\n"
@@ -237,230 +232,230 @@ msgstr ""
"mit den besten Wünschen\n" "mit den besten Wünschen\n"
"Das Team von %(site.domain)s" "Das Team von %(site.domain)s"
#: .\membership\templates\membership\email\password_reset_email.html:2 #: templates/membership/email/password_reset_email.html:2
msgid "You're receiving this e-mail because you requested a password reset" msgid "You're receiving this e-mail because you requested a password reset"
msgstr "" msgstr ""
"Du hast diese E-Mail erhalten, weil jemand die das Passwort zurücksetzen " "Du hast diese E-Mail erhalten, weil jemand die das Passwort zurücksetzen "
"möchte. " "möchte. "
#: .\membership\templates\membership\email\password_reset_email.html:3 #: templates/membership/email/password_reset_email.html:3
#, python-format #, python-format
msgid "for your user account at %(site_name)s" msgid "for your user account at %(site_name)s"
msgstr "Für deinen Benutzerzugang auf %(site_name)s" msgstr "Für deinen Benutzerzugang auf %(site_name)s"
#: .\membership\templates\membership\email\password_reset_email.html:5 #: templates/membership/email/password_reset_email.html:5
msgid "Please go to the following page and choose a new password:" msgid "Please go to the following page and choose a new password:"
msgstr "Bitte gehe auf folgende Seite und wähle ein neues Passwort aus:" msgstr "Bitte gehe auf folgende Seite und wähle ein neues Passwort aus:"
#: .\membership\templates\membership\email\password_reset_email.html:9 #: templates/membership/email/password_reset_email.html:9
msgid "Your username, in case you've forgotten:" msgid "Your username, in case you've forgotten:"
msgstr "Dein Benutzername, für den Fall das du diesen vergessen hast:" msgstr "Dein Benutzername, für den Fall das du diesen vergessen hast:"
#: .\membership\templates\membership\email\password_reset_email.html:11 #: templates/membership/email/password_reset_email.html:11
msgid "Thanks for using our site!" msgid "Thanks for using our site!"
msgstr "Danke das du unsere Seite verwendest!" msgstr "Danke das du unsere Seite verwendest!"
#: .\membership\templates\membership\email\password_reset_email.html:13 #: templates/membership/email/password_reset_email.html:13
#, python-format #, python-format
msgid "The %(site_name)s team" msgid "The %(site_name)s team"
msgstr "Das %(site_name)s Team" msgstr "Das %(site_name)s Team"
#: .\membership\templates\membership\email\password_reset_subject.txt:2 #: templates/membership/email/password_reset_subject.txt:2
#, python-format #, python-format
msgid "Password reset on %(site_name)s" msgid "Password reset on %(site_name)s"
msgstr "Passwort auf %(site_name)s zurücksetzen" msgstr "Passwort auf %(site_name)s zurücksetzen"
#: .\membership\templates\membership\hanchan_table.html:5 #: templates/membership/hanchan_table.html:5
msgid "Start" msgid "Start"
msgstr "Beginn" msgstr "Beginn"
#: .\membership\templates\membership\hanchan_table.html:6 #: templates/membership/hanchan_table.html:6
msgid "Event" msgid "Event"
msgstr "Termin" msgstr "Termin"
#: .\membership\templates\membership\hanchan_table.html:7 #: templates/membership/hanchan_table.html:7
msgid "Players" msgid "Players"
msgstr "Spieler" msgstr "Spieler"
#: .\membership\templates\membership\hanchan_table.html:8 #: templates/membership/hanchan_table.html:8
msgid "Kyu Points" msgid "Kyu Points"
msgstr "Kyū Punkte" msgstr "Kyū Punkte"
#: .\membership\templates\membership\hanchan_table.html:9 #: templates/membership/hanchan_table.html:9
msgid "Dan Points" msgid "Dan Points"
msgstr "Dan Punkte" msgstr "Dan Punkte"
#: .\membership\templates\membership\hanchan_table.html:10 #: templates/membership/hanchan_table.html:10
msgid "Bonus Points" msgid "Bonus Points"
msgstr "Bonus Punkte" msgstr "Bonus Punkte"
#: .\membership\templates\membership\hanchan_table.html:11 #: templates/membership/hanchan_table.html:11
msgid "Comment" msgid "Comment"
msgstr "Anmerkung" msgstr "Anmerkung"
#: .\membership\templates\membership\hanchan_table.html:26 #: templates/membership/hanchan_table.html:26
msgid "This Hanchan does not validate" msgid "This Hanchan does not validate"
msgstr "Diese Hanchan ist ungültig" msgstr "Diese Hanchan ist ungültig"
#: .\membership\templates\membership\membership_detail.html:5 #: templates/membership/membership_detail.html:5
msgid "profile for" msgid "profile for"
msgstr "Profil für" msgstr "Profil für"
#: .\membership\templates\membership\membership_detail.html:9 #: templates/membership/membership_detail.html:9
msgid "Ladder Hanchans" msgid "Ladder Hanchans"
msgstr "Ladder Hanchans" msgstr "Ladder Hanchans"
#: .\membership\templates\membership\membership_detail.html:10 #: templates/membership/membership_detail.html:10
msgid "Kyu Hanchans" msgid "Kyu Hanchans"
msgstr "Kyū Hanchans" msgstr "Kyū Hanchans"
#: .\membership\templates\membership\membership_detail.html:11 #: templates/membership/membership_detail.html:11
msgid "Dan Hanchans" msgid "Dan Hanchans"
msgstr "Dan Hanchans" msgstr "Dan Hanchans"
#: .\membership\templates\membership\membership_detail.html:12 #: templates/membership/membership_detail.html:12
msgid "Invalid Hanchans" msgid "Invalid Hanchans"
msgstr "Ungültige Hanchans" msgstr "Ungültige Hanchans"
#: .\membership\templates\membership\membership_detail.html:13 #: templates/membership/membership_detail.html:13
msgid "Mai-Star Games" msgid "Mai-Star Games"
msgstr "Mai-Star Spiele" msgstr "Mai-Star Spiele"
#: .\membership\templates\membership\membership_detail.html:17 #: templates/membership/membership_detail.html:17
msgid "Profile Image" msgid "Profile Image"
msgstr "Profilbild" msgstr "Profilbild"
#: .\membership\templates\membership\membership_detail.html:26 #: templates/membership/membership_detail.html:26
#: .\membership\templates\membership\membership_detail.html:29 #: templates/membership/membership_detail.html:29
msgid "Points" msgid "Points"
msgstr "Punkte" msgstr "Punkte"
#: .\membership\templates\membership\membership_detail.html:26 #: templates/membership/membership_detail.html:26
msgid "Maximum" msgid "Maximum"
msgstr "Maximum" msgstr "Maximum"
#: .\membership\templates\membership\membership_detail.html:32 #: templates/membership/membership_detail.html:32
msgid "Games Total" msgid "Games Total"
msgstr "Spiele gesamt" msgstr "Spiele gesamt"
#: .\membership\templates\membership\membership_detail.html:32 #: templates/membership/membership_detail.html:32
#: .\membership\templates\membership\membership_detail.html:35 #: templates/membership/membership_detail.html:35
msgid "Won" msgid "Won"
msgstr "Gewonnen" msgstr "Gewonnen"
#: .\membership\templates\membership\membership_detail.html:32 #: templates/membership/membership_detail.html:32
#: .\membership\templates\membership\membership_detail.html:35 #: templates/membership/membership_detail.html:35
msgid "Good" msgid "Good"
msgstr "Gut" msgstr "Gut"
#: .\membership\templates\membership\membership_detail.html:35 #: templates/membership/membership_detail.html:35
msgid "Current Season" msgid "Current Season"
msgstr "Aktuelle Saison" msgstr "Aktuelle Saison"
#: .\membership\templates\membership\membership_detail.html:42 #: templates/membership/membership_detail.html:42
msgid "private data" msgid "private data"
msgstr "Private Daten" msgstr "Private Daten"
#: .\membership\templates\membership\membership_detail.html:43 #: templates/membership/membership_detail.html:43
msgid "This data can only be seen by yourself and members of the board." msgid "This data can only be seen by yourself and members of the board."
msgstr "" msgstr ""
"Diese Angaben können nur von dir selbst und von Mitgliedern des Vorstandes " "Diese Angaben können nur von dir selbst und von Mitgliedern des Vorstandes "
"eingesehen werden." "eingesehen werden."
#: .\membership\templates\membership\membership_detail.html:45 #: templates/membership/membership_detail.html:45
msgid "name" msgid "name"
msgstr "Name" msgstr "Name"
#: .\membership\templates\membership\membership_detail.html:50 #: templates/membership/membership_detail.html:50
msgid "Member Since" msgid "Member Since"
msgstr "Mitglied seit" msgstr "Mitglied seit"
#: .\membership\templates\membership\membership_detail.html:51 #: templates/membership/membership_detail.html:51
msgid "Last Login" msgid "Last Login"
msgstr "Letzte Anmeldung" msgstr "Letzte Anmeldung"
#: .\membership\templates\membership\membership_detail.html:54 #: templates/membership/membership_detail.html:54
msgid "Edit Profile" msgid "Edit Profile"
msgstr "Profil bearbeiten" msgstr "Profil bearbeiten"
#: .\membership\templates\membership\membership_detail.html:55 #: templates/membership/membership_detail.html:55
#: .\membership\templates\registration\password_change_form.html:23 #: templates/registration/password_change_form.html:23
msgid "Change Password" msgid "Change Password"
msgstr "Passwort ändern" msgstr "Passwort ändern"
#: .\membership\templates\membership\membership_form.html:4 #: templates/membership/membership_form.html:4
#: .\membership\templates\membership\membership_form.html:6 #: templates/membership/membership_form.html:6
#: .\membership\templates\membership\membership_form.html:11 #: templates/membership/membership_form.html:11
msgid "Edit Userprofile" msgid "Edit Userprofile"
msgstr "Profil bearbeiten" msgstr "Profil bearbeiten"
#: .\membership\templates\membership\membership_form.html:15 #: templates/membership/membership_form.html:15
msgid "Reset" msgid "Reset"
msgstr "Zurücksetzen" msgstr "Zurücksetzen"
#: .\membership\templates\membership\membership_form.html:16 #: templates/membership/membership_form.html:16
msgid "Save" msgid "Save"
msgstr "Speichern" msgstr "Speichern"
#: .\membership\templates\membership\register_form.html:4 #: templates/membership/register_form.html:4
msgid "Registration" msgid "Registration"
msgstr "Registrieren" msgstr "Registrieren"
#: .\membership\templates\membership\register_form.html:10 #: templates/membership/register_form.html:10
msgid "Login crendentials" msgid "Login crendentials"
msgstr "Anmeldedaten" msgstr "Anmeldedaten"
#: .\membership\templates\membership\register_form.html:16 #: templates/membership/register_form.html:16
msgid "Club membership" msgid "Club membership"
msgstr "Vereinsmitgliedschaft" msgstr "Vereinsmitgliedschaft"
#: .\membership\templates\membership\register_form.html:27 #: templates/membership/register_form.html:27
msgid "reset" msgid "reset"
msgstr "Zurücksetzen" msgstr "Zurücksetzen"
#: .\membership\templates\membership\register_form.html:29 #: templates/membership/register_form.html:29
msgid "register" msgid "register"
msgstr "Registrieren" msgstr "Registrieren"
#: .\membership\templates\membership\register_successful.html:5 #: templates/membership/register_successful.html:5
#: .\membership\templates\membership\register_successful.html:7 #: templates/membership/register_successful.html:7
#: .\membership\templates\membership\register_successful.html:10 #: templates/membership/register_successful.html:10
msgid "Activation sent" msgid "Activation sent"
msgstr "Aktivierung wurde zugesendet" msgstr "Aktivierung wurde zugesendet"
#: .\membership\templates\registration\login.html:17 #: templates/registration/login.html:17
msgid "login" msgid "login"
msgstr "Anmelden" msgstr "Anmelden"
#: .\membership\templates\registration\login.html:19 #: templates/registration/login.html:19
msgid "Your username and password didn't match. Please try again." msgid "Your username and password didn't match. Please try again."
msgstr "Anmeldung fehlgeschlagen, bitte Benutzername und Passwort überprüfen." msgstr "Anmeldung fehlgeschlagen, bitte Benutzername und Passwort überprüfen."
#: .\membership\templates\registration\login.html:22 #: templates/registration/login.html:22
msgid "Forgot your Password?" msgid "Forgot your Password?"
msgstr "Passwort vergessen?" msgstr "Passwort vergessen?"
#: .\membership\templates\registration\login.html:26 #: templates/registration/login.html:26
#: .\membership\templates\registration\password_reset_complete.html:13 #: templates/registration/password_reset_complete.html:13
msgid "Login" msgid "Login"
msgstr "Anmelden" msgstr "Anmelden"
#: .\membership\templates\registration\password_change_done.html:4 #: templates/registration/password_change_done.html:4
#: .\membership\templates\registration\password_change_done.html:7 #: templates/registration/password_change_done.html:7
msgid "Password change successful" msgid "Password change successful"
msgstr "Benutzerprofil erfolgreich geändert." msgstr "Benutzerprofil erfolgreich geändert."
#: .\membership\templates\registration\password_change_done.html:8 #: templates/registration/password_change_done.html:8
msgid "Your password was changed." msgid "Your password was changed."
msgstr "Passwort geändet" msgstr "Passwort geändet"
#: .\membership\templates\registration\password_change_form.html:4 #: templates/registration/password_change_form.html:4
#: .\membership\templates\registration\password_change_form.html:9 #: templates/registration/password_change_form.html:9
#: .\membership\templates\registration\password_change_form.html:16 #: templates/registration/password_change_form.html:16
msgid "Password change" msgid "Password change"
msgstr "Passwort wechseln" msgstr "Passwort wechseln"
#: .\membership\templates\registration\password_change_form.html:10 #: templates/registration/password_change_form.html:10
msgid "" msgid ""
"Please enter your old password, for security's sake, and then enter your new " "Please enter your old password, for security's sake, and then enter your new "
"password twice so we can verify you typed it in correctly." "password twice so we can verify you typed it in correctly."
@@ -468,23 +463,23 @@ msgstr ""
"Zur Sicherheit bitte altes Passwort einmal und das gewünschte neue Passwort " "Zur Sicherheit bitte altes Passwort einmal und das gewünschte neue Passwort "
"zweimal angeben, so können Tippfehler abgefangen werden." "zweimal angeben, so können Tippfehler abgefangen werden."
#: .\membership\templates\registration\password_reset_complete.html:4 #: templates/registration/password_reset_complete.html:4
#: .\membership\templates\registration\password_reset_complete.html:6 #: templates/registration/password_reset_complete.html:6
#: .\membership\templates\registration\password_reset_complete.html:9 #: templates/registration/password_reset_complete.html:9
msgid "Password reset complete" msgid "Password reset complete"
msgstr "Das Rücksetzen des Passwortes ist abgeschlossen." msgstr "Das Rücksetzen des Passwortes ist abgeschlossen."
#: .\membership\templates\registration\password_reset_complete.html:10 #: templates/registration/password_reset_complete.html:10
msgid "Your password has been set. You may go ahead and log in now." msgid "Your password has been set. You may go ahead and log in now."
msgstr "Das Passwort wurde gesetzt, Du kannst dich nun damit anmelden." msgstr "Das Passwort wurde gesetzt, Du kannst dich nun damit anmelden."
#: .\membership\templates\registration\password_reset_confirm.html:4 #: templates/registration/password_reset_confirm.html:4
#: .\membership\templates\registration\password_reset_confirm.html:6 #: templates/registration/password_reset_confirm.html:6
#: .\membership\templates\registration\password_reset_confirm.html:15 #: templates/registration/password_reset_confirm.html:15
msgid "Enter new password" msgid "Enter new password"
msgstr "Neues Passwort eingeben" msgstr "Neues Passwort eingeben"
#: .\membership\templates\registration\password_reset_confirm.html:12 #: templates/registration/password_reset_confirm.html:12
msgid "" msgid ""
"Please enter your new password twice so we can verify you typed it in " "Please enter your new password twice so we can verify you typed it in "
"correctly." "correctly."
@@ -492,15 +487,15 @@ msgstr ""
"Bitte das Passwort zweimal eingeben, um sicher zu stellen das es korrekt " "Bitte das Passwort zweimal eingeben, um sicher zu stellen das es korrekt "
"eingetippt wurde." "eingetippt wurde."
#: .\membership\templates\registration\password_reset_confirm.html:18 #: templates/registration/password_reset_confirm.html:18
msgid "Change my password" msgid "Change my password"
msgstr "Passwort ändern" msgstr "Passwort ändern"
#: .\membership\templates\registration\password_reset_confirm.html:26 #: templates/registration/password_reset_confirm.html:26
msgid "Password reset unsuccessful" msgid "Password reset unsuccessful"
msgstr "Passwort rücksetzen fehlgeschlagen" msgstr "Passwort rücksetzen fehlgeschlagen"
#: .\membership\templates\registration\password_reset_confirm.html:27 #: templates/registration/password_reset_confirm.html:27
msgid "" msgid ""
"The password reset link was invalid, possibly because it has already been " "The password reset link was invalid, possibly because it has already been "
"used. Please request a new password reset." "used. Please request a new password reset."
@@ -508,22 +503,22 @@ msgstr ""
"Der Link für die Rücksetzung des Passwortes war ungültig, vermutlich wurde " "Der Link für die Rücksetzung des Passwortes war ungültig, vermutlich wurde "
"er schon einmal benutzt. Bitte eine neue Rücksetzung beantragen." "er schon einmal benutzt. Bitte eine neue Rücksetzung beantragen."
#: .\membership\templates\registration\password_reset_done.html:4 #: templates/registration/password_reset_done.html:4
#: .\membership\templates\registration\password_reset_done.html:6 #: templates/registration/password_reset_done.html:6
#: .\membership\templates\registration\password_reset_done.html:12 #: templates/registration/password_reset_done.html:12
msgid "Password reset successful" msgid "Password reset successful"
msgstr "Passwort erfolgreich zurückgesetzt." msgstr "Passwort erfolgreich zurückgesetzt."
#: .\membership\templates\registration\password_reset_form.html:4 #: templates/registration/password_reset_form.html:4
#: .\membership\templates\registration\password_reset_form.html:6 #: templates/registration/password_reset_form.html:6
msgid "Password reset" msgid "Password reset"
msgstr "Passwort zurücksetzen" msgstr "Passwort zurücksetzen"
#: .\membership\templates\registration\password_reset_form.html:21 #: templates/registration/password_reset_form.html:21
msgid "Transmit" msgid "Transmit"
msgstr "Übermitteln" msgstr "Übermitteln"
#: .\membership\views.py:61 #: views.py:61
msgid "" msgid ""
"Activation successful. You can now login anytime with you username " "Activation successful. You can now login anytime with you username "
"and password." "and password."
@@ -531,11 +526,11 @@ msgstr ""
"Die Aktivierung war erfolgreich. Du kannst dich ab jetzt jederzeit mit " "Die Aktivierung war erfolgreich. Du kannst dich ab jetzt jederzeit mit "
"deinem Benutzernamen und Passwort anmelden." "deinem Benutzernamen und Passwort anmelden."
#: .\membership\views.py:88 #: views.py:88
msgid "User Profile changed successfully" msgid "User Profile changed successfully"
msgstr "Benutzerprofil erfolgreich geändert." msgstr "Benutzerprofil erfolgreich geändert."
#: .\membership\views.py:112 #: views.py:112
msgid "No Membership found matching the query" msgid "No Membership found matching the query"
msgstr "Kein Mitglied gefunden welche der Anfrage entspricht" msgstr "Kein Mitglied gefunden welche der Anfrage entspricht"
@@ -556,12 +551,16 @@ msgstr "Kein Mitglied gefunden welche der Anfrage entspricht"
#~ msgid "" #~ msgid ""
#~ "After you've provided your account data, you'll receive\n" #~ "After you've provided your account data, you'll receive\n"
#~ " an email asking you to verify your email address. You have to click on the\n" #~ " an email asking you to verify your email address. You have to click "
#~ " link in this verification email to confirm your email address, otherwise\n" #~ "on the\n"
#~ " link in this verification email to confirm your email address, "
#~ "otherwise\n"
#~ " your can't login." #~ " your can't login."
#~ msgstr "" #~ msgstr ""
#~ "Nach dem du deine Daten eingegeben hast, wirst du eine E-Mail zur Bestätigung bekommen.\n" #~ "Nach dem du deine Daten eingegeben hast, wirst du eine E-Mail zur "
#~ "Bitte klicke auf den Link in dieser E-Mail zur Verifizierung, erst dann ist die Anmeldung möglich." #~ "Bestätigung bekommen.\n"
#~ "Bitte klicke auf den Link in dieser E-Mail zur Verifizierung, erst dann "
#~ "ist die Anmeldung möglich."
#~ msgid "Have you already registered?" #~ msgid "Have you already registered?"
#~ msgstr "Bereits registriert?" #~ msgstr "Bereits registriert?"
@@ -583,7 +582,8 @@ msgstr "Kein Mitglied gefunden welche der Anfrage entspricht"
#~ " <li>Kommentare auf dieser Seite hinterlassen.</li>\n" #~ " <li>Kommentare auf dieser Seite hinterlassen.</li>\n"
#~ " <li>Dich für unseren Newsletter anmelden</li>\n" #~ " <li>Dich für unseren Newsletter anmelden</li>\n"
#~ " <li>Mitglied in unserem Verein werden</li>\n" #~ " <li>Mitglied in unserem Verein werden</li>\n"
#~ " <li>Vereinsmitglieder haben auch vollen Zugang zu unserem Ranking System</li>\n" #~ " <li>Vereinsmitglieder haben auch vollen Zugang zu unserem Ranking "
#~ "System</li>\n"
#~ "</ul>" #~ "</ul>"
#~ msgid "" #~ msgid ""
@@ -595,7 +595,8 @@ msgstr "Kein Mitglied gefunden welche der Anfrage entspricht"
#~ " " #~ " "
#~ msgstr "" #~ msgstr ""
#~ "\n" #~ "\n"
#~ "<p>Du kannst dich auch über deinen Facebook, Google, oder Twitter Account anmelden.\n" #~ "<p>Du kannst dich auch über deinen Facebook, Google, oder Twitter Account "
#~ "anmelden.\n"
#~ "Wenn du so etwas nicht besitzt, oder nicht verwenden möchtest, \n" #~ "Wenn du so etwas nicht besitzt, oder nicht verwenden möchtest, \n"
#~ "kannst du auch das Registrierungsformular ausfüllen.</p>" #~ "kannst du auch das Registrierungsformular ausfüllen.</p>"
@@ -603,9 +604,10 @@ msgstr "Kein Mitglied gefunden welche der Anfrage entspricht"
#~ msgstr "oder über einen existierenden Account anmelden" #~ msgstr "oder über einen existierenden Account anmelden"
#~ msgid "" #~ msgid ""
#~ "For your membership, we need this. Please fill out this field " #~ "For your membership, we need this. Please fill out this "
#~ "yet." #~ "field yet."
#~ msgstr "Diese Angabe wird für eine Mitgliedschaft benötigt, bitte ausfüllen." #~ msgstr ""
#~ "Diese Angabe wird für eine Mitgliedschaft benötigt, bitte ausfüllen."
#~ msgid "Given Name" #~ msgid "Given Name"
#~ msgstr "Vorname" #~ msgstr "Vorname"
@@ -614,9 +616,9 @@ msgstr "Kein Mitglied gefunden welche der Anfrage entspricht"
#~ msgstr "Nachname" #~ msgstr "Nachname"
#~ msgid "" #~ msgid ""
#~ "The Username can only contain the letters from A to Z, Numbers, and " #~ "The Username can only contain the letters from A to Z, Numbers, "
#~ "the underscore. It must be at least 2 characters long, and cannot be" #~ "and the underscore. It must be at least 2 characters long, and "
#~ " longer the 30. The first character must be a letter." #~ "cannot be longer the 30. The first character must be a letter."
#~ msgstr "" #~ msgstr ""
#~ "Der Benutzername kann aus den Buchstaben A-Z, Ziffern und dem Unterstrich " #~ "Der Benutzername kann aus den Buchstaben A-Z, Ziffern und dem Unterstrich "
#~ "bestehen. Es sollte wenigstens 2, aber maximal 30 Zeichen lang sein. Das " #~ "bestehen. Es sollte wenigstens 2, aber maximal 30 Zeichen lang sein. Das "

View File

@@ -0,0 +1,18 @@
# Generated by Django 2.1.5 on 2019-01-06 18:54
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('membership', '0007_auto_20171115_0653'),
]
operations = [
migrations.AlterField(
model_name='membership',
name='last_name',
field=models.CharField(blank=True, max_length=150, verbose_name='last name'),
),
]

View File

@@ -17,18 +17,22 @@
</p> </p>
</fieldset> </fieldset>
</form> </form>
{% endblock %}
{% block javascript %} <script type="text/javascript">
$(function() { function togglePersonalData(event) {
$( "#id_birthday" ).datepicker({ var membership = document.getElementById("id_membership").checked;
changeMonth: true, var input_elements = ["id_first_name", "id_last_name", "id_birthday"];
changeYear: true, for (var i = 0; i < input_elements.length; i++) {
dateFormat: 'yy-mm-dd', element_id = input_elements[i]
yearRange: '-50,0', element = document.getElementById(element_id);
firstDay: 1 element.disabled = !membership;
}); if (membership == 0) {element.value = ""};
}); };
};
document.addEventListener('DOMContentLoaded',function() {document.querySelector('#id_membership').onchange=togglePersonalData;},false);
togglePersonalData();
</script>
{% endblock %} {% endblock %}
{% block buttonbar %}{% endblock %} {% block buttonbar %}{% endblock %}

View File

@@ -14,7 +14,7 @@
<fieldset class="grid_5"> <fieldset class="grid_5">
<legend>{% trans "Club membership"%}</legend> <legend>{% trans "Club membership"%}</legend>
{% get_fieldset "membership, first_name, last_name, gender, birthday, street_name, post_code, city, telephone" from form as form2 %} {% get_fieldset "membership, first_name, last_name, birthday" from form as form2 %}
{% with form2 as form %}{% include "form.html" %}{% endwith %} {% with form2 as form %}{% include "form.html" %}{% endwith %}
</fieldset> </fieldset>
@@ -33,11 +33,12 @@
<script type="text/javascript"> <script type="text/javascript">
function togglePersonalData(event) { function togglePersonalData(event) {
var membership = document.getElementById("id_membership").checked; var membership = document.getElementById("id_membership").checked;
var input_elements = ["id_first_name", "id_last_name", "id_gender", "id_birthday", "id_street_name", "id_post_code", "id_city", "id_telephone"]; var input_elements = ["id_first_name", "id_last_name", "id_birthday"];
for (var i = 0; i < input_elements.length; i++) { for (var i = 0; i < input_elements.length; i++) {
element_id = input_elements[i] element_id = input_elements[i]
element = document.getElementById(element_id); element = document.getElementById(element_id);
element.disabled = !membership; element.disabled = !membership;
if (membership == 0) {element.value = ""};
}; };
}; };

View File

@@ -106,7 +106,7 @@ class MembershipDetail(LoginRequiredMixin, generic.DetailView):
try: try:
if self.kwargs.get('username'): if self.kwargs.get('username'):
return queryset.get(username=self.kwargs['username']) return queryset.get(username=self.kwargs['username'])
elif self.request.user.is_authenticated(): else:
return self.request.user return self.request.user
except models.Membership.DoesNotExist: except models.Membership.DoesNotExist:
raise Http404(_("No Membership found matching the query")) raise Http404(_("No Membership found matching the query"))

File diff suppressed because it is too large Load Diff

View File

@@ -3,10 +3,9 @@ between Tags, an at the beginning and the end of the content."""
from django.utils.html import strip_spaces_between_tags from django.utils.html import strip_spaces_between_tags
class CompressHtmlMiddleware(object): class CompressHtmlMiddleware:
"""This Middleware compresses strips the spaces between tags, and at the """This Middleware compresses strips the spaces between tags, and at the
beginning and the end of the content.""" beginning and the end of the content."""
# TODO: Port to django 1.10 and upward
def __init__(self, get_response): def __init__(self, get_response):
""" """
@@ -14,7 +13,6 @@ class CompressHtmlMiddleware(object):
:param get_response: :param get_response:
""" """
self.get_response = get_response self.get_response = get_response
regex = ">[\s]*<"
def __call__(self, request): def __call__(self, request):
""" """
@@ -25,14 +23,29 @@ class CompressHtmlMiddleware(object):
# Code to be executed for each request before # Code to be executed for each request before
# the view (and later middleware) are called. # the view (and later middleware) are called.
response = self.get_response(request) response = self.get_response(request)
if 'text/html' in response['Content-Type']: if 'text/html' in response['Content-Type']:
response.content = strip_spaces_between_tags( response.content = strip_spaces_between_tags(
response.content).strip() response.content).strip()
return response return response
class SetRemoteAddrFromForwardedFor(object):
class SetRemoteAddrFromForwardedFor:
def __init__(self, get_response):
self.get_response = get_response
# One-time configuration and initialization.
def __call__(self, request):
# Code to be executed for each request before
# the view (and later middleware) are called.
response = self.get_response(request)
# Code to be executed for each request/response after
# the view is called.
return response
def process_request(self, request): def process_request(self, request):
try: try:
real_ip = request.META['HTTP_X_FORWARDED_FOR'] real_ip = request.META['HTTP_X_FORWARDED_FOR']