34 Commits

Author SHA1 Message Date
a8536fc776 Catch an KyuDanRanking.DoesNotExist exception if the user has never played a game of mahjongg by now. 2018-05-08 12:31:46 +02:00
4db5c09387 Merge branch 'dsgvo' 2018-05-08 12:15:12 +02:00
0768641184 removed unneeded import 2018-05-08 12:12:15 +02:00
fae5f30cfa User must confirm that he have read and understood the privacy plicity. This policity and the stautes are now linked in the help_text. 2018-05-08 12:09:56 +02:00
e95ad8bf0a User must confirm that he have read and understood the privacy plicity. This policity and the stautes are now linked in the help_text. 2018-05-08 12:07:39 +02:00
4b68f62929 removed social auth methods for login 2018-05-07 23:37:48 +02:00
fc8daaaf25 removed <p> Tags to guarantee vaild HTML output. 2018-05-04 12:59:38 +02:00
c3d213934e Added a themed an customizeable logged out message page. 2018-05-04 12:53:23 +02:00
baa9660b7c fixed: load all toplevel pages from the db, but only show active pages in the top menu. 2018-05-04 11:57:19 +02:00
3dcd1aeffa Changed membership forms, text can now be changed via admin tool. 2018-05-04 11:34:57 +02:00
5affdb0f5c Better age check 2018-05-03 16:35:40 +02:00
9f0126be54 Dirty check club member must be at least 16 years old. 2018-05-03 16:23:39 +02:00
0f71bb5360 First draft of a disclaimer (german) 2018-05-03 10:32:27 +02:00
3e64f4d757 You can only fill in your personal data if you apply for a full membership. 2018-05-03 10:12:23 +02:00
121167f1fe Added a admin action to cleanup personal data from inactive members. 2018-05-03 09:45:06 +02:00
ac9b3e06c0 Don't display full name anywhere. 2018-05-01 20:27:57 +02:00
9fdf725702 Don't display members real name anywhere! 2018-05-01 20:27:22 +02:00
2f5f834bba Track without cookies. 2018-04-30 11:37:32 +02:00
722c155c17 Personal data is only needed for a club membership. 2018-04-30 11:12:20 +02:00
3b162fc59c All personal data can only seen by yourself. 2018-04-30 10:16:04 +02:00
e9e997e38d Merge branch 'master' into css3_redesign
# Conflicts:
#	requirements/base.txt
#	src/content/locale/de/LC_MESSAGES/django.mo
#	src/content/locale/de/LC_MESSAGES/django.po
#	src/events/locale/de/LC_MESSAGES/django.mo
#	src/events/locale/de/LC_MESSAGES/django.po
#	src/kasu/locale/de/LC_MESSAGES/django.po
#	src/mahjong_ranking/locale/de/LC_MESSAGES/django.mo
#	src/mahjong_ranking/locale/de/LC_MESSAGES/django.po
#	src/maistar_ranking/locale/de/LC_MESSAGES/django.po
#	src/membership/locale/de/LC_MESSAGES/django.mo
#	src/membership/locale/de/LC_MESSAGES/django.po
#	src/utils/locale/de/LC_MESSAGES/django.po
2018-04-30 08:29:14 +02:00
aa85d3fd94 requirements changed to django<2.0 for compatibility reasons. 2018-04-28 11:11:12 +02:00
432673a967 Updated all translations 2018-04-27 10:34:37 +02:00
877715f613 Event gallery shows most recent albums first.
Doubled the shown events in the gallery to 24 per page.
2018-04-27 10:20:29 +02:00
1d2fb44250 Fixed typo Player List (Spieler Liste) is now
Players list (Spielerliste)
2018-04-27 10:12:39 +02:00
3af8e64f1f Added the full address to the next/upcoming event in the redbox. 2018-04-27 10:11:19 +02:00
8ddbe03ff8 adapted cleanup script to new file locations and parameters. 2018-04-27 10:10:02 +02:00
0a793b7954 Fixed: Changed the environ to ORIGINAL_RECIPIENT 2018-01-17 16:19:48 +01:00
4b0a5c9c82 * Throw 404 instead of a 503 in Event Mixins if the related event does
not exist.
* Changes in the KyuDanRanking View to be more stable if we get bogus
kwargs.
2018-01-10 02:02:35 +01:00
6796b58d4c Merge remote-tracking branch 'origin/master' into riichi_2018
# Conflicts:
#	src/events/mixins.py
#	src/kasu/settings.py
#	src/mahjong_ranking/management/commands/export_ranking.py
#	src/mahjong_ranking/management/commands/resetdanranking.py
#	src/mahjong_ranking/management/commands/update_ranking.py
#	src/mahjong_ranking/managers.py
#	src/mahjong_ranking/models.py
#	src/mahjong_ranking/views.py
2018-01-04 08:39:49 +01:00
4bd017ec4f Fixed queryset so that EventDetailView will work too. 2017-11-24 19:48:21 +01:00
52ec7d42b7 Fixed Hanchan count and filter from last merge. 2017-11-24 19:47:28 +01:00
d62f549a30 Squashed commit of the following:
commit bb5081a78b
Author: Xeniac <xeniac@posteo.at>
Date:   Thu Nov 23 22:02:40 2017 +0100

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

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

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

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

    add a latest method to query the latest x events

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

    add a latest method to query the latest x events

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

    Changed PlayerDanScore to only list non-legacy hanchans

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

    fixed import of MIN_HANCHANS_FOR_LADDER that moved to settings

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

    Updated docstrings for new since and until kwargs

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

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

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

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

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

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

    Added option to calcuclate rankings until a given datetime.
2017-11-23 22:26:22 +01:00
fa6a81c710 FIXED: DateTimeField Hanchan.start received a naive datetime 2017-11-13 22:59:13 +01:00
46 changed files with 1774 additions and 1375 deletions

View File

@@ -21,9 +21,10 @@ module.exports = function(grunt) {
report: 'min'
},
kasu: {
src: 'static/css/kasu.css',
dest: 'static/css/kasu.css'
}
files: {
'src/kasu/static/css/kasu.min.css': ['src/kasu/static/css/kasu.css'],
},
},
},
watch: {
styles: {

View File

@@ -6,7 +6,6 @@ unset DJANGO_SETTINGS_MODULE
for dir in *
do
if [ -d ${dir}/locale ]
echo "Übersetze $dir"
then
echo -n "$dir: "
cd ${dir}
@@ -15,7 +14,7 @@ for dir in *
fi
done
sleep 5s
export DJANGO_SETTINGS_MODULE="kasu.settings.production"
export DJANGO_SETTINGS_MODULE="kasu.settings"
./manage.py compilemessages
echo "lösche den Python Compiler Cache..."
@@ -23,5 +22,5 @@ find . -name "*.pyc" -exec rm -rf {} \;
echo "Aktualisiere Statics"
./manage.py collectstatic --noinput -c
echo "Erstelle Vorschaubilder"
./manage.py generateimages
./manage.py thumbnail_cleanup
touch kasu/wsgi.py

View File

@@ -8,7 +8,7 @@
"grunt": ">=0.4.5",
"grunt-contrib-less": ">=1.0.1",
"grunt-contrib-watch": ">=0.6.1",
"grunt-more-css": ">=0.1.0"
"grunt-more-css": "^0.1.1"
},
"dependencies": {
"ckeditor-dev": "git://github.com/ckeditor/ckeditor-dev.git"

View File

@@ -17,5 +17,3 @@ PyJWT
pytz
requests
requests-oauthlib
social-auth-app-django
social-auth-core

View File

@@ -3,7 +3,7 @@
from django.core.cache import cache
from . import models
from utils import STATUS_PUBLISHED
def content_menus(request):
""" Generate the menu tree and add these info to the template context.
@@ -50,7 +50,7 @@ def content_menus(request):
break
current_path = current_path[0:current_path.rfind('.')]
return {'top_menu_items': top_level_pages,
return {'top_menu_items': top_level_pages.filter(status=STATUS_PUBLISHED),
'current_top_page': current_top_page,
'current_path': current_path,
'current_page': current_page}

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
"""Mixins for Events."""
from django.http import Http404
from django.shortcuts import get_object_or_404
from . import models
@@ -34,12 +34,14 @@ class EventDetailMixin(object):
:return: TemplateContext object"""
context = super(EventDetailMixin, self).get_context_data(**kwargs)
if hasattr(self, 'event') and self.event:
if hasattr(self, 'event'):
context['event'] = self.event
elif hasattr(self, 'object') and isinstance(self.object, models.Event):
context['event'] = self.object
elif hasattr(self, 'object') and hasattr(self.object, 'event'):
context['event'] = self.object.event
else:
print("No Event in Context!")
return context
def get_queryset(self):
@@ -49,12 +51,9 @@ class EventDetailMixin(object):
:return: a django QuerySets
"""
if self.model == models.Event:
self.event = models.Event.objects.get(pk=self.kwargs['pk'])
self.event = get_object_or_404(models.Event, pk=self.kwargs['pk'])
queryset = self.model.objects.all()
else:
try:
self.event = models.Event.objects.get(pk=self.kwargs['event'])
self.event = get_object_or_404(models.Event, pk=self.kwargs['event'])
queryset = self.model.objects.filter(event=self.event)
except models.Event.DoesNotExist:
raise Http404(_('Event does not exist'))
return queryset.prefetch_related()

View File

@@ -52,7 +52,7 @@
{% endif %}
</p>
<p>{{event.description|truncatewords_html:20|safe}}</p>
{{event.description|truncatewords_html:20|safe}}
<ul class="info">
<li><span class="fa fa-map-marker" title="{% trans 'Location' %}"></span> {{ event.location }}</li>
<li><span class="fa fa-comments" title="{% trans 'Comments' %}"></span> <a href="{{event.get_absolute_url}}#comments">{{ comment_count }}</a></li>

View File

@@ -36,10 +36,9 @@
<a href="{{event.get_absolute_url}}#comments">{{ comment_count }}</a>
</li>
</ul>
<p>{{event.description|truncatewords_html:25|safe}}</p>
{{event.description|truncatewords_html:25|safe}}
</div>
{% if forloop.counter|divisibleby:2 %}<br class="clear">{% endif %}
{% endfor %}
{% endfor %}
{% if page_obj.has_other_pages %}{% include 'paginator.html' %}{% endif %}
{% endblock %}

View File

@@ -80,7 +80,8 @@ class EventGallery(generic.ListView):
event_series__isnull=True,
photo_count__gt=0
)
paginate_by = 12
queryset = queryset.order_by('-start')
paginate_by = 24
class EventListIcal(generic.View):

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: kasu.utils\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-06-19 22:46+0200\n"
"POT-Creation-Date: 2018-05-08 00:17+0200\n"
"PO-Revision-Date: 2016-09-28 00:24+0200\n"
"Last-Translator: Christian Berg <xeniac.at@gmail.com>\n"
"Language-Team: Kasu <verein@kasu.at>\n"
@@ -19,174 +19,163 @@ msgstr ""
"X-Generator: Poedit 1.8.9\n"
"X-Translated-Using: django-rosetta 0.7.6\n"
#: kasu/settings.py:153
#: .\kasu\settings.py:141
msgid "German"
msgstr "Deutsch"
#: kasu/settings.py:153
#: .\kasu\settings.py:141
msgid "English"
msgstr "Englisch"
#: kasu/templates/404.html:8
#: .\kasu\templates\404.html:8
msgid "The page your requested does not exist on this server."
msgstr "Die angeforderte Seite existiert auf diesem Server nicht."
#: kasu/templates/base.html:22
#: .\kasu\templates\base.html:22
msgid "Current News"
msgstr "Aktuelle Neuigkeiten"
#: kasu/templates/base.html:24 kasu/templates/index.html:40
#: .\kasu\templates\base.html:24 .\kasu\templates\index.html:40
msgid "Recent Comments"
msgstr "Kürzliche Kommentare"
#: kasu/templates/base.html:45
#: .\kasu\templates\base.html:45
msgid "Menu"
msgstr "Menü"
#: kasu/templates/base.html:69
#: .\kasu\templates\base.html:69
msgid "Current Event"
msgstr "Aktuelle Veranstaltung"
#: kasu/templates/base.html:72
#: .\kasu\templates\base.html:72
msgid "Since"
msgstr "seit"
#: kasu/templates/base.html:73 kasu/templates/base.html:85
#: .\kasu\templates\base.html:73 .\kasu\templates\base.html:87
msgid "Start"
msgstr "Beginn"
#: kasu/templates/base.html:76 kasu/templates/base.html:88
#: .\kasu\templates\base.html:76 .\kasu\templates\base.html:90
msgid "Location"
msgstr "Ort"
#: kasu/templates/base.html:79 kasu/templates/base.html:90
#: .\kasu\templates\base.html:81 .\kasu\templates\base.html:94
msgid "More Details"
msgstr "Mehr Details"
#: kasu/templates/base.html:81
#: .\kasu\templates\base.html:83
msgid "Next Event"
msgstr "Nächste Veranstaltung"
#: kasu/templates/base.html:84
#: .\kasu\templates\base.html:86
msgid "in"
msgstr "in"
#: kasu/templates/base.html:93
#: .\kasu\templates\base.html:97
msgid "Upcoming events"
msgstr "Bevorstehende Veranstaltungen"
#: kasu/templates/base.html:143
#: .\kasu\templates\base.html:147
msgid "Add Subpage"
msgstr "Unterseite Hinzufügen"
#: kasu/templates/base.html:148
#: .\kasu\templates\base.html:152
msgid "Edit Page"
msgstr "Seite bearbeiten"
#: kasu/templates/base.html:156
#: .\kasu\templates\base.html:160
msgid "Imprint"
msgstr "Impressum"
#: kasu/templates/base.html:157
#: .\kasu\templates\base.html:161
msgid "contact"
msgstr "Kontakt"
#: kasu/templates/base.html:162
#: .\kasu\templates\base.html:166
msgid "Language"
msgstr "Sprache"
#: kasu/templates/base.html:171
#: .\kasu\templates\base.html:175
msgid "Go"
msgstr "Los"
#: kasu/templates/base.html:176
#: .\kasu\templates\base.html:180
msgid "Logged in as"
msgstr "Angemeldet als"
#: kasu/templates/base.html:178
#: .\kasu\templates\base.html:182
msgid "Admin"
msgstr "Admin"
#: kasu/templates/base.html:179
#: .\kasu\templates\base.html:183
msgid "Logout"
msgstr "Abmelden"
#: kasu/templates/base.html:181
#: .\kasu\templates\base.html:185
msgid "no user logged in"
msgstr "Niemand angemeldet"
#: kasu/templates/base.html:182 kasu/templates/comments/form.html:43
#: .\kasu\templates\base.html:186 .\kasu\templates\comments\form.html:43
msgid "register"
msgstr "Registrieren"
#: kasu/templates/base.html:183 kasu/templates/comments/form.html:44
#: .\kasu\templates\base.html:187 .\kasu\templates\comments\form.html:44
msgid "login"
msgstr "anmelden"
#: kasu/templates/base.html:185
msgid "Login with Facebook"
msgstr "über Facebook anmelden"
#: kasu/templates/base.html:187
msgid "Login with Twitter"
msgstr "über Twitter anmelden"
#: kasu/templates/base.html:189
msgid "Login with Google"
msgstr "über Google anmelden"
#: kasu/templates/comments/form.html:5
#: .\kasu\templates\comments\form.html:5
msgid "New Comment"
msgstr "Neuer Kommentar"
#: kasu/templates/comments/form.html:20
#: .\kasu\templates\comments\form.html:20
msgid "now"
msgstr "Jetzt"
#: kasu/templates/comments/form.html:25
#: .\kasu\templates\comments\form.html:25
msgid "Preview"
msgstr "Vorschau"
#: kasu/templates/comments/form.html:26
#: .\kasu\templates\comments\form.html:26
msgid "Post"
msgstr "Schreiben"
#: kasu/templates/comments/form.html:34
#: .\kasu\templates\comments\form.html:34
msgid "not logged in"
msgstr "Nicht angemeldet"
#: kasu/templates/comments/form.html:38
#: .\kasu\templates\comments\form.html:38
msgid "Register now, or Login to leave a comment here."
msgstr "Jetzt registrieren, oder anmelden um einen Kommentar zu schreiben."
#: kasu/templates/comments/list.html:2 kasu/templates/index.html:25
#: .\kasu\templates\comments\list.html:2 .\kasu\templates\index.html:25
msgid "Comments"
msgstr "Kommentare"
#: kasu/templates/comments/posted.html:4 kasu/templates/comments/posted.html:7
#: .\kasu\templates\comments\posted.html:4
#: .\kasu\templates\comments\posted.html:7
msgid "Thank you for your comment"
msgstr "Danke für deinen Kommentar."
#: kasu/templates/comments/preview.html:4
#: kasu/templates/comments/preview.html:6
#: .\kasu\templates\comments\preview.html:4
#: .\kasu\templates\comments\preview.html:6
msgid "Preview your comment"
msgstr "Vorschau deines Kommentars"
#: kasu/templates/comments/preview.html:10
#: .\kasu\templates\comments\preview.html:10
msgid "Please correct the error below"
msgid_plural "Please correct the errors below"
msgstr[0] "Bitte den Fehler weiter unten beheben"
msgstr[1] "Bitte die Fehler weiter unten beheben"
#: kasu/templates/index.html:4
#: .\kasu\templates\index.html:4
msgid "traditional Asian game culture"
msgstr "traditionelle asiatische Spielkultur"
#: kasu/templates/index.html:33
#: .\kasu\templates\index.html:33
msgid "Read More"
msgstr "Mehr lesen"
#: kasu/templates/index.html:47
#: .\kasu\templates\index.html:47
#, python-format
msgid ""
"\n"
@@ -203,26 +192,35 @@ msgstr ""
" <time datetime=\"%(submit_date)s\">%(since)s</time>\n"
" "
#: kasu/templates/index.html:59
#: .\kasu\templates\index.html:59
msgid "Kasu in the social network"
msgstr "Kasu im sozialem Netzwerk"
#: kasu/templates/index.html:62 kasu/templates/index.html:65
#: .\kasu\templates\index.html:62 .\kasu\templates\index.html:65
msgid "Visit us on"
msgstr "Besuche uns auf"
#: kasu/templates/index.html:74
#: .\kasu\templates\index.html:74
msgid "Add Article"
msgstr "Artikel hinzufügen"
#: kasu/templates/paginator.html:8
#: .\kasu\templates\paginator.html:8
msgid "Previous"
msgstr "Vorherige"
#: kasu/templates/paginator.html:20
#: .\kasu\templates\paginator.html:20
msgid "Next"
msgstr "Nächste"
#~ msgid "Login with Facebook"
#~ msgstr "über Facebook anmelden"
#~ msgid "Login with Twitter"
#~ msgstr "über Twitter anmelden"
#~ msgid "Login with Google"
#~ msgstr "über Google anmelden"
#~ msgid "United Kingdom"
#~ msgstr "Vereinigtes Königreich"

View File

@@ -49,7 +49,6 @@ PREREQ_APPS = [
'ckeditor',
'ckeditor_uploader',
'easy_thumbnails',
'social_django',
]
PROJECT_APPS = [
'kasu',
@@ -103,8 +102,6 @@ TEMPLATES = [
'django.contrib.messages.context_processors.messages',
'django.contrib.messages.context_processors.messages',
'events.context_processors.events_overview',
'social_django.context_processors.backends',
'social_django.context_processors.login_redirect'
],
'loaders': [
('django.template.loaders.cached.Loader', [
@@ -132,24 +129,10 @@ DEFAULT_FROM_EMAIL = ""
# Login Settings
ACCOUNT_ACTIVATION_DAYS = 5
AUTH_USER_MODEL = 'membership.Membership'
AUTHENTICATION_BACKENDS = ('social_core.backends.facebook.FacebookOAuth2',
'social_core.backends.google.GoogleOAuth2',
'social_core.backends.twitter.TwitterOAuth',
'django.contrib.auth.backends.ModelBackend',)
AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend',)
LOGIN_URL = '/membership/login/'
LOGIN_ERROR_URL = '/membership/login/error/'
LOGIN_REDIRECT_URL = '/users/'
SOCIAL_AUTH_CHANGE_SIGNAL_ONLY = False
SOCIAL_AUTH_ENABLED_BACKENDS = ('facebook-oauth2', 'google-oauth2', 'twitter')
SOCIAL_AUTH_NEW_USER_REDIRECT_URL = '/users/'
SOCIAL_AUTH_SLUGIFY_USERNAMES = True
SOCIAL_AUTH_FACEBOOK_KEY = ''
SOCIAL_AUTH_FACEBOOK_SECRET = ''
SOCIAL_AUTH_FACEBOOK_SCOPE = ['user_about_me', 'email']
SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = ''
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = ''
SOCIAL_AUTH_TWITTER_KEY = ''
SOCIAL_AUTH_TWITTER_SECRET = ''
# Localization
USE_I18N = True

View File

@@ -337,6 +337,10 @@ ul.tabs li.active a {
ul.errorlist li {
color: #a40000;
}
input.error {
border-color: #a40000;
background-color: rgba(164, 0, 0, 0.25);
}
.game h2 {
margin: 0.5em 0;
}

View File

@@ -0,0 +1,231 @@
/**
* jQuery Formset 1.3-pre
* @author Stanislaus Madueke (stan DOT madueke AT gmail DOT com)
* @requires jQuery 1.2.6 or later
*
* Copyright (c) 2009, Stanislaus Madueke
* All rights reserved.
*
* Licensed under the New BSD License
* See: http://www.opensource.org/licenses/bsd-license.php
*/
;(function($) {
$.fn.formset = function(opts)
{
var options = $.extend({}, $.fn.formset.defaults, opts),
flatExtraClasses = options.extraClasses.join(' '),
totalForms = $('#id_' + options.prefix + '-TOTAL_FORMS'),
maxForms = $('#id_' + options.prefix + '-MAX_NUM_FORMS'),
minForms = $('#id_' + options.prefix + '-MIN_NUM_FORMS'),
childElementSelector = 'input,select,textarea,label,div',
$$ = $(this),
applyExtraClasses = function(row, ndx) {
if (options.extraClasses) {
row.removeClass(flatExtraClasses);
row.addClass(options.extraClasses[ndx % options.extraClasses.length]);
}
},
updateElementIndex = function(elem, prefix, ndx) {
var idRegex = new RegExp(prefix + '-(\\d+|__prefix__)-'),
replacement = prefix + '-' + ndx + '-';
if (elem.attr("for")) elem.attr("for", elem.attr("for").replace(idRegex, replacement));
if (elem.attr('id')) elem.attr('id', elem.attr('id').replace(idRegex, replacement));
if (elem.attr('name')) elem.attr('name', elem.attr('name').replace(idRegex, replacement));
},
hasChildElements = function(row) {
return row.find(childElementSelector).length > 0;
},
showAddButton = function() {
return maxForms.length == 0 || // For Django versions pre 1.2
(maxForms.val() == '' || (maxForms.val() - totalForms.val() > 0));
},
/**
* Indicates whether delete link(s) can be displayed - when total forms > min forms
*/
showDeleteLinks = function() {
return minForms.length == 0 || // For Django versions pre 1.7
(minForms.val() == '' || (totalForms.val() - minForms.val() > 0));
},
insertDeleteLink = function(row) {
var delCssSelector = $.trim(options.deleteCssClass).replace(/\s+/g, '.'),
addCssSelector = $.trim(options.addCssClass).replace(/\s+/g, '.');
if (row.is('TR')) {
// If the forms are laid out in table rows, insert
// the remove button into the last table cell:
row.children(':last').append('<a class="' + options.deleteCssClass +'" href="javascript:void(0)">' + options.deleteText + '</a>');
} else if (row.is('UL') || row.is('OL')) {
// If they're laid out as an ordered/unordered list,
// insert an <li> after the last list item:
row.append('<li><a class="' + options.deleteCssClass + '" href="javascript:void(0)">' + options.deleteText +'</a></li>');
} else {
// Otherwise, just insert the remove button as the
// last child element of the form's container:
row.append('<a class="' + options.deleteCssClass + '" href="javascript:void(0)">' + options.deleteText +'</a>');
}
// Check if we're under the minimum number of forms - not to display delete link at rendering
if (!showDeleteLinks()){
row.find('a.' + delCssSelector).hide();
}
row.find('a.' + delCssSelector).click(function() {
var row = $(this).parents('.' + options.formCssClass),
del = row.find('input:hidden[id $= "-DELETE"]'),
buttonRow = row.siblings("a." + addCssSelector + ', .' + options.formCssClass + '-add'),
forms;
if (del.length) {
// We're dealing with an inline formset.
// Rather than remove this form from the DOM, we'll mark it as deleted
// and hide it, then let Django handle the deleting:
del.val('on');
row.hide();
forms = $('.' + options.formCssClass).not(':hidden');
} else {
row.remove();
// Update the TOTAL_FORMS count:
forms = $('.' + options.formCssClass).not('.formset-custom-template');
totalForms.val(forms.length);
}
for (var i=0, formCount=forms.length; i<formCount; i++) {
// Apply `extraClasses` to form rows so they're nicely alternating:
applyExtraClasses(forms.eq(i), i);
if (!del.length) {
// Also update names and IDs for all child controls (if this isn't
// a delete-able inline formset) so they remain in sequence:
forms.eq(i).find(childElementSelector).each(function() {
updateElementIndex($(this), options.prefix, i);
});
}
}
// Check if we've reached the minimum number of forms - hide all delete link(s)
if (!showDeleteLinks()){
$('a.' + delCssSelector).each(function(){$(this).hide();});
}
// Check if we need to show the add button:
if (buttonRow.is(':hidden') && showAddButton()) buttonRow.show();
// If a post-delete callback was provided, call it with the deleted form:
if (options.removed) options.removed(row);
return false;
});
};
$$.each(function(i) {
var row = $(this),
del = row.find('input:checkbox[id $= "-DELETE"]');
if (del.length) {
// If you specify "can_delete = True" when creating an inline formset,
// Django adds a checkbox to each form in the formset.
// Replace the default checkbox with a hidden field:
if (del.is(':checked')) {
// If an inline formset containing deleted forms fails validation, make sure
// we keep the forms hidden (thanks for the bug report and suggested fix Mike)
del.before('<input type="hidden" name="' + del.attr('name') +'" id="' + del.attr('id') +'" value="on" />');
row.hide();
} else {
del.before('<input type="hidden" name="' + del.attr('name') +'" id="' + del.attr('id') +'" />');
}
// Hide any labels associated with the DELETE checkbox:
$('label[for="' + del.attr('id') + '"]').hide();
del.remove();
}
if (hasChildElements(row)) {
row.addClass(options.formCssClass);
if (row.is(':visible')) {
insertDeleteLink(row);
applyExtraClasses(row, i);
}
}
});
if ($$.length) {
var hideAddButton = !showAddButton(),
addButton, template;
if (options.formTemplate) {
// If a form template was specified, we'll clone it to generate new form instances:
template = (options.formTemplate instanceof $) ? options.formTemplate : $(options.formTemplate);
template.removeAttr('id').addClass(options.formCssClass + ' formset-custom-template');
template.find(childElementSelector).each(function() {
updateElementIndex($(this), options.prefix, '__prefix__');
});
insertDeleteLink(template);
} else {
// Otherwise, use the last form in the formset; this works much better if you've got
// extra (>= 1) forms (thnaks to justhamade for pointing this out):
template = $('.' + options.formCssClass + ':last').clone(true).removeAttr('id');
template.find('input:hidden[id $= "-DELETE"]').remove();
// Clear all cloned fields, except those the user wants to keep (thanks to brunogola for the suggestion):
template.find(childElementSelector).not(options.keepFieldValues).each(function() {
var elem = $(this);
// If this is a checkbox or radiobutton, uncheck it.
// This fixes Issue 1, reported by Wilson.Andrew.J:
if (elem.is('input:checkbox') || elem.is('input:radio')) {
elem.attr('checked', false);
} else {
elem.val('');
}
});
}
// FIXME: Perhaps using $.data would be a better idea?
options.formTemplate = template;
if ($$.is('TR')) {
// If forms are laid out as table rows, insert the
// "add" button in a new table row:
var numCols = $$.eq(0).children().length, // This is a bit of an assumption :|
buttonRow = $('<tr><td colspan="' + numCols + '"><a class="' + options.addCssClass + '" href="javascript:void(0)">' + options.addText + '</a></tr>')
.addClass(options.formCssClass + '-add');
$$.parent().append(buttonRow);
if (hideAddButton) buttonRow.hide();
addButton = buttonRow.find('a');
} else {
// Otherwise, insert it immediately after the last form:
$$.filter(':last').after('<a class="' + options.addCssClass + '" href="javascript:void(0)">' + options.addText + '</a>');
addButton = $$.filter(':last').next();
if (hideAddButton) addButton.hide();
}
addButton.click(function() {
var formCount = parseInt(totalForms.val()),
row = options.formTemplate.clone(true).removeClass('formset-custom-template'),
buttonRow = $($(this).parents('tr.' + options.formCssClass + '-add').get(0) || this),
delCssSelector = $.trim(options.deleteCssClass).replace(/\s+/g, '.');
applyExtraClasses(row, formCount);
row.insertBefore(buttonRow).show();
row.find(childElementSelector).each(function() {
updateElementIndex($(this), options.prefix, formCount);
});
totalForms.val(formCount + 1);
// Check if we're above the minimum allowed number of forms -> show all delete link(s)
if (showDeleteLinks()){
$('a.' + delCssSelector).each(function(){$(this).show();});
}
// Check if we've exceeded the maximum allowed number of forms:
if (!showAddButton()) buttonRow.hide();
// If a post-add callback was supplied, call it with the added form:
if (options.added) options.added(row);
return false;
});
}
return $$;
};
/* Setup plugin defaults */
$.fn.formset.defaults = {
prefix: 'form', // The form prefix for your django formset
formTemplate: null, // The jQuery selection cloned to generate new form instances
addText: 'add another', // Text for the add link
deleteText: 'remove', // Text for the delete link
addCssClass: 'add-row', // CSS class applied to the add link
deleteCssClass: 'delete-row', // CSS class applied to the delete link
formCssClass: 'dynamic-form', // CSS class applied to each form in a formset
extraClasses: [], // Additional CSS classes, which will be applied to each form in turn
keepFieldValues: '', // jQuery selector for fields whose values should be kept when the form is cloned
added: null, // Function called each time a new form is added
removed: null // Function called each time a form is deleted
};
})(jQuery);

View File

@@ -4,9 +4,11 @@
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//kasu.at/piwik/";
var u="/piwik/";
_paq.push(['setTrackerUrl', u+'piwik.php']);
_paq.push(['setSiteId', '1']);
_paq.push(['disableCookies']);
_paq.push(['trackPageView']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s);
})();

View File

@@ -258,6 +258,7 @@ ul.tabs {
padding: 0;
}
.error, ul.errorlist li {color: #a40000;}
input.error {border-color:#a40000; background-color: rgba(164, 0, 0, 0.25);}
.game h2 {margin: 0.5em 0;}
.grid_1,.grid_2,.grid_3,.grid_4,.grid_5,.grid_6,.grid_7,.grid_8,.grid_9,.grid_10,.grid_11,.grid_12
{

View File

@@ -73,7 +73,9 @@
<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>
</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>
<div class="right"><a class="button" href="{{current_event.get_absolute_url}}">
{% 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>
<time datetime="{{next_event.start|date:'c'}}">{{next_event.start|date:'DATETIME_FORMAT' }}</time>
</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>
<div class="right"><a class="button" href="{{next_event.get_absolute_url}}">{% trans "More Details" %}
<span class="fa fa-arrow-right"></span></a></div>
@@ -181,12 +185,6 @@
{% trans "no user logged in" %} -
<a rel="nofollow" href="{% url 'membership-register' %}">{% trans "register" %}</a>
<a rel="nofollow" href="{% url 'login' %}?next={{ request.path_info }}">{% trans "login" %}</a>
<a rel="nofollow" href="{% url 'social:begin' 'facebook' %}" class="fa fa-facebook"
title="{% trans 'Login with Facebook' %}" aria-label="{% trans 'Login with Facebook' %}"></a>
<a rel="nofollow" href="{% url 'social:begin' 'twitter' %}" class="fa fa-twitter"
title="{% trans 'Login with Twitter' %}" aria-label="{% trans 'Login with Twitter' %}"></a>
<a rel="nofollow" href="{% url 'social:begin' 'google-oauth2' %}" class="fa fa-google"
title="{% trans 'Login with Google' %}" aria-label="{% trans 'Login with Google' %}"></a>
{% endif %}
</nav>
</body>

View File

@@ -5,8 +5,8 @@
<label {% if field.html_name != 'recaptcha' %} for="id_{{ field.html_name}}" {% endif %}
class="field_name {{ field.css_classes }}">{{ field.label}}</label>
{{ field }}
{% if field.help_text and not field.field.widget.input_type %}
{{field.help_text}}
{% if field.field.widget.input_type == 'checkbox' %}
<label for="id_{{field.name}}">{{field.help_text|safe}}</label>
{% elif field.help_text %}
<p class="help_text">{{field.help_text}}</p>
{% endif %}

View File

@@ -62,7 +62,6 @@ urlpatterns = [ # Ignore PyLintBear (C0103)
url(r'^(?P<path>[\-\d\w\/]+)\.html$',
views.PageHtml.as_view(), name='view-page'),
url(r'^(?P<path>[\-\d\w\/]+)\.pdf$', views.PagePdf.as_view()),
url('', include('social_django.urls', namespace='social'))
]
if settings.DEBUG:

View File

@@ -5,10 +5,11 @@ Created on 04.10.2011
@author: christian
"""
from django.contrib.auth import get_user_model
from django import forms
from django.contrib.auth import get_user_model
from django.utils.translation import ugettext as _
from events.models import Event
from . import models
USER_MODEL = get_user_model()
@@ -47,6 +48,17 @@ class HanchanForm(forms.ModelForm):
self.fields[player_input_score].widget.attrs['type'] = 'number'
self.fields[player].queryset = player_queryset
def is_valid(self):
ret = forms.Form.is_valid(self)
for field, errors in self.errors.items():
message = ", ".join(set(errors))
print(type(field), type(errors))
self.fields[field].widget.attrs.update({
'class': self.fields[field].widget.attrs.get('class', '') + ' error',
'title': message
})
return ret
class HanchanAdminForm(HanchanForm):
""" Extends the HanchanForm for users with admin privileges.
@@ -58,3 +70,9 @@ class HanchanAdminForm(HanchanForm):
""" Extend the formfields to add the confirmed checkbox. """
model = models.Hanchan
fields = HanchanForm.Meta.fields + ('confirmed',)
HanchanFormset = forms.inlineformset_factory(Event, models.Hanchan,
form=HanchanForm,
extra=1,
can_delete=True)

View File

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

View File

@@ -0,0 +1,120 @@
{% extends "events/event_detail.html" %}{% load i18n humanize thumbnail %}
{% block title %}Hanchans: {{ event.name }}{% endblock %}
{% block extra_head %}
<script type="text/javascript" src="{{ STATIC_URL }}js/jquery.min.js"></script>
<script type="text/javascript" src="{{ STATIC_URL }}js/jquery.formset.js"></script>
{% endblock %}
{% block maincontent %}
<h2 class="grid_12">{% trans 'Edit Hanchans' %}</h2>
<form method="post" action="" id="eventhanchan_form">
{% csrf_token %}
{{ formset.management_form }}
{% for form in formset %}
<fieldset class="hanchan">
{% for hidden in form.hidden_fields %} {{ hidden }} {% endfor %}
<p>
<label for="id_{{ form.start.html_name }}_0" class="field_name {{ form.start.css_classes }}">{{ form.start.label }}:</label>
{{ form.start }}
{{ form.start.errors }}
</p>
<table>
<thead>
<tr>
<th>{{form.player1.label}}</th>
<th>{{form.player2.label}}</th>
<th>{{form.player3.label}}</th>
<th>{{form.player4.label}}</th>
</tr>
</thead>
<tr>
<td>{{ form.player1 }}</td>
<td>{{ form.player2 }}</td>
<td>{{ form.player3 }}</td>
<td>{{ form.player4 }}</td>
</tr>
<tr>
<td>{{ form.player1_input_score }}</td>
<td>{{ form.player2_input_score }}</td>
<td>{{ form.player3_input_score }}</td>
<td>{{ form.player4_input_score }}</td>
</tr>
</table>
<p>
<label class="field_name {{ form.comment.css_classes }}">{% trans 'Total' %}:</label>
<input type="number" value="0" name="total_score" disabled>
<label>{% trans 'Difference' %}:</label>
<span class="difference"></span>
</p>
<p><label for="id_{{ form.comment.html_name }}" class="field_name {{ form.comment.css_classes }}">{{ form.comment.label }}:</label>
{{ form.comment }}
{{ form.comment.errors }}
</p>
{% if form.instance.pk %}
<p>
<label for="id_{{ form.DELETE.html_name }}" class="field_name {{ form.DELETE.css_classes }}">{{ form.DELETE.label }}:</label>
{{ form.DELETE }} {{form.DELETE.help_text}}
{{ form.DELETE.errors }}
</p>
{% endif %}
{% if form.non_field_errors %}
<p> {{ form.non_field_errors }}</p>
{% endif %}
</fieldset>
{% endfor %}
</form>
<script type="text/javascript">
function autofill(row) {
row.find("input[id$='start_0']").val('{{ event.start|date:"SHORT_DATE_FORMAT"}}');
row.find("input[id$='start_1']").val('{{ event.start|time:'TIME_FORMAT'}}');
}
function recalculate_score(element) {
var difference = 100000
var total = 0;
score_fields = $(element).closest('fieldset').find('input[name$="input_score"]')
total_field = $(element).closest('fieldset').find('input[name$="total_score"]')
difference_field = $(element).closest('fieldset').find('span[class="difference"]')
score_fields.each(function() {total += Number($(this).val());});
total_field.val(total)
difference = 100000 - total
if (difference > 0) {
differnence_text = difference + ' offen'
} else if (difference < 0) {
differnence_text = (0 - difference) + ' zu viel'
} else {
differnence_text = 'Ok'
}
difference_field.text(differnence_text)
}
$(function() {
$('.hanchan').formset({
prefix: '{{ formset.prefix }}',
added: autofill,
addText: '<span class="fa fa-plus-circle"></span> {% trans 'Add Hanchan' %}',
addCssClass: 'button',
deleteText:'<span class="fa fa-trash"></span> {% trans 'Delete Hanchan' %}',
deleteCssClass: 'button'
});
})
$('input[name$="_input_score"]').change(function() {recalculate_score(this);});
$('input[name$="_input_score"]').keyup(function() {recalculate_score(this);});
$('input[name$="total_score"]').each(function() {recalculate_score(this);});
</script>
{% endblock %}
{% block comments %}{% endblock %}
{% block buttonbar %}
<a class="button" href="{% url 'event-hanchan-list' event.pk %}"><span class="fa fa-undo"></span> {% trans 'back' %}</a>
<button type="submit" form="eventhanchan_form"><span class="fa fa-hdd-o"></span> {% trans 'save' %}</button>
{% endblock %}

View File

@@ -52,6 +52,7 @@
{% block buttonbar %}
{% if perms.mahjong_ranking.add_hanchan %}
<a class="button" href="{{event.get_edit_url}}"><span class="fa fa-pencil"></span> {% trans 'Edit Event' %}</a>
<a class="button" href="{% url 'event-hanchan-form' event.id %}"><span class="fa fa-pencil"></span> {% trans 'Edit Hanchans' %}</a>
<a class="button" href="{% url 'add-hanchan-form' event.id %}"><span class="fa fa-plus-circle"></span> {% trans 'Add Hanchan' %}</a>
{% endif %}
{% endblock %}

View File

@@ -1,12 +1,12 @@
{% extends "mahjong_ranking/page.html" %}
{% load i18n thumbnail %}
{% block title %}{% trans 'Player List' %}{% endblock %}
{% block title %}{% trans 'Players list' %}{% endblock %}
{% block extra_head %}
<link rel="canonical" href="{% url 'kyudanranking-list' %}?page={{page_obj.number}}" />
{% 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 %}
@@ -20,11 +20,6 @@
{% trans 'Nickname' %}
<a href="{% url 'kyudanranking-list' order_by='-username' %}?page={{page_obj.number}}" class="fa fa-sort-desc" rel="nofollow"></a>
</th>
<th>
<a href="{% url 'kyudanranking-list' order_by='+full_name'%}?page={{page_obj.number}}" class="fa fa-sort-asc" rel="nofollow"></a>
{% trans 'Full Name' %}
<a href="{% url 'kyudanranking-list' order_by='-full_name' %}?page={{page_obj.number}}" class="fa fa-sort-desc" rel="nofollow"></a>
</th>
<th>
<a href="{% url 'kyudanranking-list' order_by='+rank' %}?page={{page_obj.number}}" class="fa fa-sort-asc" rel="nofollow"></a>
{% trans 'Rank' %}
@@ -51,7 +46,6 @@
width="70" height="70" alt="" /></a>
</td>
<td><a href="{{ ranking.get_absolute_url }}">{{ ranking.user }}</a></td>
<td>{% if user.is_authenticated %}{{ranking.user.last_name}} {{ranking.user.first_name}}{% else %}---{% endif %}</td>
<td>{% if ranking.dan %} {{ranking.dan}}. Dan {% else %} {{ranking.kyu}} Kyu {% endif %}</td>
<td class="right">{% if ranking.dan %} {{ranking.dan_points}} {% else %} {{ranking.kyu_points}} {% endif %}</td>
<td class="right">{{ranking.hanchan_count}}</td>

View File

@@ -23,7 +23,6 @@
<th rowspan="2">{% trans "Rank" %}</th>
<th rowspan="2">{% trans "Avatar" %}</th>
<th rowspan="2">{% trans "Nickname" %}</th>
<th rowspan="2">{% trans "Name" %}</th>
<th colspan="2">{% trans 'Average' %}</th>
<th colspan="3">Hanchans</th>
</tr>
@@ -42,7 +41,6 @@
src="{% thumbnail player.user.avatar|default:'unknown_profile.jpg' 'avatar' %}"
width="70" height="70" class="avatar" alt=""/></a></td>
<td><a href="{{ player.get_absolute_url }}?season={{season}}">{{player.user}}</a></td>
<td>{% if user.is_authenticated %}{{player.user.last_name}} {{player.user.first_name}}{% else %}---{% endif %}</td>
<td class="center">{{player.avg_placement|floatformat:2 }}</td>
<td class="right">{{player.avg_score|floatformat:0|intcomma }}</td>
<td class="right">{{player.hanchan_count}}</td>

View File

@@ -4,14 +4,15 @@ from django.conf.urls import url
from django.views.generic import RedirectView
from . import views
urlpatterns = [ # Ignore PyLintBear (C0103)
url(r'^$',
RedirectView.as_view(url='/ranking/mahjong-ladder/', permanent=True)),
url(r'^event/(?P<event>[\d]+)/mahjong/$',
views.EventHanchanList.as_view(), name="event-hanchan-list"),
url(r'^event/(?P<event>[\d]+)/add-hanchan/$',
views.HanchanForm.as_view(), name="add-hanchan-form"),
url(r'^event/(?P<event>[\d]+)/edit/$',
views.EventHanchanForm.as_view(), name="event-hanchan-form"),
url(r'^event/(?P<event>[\d]+)/mahjong/$',
views.EventHanchanList.as_view(), name="event-hanchan-list"),
url(r'^event/(?P<event>[\d]+)/mahjong-ranking/$',
views.EventRankingList.as_view(), name="event-ranking"),
url(r'^hanchan/(?P<hanchan>[\d]+)/edit/$',
@@ -32,6 +33,7 @@ urlpatterns = [ # Ignore PyLintBear (C0103)
views.PlayerLadderScore.as_view(), name="player-ladder-score"),
url(r'^mahjong/$', views.KyuDanRankingList.as_view(),
name="kyudanranking-list"),
url(r'^mahjong/(?P<order_by>[\+\-\w]+)/$',
url(r'^mahjong/(?P<order_by>[\+\-][a-z_]+)/$',
views.KyuDanRankingList.as_view(), name="kyudanranking-list"),
]

View File

@@ -16,6 +16,7 @@ from kasu import xlsx
from . import forms, models
from .mixins import MahjongMixin
DEFAULT_KYU_DAN_ORDER = '-score'
KYU_DAN_ORDER = { # map sort URL args to Django ORM order_by args
'+full_name': ('user__last_name', 'user__first_name'),
'-full_name': ('-user__last_name', '-user__first_name'),
@@ -30,6 +31,18 @@ KYU_DAN_ORDER = { # map sort URL args to Django ORM order_by args
}
def get_kyu_dan_ranking(user=None):
"""
get the KyuDanRanking from the Database, or return a blank one
:param user: user model
:return: KyuDanRanking object
"""
try:
return models.KyuDanRanking.objects.get(user=user)
except models.KyuDanRanking.DoesNotExist:
return models.KyuDanRanking(user=user)
class DeleteHanchan(EventDetailMixin, PermissionRequiredMixin,
generic.DeleteView):
"""Deletes a Hanchan if confimration has been answerd with 'yes'."""
@@ -107,6 +120,47 @@ class HanchanForm(SuccessMessageMixin, EventDetailMixin,
'one.') % self.object
class EventHanchanForm(EventDetailMixin, PermissionRequiredMixin,
generic.TemplateView):
"""Display a Formset to add and Edit Hanchans of the specific Event."""
permission_required = 'mahjong_ranking.add_hanchan'
template_name = 'mahjong_ranking/eventhanchan_form.html'
model=models.Hanchan
def get_context_data(self, **kwargs):
self.event = models.Event.objects.get(pk=self.kwargs['event'])
context = super(EventHanchanForm, self).get_context_data()
context['formset'] = self.formset
return context
def get(self, request, *args, **kwargs):
self.get_queryset()
self.formset = forms.HanchanFormset(
instance=self.event,
initial=[{'start': self.event.start}]
)
context = self.get_context_data(**kwargs)
return self.render_to_response(context)
def post(self, request, *args, **kwargs):
print("ICH WURDE GEPOSTET!!!!")
self.get_queryset()
self.formset = forms.HanchanFormset(
self.request.POST,
self.request.FILES,
instance=self.event,
initial=[{'start': self.event.start}]
)
if self.formset.is_valid():
self.formset.save()
return django.http.HttpResponseRedirect(
reverse('event-hanchan-form', kwargs={'event': self.event.pk})
)
context = self.get_context_data(**kwargs)
return self.render_to_response(context)
class EventHanchanList(EventDetailMixin, generic.ListView):
"List all hanchans played on a given event."
model = models.Hanchan
@@ -120,15 +174,15 @@ class EventRankingList(EventDetailMixin, generic.ListView):
class KyuDanRankingList(MahjongMixin, generic.ListView):
"""List all Players with an Kyu or Dan score. """
default_order = '-score'
order_by = ''
order_by = None
paginate_by = 25
def dispatch(self, request, *args, **kwargs):
"""Set the order_by settings, revert to default_order if necessary."""
self.order_by = KYU_DAN_ORDER[
kwargs.get('order_by', self.default_order)
]
if kwargs.get('order_by') in KYU_DAN_ORDER.keys():
self.order_by = KYU_DAN_ORDER[kwargs.get('order_by')]
else:
self.order_by = KYU_DAN_ORDER[DEFAULT_KYU_DAN_ORDER]
return super(KyuDanRankingList, self).dispatch(request, *args, **kwargs)
def get_queryset(self):
@@ -164,7 +218,6 @@ class PlayerScore(LoginRequiredMixin, generic.ListView):
raise django.http.Http404(
_("No user found matching the name {}").format(
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)
@@ -206,7 +259,7 @@ class PlayerDanScore(PlayerScore):
template_name = 'mahjong_ranking/player_dan_score.html'
def get_queryset(self):
self.kyu_dan_ranking = models.KyuDanRanking.objects.get(user=self.user)
self.kyu_dan_ranking = get_kyu_dan_ranking(user=self.user)
return models.Hanchan.objects.dan_hanchans(
user=self.user,
since=self.kyu_dan_ranking.legacy_date)
@@ -262,7 +315,7 @@ class PlayerKyuScore(PlayerScore):
template_name = 'mahjong_ranking/player_kyu_score.html'
def get_queryset(self):
self.kyu_dan_ranking = models.KyuDanRanking.objects.get(user=self.user)
self.kyu_dan_ranking = get_kyu_dan_ranking(user=self.user)
return models.Hanchan.objects.kyu_hanchans(
user=self.user,
since=self.kyu_dan_ranking.legacy_date)

View File

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

View File

@@ -1,11 +1,11 @@
""" Admin Interface to manage the memberships."""
# import stuff we need from django
from django.contrib import admin
from django.contrib import admin, messages
from django.contrib.auth.admin import UserAdmin, GroupAdmin
from django.contrib.auth.models import Group
from django.core.exceptions import PermissionDenied
from django.utils.translation import ugettext as _
from easy_thumbnails import fields, widgets
from membership.models import Membership, ActivationRequest
@@ -22,7 +22,8 @@ def activate_user(modeladmin, request, queryset):
activate_user.short_description = _('Activate selected User')
def cleanup_activation(modeladmin, request, queryset): # Ignore PyLintBear (W0613)
def cleanup_activation(modeladmin, request,
queryset): # Ignore PyLintBear (W0613)
"""Delete every selected activation request that has been expired.
:param modeladmin: The ModelAdmin that triggered this action.
@@ -38,6 +39,33 @@ cleanup_activation.short_description = _(
"Cleanup selected Activation Requests")
def clear_personal_data(modeladmin, request, queryset):
"""deactivates the account and removes all personal user information.
:param modeladmin: The ModelAdmin that triggered this action.
:param request: An HttpRequest representing the current request.
:param queryset: A QuerySet containing the objects selected by the user.
"""
cleared_memberships = 0
if not modeladmin.has_delete_permission(request):
raise PermissionDenied
for membership in queryset:
if membership.membership == False:
[ setattr(membership, fieldname, None) for fieldname in membership.nullable_personal_data ]
[ setattr(membership, fieldname, "") for fieldname in membership.blankable_personal_data ]
membership.is_active = False
membership.confirmed = False
membership.membership = False
membership.save()
cleared_memberships += 1
else:
modeladmin.message_user(request, _("Can't remove personal data from active member %s.") % membership.username, messages.ERROR)
if cleared_memberships > 0:
modeladmin.message_user(request, _("Cleared %d personal data profiles.") % cleared_memberships, messages.INFO)
clear_personal_data.short_description = _("Clear personal Data")
class ProxyGroup(Group):
"""A Proxy to list Usergroups from django.contrib.auth here."""
@@ -50,6 +78,8 @@ class ProxyGroup(Group):
class MembershipAdmin(UserAdmin):
"""Admin interface to manage membership. e.g. users."""
actions = [clear_personal_data, ]
formfield_overrides = {
fields.ThumbnailerImageField: {
'widget': widgets.ImageClearableFileInput},
@@ -62,9 +92,9 @@ class MembershipAdmin(UserAdmin):
'is_active',
'membership',
'confirmed',
'paid_until',
'last_login',
)
list_editable = ('confirmed', 'paid_until',)
list_editable = ('confirmed', )
list_display_links = ('username',)
fieldsets = (
(None, {'fields': (('username', 'password'), 'gender', 'avatar',

View File

@@ -3,16 +3,16 @@ Created on 03.10.2011
@author: Christian
"""
from datetime import date, timedelta
from captcha.fields import ReCaptchaField
from django import forms
from django.conf import settings
from django.contrib import auth
from django.contrib.sites.models import Site
from django.utils.translation import ugettext_lazy as _
from utils.massmailer import MassMailer
from . import models
from content.models import Page
class MembershipForm(forms.ModelForm):
@@ -25,6 +25,10 @@ class MembershipForm(forms.ModelForm):
help_text=_('Input format: yyyy-mm-dd')
)
email = forms.EmailField(label=_('Email'), required=True)
required_membership_fields = (
'first_name', 'last_name', 'birthday',
'street_name', 'post_code', 'city'
)
class Meta:
"""get the user model dyamicly"""
@@ -35,36 +39,22 @@ class MembershipForm(forms.ModelForm):
'post_code', 'city'
)
def clean_birthday(self):
"""If the user wants to be a member the birthday field is mandatory."""
if self.cleaned_data['membership'] \
and not self.cleaned_data['birthday']:
raise forms.ValidationError(_('For your membership, we need this. \
Please fill out this field yet.'))
return self.cleaned_data['birthday']
def clean_street_name(self):
"""If the user wants to be a member the address is mandatory."""
if self.cleaned_data['membership'] \
and not self.cleaned_data['street_name']:
raise forms.ValidationError(_('For your membership, we need this. \
Please fill out this field yet.'))
return self.cleaned_data['street_name']
def clean_post_code(self):
"""If the user wants to be a member the address is mandatory."""
if self.cleaned_data['membership'] \
and not self.cleaned_data['post_code']:
raise forms.ValidationError(_('For your membership, we need this. \
Please fill out this field yet.'))
return self.cleaned_data['post_code']
def clean_city(self):
"""If the user wants to be a member the address is mandatory."""
if self.cleaned_data['membership'] and not self.cleaned_data['city']:
raise forms.ValidationError(_('For your membership, we need this. \
Please fill out this field yet.'))
return self.cleaned_data['city']
def clean(self):
cleaned_data = super().clean()
errormsg = _('For your membership, we need this. \
Please fill out this field yet.')
membership = cleaned_data.get('membership')
for fieldname in self.required_membership_fields:
if membership and not cleaned_data.get(fieldname):
self.add_error(fieldname, errormsg)
if membership and cleaned_data.get('birthday'):
birthday = cleaned_data.get('birthday')
today = date.today()
age = today.year - birthday.year - (
(today.month, today.day) < (birthday.month, birthday.day))
if age < 16:
self.add_error('birthday',
'Midestalter für Mitlieder ist 16 Jahre!')
class RegistrationForm(MembershipForm):
@@ -78,6 +68,18 @@ class RegistrationForm(MembershipForm):
widget=forms.PasswordInput(), label=_('password'))
password2 = forms.CharField(
widget=forms.PasswordInput(), label=_('password (again)'))
privacy_policy = forms.BooleanField(
label=_('Privacy policy'),
help_text=_(
'I have read and understood the <a href="%s">privacy policy</a>') %
Page.objects.get(slug='privacypolicy').get_absolute_url())
membership = forms.BooleanField(
label=_('Membership'),
help_text=_(
'Yes, I confirm that I am in agreement with the '
'<a href="%s">statutes</a> and would like to become a member.') %
Page.objects.get(slug='statutes').get_absolute_url())
recaptcha = ReCaptchaField()
class Meta:
@@ -86,7 +88,7 @@ class RegistrationForm(MembershipForm):
fields = ('first_name', 'last_name', 'username', 'email',
'username', 'gender', 'first_name', 'last_name', 'email',
'avatar',
'website', 'membership', 'birthday', 'telephone',
'membership', 'birthday', 'telephone',
'street_name',
'post_code', 'city'
)

View File

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

View File

@@ -7,8 +7,8 @@ from os import path
from django.conf import settings
from django.contrib.auth.models import AbstractUser
from django.urls import reverse
from django.db import models
from django.urls import reverse
from django.utils import timezone
from django.utils.translation import ugettext as _
from easy_thumbnails.fields import ThumbnailerImageField
@@ -150,7 +150,7 @@ class Membership(AbstractUser):
max_length=1,
choices=GENDER_CHOICES,
blank=True,
null=True
null=True,
)
website = models.URLField(blank=True)
avatar = ThumbnailerImageField(
@@ -206,8 +206,10 @@ class Membership(AbstractUser):
help_text=_('This person has paid the membership fee.')
)
# comment = models.TextField(blank=True)
# objects = MembershipManager()
nullable_personal_data = (
'gender', 'birthday', 'telephone', 'street_name', 'post_code', 'city')
blankable_personal_data = (
'email', 'password', 'first_name', 'last_name', 'website',)
class Meta(object):
"""To manage object ordering and dispalynames on the admin interface."""

View File

@@ -1,5 +1,4 @@
{% extends "base.html" %}
{% load i18n comments thumbnail %}
{% extends "base.html" %}{% load i18n comments thumbnail %}
{% block title %}{{ membership.first_name }} {{membership.last_name}}{% endblock %}
@@ -12,79 +11,56 @@
<li><a href="{% url 'player-dan-score' membership.username %}">{% trans "Dan Hanchans" %}</a></li>
<li><a href="{% url 'player-invalid-score' membership.username %}">{% trans "Invalid Hanchans" %}</a></li>
<li><a href="{% url 'maistar-player-games' membership.username %}">{% trans "Mai-Star Games" %}</a></li>
</ul>
{% endblock %}
</ul>{% endblock %}
{% block maincontent %}
{% if membership.avatar %}
<img class="grid_3" src="{% thumbnail membership.avatar '220x220' crop='smart' %}" alt="{% trans 'Profile Image' %}"/>
{% else %}
<div class="grid_3"> Noch kein Foto hoch geladen</div>
{% endif %}
{% block maincontent %}{% if membership.avatar %}
<img class="grid_3" src="{% thumbnail membership.avatar '220x220' crop='smart' %}" alt="{% trans 'Profile Image' %}"/>{% else %}
<div class="grid_3"> Noch kein Foto hoch geladen</div>{% endif %}
<div class="grid_6">
<ul>
<li><strong>Name:</strong> {{membership.first_name}} {{membership.last_name}}</li>
<li><strong>{% trans "Member Since" %}:</strong> {{membership.date_joined}}</li>
<li><strong>{% trans "Last Login" %}:</strong> {{membership.last_login}}</li>
{% if website %}
<li><strong>Homepage:</strong> <a href="{{website}}">{{website}}</a></li>
{% endif %}
</ul>
<div class="{% if membership == user or perms.membership.change_membership%}grid_4{% else %}grid_9{% endif %}" >
{% if kyu_dan_ranking %}
<h3>Mahjong</h3>
<ul>
{% if kyu_dan_ranking.dan %}
<li>
<strong>{{kyu_dan_ranking.dan}}. Dan: </strong> {{ kyu_dan_ranking.dan_points }} {% trans 'Points' %}
({% trans 'Maximum' %}: {{ kyu_dan_ranking.max_dan_points }})
<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%}
<li><strong>{{kyu_dan_ranking.kyu}}. Kyu: </strong> {{ kyu_dan_ranking.kyu_points }} {% trans 'Points' %}</li>
{% endif %}
<li><strong>{% trans 'Games Total' %}: </strong> {{ kyu_dan_ranking.hanchan_count }} Hanchans -
{{kyu_dan_ranking.won_hanchans }} {% trans 'Won' %} / {{ kyu_dan_ranking.good_hanchans }} {% trans 'Good' %}
<li>
<strong>{% trans 'Games Total' %}: </strong> {{ kyu_dan_ranking.hanchan_count }} Hanchans - {{kyu_dan_ranking.won_hanchans }} {% trans 'Won' %} / {{ kyu_dan_ranking.good_hanchans }} {% trans 'Good' %}
</li>
<li><strong>{% trans 'Current Season' %}: </strong> {{ ladder_ranking.hanchan_count }} Hanchans - {{ ladder_ranking.won_hanchans }} {% trans 'Won' %} / {{ ladder_ranking.good_hanchans }} {% trans 'Good' %}
<li>
<strong>{% trans 'Current Season' %}: </strong> {{ ladder_ranking.hanchan_count }} Hanchans - {{ ladder_ranking.won_hanchans }} {% trans 'Won' %} / {{ ladder_ranking.good_hanchans }} {% trans 'Good' %}
</li>
</ul>
{% endif %}
</div>
{% if membership == user or perms.membership.change_membership%}
<div class="grid_5">
<h3>{% trans 'private data' %}</h3>
<p>{% blocktrans %}This data can only be seen by yourself and members of the board.{% endblocktrans %} </p>
<ul>
{% if membership.first_name %}<li><strong>{% trans "name" %}:</strong> {{membership.first_name}} {{membership.last_name}}</li>{% endif %}
{% if membership.birthday %}<li><strong>{% trans "birthday" %}:</strong> {{membership.birthday}}</li>{% endif %}
{% if membership.street_name %}<li><strong>{% trans "Address" %}:</strong> <address>{{ membership.street_name }}<br/> {{ membership.post_code }} {{ membership.city }}</address></li>{% endif %}
{% if membership.email %}<li><strong>{% trans "Email" %}:</strong> <a href="mailto:{{ membership.email }}">{{membership.email}}</a></li>{% endif %}
{% if membership.telephone %}<li><strong>{% trans "Telephone" %}:</strong> <a href="tel:{{ membership.telephone }}">{{membership.telephone}}</a></li>{% endif %}
<li><strong>{% trans "Member Since" %}:</strong> {{membership.date_joined}}</li>
<li><strong>{% trans "Last Login" %}:</strong> {{membership.last_login}}</li>
</ul>
{% ifequal membership user %}
<div class="grid_3">
<a href="{% url 'membership-edit' membership.username %}" class="button">
<span class="fa fa-pencil"></span>
{% trans "Edit Profile" %}
</a>
<a href="{% url 'password_change' %}" class="button">
<span class="fa fa-key"></span>
{% trans 'Change Password' %}
</a>
<a class="button" href="{% url 'social:begin' 'facebook' %}" rel="nofollow">
<span class="fa fa-facebook"></span>
{% blocktrans with 'Facebook' as name %}Associate with {{ name }}{% endblocktrans %}
</a>
<a class="button" href="{% url 'social:begin' 'twitter' %}" rel="nofollow">
<span class="fa fa-twitter"></span>
{% blocktrans with 'Twitter' as name %}Associate with {{ name }}{% endblocktrans %}
</a>
<a class="button" href="{% url 'social:begin' 'google-oauth2' %}" rel="nofollow">
<span class="fa fa-google-plus"></span>
{% blocktrans with 'Google' as name %}Associate with {{ name }}{% endblocktrans %}
</a>
</div>
<a href="{% url 'membership-edit' membership.username %}" class="button"> <span class="fa fa-pencil"></span> {% trans "Edit Profile" %} </a>
<a href="{% url 'password_change' %}" class="button"> <span class="fa fa-key"></span> {% trans 'Change Password' %}</a>
{% endifequal %}
{% block score_list %} {% endblock %}
{% endblock %}
{% block comments %}
{% if membership %}
{% render_comment_list for membership %}
{% render_comment_form for membership %}
</div>
{% endif %}
{% endblock %}
{% block score_list %} {% endblock %}{% endblock %}
{% block comments %}{% if membership %}{% render_comment_list for membership %}{% render_comment_form for membership %}{% endif %}{% endblock %}
{% block buttonbar%}{%endblock%}

View File

@@ -3,37 +3,25 @@
{% block title %}{% trans "Registration"%}{% endblock %}
{% block teaser%}
<h1>{% trans "Registration"%}</h1>
<div id="teaser_text">
{% blocktrans %}After you've provided your account data, you'll receive
an email asking you to verify your email address. You have to click on the
link in this verification email to confirm your email address, otherwise
your can't login.{% endblocktrans %}
</div>
{% endblock %}
{% block maincontent %}
<form method="post" action="{% url 'membership-register' %}">
{% csrf_token %}
<fieldset class="grid_5">
<legend>{% trans "name"%}</legend>
{% get_fieldset "gender, first_name, last_name, username" from form as form1 %}
{% with form1 as form %}{% include "form.html" %}{% endwith %}
</fieldset>
<fieldset class="grid_7">
<legend>{% trans "login"%}</legend>
{% get_fieldset "email, password1, password2, recaptcha" from form as form1 %}
<legend>{% trans "Login crendentials"%}</legend>
{% get_fieldset "username, email, password1, password2, privacy_policy, recaptcha" from form as form1 %}
{% with form1 as form %}{% include "form.html" %}{% endwith %}
</fieldset>
<fieldset class="grid_12">
<legend>{% trans "Membership"%}</legend>
{% get_fieldset "membership, birthday, street_name, post_code, city, telephone, website" from form as form2 %}
<fieldset class="grid_5">
<legend>{% trans "Club membership"%}</legend>
{% get_fieldset "membership, first_name, last_name, gender, birthday, street_name, post_code, city, telephone" from form as form2 %}
{% with form2 as form %}{% include "form.html" %}{% endwith %}
</fieldset>
<div class="grid_12">
{{ current_page.content }}
</div>
<div class="grid_12">
<p class="buttonbar">
<button type="reset"><span class="fa fa-undo"></span> {% trans 'reset' %}
@@ -42,4 +30,18 @@
</p>
</div>
</form>
<script type="text/javascript">
function togglePersonalData(event) {
var membership = document.getElementById("id_membership").checked;
var input_elements = ["id_first_name", "id_last_name", "id_gender", "id_birthday", "id_street_name", "id_post_code", "id_city", "id_telephone"];
for (var i = 0; i < input_elements.length; i++) {
element_id = input_elements[i]
element = document.getElementById(element_id);
element.disabled = !membership;
};
};
document.addEventListener('DOMContentLoaded',function() {document.querySelector('#id_membership').onchange=togglePersonalData;},false);
togglePersonalData();
</script>
{% endblock %}

View File

@@ -0,0 +1,6 @@
{% extends "base.html" %}{% load i18n %}
{% block content %}
{{ current_page.content }}
{% endblock %}

View File

@@ -1,72 +1,32 @@
{% extends "base.html" %}
{% load i18n %}
{% extends "base.html" %}{% load i18n %}
{% block title %}{% trans 'Login' %}{% endblock %}
{% block description %}Anmelden auf Kasu.at{% endblock %}
{% block extra_head %}
<link rel="canonical" href="{% url 'login' %}"/>
{% endblock %}
<link rel="canonical" href="{% url 'login' %}"/>{% endblock %}
{% block teaser %}<h1>{% trans 'Login' %}</h1>{% endblock %}
{% block maincontent %}
<form method="post" action="{% url 'login' %}">
<h2 class="grid_12">Auf der Seite Anmelden</h2>
<div class="grid_7">
<h2>{% trans "Have you already registered?" %}</h2>
{% blocktrans %}
<p>As a registered member you can:</p>
<ul>
<li>leave comments on this page.</li>
<li>subscribe to our Newsletter</li>
<li>apply to a membership to our club</li>
<li>club-members have access to our ranking-system</li>
</ul>
{% endblocktrans %}
{% blocktrans %}
<p>You can register here with your Google, or Facebook account.
If you don't own such an account, or do not want to use it for
authentication,
you can fill out our registration form.</p>
{% endblocktrans %}
<p class="buttonbar">
<a href="{% url 'membership-register' %}" class="button"><span
class="fa fa-user-plus"></span> {%trans "register"%}</a></p>
{% csrf_token %}
<div class="grid_6">
{{ current_page.content }}
</div>
{% csrf_token %}
<fieldset class="grid_5">
<div class="grid_6">
<fieldset>
<legend>{% trans 'login' %}</legend>
{% csrf_token %}
{% include 'form.html' %}
{% if form.errors %}
<p>{% blocktrans %}Your username and password didn't match. Please try
again.{% endblocktrans %}</p>
{% endif %}
<input type="hidden" name="next" value="{{next}}"/>
<p><a href="{% url 'password_reset' %}">
{% trans 'Forgot your Password?'%}</a></p>
{% csrf_token %} {% include 'form.html' %} {% if form.errors %}
<p>{% blocktrans %}Your username and password didn't match. Please try again.{% endblocktrans %}</p>
{% endif %} <input type="hidden" name="next" value="{{next}}"/>
<p>
<a href="{% url 'password_reset' %}"> {% trans 'Forgot your Password?'%}</a>
</p>
<div class="buttonbar">
<button type="submit"><span class="fa fa-sign-in"></span>
{% trans 'Login' %}
<button type="submit">
<span class="fa fa-sign-in"></span> {% trans 'Login' %}
</button>
</div>
</fieldset>
<div class="grid_5">
<h2>{% trans "or login with an existing Account" %}</h2>
<a rel="nofollow" href="{% url 'social:begin' 'facebook' %}"><span
class="fa fa-facebook fa-5x"
title="{% trans 'Login with Facebook' %}"></span></a>
<a rel="nofollow" href="{% url 'social:begin' 'twitter' %}"><span
class="fa fa-twitter fa-5x"
title="{% trans 'Login with Twitter' %}"></span></a>
<a rel="nofollow" href="{% url 'social:begin' 'google-oauth2' %}"><span
class="fa fa-google-plus fa-5x"
title="{% trans 'Login with Google' %}"></span></a>
</div>
</form>
{% endblock %}

View File

@@ -9,6 +9,7 @@ from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$',views.MembershipDetail.as_view()),
url(r'^activate/(?P<activation_key>[\d\w]+)/$',
views.ActivateRegistration.as_view(),
name='membership-activate-registration'),

File diff suppressed because it is too large Load Diff