Compare commits
10 Commits
riichi_201
...
css3_redes
| Author | SHA1 | Date | |
|---|---|---|---|
| aa85d3fd94 | |||
| 432673a967 | |||
| 877715f613 | |||
| 1d2fb44250 | |||
| 3af8e64f1f | |||
| 8ddbe03ff8 | |||
| 4bd017ec4f | |||
| 52ec7d42b7 | |||
| d62f549a30 | |||
| fa6a81c710 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -62,7 +62,6 @@ docs/_build/
|
|||||||
target/
|
target/
|
||||||
|
|
||||||
#Django Development
|
#Django Development
|
||||||
backup/
|
|
||||||
/bower_components/
|
/bower_components/
|
||||||
/media/
|
/media/
|
||||||
/node_modules/
|
/node_modules/
|
||||||
|
|||||||
5
TODO
5
TODO
@@ -766,6 +766,11 @@ src/mahjong_ranking/models.py
|
|||||||
| | [NORMAL] PyLintBear (W0201):
|
| | [NORMAL] PyLintBear (W0201):
|
||||||
| | W0201 - Attribute 'kyu_points' defined outside __init__
|
| | W0201 - Attribute 'kyu_points' defined outside __init__
|
||||||
|
|
||||||
|
src/mahjong_ranking/models.py
|
||||||
|
| 330| class·KyuDanRanking(models.Model):
|
||||||
|
| | [NORMAL] PyLintBear (W5102):
|
||||||
|
| | W5102 - Found __unicode__ method on model (KyuDanRanking). Python3 uses __str__.
|
||||||
|
|
||||||
src/mahjong_ranking/models.py
|
src/mahjong_ranking/models.py
|
||||||
| 330| class·KyuDanRanking(models.Model):
|
| 330| class·KyuDanRanking(models.Model):
|
||||||
| | [INFO] PyLintBear (R0902):
|
| | [INFO] PyLintBear (R0902):
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ unset DJANGO_SETTINGS_MODULE
|
|||||||
for dir in *
|
for dir in *
|
||||||
do
|
do
|
||||||
if [ -d ${dir}/locale ]
|
if [ -d ${dir}/locale ]
|
||||||
echo "Übersetze $dir"
|
|
||||||
then
|
then
|
||||||
echo -n "$dir: "
|
echo -n "$dir: "
|
||||||
cd ${dir}
|
cd ${dir}
|
||||||
@@ -15,7 +14,7 @@ for dir in *
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
sleep 5s
|
sleep 5s
|
||||||
export DJANGO_SETTINGS_MODULE="kasu.settings.production"
|
export DJANGO_SETTINGS_MODULE="kasu.settings"
|
||||||
./manage.py compilemessages
|
./manage.py compilemessages
|
||||||
|
|
||||||
echo "lösche den Python Compiler Cache..."
|
echo "lösche den Python Compiler Cache..."
|
||||||
@@ -23,5 +22,5 @@ find . -name "*.pyc" -exec rm -rf {} \;
|
|||||||
echo "Aktualisiere Statics"
|
echo "Aktualisiere Statics"
|
||||||
./manage.py collectstatic --noinput -c
|
./manage.py collectstatic --noinput -c
|
||||||
echo "Erstelle Vorschaubilder"
|
echo "Erstelle Vorschaubilder"
|
||||||
./manage.py generateimages
|
./manage.py thumbnail_cleanup
|
||||||
touch kasu/wsgi.py
|
touch kasu/wsgi.py
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
SSH_LOGIN="kasu@s21.wservices.ch"
|
SSH_LOGIN="kasu@s21.wservices.ch"
|
||||||
SYNC_ASSESTS="requirements static"
|
SYNC_ASSESTS="requirements"
|
||||||
SYNC_SOURCECODE="src"
|
SYNC_SOURCECODE="src"
|
||||||
EXCLUDE_FILES="*.pyc"
|
EXCLUDE_FILES="*.pyc"
|
||||||
|
|
||||||
@@ -19,5 +19,5 @@ rsync -r --copy-links --delete ${SYNC_SOURCECODE} ${SSH_LOGIN}:~/ --exclude 'src
|
|||||||
|
|
||||||
echo "Rebuild and reload django..."
|
echo "Rebuild and reload django..."
|
||||||
ssh ${SSH_LOGIN} "rm src/kasu/settings/development.*"
|
ssh ${SSH_LOGIN} "rm src/kasu/settings/development.*"
|
||||||
ssh ${SSH_LOGIN} "~/virtualenv/bin/python ~/src/manage.py collectstatic -l --noinput -v1"
|
ssh ${SSH_LOGIN} "virtualenv/bin/python ~/src/manage.py collectstatic -l --noinput -v1"
|
||||||
ssh ${SSH_LOGIN} "~/init/kasu restart"
|
ssh ${SSH_LOGIN} "~/init/kasu restart"
|
||||||
|
|||||||
Binary file not shown.
@@ -8,271 +8,262 @@ 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: 2017-06-19 22:46+0200\n"
|
"POT-Creation-Date: 2018-04-27 09:49+0200\n"
|
||||||
"PO-Revision-Date: 2016-09-28 00:24+0200\n"
|
"PO-Revision-Date: 2018-04-27 10:05+0105\n"
|
||||||
"Last-Translator: Christian Berg <xeniac@posteo.at>\n"
|
"Last-Translator: b'Christian Berg <kasu@xendynastie.at>'\n"
|
||||||
"Language-Team: Deutsch <>\n"
|
"Language-Team: Deutsch <>\n"
|
||||||
"Language: de\n"
|
"Language: de\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"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-Translated-Using: django-rosetta 0.7.2\n"
|
|
||||||
"X-Generator: Poedit 1.8.9\n"
|
"X-Generator: Poedit 1.8.9\n"
|
||||||
|
"X-Translated-Using: django-rosetta 0.7.14\n"
|
||||||
|
|
||||||
#: content/feeds.py:16
|
#: 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:43
|
#: 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:44
|
#: feeds.py:52
|
||||||
msgid "Kasu - latest comments"
|
msgid "Kasu - latest comments"
|
||||||
msgstr "Kasu - neue Kommentare"
|
msgstr "Kasu - neue Kommentare"
|
||||||
|
|
||||||
#: content/forms.py:52 content/models.py:308
|
#: forms.py:57 models.py:315
|
||||||
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:62
|
#: models.py:68
|
||||||
msgid "Headline"
|
msgid "Headline"
|
||||||
msgstr "Schlagzeile"
|
msgstr "Schlagzeile"
|
||||||
|
|
||||||
#: content/models.py:64
|
#: models.py:70
|
||||||
msgid "Content"
|
msgid "Content"
|
||||||
msgstr "Inhalt"
|
msgstr "Inhalt"
|
||||||
|
|
||||||
#: content/models.py:66 content/models.py:137
|
#: models.py:72 models.py:143 templates/content/article_detail.html:25
|
||||||
#: content/templates/content/article_detail.html:25
|
|
||||||
msgid "Category"
|
msgid "Category"
|
||||||
msgstr "Kategorie"
|
msgstr "Kategorie"
|
||||||
|
|
||||||
#: content/models.py:67 content/models.py:130
|
#: models.py:73 models.py:136
|
||||||
msgid "Image"
|
msgid "Image"
|
||||||
msgstr "Bild"
|
msgstr "Bild"
|
||||||
|
|
||||||
#: content/models.py:69 content/models.py:132
|
#: models.py:75 models.py:138
|
||||||
msgid "Slug"
|
msgid "Slug"
|
||||||
msgstr "Slug"
|
msgstr "Slug"
|
||||||
|
|
||||||
#: content/models.py:71 content/templates/content/article_detail.html:23
|
#: models.py:77 templates/content/article_detail.html:23
|
||||||
msgid "Author"
|
msgid "Author"
|
||||||
msgstr "Autor"
|
msgstr "Autor"
|
||||||
|
|
||||||
#: content/models.py:72
|
#: models.py:78
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr "Status"
|
msgstr "Status"
|
||||||
|
|
||||||
#: content/models.py:74
|
#: models.py:80
|
||||||
msgid "Created"
|
msgid "Created"
|
||||||
msgstr "Erstellt"
|
msgstr "Erstellt"
|
||||||
|
|
||||||
#: content/models.py:75
|
#: models.py:81
|
||||||
msgid "Modified"
|
msgid "Modified"
|
||||||
msgstr "Bearbeitet"
|
msgstr "Bearbeitet"
|
||||||
|
|
||||||
#: content/models.py:80
|
#: models.py:86
|
||||||
msgid "Article"
|
msgid "Article"
|
||||||
msgstr "Artikel"
|
msgstr "Artikel"
|
||||||
|
|
||||||
#: content/models.py:81
|
#: models.py:87
|
||||||
msgid "Articles"
|
msgid "Articles"
|
||||||
msgstr "Artikel"
|
msgstr "Artikel"
|
||||||
|
|
||||||
#: content/models.py:126 content/models.py:127
|
#: models.py:132 models.py:133
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Name"
|
msgstr "Name"
|
||||||
|
|
||||||
#: content/models.py:128 content/models.py:129
|
#: models.py:134 models.py:135
|
||||||
msgid "Description"
|
msgid "Description"
|
||||||
msgstr "Beschreibung"
|
msgstr "Beschreibung"
|
||||||
|
|
||||||
#: content/models.py:138
|
#: models.py:144
|
||||||
msgid "Categories"
|
msgid "Categories"
|
||||||
msgstr "Kategorien"
|
msgstr "Kategorien"
|
||||||
|
|
||||||
#: content/models.py:169 content/models.py:175
|
#: models.py:176 models.py:182
|
||||||
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:180 content/models.py:185
|
#: models.py:187 models.py:192
|
||||||
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 ""
|
msgstr "Der Seitentitel der öffentlich gemacht wird."
|
||||||
|
|
||||||
#: content/models.py:187
|
#: models.py:194
|
||||||
msgid "slug"
|
msgid "slug"
|
||||||
msgstr "Slug"
|
msgstr "Slug"
|
||||||
|
|
||||||
#: content/models.py:190
|
#: models.py:197
|
||||||
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 "
|
||||||
"[my-slug]/"
|
"http://domain.com/blog/[my-slug]/"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Der Seitenname wie er in der URL erscheint. z.B: "
|
||||||
|
"http://domain.com/blog/[slug]/"
|
||||||
|
|
||||||
#: content/models.py:199
|
#: models.py:206
|
||||||
msgid "Path"
|
msgid "Path"
|
||||||
msgstr "Pfad"
|
msgstr "Pfad"
|
||||||
|
|
||||||
#: content/models.py:211
|
#: models.py:218
|
||||||
msgid "Position"
|
msgid "Position"
|
||||||
msgstr "Position"
|
msgstr "Position"
|
||||||
|
|
||||||
#: content/models.py:216
|
#: models.py:223
|
||||||
msgid "status"
|
msgid "status"
|
||||||
msgstr "Status"
|
msgstr "Status"
|
||||||
|
|
||||||
#: content/models.py:219 content/models.py:221
|
#: models.py:226 models.py:228
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Description"
|
#| msgid "Description"
|
||||||
msgid "search description"
|
msgid "search description"
|
||||||
msgstr "Beschreibung"
|
msgstr "Suchbeschreibung"
|
||||||
|
|
||||||
#: content/models.py:224
|
#: models.py:231
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Content"
|
#| msgid "Content"
|
||||||
msgid "content type"
|
msgid "content type"
|
||||||
msgstr "Inhalt"
|
msgstr "Inhaltstyp"
|
||||||
|
|
||||||
#: content/models.py:229
|
#: models.py:236
|
||||||
msgid "enable comments"
|
msgid "enable comments"
|
||||||
msgstr "Kommentare möglich"
|
msgstr "Kommentare möglich"
|
||||||
|
|
||||||
#: content/models.py:234
|
#: models.py:241
|
||||||
msgid "Template"
|
msgid "Template"
|
||||||
msgstr "Vorlage"
|
msgstr "Vorlage"
|
||||||
|
|
||||||
#: content/models.py:242
|
#: models.py:249
|
||||||
#, fuzzy
|
|
||||||
#| msgid "created on"
|
#| msgid "created on"
|
||||||
msgid "first created at"
|
msgid "first created at"
|
||||||
msgstr "erstellt am"
|
msgstr "erstellt am"
|
||||||
|
|
||||||
#: content/models.py:247
|
#: models.py:254
|
||||||
msgid "latest updated at"
|
msgid "latest updated at"
|
||||||
msgstr ""
|
msgstr "letzte Änderung"
|
||||||
|
|
||||||
#: content/models.py:322
|
#: models.py:328
|
||||||
msgid "Page"
|
msgid "Page"
|
||||||
msgstr "Seite"
|
msgstr "Seite"
|
||||||
|
|
||||||
#: content/models.py:323
|
#: models.py:329
|
||||||
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:24
|
||||||
msgid "Created on"
|
msgid "Created on"
|
||||||
msgstr "Erstellt am"
|
msgstr "Erstellt am"
|
||||||
|
|
||||||
#: content/templates/content/article_detail.html:36
|
#: templates/content/article_detail.html:36
|
||||||
msgid "share on"
|
msgid "share on"
|
||||||
msgstr "Teile auf"
|
msgstr "Teile auf"
|
||||||
|
|
||||||
#: content/templates/content/article_detail.html:51
|
#: templates/content/article_detail.html:51 views.py:156
|
||||||
#: content/templates/content/article_form.html:20 content/views.py:138
|
|
||||||
msgid "Edit Article"
|
msgid "Edit Article"
|
||||||
msgstr "Artikel bearbeiten"
|
msgstr "Artikel bearbeiten"
|
||||||
|
|
||||||
#: content/templates/content/article_form.html:20 content/views.py:139
|
#: templates/content/article_form.html:32 templates/content/page_form.html:42
|
||||||
msgid "Create Article"
|
#: templates/content/page_form.html:49
|
||||||
msgstr "Artikel erstellen"
|
|
||||||
|
|
||||||
#: content/templates/content/article_form.html:25
|
|
||||||
#: content/templates/content/page_form.html:49
|
|
||||||
#: content/templates/content/page_form.html:56
|
|
||||||
msgid "German"
|
msgid "German"
|
||||||
msgstr "Deutsch"
|
msgstr "Deutsch"
|
||||||
|
|
||||||
#: content/templates/content/article_form.html:26
|
#: templates/content/article_form.html:33 templates/content/page_form.html:43
|
||||||
#: content/templates/content/page_form.html:50
|
#: templates/content/page_form.html:57
|
||||||
#: content/templates/content/page_form.html:64
|
|
||||||
msgid "English"
|
msgid "English"
|
||||||
msgstr "Englisch"
|
msgstr "Englisch"
|
||||||
|
|
||||||
#: content/templates/content/article_form.html:45
|
#: templates/content/article_form.html:59 templates/content/page_form.html:66
|
||||||
#: content/templates/content/page_form.html:73
|
|
||||||
msgid "reset"
|
msgid "reset"
|
||||||
msgstr "Zurücksetzen"
|
msgstr "Zurücksetzen"
|
||||||
|
|
||||||
#: content/templates/content/article_form.html:46
|
#: templates/content/article_form.html:60 templates/content/page_form.html:67
|
||||||
#: content/templates/content/page_form.html:74
|
|
||||||
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:42
|
|
||||||
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:28
|
#: templates/content/page_form.html:35
|
||||||
#: content/templates/content/page_form.html:42
|
|
||||||
msgid "Add Page"
|
msgid "Add Page"
|
||||||
msgstr "Seite hinzufügen"
|
msgstr "Seite hinzufügen"
|
||||||
|
|
||||||
#: content/templates/content/page_form.html:27
|
#: templates/content/page_form.html:18
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
msgstr "Bearbeiten"
|
msgstr "Bearbeiten"
|
||||||
|
|
||||||
#: content/templates/content/page_form.html:44
|
#: templates/content/page_form.html:37
|
||||||
msgid "HTML Specific"
|
msgid "HTML Specific"
|
||||||
msgstr "HTML spezifisch"
|
msgstr "HTML spezifisch"
|
||||||
|
|
||||||
#: content/views.py:35
|
#: 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:205
|
#: views.py:157
|
||||||
|
msgid "Create Article"
|
||||||
|
msgstr "Artikel erstellen"
|
||||||
|
|
||||||
|
#: views.py:233
|
||||||
#, 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:219
|
#: views.py:262
|
||||||
#, 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."
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import models, migrations
|
||||||
import django.db.models.deletion
|
import django.db.models.deletion
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.db import models, migrations
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
@@ -44,8 +44,7 @@ class Migration(migrations.Migration):
|
|||||||
('date_modified', models.DateTimeField(
|
('date_modified', models.DateTimeField(
|
||||||
auto_now=True, verbose_name='Bearbeitet')),
|
auto_now=True, verbose_name='Bearbeitet')),
|
||||||
('author', models.ForeignKey(
|
('author', models.ForeignKey(
|
||||||
verbose_name='Autor', to=settings.AUTH_USER_MODEL,
|
verbose_name='Autor', to=settings.AUTH_USER_MODEL)),
|
||||||
on_delete=models.CASCADE))
|
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'ordering': ('-date_created',),
|
'ordering': ('-date_created',),
|
||||||
@@ -145,8 +144,7 @@ class Migration(migrations.Migration):
|
|||||||
model_name='article',
|
model_name='article',
|
||||||
name='category',
|
name='category',
|
||||||
field=models.ForeignKey(
|
field=models.ForeignKey(
|
||||||
verbose_name='Kategorie', to='content.Category',
|
verbose_name='Kategorie', to='content.Category'),
|
||||||
on_delete=models.CASCADE),
|
|
||||||
),
|
),
|
||||||
migrations.AlterUniqueTogether(
|
migrations.AlterUniqueTogether(
|
||||||
name='page',
|
name='page',
|
||||||
|
|||||||
@@ -1,27 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Generated by Django 1.11.8 on 2017-12-14 11:15
|
|
||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
from django.conf import settings
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('content', '0006_auto_20171115_0653'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='article',
|
|
||||||
name='author',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL, verbose_name='Autor'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='article',
|
|
||||||
name='category',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='content.Category', verbose_name='Kategorie'),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@@ -3,9 +3,9 @@ from ckeditor_uploader.fields import RichTextUploadingField
|
|||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.core.cache import cache
|
from django.core.cache import cache
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
|
from django.core.urlresolvers import reverse
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.template.defaultfilters import slugify
|
from django.template.defaultfilters import slugify
|
||||||
from django.urls import reverse
|
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.utils.safestring import mark_safe
|
from django.utils.safestring import mark_safe
|
||||||
from django.utils.translation import get_language, ugettext as _
|
from django.utils.translation import get_language, ugettext as _
|
||||||
@@ -41,14 +41,6 @@ def get_upload_path(instance, filename):
|
|||||||
return "categories/%s.%s" % (instance.slug, extension)
|
return "categories/%s.%s" % (instance.slug, extension)
|
||||||
|
|
||||||
|
|
||||||
def get_localized(obj, attr):
|
|
||||||
""" Return the localilzed field, or the fallback if the localized is empty.
|
|
||||||
"""
|
|
||||||
fallback = attr + '_de'
|
|
||||||
localized = attr + '_' + get_language()[:2]
|
|
||||||
return getattr(obj, localized) or getattr(obj, fallback)
|
|
||||||
|
|
||||||
|
|
||||||
class ArticleManager(models.Manager):
|
class ArticleManager(models.Manager):
|
||||||
"""Adds some predifined querys and joins some tables for faster querys."""
|
"""Adds some predifined querys and joins some tables for faster querys."""
|
||||||
|
|
||||||
@@ -77,14 +69,11 @@ class Article(models.Model):
|
|||||||
headline_en = models.CharField('Headline', max_length=255, blank=True)
|
headline_en = models.CharField('Headline', max_length=255, blank=True)
|
||||||
content_de = RichTextUploadingField(_('Content'))
|
content_de = RichTextUploadingField(_('Content'))
|
||||||
content_en = RichTextUploadingField('Content', blank=True)
|
content_en = RichTextUploadingField('Content', blank=True)
|
||||||
category = models.ForeignKey('Category',
|
category = models.ForeignKey('Category', verbose_name=_('Category'))
|
||||||
on_delete=models.PROTECT,
|
|
||||||
verbose_name=_('Category'))
|
|
||||||
image = models.ImageField(_('Image'), upload_to='news/',
|
image = models.ImageField(_('Image'), upload_to='news/',
|
||||||
blank=True, null=True)
|
blank=True, null=True)
|
||||||
slug = models.SlugField(_('Slug'), unique_for_month='date_created')
|
slug = models.SlugField(_('Slug'), unique_for_month='date_created')
|
||||||
author = models.ForeignKey(settings.AUTH_USER_MODEL,
|
author = models.ForeignKey(settings.AUTH_USER_MODEL,
|
||||||
on_delete=models.PROTECT,
|
|
||||||
verbose_name=_('Author'))
|
verbose_name=_('Author'))
|
||||||
status = models.SmallIntegerField(_('Status'), choices=STATUS_CHOICES,
|
status = models.SmallIntegerField(_('Status'), choices=STATUS_CHOICES,
|
||||||
default=STATUS_PUBLISHED)
|
default=STATUS_PUBLISHED)
|
||||||
@@ -126,12 +115,16 @@ class Article(models.Model):
|
|||||||
@property
|
@property
|
||||||
def headline(self):
|
def headline(self):
|
||||||
"""Return the localized headline, fallback to german if necessary."""
|
"""Return the localized headline, fallback to german if necessary."""
|
||||||
return mark_safe(get_localized(self, 'headline'))
|
return mark_safe(
|
||||||
|
getattr(self, "headline_%s" % get_language(), self.headline_de)
|
||||||
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def content(self):
|
def content(self):
|
||||||
"""Return the localized content, fallback to german if necessary."""
|
"""Return the localized content, fallback to german if necessary."""
|
||||||
return mark_safe(get_localized(self, 'content'))
|
return mark_safe(
|
||||||
|
getattr(self, "content_%s" % get_language(), self.content_de)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class Category(models.Model):
|
class Category(models.Model):
|
||||||
@@ -153,12 +146,13 @@ class Category(models.Model):
|
|||||||
@property
|
@property
|
||||||
def name(self):
|
def name(self):
|
||||||
"""Return the localized name, fallback to german if necessary."""
|
"""Return the localized name, fallback to german if necessary."""
|
||||||
return get_localized(self, 'name')
|
return getattr(self, "name_%s" % get_language(), self.name_de)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def description(self):
|
def description(self):
|
||||||
"""Return the localized description, fallback to german if necessary."""
|
"""Return the localized description, fallback to german if necessary."""
|
||||||
return get_localized(self, 'description')
|
return getattr(self, "description_%s" % get_language(),
|
||||||
|
self.description_de)
|
||||||
|
|
||||||
def get_absolute_url(self):
|
def get_absolute_url(self):
|
||||||
"""Return the URL of the article archive, filtered on this category."""
|
"""Return the URL of the article archive, filtered on this category."""
|
||||||
@@ -267,7 +261,9 @@ class Page(models.Model):
|
|||||||
@property
|
@property
|
||||||
def content(self):
|
def content(self):
|
||||||
"""Return the localized content, fallback to german if necessary."""
|
"""Return the localized content, fallback to german if necessary."""
|
||||||
return mark_safe(get_localized(self, 'content'))
|
return mark_safe(
|
||||||
|
getattr(self, "content_%s" % get_language(), self.content_de)
|
||||||
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def css_class(self):
|
def css_class(self):
|
||||||
@@ -279,22 +275,23 @@ class Page(models.Model):
|
|||||||
@property
|
@property
|
||||||
def description(self):
|
def description(self):
|
||||||
"""Return the localized description, fallback to german if necessary."""
|
"""Return the localized description, fallback to german if necessary."""
|
||||||
return get_localized(self, 'description')
|
return getattr(self, "description_%s" % get_language(),
|
||||||
|
self.description_de)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def menu_name(self):
|
def menu_name(self):
|
||||||
"""Return the localized menu name, fallback to german if necessary."""
|
"""Return the localized menu name, fallback to german if necessary."""
|
||||||
return get_localized(self, 'menu_name')
|
return getattr(self, "menu_name_%s" % get_language(), self.menu_name_de)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def pdf_file(self):
|
def pdf_file(self):
|
||||||
"""Return the localized PDF file, fallback to german if necessary."""
|
"""Return the localized PDF file, fallback to german if necessary."""
|
||||||
return get_localized(self, 'pdf_file')
|
return getattr(self, "pdf_%s" % get_language(), self.pdf_de)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def title(self):
|
def title(self):
|
||||||
"""Return the localized title, fallback to german if necessary."""
|
"""Return the localized title, fallback to german if necessary."""
|
||||||
return get_localized(self, 'title')
|
return getattr(self, "title_%s" % get_language(), self.title_de)
|
||||||
|
|
||||||
def clean(self):
|
def clean(self):
|
||||||
"""set the URL path, the right content type, and scrub the HTML code."""
|
"""set the URL path, the right content type, and scrub the HTML code."""
|
||||||
|
|||||||
Binary file not shown.
@@ -7,9 +7,9 @@ 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: 2017-06-19 22:46+0200\n"
|
"POT-Creation-Date: 2018-04-27 09:49+0200\n"
|
||||||
"PO-Revision-Date: 2016-09-28 00:24+0200\n"
|
"PO-Revision-Date: 2018-04-27 10:29+0105\n"
|
||||||
"Last-Translator: Christian Berg <xeniac@posteo.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"
|
||||||
"Language: de\n"
|
"Language: de\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
@@ -17,60 +17,61 @@ 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.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:18
|
#: 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:50
|
#: 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:57 views.py:149
|
||||||
|
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,247 +92,231 @@ 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:247
|
#: models.py:92 models.py:195 models.py:247
|
||||||
msgid "first created at"
|
msgid "first created at"
|
||||||
msgstr ""
|
msgstr "Erstellt am"
|
||||||
|
|
||||||
#: events/models.py:97 events/models.py:200 events/models.py:252
|
#: models.py:97 models.py:200 models.py:252
|
||||||
msgid "latest updated at"
|
msgid "latest updated at"
|
||||||
msgstr ""
|
msgstr "Geändert 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:231
|
#: models.py:231
|
||||||
msgid "Startpage"
|
msgid "Startpage"
|
||||||
msgstr "Startseite"
|
msgstr "Startseite"
|
||||||
|
|
||||||
#: events/models.py:234
|
#: models.py:234
|
||||||
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:236
|
#: models.py:236
|
||||||
msgid "Published on"
|
msgid "Published on"
|
||||||
msgstr "Veröffentlicht am"
|
msgstr "Veröffentlicht am"
|
||||||
|
|
||||||
#: events/models.py:238
|
#: models.py:238
|
||||||
msgid "Number of views"
|
msgid "Number of views"
|
||||||
msgstr "Wie oft gesehen"
|
msgstr "Wie oft gesehen"
|
||||||
|
|
||||||
#: events/models.py:262 events/templates/events/event_archive.html:38
|
#: models.py:262 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:263
|
#: models.py:263
|
||||||
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
|
||||||
#: events/templates/events/event_detail.html:85
|
#: templates/events/event_detail.html:85 templates/events/event_list.html:22
|
||||||
#: events/templates/events/event_list.html:22
|
#: templates/events/photo_detail.html:53
|
||||||
#: 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
|
||||||
#: events/templates/events/photo_upload.html:16
|
#: 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
|
||||||
#: events/templates/events/photo_upload.html:16
|
#: 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
|
||||||
#: events/templates/events/event_detail.html:31
|
#: templates/events/event_detail.html:31 templates/events/event_detail.html:72
|
||||||
#: events/templates/events/event_detail.html:72
|
#: templates/events/event_list.html:32 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
|
||||||
#: events/templates/events/event_detail.html:36
|
#: templates/events/event_detail.html:36 templates/events/event_detail.html:48
|
||||||
#: events/templates/events/event_detail.html:48
|
#: templates/events/photo_list.html:4 templates/events/photo_upload.html:28
|
||||||
#: events/templates/events/photo_upload.html:28
|
#: templates/events/photo_upload.html:29
|
||||||
#: 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
|
||||||
#: events/templates/events/event_detail.html:35
|
#: 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:104
|
#: 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:106
|
|
||||||
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:203
|
|
||||||
msgid "Event does not exist"
|
|
||||||
msgstr "Veranstaltung gibt es nicht"
|
|
||||||
|
|
||||||
#~ msgid " Edit"
|
#~ msgid " Edit"
|
||||||
#~ msgstr "Bearbeiten"
|
#~ msgstr "Bearbeiten"
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import django.db.models.deletion
|
|
||||||
from django.db import models, migrations
|
from django.db import models, migrations
|
||||||
|
|
||||||
import events.models
|
import events.models
|
||||||
|
import django.db.models.deletion
|
||||||
import utils
|
import utils
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -17,8 +17,7 @@ class Migration(migrations.Migration):
|
|||||||
name='Event',
|
name='Event',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(verbose_name='ID',
|
('id', models.AutoField(verbose_name='ID',
|
||||||
serialize=False, auto_created=True,
|
serialize=False, auto_created=True, primary_key=True)),
|
||||||
primary_key=True)),
|
|
||||||
('name', models.CharField(max_length=255, verbose_name='Name')),
|
('name', models.CharField(max_length=255, verbose_name='Name')),
|
||||||
('description', models.TextField(
|
('description', models.TextField(
|
||||||
verbose_name='Beschreibung', blank=True)),
|
verbose_name='Beschreibung', blank=True)),
|
||||||
@@ -27,20 +26,13 @@ class Migration(migrations.Migration):
|
|||||||
null=True, verbose_name='Ende', blank=True)),
|
null=True, verbose_name='Ende', blank=True)),
|
||||||
('url', models.URLField(verbose_name='Homepage', blank=True)),
|
('url', models.URLField(verbose_name='Homepage', blank=True)),
|
||||||
('image', models.ImageField(storage=utils.OverwriteStorage(
|
('image', models.ImageField(storage=utils.OverwriteStorage(
|
||||||
), upload_to=events.models.get_upload_path, null=True,
|
), upload_to=events.models.get_upload_path, null=True, verbose_name='Bild', blank=True)),
|
||||||
verbose_name='Bild', blank=True)),
|
|
||||||
('is_tournament', models.BooleanField(default=False,
|
('is_tournament', models.BooleanField(default=False,
|
||||||
help_text='Diese Veranstaltung ist ein Turnier, es gelten andere Regeln f\xfcr das Kyu Ranking.',
|
help_text='Diese Veranstaltung ist ein Turnier, es gelten andere Regeln f\xfcr das Kyu Ranking.', verbose_name='Turnier')),
|
||||||
verbose_name='Turnier')),
|
|
||||||
('photo_count', models.PositiveIntegerField(
|
('photo_count', models.PositiveIntegerField(
|
||||||
default=0, editable=False)),
|
default=0, editable=False)),
|
||||||
('event_series',
|
('event_series', models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, editable=False, to='events.Event', blank=True,
|
||||||
models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL,
|
help_text='Wenn dieser Termin zu einer Veranstaltungsreihe geh\xf6rt werden Ort, Beschreibung, Bild und Homepage von dem hier angegebenen Event \xfcbernommen.', null=True, verbose_name='Veranstaltungsreihen')),
|
||||||
editable=False, to='events.Event',
|
|
||||||
blank=True,
|
|
||||||
help_text='Wenn dieser Termin zu einer Veranstaltungsreihe geh\xf6rt werden Ort, Beschreibung, Bild und Homepage von dem hier angegebenen Event \xfcbernommen.',
|
|
||||||
null=True,
|
|
||||||
verbose_name='Veranstaltungsreihen')),
|
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'ordering': ('-start', '-end'),
|
'ordering': ('-start', '-end'),
|
||||||
@@ -52,310 +44,20 @@ class Migration(migrations.Migration):
|
|||||||
name='Location',
|
name='Location',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(verbose_name='ID',
|
('id', models.AutoField(verbose_name='ID',
|
||||||
serialize=False, auto_created=True,
|
serialize=False, auto_created=True, primary_key=True)),
|
||||||
primary_key=True)),
|
|
||||||
('name', models.CharField(max_length=200, verbose_name='Name')),
|
('name', models.CharField(max_length=200, verbose_name='Name')),
|
||||||
('description', models.TextField(
|
('description', models.TextField(
|
||||||
verbose_name='Beschreibung', blank=True)),
|
verbose_name='Beschreibung', blank=True)),
|
||||||
('image', models.ImageField(storage=utils.OverwriteStorage(
|
('image', models.ImageField(storage=utils.OverwriteStorage(
|
||||||
), upload_to=events.models.get_upload_path, null=True,
|
), upload_to=events.models.get_upload_path, null=True, verbose_name='Bild', blank=True)),
|
||||||
verbose_name='Bild', blank=True)),
|
|
||||||
('url', models.URLField(verbose_name='Homepage', blank=True)),
|
('url', models.URLField(verbose_name='Homepage', blank=True)),
|
||||||
('postal_code', models.CharField(
|
('postal_code', models.CharField(
|
||||||
max_length=6, verbose_name='Postleitzahl')),
|
max_length=6, verbose_name='Postleitzahl')),
|
||||||
('street_address', models.CharField(
|
('street_address', models.CharField(
|
||||||
max_length=127, verbose_name='Stra\xdfe')),
|
max_length=127, verbose_name='Stra\xdfe')),
|
||||||
('locality',
|
('locality', models.CharField(max_length=127, verbose_name='Ort')),
|
||||||
models.CharField(max_length=127, verbose_name='Ort')),
|
('country', models.CharField(max_length=2, verbose_name='Land', choices=[(b'GB', 'Vereinigtes K\xf6nigreich'), (b'AF', 'Afghanistan'), (b'AX', 'Aland Islands'), (b'AL', 'Albanien'), (b'DZ', 'Algerien'), (b'AS', 'Amerikanisch-Samoa'), (b'AD', 'Andorra'), (b'AO', 'Angola'), (b'AI', 'Anguilla'), (b'AQ', 'Antarktika'), (b'AG', 'Antigua und Barbuda'), (b'AR', 'Argentinien'), (b'AM', 'Armenien'), (b'AW', 'Aruba'), (b'AU', 'Australien'), (b'AT', '\xd6sterreich'), (b'AZ', 'Aserbaidschan'), (b'BS', 'Bahamas'), (b'BH', 'Bahrein'), (b'BD', 'Bangladesch'), (b'BB', 'Barbados'), (b'BY', 'Wei\xdfrussland'), (b'BE', 'Belgien'), (b'BZ', 'Belize'), (b'BJ', 'Benin'), (b'BM', 'Bermuda'), (b'BT', 'Bhutan'), (b'BO', 'Bolivien'), (b'BA', 'Bosnien und Herzegowina'), (b'BW', 'Botswana'), (b'BV', 'Bouvet Island'), (b'BR', 'Brasilien'), (b'IO', 'British Indian Ocean Territory'), (b'BN', 'Brunei Darussalam'), (b'BG', 'Bulgarien'), (b'BF', 'Burkina Faso'), (b'BI', 'Burundi'), (b'KH', 'Kambodscha'), (b'CM', 'Kamerun'), (b'CA', 'Kanada'), (b'CV', 'Cape Verde'), (b'KY', 'Cayman Islands'), (b'CF', 'Zentralafrikanische Republik'), (b'TD', 'Tschad'), (b'CL', 'Chile'), (b'CN', 'China'), (b'CX', 'Christmas Island'), (b'CC', 'Cocos (Keeling) Islands'), (b'CO', 'Kolumbien'), (b'KM', 'Komoren'), (b'CG', 'Kongo'), (b'CD', 'Kongo, Demokratische Republik'), (b'CK', 'Cook-Inseln'), (b'CR', 'Costa Rica'), (b'CI', "Cote d'Ivoire"), (b'HR', 'Kroatien'), (b'CU', 'Kuba'), (b'CY', 'Zypern'), (b'CZ', 'Tschechische Republik'), (b'DK', 'D\xe4nemark'), (b'DJ', 'Dschibuti'), (b'DM', 'Dominica'), (b'DO', 'Dominikanische Republik'), (b'EC', 'Ecuador'), (b'EG', '\xc4gypten'), (b'SV', 'El Salvador'), (b'GQ', '\xc4quatorial-Guinea'), (b'ER', 'Eritrea'), (b'EE', 'Estland'), (b'ET', '\xc4thiopien'), (b'FK', 'Falklandinseln (Malvinas)'), (b'FO', 'F\xe4r\xf6er-Inseln'), (b'FJ', 'Fidschi'), (b'FI', 'Finnland'), (b'FR', 'Frankreich'), (b'GF', 'Franz\xf6sisch-Guayana'), (b'PF', 'Franz\xf6sisch-Polynesien'), (b'TF', 'Franz\xf6sisch S\xfcdliche Territorien'), (b'GA', 'Gabun'), (b'GM', 'Gambia'), (b'GE', 'Georgia'), (b'DE', 'Deutschland'), (b'GH', 'Ghana'), (b'GI', 'Gibraltar'), (b'GR', 'Griechenland'), (b'GL', 'Gr\xf6nland'), (b'GD', 'Grenada'), (b'GP', 'Guadeloupe'), (b'GU', 'Guam'), (b'GT', 'Guatemala'), (b'GG', 'Guernsey'), (b'GN', 'Guinea'), (b'GW', 'Guinea-Bissau'), (b'GY', 'Guyana'), (b'HT', 'Haiti'), (b'HM', 'Heard und McDonald Inseln'), (b'VA', 'Heiliger Stuhl (Vatikanstadt)'), (b'HN', 'Honduras'), (b'HK', 'Hongkong'), (b'HU', 'Ungarn'), (b'IS', 'Island'), (b'IN', 'Indien'), (b'ID', 'Indonesien'), (b'IR', 'Iran, Islamische Republik'), (b'IQ', 'Irak'), (b'IE', 'Irland'), (b'IM', 'Isle of Man'), (b'IL', 'Israel'), (b'IT', 'Italien'), (b'JM', 'Jamaika'), (b'JP', 'Japan'), (b'JE', 'Jersey'), (b'JO', 'Jordan'), (b'KZ', 'Kasachstan'), (b'KE', 'Kenia'), (b'KI', 'Kiribati'), (b'KP', 'Korea, Demokratische Volksrepublik'), (b'KR', 'Korea, Republik'), (b'KW', 'Kuwait'), (b'KG', 'Kirgisistan'), (b'LA', 'Lao Demokratischen Volksrepublik'), (b'LV', 'Lettland'), (b'LB', 'Libanon'), (
|
||||||
('country', models.CharField(max_length=2, verbose_name='Land',
|
b'LS', 'Lesotho'), (b'LR', 'Liberia'), (b'LY', 'Libyen'), (b'LI', 'Liechtenstein'), (b'LT', 'Litauen'), (b'LU', 'Luxemburg'), (b'MO', 'Macao'), (b'MK', 'Mazedonien, die ehemalige jugoslawische Republik'), (b'MG', 'Madagaskar'), (b'MW', 'Malawi'), (b'MY', 'Malaysia'), (b'MV', 'Malediven'), (b'ML', 'Mali'), (b'MT', 'Malta'), (b'MH', 'Marshall Islands'), (b'MQ', 'Martinique'), (b'MR', 'Mauretanien'), (b'MU', 'Mauritius'), (b'YT', 'Mayotte'), (b'MX', 'Mexiko'), (b'FM', 'Mikronesien, F\xf6derierte Staaten von'), (b'MD', 'Moldawien'), (b'MC', 'Monaco'), (b'MN', 'Mongolei'), (b'ME', 'Montenegro'), (b'MS', 'Montserrat'), (b'MA', 'Marokko'), (b'MZ', 'Mosambik'), (b'MM', 'Myanmar'), (b'NA', 'Namibia'), (b'NR', 'Nauru'), (b'NP', 'Nepal'), (b'NL', 'Niederlande'), (b'AN', 'Niederl\xe4ndische Antillen'), (b'NC', 'Neukaledonien'), (b'NZ', 'New Zealand'), (b'NI', 'Nicaragua'), (b'NE', 'Niger'), (b'NG', 'Nigeria'), (b'NU', 'Niue'), (b'NF', 'Norfolk Island'), (b'MP', 'Northern Mariana Islands'), (b'NO', 'Norwegen'), (b'OM', 'Oman'), (b'PK', 'Pakistan'), (b'PW', 'Palau'), (b'PS', 'Pal\xe4stinensische Autonomiegebiete'), (b'PA', 'Panama'), (b'PG', 'Papua-Neuguinea'), (b'PY', 'Paraguay'), (b'PE', 'Peru'), (b'PH', 'Philippinen'), (b'PN', 'Pitcairn'), (b'PL', 'Polen'), (b'PT', 'Portugal'), (b'PR', 'Puerto Rico'), (b'QA', 'Katar'), (b'RE', 'Wiedervereinigung'), (b'RO', 'Rum\xe4nien'), (b'RU', 'Russischen F\xf6deration'), (b'RW', 'Ruanda'), (b'BL', 'Saint Barthelemy'), (b'SH', 'Saint Helena'), (b'KN', 'Saint Kitts und Nevis'), (b'LC', 'Santa Lucia'), (b'MF', 'Santa Martin'), (b'PM', 'Saint Pierre und Miquelon'), (b'VC', 'Saint Vincent und die Grenadinen'), (b'WS', 'Samoa'), (b'SM', 'San Marino'), (b'ST', 'Sao Tome und Principe'), (b'SA', 'Saudi-Arabien'), (b'SN', 'Senegal'), (b'RS', 'Serbien'), (b'SC', 'Seychellen'), (b'SL', 'Sierra Leone'), (b'SG', 'Singapur'), (b'SK', 'Slowakei'), (b'SI', 'Slowenien'), (b'SB', 'Salomon-Inseln'), (b'SO', 'Somalia'), (b'ZA', 'S\xfcdafrika'), (b'GS', 'S\xfcdgeorgien und die S\xfcdlichen Sandwichinseln'), (b'ES', 'Spanien'), (b'LK', 'Sri Lanka'), (b'SD', 'Sudan'), (b'SR', 'Suriname'), (b'SJ', 'Svalbard und Jan Mayen'), (b'SZ', 'Swaziland'), (b'SE', 'Schweden'), (b'CH', 'Schweiz'), (b'SY', 'Arabische Republik Syrien'), (b'TW', 'Taiwan, Province of China'), (b'TJ', 'Tadschikistan'), (b'TZ', 'Tansania, Vereinigte Republik'), (b'TH', 'Thailand'), (b'TL', 'Timor-Leste'), (b'TG', 'Togo'), (b'TK', 'Tokelau'), (b'TO', 'Tonga'), (b'TT', 'Trinidad und Tobago'), (b'TN', 'Tunesien'), (b'TR', 'T\xfcrkei'), (b'TM', 'Turkmenistan'), (b'TC', 'Turks-und Caicosinseln'), (b'TV', 'Tuvalu'), (b'UG', 'Uganda'), (b'UA', 'Ukraine'), (b'AE', 'Vereinigte Arabische Emirate'), (b'US', 'Vereinigte Staaten'), (b'UM', 'United States Minor Outlying Islands'), (b'UY', 'Uruguay'), (b'UZ', 'Usbekistan'), (b'VU', 'Vanuatu'), (b'VE', 'Venezuela'), (b'VN', 'Vietnam'), (b'VG', 'Virgin Islands, British'), (b'VI', 'Virgin Islands, US'), (b'WF', 'Wallis und Futuna'), (b'EH', 'Westsahara'), (b'YE', 'Jemen'), (b'ZM', 'Sambia'), (b'ZW', 'Zimbabwe')])),
|
||||||
choices=[(b'GB',
|
|
||||||
'Vereinigtes K\xf6nigreich'),
|
|
||||||
(b'AF', 'Afghanistan'),
|
|
||||||
(b'AX', 'Aland Islands'),
|
|
||||||
(b'AL', 'Albanien'),
|
|
||||||
(b'DZ', 'Algerien'), (
|
|
||||||
b'AS',
|
|
||||||
'Amerikanisch-Samoa'),
|
|
||||||
(b'AD', 'Andorra'),
|
|
||||||
(b'AO', 'Angola'),
|
|
||||||
(b'AI', 'Anguilla'),
|
|
||||||
(b'AQ', 'Antarktika'), (
|
|
||||||
b'AG',
|
|
||||||
'Antigua und Barbuda'),
|
|
||||||
(b'AR', 'Argentinien'),
|
|
||||||
(b'AM', 'Armenien'),
|
|
||||||
(b'AW', 'Aruba'),
|
|
||||||
(b'AU', 'Australien'),
|
|
||||||
(b'AT', '\xd6sterreich'),
|
|
||||||
(b'AZ', 'Aserbaidschan'),
|
|
||||||
(b'BS', 'Bahamas'),
|
|
||||||
(b'BH', 'Bahrein'),
|
|
||||||
(b'BD', 'Bangladesch'),
|
|
||||||
(b'BB', 'Barbados'), (
|
|
||||||
b'BY',
|
|
||||||
'Wei\xdfrussland'),
|
|
||||||
(b'BE', 'Belgien'),
|
|
||||||
(b'BZ', 'Belize'),
|
|
||||||
(b'BJ', 'Benin'),
|
|
||||||
(b'BM', 'Bermuda'),
|
|
||||||
(b'BT', 'Bhutan'),
|
|
||||||
(b'BO', 'Bolivien'), (
|
|
||||||
b'BA',
|
|
||||||
'Bosnien und Herzegowina'),
|
|
||||||
(b'BW', 'Botswana'),
|
|
||||||
(b'BV', 'Bouvet Island'),
|
|
||||||
(b'BR', 'Brasilien'), (
|
|
||||||
b'IO',
|
|
||||||
'British Indian Ocean Territory'),
|
|
||||||
(b'BN',
|
|
||||||
'Brunei Darussalam'),
|
|
||||||
(b'BG', 'Bulgarien'),
|
|
||||||
(b'BF', 'Burkina Faso'),
|
|
||||||
(b'BI', 'Burundi'),
|
|
||||||
(b'KH', 'Kambodscha'),
|
|
||||||
(b'CM', 'Kamerun'),
|
|
||||||
(b'CA', 'Kanada'),
|
|
||||||
(b'CV', 'Cape Verde'),
|
|
||||||
(b'KY', 'Cayman Islands'),
|
|
||||||
(b'CF',
|
|
||||||
'Zentralafrikanische Republik'),
|
|
||||||
(b'TD', 'Tschad'),
|
|
||||||
(b'CL', 'Chile'),
|
|
||||||
(b'CN', 'China'), (b'CX',
|
|
||||||
'Christmas Island'),
|
|
||||||
(b'CC',
|
|
||||||
'Cocos (Keeling) Islands'),
|
|
||||||
(b'CO', 'Kolumbien'),
|
|
||||||
(b'KM', 'Komoren'),
|
|
||||||
(b'CG', 'Kongo'), (b'CD',
|
|
||||||
'Kongo, Demokratische Republik'),
|
|
||||||
(b'CK', 'Cook-Inseln'),
|
|
||||||
(b'CR', 'Costa Rica'),
|
|
||||||
(b'CI', "Cote d'Ivoire"),
|
|
||||||
(b'HR', 'Kroatien'),
|
|
||||||
(b'CU', 'Kuba'),
|
|
||||||
(b'CY', 'Zypern'), (b'CZ',
|
|
||||||
'Tschechische Republik'),
|
|
||||||
(b'DK', 'D\xe4nemark'),
|
|
||||||
(b'DJ', 'Dschibuti'),
|
|
||||||
(b'DM', 'Dominica'), (
|
|
||||||
b'DO',
|
|
||||||
'Dominikanische Republik'),
|
|
||||||
(b'EC', 'Ecuador'),
|
|
||||||
(b'EG', '\xc4gypten'),
|
|
||||||
(b'SV', 'El Salvador'), (
|
|
||||||
b'GQ',
|
|
||||||
'\xc4quatorial-Guinea'),
|
|
||||||
(b'ER', 'Eritrea'),
|
|
||||||
(b'EE', 'Estland'),
|
|
||||||
(b'ET', '\xc4thiopien'), (
|
|
||||||
b'FK',
|
|
||||||
'Falklandinseln (Malvinas)'),
|
|
||||||
(b'FO',
|
|
||||||
'F\xe4r\xf6er-Inseln'),
|
|
||||||
(b'FJ', 'Fidschi'),
|
|
||||||
(b'FI', 'Finnland'),
|
|
||||||
(b'FR', 'Frankreich'), (
|
|
||||||
b'GF',
|
|
||||||
'Franz\xf6sisch-Guayana'),
|
|
||||||
(b'PF',
|
|
||||||
'Franz\xf6sisch-Polynesien'),
|
|
||||||
(b'TF',
|
|
||||||
'Franz\xf6sisch S\xfcdliche Territorien'),
|
|
||||||
(b'GA', 'Gabun'),
|
|
||||||
(b'GM', 'Gambia'),
|
|
||||||
(b'GE', 'Georgia'),
|
|
||||||
(b'DE', 'Deutschland'),
|
|
||||||
(b'GH', 'Ghana'),
|
|
||||||
(b'GI', 'Gibraltar'),
|
|
||||||
(b'GR', 'Griechenland'),
|
|
||||||
(b'GL', 'Gr\xf6nland'),
|
|
||||||
(b'GD', 'Grenada'),
|
|
||||||
(b'GP', 'Guadeloupe'),
|
|
||||||
(b'GU', 'Guam'),
|
|
||||||
(b'GT', 'Guatemala'),
|
|
||||||
(b'GG', 'Guernsey'),
|
|
||||||
(b'GN', 'Guinea'),
|
|
||||||
(b'GW', 'Guinea-Bissau'),
|
|
||||||
(b'GY', 'Guyana'),
|
|
||||||
(b'HT', 'Haiti'), (b'HM',
|
|
||||||
'Heard und McDonald Inseln'),
|
|
||||||
(b'VA',
|
|
||||||
'Heiliger Stuhl (Vatikanstadt)'),
|
|
||||||
(b'HN', 'Honduras'),
|
|
||||||
(b'HK', 'Hongkong'),
|
|
||||||
(b'HU', 'Ungarn'),
|
|
||||||
(b'IS', 'Island'),
|
|
||||||
(b'IN', 'Indien'),
|
|
||||||
(b'ID', 'Indonesien'), (
|
|
||||||
b'IR',
|
|
||||||
'Iran, Islamische Republik'),
|
|
||||||
(b'IQ', 'Irak'),
|
|
||||||
(b'IE', 'Irland'),
|
|
||||||
(b'IM', 'Isle of Man'),
|
|
||||||
(b'IL', 'Israel'),
|
|
||||||
(b'IT', 'Italien'),
|
|
||||||
(b'JM', 'Jamaika'),
|
|
||||||
(b'JP', 'Japan'),
|
|
||||||
(b'JE', 'Jersey'),
|
|
||||||
(b'JO', 'Jordan'),
|
|
||||||
(b'KZ', 'Kasachstan'),
|
|
||||||
(b'KE', 'Kenia'),
|
|
||||||
(b'KI', 'Kiribati'), (
|
|
||||||
b'KP',
|
|
||||||
'Korea, Demokratische Volksrepublik'),
|
|
||||||
(
|
|
||||||
b'KR',
|
|
||||||
'Korea, Republik'),
|
|
||||||
(b'KW', 'Kuwait'),
|
|
||||||
(b'KG', 'Kirgisistan'), (
|
|
||||||
b'LA',
|
|
||||||
'Lao Demokratischen Volksrepublik'),
|
|
||||||
(b'LV', 'Lettland'),
|
|
||||||
(b'LB', 'Libanon'), (
|
|
||||||
b'LS', 'Lesotho'),
|
|
||||||
(b'LR', 'Liberia'),
|
|
||||||
(b'LY', 'Libyen'),
|
|
||||||
(b'LI', 'Liechtenstein'),
|
|
||||||
(b'LT', 'Litauen'),
|
|
||||||
(b'LU', 'Luxemburg'),
|
|
||||||
(b'MO', 'Macao'), (b'MK',
|
|
||||||
'Mazedonien, die ehemalige jugoslawische Republik'),
|
|
||||||
(b'MG', 'Madagaskar'),
|
|
||||||
(b'MW', 'Malawi'),
|
|
||||||
(b'MY', 'Malaysia'),
|
|
||||||
(b'MV', 'Malediven'),
|
|
||||||
(b'ML', 'Mali'),
|
|
||||||
(b'MT', 'Malta'), (b'MH',
|
|
||||||
'Marshall Islands'),
|
|
||||||
(b'MQ', 'Martinique'),
|
|
||||||
(b'MR', 'Mauretanien'),
|
|
||||||
(b'MU', 'Mauritius'),
|
|
||||||
(b'YT', 'Mayotte'),
|
|
||||||
(b'MX', 'Mexiko'), (b'FM',
|
|
||||||
'Mikronesien, F\xf6derierte Staaten von'),
|
|
||||||
(b'MD', 'Moldawien'),
|
|
||||||
(b'MC', 'Monaco'),
|
|
||||||
(b'MN', 'Mongolei'),
|
|
||||||
(b'ME', 'Montenegro'),
|
|
||||||
(b'MS', 'Montserrat'),
|
|
||||||
(b'MA', 'Marokko'),
|
|
||||||
(b'MZ', 'Mosambik'),
|
|
||||||
(b'MM', 'Myanmar'),
|
|
||||||
(b'NA', 'Namibia'),
|
|
||||||
(b'NR', 'Nauru'),
|
|
||||||
(b'NP', 'Nepal'),
|
|
||||||
(b'NL', 'Niederlande'), (
|
|
||||||
b'AN',
|
|
||||||
'Niederl\xe4ndische Antillen'),
|
|
||||||
(b'NC', 'Neukaledonien'),
|
|
||||||
(b'NZ', 'New Zealand'),
|
|
||||||
(b'NI', 'Nicaragua'),
|
|
||||||
(b'NE', 'Niger'),
|
|
||||||
(b'NG', 'Nigeria'),
|
|
||||||
(b'NU', 'Niue'),
|
|
||||||
(b'NF', 'Norfolk Island'),
|
|
||||||
(b'MP',
|
|
||||||
'Northern Mariana Islands'),
|
|
||||||
(b'NO', 'Norwegen'),
|
|
||||||
(b'OM', 'Oman'),
|
|
||||||
(b'PK', 'Pakistan'),
|
|
||||||
(b'PW', 'Palau'), (b'PS',
|
|
||||||
'Pal\xe4stinensische Autonomiegebiete'),
|
|
||||||
(b'PA', 'Panama'), (
|
|
||||||
b'PG',
|
|
||||||
'Papua-Neuguinea'),
|
|
||||||
(b'PY', 'Paraguay'),
|
|
||||||
(b'PE', 'Peru'),
|
|
||||||
(b'PH', 'Philippinen'),
|
|
||||||
(b'PN', 'Pitcairn'),
|
|
||||||
(b'PL', 'Polen'),
|
|
||||||
(b'PT', 'Portugal'),
|
|
||||||
(b'PR', 'Puerto Rico'),
|
|
||||||
(b'QA', 'Katar'), (b'RE',
|
|
||||||
'Wiedervereinigung'),
|
|
||||||
(b'RO', 'Rum\xe4nien'), (
|
|
||||||
b'RU',
|
|
||||||
'Russischen F\xf6deration'),
|
|
||||||
(b'RW', 'Ruanda'), (b'BL',
|
|
||||||
'Saint Barthelemy'),
|
|
||||||
(b'SH', 'Saint Helena'), (
|
|
||||||
b'KN',
|
|
||||||
'Saint Kitts und Nevis'),
|
|
||||||
(b'LC', 'Santa Lucia'),
|
|
||||||
(b'MF', 'Santa Martin'), (
|
|
||||||
b'PM',
|
|
||||||
'Saint Pierre und Miquelon'),
|
|
||||||
(b'VC',
|
|
||||||
'Saint Vincent und die Grenadinen'),
|
|
||||||
(b'WS', 'Samoa'),
|
|
||||||
(b'SM', 'San Marino'), (
|
|
||||||
b'ST',
|
|
||||||
'Sao Tome und Principe'),
|
|
||||||
(b'SA', 'Saudi-Arabien'),
|
|
||||||
(b'SN', 'Senegal'),
|
|
||||||
(b'RS', 'Serbien'),
|
|
||||||
(b'SC', 'Seychellen'),
|
|
||||||
(b'SL', 'Sierra Leone'),
|
|
||||||
(b'SG', 'Singapur'),
|
|
||||||
(b'SK', 'Slowakei'),
|
|
||||||
(b'SI', 'Slowenien'),
|
|
||||||
(b'SB', 'Salomon-Inseln'),
|
|
||||||
(b'SO', 'Somalia'),
|
|
||||||
(b'ZA', 'S\xfcdafrika'), (
|
|
||||||
b'GS',
|
|
||||||
'S\xfcdgeorgien und die S\xfcdlichen Sandwichinseln'),
|
|
||||||
(b'ES', 'Spanien'),
|
|
||||||
(b'LK', 'Sri Lanka'),
|
|
||||||
(b'SD', 'Sudan'),
|
|
||||||
(b'SR', 'Suriname'), (
|
|
||||||
b'SJ',
|
|
||||||
'Svalbard und Jan Mayen'),
|
|
||||||
(b'SZ', 'Swaziland'),
|
|
||||||
(b'SE', 'Schweden'),
|
|
||||||
(b'CH', 'Schweiz'), (
|
|
||||||
b'SY',
|
|
||||||
'Arabische Republik Syrien'),
|
|
||||||
(b'TW',
|
|
||||||
'Taiwan, Province of China'),
|
|
||||||
(b'TJ', 'Tadschikistan'),
|
|
||||||
(b'TZ',
|
|
||||||
'Tansania, Vereinigte Republik'),
|
|
||||||
(b'TH', 'Thailand'),
|
|
||||||
(b'TL', 'Timor-Leste'),
|
|
||||||
(b'TG', 'Togo'),
|
|
||||||
(b'TK', 'Tokelau'),
|
|
||||||
(b'TO', 'Tonga'), (b'TT',
|
|
||||||
'Trinidad und Tobago'),
|
|
||||||
(b'TN', 'Tunesien'),
|
|
||||||
(b'TR', 'T\xfcrkei'),
|
|
||||||
(b'TM', 'Turkmenistan'), (
|
|
||||||
b'TC',
|
|
||||||
'Turks-und Caicosinseln'),
|
|
||||||
(b'TV', 'Tuvalu'),
|
|
||||||
(b'UG', 'Uganda'),
|
|
||||||
(b'UA', 'Ukraine'), (
|
|
||||||
b'AE',
|
|
||||||
'Vereinigte Arabische Emirate'),
|
|
||||||
(b'US',
|
|
||||||
'Vereinigte Staaten'), (
|
|
||||||
b'UM',
|
|
||||||
'United States Minor Outlying Islands'),
|
|
||||||
(b'UY', 'Uruguay'),
|
|
||||||
(b'UZ', 'Usbekistan'),
|
|
||||||
(b'VU', 'Vanuatu'),
|
|
||||||
(b'VE', 'Venezuela'),
|
|
||||||
(b'VN', 'Vietnam'), (
|
|
||||||
b'VG',
|
|
||||||
'Virgin Islands, British'),
|
|
||||||
(b'VI',
|
|
||||||
'Virgin Islands, US'), (
|
|
||||||
b'WF',
|
|
||||||
'Wallis und Futuna'),
|
|
||||||
(b'EH', 'Westsahara'),
|
|
||||||
(b'YE', 'Jemen'),
|
|
||||||
(b'ZM', 'Sambia'),
|
|
||||||
(b'ZW', 'Zimbabwe')])),
|
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'verbose_name': 'Veranstaltungsort',
|
'verbose_name': 'Veranstaltungsort',
|
||||||
@@ -365,8 +67,6 @@ class Migration(migrations.Migration):
|
|||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='event',
|
model_name='event',
|
||||||
name='location',
|
name='location',
|
||||||
field=models.ForeignKey(
|
field=models.ForeignKey(to='events.Location'),
|
||||||
to='events.Location',
|
|
||||||
on_delete=models.CASCADE),
|
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import ckeditor.fields
|
|
||||||
import django.db.models.deletion
|
|
||||||
import easy_thumbnails.fields
|
|
||||||
from django.conf import settings
|
|
||||||
from django.db import models, migrations
|
from django.db import models, migrations
|
||||||
|
import ckeditor.fields
|
||||||
import events.models
|
import events.models
|
||||||
|
import easy_thumbnails.fields
|
||||||
|
import django.db.models.deletion
|
||||||
import utils
|
import utils
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
('events', '0003_auto_20150823_2232'),
|
('events', '0003_auto_20150823_2232'),
|
||||||
@@ -22,24 +22,18 @@ class Migration(migrations.Migration):
|
|||||||
name='Photo',
|
name='Photo',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(verbose_name='ID',
|
('id', models.AutoField(verbose_name='ID',
|
||||||
serialize=False, auto_created=True,
|
serialize=False, auto_created=True, primary_key=True)),
|
||||||
primary_key=True)),
|
|
||||||
('name', models.CharField(max_length=100,
|
('name', models.CharField(max_length=100,
|
||||||
verbose_name='Name', blank=True)),
|
verbose_name='Name', blank=True)),
|
||||||
('image', easy_thumbnails.fields.ThumbnailerImageField(
|
('image', easy_thumbnails.fields.ThumbnailerImageField(
|
||||||
upload_to=events.models.get_upload_path,
|
upload_to=events.models.get_upload_path, storage=utils.OverwriteStorage(), verbose_name='Bild')),
|
||||||
storage=utils.OverwriteStorage(), verbose_name='Bild')),
|
|
||||||
('description', models.TextField(max_length=300,
|
('description', models.TextField(max_length=300,
|
||||||
verbose_name='Beschreibung',
|
verbose_name='Beschreibung', blank=True)),
|
||||||
blank=True)),
|
|
||||||
('on_startpage', models.BooleanField(default=False,
|
('on_startpage', models.BooleanField(default=False,
|
||||||
help_text='Display this Photo on the Startpage Teaser',
|
help_text='Display this Photo on the Startpage Teaser', verbose_name='Startpage')),
|
||||||
verbose_name='Startpage')),
|
('created_date', models.DateTimeField(verbose_name='Published on')),
|
||||||
('created_date',
|
|
||||||
models.DateTimeField(verbose_name='Published on')),
|
|
||||||
('views', models.PositiveIntegerField(default=0,
|
('views', models.PositiveIntegerField(default=0,
|
||||||
verbose_name='Number of views',
|
verbose_name='Number of views', editable=False)),
|
||||||
editable=False)),
|
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'ordering': ['created_date'],
|
'ordering': ['created_date'],
|
||||||
@@ -52,8 +46,7 @@ class Migration(migrations.Migration):
|
|||||||
migrations.AlterModelOptions(
|
migrations.AlterModelOptions(
|
||||||
name='event',
|
name='event',
|
||||||
options={'ordering': (
|
options={'ordering': (
|
||||||
'start', 'end'), 'verbose_name': 'Termin',
|
'start', 'end'), 'verbose_name': 'Termin', 'verbose_name_plural': 'Termine'},
|
||||||
'verbose_name_plural': 'Termine'},
|
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='event',
|
model_name='event',
|
||||||
@@ -64,19 +57,14 @@ class Migration(migrations.Migration):
|
|||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='event',
|
model_name='event',
|
||||||
name='event_series',
|
name='event_series',
|
||||||
field=models.ForeignKey(
|
field=models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, blank=True, to='events.Event',
|
||||||
on_delete=django.db.models.deletion.SET_NULL, blank=True,
|
help_text='Wenn dieser Termin zu einer Veranstaltungsreihe geh\xf6rt werden Ort, Beschreibung, Bild und Homepage von dem hier angegebenen Event \xfcbernommen.', null=True, verbose_name='Veranstaltungsreihen'),
|
||||||
to='events.Event',
|
|
||||||
help_text='Wenn dieser Termin zu einer Veranstaltungsreihe geh\xf6rt werden Ort, Beschreibung, Bild und Homepage von dem hier angegebenen Event \xfcbernommen.',
|
|
||||||
null=True, verbose_name='Veranstaltungsreihen'),
|
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='event',
|
model_name='event',
|
||||||
name='image',
|
name='image',
|
||||||
field=easy_thumbnails.fields.ThumbnailerImageField(
|
field=easy_thumbnails.fields.ThumbnailerImageField(storage=utils.OverwriteStorage(
|
||||||
storage=utils.OverwriteStorage(
|
), upload_to=events.models.get_upload_path, null=True, verbose_name='Bild', blank=True),
|
||||||
), upload_to=events.models.get_upload_path, null=True,
|
|
||||||
verbose_name='Bild', blank=True),
|
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='location',
|
model_name='location',
|
||||||
@@ -87,21 +75,17 @@ class Migration(migrations.Migration):
|
|||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='location',
|
model_name='location',
|
||||||
name='image',
|
name='image',
|
||||||
field=easy_thumbnails.fields.ThumbnailerImageField(
|
field=easy_thumbnails.fields.ThumbnailerImageField(storage=utils.OverwriteStorage(
|
||||||
storage=utils.OverwriteStorage(
|
), upload_to=events.models.get_upload_path, null=True, verbose_name='Bild', blank=True),
|
||||||
), upload_to=events.models.get_upload_path, null=True,
|
|
||||||
verbose_name='Bild', blank=True),
|
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='photo',
|
model_name='photo',
|
||||||
name='event',
|
name='event',
|
||||||
field=models.ForeignKey(
|
field=models.ForeignKey(to='events.Event'),
|
||||||
to='events.Event', on_delete=models.CASCADE),
|
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='photo',
|
model_name='photo',
|
||||||
name='photographer',
|
name='photographer',
|
||||||
field=models.ForeignKey(
|
field=models.ForeignKey(to=settings.AUTH_USER_MODEL),
|
||||||
to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE),
|
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,32 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Generated by Django 1.11.8 on 2017-12-14 11:15
|
|
||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
from django.conf import settings
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('events', '0008_auto_20171115_0653'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='event',
|
|
||||||
name='location',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.Location'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='photo',
|
|
||||||
name='event',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.Event'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='photo',
|
|
||||||
name='photographer',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@@ -49,9 +49,7 @@ class EventDetailMixin(object):
|
|||||||
:return: a django QuerySets
|
:return: a django QuerySets
|
||||||
"""
|
"""
|
||||||
if self.model == models.Event:
|
if self.model == models.Event:
|
||||||
self.event = models.Event.objects.get(pk=self.kwargs['pk'])
|
return models.Event.objects.all()
|
||||||
queryset = self.model.objects.all()
|
|
||||||
else:
|
|
||||||
try:
|
try:
|
||||||
self.event = models.Event.objects.get(pk=self.kwargs['event'])
|
self.event = models.Event.objects.get(pk=self.kwargs['event'])
|
||||||
queryset = self.model.objects.filter(event=self.event)
|
queryset = self.model.objects.filter(event=self.event)
|
||||||
|
|||||||
@@ -4,10 +4,10 @@ import os
|
|||||||
from ckeditor.fields import RichTextField
|
from ckeditor.fields import RichTextField
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
|
from django.core.urlresolvers import reverse
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from django.template.defaultfilters import slugify
|
from django.template.defaultfilters import slugify
|
||||||
from django.urls import reverse
|
|
||||||
from django.utils.timezone import now
|
from django.utils.timezone import now
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
from easy_thumbnails.fields import ThumbnailerImageField
|
from easy_thumbnails.fields import ThumbnailerImageField
|
||||||
@@ -51,7 +51,7 @@ class Event(models.Model):
|
|||||||
"""An Event that could be a tournament, a game session, or an convention."""
|
"""An Event that could be a tournament, a game session, or an convention."""
|
||||||
name = models.CharField(_('Name'), max_length=255)
|
name = models.CharField(_('Name'), max_length=255)
|
||||||
description = RichTextField(_("Description"), blank=True)
|
description = RichTextField(_("Description"), blank=True)
|
||||||
location = models.ForeignKey('Location', on_delete=models.PROTECT)
|
location = models.ForeignKey('Location')
|
||||||
start = models.DateTimeField(_('Start'))
|
start = models.DateTimeField(_('Start'))
|
||||||
end = models.DateTimeField(_('End'), blank=True, null=True)
|
end = models.DateTimeField(_('End'), blank=True, null=True)
|
||||||
url = models.URLField(_('Homepage'), blank=True)
|
url = models.URLField(_('Homepage'), blank=True)
|
||||||
@@ -220,14 +220,13 @@ class Photo(models.Model):
|
|||||||
upload_to=get_upload_path,
|
upload_to=get_upload_path,
|
||||||
storage=OverwriteStorage()
|
storage=OverwriteStorage()
|
||||||
)
|
)
|
||||||
event = models.ForeignKey('events.Event', on_delete=models.PROTECT, )
|
event = models.ForeignKey('events.Event')
|
||||||
description = models.TextField(
|
description = models.TextField(
|
||||||
_("Description"),
|
_("Description"),
|
||||||
max_length=300,
|
max_length=300,
|
||||||
blank=True
|
blank=True
|
||||||
)
|
)
|
||||||
photographer = models.ForeignKey(settings.AUTH_USER_MODEL,
|
photographer = models.ForeignKey(settings.AUTH_USER_MODEL)
|
||||||
on_delete=models.PROTECT)
|
|
||||||
on_startpage = models.BooleanField(
|
on_startpage = models.BooleanField(
|
||||||
_("Startpage"),
|
_("Startpage"),
|
||||||
default=False,
|
default=False,
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ from datetime import timedelta
|
|||||||
|
|
||||||
from django.contrib.auth import get_user_model
|
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.core.urlresolvers import reverse
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from django.http import HttpResponse, Http404
|
from django.http import HttpResponse, Http404
|
||||||
from django.shortcuts import redirect
|
from django.shortcuts import redirect
|
||||||
@@ -80,7 +80,8 @@ class EventGallery(generic.ListView):
|
|||||||
event_series__isnull=True,
|
event_series__isnull=True,
|
||||||
photo_count__gt=0
|
photo_count__gt=0
|
||||||
)
|
)
|
||||||
paginate_by = 12
|
queryset = queryset.order_by('-start')
|
||||||
|
paginate_by = 24
|
||||||
|
|
||||||
|
|
||||||
class EventListIcal(generic.View):
|
class EventListIcal(generic.View):
|
||||||
|
|||||||
Binary file not shown.
@@ -7,7 +7,7 @@ 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: 2017-06-19 22:46+0200\n"
|
"POT-Creation-Date: 2018-04-27 09:49+0200\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,174 +19,176 @@ msgstr ""
|
|||||||
"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.7.6\n"
|
||||||
|
|
||||||
#: kasu/settings.py:153
|
#: settings.py:157
|
||||||
msgid "German"
|
msgid "German"
|
||||||
msgstr "Deutsch"
|
msgstr "Deutsch"
|
||||||
|
|
||||||
#: kasu/settings.py:153
|
#: settings.py:157
|
||||||
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 templates/redbox.html:3
|
||||||
msgid "Current Event"
|
msgid "Current Event"
|
||||||
msgstr "Aktuelle Veranstaltung"
|
msgstr "Aktuelle Veranstaltung"
|
||||||
|
|
||||||
#: kasu/templates/base.html:72
|
#: templates/base.html:72 templates/redbox.html:6
|
||||||
msgid "Since"
|
msgid "Since"
|
||||||
msgstr "seit"
|
msgstr "seit"
|
||||||
|
|
||||||
#: kasu/templates/base.html:73 kasu/templates/base.html:85
|
#: templates/base.html:73 templates/base.html:85 templates/redbox.html:8
|
||||||
|
#: templates/redbox.html:22
|
||||||
msgid "Start"
|
msgid "Start"
|
||||||
msgstr "Beginn"
|
msgstr "Beginn"
|
||||||
|
|
||||||
#: kasu/templates/base.html:76 kasu/templates/base.html:88
|
#: templates/base.html:76 templates/base.html:88 templates/redbox.html:11
|
||||||
|
#: templates/redbox.html:25
|
||||||
msgid "Location"
|
msgid "Location"
|
||||||
msgstr "Ort"
|
msgstr "Ort"
|
||||||
|
|
||||||
#: kasu/templates/base.html:79 kasu/templates/base.html:90
|
#: templates/base.html:79 templates/base.html:90 templates/redbox.html:14
|
||||||
|
#: templates/redbox.html:28
|
||||||
msgid "More Details"
|
msgid "More Details"
|
||||||
msgstr "Mehr Details"
|
msgstr "Mehr Details"
|
||||||
|
|
||||||
#: kasu/templates/base.html:81
|
#: templates/base.html:81 templates/redbox.html:17
|
||||||
msgid "Next Event"
|
msgid "Next Event"
|
||||||
msgstr "Nächste Veranstaltung"
|
msgstr "Nächste Veranstaltung"
|
||||||
|
|
||||||
#: kasu/templates/base.html:84
|
#: templates/base.html:84 templates/redbox.html:20
|
||||||
msgid "in"
|
msgid "in"
|
||||||
msgstr "in"
|
msgstr "in"
|
||||||
|
|
||||||
#: kasu/templates/base.html:93
|
#: templates/base.html:93 templates/redbox.html:30
|
||||||
msgid "Upcoming events"
|
msgid "Upcoming events"
|
||||||
msgstr "Bevorstehende Veranstaltungen"
|
msgstr "Bevorstehende Veranstaltungen"
|
||||||
|
|
||||||
#: kasu/templates/base.html:143
|
#: templates/base.html:143
|
||||||
msgid "Add Subpage"
|
msgid "Add Subpage"
|
||||||
msgstr "Unterseite Hinzufügen"
|
msgstr "Unterseite Hinzufügen"
|
||||||
|
|
||||||
#: kasu/templates/base.html:148
|
#: templates/base.html:148
|
||||||
msgid "Edit Page"
|
msgid "Edit Page"
|
||||||
msgstr "Seite bearbeiten"
|
msgstr "Seite bearbeiten"
|
||||||
|
|
||||||
#: kasu/templates/base.html:156
|
#: templates/base.html:156
|
||||||
msgid "Imprint"
|
msgid "Imprint"
|
||||||
msgstr "Impressum"
|
msgstr "Impressum"
|
||||||
|
|
||||||
#: kasu/templates/base.html:157
|
#: templates/base.html:157
|
||||||
msgid "contact"
|
msgid "contact"
|
||||||
msgstr "Kontakt"
|
msgstr "Kontakt"
|
||||||
|
|
||||||
#: kasu/templates/base.html:162
|
#: templates/base.html:162
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Sprache"
|
msgstr "Sprache"
|
||||||
|
|
||||||
#: kasu/templates/base.html:171
|
#: templates/base.html:171
|
||||||
msgid "Go"
|
msgid "Go"
|
||||||
msgstr "Los"
|
msgstr "Los"
|
||||||
|
|
||||||
#: kasu/templates/base.html:176
|
#: templates/base.html:176
|
||||||
msgid "Logged in as"
|
msgid "Logged in as"
|
||||||
msgstr "Angemeldet als"
|
msgstr "Angemeldet als"
|
||||||
|
|
||||||
#: kasu/templates/base.html:178
|
#: templates/base.html:178
|
||||||
msgid "Admin"
|
msgid "Admin"
|
||||||
msgstr "Admin"
|
msgstr "Admin"
|
||||||
|
|
||||||
#: kasu/templates/base.html:179
|
#: templates/base.html:179
|
||||||
msgid "Logout"
|
msgid "Logout"
|
||||||
msgstr "Abmelden"
|
msgstr "Abmelden"
|
||||||
|
|
||||||
#: kasu/templates/base.html:181
|
#: templates/base.html:181
|
||||||
msgid "no user logged in"
|
msgid "no user logged in"
|
||||||
msgstr "Niemand angemeldet"
|
msgstr "Niemand angemeldet"
|
||||||
|
|
||||||
#: kasu/templates/base.html:182 kasu/templates/comments/form.html:43
|
#: templates/base.html:182 templates/comments/form.html:43
|
||||||
msgid "register"
|
msgid "register"
|
||||||
msgstr "Registrieren"
|
msgstr "Registrieren"
|
||||||
|
|
||||||
#: kasu/templates/base.html:183 kasu/templates/comments/form.html:44
|
#: templates/base.html:183 templates/comments/form.html:44
|
||||||
msgid "login"
|
msgid "login"
|
||||||
msgstr "anmelden"
|
msgstr "anmelden"
|
||||||
|
|
||||||
#: kasu/templates/base.html:185
|
#: templates/base.html:185
|
||||||
msgid "Login with Facebook"
|
msgid "Login with Facebook"
|
||||||
msgstr "über Facebook anmelden"
|
msgstr "über Facebook anmelden"
|
||||||
|
|
||||||
#: kasu/templates/base.html:187
|
#: templates/base.html:187
|
||||||
msgid "Login with Twitter"
|
msgid "Login with Twitter"
|
||||||
msgstr "über Twitter anmelden"
|
msgstr "über Twitter anmelden"
|
||||||
|
|
||||||
#: kasu/templates/base.html:189
|
#: templates/base.html:189
|
||||||
msgid "Login with Google"
|
msgid "Login with Google"
|
||||||
msgstr "über Google anmelden"
|
msgstr "über Google 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 kasu/templates/comments/posted.html:7
|
#: templates/comments/posted.html:4 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
|
#, python-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"\n"
|
"\n"
|
||||||
@@ -203,23 +205,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"
|
||||||
|
|
||||||
|
|||||||
@@ -80,7 +80,6 @@ MIDDLEWARE_CLASSES = [
|
|||||||
'django.middleware.locale.LocaleMiddleware',
|
'django.middleware.locale.LocaleMiddleware',
|
||||||
'django.contrib.messages.middleware.MessageMiddleware',
|
'django.contrib.messages.middleware.MessageMiddleware',
|
||||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||||
'utils.middleware.SetRemoteAddrFromForwardedFor',
|
|
||||||
'mahjong_ranking.middleware.DenormalizationUpdateMiddleware',
|
'mahjong_ranking.middleware.DenormalizationUpdateMiddleware',
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -230,7 +229,7 @@ LOGGING = {
|
|||||||
'loggers': {
|
'loggers': {
|
||||||
'django': {
|
'django': {
|
||||||
'handlers': ['console'],
|
'handlers': ['console'],
|
||||||
'level': 'DEBUG',
|
'level': 'INFO',
|
||||||
'propagate': True,
|
'propagate': True,
|
||||||
},
|
},
|
||||||
'django.request': {
|
'django.request': {
|
||||||
@@ -247,22 +246,6 @@ LOGGING = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
################################
|
|
||||||
# Settings for mahjong_ranking #
|
|
||||||
################################
|
|
||||||
|
|
||||||
MIN_HANCHANS_FOR_LADDER = 5
|
|
||||||
RANKING_EXPORT_PATH = path.join(PROJECT_PATH, 'backup', 'mahjong_ranking')
|
|
||||||
|
|
||||||
# Old Tournament System
|
|
||||||
TOURNAMENT_POINT_SYSTEM = True
|
|
||||||
TOURNAMENT_WIN_BONUSPOINTS = 4
|
|
||||||
TOURNAMENT_FLAWLESS_VICTORY_BONUSPOINTS = 8
|
|
||||||
|
|
||||||
# Old Dan System
|
|
||||||
DAN_3_WINS_IN_A_ROW = True
|
|
||||||
DAN_ALLOW_DROP_DOWN = True
|
|
||||||
|
|
||||||
DAN_RANKS = (
|
DAN_RANKS = (
|
||||||
(80, 9),
|
(80, 9),
|
||||||
(70, 8),
|
(70, 8),
|
||||||
@@ -272,7 +255,7 @@ DAN_RANKS = (
|
|||||||
(30, 4),
|
(30, 4),
|
||||||
(20, 3),
|
(20, 3),
|
||||||
(10, 2),
|
(10, 2),
|
||||||
(-1, 1),
|
(0, 1),
|
||||||
)
|
)
|
||||||
|
|
||||||
KYU_RANKS = (
|
KYU_RANKS = (
|
||||||
@@ -285,9 +268,13 @@ KYU_RANKS = (
|
|||||||
(15, 7),
|
(15, 7),
|
||||||
(10, 8),
|
(10, 8),
|
||||||
(5, 9),
|
(5, 9),
|
||||||
(-1, 10),
|
(0, 10),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
DAN_ALLOW_DROP_DOWN = True
|
||||||
|
MIN_HANCHANS_FOR_LADDER = 5
|
||||||
|
RANKING_EXPORT_PATH = path.join(PROJECT_PATH, 'backup', 'mahjong_ranking')
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from .local_settings import * # Ignore PyLintBear (W0401, W0614)
|
from .local_settings import * # Ignore PyLintBear (W0401, W0614)
|
||||||
except ImportError:
|
except ImportError:
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -73,7 +73,9 @@
|
|||||||
<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:'c'}}">{{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>
|
<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}}
|
||||||
|
</li>
|
||||||
</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>
|
||||||
@@ -85,7 +87,9 @@
|
|||||||
<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:'c'}}">{{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>
|
<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}}
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="right"><a class="button" href="{{next_event.get_absolute_url}}">{% trans "More Details" %}
|
<div class="right"><a class="button" href="{{next_event.get_absolute_url}}">{% trans "More Details" %}
|
||||||
<span class="fa fa-arrow-right"></span></a></div>
|
<span class="fa fa-arrow-right"></span></a></div>
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
{% with type="date" %}
|
|
||||||
{% include "django/forms/widgets/html5input.html" %}
|
|
||||||
{% endwith %}
|
|
||||||
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
{% with type="datetime-local" %}
|
|
||||||
{% include "django/forms/widgets/html5input.html" %}
|
|
||||||
{% endwith %}
|
|
||||||
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
<input type="{{ type|default:'text' }}" name="{{ widget.name }}"{% if widget.value != None %} value="{{ widget.value|stringformat:'s' }}"{% endif %}{% include "django/forms/widgets/attrs.html" %} />
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
{% with type="time" %}
|
|
||||||
{% include "django/forms/widgets/html5input.html" %}
|
|
||||||
{% endwith %}
|
|
||||||
|
|
||||||
@@ -32,7 +32,7 @@ urlpatterns = [ # Ignore PyLintBear (C0103)
|
|||||||
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/', include(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\/]+)/$',
|
||||||
|
|||||||
147
src/kasu/xlsx.py
147
src/kasu/xlsx.py
@@ -1,147 +0,0 @@
|
|||||||
"""
|
|
||||||
Helper to generate XLSX Spreadsheets in an uniform way.
|
|
||||||
"""
|
|
||||||
from datetime import date
|
|
||||||
|
|
||||||
import openpyxl
|
|
||||||
from openpyxl.styles import NamedStyle, Font, Border, Side
|
|
||||||
|
|
||||||
DEFAULT_FONT = Font(name='Philosopher', size=10, bold=False, color='000000')
|
|
||||||
THIN_BORDER = Border(
|
|
||||||
bottom=Side(style='thin', color="d3d7cf"),
|
|
||||||
top=Side(style='thin', color="d3d7cf"))
|
|
||||||
XLSX_STYLES = dict()
|
|
||||||
|
|
||||||
XLSX_STYLES['Content'] = NamedStyle(
|
|
||||||
name='Content',
|
|
||||||
font=DEFAULT_FONT,
|
|
||||||
border=THIN_BORDER
|
|
||||||
)
|
|
||||||
|
|
||||||
XLSX_STYLES['Headline'] = NamedStyle(
|
|
||||||
name="Headline",
|
|
||||||
font=openpyxl.styles.Font(name='Philosopher', size=11,
|
|
||||||
bold=True, color='ffffff'),
|
|
||||||
fill=openpyxl.styles.PatternFill(fill_type='solid',
|
|
||||||
start_color='a40000',
|
|
||||||
end_color='a40000')
|
|
||||||
)
|
|
||||||
|
|
||||||
XLSX_STYLES['Date'] = NamedStyle(
|
|
||||||
name='Date',
|
|
||||||
font=DEFAULT_FONT,
|
|
||||||
border=THIN_BORDER,
|
|
||||||
number_format='dd.mm.yyyy'
|
|
||||||
)
|
|
||||||
|
|
||||||
XLSX_STYLES['Date Time'] = NamedStyle(
|
|
||||||
name='Date Time',
|
|
||||||
font=DEFAULT_FONT,
|
|
||||||
border=THIN_BORDER,
|
|
||||||
number_format='dd.mm.yyyy hh:MM'
|
|
||||||
)
|
|
||||||
|
|
||||||
XLSX_STYLES['Float'] = NamedStyle(
|
|
||||||
name='Float',
|
|
||||||
font=DEFAULT_FONT,
|
|
||||||
border=THIN_BORDER,
|
|
||||||
number_format='#,##0.00'
|
|
||||||
)
|
|
||||||
|
|
||||||
XLSX_STYLES['Integer'] = NamedStyle(
|
|
||||||
name='Integer',
|
|
||||||
font=DEFAULT_FONT,
|
|
||||||
border=THIN_BORDER,
|
|
||||||
number_format='#,##0'
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def getattr_recursive(obj, attr_string):
|
|
||||||
"""A recusive version of gettattr. the attr_string is splitted on the ".".
|
|
||||||
|
|
||||||
:param obj: a python object.
|
|
||||||
:param attr_string: the desired attribute of the object.
|
|
||||||
:return: a getattr_recursice(obj, 'attr1.attr2') will return the value of attr2 of attr1 from obj
|
|
||||||
"""
|
|
||||||
attr_list = attr_string.split('.')
|
|
||||||
return_value = None
|
|
||||||
for attr in attr_list:
|
|
||||||
return_value = getattr(obj, attr)
|
|
||||||
obj = return_value
|
|
||||||
return return_value
|
|
||||||
|
|
||||||
|
|
||||||
class Workbook(object):
|
|
||||||
workbook = None
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
"""Generate an XLSX Workbook in memory
|
|
||||||
|
|
||||||
:rtype: object
|
|
||||||
"""
|
|
||||||
self.workbook = openpyxl.Workbook()
|
|
||||||
[self.workbook.add_named_style(style) for style in XLSX_STYLES.values()]
|
|
||||||
[self.workbook.remove(sheet) for sheet in self.workbook.worksheets]
|
|
||||||
|
|
||||||
def generate_sheet(self, title, columns_settings, object_list,
|
|
||||||
orientation='landscape'):
|
|
||||||
"""
|
|
||||||
|
|
||||||
:param title: Title of the Sheet
|
|
||||||
:param columns_settings: a list of dicts for the settings of each column
|
|
||||||
:param object_list: List of objects that should be added to the sheet
|
|
||||||
:param orientation: Paper Orientation 'landscape' or 'portrait'
|
|
||||||
"""
|
|
||||||
row = 1
|
|
||||||
ws = self.workbook.create_sheet()
|
|
||||||
ws.title = title
|
|
||||||
ws.syncHorizontal = True
|
|
||||||
ws.filterMode = True
|
|
||||||
|
|
||||||
# setup print orientation
|
|
||||||
ws.page_setup.fitToHeight = 0
|
|
||||||
ws.page_setup.fitToWidth = 1
|
|
||||||
if orientation == 'landscape':
|
|
||||||
ws.page_setup.orientation = ws.ORIENTATION_LANDSCAPE
|
|
||||||
else:
|
|
||||||
ws.page_setup.orientation = ws.ORIENTATION_PORTRAIT
|
|
||||||
ws.page_setup.paperSize = ws.PAPERSIZE_A4
|
|
||||||
ws.print_options.horizontalCentered = True
|
|
||||||
|
|
||||||
# setup page header
|
|
||||||
ws.oddHeader.left.text = title
|
|
||||||
ws.oddHeader.left.size = 14
|
|
||||||
ws.oddHeader.left.font = "Amerika Sans"
|
|
||||||
ws.oddHeader.left.color = "000000"
|
|
||||||
|
|
||||||
ws.oddHeader.right.text = str(date.today())
|
|
||||||
ws.oddHeader.right.size = 14
|
|
||||||
ws.oddHeader.right.font = "Amerika Sans"
|
|
||||||
ws.oddHeader.right.color = "000000"
|
|
||||||
|
|
||||||
# write table header
|
|
||||||
for column, data in enumerate(columns_settings, 1):
|
|
||||||
cell = ws.cell(column=column, row=row, value=data['title'])
|
|
||||||
cell.style = 'Headline'
|
|
||||||
row += 1
|
|
||||||
|
|
||||||
# write the table content
|
|
||||||
for line in object_list:
|
|
||||||
for column, settings in enumerate(columns_settings, 1):
|
|
||||||
cell = ws.cell(column=column, row=row,
|
|
||||||
value=getattr_recursive(line, settings['attr']))
|
|
||||||
cell.style = settings['style']
|
|
||||||
row += 1
|
|
||||||
|
|
||||||
# write table footer
|
|
||||||
for column, settings in enumerate(columns_settings, 1):
|
|
||||||
cell = ws.cell(column=column, row=row, value=settings.get('footer'))
|
|
||||||
cell.style = settings['style']
|
|
||||||
row += 1
|
|
||||||
|
|
||||||
# set column widths
|
|
||||||
for settings in columns_settings:
|
|
||||||
ws.column_dimensions[settings['col']].width = settings['width']
|
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
|
||||||
return self.workbook.save(*args, **kwargs)
|
|
||||||
@@ -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")
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@@ -7,9 +7,9 @@ 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: 2017-06-19 22:46+0200\n"
|
"POT-Creation-Date: 2018-04-27 09:49+0200\n"
|
||||||
"PO-Revision-Date: 2016-09-28 00:24+0200\n"
|
"PO-Revision-Date: 2018-04-27 09:54+0105\n"
|
||||||
"Last-Translator: Christian Berg <xeniac.at@gmail.com>\n"
|
"Last-Translator: b'Christian Berg <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,381 +17,377 @@ 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.7.14\n"
|
||||||
|
|
||||||
#: mahjong_ranking/admin.py:26
|
#: admin.py:26
|
||||||
msgid "Recalculate"
|
msgid "Recalculate"
|
||||||
msgstr "Neuberechnen"
|
msgstr "Neuberechnen"
|
||||||
|
|
||||||
#: mahjong_ranking/admin.py:36
|
#: admin.py:36
|
||||||
msgid "Confirm"
|
msgid "Confirm"
|
||||||
msgstr "Bestätigen"
|
msgstr "Bestätigen"
|
||||||
|
|
||||||
#: mahjong_ranking/admin.py:46
|
#: admin.py:46
|
||||||
msgid "Set unconfirmed"
|
msgid "Set unconfirmed"
|
||||||
msgstr "Als unbestätigt markieren"
|
msgstr "Als unbestätigt markieren"
|
||||||
|
|
||||||
#: mahjong_ranking/forms.py:21
|
#: forms.py:21
|
||||||
msgid "start"
|
msgid "start"
|
||||||
msgstr "Beginn"
|
msgstr "Beginn"
|
||||||
|
|
||||||
#: mahjong_ranking/models.py:89
|
#: 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:90
|
#: 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:97
|
#: models.py:99
|
||||||
msgid "Player 1"
|
msgid "Player 1"
|
||||||
msgstr "Spieler 1"
|
msgstr "Spieler 1"
|
||||||
|
|
||||||
#: mahjong_ranking/models.py:98 mahjong_ranking/models.py:100
|
#: models.py:100 models.py:102 models.py:119 models.py:121 models.py:138
|
||||||
#: mahjong_ranking/models.py:117 mahjong_ranking/models.py:119
|
#: models.py:140 models.py:157 models.py:159
|
||||||
#: mahjong_ranking/models.py:136 mahjong_ranking/models.py:138
|
#: templates/mahjong_ranking/eventhanchan_list.html:19
|
||||||
#: mahjong_ranking/models.py:155 mahjong_ranking/models.py:157
|
#: 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:35
|
||||||
#: mahjong_ranking/templates/mahjong_ranking/hanchan_form.html:19
|
#: templates/mahjong_ranking/seasonranking_list.html:32
|
||||||
#: mahjong_ranking/templates/mahjong_ranking/kyudanranking_list.html:35
|
|
||||||
#: mahjong_ranking/templates/mahjong_ranking/seasonranking_list.html:32
|
|
||||||
msgid "Score"
|
msgid "Score"
|
||||||
msgstr "Punkte"
|
msgstr "Punkte"
|
||||||
|
|
||||||
#: mahjong_ranking/models.py:110 mahjong_ranking/models.py:129
|
#: models.py:112 models.py:131 models.py:150 models.py:169 models.py:171
|
||||||
#: mahjong_ranking/models.py:148 mahjong_ranking/models.py:167
|
#: templates/mahjong_ranking/hanchan_form.html:20
|
||||||
#: mahjong_ranking/models.py:169
|
#: 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:116
|
#: models.py:118
|
||||||
msgid "Player 2"
|
msgid "Player 2"
|
||||||
msgstr "Spieler 2"
|
msgstr "Spieler 2"
|
||||||
|
|
||||||
#: mahjong_ranking/models.py:135
|
#: models.py:137
|
||||||
msgid "Player 3"
|
msgid "Player 3"
|
||||||
msgstr "Spieler 3"
|
msgstr "Spieler 3"
|
||||||
|
|
||||||
#: mahjong_ranking/models.py:154
|
#: models.py:156
|
||||||
msgid "Player 4"
|
msgid "Player 4"
|
||||||
msgstr "Spieler 4"
|
msgstr "Spieler 4"
|
||||||
|
|
||||||
#: mahjong_ranking/models.py:170
|
#: models.py:173
|
||||||
msgid "Has been Confirmed"
|
msgid "Has been Confirmed"
|
||||||
msgstr "Wurde bestätigt"
|
msgstr "Wurde bestätigt"
|
||||||
|
|
||||||
#: mahjong_ranking/models.py:172
|
#: 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:177 mahjong_ranking/models.py:576
|
#: models.py:179 models.py:603 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:182
|
#: models.py:184
|
||||||
msgid "Hanchan"
|
msgid "Hanchan"
|
||||||
msgstr "Hanchan"
|
msgstr "Hanchan"
|
||||||
|
|
||||||
#: mahjong_ranking/models.py:183
|
#: 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:186
|
#: 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:213
|
#: 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:221
|
#: 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:223
|
#: 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:226
|
#: 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:228
|
#: 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:352
|
#: models.py:356
|
||||||
msgid "Kyū/Dan Ranking"
|
msgid "Kyū/Dan Ranking"
|
||||||
msgstr "Kyū/Dan Wertung"
|
msgstr "Kyū/Dan Wertung"
|
||||||
|
|
||||||
#: mahjong_ranking/models.py:353
|
#: models.py:357
|
||||||
msgid "Kyū/Dan Rankings"
|
msgid "Kyū/Dan Rankings"
|
||||||
msgstr "Kyū/Dan Wertungen"
|
msgstr "Kyū/Dan Wertungen"
|
||||||
|
|
||||||
#: 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: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_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/eventhanchan_list.html:55
|
#: templates/mahjong_ranking/eventhanchan_list.html:55
|
||||||
#: 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/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:30
|
#: templates/mahjong_ranking/kyudanranking_list.html:30
|
||||||
#: 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
|
||||||
#: mahjong_ranking/templates/mahjong_ranking/seasonranking_list.html:26
|
#: templates/mahjong_ranking/seasonranking_list.html:26
|
||||||
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:27
|
#: templates/mahjong_ranking/seasonranking_list.html:27
|
||||||
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:31
|
#: templates/mahjong_ranking/seasonranking_list.html:31
|
||||||
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:33
|
#: templates/mahjong_ranking/seasonranking_list.html:33
|
||||||
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:34
|
#: templates/mahjong_ranking/seasonranking_list.html:34
|
||||||
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:35
|
#: templates/mahjong_ranking/seasonranking_list.html:35
|
||||||
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/hanchan_form.html:58
|
#: templates/mahjong_ranking/hanchan_form.html:58
|
||||||
msgid "Total"
|
msgid "Total"
|
||||||
msgstr "Total"
|
msgstr "Total"
|
||||||
|
|
||||||
#: 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/hanchan_form.html:72
|
#: templates/mahjong_ranking/hanchan_form.html:72
|
||||||
msgid "save"
|
msgid "save"
|
||||||
msgstr "Speichern"
|
msgstr "Speichern"
|
||||||
|
|
||||||
#: 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
|
#| msgid "Player List"
|
||||||
|
msgid "Players list"
|
||||||
|
msgstr "Spielerliste"
|
||||||
|
|
||||||
|
#: templates/mahjong_ranking/kyudanranking_list.html:9
|
||||||
msgid "Player List"
|
msgid "Player List"
|
||||||
msgstr "Spieler Liste"
|
msgstr "Spieler Liste"
|
||||||
|
|
||||||
#: mahjong_ranking/templates/mahjong_ranking/kyudanranking_list.html:25
|
#: templates/mahjong_ranking/kyudanranking_list.html:25
|
||||||
msgid "Full Name"
|
msgid "Full Name"
|
||||||
msgstr "Voller Name"
|
msgstr "Voller Name"
|
||||||
|
|
||||||
#: mahjong_ranking/templates/mahjong_ranking/kyudanranking_list.html:40
|
#: templates/mahjong_ranking/kyudanranking_list.html:40
|
||||||
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:98
|
#: views.py:102
|
||||||
#, 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:101
|
#: views.py:105
|
||||||
#, 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:119 mahjong_ranking/views.py:135
|
#: views.py:169
|
||||||
msgid "Event does not exist"
|
|
||||||
msgstr "Veranstaltung existiert nicht"
|
|
||||||
|
|
||||||
#: mahjong_ranking/views.py:199
|
|
||||||
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"
|
||||||
|
|
||||||
|
#~ msgid "Event does not exist"
|
||||||
|
#~ msgstr "Veranstaltung existiert nicht"
|
||||||
|
|
||||||
#~ msgid "It's not allowed to enter future games."
|
#~ msgid "It's not allowed to enter future games."
|
||||||
#~ msgstr "Spiele in der Zukunft sind nicht erlaubt."
|
#~ msgstr "Spiele in der Zukunft sind nicht erlaubt."
|
||||||
|
|
||||||
|
|||||||
214
src/mahjong_ranking/management/commands/export_ranking.py
Normal file
214
src/mahjong_ranking/management/commands/export_ranking.py
Normal file
@@ -0,0 +1,214 @@
|
|||||||
|
"""Export Mahjong Rankings as excel files."""
|
||||||
|
|
||||||
|
import os
|
||||||
|
from datetime import date, time, datetime
|
||||||
|
|
||||||
|
import openpyxl
|
||||||
|
from django.conf import settings
|
||||||
|
from django.core.management.base import BaseCommand
|
||||||
|
from django.utils import timezone
|
||||||
|
from django.utils.dateparse import parse_date
|
||||||
|
from django.core.mail import EmailMessage
|
||||||
|
|
||||||
|
from mahjong_ranking.models import SeasonRanking, KyuDanRanking
|
||||||
|
|
||||||
|
THIN_BORDER = openpyxl.styles.Side(style='thin', color="d3d7cf")
|
||||||
|
|
||||||
|
HEADING_STYLE = openpyxl.styles.NamedStyle(name="heading")
|
||||||
|
HEADING_STYLE.font = openpyxl.styles.Font(name='Philosopher', size=11,
|
||||||
|
bold=True, color='ffffff')
|
||||||
|
HEADING_STYLE.fill = openpyxl.styles.PatternFill(fill_type='solid',
|
||||||
|
start_color='a40000',
|
||||||
|
end_color='a40000')
|
||||||
|
|
||||||
|
DEFAULT_STYLE = openpyxl.styles.NamedStyle(name='content')
|
||||||
|
DEFAULT_STYLE.font = openpyxl.styles.Font(name='Philosopher', size=10,
|
||||||
|
bold=False, color='000000')
|
||||||
|
DEFAULT_STYLE.border = openpyxl.styles.Border(bottom=THIN_BORDER,
|
||||||
|
top=THIN_BORDER)
|
||||||
|
|
||||||
|
INT_STYLE = openpyxl.styles.NamedStyle(name='int')
|
||||||
|
INT_STYLE.font = DEFAULT_STYLE.font
|
||||||
|
INT_STYLE.border = DEFAULT_STYLE.border
|
||||||
|
INT_STYLE.number_format = '#,##0'
|
||||||
|
|
||||||
|
FLOAT_STYLE = openpyxl.styles.NamedStyle(name='float')
|
||||||
|
FLOAT_STYLE.font = DEFAULT_STYLE.font
|
||||||
|
FLOAT_STYLE.border = DEFAULT_STYLE.border
|
||||||
|
FLOAT_STYLE.number_format = '#,##0.00'
|
||||||
|
|
||||||
|
DATE_STYLE = openpyxl.styles.NamedStyle(name='date')
|
||||||
|
DATE_STYLE.font = DEFAULT_STYLE.font
|
||||||
|
DATE_STYLE.border = DEFAULT_STYLE.border
|
||||||
|
DATE_STYLE.number_format = 'dd.mm.yyyy'
|
||||||
|
|
||||||
|
MAIL_BODY = """
|
||||||
|
Hallo! Ich bin's dein Server.
|
||||||
|
|
||||||
|
Ich habe gerade die Mahjong Rankings als Excel exportiert und dachte mir das
|
||||||
|
ich sie dir am besten gleich schicke.
|
||||||
|
|
||||||
|
Bitte versuche nicht auf diese E-Mail zu antworten.
|
||||||
|
Ich bin nur ein dummes Programm.
|
||||||
|
|
||||||
|
mit lieben Grüßen
|
||||||
|
|
||||||
|
Der Kasu Server
|
||||||
|
"""
|
||||||
|
def geneate_excel():
|
||||||
|
"""Generate an excel .xlsx spreadsheet from json data of the kyu/dan
|
||||||
|
rankings.
|
||||||
|
|
||||||
|
:param json_data: The ladder ranking as JSON export."""
|
||||||
|
workbook = openpyxl.Workbook()
|
||||||
|
workbook.add_named_style(HEADING_STYLE)
|
||||||
|
workbook.add_named_style(DEFAULT_STYLE)
|
||||||
|
workbook.add_named_style(INT_STYLE)
|
||||||
|
workbook.add_named_style(FLOAT_STYLE)
|
||||||
|
workbook.add_named_style(DATE_STYLE)
|
||||||
|
|
||||||
|
for sheet in workbook.worksheets:
|
||||||
|
workbook.remove(sheet)
|
||||||
|
return workbook
|
||||||
|
|
||||||
|
|
||||||
|
def generate_sheet(workbook, title, columns_settings, json_data):
|
||||||
|
row = 1
|
||||||
|
ws = workbook.create_sheet()
|
||||||
|
ws.title = title
|
||||||
|
ws.syncHorizontal = True
|
||||||
|
ws.filterMode = True
|
||||||
|
|
||||||
|
# setup print orientation
|
||||||
|
ws.page_setup.orientation = ws.ORIENTATION_PORTRAIT
|
||||||
|
ws.page_setup.paperSize = ws.PAPERSIZE_A4
|
||||||
|
ws.page_setup.fitToWidth = True
|
||||||
|
ws.print_options.horizontalCentered = True
|
||||||
|
|
||||||
|
# setup page header
|
||||||
|
ws.oddHeader.left.text = title
|
||||||
|
ws.oddHeader.left.size = 14
|
||||||
|
ws.oddHeader.left.font = "Amerika Sans"
|
||||||
|
ws.oddHeader.left.color = "000000"
|
||||||
|
|
||||||
|
ws.oddHeader.right.text = str(date.today())
|
||||||
|
ws.oddHeader.right.size = 14
|
||||||
|
ws.oddHeader.right.font = "Amerika Sans"
|
||||||
|
ws.oddHeader.right.color = "000000"
|
||||||
|
|
||||||
|
# write table header
|
||||||
|
for column, data in enumerate(columns_settings, 1):
|
||||||
|
cell = ws.cell(column=column, row=row, value=data['title'])
|
||||||
|
cell.style = 'heading'
|
||||||
|
|
||||||
|
# write the table content
|
||||||
|
for line in json_data:
|
||||||
|
row += 1
|
||||||
|
for column, settings in enumerate(columns_settings, 1):
|
||||||
|
cell = ws.cell(column=column, row=row, value=line[settings['attr']])
|
||||||
|
cell.style = settings['style']
|
||||||
|
|
||||||
|
# set column widths
|
||||||
|
for settings in columns_settings:
|
||||||
|
ws.column_dimensions[settings['col']].width = settings['width']
|
||||||
|
|
||||||
|
|
||||||
|
def export_season_rankings(workbook, until):
|
||||||
|
SeasonRanking.objects.update(until=until)
|
||||||
|
json_data = SeasonRanking.objects.json_data()
|
||||||
|
title = "Mahjong Ladder - {}".format(until.year)
|
||||||
|
columns_settings = (
|
||||||
|
{'col': 'A', 'title': 'Rang', 'attr': 'placement', 'style': 'int',
|
||||||
|
'width': 8},
|
||||||
|
{'col': 'B', 'title': 'Spitzname', 'attr': 'username',
|
||||||
|
'style': 'content',
|
||||||
|
'width': 25},
|
||||||
|
{'col': 'C', 'title': '⌀ Platz', 'attr': 'avg_placement',
|
||||||
|
'style': 'float', 'width': 8},
|
||||||
|
{'col': 'D', 'title': '⌀ Punkte', 'attr': 'avg_score',
|
||||||
|
'style': 'float', 'width': 12},
|
||||||
|
{'col': 'E', 'title': 'Hanchans', 'attr': 'hanchan_count',
|
||||||
|
'style': 'int', 'width': 10},
|
||||||
|
{'col': 'F', 'title': 'Gut', 'attr': 'good_hanchans',
|
||||||
|
'style': 'int', 'width': 5},
|
||||||
|
{'col': 'G', 'title': 'Gewonnen', 'attr': 'won_hanchans',
|
||||||
|
'style': 'int', 'width': 10},
|
||||||
|
)
|
||||||
|
generate_sheet(
|
||||||
|
workbook=workbook,
|
||||||
|
title=title,
|
||||||
|
columns_settings=columns_settings,
|
||||||
|
json_data=json_data)
|
||||||
|
|
||||||
|
|
||||||
|
def export_kyu_dan_rankings(workbook, until):
|
||||||
|
KyuDanRanking.objects.update(until=until)
|
||||||
|
json_data = KyuDanRanking.objects.json_data()
|
||||||
|
title = "Kyū & Dan Rankings"
|
||||||
|
columns_settings = (
|
||||||
|
{'col': 'A', 'title': 'Spitzname', 'attr': 'username',
|
||||||
|
'style': 'content', 'width': 14},
|
||||||
|
{'col': 'B', 'title': 'Voller Name', 'attr': 'full_name',
|
||||||
|
'style': 'content', 'width': 20},
|
||||||
|
{'col': 'C', 'title': 'Rang', 'attr': 'rank',
|
||||||
|
'style': 'content', 'width': 8},
|
||||||
|
{'col': 'D', 'title': 'Punkte', 'attr': 'points',
|
||||||
|
'style': 'int', 'width': 8},
|
||||||
|
{'col': 'E', 'title': 'Hanchans', 'attr': 'hanchan_count',
|
||||||
|
'style': 'int', 'width': 10},
|
||||||
|
{'col': 'F', 'title': 'Gut', 'attr': 'good_hanchans',
|
||||||
|
'style': 'int', 'width': 5},
|
||||||
|
{'col': 'G', 'title': 'Gewonnen', 'attr': 'won_hanchans',
|
||||||
|
'style': 'int', 'width': 8},
|
||||||
|
{'col': 'H', 'title': 'letzte Hanchan', 'attr': 'last_hanchan_date',
|
||||||
|
'style': 'date', 'width': 16},
|
||||||
|
)
|
||||||
|
generate_sheet(
|
||||||
|
workbook=workbook,
|
||||||
|
title=title,
|
||||||
|
columns_settings=columns_settings,
|
||||||
|
json_data=json_data)
|
||||||
|
|
||||||
|
|
||||||
|
class Command(BaseCommand):
|
||||||
|
"""Exports the SeasonRankings"""
|
||||||
|
filename = str()
|
||||||
|
until = datetime
|
||||||
|
|
||||||
|
def add_arguments(self, parser):
|
||||||
|
parser.add_argument(
|
||||||
|
'--until', nargs='?', type=parse_date,
|
||||||
|
default=date.today(), metavar='YYYY-MM-DD',
|
||||||
|
help='Calculate and export rankings until the given date.')
|
||||||
|
parser.add_argument(
|
||||||
|
'--mail', nargs='*', type=str, metavar='user@example.com',
|
||||||
|
help='Send the spreadsheet via eMail to the given recipient.')
|
||||||
|
|
||||||
|
def handle(self, *args, **options):
|
||||||
|
"""Exports the current ladder ranking in a spreadsheet.
|
||||||
|
This is useful as a backup in form of a hardcopy."""
|
||||||
|
self.until = timezone.make_aware(datetime.combine(
|
||||||
|
options['until'], time(23, 59, 59)
|
||||||
|
))
|
||||||
|
|
||||||
|
self.filename = os.path.join(
|
||||||
|
settings.RANKING_EXPORT_PATH,
|
||||||
|
'mahjong_rankings_{:%Y-%m-%d}.xlsx'.format(self.until)
|
||||||
|
)
|
||||||
|
workbook = geneate_excel()
|
||||||
|
export_season_rankings(workbook, until=self.until)
|
||||||
|
export_kyu_dan_rankings(workbook, until=self.until)
|
||||||
|
os.makedirs(settings.RANKING_EXPORT_PATH, exist_ok=True)
|
||||||
|
workbook.save(self.filename)
|
||||||
|
if options['mail']:
|
||||||
|
self.send_mail(options['mail'])
|
||||||
|
|
||||||
|
def send_mail(self, recipients):
|
||||||
|
mail = EmailMessage(
|
||||||
|
subject='Mahjong Rankings vom {:%d.%m.%Y}'.format(self.until),
|
||||||
|
body=MAIL_BODY,
|
||||||
|
from_email=settings.DEFAULT_FROM_EMAIL,
|
||||||
|
to=recipients)
|
||||||
|
mail.attach_file(self.filename)
|
||||||
|
mail.send()
|
||||||
|
|
||||||
@@ -1,126 +0,0 @@
|
|||||||
"""Export Mahjong Rankings as excel files."""
|
|
||||||
|
|
||||||
import os
|
|
||||||
from datetime import date, time, datetime
|
|
||||||
|
|
||||||
from django.conf import settings
|
|
||||||
from django.core.mail import EmailMessage
|
|
||||||
from django.core.management.base import BaseCommand
|
|
||||||
from django.utils import timezone
|
|
||||||
from django.utils.dateparse import parse_date
|
|
||||||
|
|
||||||
from kasu import xlsx
|
|
||||||
from mahjong_ranking.models import SeasonRanking, KyuDanRanking
|
|
||||||
|
|
||||||
MAIL_BODY = """
|
|
||||||
Hallo! Ich bin's dein Server.
|
|
||||||
|
|
||||||
Ich habe gerade die Mahjong Rankings als Excel exportiert und dachte mir das
|
|
||||||
ich sie dir am besten gleich schicke.
|
|
||||||
|
|
||||||
Bitte versuche nicht auf diese E-Mail zu antworten.
|
|
||||||
Ich bin nur ein dummes Programm.
|
|
||||||
|
|
||||||
mit lieben Grüßen
|
|
||||||
|
|
||||||
Der Kasu Server
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
def export_season_rankings(workbook, until):
|
|
||||||
SeasonRanking.objects.update(until=until)
|
|
||||||
season = until.year if until else date.today().year
|
|
||||||
object_list = SeasonRanking.objects.season_rankings()
|
|
||||||
title = "Mahjong Ladder - {}".format(season)
|
|
||||||
columns_settings = (
|
|
||||||
{'col': 'A', 'title': 'Rang', 'attr': 'placement', 'style': 'Integer',
|
|
||||||
'width': 8},
|
|
||||||
{'col': 'B', 'title': 'Spitzname', 'attr': 'user.username',
|
|
||||||
'style': 'Content',
|
|
||||||
'width': 25},
|
|
||||||
{'col': 'C', 'title': '⌀ Platz', 'attr': 'avg_placement',
|
|
||||||
'style': 'Float', 'width': 8},
|
|
||||||
{'col': 'D', 'title': '⌀ Punkte', 'attr': 'avg_score',
|
|
||||||
'style': 'Float', 'width': 12},
|
|
||||||
{'col': 'E', 'title': 'Hanchans', 'attr': 'hanchan_count',
|
|
||||||
'style': 'Integer', 'width': 10},
|
|
||||||
{'col': 'F', 'title': 'Gut', 'attr': 'good_hanchans',
|
|
||||||
'style': 'Integer', 'width': 5},
|
|
||||||
{'col': 'G', 'title': 'Gewonnen', 'attr': 'won_hanchans',
|
|
||||||
'style': 'Integer', 'width': 10},
|
|
||||||
)
|
|
||||||
workbook.generate_sheet(
|
|
||||||
title=title,
|
|
||||||
columns_settings=columns_settings,
|
|
||||||
object_list=object_list)
|
|
||||||
|
|
||||||
|
|
||||||
def export_kyu_dan_rankings(workbook, until):
|
|
||||||
KyuDanRanking.objects.update(until=until, force_recalc=True)
|
|
||||||
object_list = KyuDanRanking.objects.all()
|
|
||||||
title = "Kyū & Dan Rankings"
|
|
||||||
columns_settings = (
|
|
||||||
{'col': 'A', 'title': 'Spitzname', 'attr': 'user.username',
|
|
||||||
'style': 'Content', 'width': 14},
|
|
||||||
{'col': 'B', 'title': 'Voller Name', 'attr': 'user.full_name',
|
|
||||||
'style': 'Content', 'width': 20},
|
|
||||||
{'col': 'C', 'title': 'Rang', 'attr': 'rank',
|
|
||||||
'style': 'Content', 'width': 8},
|
|
||||||
{'col': 'D', 'title': 'Punkte', 'attr': 'points',
|
|
||||||
'style': 'Integer', 'width': 8},
|
|
||||||
{'col': 'E', 'title': 'Hanchans', 'attr': 'hanchan_count',
|
|
||||||
'style': 'Integer', 'width': 10},
|
|
||||||
{'col': 'F', 'title': 'Gut', 'attr': 'good_hanchans',
|
|
||||||
'style': 'Integer', 'width': 5},
|
|
||||||
{'col': 'G', 'title': 'Gewonnen', 'attr': 'won_hanchans',
|
|
||||||
'style': 'Integer', 'width': 10},
|
|
||||||
{'col': 'H', 'title': 'letzte Hanchan', 'attr': 'last_hanchan_date',
|
|
||||||
'style': 'Date', 'width': 16},
|
|
||||||
)
|
|
||||||
workbook.generate_sheet(
|
|
||||||
title=title,
|
|
||||||
columns_settings=columns_settings,
|
|
||||||
object_list=object_list)
|
|
||||||
|
|
||||||
|
|
||||||
class Command(BaseCommand):
|
|
||||||
"""Exports the SeasonRankings"""
|
|
||||||
filename = str()
|
|
||||||
until = datetime
|
|
||||||
|
|
||||||
def add_arguments(self, parser):
|
|
||||||
parser.add_argument(
|
|
||||||
'--until', nargs='?', type=parse_date,
|
|
||||||
default=date.today(), metavar='YYYY-MM-DD',
|
|
||||||
help='Calculate and export rankings until the given date.')
|
|
||||||
parser.add_argument(
|
|
||||||
'--mail', nargs='*', type=str, metavar='user@example.com',
|
|
||||||
help='Send the spreadsheet via eMail to the given recipient.')
|
|
||||||
|
|
||||||
def handle(self, *args, **options):
|
|
||||||
"""Exports the current ladder ranking in a spreadsheet.
|
|
||||||
This is useful as a backup in form of a hardcopy."""
|
|
||||||
self.until = timezone.make_aware(datetime.combine(
|
|
||||||
options['until'], time(23, 59, 59)
|
|
||||||
))
|
|
||||||
|
|
||||||
self.filename = os.path.join(
|
|
||||||
settings.RANKING_EXPORT_PATH,
|
|
||||||
'mahjong_rankings_{:%Y-%m-%d}.xlsx'.format(self.until)
|
|
||||||
)
|
|
||||||
workbook = xlsx.Workbook()
|
|
||||||
export_season_rankings(workbook, until=self.until)
|
|
||||||
export_kyu_dan_rankings(workbook, until=self.until)
|
|
||||||
os.makedirs(settings.RANKING_EXPORT_PATH, exist_ok=True)
|
|
||||||
workbook.save(self.filename)
|
|
||||||
if options['mail']:
|
|
||||||
self.send_mail(options['mail'])
|
|
||||||
|
|
||||||
def send_mail(self, recipients):
|
|
||||||
mail = EmailMessage(
|
|
||||||
subject='Mahjong Rankings vom {:%d.%m.%Y}'.format(self.until),
|
|
||||||
body=MAIL_BODY,
|
|
||||||
from_email=settings.DEFAULT_FROM_EMAIL,
|
|
||||||
to=recipients)
|
|
||||||
mail.attach_file(self.filename)
|
|
||||||
mail.send()
|
|
||||||
@@ -17,22 +17,16 @@ class Command(BaseCommand):
|
|||||||
parser.add_argument('reset_date', type=parse_date)
|
parser.add_argument('reset_date', type=parse_date)
|
||||||
|
|
||||||
def handle(self, *args, **options):
|
def handle(self, *args, **options):
|
||||||
legacy_attrs = [ key for key in models.KyuDanRanking.__dict__.keys()
|
reset_date = timezone.make_aware(datetime.combine(options.get('reset_date'), time(23, 59, 59)))
|
||||||
if key.startswith('legacy') ]
|
# models.KyuDanRanking.objects.update(until=reset_date, force_recalc=True)
|
||||||
legacy_attrs.remove('legacy_date')
|
dan_rankigns = models.KyuDanRanking.objects.filter(dan__isnull=False)
|
||||||
reset_date = timezone.make_aware(datetime.combine(
|
for ranking in dan_rankigns:
|
||||||
options.get('reset_date'), time(23, 59, 59)))
|
|
||||||
models.KyuDanRanking.objects.update(until=reset_date, force_recalc=True)
|
|
||||||
for ranking in models.KyuDanRanking.objects.filter(dan__gt=0):
|
|
||||||
print(ranking)
|
|
||||||
ranking.dan = 1
|
ranking.dan = 1
|
||||||
ranking.dan_points = 0
|
ranking.dan_points = 0
|
||||||
ranking.kyu = None
|
|
||||||
ranking.kyu_points = 0
|
|
||||||
ranking.wins_in_a_row = 0
|
|
||||||
ranking.legacy_date = reset_date.date()
|
ranking.legacy_date = reset_date.date()
|
||||||
for legacy_attr in legacy_attrs:
|
ranking.legacy_hanchan_count = ranking.hanchan_count
|
||||||
attr = legacy_attr.split("_", maxsplit=1)[1]
|
ranking.legacy_dan_points = ranking.dan_points
|
||||||
print(ranking, legacy_attr, attr, getattr(ranking, attr))
|
ranking.legacy_kyu_points = ranking.kyu_points
|
||||||
setattr(ranking, legacy_attr, getattr(ranking, attr))
|
|
||||||
ranking.save()
|
ranking.save()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -4,39 +4,30 @@
|
|||||||
Recalculate Mahjong Rankings...
|
Recalculate Mahjong Rankings...
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from datetime import date, datetime, time
|
|
||||||
|
|
||||||
from django.core.management.base import BaseCommand
|
from django.core.management.base import BaseCommand
|
||||||
from django.utils import timezone
|
from datetime import date, datetime, time
|
||||||
from django.utils.dateparse import parse_date
|
|
||||||
|
|
||||||
from mahjong_ranking import models
|
from mahjong_ranking import models
|
||||||
|
from django.utils.dateparse import parse_date
|
||||||
|
from django.utils import timezone
|
||||||
|
|
||||||
class Command(BaseCommand):
|
class Command(BaseCommand):
|
||||||
""" Recalculate all Kyu/Dan Rankings """
|
""" Recalculate all Kyu/Dan Rankings """
|
||||||
|
|
||||||
help = "Recalculate the Kyu/Dan Rankings"
|
help = "Recalculate all Kyu/Dan Rankings"
|
||||||
|
|
||||||
def add_arguments(self, parser):
|
def add_arguments(self, parser):
|
||||||
parser.add_argument('-s', '--since', nargs='?', type=parse_date,
|
parser.add_argument('--since', nargs='?', type=parse_date)
|
||||||
metavar='YYYY-MM-DD',
|
parser.add_argument('--until', nargs='?', type=parse_date)
|
||||||
help='Use all Hanchans since the given date.')
|
parser.add_argument('--forcerecalc', action='store_true')
|
||||||
parser.add_argument('-u', '--until', nargs='?', type=parse_date,
|
|
||||||
metavar='YYYY-MM-DD',
|
|
||||||
help='Only use Hanchans until the given date.')
|
|
||||||
parser.add_argument('-f', '--force', action='store_true',
|
|
||||||
help="Force the recalculation of all Hanchans.")
|
|
||||||
|
|
||||||
def handle(self, *args, **options):
|
def handle(self, *args, **options):
|
||||||
since = options.get('since', None)
|
since = options.get('since', None)
|
||||||
until = options.get('until', None)
|
until = options.get('until', None)
|
||||||
force_recalc = options.get('force')
|
force_recalc = options.get('forecerecalc', False)
|
||||||
if isinstance(since, date):
|
if isinstance(since, date):
|
||||||
since = datetime.combine(since, time(0, 0, 0))
|
since = datetime.combine(since, time(0, 0, 0))
|
||||||
since = timezone.make_aware(since)
|
since = timezone.make_aware(since)
|
||||||
if isinstance(until, date):
|
if isinstance(until, date):
|
||||||
until = datetime.combine(until, time(23, 59, 59))
|
until = datetime.combine(until, time(23, 59, 59))
|
||||||
until = timezone.make_aware(until)
|
until = timezone.make_aware(until)
|
||||||
models.KyuDanRanking.objects.update(since=since, until=until,
|
models.KyuDanRanking.objects.update(since=since, until=until, force_recalc=force_recalc)
|
||||||
force_recalc=force_recalc)
|
|
||||||
@@ -23,8 +23,8 @@ class HanchanManager(models.Manager):
|
|||||||
:return: QuerySet Object
|
:return: QuerySet Object
|
||||||
"""
|
"""
|
||||||
if user:
|
if user:
|
||||||
return self.user_hanchans(user, confirmed=True, until=until,
|
return self.user_hanchans(
|
||||||
**filter_args)
|
user, confirmed=True, since=since, until=until, **filter_args)
|
||||||
hanchans = self.filter(confirmed=True, **filter_args)
|
hanchans = self.filter(confirmed=True, **filter_args)
|
||||||
if since:
|
if since:
|
||||||
hanchans = hanchans.filter(start__gt=since)
|
hanchans = hanchans.filter(start__gt=since)
|
||||||
@@ -101,7 +101,7 @@ class HanchanManager(models.Manager):
|
|||||||
)
|
)
|
||||||
queryset = queryset.filter(**filter_args)
|
queryset = queryset.filter(**filter_args)
|
||||||
if since:
|
if since:
|
||||||
queryset = queryset.filter(start__gte=since)
|
queryset = queryset.filter(start__gt=since)
|
||||||
if until:
|
if until:
|
||||||
queryset = queryset.filter(start__lte=until)
|
queryset = queryset.filter(start__lte=until)
|
||||||
queryset = queryset.select_related().order_by('-start')
|
queryset = queryset.select_related().order_by('-start')
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
from django.conf import settings
|
|
||||||
from django.db import models, migrations
|
from django.db import models, migrations
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
('events', '0005_auto_20150907_2021'),
|
('events', '0005_auto_20150907_2021'),
|
||||||
@@ -16,19 +17,15 @@ class Migration(migrations.Migration):
|
|||||||
name='EventRanking',
|
name='EventRanking',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(verbose_name='ID',
|
('id', models.AutoField(verbose_name='ID',
|
||||||
serialize=False, auto_created=True,
|
serialize=False, auto_created=True, primary_key=True)),
|
||||||
primary_key=True)),
|
('placement', models.PositiveIntegerField(null=True, blank=True)),
|
||||||
('placement',
|
|
||||||
models.PositiveIntegerField(null=True, blank=True)),
|
|
||||||
('avg_placement', models.FloatField(default=4)),
|
('avg_placement', models.FloatField(default=4)),
|
||||||
('avg_score', models.FloatField(default=0)),
|
('avg_score', models.FloatField(default=0)),
|
||||||
('hanchan_count', models.PositiveIntegerField(default=0)),
|
('hanchan_count', models.PositiveIntegerField(default=0)),
|
||||||
('good_hanchans', models.PositiveIntegerField(default=0)),
|
('good_hanchans', models.PositiveIntegerField(default=0)),
|
||||||
('won_hanchans', models.PositiveIntegerField(default=0)),
|
('won_hanchans', models.PositiveIntegerField(default=0)),
|
||||||
('event', models.ForeignKey(to='events.Event',
|
('event', models.ForeignKey(to='events.Event')),
|
||||||
on_delete=models.CASCADE)),
|
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)),
|
||||||
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL,
|
|
||||||
on_delete=models.CASCADE)),
|
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'ordering': ('placement', 'avg_placement', '-avg_score'),
|
'ordering': ('placement', 'avg_placement', '-avg_score'),
|
||||||
@@ -38,13 +35,10 @@ class Migration(migrations.Migration):
|
|||||||
name='Hanchan',
|
name='Hanchan',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(verbose_name='ID',
|
('id', models.AutoField(verbose_name='ID',
|
||||||
serialize=False, auto_created=True,
|
serialize=False, auto_created=True, primary_key=True)),
|
||||||
primary_key=True)),
|
|
||||||
('start', models.DateTimeField(
|
('start', models.DateTimeField(
|
||||||
help_text='Wichtig damit die richtigen Hanchans in die Wertung kommen.',
|
help_text='Wichtig damit die richtigen Hanchans in die Wertung kommen.', verbose_name='Beginn')),
|
||||||
verbose_name='Beginn')),
|
('player1_input_score', models.IntegerField(verbose_name='Punkte')),
|
||||||
('player1_input_score',
|
|
||||||
models.IntegerField(verbose_name='Punkte')),
|
|
||||||
('player1_game_score', models.PositiveIntegerField(
|
('player1_game_score', models.PositiveIntegerField(
|
||||||
default=0, verbose_name='Punkte', editable=False)),
|
default=0, verbose_name='Punkte', editable=False)),
|
||||||
('player1_placement', models.PositiveSmallIntegerField(
|
('player1_placement', models.PositiveSmallIntegerField(
|
||||||
@@ -56,11 +50,8 @@ class Migration(migrations.Migration):
|
|||||||
('player1_bonus_points', models.SmallIntegerField(
|
('player1_bonus_points', models.SmallIntegerField(
|
||||||
null=True, editable=False, blank=True)),
|
null=True, editable=False, blank=True)),
|
||||||
('player1_comment', models.CharField(verbose_name='Anmerkung',
|
('player1_comment', models.CharField(verbose_name='Anmerkung',
|
||||||
max_length=255,
|
max_length=255, editable=False, blank=True)),
|
||||||
editable=False,
|
('player2_input_score', models.IntegerField(verbose_name='Punkte')),
|
||||||
blank=True)),
|
|
||||||
('player2_input_score',
|
|
||||||
models.IntegerField(verbose_name='Punkte')),
|
|
||||||
('player2_game_score', models.PositiveIntegerField(
|
('player2_game_score', models.PositiveIntegerField(
|
||||||
default=0, verbose_name='Punkte', editable=False)),
|
default=0, verbose_name='Punkte', editable=False)),
|
||||||
('player2_placement', models.PositiveSmallIntegerField(
|
('player2_placement', models.PositiveSmallIntegerField(
|
||||||
@@ -72,11 +63,8 @@ class Migration(migrations.Migration):
|
|||||||
('player2_bonus_points', models.SmallIntegerField(
|
('player2_bonus_points', models.SmallIntegerField(
|
||||||
null=True, editable=False, blank=True)),
|
null=True, editable=False, blank=True)),
|
||||||
('player2_comment', models.CharField(verbose_name='Anmerkung',
|
('player2_comment', models.CharField(verbose_name='Anmerkung',
|
||||||
max_length=255,
|
max_length=255, editable=False, blank=True)),
|
||||||
editable=False,
|
('player3_input_score', models.IntegerField(verbose_name='Punkte')),
|
||||||
blank=True)),
|
|
||||||
('player3_input_score',
|
|
||||||
models.IntegerField(verbose_name='Punkte')),
|
|
||||||
('player3_game_score', models.PositiveIntegerField(
|
('player3_game_score', models.PositiveIntegerField(
|
||||||
default=0, verbose_name='Punkte', editable=False)),
|
default=0, verbose_name='Punkte', editable=False)),
|
||||||
('player3_placement', models.PositiveSmallIntegerField(
|
('player3_placement', models.PositiveSmallIntegerField(
|
||||||
@@ -88,11 +76,8 @@ class Migration(migrations.Migration):
|
|||||||
('player3_bonus_points', models.SmallIntegerField(
|
('player3_bonus_points', models.SmallIntegerField(
|
||||||
null=True, editable=False, blank=True)),
|
null=True, editable=False, blank=True)),
|
||||||
('player3_comment', models.CharField(verbose_name='Anmerkung',
|
('player3_comment', models.CharField(verbose_name='Anmerkung',
|
||||||
max_length=255,
|
max_length=255, editable=False, blank=True)),
|
||||||
editable=False,
|
('player4_input_score', models.IntegerField(verbose_name='Punkte')),
|
||||||
blank=True)),
|
|
||||||
('player4_input_score',
|
|
||||||
models.IntegerField(verbose_name='Punkte')),
|
|
||||||
('player4_game_score', models.PositiveIntegerField(
|
('player4_game_score', models.PositiveIntegerField(
|
||||||
default=0, verbose_name='Punkte', editable=False)),
|
default=0, verbose_name='Punkte', editable=False)),
|
||||||
('player4_placement', models.PositiveSmallIntegerField(
|
('player4_placement', models.PositiveSmallIntegerField(
|
||||||
@@ -104,37 +89,22 @@ class Migration(migrations.Migration):
|
|||||||
('player4_bonus_points', models.SmallIntegerField(
|
('player4_bonus_points', models.SmallIntegerField(
|
||||||
null=True, editable=False, blank=True)),
|
null=True, editable=False, blank=True)),
|
||||||
('player4_comment', models.CharField(verbose_name='Anmerkung',
|
('player4_comment', models.CharField(verbose_name='Anmerkung',
|
||||||
max_length=255,
|
max_length=255, editable=False, blank=True)),
|
||||||
editable=False,
|
('comment', models.TextField(verbose_name='Anmerkung', blank=True)),
|
||||||
blank=True)),
|
|
||||||
('comment',
|
|
||||||
models.TextField(verbose_name='Anmerkung', blank=True)),
|
|
||||||
('confirmed', models.BooleanField(
|
('confirmed', models.BooleanField(
|
||||||
default=True,
|
default=True, help_text='Nur g\xfcltige und best\xe4tigte Hanchans kommen in die Wertung.', verbose_name='Wurde best\xe4tigt')),
|
||||||
help_text='Nur g\xfcltige und best\xe4tigte Hanchans kommen in die Wertung.',
|
('player_names', models.CharField(max_length=255, editable=False)),
|
||||||
verbose_name='Wurde best\xe4tigt')),
|
|
||||||
('player_names',
|
|
||||||
models.CharField(max_length=255, editable=False)),
|
|
||||||
('season', models.PositiveSmallIntegerField(
|
('season', models.PositiveSmallIntegerField(
|
||||||
verbose_name='Saison', editable=False, db_index=True)),
|
verbose_name='Saison', editable=False, db_index=True)),
|
||||||
('event', models.ForeignKey(to='events.Event',
|
('event', models.ForeignKey(to='events.Event')),
|
||||||
on_delete=models.CASCADE)),
|
|
||||||
('player1', models.ForeignKey(related_name='user_hanchan+',
|
('player1', models.ForeignKey(related_name='user_hanchan+',
|
||||||
verbose_name='Spieler 1',
|
verbose_name='Spieler 1', to=settings.AUTH_USER_MODEL)),
|
||||||
to=settings.AUTH_USER_MODEL,
|
|
||||||
on_delete=models.CASCADE)),
|
|
||||||
('player2', models.ForeignKey(related_name='user_hanchan+',
|
('player2', models.ForeignKey(related_name='user_hanchan+',
|
||||||
verbose_name='Spieler 2',
|
verbose_name='Spieler 2', to=settings.AUTH_USER_MODEL)),
|
||||||
to=settings.AUTH_USER_MODEL,
|
|
||||||
on_delete=models.CASCADE)),
|
|
||||||
('player3', models.ForeignKey(related_name='user_hanchan+',
|
('player3', models.ForeignKey(related_name='user_hanchan+',
|
||||||
verbose_name='Spieler 3',
|
verbose_name='Spieler 3', to=settings.AUTH_USER_MODEL)),
|
||||||
to=settings.AUTH_USER_MODEL,
|
|
||||||
on_delete=models.CASCADE)),
|
|
||||||
('player4', models.ForeignKey(related_name='user_hanchan+',
|
('player4', models.ForeignKey(related_name='user_hanchan+',
|
||||||
verbose_name='Spieler 4',
|
verbose_name='Spieler 4', to=settings.AUTH_USER_MODEL)),
|
||||||
to=settings.AUTH_USER_MODEL,
|
|
||||||
on_delete=models.CASCADE)),
|
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'ordering': ('-start',),
|
'ordering': ('-start',),
|
||||||
@@ -146,11 +116,8 @@ class Migration(migrations.Migration):
|
|||||||
name='KyuDanRanking',
|
name='KyuDanRanking',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(verbose_name='ID',
|
('id', models.AutoField(verbose_name='ID',
|
||||||
serialize=False, auto_created=True,
|
serialize=False, auto_created=True, primary_key=True)),
|
||||||
primary_key=True)),
|
('dan', models.PositiveSmallIntegerField(null=True, blank=True)),
|
||||||
(
|
|
||||||
'dan',
|
|
||||||
models.PositiveSmallIntegerField(null=True, blank=True)),
|
|
||||||
('dan_points', models.PositiveIntegerField(default=0)),
|
('dan_points', models.PositiveIntegerField(default=0)),
|
||||||
('kyu', models.PositiveSmallIntegerField(
|
('kyu', models.PositiveSmallIntegerField(
|
||||||
default=10, null=True, blank=True)),
|
default=10, null=True, blank=True)),
|
||||||
@@ -161,8 +128,7 @@ class Migration(migrations.Migration):
|
|||||||
('legacy_date', models.DateField(null=True, blank=True)),
|
('legacy_date', models.DateField(null=True, blank=True)),
|
||||||
('legacy_dan_points', models.PositiveIntegerField(default=0)),
|
('legacy_dan_points', models.PositiveIntegerField(default=0)),
|
||||||
('legacy_kyu_points', models.PositiveIntegerField(default=0)),
|
('legacy_kyu_points', models.PositiveIntegerField(default=0)),
|
||||||
('user', models.OneToOneField(to=settings.AUTH_USER_MODEL,
|
('user', models.OneToOneField(to=settings.AUTH_USER_MODEL)),
|
||||||
on_delete=models.CASCADE)),
|
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'ordering': ('-dan', '-dan_points', '-kyu_points'),
|
'ordering': ('-dan', '-dan_points', '-kyu_points'),
|
||||||
@@ -174,19 +140,15 @@ class Migration(migrations.Migration):
|
|||||||
name='SeasonRanking',
|
name='SeasonRanking',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(verbose_name='ID',
|
('id', models.AutoField(verbose_name='ID',
|
||||||
serialize=False, auto_created=True,
|
serialize=False, auto_created=True, primary_key=True)),
|
||||||
primary_key=True)),
|
('season', models.PositiveSmallIntegerField(verbose_name='Saison')),
|
||||||
('season',
|
('placement', models.PositiveIntegerField(null=True, blank=True)),
|
||||||
models.PositiveSmallIntegerField(verbose_name='Saison')),
|
|
||||||
('placement',
|
|
||||||
models.PositiveIntegerField(null=True, blank=True)),
|
|
||||||
('avg_placement', models.FloatField(null=True, blank=True)),
|
('avg_placement', models.FloatField(null=True, blank=True)),
|
||||||
('avg_score', models.FloatField(null=True, blank=True)),
|
('avg_score', models.FloatField(null=True, blank=True)),
|
||||||
('hanchan_count', models.PositiveIntegerField(default=0)),
|
('hanchan_count', models.PositiveIntegerField(default=0)),
|
||||||
('good_hanchans', models.PositiveIntegerField(default=0)),
|
('good_hanchans', models.PositiveIntegerField(default=0)),
|
||||||
('won_hanchans', models.PositiveIntegerField(default=0)),
|
('won_hanchans', models.PositiveIntegerField(default=0)),
|
||||||
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL,
|
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)),
|
||||||
on_delete=models.CASCADE)),
|
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'ordering': ('placement', 'avg_placement', '-avg_score'),
|
'ordering': ('placement', 'avg_placement', '-avg_score'),
|
||||||
|
|||||||
@@ -1,87 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Generated by Django 1.11.8 on 2017-12-14 12:18
|
|
||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
from django.conf import settings
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('mahjong_ranking', '0005_auto_20171115_0653'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='kyudanranking',
|
|
||||||
name='legacy_dan',
|
|
||||||
field=models.PositiveSmallIntegerField(blank=True, null=True),
|
|
||||||
),
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='kyudanranking',
|
|
||||||
name='legacy_good_hanchans',
|
|
||||||
field=models.PositiveIntegerField(blank=True, null=True),
|
|
||||||
),
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='kyudanranking',
|
|
||||||
name='legacy_kyu',
|
|
||||||
field=models.PositiveSmallIntegerField(blank=True, null=True),
|
|
||||||
),
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='kyudanranking',
|
|
||||||
name='legacy_won_hanchans',
|
|
||||||
field=models.PositiveIntegerField(blank=True, null=True),
|
|
||||||
),
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='kyudanranking',
|
|
||||||
name='max_dan_points',
|
|
||||||
field=models.PositiveIntegerField(default=0),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='eventranking',
|
|
||||||
name='user',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='hanchan',
|
|
||||||
name='player1',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='user_hanchan+', to=settings.AUTH_USER_MODEL, verbose_name='Spieler 1'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='hanchan',
|
|
||||||
name='player2',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='user_hanchan+', to=settings.AUTH_USER_MODEL, verbose_name='Spieler 2'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='hanchan',
|
|
||||||
name='player3',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='user_hanchan+', to=settings.AUTH_USER_MODEL, verbose_name='Spieler 3'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='hanchan',
|
|
||||||
name='player4',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='user_hanchan+', to=settings.AUTH_USER_MODEL, verbose_name='Spieler 4'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='kyudanranking',
|
|
||||||
name='legacy_dan_points',
|
|
||||||
field=models.PositiveIntegerField(blank=True, null=True),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='kyudanranking',
|
|
||||||
name='legacy_hanchan_count',
|
|
||||||
field=models.PositiveIntegerField(blank=True, null=True),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='kyudanranking',
|
|
||||||
name='legacy_kyu_points',
|
|
||||||
field=models.PositiveIntegerField(blank=True, null=True),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='seasonranking',
|
|
||||||
name='user',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@@ -9,8 +9,8 @@ from datetime import datetime, time
|
|||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
|
from django.core.urlresolvers import reverse
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.urls import reverse
|
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
|
|
||||||
@@ -29,8 +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)
|
||||||
event = models.ForeignKey(Event, on_delete=models.CASCADE)
|
event = models.ForeignKey(Event)
|
||||||
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)
|
||||||
avg_score = models.FloatField(default=0)
|
avg_score = models.FloatField(default=0)
|
||||||
@@ -86,7 +86,7 @@ class Hanchan(models.Model):
|
|||||||
Es werden aber noch andere Tests durchgeführt, ob sie gültig ist.
|
Es werden aber noch andere Tests durchgeführt, ob sie gültig ist.
|
||||||
Außerdem gehört jede Hanchan zu einer Veranstaltung.
|
Außerdem gehört jede Hanchan zu einer Veranstaltung.
|
||||||
"""
|
"""
|
||||||
event = models.ForeignKey(Event, on_delete=models.CASCADE)
|
event = models.ForeignKey(Event)
|
||||||
start = models.DateTimeField(
|
start = models.DateTimeField(
|
||||||
_('Start'),
|
_('Start'),
|
||||||
help_text=_('This is crucial to get the right Hanchans that scores')
|
help_text=_('This is crucial to get the right Hanchans that scores')
|
||||||
@@ -94,7 +94,7 @@ class Hanchan(models.Model):
|
|||||||
|
|
||||||
player1 = models.ForeignKey(
|
player1 = models.ForeignKey(
|
||||||
settings.AUTH_USER_MODEL,
|
settings.AUTH_USER_MODEL,
|
||||||
on_delete=models.PROTECT,
|
on_delete=models.CASCADE,
|
||||||
related_name='user_hanchan+',
|
related_name='user_hanchan+',
|
||||||
verbose_name=_('Player 1'))
|
verbose_name=_('Player 1'))
|
||||||
player1_input_score = models.IntegerField(_('Score'))
|
player1_input_score = models.IntegerField(_('Score'))
|
||||||
@@ -113,7 +113,7 @@ class Hanchan(models.Model):
|
|||||||
|
|
||||||
player2 = models.ForeignKey(
|
player2 = models.ForeignKey(
|
||||||
settings.AUTH_USER_MODEL,
|
settings.AUTH_USER_MODEL,
|
||||||
on_delete=models.PROTECT,
|
on_delete=models.CASCADE,
|
||||||
related_name='user_hanchan+',
|
related_name='user_hanchan+',
|
||||||
verbose_name=_('Player 2'))
|
verbose_name=_('Player 2'))
|
||||||
player2_input_score = models.IntegerField(_('Score'))
|
player2_input_score = models.IntegerField(_('Score'))
|
||||||
@@ -132,7 +132,7 @@ class Hanchan(models.Model):
|
|||||||
|
|
||||||
player3 = models.ForeignKey(
|
player3 = models.ForeignKey(
|
||||||
settings.AUTH_USER_MODEL,
|
settings.AUTH_USER_MODEL,
|
||||||
on_delete=models.PROTECT,
|
on_delete=models.CASCADE,
|
||||||
related_name='user_hanchan+',
|
related_name='user_hanchan+',
|
||||||
verbose_name=_('Player 3'))
|
verbose_name=_('Player 3'))
|
||||||
player3_input_score = models.IntegerField(_('Score'))
|
player3_input_score = models.IntegerField(_('Score'))
|
||||||
@@ -151,7 +151,7 @@ class Hanchan(models.Model):
|
|||||||
|
|
||||||
player4 = models.ForeignKey(
|
player4 = models.ForeignKey(
|
||||||
settings.AUTH_USER_MODEL,
|
settings.AUTH_USER_MODEL,
|
||||||
on_delete=models.PROTECT,
|
on_delete=models.CASCADE,
|
||||||
related_name='user_hanchan+',
|
related_name='user_hanchan+',
|
||||||
verbose_name=_('Player 4'))
|
verbose_name=_('Player 4'))
|
||||||
player4_input_score = models.IntegerField(_('Score'))
|
player4_input_score = models.IntegerField(_('Score'))
|
||||||
@@ -335,24 +335,18 @@ class KyuDanRanking(models.Model):
|
|||||||
Im Gegensatz zum Ladder Ranking ist das nicht Saison gebunden.
|
Im Gegensatz zum Ladder Ranking ist das nicht Saison gebunden.
|
||||||
Deswegen läuft es getrennt.
|
Deswegen läuft es getrennt.
|
||||||
"""
|
"""
|
||||||
user = models.OneToOneField(settings.AUTH_USER_MODEL,
|
user = models.OneToOneField(settings.AUTH_USER_MODEL)
|
||||||
on_delete=models.CASCADE)
|
|
||||||
dan = models.PositiveSmallIntegerField(blank=True, null=True)
|
dan = models.PositiveSmallIntegerField(blank=True, null=True)
|
||||||
dan_points = models.PositiveIntegerField(default=0)
|
dan_points = models.PositiveIntegerField(default=0)
|
||||||
max_dan_points = models.PositiveIntegerField(default=0)
|
|
||||||
kyu = models.PositiveSmallIntegerField(default=10, blank=True, null=True)
|
kyu = models.PositiveSmallIntegerField(default=10, blank=True, null=True)
|
||||||
kyu_points = models.PositiveIntegerField(default=0)
|
kyu_points = models.PositiveIntegerField(default=0)
|
||||||
won_hanchans = models.PositiveIntegerField(default=0)
|
won_hanchans = models.PositiveIntegerField(default=0)
|
||||||
good_hanchans = models.PositiveIntegerField(default=0)
|
good_hanchans = models.PositiveIntegerField(default=0)
|
||||||
hanchan_count = models.PositiveIntegerField(default=0)
|
hanchan_count = models.PositiveIntegerField(default=0)
|
||||||
legacy_date = models.DateField(blank=True, null=True)
|
legacy_date = models.DateField(blank=True, null=True)
|
||||||
legacy_dan = models.PositiveSmallIntegerField(blank=True, null=True)
|
legacy_hanchan_count = models.PositiveIntegerField(default=0)
|
||||||
legacy_dan_points = models.PositiveIntegerField(blank=True, null=True)
|
legacy_dan_points = models.PositiveIntegerField(default=0)
|
||||||
legacy_kyu = models.PositiveSmallIntegerField(blank=True, null=True)
|
legacy_kyu_points = models.PositiveIntegerField(default=0)
|
||||||
legacy_kyu_points = models.PositiveIntegerField(blank=True, null=True)
|
|
||||||
legacy_hanchan_count = models.PositiveIntegerField(blank=True, null=True)
|
|
||||||
legacy_good_hanchans = models.PositiveIntegerField(blank=True, null=True)
|
|
||||||
legacy_won_hanchans = models.PositiveIntegerField(blank=True, null=True)
|
|
||||||
wins_in_a_row = models.PositiveIntegerField(default=0)
|
wins_in_a_row = models.PositiveIntegerField(default=0)
|
||||||
last_hanchan_date = models.DateTimeField(blank=True, null=True)
|
last_hanchan_date = models.DateTimeField(blank=True, null=True)
|
||||||
objects = managers.KyuDanRankingManager()
|
objects = managers.KyuDanRankingManager()
|
||||||
@@ -362,22 +356,11 @@ class KyuDanRanking(models.Model):
|
|||||||
verbose_name = _(u'Kyū/Dan Ranking')
|
verbose_name = _(u'Kyū/Dan Ranking')
|
||||||
verbose_name_plural = _(u'Kyū/Dan Rankings')
|
verbose_name_plural = _(u'Kyū/Dan Rankings')
|
||||||
|
|
||||||
@property
|
def __unicode__(self):
|
||||||
def rank(self):
|
if self.dan_points is not None:
|
||||||
if self.dan is not None:
|
|
||||||
return "{0:d}. Dan".format(self.dan)
|
|
||||||
else:
|
|
||||||
return "{0:d}. Kyū".format(self.kyu or 10)
|
|
||||||
|
|
||||||
@property
|
|
||||||
def points(self):
|
|
||||||
return self.dan_points if self.dan is not None else self.kyu_points
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
if self.dan is not None:
|
|
||||||
return u"%s - %d. Dan" % (self.user.username, self.dan or 1)
|
return u"%s - %d. Dan" % (self.user.username, self.dan or 1)
|
||||||
else:
|
else:
|
||||||
return u"%s - %d. Kyū" % (self.user.username, self.kyu or 10)
|
return u"%s - %d. Kyu" % (self.user.username, self.kyu or 10)
|
||||||
|
|
||||||
def append_3_in_a_row_bonuspoints(self, hanchan):
|
def append_3_in_a_row_bonuspoints(self, hanchan):
|
||||||
u"""
|
u"""
|
||||||
@@ -385,14 +368,12 @@ class KyuDanRanking(models.Model):
|
|||||||
das er einen Dan Rang aufsteigt. Dies wird als Kommentar abgespeichert,
|
das er einen Dan Rang aufsteigt. Dies wird als Kommentar abgespeichert,
|
||||||
um es besser nachvollziehen zu können.
|
um es besser nachvollziehen zu können.
|
||||||
"""
|
"""
|
||||||
if not self.dan or not settings.DAN_3_WINS_IN_A_ROW:
|
if self.dan and hanchan.placement == 1:
|
||||||
return
|
|
||||||
if hanchan.placement == 1:
|
|
||||||
self.wins_in_a_row += 1
|
self.wins_in_a_row += 1
|
||||||
else:
|
else:
|
||||||
self.wins_in_a_row = 0
|
self.wins_in_a_row = 0
|
||||||
return
|
|
||||||
if self.wins_in_a_row >= 3 and self.dan < 9:
|
if self.dan and self.wins_in_a_row >= 3 and self.dan < 9:
|
||||||
LOGGER.info(
|
LOGGER.info(
|
||||||
'adding bonuspoints for 3 wins in a row for %s', self.user)
|
'adding bonuspoints for 3 wins in a row for %s', self.user)
|
||||||
new_dan_rank = self.dan + 1
|
new_dan_rank = self.dan + 1
|
||||||
@@ -413,8 +394,8 @@ class KyuDanRanking(models.Model):
|
|||||||
bonus_points, new_dan_rank)
|
bonus_points, new_dan_rank)
|
||||||
self.dan_points += bonus_points
|
self.dan_points += bonus_points
|
||||||
self.wins_in_a_row = 0
|
self.wins_in_a_row = 0
|
||||||
self.update_rank()
|
|
||||||
|
|
||||||
|
# TODO: Komplett Überabreiten!
|
||||||
def append_tournament_bonuspoints(self, hanchan):
|
def append_tournament_bonuspoints(self, hanchan):
|
||||||
"""
|
"""
|
||||||
Prüft ob es die letzte Hanchan in einem Turnier war. Wenn ja werden
|
Prüft ob es die letzte Hanchan in einem Turnier war. Wenn ja werden
|
||||||
@@ -427,20 +408,20 @@ class KyuDanRanking(models.Model):
|
|||||||
user=self.user, event=hanchan.event
|
user=self.user, event=hanchan.event
|
||||||
).order_by('-start')
|
).order_by('-start')
|
||||||
last_hanchan_this_event = hanchans_this_event[0]
|
last_hanchan_this_event = hanchans_this_event[0]
|
||||||
|
if hanchan != last_hanchan_this_event:
|
||||||
# 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
|
return False
|
||||||
|
else:
|
||||||
event_ranking = EventRanking.objects.get(
|
event_ranking = EventRanking.objects.get(
|
||||||
user=self.user,
|
user=self.user,
|
||||||
event=hanchan.event
|
event=hanchan.event
|
||||||
)
|
)
|
||||||
if event_ranking.placement == 1:
|
if event_ranking.placement == 1:
|
||||||
bonus_points += settings.TOURNAMENT_WIN_BONUSPOINTS
|
bonus_points += 4
|
||||||
hanchan.player_comment += u'+{0:d} Punkte Turnier gewonnen. '.format(
|
hanchan.player_comment += u'+4 Punkte Turnier gewonnen. '
|
||||||
settings.TOURNAMENT_WIN_BONUSPOINTS)
|
|
||||||
if event_ranking.avg_placement == 1:
|
if event_ranking.avg_placement == 1:
|
||||||
bonus_points += settings.TOURNAMENT_FLAWLESS_VICTORY_BONUSPOINTS
|
bonus_points += 8
|
||||||
hanchan.player_comment += u'+{0:d} Pkt: alle Spiele des Turnieres gewonnen. '.format(
|
hanchan.player_comment += u'+8 Pkt: alle Spiele des Turnieres gewonnen. '
|
||||||
settings.TOURNAMENT_FLAWLESS_VICTORY_BONUSPOINTS)
|
|
||||||
|
|
||||||
if bonus_points and self.dan:
|
if bonus_points and self.dan:
|
||||||
hanchan.dan_points += bonus_points
|
hanchan.dan_points += bonus_points
|
||||||
@@ -470,19 +451,20 @@ class KyuDanRanking(models.Model):
|
|||||||
force_recalc = True
|
force_recalc = True
|
||||||
if force_recalc:
|
if force_recalc:
|
||||||
# Setze alles auf die legacy Werte und berechne alles von neuem.
|
# Setze alles auf die legacy Werte und berechne alles von neuem.
|
||||||
self.dan = self.legacy_dan
|
self.dan = None
|
||||||
self.dan_points = self.legacy_dan_points or 0
|
self.dan_points = self.legacy_dan_points or 0
|
||||||
self.max_dan_points = self.dan_points
|
self.kyu = None
|
||||||
self.kyu = self.legacy_kyu
|
|
||||||
self.kyu_points = self.legacy_kyu_points or 0
|
self.kyu_points = self.legacy_kyu_points or 0
|
||||||
self.hanchan_count = self.legacy_hanchan_count or 0
|
self.hanchan_count = self.legacy_hanchan_count or 0
|
||||||
self.good_hanchans = self.legacy_good_hanchans or 0
|
self.good_hanchans = 0
|
||||||
self.won_hanchans = self.legacy_won_hanchans or 0
|
self.won_hanchans = 0
|
||||||
self.last_hanchan_date = None
|
|
||||||
self.update_rank()
|
self.update_rank()
|
||||||
since = timezone.make_aware(datetime.combine(
|
self.last_hanchan_date = None
|
||||||
self.legacy_date,
|
if self.legacy_date:
|
||||||
time(23, 59, 59))) if self.legacy_date else None
|
since = timezone.make_aware(
|
||||||
|
datetime.combine(self.legacy_date, time(0, 0, 0)))
|
||||||
|
else:
|
||||||
|
since = None
|
||||||
elif self.last_hanchan_date:
|
elif self.last_hanchan_date:
|
||||||
since = self.last_hanchan_date
|
since = self.last_hanchan_date
|
||||||
elif self.legacy_date:
|
elif self.legacy_date:
|
||||||
@@ -497,29 +479,42 @@ class KyuDanRanking(models.Model):
|
|||||||
valid_hanchans = valid_hanchans.filter(start__gt=since)
|
valid_hanchans = valid_hanchans.filter(start__gt=since)
|
||||||
if until:
|
if until:
|
||||||
valid_hanchans = valid_hanchans.filter(start__lte=until)
|
valid_hanchans = valid_hanchans.filter(start__lte=until)
|
||||||
|
|
||||||
|
self.hanchan_count += valid_hanchans.count()
|
||||||
for hanchan in valid_hanchans:
|
for hanchan in valid_hanchans:
|
||||||
self.hanchan_count += 1
|
|
||||||
hanchan.get_playerdata(self.user)
|
hanchan.get_playerdata(self.user)
|
||||||
if since and hanchan.start < since:
|
if since and hanchan.start < since:
|
||||||
LOGGER.debug(hanchan, "<", since, "no recalc")
|
print(hanchan, "<", since, "no recalc")
|
||||||
self.dan_points += hanchan.dan_points or 0
|
self.dan_points += hanchan.dan_points or 0
|
||||||
self.kyu_points += hanchan.kyu_points or 0
|
self.kyu_points += hanchan.kyu_points or 0
|
||||||
self.update_rank()
|
self.update_rank()
|
||||||
else:
|
else:
|
||||||
hanchan.bonus_points = 0
|
hanchan.bonus_points = 0
|
||||||
hanchan.player_comment = ""
|
hanchan.player_comment = u""
|
||||||
self.update_hanchan_points(hanchan)
|
self.update_hanchan_points(hanchan)
|
||||||
if hanchan.event.mahjong_tournament:
|
if hanchan.event.mahjong_tournament:
|
||||||
self.append_tournament_bonuspoints(hanchan)
|
self.append_tournament_bonuspoints(hanchan)
|
||||||
self.update_rank()
|
self.update_rank()
|
||||||
self.append_3_in_a_row_bonuspoints(hanchan)
|
self.append_3_in_a_row_bonuspoints(hanchan)
|
||||||
|
self.update_rank()
|
||||||
hanchan.update_playerdata(self.user)
|
hanchan.update_playerdata(self.user)
|
||||||
hanchan.save(recalculate=False)
|
hanchan.save(recalculate=False)
|
||||||
self.won_hanchans += 1 if hanchan.placement == 1 else 0
|
self.won_hanchans += 1 if hanchan.placement == 1 else 0
|
||||||
self.good_hanchans += 1 if hanchan.placement == 2 else 0
|
self.good_hanchans += 1 if hanchan.placement == 2 else 0
|
||||||
self.last_hanchan_date = hanchan.start
|
self.last_hanchan_date = hanchan.start
|
||||||
|
LOGGER.debug(
|
||||||
|
'id: %(id)d, start: %(start)s, placement: %(placement)d, '
|
||||||
|
'score: %(score)d, kyu points: %(kyu_points)d, dan points: '
|
||||||
|
'%(dan_points)d, bonus points: %(bonus_points)d',
|
||||||
|
{'id': hanchan.pk, 'start': hanchan.start,
|
||||||
|
'placement': hanchan.placement, 'score': hanchan.game_score,
|
||||||
|
'kyu_points': hanchan.kyu_points or 0,
|
||||||
|
'dan_points': hanchan.dan_points or 0,
|
||||||
|
'bonus_points': hanchan.bonus_points or 0}
|
||||||
|
)
|
||||||
self.save(force_update=True)
|
self.save(force_update=True)
|
||||||
|
|
||||||
|
|
||||||
def update_hanchan_points(self, hanchan):
|
def update_hanchan_points(self, hanchan):
|
||||||
"""
|
"""
|
||||||
Berechne die Kyu bzw. Dan Punkte für eine Hanchan neu.
|
Berechne die Kyu bzw. Dan Punkte für eine Hanchan neu.
|
||||||
@@ -528,7 +523,7 @@ class KyuDanRanking(models.Model):
|
|||||||
"""
|
"""
|
||||||
hanchan.kyu_points = None
|
hanchan.kyu_points = None
|
||||||
hanchan.dan_points = None
|
hanchan.dan_points = None
|
||||||
if hanchan.event.mahjong_tournament and settings.TOURNAMENT_POINT_SYSTEM:
|
if hanchan.event.mahjong_tournament:
|
||||||
"""Für Turniere gelten andere Regeln zur Punktevergabe:
|
"""Für Turniere gelten andere Regeln zur Punktevergabe:
|
||||||
1. Platz 4 Punkte
|
1. Platz 4 Punkte
|
||||||
2. Platz 3 Punkte
|
2. Platz 3 Punkte
|
||||||
@@ -552,7 +547,6 @@ class KyuDanRanking(models.Model):
|
|||||||
hanchan.dan_points = -1
|
hanchan.dan_points = -1
|
||||||
elif hanchan.placement == 4:
|
elif hanchan.placement == 4:
|
||||||
hanchan.dan_points = -2
|
hanchan.dan_points = -2
|
||||||
# otherwise player must be in the kyu ranking
|
|
||||||
elif hanchan.game_score >= 60000:
|
elif hanchan.game_score >= 60000:
|
||||||
hanchan.kyu_points = 3
|
hanchan.kyu_points = 3
|
||||||
elif hanchan.game_score >= 30000:
|
elif hanchan.game_score >= 30000:
|
||||||
@@ -566,44 +560,46 @@ class KyuDanRanking(models.Model):
|
|||||||
if self.dan:
|
if self.dan:
|
||||||
# Only substract so much points that player has 0 Points:
|
# Only substract so much points that player has 0 Points:
|
||||||
if self.dan_points + hanchan.dan_points < 0:
|
if self.dan_points + hanchan.dan_points < 0:
|
||||||
hanchan.player_comment = 'Spieler unterschreitet 0 Punkte.' \
|
|
||||||
'(Original {} Punkte)'.format(hanchan.dan_points)
|
|
||||||
hanchan.dan_points -= (self.dan_points + hanchan.dan_points)
|
hanchan.dan_points -= (self.dan_points + hanchan.dan_points)
|
||||||
self.dan_points += hanchan.dan_points
|
self.dan_points += hanchan.dan_points
|
||||||
else:
|
else:
|
||||||
# Only substract so much points that player has 0 Points:
|
# Only substract so much points that player has 0 Points:
|
||||||
if self.kyu_points + hanchan.kyu_points < 0:
|
if self.kyu_points + hanchan.kyu_points < 0:
|
||||||
hanchan.player_comment = 'Spieler unterschreitet 0 Punkte.' \
|
|
||||||
'(Original {} Punkte)'.format(hanchan.kyu_points)
|
|
||||||
hanchan.kyu_points -= (self.kyu_points + hanchan.kyu_points)
|
hanchan.kyu_points -= (self.kyu_points + hanchan.kyu_points)
|
||||||
self.kyu_points += hanchan.kyu_points
|
self.kyu_points += hanchan.kyu_points
|
||||||
|
|
||||||
def update_rank(self):
|
|
||||||
# Update Dan ranking:
|
|
||||||
if self.dan or self.dan_points > 0:
|
|
||||||
if settings.DAN_ALLOW_DROP_DOWN:
|
|
||||||
self.dan = max((dan for min_points, dan in settings.DAN_RANKS
|
|
||||||
if self.dan_points > min_points))
|
|
||||||
else:
|
|
||||||
self.max_dan_points = max(self.max_dan_points, self.dan_points)
|
|
||||||
self.dan = max((dan for min_points, dan in settings.DAN_RANKS
|
|
||||||
if self.max_dan_points > min_points))
|
|
||||||
|
|
||||||
# jump from Kyu to Dan
|
# TODO: Merkwürdige Methode die zwar funktioniert aber nicht sehr
|
||||||
|
# aussagekräfig ist. Überarbeiten?
|
||||||
|
def update_rank(self):
|
||||||
|
if self.dan and self.dan_points < 0:
|
||||||
|
self.dan_points = 0
|
||||||
|
self.dan = 1
|
||||||
|
elif self.dan or self.dan_points > 0:
|
||||||
|
old_dan = self.dan
|
||||||
|
for min_points, dan_rank in settings.DAN_RANKS:
|
||||||
|
if self.dan_points > min_points:
|
||||||
|
self.dan = dan_rank
|
||||||
|
break
|
||||||
|
if old_dan is None or self.dan > old_dan:
|
||||||
|
self.wins_in_a_row = 0
|
||||||
|
elif self.kyu_points < 1:
|
||||||
|
self.kyu_points = 0
|
||||||
|
self.kyu = 10
|
||||||
elif self.kyu_points > 50:
|
elif self.kyu_points > 50:
|
||||||
self.dan = 1
|
self.dan = 1
|
||||||
|
self.kyu = 0
|
||||||
self.dan_points = 0
|
self.dan_points = 0
|
||||||
self.kyu = None
|
|
||||||
self.kyu_points = 0
|
self.kyu_points = 0
|
||||||
self.wins_in_a_row = 0
|
|
||||||
# update Kyu ranking_
|
|
||||||
else:
|
else:
|
||||||
self.kyu = min((kyu for min_points, kyu in settings.KYU_RANKS
|
for min_points, kyu_rank in settings.KYU_RANKS:
|
||||||
if self.kyu_points > min_points))
|
if self.kyu_points > min_points:
|
||||||
|
self.kyu = kyu_rank
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
{% extends "mahjong_ranking/page.html" %}
|
{% extends "mahjong_ranking/page.html" %}
|
||||||
{% load i18n thumbnail %}
|
{% load i18n thumbnail %}
|
||||||
|
|
||||||
{% block title %}{% trans 'Player List' %}{% endblock %}
|
{% block title %}{% trans 'Players list' %}{% endblock %}
|
||||||
{% block extra_head %}
|
{% block extra_head %}
|
||||||
<link rel="canonical" href="{% url 'kyudanranking-list' %}?page={{page_obj.number}}" />
|
<link rel="canonical" href="{% url 'kyudanranking-list' %}?page={{page_obj.number}}" />
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block teaser %}<h1>{% trans 'Player List' %}</h1>{% endblock %}
|
{% block teaser %}<h1>{% trans 'Players list' %}</h1>{% endblock %}
|
||||||
|
|
||||||
{% block redbox %}{% include 'mahjong_ranking/ladder_redbox.html' %}{% endblock %}
|
{% block redbox %}{% include 'mahjong_ranking/ladder_redbox.html' %}{% endblock %}
|
||||||
|
|
||||||
|
|||||||
@@ -50,12 +50,4 @@
|
|||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
{% if kyu_dan_ranking.legacy_date %}
|
|
||||||
<p><strong>Frühere Dan Punkte vom {{ kyu_dan_ranking.legacy_date|date }}:</strong> {{kyu_dan_ranking.legacy_dan_points }}</p>
|
|
||||||
{% endif %}
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block buttonbar %}
|
|
||||||
<a href="?download=xlsx" class="button"><span class="fa fa-table"></span> Download</a>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -40,7 +40,3 @@
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
</table>
|
</table>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block buttonbar %}
|
|
||||||
<a href="?download=xlsx" class="button"><span class="fa fa-table"></span> Download</a>
|
|
||||||
{% endblock %}
|
|
||||||
|
|||||||
@@ -48,7 +48,3 @@
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
</table>
|
</table>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block buttonbar %}
|
|
||||||
<a href="?download=xlsx" class="button"><span class="fa fa-table"></span> Download</a>
|
|
||||||
{% endblock %}
|
|
||||||
|
|||||||
@@ -72,8 +72,5 @@
|
|||||||
</form>
|
</form>
|
||||||
</td></tr></tfoot>
|
</td></tr></tfoot>
|
||||||
</table>
|
</table>
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block buttonbar %}
|
|
||||||
<a href="?download=xlsx" class="button"><span class="fa fa-table"></span> Download</a>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -7,12 +7,11 @@ from django.contrib import auth
|
|||||||
from django.contrib.auth.mixins import LoginRequiredMixin, \
|
from django.contrib.auth.mixins import LoginRequiredMixin, \
|
||||||
PermissionRequiredMixin
|
PermissionRequiredMixin
|
||||||
from django.contrib.messages.views import SuccessMessageMixin
|
from django.contrib.messages.views import SuccessMessageMixin
|
||||||
from django.urls import reverse
|
from django.core.urlresolvers import reverse
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
from django.views import generic
|
from django.views import generic
|
||||||
|
|
||||||
from events.mixins import EventDetailMixin
|
from events.mixins import EventDetailMixin
|
||||||
from kasu import xlsx
|
|
||||||
from . import forms, models
|
from . import forms, models
|
||||||
from .mixins import MahjongMixin
|
from .mixins import MahjongMixin
|
||||||
|
|
||||||
@@ -118,6 +117,9 @@ class EventRankingList(EventDetailMixin, generic.ListView):
|
|||||||
model = models.EventRanking
|
model = models.EventRanking
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class KyuDanRankingList(MahjongMixin, generic.ListView):
|
class KyuDanRankingList(MahjongMixin, generic.ListView):
|
||||||
"""List all Players with an Kyu or Dan score. """
|
"""List all Players with an Kyu or Dan score. """
|
||||||
default_order = '-score'
|
default_order = '-score'
|
||||||
@@ -131,6 +133,7 @@ class KyuDanRankingList(MahjongMixin, generic.ListView):
|
|||||||
]
|
]
|
||||||
return super(KyuDanRankingList, self).dispatch(request, *args, **kwargs)
|
return super(KyuDanRankingList, self).dispatch(request, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
queryset = models.KyuDanRanking.objects.filter(
|
queryset = models.KyuDanRanking.objects.filter(
|
||||||
hanchan_count__gt=0).order_by(*self.order_by)
|
hanchan_count__gt=0).order_by(*self.order_by)
|
||||||
@@ -157,6 +160,7 @@ class PlayerScore(LoginRequiredMixin, generic.ListView):
|
|||||||
|
|
||||||
def get(self, request, *args, **kwargs):
|
def get(self, request, *args, **kwargs):
|
||||||
user_model = auth.get_user_model()
|
user_model = auth.get_user_model()
|
||||||
|
username = kwargs.get('username')
|
||||||
try:
|
try:
|
||||||
self.user = user_model.objects.get(
|
self.user = user_model.objects.get(
|
||||||
username=self.kwargs.get('username'))
|
username=self.kwargs.get('username'))
|
||||||
@@ -164,9 +168,6 @@ class PlayerScore(LoginRequiredMixin, generic.ListView):
|
|||||||
raise django.http.Http404(
|
raise django.http.Http404(
|
||||||
_("No user found matching the name {}").format(
|
_("No user found matching the name {}").format(
|
||||||
self.kwargs.get('username')))
|
self.kwargs.get('username')))
|
||||||
print(request.GET)
|
|
||||||
if request.GET.get('download') == 'xlsx':
|
|
||||||
return self.get_xlsx(request, *args, **kwargs)
|
|
||||||
return super(PlayerScore, self).get(request, *args, **kwargs)
|
return super(PlayerScore, self).get(request, *args, **kwargs)
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
@@ -185,76 +186,20 @@ class PlayerScore(LoginRequiredMixin, generic.ListView):
|
|||||||
context['ladder_ranking'] = models.SeasonRanking(user=self.user)
|
context['ladder_ranking'] = models.SeasonRanking(user=self.user)
|
||||||
return context
|
return context
|
||||||
|
|
||||||
def get_xlsx(self, request, *args, **kwargs):
|
|
||||||
self.object_list = self.get_queryset()
|
|
||||||
response = django.http.HttpResponse(
|
|
||||||
content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
|
|
||||||
response['Content-Disposition'] = 'attachment; ' \
|
|
||||||
'filename="{xlsx_filename}"'.format(
|
|
||||||
xlsx_filename=self.xlsx_filename)
|
|
||||||
xlxs_workbook = xlsx.Workbook()
|
|
||||||
xlxs_workbook.generate_sheet(
|
|
||||||
title=self.xlsx_filename.split('.')[0],
|
|
||||||
columns_settings=self.xlsx_columns,
|
|
||||||
object_list=self.object_list
|
|
||||||
)
|
|
||||||
xlxs_workbook.save(response)
|
|
||||||
return response
|
|
||||||
|
|
||||||
|
|
||||||
class PlayerDanScore(PlayerScore):
|
class PlayerDanScore(PlayerScore):
|
||||||
template_name = 'mahjong_ranking/player_dan_score.html'
|
template_name = 'mahjong_ranking/player_dan_score.html'
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
self.kyu_dan_ranking = models.KyuDanRanking.objects.get(user=self.user)
|
kyu_dan_ranking = models.KyuDanRanking.objects.get(user=self.user)
|
||||||
return models.Hanchan.objects.dan_hanchans(
|
return models.Hanchan.objects.dan_hanchans(user=self.user,
|
||||||
user=self.user,
|
since=kyu_dan_ranking.legacy_date)
|
||||||
since=self.kyu_dan_ranking.legacy_date)
|
|
||||||
|
|
||||||
@property
|
|
||||||
def xlsx_columns(self):
|
|
||||||
return (
|
|
||||||
{'col': 'A', 'title': 'Beginn', 'attr': 'start',
|
|
||||||
'style': 'Date Time',
|
|
||||||
'width': 14, 'footer': self.kyu_dan_ranking.legacy_date},
|
|
||||||
{'col': 'B', 'title': 'Termin', 'attr': 'event.name',
|
|
||||||
'style': 'Content', 'width': 16},
|
|
||||||
{'col': 'C', 'title': 'Platzierung', 'attr': 'placement',
|
|
||||||
'style': 'Integer', 'width': 11},
|
|
||||||
{'col': 'D', 'title': 'Spieler 1', 'attr': 'player1.username',
|
|
||||||
'style': 'Content', 'width': 16},
|
|
||||||
{'col': 'E', 'title': 'Punkte', 'attr': 'player1_game_score',
|
|
||||||
'style': 'Integer', 'width': 8},
|
|
||||||
{'col': 'F', 'title': 'Spieler 2', 'attr': 'player2.username',
|
|
||||||
'style': 'Content', 'width': 16},
|
|
||||||
{'col': 'G', 'title': 'Punkte', 'attr': 'player2_game_score',
|
|
||||||
'style': 'Integer', 'width': 8},
|
|
||||||
{'col': 'H', 'title': 'Spieler 3', 'attr': 'player3.username',
|
|
||||||
'style': 'Content', 'width': 16},
|
|
||||||
{'col': 'I', 'title': 'Punkte', 'attr': 'player3_game_score',
|
|
||||||
'style': 'Integer', 'width': 8},
|
|
||||||
{'col': 'J', 'title': 'Spieler 4', 'attr': 'player4.username',
|
|
||||||
'style': 'Content', 'width': 16},
|
|
||||||
{'col': 'K', 'title': 'Punkte', 'attr': 'player4_game_score',
|
|
||||||
'style': 'Integer', 'width': 8},
|
|
||||||
{'col': 'L', 'title': 'Dan Punkte', 'attr': 'dan_points',
|
|
||||||
'style': 'Integer', 'width': 12,
|
|
||||||
'footer': self.kyu_dan_ranking.legacy_dan_points},
|
|
||||||
{'col': 'M', 'title': 'Anmerkung', 'attr': 'player_comment',
|
|
||||||
'style': 'Content', 'width': 20, 'footer': 'Legacy Dan Punkte'},
|
|
||||||
)
|
|
||||||
|
|
||||||
@property
|
|
||||||
def xlsx_filename(self):
|
|
||||||
return "{username}_dan_score.xlsx".format(username=self.user.username)
|
|
||||||
|
|
||||||
|
|
||||||
class PlayerInvalidScore(PlayerScore):
|
class PlayerInvalidScore(PlayerScore):
|
||||||
template_name = 'mahjong_ranking/player_invalid_score.html'
|
template_name = 'mahjong_ranking/player_invalid_score.html'
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
self.xlsx_filename = "{username}_invalid_score.xlsx".format(
|
|
||||||
username=self.user.username)
|
|
||||||
return models.Hanchan.objects.unconfirmed(user=self.user)
|
return models.Hanchan.objects.unconfirmed(user=self.user)
|
||||||
|
|
||||||
|
|
||||||
@@ -262,47 +207,7 @@ class PlayerKyuScore(PlayerScore):
|
|||||||
template_name = 'mahjong_ranking/player_kyu_score.html'
|
template_name = 'mahjong_ranking/player_kyu_score.html'
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
self.kyu_dan_ranking = models.KyuDanRanking.objects.get(user=self.user)
|
return models.Hanchan.objects.kyu_hanchans(self.user)
|
||||||
return models.Hanchan.objects.kyu_hanchans(
|
|
||||||
user=self.user,
|
|
||||||
since=self.kyu_dan_ranking.legacy_date)
|
|
||||||
|
|
||||||
@property
|
|
||||||
def xlsx_columns(self):
|
|
||||||
return (
|
|
||||||
{'col': 'A', 'title': 'Beginn', 'attr': 'start',
|
|
||||||
'style': 'Date Time',
|
|
||||||
'width': 14, 'footer': self.kyu_dan_ranking.legacy_date},
|
|
||||||
{'col': 'B', 'title': 'Termin', 'attr': 'event.name',
|
|
||||||
'style': 'Content', 'width': 16},
|
|
||||||
{'col': 'C', 'title': 'Platzierung', 'attr': 'placement',
|
|
||||||
'style': 'Integer', 'width': 11},
|
|
||||||
{'col': 'D', 'title': 'Spieler 1', 'attr': 'player1.username',
|
|
||||||
'style': 'Content', 'width': 16},
|
|
||||||
{'col': 'E', 'title': 'Punkte', 'attr': 'player1_game_score',
|
|
||||||
'style': 'Integer', 'width': 8},
|
|
||||||
{'col': 'F', 'title': 'Spieler 2', 'attr': 'player2.username',
|
|
||||||
'style': 'Content', 'width': 16},
|
|
||||||
{'col': 'G', 'title': 'Punkte', 'attr': 'player2_game_score',
|
|
||||||
'style': 'Integer', 'width': 8},
|
|
||||||
{'col': 'H', 'title': 'Spieler 3', 'attr': 'player3.username',
|
|
||||||
'style': 'Content', 'width': 16},
|
|
||||||
{'col': 'I', 'title': 'Punkte', 'attr': 'player3_game_score',
|
|
||||||
'style': 'Integer', 'width': 8},
|
|
||||||
{'col': 'J', 'title': 'Spieler 4', 'attr': 'player4.username',
|
|
||||||
'style': 'Content', 'width': 16},
|
|
||||||
{'col': 'K', 'title': 'Punkte', 'attr': 'player4_game_score',
|
|
||||||
'style': 'Integer', 'width': 8},
|
|
||||||
{'col': 'L', 'title': 'Kyū Punkte', 'attr': 'kyu_points',
|
|
||||||
'style': 'Integer', 'width': 12,
|
|
||||||
'footer': self.kyu_dan_ranking.legacy_kyu_points},
|
|
||||||
{'col': 'M', 'title': 'Anmerkung', 'attr': 'comment',
|
|
||||||
'style': 'Content', 'width': 24, 'footer': 'Legacy Kyū Punkte'},
|
|
||||||
)
|
|
||||||
|
|
||||||
@property
|
|
||||||
def xlsx_filename(self):
|
|
||||||
return "{username}_kyu_score.xlsx".format(username=self.user.username)
|
|
||||||
|
|
||||||
|
|
||||||
class PlayerLadderScore(PlayerScore):
|
class PlayerLadderScore(PlayerScore):
|
||||||
@@ -324,39 +229,3 @@ class PlayerLadderScore(PlayerScore):
|
|||||||
season=self.season
|
season=self.season
|
||||||
)
|
)
|
||||||
return hanchan_list
|
return hanchan_list
|
||||||
|
|
||||||
@property
|
|
||||||
def xlsx_columns(self):
|
|
||||||
return (
|
|
||||||
{'col': 'A', 'title': 'Beginn', 'attr': 'start',
|
|
||||||
'style': 'Date Time', 'width': 14},
|
|
||||||
{'col': 'B', 'title': 'Termin', 'attr': 'event.name',
|
|
||||||
'style': 'Content', 'width': 16},
|
|
||||||
{'col': 'C', 'title': 'Platzierung', 'attr': 'placement',
|
|
||||||
'style': 'Integer', 'width': 11},
|
|
||||||
{'col': 'D', 'title': 'Spieler 1', 'attr': 'player1.username',
|
|
||||||
'style': 'Content', 'width': 16},
|
|
||||||
{'col': 'E', 'title': 'Punkte', 'attr': 'player1_game_score',
|
|
||||||
'style': 'Integer', 'width': 8},
|
|
||||||
{'col': 'F', 'title': 'Spieler 2', 'attr': 'player2.username',
|
|
||||||
'style': 'Content', 'width': 16},
|
|
||||||
{'col': 'G', 'title': 'Punkte', 'attr': 'player2_game_score',
|
|
||||||
'style': 'Integer', 'width': 8},
|
|
||||||
{'col': 'H', 'title': 'Spieler 3', 'attr': 'player3.username',
|
|
||||||
'style': 'Content', 'width': 16},
|
|
||||||
{'col': 'I', 'title': 'Punkte', 'attr': 'player3_game_score',
|
|
||||||
'style': 'Integer', 'width': 8},
|
|
||||||
{'col': 'J', 'title': 'Spieler 4', 'attr': 'player4.username',
|
|
||||||
'style': 'Content', 'width': 16},
|
|
||||||
{'col': 'K', 'title': 'Punkte', 'attr': 'player4_game_score',
|
|
||||||
'style': 'Integer', 'width': 8},
|
|
||||||
{'col': 'L', 'title': 'Punkte', 'attr': 'game_score',
|
|
||||||
'style': 'Integer', 'width': 8},
|
|
||||||
)
|
|
||||||
|
|
||||||
@property
|
|
||||||
def xlsx_filename(self):
|
|
||||||
return "{username}_ladder_score_{season}.xlsx".format(
|
|
||||||
username=self.user.username,
|
|
||||||
season=self.season
|
|
||||||
)
|
|
||||||
|
|||||||
Binary file not shown.
@@ -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: 2017-06-19 22:46+0200\n"
|
"POT-Creation-Date: 2018-04-27 09:49+0200\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:19
|
#: admin.py:24
|
||||||
msgid "Recalculate"
|
msgid "Recalculate"
|
||||||
msgstr "Neuberechnen"
|
msgstr "Neuberechnen"
|
||||||
|
|
||||||
#: maistar_ranking/forms.py:33
|
#: 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:20
|
#: models.py:20
|
||||||
msgid "Comment"
|
msgid "Comment"
|
||||||
msgstr "Kommentar"
|
msgstr "Kommentar"
|
||||||
|
|
||||||
#: maistar_ranking/models.py:22
|
#: models.py:22
|
||||||
msgid "Player 1"
|
msgid "Player 1"
|
||||||
msgstr "Spieler 1"
|
msgstr "Spieler 1"
|
||||||
|
|
||||||
#: maistar_ranking/models.py:24 maistar_ranking/models.py:30
|
#: models.py:24 models.py:30 models.py:36 models.py:42 models.py:48
|
||||||
#: maistar_ranking/models.py:36 maistar_ranking/models.py:42
|
#: models.py:54 templates/maistar_ranking/ranking_list.html:19
|
||||||
#: maistar_ranking/models.py:48 maistar_ranking/models.py:54
|
|
||||||
#: maistar_ranking/templates/maistar_ranking/ranking_list.html:19
|
|
||||||
msgid "Score"
|
msgid "Score"
|
||||||
msgstr "Punkte"
|
msgstr "Punkte"
|
||||||
|
|
||||||
#: maistar_ranking/models.py:28
|
#: models.py:28
|
||||||
msgid "Player 2"
|
msgid "Player 2"
|
||||||
msgstr "Spieler 2"
|
msgstr "Spieler 2"
|
||||||
|
|
||||||
#: maistar_ranking/models.py:34
|
#: models.py:34
|
||||||
msgid "Player 3"
|
msgid "Player 3"
|
||||||
msgstr "Spieler 3"
|
msgstr "Spieler 3"
|
||||||
|
|
||||||
#: maistar_ranking/models.py:40
|
#: models.py:40
|
||||||
msgid "Player 4"
|
msgid "Player 4"
|
||||||
msgstr "Spieler 4"
|
msgstr "Spieler 4"
|
||||||
|
|
||||||
#: maistar_ranking/models.py:46
|
#: models.py:46
|
||||||
msgid "Player 5"
|
msgid "Player 5"
|
||||||
msgstr "Spieler 5"
|
msgstr "Spieler 5"
|
||||||
|
|
||||||
#: maistar_ranking/models.py:52
|
#: models.py:52
|
||||||
msgid "Player 6"
|
msgid "Player 6"
|
||||||
msgstr "Spieler 6"
|
msgstr "Spieler 6"
|
||||||
|
|
||||||
#: maistar_ranking/models.py:58
|
#: models.py:58
|
||||||
msgid "Has been confirmed"
|
msgid "Has been confirmed"
|
||||||
msgstr "Wurde bestätigt"
|
msgstr "Wurde bestätigt"
|
||||||
|
|
||||||
#: maistar_ranking/models.py:60
|
#: models.py:60
|
||||||
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:63 maistar_ranking/models.py:148
|
#: models.py:63 models.py:147 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:69
|
#: models.py:74
|
||||||
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"
|
||||||
|
|
||||||
|
|||||||
@@ -37,19 +37,19 @@ class Migration(migrations.Migration):
|
|||||||
('season', models.PositiveSmallIntegerField(
|
('season', models.PositiveSmallIntegerField(
|
||||||
verbose_name='Saison', editable=False, db_index=True)),
|
verbose_name='Saison', editable=False, db_index=True)),
|
||||||
('event', models.ForeignKey(
|
('event', models.ForeignKey(
|
||||||
related_name='maistargame_set', to='events.Event', on_delete=models.CASCADE)),
|
related_name='maistargame_set', to='events.Event')),
|
||||||
('player1', models.ForeignKey(related_name='+',
|
('player1', models.ForeignKey(related_name='+',
|
||||||
verbose_name='Spieler 1', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),
|
verbose_name='Spieler 1', to=settings.AUTH_USER_MODEL)),
|
||||||
('player2', models.ForeignKey(related_name='+',
|
('player2', models.ForeignKey(related_name='+',
|
||||||
verbose_name='Spieler 2', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),
|
verbose_name='Spieler 2', to=settings.AUTH_USER_MODEL)),
|
||||||
('player3', models.ForeignKey(related_name='+',
|
('player3', models.ForeignKey(related_name='+',
|
||||||
verbose_name='Spieler 3', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),
|
verbose_name='Spieler 3', to=settings.AUTH_USER_MODEL)),
|
||||||
('player4', models.ForeignKey(related_name='+',
|
('player4', models.ForeignKey(related_name='+',
|
||||||
verbose_name='Spieler 4', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),
|
verbose_name='Spieler 4', to=settings.AUTH_USER_MODEL)),
|
||||||
('player5', models.ForeignKey(related_name='+',
|
('player5', models.ForeignKey(related_name='+',
|
||||||
verbose_name='Spieler 5', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),
|
verbose_name='Spieler 5', to=settings.AUTH_USER_MODEL)),
|
||||||
('player6', models.ForeignKey(related_name='+',
|
('player6', models.ForeignKey(related_name='+',
|
||||||
verbose_name='Spieler 6', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),
|
verbose_name='Spieler 6', to=settings.AUTH_USER_MODEL)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
@@ -65,7 +65,7 @@ class Migration(migrations.Migration):
|
|||||||
('games_count', models.PositiveSmallIntegerField(default=0)),
|
('games_count', models.PositiveSmallIntegerField(default=0)),
|
||||||
('games_good', models.PositiveSmallIntegerField(default=0)),
|
('games_good', models.PositiveSmallIntegerField(default=0)),
|
||||||
('games_won', models.PositiveSmallIntegerField(default=0)),
|
('games_won', models.PositiveSmallIntegerField(default=0)),
|
||||||
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),
|
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)),
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'ordering': ('-season', 'placement', 'avg_placement', '-avg_score'),
|
'ordering': ('-season', 'placement', 'avg_placement', '-avg_score'),
|
||||||
|
|||||||
@@ -1,52 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Generated by Django 1.11.8 on 2017-12-14 11:15
|
|
||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
from django.conf import settings
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('maistar_ranking', '0006_auto_20171115_0653'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='game',
|
|
||||||
name='player1',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Spieler 1'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='game',
|
|
||||||
name='player2',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Spieler 2'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='game',
|
|
||||||
name='player3',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Spieler 3'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='game',
|
|
||||||
name='player4',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Spieler 4'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='game',
|
|
||||||
name='player5',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Spieler 5'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='game',
|
|
||||||
name='player6',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Spieler 6'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='ranking',
|
|
||||||
name='user',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@@ -2,11 +2,11 @@
|
|||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
from django.core.urlresolvers import reverse
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.db.models.signals import post_delete, post_save
|
from django.db.models.signals import post_delete, post_save
|
||||||
from django.dispatch import receiver
|
|
||||||
from django.urls import reverse
|
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
|
from django.dispatch import receiver
|
||||||
|
|
||||||
from events.models import Event
|
from events.models import Event
|
||||||
from . import settings, managers
|
from . import settings, managers
|
||||||
@@ -16,47 +16,40 @@ class Game(models.Model):
|
|||||||
"""to record a complete game with 6 different players."""
|
"""to record a complete game with 6 different players."""
|
||||||
|
|
||||||
_player_list = list()
|
_player_list = list()
|
||||||
event = models.ForeignKey(Event, on_delete=models.CASCADE,
|
event = models.ForeignKey(Event, related_name='maistargame_set')
|
||||||
related_name='maistargame_set')
|
|
||||||
comment = models.TextField(_('Comment'), blank=True)
|
comment = models.TextField(_('Comment'), blank=True)
|
||||||
player1 = models.ForeignKey(
|
player1 = models.ForeignKey(
|
||||||
settings.AUTH_USER_MODEL, on_delete=models.PROTECT,
|
settings.AUTH_USER_MODEL, verbose_name=_("Player 1"), related_name='+'
|
||||||
verbose_name=_("Player 1"), related_name='+'
|
|
||||||
)
|
)
|
||||||
player1_score = models.SmallIntegerField(_("Score"))
|
player1_score = models.SmallIntegerField(_("Score"))
|
||||||
player1_placement = models.PositiveSmallIntegerField(editable=False)
|
player1_placement = models.PositiveSmallIntegerField(editable=False)
|
||||||
|
|
||||||
player2 = models.ForeignKey(
|
player2 = models.ForeignKey(
|
||||||
settings.AUTH_USER_MODEL, on_delete=models.PROTECT,
|
settings.AUTH_USER_MODEL, verbose_name=_("Player 2"), related_name='+'
|
||||||
verbose_name=_("Player 2"), related_name='+'
|
|
||||||
)
|
)
|
||||||
player2_score = models.SmallIntegerField(_("Score"))
|
player2_score = models.SmallIntegerField(_("Score"))
|
||||||
player2_placement = models.PositiveSmallIntegerField(editable=False)
|
player2_placement = models.PositiveSmallIntegerField(editable=False)
|
||||||
|
|
||||||
player3 = models.ForeignKey(
|
player3 = models.ForeignKey(
|
||||||
settings.AUTH_USER_MODEL, on_delete=models.PROTECT,
|
settings.AUTH_USER_MODEL, verbose_name=_("Player 3"), related_name='+'
|
||||||
verbose_name=_("Player 3"), related_name='+'
|
|
||||||
)
|
)
|
||||||
player3_score = models.SmallIntegerField(_("Score"))
|
player3_score = models.SmallIntegerField(_("Score"))
|
||||||
player3_placement = models.PositiveSmallIntegerField(editable=False)
|
player3_placement = models.PositiveSmallIntegerField(editable=False)
|
||||||
|
|
||||||
player4 = models.ForeignKey(
|
player4 = models.ForeignKey(
|
||||||
settings.AUTH_USER_MODEL, on_delete=models.PROTECT,
|
settings.AUTH_USER_MODEL, verbose_name=_("Player 4"), related_name='+'
|
||||||
verbose_name=_("Player 4"), related_name='+'
|
|
||||||
)
|
)
|
||||||
player4_score = models.SmallIntegerField(_("Score"))
|
player4_score = models.SmallIntegerField(_("Score"))
|
||||||
player4_placement = models.PositiveSmallIntegerField(editable=False)
|
player4_placement = models.PositiveSmallIntegerField(editable=False)
|
||||||
|
|
||||||
player5 = models.ForeignKey(
|
player5 = models.ForeignKey(
|
||||||
settings.AUTH_USER_MODEL, on_delete=models.PROTECT,
|
settings.AUTH_USER_MODEL, verbose_name=_("Player 5"), related_name='+'
|
||||||
verbose_name=_("Player 5"), related_name='+'
|
|
||||||
)
|
)
|
||||||
player5_score = models.SmallIntegerField(_("Score"))
|
player5_score = models.SmallIntegerField(_("Score"))
|
||||||
player5_placement = models.PositiveSmallIntegerField(editable=False)
|
player5_placement = models.PositiveSmallIntegerField(editable=False)
|
||||||
|
|
||||||
player6 = models.ForeignKey(
|
player6 = models.ForeignKey(
|
||||||
settings.AUTH_USER_MODEL, on_delete=models.PROTECT,
|
settings.AUTH_USER_MODEL, verbose_name=_("Player 6"), related_name='+'
|
||||||
verbose_name=_("Player 6"), related_name='+'
|
|
||||||
)
|
)
|
||||||
player6_score = models.SmallIntegerField(_("Score"))
|
player6_score = models.SmallIntegerField(_("Score"))
|
||||||
player6_placement = models.PositiveSmallIntegerField(editable=False)
|
player6_placement = models.PositiveSmallIntegerField(editable=False)
|
||||||
@@ -76,6 +69,7 @@ class Game(models.Model):
|
|||||||
"""Display rankings by placement, best players first."""
|
"""Display rankings by placement, best players first."""
|
||||||
ordering = ('-event__start', '-id')
|
ordering = ('-event__start', '-id')
|
||||||
|
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return _("Mai-Star Game with {0} from {1:%Y-%m-%d}").format(
|
return _("Mai-Star Game with {0} from {1:%Y-%m-%d}").format(
|
||||||
self.player_names, self.event.start
|
self.player_names, self.event.start
|
||||||
@@ -149,7 +143,7 @@ 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)
|
||||||
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)
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
from datetime import date
|
from datetime import date
|
||||||
|
|
||||||
from django.contrib import auth
|
from django.contrib import auth
|
||||||
from django.urls import reverse
|
from django.core.urlresolvers import reverse
|
||||||
from django.shortcuts import get_object_or_404
|
from django.shortcuts import get_object_or_404
|
||||||
from django.views import generic
|
from django.views import generic
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@@ -7,196 +7,193 @@ 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: 2017-06-19 22:46+0200\n"
|
"POT-Creation-Date: 2018-04-27 09:49+0200\n"
|
||||||
"PO-Revision-Date: 2016-09-28 00:24+0200\n"
|
"PO-Revision-Date: 2018-04-27 10:30+0105\n"
|
||||||
"Last-Translator: Christian Berg <xeniac@posteo.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"
|
||||||
"Language: de\n"
|
"Language: de\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"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-Translated-Using: django-rosetta 0.7.2\n"
|
|
||||||
"X-Generator: Poedit 1.8.9\n"
|
"X-Generator: Poedit 1.8.9\n"
|
||||||
|
"X-Translated-Using: django-rosetta 0.7.14\n"
|
||||||
|
|
||||||
#: membership/admin.py:22
|
#: __init__.py:11
|
||||||
|
msgid "Male"
|
||||||
|
msgstr "Männlich"
|
||||||
|
|
||||||
|
#: __init__.py:12
|
||||||
|
msgid "Female"
|
||||||
|
msgstr "Weiblich"
|
||||||
|
|
||||||
|
#: admin.py:22
|
||||||
msgid "Activate selected User"
|
msgid "Activate selected User"
|
||||||
msgstr "Ausgewählte Benutzer freischalten"
|
msgstr "Ausgewählte Benutzer freischalten"
|
||||||
|
|
||||||
#: membership/admin.py:31
|
#: admin.py:38
|
||||||
msgid "Cleanup selected Activation Requests"
|
msgid "Cleanup selected Activation Requests"
|
||||||
msgstr "Ausgewählte Aktivierungsanfragen bereinigen"
|
msgstr "Ausgewählte Aktivierungsanfragen bereinigen"
|
||||||
|
|
||||||
#: membership/admin.py:37
|
#: admin.py:47
|
||||||
msgid "Group"
|
msgid "Group"
|
||||||
msgstr "Gruppe"
|
msgstr "Gruppe"
|
||||||
|
|
||||||
#: membership/admin.py:38
|
#: admin.py:48
|
||||||
msgid "Groups"
|
msgid "Groups"
|
||||||
msgstr "Gruppen"
|
msgstr "Gruppen"
|
||||||
|
|
||||||
#: membership/admin.py:59 membership/models.py:164 membership/models.py:215
|
#: admin.py:72 models.py:162 models.py:215
|
||||||
#: membership/templates/membership/register_form.html:32
|
#: templates/membership/register_form.html:32
|
||||||
msgid "Membership"
|
msgid "Membership"
|
||||||
msgstr "Mitgliedschaft"
|
msgstr "Mitgliedschaft"
|
||||||
|
|
||||||
#: membership/admin.py:64
|
#: admin.py:77
|
||||||
msgid "Permissions"
|
msgid "Permissions"
|
||||||
msgstr "Berechtigung"
|
msgstr "Berechtigung"
|
||||||
|
|
||||||
#: membership/admin.py:66
|
#: admin.py:79
|
||||||
msgid "Important dates"
|
msgid "Important dates"
|
||||||
msgstr "Wichtige Daten"
|
msgstr "Wichtige Daten"
|
||||||
|
|
||||||
#: membership/forms.py:23
|
#: forms.py:23
|
||||||
msgid "birthday"
|
msgid "birthday"
|
||||||
msgstr "Geburtstag"
|
msgstr "Geburtstag"
|
||||||
|
|
||||||
#: membership/forms.py:25
|
#: 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:27
|
#: forms.py:27
|
||||||
msgid "Email"
|
msgid "Email"
|
||||||
msgstr "E-Mail"
|
msgstr "E-Mail"
|
||||||
|
|
||||||
#: membership/forms.py:39 membership/forms.py:46 membership/forms.py:53
|
#: forms.py:42 forms.py:50 forms.py:58
|
||||||
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:59
|
#: forms.py:65
|
||||||
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:72
|
#: forms.py:78
|
||||||
msgid "password"
|
msgid "password"
|
||||||
msgstr "Passwort"
|
msgstr "Passwort"
|
||||||
|
|
||||||
#: membership/forms.py:74
|
#: forms.py:80
|
||||||
msgid "password (again)"
|
msgid "password (again)"
|
||||||
msgstr "Passwort (wiederholen)"
|
msgstr "Passwort (wiederholen)"
|
||||||
|
|
||||||
#: membership/forms.py:97
|
#: forms.py:102
|
||||||
msgid "This username is already taken. Please choose another."
|
msgid "This username is already taken. Please choose another."
|
||||||
msgstr "Diesen Benutzername ist schon vergeben. Bitte einen anderen auswählen."
|
msgstr ""
|
||||||
|
"Diesen Benutzername ist schon vergeben. Bitte einen anderen auswählen."
|
||||||
|
|
||||||
#: membership/forms.py:106
|
#: forms.py:109
|
||||||
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:115
|
#: forms.py:119
|
||||||
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:20
|
#: models.py:83
|
||||||
msgid "Male"
|
|
||||||
msgstr "Männlich"
|
|
||||||
|
|
||||||
#: membership/models.py:21
|
|
||||||
msgid "Female"
|
|
||||||
msgstr "Weiblich"
|
|
||||||
|
|
||||||
#: membership/models.py:90
|
|
||||||
msgid "user"
|
msgid "user"
|
||||||
msgstr "Benutzer"
|
msgstr "Benutzer"
|
||||||
|
|
||||||
#: membership/models.py:92
|
#: models.py:85
|
||||||
msgid "activation key"
|
msgid "activation key"
|
||||||
msgstr "Aktivierungsschlüssel"
|
msgstr "Aktivierungsschlüssel"
|
||||||
|
|
||||||
#: membership/models.py:96
|
#: models.py:89
|
||||||
msgid "pending activation"
|
msgid "pending activation"
|
||||||
msgstr "Ausstehende Aktivierung"
|
msgstr "Ausstehende Aktivierung"
|
||||||
|
|
||||||
#: membership/models.py:97
|
#: models.py:90
|
||||||
msgid "pending activations"
|
msgid "pending activations"
|
||||||
msgstr "Wartende Aktivierungen"
|
msgstr "Wartende Aktivierungen"
|
||||||
|
|
||||||
#: membership/models.py:100
|
#: models.py:93
|
||||||
#, 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:147
|
#: models.py:148
|
||||||
msgid "Gender"
|
msgid "Gender"
|
||||||
msgstr "Geschlecht"
|
msgstr "Geschlecht"
|
||||||
|
|
||||||
#: membership/models.py:166
|
#: models.py:164
|
||||||
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:170
|
#: models.py:168
|
||||||
msgid "Birthday Date"
|
msgid "Birthday Date"
|
||||||
msgstr "Geburtstag"
|
msgstr "Geburtstag"
|
||||||
|
|
||||||
#: membership/models.py:174
|
#: models.py:172
|
||||||
msgid "Telephone"
|
msgid "Telephone"
|
||||||
msgstr "Telefon"
|
msgstr "Telefon"
|
||||||
|
|
||||||
#: membership/models.py:180
|
#: models.py:178
|
||||||
msgid "Address"
|
msgid "Address"
|
||||||
msgstr "Adresse"
|
msgstr "Adresse"
|
||||||
|
|
||||||
#: membership/models.py:186
|
#: models.py:184
|
||||||
msgid "Postcode"
|
msgid "Postcode"
|
||||||
msgstr "Postleitzahl"
|
msgstr "Postleitzahl"
|
||||||
|
|
||||||
#: membership/models.py:191
|
#: models.py:189
|
||||||
msgid "Town/City"
|
msgid "Town/City"
|
||||||
msgstr "Ort"
|
msgstr "Ort"
|
||||||
|
|
||||||
#: membership/models.py:199
|
#: models.py:197
|
||||||
msgid "Paid until"
|
msgid "Paid until"
|
||||||
msgstr "Bezahlt bis"
|
msgstr "Bezahlt bis"
|
||||||
|
|
||||||
#: membership/models.py:205
|
#: models.py:203
|
||||||
msgid "Confirmed"
|
msgid "Confirmed"
|
||||||
msgstr "Bestätigt"
|
msgstr "Bestätigt"
|
||||||
|
|
||||||
#: membership/models.py:207
|
#: models.py:205
|
||||||
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:216
|
#: models.py:216
|
||||||
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 "
|
"Jemand (hoffentlich du selbst) möchte mit dieser E-Mail Adresse einen neuen Benutzer Account für %(site.domain)s anlegen.\n"
|
||||||
"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:"
|
||||||
"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 "
|
"If you do not want to open an account on %(site.domain)s, please ignore this email.\n"
|
||||||
"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-"
|
"Wenn du keinen Zugang für %(site.domain)s eröffnen willst, ignoriere diese E-Mail bitte.\n"
|
||||||
"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"
|
||||||
@@ -205,216 +202,210 @@ 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:6
|
#: templates/membership/membership_detail.html:6
|
||||||
msgid "profile for"
|
msgid "profile for"
|
||||||
msgstr "Profil für"
|
msgstr "Profil für"
|
||||||
|
|
||||||
#: membership/templates/membership/membership_detail.html:10
|
#: templates/membership/membership_detail.html:10
|
||||||
msgid "Ladder Hanchans"
|
msgid "Ladder Hanchans"
|
||||||
msgstr "Ladder Hanchans"
|
msgstr "Ladder Hanchans"
|
||||||
|
|
||||||
#: membership/templates/membership/membership_detail.html:11
|
#: templates/membership/membership_detail.html:11
|
||||||
msgid "Kyu Hanchans"
|
msgid "Kyu Hanchans"
|
||||||
msgstr "Kyū Hanchans"
|
msgstr "Kyū Hanchans"
|
||||||
|
|
||||||
#: membership/templates/membership/membership_detail.html:12
|
#: templates/membership/membership_detail.html:12
|
||||||
msgid "Dan Hanchans"
|
msgid "Dan Hanchans"
|
||||||
msgstr "Dan Hanchans"
|
msgstr "Dan Hanchans"
|
||||||
|
|
||||||
#: membership/templates/membership/membership_detail.html:13
|
#: templates/membership/membership_detail.html:13
|
||||||
msgid "Invalid Hanchans"
|
msgid "Invalid Hanchans"
|
||||||
msgstr "Ungültige Hanchans"
|
msgstr "Ungültige Hanchans"
|
||||||
|
|
||||||
#: membership/templates/membership/membership_detail.html:14
|
#: templates/membership/membership_detail.html:14
|
||||||
msgid "Mai-Star Games"
|
msgid "Mai-Star Games"
|
||||||
msgstr "Mai-Star Spiele"
|
msgstr "Mai-Star Spiele"
|
||||||
|
|
||||||
#: membership/templates/membership/membership_detail.html:20
|
#: templates/membership/membership_detail.html:20
|
||||||
msgid "Profile Image"
|
msgid "Profile Image"
|
||||||
msgstr "Profilbild"
|
msgstr "Profilbild"
|
||||||
|
|
||||||
#: membership/templates/membership/membership_detail.html:28
|
#: templates/membership/membership_detail.html:28
|
||||||
msgid "Member Since"
|
msgid "Member Since"
|
||||||
msgstr "Mitglied seit"
|
msgstr "Mitglied seit"
|
||||||
|
|
||||||
#: membership/templates/membership/membership_detail.html:29
|
#: templates/membership/membership_detail.html:29
|
||||||
msgid "Last Login"
|
msgid "Last Login"
|
||||||
msgstr "Letzte Anmeldung"
|
msgstr "Letzte Anmeldung"
|
||||||
|
|
||||||
#: membership/templates/membership/membership_detail.html:38
|
#: templates/membership/membership_detail.html:38
|
||||||
#: membership/templates/membership/membership_detail.html:40
|
#: templates/membership/membership_detail.html:40
|
||||||
msgid "Points"
|
msgid "Points"
|
||||||
msgstr "Punkte"
|
msgstr "Punkte"
|
||||||
|
|
||||||
#: membership/templates/membership/membership_detail.html:42
|
#: templates/membership/membership_detail.html:42
|
||||||
msgid "Games Total"
|
msgid "Games Total"
|
||||||
msgstr "Spiele gesamt"
|
msgstr "Spiele gesamt"
|
||||||
|
|
||||||
#: membership/templates/membership/membership_detail.html:43
|
#: templates/membership/membership_detail.html:43
|
||||||
#: membership/templates/membership/membership_detail.html:45
|
#: templates/membership/membership_detail.html:45
|
||||||
msgid "Won"
|
msgid "Won"
|
||||||
msgstr "Gewonnen"
|
msgstr "Gewonnen"
|
||||||
|
|
||||||
#: membership/templates/membership/membership_detail.html:43
|
#: templates/membership/membership_detail.html:43
|
||||||
#: membership/templates/membership/membership_detail.html:45
|
#: templates/membership/membership_detail.html:45
|
||||||
msgid "Good"
|
msgid "Good"
|
||||||
msgstr "Gut"
|
msgstr "Gut"
|
||||||
|
|
||||||
#: membership/templates/membership/membership_detail.html:45
|
#: templates/membership/membership_detail.html:45
|
||||||
msgid "Current Season"
|
msgid "Current Season"
|
||||||
msgstr "Aktuelle Saison"
|
msgstr "Aktuelle Saison"
|
||||||
|
|
||||||
#: membership/templates/membership/membership_detail.html:55
|
#: templates/membership/membership_detail.html:55
|
||||||
msgid "Edit Profile"
|
msgid "Edit Profile"
|
||||||
msgstr "Profil bearbeiten"
|
msgstr "Profil bearbeiten"
|
||||||
|
|
||||||
#: membership/templates/membership/membership_detail.html:59
|
#: templates/membership/membership_detail.html:59
|
||||||
#: 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_detail.html:63
|
#: templates/membership/membership_detail.html:63
|
||||||
#: membership/templates/membership/membership_detail.html:67
|
#: templates/membership/membership_detail.html:67
|
||||||
#: membership/templates/membership/membership_detail.html:71
|
#: templates/membership/membership_detail.html:71
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Associate with %(name)s"
|
msgid "Associate with %(name)s"
|
||||||
msgstr "Verbinde mit %(name)s"
|
msgstr "Verbinde mit %(name)s"
|
||||||
|
|
||||||
#: 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
|
||||||
#: membership/templates/membership/register_form.html:7
|
#: templates/membership/register_form.html:7
|
||||||
msgid "Registration"
|
msgid "Registration"
|
||||||
msgstr "Registrieren"
|
msgstr "Registrieren"
|
||||||
|
|
||||||
#: membership/templates/membership/register_form.html:9
|
#: templates/membership/register_form.html:9
|
||||||
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 "
|
" an email asking you to verify your email address. You have to click on the\n"
|
||||||
"the\n"
|
" link in this verification email to confirm your email address, otherwise\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 "
|
"Nach dem du deine Daten eingegeben hast, wirst du eine E-Mail zur Bestätigung bekommen.\n"
|
||||||
"Bestätigung bekommen.\n"
|
"Bitte klicke auf den Link in dieser E-Mail zur Verifizierung, erst dann ist die Anmeldung möglich."
|
||||||
"Bitte klicke auf den Link in dieser E-Mail zur Verifizierung, erst dann ist "
|
|
||||||
"die Anmeldung möglich."
|
|
||||||
|
|
||||||
#: membership/templates/membership/register_form.html:20
|
#: templates/membership/register_form.html:20
|
||||||
msgid "name"
|
msgid "name"
|
||||||
msgstr "Name"
|
msgstr "Name"
|
||||||
|
|
||||||
#: membership/templates/membership/register_form.html:26
|
#: templates/membership/register_form.html:26
|
||||||
#: membership/templates/registration/login.html:41
|
#: templates/registration/login.html:41
|
||||||
msgid "login"
|
msgid "login"
|
||||||
msgstr "Anmelden"
|
msgstr "Anmelden"
|
||||||
|
|
||||||
#: membership/templates/membership/register_form.html:39
|
#: templates/membership/register_form.html:39
|
||||||
msgid "reset"
|
msgid "reset"
|
||||||
msgstr "Zurücksetzen"
|
msgstr "Zurücksetzen"
|
||||||
|
|
||||||
#: membership/templates/membership/register_form.html:41
|
#: templates/membership/register_form.html:41
|
||||||
#: membership/templates/registration/login.html:35
|
#: templates/registration/login.html:35
|
||||||
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:4
|
#: templates/registration/login.html:4 templates/registration/login.html:11
|
||||||
#: membership/templates/registration/login.html:11
|
#: templates/registration/login.html:53
|
||||||
#: membership/templates/registration/login.html:53
|
#: templates/registration/password_reset_complete.html:13
|
||||||
#: membership/templates/registration/password_reset_complete.html:13
|
|
||||||
msgid "Login"
|
msgid "Login"
|
||||||
msgstr "Anmelden"
|
msgstr "Anmelden"
|
||||||
|
|
||||||
#: membership/templates/registration/login.html:17
|
#: templates/registration/login.html:17
|
||||||
msgid "Have you already registered?"
|
msgid "Have you already registered?"
|
||||||
msgstr "Bereits registriert?"
|
msgstr "Bereits registriert?"
|
||||||
|
|
||||||
#: membership/templates/registration/login.html:18
|
#: templates/registration/login.html:18
|
||||||
#, fuzzy
|
|
||||||
#| msgid ""
|
#| msgid ""
|
||||||
#| "\n"
|
#| "\n"
|
||||||
#| "<p>As a registered member you can:</p>\n"
|
#| "<p>As a registered member you can:</p>\n"
|
||||||
@@ -441,17 +432,14 @@ msgstr ""
|
|||||||
" <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>Vereinsmitglieder haben auch vollen Zugang zu unserem Ranking System</li>\n"
|
||||||
"li>\n"
|
"</ul>"
|
||||||
"</ul>\n"
|
|
||||||
|
|
||||||
#: membership/templates/registration/login.html:27
|
#: templates/registration/login.html:27
|
||||||
#, fuzzy
|
|
||||||
#| msgid ""
|
#| msgid ""
|
||||||
#| "\n"
|
#| "\n"
|
||||||
#| "<p>You can register here with your Google, or Facebook account.\n"
|
#| "<p>You can register here with your Google, or Facebook account.\n"
|
||||||
#| "If you don't own such an account, or do not want to use it for "
|
#| "If you don't own such an account, or do not want to use it for authentication,\n"
|
||||||
#| "authentication,\n"
|
|
||||||
#| "you can fill out our registration form.</p>\n"
|
#| "you can fill out our registration form.</p>\n"
|
||||||
msgid ""
|
msgid ""
|
||||||
"\n"
|
"\n"
|
||||||
@@ -462,56 +450,55 @@ msgid ""
|
|||||||
" "
|
" "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"\n"
|
"\n"
|
||||||
"<p>Du kannst dich auch über deinen Facebook, Google, oder Twitter Account "
|
"<p>Du kannst dich auch über deinen Facebook, Google, oder Twitter Account anmelden.\n"
|
||||||
"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>\n"
|
"kannst du auch das Registrierungsformular ausfüllen.</p>"
|
||||||
|
|
||||||
#: membership/templates/registration/login.html:45
|
#: templates/registration/login.html:45
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Your username and password didn't match. Please try again."
|
#| msgid "Your username and password didn't match. Please try again."
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your username and password didn't match. Please try\n"
|
"Your username and password didn't match. Please try\n"
|
||||||
" again."
|
" again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Benutzername und Passwort stimmen nicht überein. Bitte noch einmal versuchen."
|
"Benutzername und Passwort stimmen nicht überein. Bitte noch einmal "
|
||||||
|
"versuchen."
|
||||||
|
|
||||||
#: membership/templates/registration/login.html:50
|
#: templates/registration/login.html:50
|
||||||
msgid "Forgot your Password?"
|
msgid "Forgot your Password?"
|
||||||
msgstr "Passwort vergessen?"
|
msgstr "Passwort vergessen?"
|
||||||
|
|
||||||
#: membership/templates/registration/login.html:60
|
#: templates/registration/login.html:60
|
||||||
msgid "or login with an existing Account"
|
msgid "or login with an existing Account"
|
||||||
msgstr "oder über einen existierenden Account anmelden"
|
msgstr "oder über einen existierenden Account anmelden"
|
||||||
|
|
||||||
#: membership/templates/registration/login.html:63
|
#: templates/registration/login.html:63
|
||||||
msgid "Login with Facebook"
|
msgid "Login with Facebook"
|
||||||
msgstr "Über Facebook anmelden"
|
msgstr "Über Facebook anmelden"
|
||||||
|
|
||||||
#: membership/templates/registration/login.html:66
|
#: templates/registration/login.html:66
|
||||||
msgid "Login with Twitter"
|
msgid "Login with Twitter"
|
||||||
msgstr "Über Twitter anmelden"
|
msgstr "Über Twitter anmelden"
|
||||||
|
|
||||||
#: membership/templates/registration/login.html:69
|
#: templates/registration/login.html:69
|
||||||
msgid "Login with Google"
|
msgid "Login with Google"
|
||||||
msgstr "Über Google Anmelden"
|
msgstr "Über Google 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."
|
||||||
@@ -519,23 +506,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."
|
||||||
@@ -543,15 +530,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."
|
||||||
@@ -559,22 +546,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:63
|
#: 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."
|
||||||
@@ -582,15 +569,14 @@ 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:83
|
#: 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:97
|
#: views.py:112
|
||||||
#, fuzzy
|
|
||||||
#| msgid "No %(verbose_name)s found matching the query"
|
#| msgid "No %(verbose_name)s found matching the query"
|
||||||
msgid "No Membership found matching the query"
|
msgid "No Membership found matching the query"
|
||||||
msgstr "Kein %(verbose_name)s gefunden welche der Anfrage entspricht"
|
msgstr "Keine Mitgliedschaft gefunden welche der Anfrage entspricht"
|
||||||
|
|
||||||
#~ msgid "Given Name"
|
#~ msgid "Given Name"
|
||||||
#~ msgstr "Vorname"
|
#~ msgstr "Vorname"
|
||||||
@@ -599,9 +585,9 @@ msgstr "Kein %(verbose_name)s gefunden welche der Anfrage entspricht"
|
|||||||
#~ msgstr "Nachname"
|
#~ msgstr "Nachname"
|
||||||
|
|
||||||
#~ msgid ""
|
#~ msgid ""
|
||||||
#~ "The Username can only contain the letters from A to Z, Numbers, "
|
#~ "The Username can only contain the letters from A to Z, Numbers, and "
|
||||||
#~ "and the underscore. It must be at least 2 characters long, and "
|
#~ "the underscore. It must be at least 2 characters long, and cannot be"
|
||||||
#~ "cannot be longer the 30. The first character must be a letter."
|
#~ " 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 "
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import django.contrib.auth.models
|
|
||||||
import django.core.validators
|
|
||||||
import django.utils.timezone
|
|
||||||
from django.conf import settings
|
|
||||||
from django.db import models, migrations
|
from django.db import models, migrations
|
||||||
|
import django.core.validators
|
||||||
|
import django.contrib.auth.models
|
||||||
|
from django.conf import settings
|
||||||
|
import django.utils.timezone
|
||||||
import membership.models
|
import membership.models
|
||||||
import utils
|
import utils
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('auth', '0006_require_contenttypes_0002'),
|
('auth', '0006_require_contenttypes_0002'),
|
||||||
]
|
]
|
||||||
@@ -21,94 +21,56 @@ class Migration(migrations.Migration):
|
|||||||
name='Membership',
|
name='Membership',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(verbose_name='ID',
|
('id', models.AutoField(verbose_name='ID',
|
||||||
serialize=False, auto_created=True,
|
serialize=False, auto_created=True, primary_key=True)),
|
||||||
primary_key=True)),
|
|
||||||
('password', models.CharField(
|
('password', models.CharField(
|
||||||
max_length=128, verbose_name='password')),
|
max_length=128, verbose_name='password')),
|
||||||
('last_login', models.DateTimeField(
|
('last_login', models.DateTimeField(
|
||||||
null=True, verbose_name='last login', blank=True)),
|
null=True, verbose_name='last login', blank=True)),
|
||||||
('is_superuser', models.BooleanField(default=False,
|
('is_superuser', models.BooleanField(default=False,
|
||||||
help_text='Designates that this user has all permissions without explicitly assigning them.',
|
help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
|
||||||
verbose_name='superuser status')),
|
('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, max_length=30, validators=[django.core.validators.RegexValidator(
|
||||||
('username', models.CharField(error_messages={
|
'^[\\w.@+-]+$', 'Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.', 'invalid')], help_text='Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.', unique=True, verbose_name='username')),
|
||||||
'unique': 'A user with that username already exists.'},
|
|
||||||
max_length=30, validators=[
|
|
||||||
django.core.validators.RegexValidator(
|
|
||||||
'^[\\w.@+-]+$',
|
|
||||||
'Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.',
|
|
||||||
'invalid')],
|
|
||||||
help_text='Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.',
|
|
||||||
unique=True,
|
|
||||||
verbose_name='username')),
|
|
||||||
('first_name', models.CharField(max_length=30,
|
('first_name', models.CharField(max_length=30,
|
||||||
verbose_name='first name',
|
verbose_name='first name', blank=True)),
|
||||||
blank=True)),
|
|
||||||
('last_name', models.CharField(max_length=30,
|
('last_name', models.CharField(max_length=30,
|
||||||
verbose_name='last name',
|
verbose_name='last name', blank=True)),
|
||||||
blank=True)),
|
|
||||||
('email', models.EmailField(max_length=254,
|
('email', models.EmailField(max_length=254,
|
||||||
verbose_name='email address',
|
verbose_name='email address', blank=True)),
|
||||||
blank=True)),
|
|
||||||
('is_staff', models.BooleanField(default=False,
|
('is_staff', models.BooleanField(default=False,
|
||||||
help_text='Designates whether the user can log into this admin site.',
|
help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
|
||||||
verbose_name='staff status')),
|
|
||||||
('is_active', models.BooleanField(
|
('is_active', models.BooleanField(
|
||||||
default=True,
|
default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
|
||||||
help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.',
|
|
||||||
verbose_name='active')),
|
|
||||||
('date_joined', models.DateTimeField(
|
('date_joined', models.DateTimeField(
|
||||||
default=django.utils.timezone.now,
|
default=django.utils.timezone.now, verbose_name='date joined')),
|
||||||
verbose_name='date joined')),
|
('gender', models.CharField(max_length=1, verbose_name='Geschlecht', choices=[
|
||||||
('gender',
|
(b'm', 'M\xe4nnlich'), (b'f', 'Weiblich')])),
|
||||||
models.CharField(max_length=1, verbose_name='Geschlecht',
|
|
||||||
choices=[
|
|
||||||
(b'm', 'M\xe4nnlich'),
|
|
||||||
(b'f', 'Weiblich')])),
|
|
||||||
('website', models.URLField(blank=True)),
|
('website', models.URLField(blank=True)),
|
||||||
('avatar', models.ImageField(storage=utils.OverwriteStorage(
|
('avatar', models.ImageField(storage=utils.OverwriteStorage(
|
||||||
), null=True, upload_to=membership.models.get_upload_path,
|
), null=True, upload_to=membership.models.get_upload_path, blank=True)),
|
||||||
blank=True)),
|
|
||||||
('membership', models.BooleanField(default=False,
|
('membership', models.BooleanField(default=False,
|
||||||
help_text='Ja, ich bin mit den Statuen einverstanden und m\xf6chte Mitglied werden.',
|
help_text='Ja, ich bin mit den Statuen einverstanden und m\xf6chte Mitglied werden.', verbose_name='Mitgliedschaft')),
|
||||||
verbose_name='Mitgliedschaft')),
|
|
||||||
('birthday', models.DateField(null=True,
|
('birthday', models.DateField(null=True,
|
||||||
verbose_name='Geburtstag',
|
verbose_name='Geburtstag', blank=True)),
|
||||||
blank=True)),
|
|
||||||
('telephone', models.CharField(max_length=30,
|
('telephone', models.CharField(max_length=30,
|
||||||
null=True,
|
null=True, verbose_name='Telefon', blank=True)),
|
||||||
verbose_name='Telefon',
|
|
||||||
blank=True)),
|
|
||||||
('street_name', models.CharField(max_length=75,
|
('street_name', models.CharField(max_length=75,
|
||||||
null=True,
|
null=True, verbose_name='Adresse', blank=True)),
|
||||||
verbose_name='Adresse',
|
|
||||||
blank=True)),
|
|
||||||
('post_code', models.PositiveSmallIntegerField(
|
('post_code', models.PositiveSmallIntegerField(
|
||||||
null=True, verbose_name='Postleitzahl', blank=True)),
|
null=True, verbose_name='Postleitzahl', blank=True)),
|
||||||
('city', models.CharField(max_length=75,
|
('city', models.CharField(max_length=75,
|
||||||
null=True, verbose_name='Ort',
|
null=True, verbose_name='Ort', blank=True)),
|
||||||
blank=True)),
|
|
||||||
('deposit', models.PositiveSmallIntegerField(
|
('deposit', models.PositiveSmallIntegerField(
|
||||||
default=0, editable=False)),
|
default=0, editable=False)),
|
||||||
('registration_date', models.DateField(auto_now_add=True)),
|
('registration_date', models.DateField(auto_now_add=True)),
|
||||||
('paid_until', models.DateField(null=True,
|
('paid_until', models.DateField(null=True,
|
||||||
verbose_name='Bezahlt bis',
|
verbose_name='Bezahlt bis', blank=True)),
|
||||||
blank=True)),
|
|
||||||
('confirmed', models.BooleanField(default=False,
|
('confirmed', models.BooleanField(default=False,
|
||||||
help_text='Diese Person hat ihre Mitgliedschaft bezahlt',
|
help_text='Diese Person hat ihre Mitgliedschaft bezahlt', verbose_name='Best\xe4tigt')),
|
||||||
verbose_name='Best\xe4tigt')),
|
|
||||||
('comment', models.TextField(blank=True)),
|
('comment', models.TextField(blank=True)),
|
||||||
('groups', models.ManyToManyField(related_query_name='user',
|
('groups', models.ManyToManyField(related_query_name='user', related_name='user_set', to='auth.Group', blank=True,
|
||||||
related_name='user_set',
|
help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', verbose_name='groups')),
|
||||||
to='auth.Group', blank=True,
|
('user_permissions', models.ManyToManyField(related_query_name='user', related_name='user_set', to='auth.Permission',
|
||||||
help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.',
|
blank=True, help_text='Specific permissions for this user.', verbose_name='user permissions')),
|
||||||
verbose_name='groups')),
|
|
||||||
('user_permissions',
|
|
||||||
models.ManyToManyField(related_query_name='user',
|
|
||||||
related_name='user_set',
|
|
||||||
to='auth.Permission',
|
|
||||||
blank=True,
|
|
||||||
help_text='Specific permissions for this user.',
|
|
||||||
verbose_name='user permissions')),
|
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'ordering': ('last_name', 'first_name'),
|
'ordering': ('last_name', 'first_name'),
|
||||||
@@ -124,13 +86,11 @@ class Migration(migrations.Migration):
|
|||||||
name='ActivationRequest',
|
name='ActivationRequest',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(verbose_name='ID',
|
('id', models.AutoField(verbose_name='ID',
|
||||||
serialize=False, auto_created=True,
|
serialize=False, auto_created=True, primary_key=True)),
|
||||||
primary_key=True)),
|
|
||||||
('activation_key', models.CharField(
|
('activation_key', models.CharField(
|
||||||
max_length=40, verbose_name='Aktivierungsschl\xfcssel')),
|
max_length=40, verbose_name='Aktivierungsschl\xfcssel')),
|
||||||
('user', models.OneToOneField(
|
('user', models.OneToOneField(
|
||||||
verbose_name='Benutzer', to=settings.AUTH_USER_MODEL,
|
verbose_name='Benutzer', to=settings.AUTH_USER_MODEL)),
|
||||||
on_delete=models.CASCADE)),
|
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'verbose_name': 'Ausstehende Aktivierung',
|
'verbose_name': 'Ausstehende Aktivierung',
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ from os import path
|
|||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib.auth.models import AbstractUser
|
from django.contrib.auth.models import AbstractUser
|
||||||
from django.urls import reverse
|
from django.core.urlresolvers import reverse
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
@@ -80,7 +80,6 @@ class ActivationRequest(models.Model):
|
|||||||
"""
|
"""
|
||||||
user = models.OneToOneField(
|
user = models.OneToOneField(
|
||||||
settings.AUTH_USER_MODEL,
|
settings.AUTH_USER_MODEL,
|
||||||
on_delete=models.CASCADE,
|
|
||||||
verbose_name=_('user')
|
verbose_name=_('user')
|
||||||
)
|
)
|
||||||
activation_key = models.CharField(_('activation key'), max_length=40)
|
activation_key = models.CharField(_('activation key'), max_length=40)
|
||||||
@@ -216,10 +215,6 @@ class Membership(AbstractUser):
|
|||||||
verbose_name = _('Membership')
|
verbose_name = _('Membership')
|
||||||
verbose_name_plural = _('Memberships')
|
verbose_name_plural = _('Memberships')
|
||||||
|
|
||||||
@property
|
|
||||||
def full_name(self):
|
|
||||||
return " ".join([self.last_name, self.first_name])
|
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.username
|
return self.username
|
||||||
|
|
||||||
|
|||||||
@@ -35,10 +35,7 @@
|
|||||||
<h3>Mahjong</h3>
|
<h3>Mahjong</h3>
|
||||||
<ul>
|
<ul>
|
||||||
{% if kyu_dan_ranking.dan %}
|
{% if kyu_dan_ranking.dan %}
|
||||||
<li>
|
<li><strong>{{kyu_dan_ranking.dan}}. Dan: </strong> {{ kyu_dan_ranking.dan_points }} {% trans 'Points' %}</li>
|
||||||
<strong>{{kyu_dan_ranking.dan}}. Dan: </strong> {{ kyu_dan_ranking.dan_points }} {% trans 'Points' %}
|
|
||||||
({% trans 'Maximum' %}: {{ kyu_dan_ranking.max_dan_points }})
|
|
||||||
</li>
|
|
||||||
{% elif kyu_dan_ranking.kyu%}
|
{% elif kyu_dan_ranking.kyu%}
|
||||||
<li><strong>{{kyu_dan_ranking.kyu}}. Kyu: </strong> {{ kyu_dan_ranking.kyu_points }} {% trans 'Points' %}</li>
|
<li><strong>{{kyu_dan_ranking.kyu}}. Kyu: </strong> {{ kyu_dan_ranking.kyu_points }} {% trans 'Points' %}</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ from django import http
|
|||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib import auth, messages
|
from django.contrib import auth, messages
|
||||||
from django.contrib.auth.mixins import LoginRequiredMixin
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||||
from django.urls import reverse
|
from django.core.urlresolvers import reverse
|
||||||
from django.http import Http404
|
from django.http import Http404
|
||||||
from django.utils.decorators import method_decorator
|
from django.utils.decorators import method_decorator
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
|
|||||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -31,15 +31,3 @@ class CompressHtmlMiddleware(object):
|
|||||||
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):
|
|
||||||
def process_request(self, request):
|
|
||||||
try:
|
|
||||||
real_ip = request.META['HTTP_X_FORWARDED_FOR']
|
|
||||||
real_ip = real_ip.split(",")[0]
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
# HTTP_X_FORWARDED_FOR can be a comma-separated list of IPs.
|
|
||||||
# Take just the first one.
|
|
||||||
request.META['REMOTE_ADDR'] = real_ip
|
|
||||||
|
|||||||
Reference in New Issue
Block a user