From 9c2413a7944c9f60578f2a16dc2b59ac67874624 Mon Sep 17 00:00:00 2001 From: Christian Berg Date: Sun, 14 Dec 2014 23:57:40 +0100 Subject: [PATCH] =?UTF-8?q?Stylesheets=20werden=20nur=20mit=20Less=20erzeu?= =?UTF-8?q?gt.=20Damit=20k=C3=B6nnen=20sie=20gleich=20optimiert=20werden.?= =?UTF-8?q?=20jQuery=20wurde=20entfernt.=20=C3=9Cbersetzungen=20wurden=20k?= =?UTF-8?q?orrigiert.=20Neue=20sync.sh=20Datei,=20welche=20=C3=A4nderungen?= =?UTF-8?q?=20mit=20rsync=20auf=20den=20Server=20spielt=20und=20das=20neul?= =?UTF-8?q?aden=20erzwingt.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 8 +- .idea/encodings.xml | 1 + .idea/kasu.iml | 34 +- .idea/misc.xml | 2 +- cleanup.sh | 2 +- content/locale/de/LC_MESSAGES/django.po | 41 +- content/templates/content/article_form.html | 4 - content/templates/content/page.html | 16 +- content/views.py | 8 + events/locale/de/LC_MESSAGES/django.po | 26 +- events/templates/events/event_form.html | 25 +- events/views.py | 10 +- files_to_sync.txt | 13 + gallery/templates/gallery/photo_gallery.html | 20 - gallery/templates/gallery/photo_upload.html | 5 +- kasu/image_models.py | 6 +- kasu/locale/de/LC_MESSAGES/django.mo | Bin 16002 -> 18153 bytes kasu/locale/de/LC_MESSAGES/django.po | 114 ++-- kasu/settings/base.py | 2 + kasu/static/css/background.png | Bin 119339 -> 0 bytes kasu/static/css/{common.css => common.less} | 31 +- kasu/static/css/desktop.css | 500 ---------------- kasu/static/css/desktop.less | 563 ++++++++++++++++++ kasu/static/css/jquery-ui-1.8.16.custom.css | 411 ------------- kasu/static/css/kasu.less | 7 + kasu/static/css/mobile.css | 348 ----------- kasu/static/css/mobile.less | 462 ++++++++++++++ kasu/static/css/print.css | 71 --- kasu/static/css/print.less | 87 +++ kasu/static/fonts/stylesheet.css | 16 - kasu/static/img/footer-bg.old | Bin 2713 -> 0 bytes kasu/static/img/footer_bg.png | Bin 86519 -> 82965 bytes kasu/static/img/navigation-mobile.png | Bin 0 -> 3925 bytes .../ui-bg_diagonals-thick_18_b81900_40x40.png | Bin 260 -> 0 bytes .../ui-bg_diagonals-thick_20_666666_40x40.png | Bin 251 -> 0 bytes .../img/ui-bg_flat_10_000000_40x100.png | Bin 178 -> 0 bytes .../img/ui-bg_glass_100_f6f6f6_1x400.png | Bin 104 -> 0 bytes .../img/ui-bg_glass_100_fdf5ce_1x400.png | Bin 125 -> 0 bytes .../img/ui-bg_glass_65_ffffff_1x400.png | Bin 105 -> 0 bytes .../ui-bg_gloss-wave_35_f6a828_500x100.png | Bin 3762 -> 0 bytes .../ui-bg_highlight-soft_100_eeeeee_1x100.png | Bin 90 -> 0 bytes .../ui-bg_highlight-soft_75_ffe45c_1x100.png | Bin 129 -> 0 bytes kasu/static/img/ui-icons_222222_256x240.png | Bin 4369 -> 0 bytes kasu/static/img/ui-icons_228ef1_256x240.png | Bin 4369 -> 0 bytes kasu/static/img/ui-icons_ef8c08_256x240.png | Bin 4369 -> 0 bytes kasu/static/img/ui-icons_ffd27a_256x240.png | Bin 4369 -> 0 bytes kasu/static/img/ui-icons_ffffff_256x240.png | Bin 4369 -> 0 bytes kasu/static/js/jquery-1.6.2.min.js | 18 - kasu/static/js/jquery-ui-1.8.16.custom.min.js | 227 ------- kasu/static/js/jquery.ui.datepicker-de.js | 23 - kasu/static/js/jquery.ui.datepicker-en.js | 23 - kasu/templates/base.html | 61 +- kasu/templates/index.html | 41 +- .../locale/de/LC_MESSAGES/django.po | 4 +- mahjong_ranking/views.py | 3 +- maistar_ranking/__init__.py | 0 maistar_ranking/admin.py | 64 ++ maistar_ranking/forms.py | 37 ++ .../locale/de/LC_MESSAGES/django.mo | Bin 0 -> 2996 bytes .../locale/de/LC_MESSAGES/django.po | 272 +++++++++ maistar_ranking/managers.py | 60 ++ maistar_ranking/models.py | 221 +++++++ maistar_ranking/settings.py | 24 + .../templates/maistar_ranking/game_form.html | 87 +++ .../templates/maistar_ranking/game_list.html | 44 ++ .../hanchan_confirm_delete.html | 26 + .../templates/maistar_ranking/page.html | 9 + .../maistar_ranking/player_game_list.html | 55 ++ .../maistar_ranking/ranking_list.html | 79 +++ maistar_ranking/urls.py | 32 + maistar_ranking/views.py | 121 ++++ membership/locale/de/LC_MESSAGES/django.po | 2 +- requirements/base.txt | 16 +- requirements/development.txt | 2 + sync.sh | 12 + utils/locale/de/LC_MESSAGES/django.po | 2 +- 76 files changed, 2514 insertions(+), 1884 deletions(-) create mode 100644 files_to_sync.txt delete mode 100644 kasu/static/css/background.png rename kasu/static/css/{common.css => common.less} (96%) delete mode 100644 kasu/static/css/desktop.css create mode 100644 kasu/static/css/desktop.less delete mode 100644 kasu/static/css/jquery-ui-1.8.16.custom.css create mode 100644 kasu/static/css/kasu.less delete mode 100644 kasu/static/css/mobile.css create mode 100644 kasu/static/css/mobile.less delete mode 100644 kasu/static/css/print.css create mode 100644 kasu/static/css/print.less delete mode 100644 kasu/static/fonts/stylesheet.css delete mode 100644 kasu/static/img/footer-bg.old create mode 100644 kasu/static/img/navigation-mobile.png delete mode 100644 kasu/static/img/ui-bg_diagonals-thick_18_b81900_40x40.png delete mode 100644 kasu/static/img/ui-bg_diagonals-thick_20_666666_40x40.png delete mode 100644 kasu/static/img/ui-bg_flat_10_000000_40x100.png delete mode 100644 kasu/static/img/ui-bg_glass_100_f6f6f6_1x400.png delete mode 100644 kasu/static/img/ui-bg_glass_100_fdf5ce_1x400.png delete mode 100644 kasu/static/img/ui-bg_glass_65_ffffff_1x400.png delete mode 100644 kasu/static/img/ui-bg_gloss-wave_35_f6a828_500x100.png delete mode 100644 kasu/static/img/ui-bg_highlight-soft_100_eeeeee_1x100.png delete mode 100644 kasu/static/img/ui-bg_highlight-soft_75_ffe45c_1x100.png delete mode 100644 kasu/static/img/ui-icons_222222_256x240.png delete mode 100644 kasu/static/img/ui-icons_228ef1_256x240.png delete mode 100644 kasu/static/img/ui-icons_ef8c08_256x240.png delete mode 100644 kasu/static/img/ui-icons_ffd27a_256x240.png delete mode 100644 kasu/static/img/ui-icons_ffffff_256x240.png delete mode 100644 kasu/static/js/jquery-1.6.2.min.js delete mode 100644 kasu/static/js/jquery-ui-1.8.16.custom.min.js delete mode 100644 kasu/static/js/jquery.ui.datepicker-de.js delete mode 100644 kasu/static/js/jquery.ui.datepicker-en.js create mode 100644 maistar_ranking/__init__.py create mode 100644 maistar_ranking/admin.py create mode 100644 maistar_ranking/forms.py create mode 100644 maistar_ranking/locale/de/LC_MESSAGES/django.mo create mode 100644 maistar_ranking/locale/de/LC_MESSAGES/django.po create mode 100644 maistar_ranking/managers.py create mode 100644 maistar_ranking/models.py create mode 100644 maistar_ranking/settings.py create mode 100644 maistar_ranking/templates/maistar_ranking/game_form.html create mode 100644 maistar_ranking/templates/maistar_ranking/game_list.html create mode 100644 maistar_ranking/templates/maistar_ranking/hanchan_confirm_delete.html create mode 100644 maistar_ranking/templates/maistar_ranking/page.html create mode 100644 maistar_ranking/templates/maistar_ranking/player_game_list.html create mode 100644 maistar_ranking/templates/maistar_ranking/ranking_list.html create mode 100644 maistar_ranking/urls.py create mode 100644 maistar_ranking/views.py create mode 100644 requirements/development.txt create mode 100755 sync.sh diff --git a/.gitignore b/.gitignore index aedb730..376d3b6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,12 @@ *.pyc htdocs/ -static/ +/static/ media/ -.idea -.gitignore +virtenv/ .idea/ +.gitignore .project .pydevproject .settings/ *~ -maistar_ranking +/kasu/static/css/kasu.css diff --git a/.idea/encodings.xml b/.idea/encodings.xml index f758959..a9cbb77 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -1,6 +1,7 @@ + \ No newline at end of file diff --git a/.idea/kasu.iml b/.idea/kasu.iml index 570a567..c99f841 100644 --- a/.idea/kasu.iml +++ b/.idea/kasu.iml @@ -11,8 +11,38 @@ - - + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 95ff5db..487c69b 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/cleanup.sh b/cleanup.sh index 468fa96..530f585 100755 --- a/cleanup.sh +++ b/cleanup.sh @@ -18,6 +18,6 @@ export DJANGO_SETTINGS_MODULE="kasu.settings.production" echo "lösche den Python Compiler Cache..." find . -name "*.pyc" -exec rm -rf {} \; -./manage.py collectstatic --noinput +./manage.py collectstatic --noinput -c ./manage.py generateimages touch kasu/wsgi.py diff --git a/content/locale/de/LC_MESSAGES/django.po b/content/locale/de/LC_MESSAGES/django.po index be3413e..674eaa2 100644 --- a/content/locale/de/LC_MESSAGES/django.po +++ b/content/locale/de/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: kasu.content\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-12-09 20:35+0100\n" +"POT-Creation-Date: 2014-12-14 01:12+0100\n" "PO-Revision-Date: 2014-12-08 16:15+0100\n" "Last-Translator: Christian Berg \n" "Language-Team: Kasu \n" @@ -135,12 +135,21 @@ msgstr "Kategorien" msgid "This Category does not exist." msgstr "Diese Kategorie existiert nicht." -#: views.py:152 +#: views.py:93 templates/content/article_detail.html:52 +#: templates/content/article_form.html:17 +msgid "Edit Article" +msgstr "Artikel bearbeiten" + +#: views.py:95 templates/content/article_form.html:17 +msgid "Create Article" +msgstr "Artikel erstellen" + +#: views.py:160 #, python-format msgid "No Page found matching the Path %s" msgstr "Keine Seite unter dem Pfad %s gefunden" -#: views.py:166 +#: views.py:174 #, python-format msgid "No PDF Document found matching the Path %s" msgstr "Kein PDF Dokument unter dem Pfad %s gefunden." @@ -205,39 +214,24 @@ msgstr "Auf Twitter teilen" msgid "Share on Facebook" msgstr "Auf Facebook teilen" -#: templates/content/article_detail.html:52 -#: templates/content/article_form.html:5 -#: templates/content/article_form.html:21 -msgid "Edit Article" -msgstr "Artikel bearbeiten" - -#: templates/content/article_form.html:5 -#: templates/content/article_form.html:21 -msgid "Create Article" -msgstr "Artikel erstellen" - -#: templates/content/article_form.html:26 templates/content/page_form.html:29 +#: templates/content/article_form.html:22 templates/content/page_form.html:29 #: templates/content/page_form.html:35 msgid "German" msgstr "Deutsch" -#: templates/content/article_form.html:27 templates/content/page_form.html:30 +#: templates/content/article_form.html:23 templates/content/page_form.html:30 #: templates/content/page_form.html:39 msgid "English" msgstr "Englisch" -#: templates/content/article_form.html:40 templates/content/page_form.html:50 +#: templates/content/article_form.html:36 templates/content/page_form.html:50 msgid "reset" msgstr "Zurücksetzen" -#: templates/content/article_form.html:41 templates/content/page_form.html:51 +#: templates/content/article_form.html:37 templates/content/page_form.html:51 msgid "save" msgstr "Speichern" -#: templates/content/page.html:23 -msgid "Subpages" -msgstr "Unterseiten" - #: templates/content/page_form.html:4 templates/content/page_form.html:24 msgid "Edit Page" msgstr "Seite bearbeiten" @@ -249,3 +243,6 @@ msgstr "Seite hinzufügen" #: templates/content/page_form.html:45 msgid "HTML Specific" msgstr "HTML spezifisch" + +#~ msgid "Subpages" +#~ msgstr "Unterseiten" diff --git a/content/templates/content/article_form.html b/content/templates/content/article_form.html index b2a9b8d..b03f997 100644 --- a/content/templates/content/article_form.html +++ b/content/templates/content/article_form.html @@ -1,10 +1,6 @@ {% extends "base.html" %} {% load i18n fieldset_extras %} -{% block title %} - {% if object.pk %}{% trans "Edit Article" %}{% else %}{% trans "Create Article" %}{% endif %} -{% endblock %} - {% block extra_head %} diff --git a/content/templates/content/page.html b/content/templates/content/page.html index 5ca85ba..505ade2 100644 --- a/content/templates/content/page.html +++ b/content/templates/content/page.html @@ -14,18 +14,20 @@ {% endblock %} {% block content %} -

{{ page.title }}

- {{ page.content }} + {{ page.content }} {% endblock %} {% block sidebar %} {% if current_top_page.subpages %} -

{% trans "Subpages" %}

{% for subpage in current_top_page.subpages.all %} -

{{subpage.menu_name}}

- + {% if subpage.content_type > 0 %} +

{{subpage.menu_name}}

+ + {% endif %} {% endfor %} {% endif %} {% endblock %} diff --git a/content/views.py b/content/views.py index db7814b..d216d9f 100644 --- a/content/views.py +++ b/content/views.py @@ -87,6 +87,14 @@ class ArticleForm(PermissionRequiredMixin, generic.UpdateView): form_class = forms.ArticleForm permission_required = 'content.change_article' + def get_context_data(self, **kwargs): + context = super(ArticleForm, self).get_context_data(**kwargs) + if self.kwargs.get('pk'): + context['title'] = _("Edit Article") + else: + context['title'] = _("Create Article") + return context + def get_object(self, **kwargs): if self.kwargs.get('pk', None): return models.Article.objects.get(pk=self.kwargs['pk']) diff --git a/events/locale/de/LC_MESSAGES/django.po b/events/locale/de/LC_MESSAGES/django.po index 0ec2a8f..a58f450 100644 --- a/events/locale/de/LC_MESSAGES/django.po +++ b/events/locale/de/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: kasu.events\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-12-09 20:35+0100\n" +"POT-Creation-Date: 2014-12-14 01:12+0100\n" "PO-Revision-Date: 2014-12-08 16:06+0100\n" "Last-Translator: Christian Berg \n" "Language-Team: Kasu \n" @@ -116,7 +116,17 @@ msgstr "Veranstaltungsort" msgid "Venues" msgstr "Veranstaltungsorte" -#: views.py:193 +#: views.py:101 templates/events/event_detail.html:110 +#: templates/events/event_form.html:9 +msgid "Edit Event" +msgstr "Termin bearbeiten" + +#: views.py:103 templates/events/event_form.html:9 +#: templates/events/page.html:15 +msgid "Add Event" +msgstr "Neuer Termin" + +#: views.py:199 msgid "Event does not exist" msgstr "Veranstaltung gibt es nicht" @@ -205,19 +215,11 @@ msgstr "Auf Facebook teilen" msgid "Show on Google Maps" msgstr "Auf Google Maps zeigen" -#: templates/events/event_detail.html:110 templates/events/event_form.html:13 -msgid "Edit Event" -msgstr "Termin bearbeiten" - -#: templates/events/event_form.html:13 templates/events/page.html:15 -msgid "Add Event" -msgstr "Neuer Termin" - -#: templates/events/event_form.html:23 +#: templates/events/event_form.html:19 msgid "reset" msgstr "Zurücksetzen" -#: templates/events/event_form.html:24 +#: templates/events/event_form.html:20 msgid "save" msgstr "Speichern" diff --git a/events/templates/events/event_form.html b/events/templates/events/event_form.html index 074846a..fa9c4f0 100644 --- a/events/templates/events/event_form.html +++ b/events/templates/events/event_form.html @@ -1,10 +1,6 @@ {% extends "events/page.html" %} {% load i18n %} - -{% block extra_head %} - - -{% endblock %} +{% block title %}{{ title }}{% endblock %} {% block maincontent %}
@@ -29,21 +25,4 @@
{% endblock %} -{% block buttonbar %}{% endblock %} - -{% block javascript %} -$(function() { - $.datepicker.setDefaults($.datepicker.regional['{{LANGUAGE_CODE}}']); - $( "#id_start_0" ).datepicker({ - changeMonth: true, - changeYear: true, - dateFormat: 'yy-mm-dd' - }); - $( "#id_end_0" ).datepicker({ - changeMonth: true, - changeYear: true, - dateFormat: 'yy-mm-dd', - }); -}); - -{% endblock %} +{% block buttonbar %}{% endblock %} \ No newline at end of file diff --git a/events/views.py b/events/views.py index b6a9460..4819353 100644 --- a/events/views.py +++ b/events/views.py @@ -88,8 +88,6 @@ class EventDetailMixin(object): context['event'] = self.event else: context['event'] = self.object.event - print "EventDetailMixin" - print dir(context['event']) return context @@ -97,6 +95,14 @@ class EventForm(PermissionRequiredMixin, generic.UpdateView): form_class = forms.EventForm permission_required = 'events.add_event' + def get_context_data(self, **kwargs): + context = super(EventForm, self).get_context_data(**kwargs) + if self.kwargs.get('pk'): + context['title'] = _("Edit Event") + else: + context['title'] = _("Add Event") + return context + def get_object(self, queryset=None): """ If an id has been submitted, try return the existing Event for an update, diff --git a/files_to_sync.txt b/files_to_sync.txt new file mode 100644 index 0000000..bea88e0 --- /dev/null +++ b/files_to_sync.txt @@ -0,0 +1,13 @@ +aggregator +content +events +gallery +kasu +mahjong_ranking +maistar_ranking +membership +requirements +static +utils +cleanup.sh +manage.py diff --git a/gallery/templates/gallery/photo_gallery.html b/gallery/templates/gallery/photo_gallery.html index f63c56f..163a7d3 100644 --- a/gallery/templates/gallery/photo_gallery.html +++ b/gallery/templates/gallery/photo_gallery.html @@ -1,26 +1,6 @@ {% extends "base.html" %} {% load i18n %} -{% block teaser %}

{{page.title}}{% trans 'Photos' %}

{% endblock %} - -{% block navigation %} - -{% endblock %} - {% block maincontent %} {% for event in event_list %} "+(i[0]>0&&G==i[1]-1?'
':""):"");O+=y}w+=O}w+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'': -"");a._keyEvent=false;return w},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var j=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),k='
',o="";if(h||!j)o+=''+i[b]+"";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='"}u||(k+=o+(h||!(j&&l)?" ":""));if(!a.yearshtml){a.yearshtml="";if(h||!l)k+=''+c+"";else{g=this._get(a,"yearRange").split(":");var s=(new Date).getFullYear();i=function(q){q=q.match(/c[+-].*/)?c+parseInt(q.substring(1),10):q.match(/[+-].*/)?s+parseInt(q,10):parseInt(q,10);return isNaN(q)?s:q};b=i(g[0]);g=Math.max(b,i(g[1]||""));b=e?Math.max(b, -e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(a.yearshtml+='";k+=a.yearshtml;a.yearshtml=null}}k+=this._get(a,"yearSuffix");if(u)k+=(h||!(j&&l)?" ":"")+o;k+="
";return k},_adjustInstDate:function(a,b,c){var e=a.drawYear+(c=="Y"?b:0),f=a.drawMonth+ -(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&ba?a:b},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");if(b)b.apply(a.input? -a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a);c=this._daylightSavingAdjust(new Date(c, -e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,"dayNamesShort"),dayNames:this._get(a, -"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker=function(a){if(!this.length)return this; -if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));return this.each(function(){typeof a== -"string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new M;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.16";window["DP_jQuery_"+B]=d})(jQuery); -; - -/* German initialisation for the jQuery UI date picker plugin. */ -/* Written by Milian Wolff (mail@milianw.de). */ -jQuery(function($){ - $.datepicker.regional['de'] = { - closeText: 'schließen', - prevText: '<zurück', - nextText: 'Vor>', - currentText: 'heute', - monthNames: ['Januar','Februar','März','April','Mai','Juni', - 'Juli','August','September','Oktober','November','Dezember'], - monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun', - 'Jul','Aug','Sep','Okt','Nov','Dez'], - dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'], - dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'], - dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'], - weekHeader: 'Wo', - dateFormat: 'dd.mm.yy', - firstDay: 1, - isRTL: false, - showMonthAfterYear: false, - yearSuffix: ''}; - $.datepicker.setDefaults($.datepicker.regional['de']); -}); - -/* English/UK initialisation for the jQuery UI date picker plugin. */ -/* Written by Stuart. */ -jQuery(function($){ - $.datepicker.regional['en'] = { - closeText: 'Done', - prevText: 'Prev', - nextText: 'Next', - currentText: 'Today', - monthNames: ['January','February','March','April','May','June', - 'July','August','September','October','November','December'], - monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', - 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], - dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], - dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], - dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], - weekHeader: 'Wk', - dateFormat: 'yyyy-mm-dd', - firstDay: 1, - isRTL: false, - showMonthAfterYear: false, - yearSuffix: ''}; - $.datepicker.setDefaults($.datepicker.regional['en']); -}); diff --git a/kasu/static/js/jquery.ui.datepicker-de.js b/kasu/static/js/jquery.ui.datepicker-de.js deleted file mode 100644 index 166f537..0000000 --- a/kasu/static/js/jquery.ui.datepicker-de.js +++ /dev/null @@ -1,23 +0,0 @@ -/* German initialisation for the jQuery UI date picker plugin. */ -/* Written by Milian Wolff (mail@milianw.de). */ -jQuery(function($){ - $.datepicker.regional['de'] = { - closeText: 'schließen', - prevText: '<zurück', - nextText: 'Vor>', - currentText: 'heute', - monthNames: ['Januar','Februar','März','April','Mai','Juni', - 'Juli','August','September','Oktober','November','Dezember'], - monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun', - 'Jul','Aug','Sep','Okt','Nov','Dez'], - dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'], - dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'], - dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'], - weekHeader: 'Wo', - dateFormat: 'dd.mm.yy', - firstDay: 1, - isRTL: false, - showMonthAfterYear: false, - yearSuffix: ''}; - $.datepicker.setDefaults($.datepicker.regional['de']); -}); diff --git a/kasu/static/js/jquery.ui.datepicker-en.js b/kasu/static/js/jquery.ui.datepicker-en.js deleted file mode 100644 index 3c9bb17..0000000 --- a/kasu/static/js/jquery.ui.datepicker-en.js +++ /dev/null @@ -1,23 +0,0 @@ -/* English/UK initialisation for the jQuery UI date picker plugin. */ -/* Written by Stuart. */ -jQuery(function($){ - $.datepicker.regional['en'] = { - closeText: 'Done', - prevText: 'Prev', - nextText: 'Next', - currentText: 'Today', - monthNames: ['January','February','March','April','May','June', - 'July','August','September','October','November','December'], - monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', - 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], - dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], - dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], - dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], - weekHeader: 'Wk', - dateFormat: 'dd/mm/yy', - firstDay: 1, - isRTL: false, - showMonthAfterYear: false, - yearSuffix: ''}; - $.datepicker.setDefaults($.datepicker.regional['en-GB']); -}); diff --git a/kasu/templates/base.html b/kasu/templates/base.html index 6b03172..c093647 100644 --- a/kasu/templates/base.html +++ b/kasu/templates/base.html @@ -1,19 +1,15 @@ {% load i18n %} - +{% load compress %} + - Kasu - {% block title %}{{ current_top_page.menu_name|default:"traditionelle asiatische Spielkultur"}}{% endblock %} - + Kasu - {% block title %}{{ current_page.menu_name|default:current_top_page.menu_name|default:"traditionelle asiatische Spielkultur"}}{% endblock %} - - - - + - + + + diff --git a/kasu/templates/index.html b/kasu/templates/index.html index 7f2dfe8..a077965 100644 --- a/kasu/templates/index.html +++ b/kasu/templates/index.html @@ -4,44 +4,11 @@ {% block jumbotron_background %}{{ random_photo.url }}{% endblock %} -{% block teaser %} -

{{title}}

-
{{content}}
-{% endblock %} +{% block title %}{% trans 'traditional Asian game culture' %}{% endblock %} -{% block redbox %} - {% if current_event %} -

{% trans "Current Event" %}

-

{{ current_event.name}}

-

{% trans "since" %} - -

-
    -
  • {% trans "Start" %}: {{current_event.start|date:'DATETIME_FORMAT'}}
  • -
  • {% trans "Location" %}: {{ current_event.location }}
  • -
- - {% else %} -

{% trans "Next Event" %}

-

{{ next_event.name}}

-

{% trans "in" %} - -

-
    -
  • {% trans "Start" %}: {{next_event.start|date:'DATETIME_FORMAT' }}
  • -
  • {% trans "Location" %}: {{ next_event.location }}
  • -
- - {% endif %} -

{% trans "Upcoming events" %} iCal Feed

-
    - {% for event in upcoming_events %} -
  • {{event.start|date:'d. M:'}} {{event.name}}
  • - {% endfor %} -
+{% block teaser %} +

{{title}}

+
{{content}}
{% endblock %} {% block maincontent %} diff --git a/mahjong_ranking/locale/de/LC_MESSAGES/django.po b/mahjong_ranking/locale/de/LC_MESSAGES/django.po index 46dc5e2..666a7c2 100644 --- a/mahjong_ranking/locale/de/LC_MESSAGES/django.po +++ b/mahjong_ranking/locale/de/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: kasu.mahjong_ranking\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-12-09 20:35+0100\n" +"POT-Creation-Date: 2014-12-14 01:12+0100\n" "PO-Revision-Date: 2014-12-08 16:18+0100\n" "Last-Translator: Christian Berg \n" "Language-Team: Kasu \n" @@ -120,7 +120,7 @@ msgstr "Veranstaltung existiert nicht" msgid "Season does not exist" msgstr "Saison existiert nicht" -#: views.py:301 +#: views.py:300 #, python-format msgid "No user found matching the name %s" msgstr "Kein Benutzer mit dem Namen %s gefunden" diff --git a/mahjong_ranking/views.py b/mahjong_ranking/views.py index 44b7b47..041d6a2 100644 --- a/mahjong_ranking/views.py +++ b/mahjong_ranking/views.py @@ -294,8 +294,7 @@ class PlayerScore(LoginRequiredMixin, generic.ListView): try: self.user = auth.get_user_model().objects.get( username=self.kwargs.get('username')) - self.membership = Membership.objects.get_or_create(user=self.user)[ - 0] + self.membership = Membership.objects.get(user=self.user) except auth.get_user_model().DoesNotExist: raise django.http.Http404( _("No user found matching the name %s") % self.kwargs.get( diff --git a/maistar_ranking/__init__.py b/maistar_ranking/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/maistar_ranking/admin.py b/maistar_ranking/admin.py new file mode 100644 index 0000000..c95193f --- /dev/null +++ b/maistar_ranking/admin.py @@ -0,0 +1,64 @@ +# -*- encoding: utf-8 -*- +""" +Created on 19.09.2011 + +@author: christian +""" + +from django.contrib import admin +from django.utils.translation import ugettext as _ + +from . import forms, models + + +def recalculate(modeladmin, request, queryset): # @UnusedVariable + if isinstance(modeladmin, RankingAdmin): + seasons = set() + for ranking in queryset: + ranking.recalculate() + seasons.add(ranking.season) + for season in seasons: + models.Ranking.objects.calculate_rankings(season) + + +recalculate.short_description = _("Recalculate") + + +class RankingAdmin(admin.ModelAdmin): + actions = [recalculate] + list_display = ( + 'season', 'placement', 'user', 'avg_placement', 'avg_score', + 'games_count', 'games_good', 'games_won' + ) + list_display_links = ('user',) + list_filter = ['season'] + + +class GameAdmin(admin.ModelAdmin): + actions = [recalculate] + # date_hierarchy = 'event__start' + fields = ( + 'event', + ('player1', 'player1_score', 'player1_placement'), + ('player2', 'player2_score', 'player2_placement'), + ('player3', 'player3_score', 'player3_placement'), + ('player4', 'player4_score', 'player4_placement'), + ('player5', 'player5_score', 'player5_placement'), + ('player6', 'player6_score', 'player6_placement'), + 'comment', + 'confirmed' + ) + form = forms.GameForm + list_display = ('event', 'season', 'player_names', 'comment', 'confirmed') + readonly_fields = ( + 'player1_placement', 'player2_placement', 'player3_placement', + 'player4_placement', 'player5_placement', 'player6_placement' + ) + search_fields = [ + 'player1__username', 'player2__username', 'player3__username', + 'player4__username', 'player5__username', 'player6__username' + ] + + +admin.site.register(models.Game, GameAdmin) +admin.site.register(models.Ranking, RankingAdmin) diff --git a/maistar_ranking/forms.py b/maistar_ranking/forms.py new file mode 100644 index 0000000..7c131e7 --- /dev/null +++ b/maistar_ranking/forms.py @@ -0,0 +1,37 @@ +# -*- encoding: utf-8 -*- +__author__ = 'christian' + +from django import forms +from django.utils.translation import ugettext as _ + +from . import models + + +class GameForm(forms.ModelForm): + error_css_class = 'error' + required_css_class = 'required' + + class Meta(object): + fields = [ + 'player1', 'player1_score', + 'player2', 'player2_score', + 'player3', 'player3_score', + 'player4', 'player4_score', + 'player5', 'player5_score', + 'player6', 'player6_score', + 'comment' + ] + model = models.Game + + def clean(self): + cleaned_data = super(GameForm, self).clean() + players_in_game = set() + for player_nr in ( + 'player1', 'player2', 'player3', 'player4', 'player5', 'player6'): + current_player = cleaned_data.get(player_nr) + if current_player and current_player in players_in_game: + msg = _("%s may only participate once." % current_player) + self._errors[player_nr] = self.error_class([msg]) + del cleaned_data[player_nr] + players_in_game.add(current_player) + return cleaned_data diff --git a/maistar_ranking/locale/de/LC_MESSAGES/django.mo b/maistar_ranking/locale/de/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..050fa34ae4a1d49a7eff2545df4538134bab8db3 GIT binary patch literal 2996 zcmZ{lU5sQ!6~~K+iVY&5@?jQo#B4y_+jP&)&O+};n3oegxl z>sKGA&R12P{`ig?f2;60hTkFlKD^M*^1u&joG|3acHsNqYgqqN7?&_E=Q0K(@G6LusMkPs*io*>RM>1xJG%5H zHaprgCSq=@#Uzm*t&G_Ey0@xxR*PjkG$U}Ny)FSRb;@c<$J=UIV`rw8i#(S-XP``- z;f$xCT17KOsi<2?jIWzuN5+j*W4GQQjZ=?lM}1~XabX9h%sEkOI!U;siBDm;5f>%X zpeV8K+4)Abn~WN5=e3D85J7E>c8wp>)19j{D2tq)?)DDSZ|!o zUD9^j*i>DR&@PyG+t!_erb;AeM?*d0CKd@GAzzRm8b>U-rZM}rTF-RMOc>9jDd{W4%+CIM!KQWpZ2_@J!VSR2!^aVbx`e zO!~@VH5(rxTl9-$j0hazr0VlX3d>|HLSQPJ476Kx-Di<@8W-~lCsHS1p}qo+Wd9M# zL7(ZGe9V-oxTtWS(xOO|7?C74*S218w2Mi2BTij+Lv|6tdRc67?4!q%=m{>JDQu6n zwX52>9&Qyj{Yh}Tb%}QnYINSECW)4+)J2;`k6P;&H>2f}wa3m#E_ILQI^FrGI~R4k zG&k2f`pEY?-A)IB(Ip-kvGAF4^T!*xHSK(~39Ak{FUlS*4@={`(Uz9DOzGrPY>kfF z+CQ4++GOpx$WOP{v`s6#wP=%d-lKDffKKB1v9XWV;b?!lb^h`5E3+uO?M`dCupYN6 z+8pn|anDcrhj0?co}hTBOUM4y<;}Cv!!tSYYrti+V&fvgZSK*-edDL*dz5f%J*!Hc zMQ4jLcRjK@_0XM~JAqS{l~WH|`t~X6e)mM{htVoq6p1>}^@8PrciRi?ZWl|FBybX4 zcD1c!3t<*fS->-|snb5*o@+^|N_06OTa|=(bDbd)lUW|(akSNA#_m;v{dZHg3P+3p zyv}fEQyN~gvaw@0J22A}j!7*$Q=zuGcxa9H>c>^N|1N6UV!vN*G z_$13?O$pgR{bRoe!*oC$9GT45c6nC68b5NJkkrD_=a$0H+{c8CGhL`ie$Q|TXPSD5 zO@6N~h-cv&C59az^o({THj5e)4{00c%(Hsem?SO-+PS7a`aP*+QzNVFT=08*&XnWKfUguQr2L!I^I31G3Y zM!N5cY=lfp0qnCqLc3h2QLX@?vi)c=?}Mw0nA(snyCW5v{$T bz5SPmnXg|PJh2kR?7}stq*fWVRkHAZ7_u7n literal 0 HcmV?d00001 diff --git a/maistar_ranking/locale/de/LC_MESSAGES/django.po b/maistar_ranking/locale/de/LC_MESSAGES/django.po new file mode 100644 index 0000000..57a725d --- /dev/null +++ b/maistar_ranking/locale/de/LC_MESSAGES/django.po @@ -0,0 +1,272 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: kasu.mahjong_ranking\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-12-14 01:12+0100\n" +"PO-Revision-Date: 2014-12-11 22:47+0100\n" +"Last-Translator: Christian Berg \n" +"Language-Team: Kasu \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-Generator: Poedit 1.6.11\n" +"X-Translated-Using: django-rosetta 0.7.2\n" + +#: admin.py:24 +msgid "Recalculate" +msgstr "Neuberechnen" + +#: forms.py:33 +#, python-format +msgid "%s may only participate once." +msgstr "%s darf nur einmal teilnehmen." + +#: models.py:20 +msgid "Comment" +msgstr "Kommentar" + +#: models.py:22 +msgid "Player 1" +msgstr "Spieler 1" + +#: models.py:24 models.py:30 models.py:36 models.py:42 models.py:48 +#: models.py:54 templates/maistar_ranking/ranking_list.html:20 +msgid "Score" +msgstr "Punkte" + +#: models.py:28 +msgid "Player 2" +msgstr "Spieler 2" + +#: models.py:34 +msgid "Player 3" +msgstr "Spieler 3" + +#: models.py:40 +msgid "Player 4" +msgstr "Spieler 4" + +#: models.py:46 +msgid "Player 5" +msgstr "Spieler 5" + +#: models.py:52 +msgid "Player 6" +msgstr "Spieler 6" + +#: models.py:58 +msgid "Has been confirmed" +msgstr "Wurde bestätigt" + +#: models.py:60 +msgid "the game only counts whe it has been confirmed" +msgstr "das Spiel zählt nur wenn es bestätigt wurde" + +#: models.py:63 models.py:151 +#: templates/maistar_ranking/player_game_list.html:6 +#: templates/maistar_ranking/ranking_list.html:4 +#: templates/maistar_ranking/ranking_list.html:71 +msgid "Season" +msgstr "Saison" + +#: models.py:69 +msgid "Mai-Star Game with {0} from {1:%Y-%m-%d}" +msgstr "Mai-Star Spiel mit {0} vom {1:%Y-%m-%d}" + +#: templates/maistar_ranking/game_form.html:5 +#: templates/maistar_ranking/game_form.html:16 +#: templates/maistar_ranking/game_list.html:27 +#: templates/maistar_ranking/player_game_list.html:46 +msgid "Edit Game" +msgstr "Spiel bearbeiten" + +#: templates/maistar_ranking/game_form.html:5 +#: templates/maistar_ranking/game_form.html:16 +#: templates/maistar_ranking/game_list.html:42 +msgid "Add Game" +msgstr "Spiel hinzufügen" + +#: templates/maistar_ranking/game_form.html:78 +msgid "Back" +msgstr "Zurück" + +#: templates/maistar_ranking/game_form.html:80 +msgid "Save" +msgstr "Speichern" + +#: templates/maistar_ranking/game_list.html:4 +#: templates/maistar_ranking/player_game_list.html:6 +msgid "Mai-Star Games" +msgstr "Mai-Star Spiele" + +#: templates/maistar_ranking/game_list.html:7 +msgid "Played Mai-Star Games" +msgstr "Gespielte Mai-Star Spiele" + +#: templates/maistar_ranking/game_list.html:12 +msgid "Game" +msgstr "Spiel" + +#: templates/maistar_ranking/game_list.html:15 +msgid "Place" +msgstr "Platz" + +#: templates/maistar_ranking/game_list.html:19 +#: templates/maistar_ranking/player_game_list.html:38 +msgid "Points" +msgstr "Punkte" + +#: templates/maistar_ranking/game_list.html:24 +#: templates/maistar_ranking/hanchan_confirm_delete.html:18 +#: templates/maistar_ranking/hanchan_confirm_delete.html:19 +#: templates/maistar_ranking/player_game_list.html:43 +msgid "Delete" +msgstr "Löschen" + +#: templates/maistar_ranking/game_list.html:24 +#: templates/maistar_ranking/player_game_list.html:43 +msgid "Delete Game" +msgstr "Spiel löschen" + +#: templates/maistar_ranking/game_list.html:27 +#: templates/maistar_ranking/player_game_list.html:46 +msgid "Edit" +msgstr "Bearbeiten" + +#: templates/maistar_ranking/game_list.html:32 +msgid "No Mai-Star games have been added to this event yet." +msgstr "Für diese Veranstaltung wurden noch keine Mai-Star Spiele erfasst." + +#: templates/maistar_ranking/game_list.html:40 +#: templates/maistar_ranking/game_list.html:42 +msgid "Add" +msgstr "Hinzufügen" + +#: templates/maistar_ranking/game_list.html:40 +msgid "Edit Event" +msgstr "Veranstaltung bearbeiten" + +#: templates/maistar_ranking/hanchan_confirm_delete.html:4 +#: templates/maistar_ranking/hanchan_confirm_delete.html:10 +msgid "Delete game" +msgstr "Spiel löschen" + +#: templates/maistar_ranking/hanchan_confirm_delete.html:14 +#: templates/maistar_ranking/hanchan_confirm_delete.html:15 +msgid "Cancel" +msgstr "Abbrechen" + +#: templates/maistar_ranking/page.html:5 +msgid "Archive" +msgstr "Archiv" + +#: templates/maistar_ranking/page.html:7 +msgid "Add Event" +msgstr "Veranstaltung hinzufügen" + +#: templates/maistar_ranking/player_game_list.html:4 +msgid "Ladder Score for" +msgstr "Ladder Wertung für" + +#: templates/maistar_ranking/player_game_list.html:10 +msgid "Mai-Star Games with" +msgstr "Mai-Star Spiele mit" + +#: templates/maistar_ranking/player_game_list.html:15 +msgid "Date" +msgstr "Datum" + +#: templates/maistar_ranking/player_game_list.html:16 +msgid "Event" +msgstr "Veranstaltung" + +#: templates/maistar_ranking/player_game_list.html:17 +msgid "Players" +msgstr "Spieler" + +#: templates/maistar_ranking/ranking_list.html:4 +msgid "Mai-Star Ranking" +msgstr "Mai-Star Platzierung" + +#: templates/maistar_ranking/ranking_list.html:11 +#: templates/maistar_ranking/ranking_list.html:19 +msgid "Placement" +msgstr "Platzierung" + +#: templates/maistar_ranking/ranking_list.html:12 +msgid "Avatar" +msgstr "Avatar" + +#: templates/maistar_ranking/ranking_list.html:13 +msgid "Nickname" +msgstr "Spitzname" + +#: templates/maistar_ranking/ranking_list.html:14 +msgid "Name" +msgstr "Name" + +#: templates/maistar_ranking/ranking_list.html:15 +msgid "Average" +msgstr "Durchschnitt" + +#: templates/maistar_ranking/ranking_list.html:16 +msgid "Games" +msgstr "Spiele" + +#: templates/maistar_ranking/ranking_list.html:21 +msgid "count" +msgstr "Anzahl" + +#: templates/maistar_ranking/ranking_list.html:22 +msgid "good" +msgstr "Gut" + +#: templates/maistar_ranking/ranking_list.html:23 +msgid "won" +msgstr "Gewonnen" + +#: templates/maistar_ranking/ranking_list.html:42 +msgid "" +"Unfortunately, nobody has it been done in the ranking.\n" +" A player must have 6 games done, to be added to the ranking." +msgstr "" +"Leider hat es noch niemand in die Wertung geschafft. Spieler, die weniger " +"als 6 Spiele innerhalb einer Saison absolviert haben, werden für das " +"Endergebnis nicht gewertet." + +#: templates/maistar_ranking/ranking_list.html:52 +msgid "Latest Games" +msgstr "Letzten Spiele" + +#: templates/maistar_ranking/ranking_list.html:62 +msgid "Latest Events" +msgstr "Letzten Veranstaltungen" + +#: templates/maistar_ranking/ranking_list.html:69 +msgid "Ladder Archive" +msgstr "Archiv" + +#~ msgid "Player List" +#~ msgstr "Spieler Liste" + +#~ msgid "Full Name" +#~ msgstr "Voller Name" + +#~ msgid "Rank" +#~ msgstr "Rang" + +#~ msgid "Games Total" +#~ msgstr "Spiele Gesamt" + +#~ msgid "Event does not exist" +#~ msgstr "Termin existiert nicht." + +#~ msgid "No user found matching the name %s" +#~ msgstr "Kein Benutzer mit dem Namen %s gefunden." diff --git a/maistar_ranking/managers.py b/maistar_ranking/managers.py new file mode 100644 index 0000000..dcd6a8f --- /dev/null +++ b/maistar_ranking/managers.py @@ -0,0 +1,60 @@ +# -*- encoding: utf-8 -*- +""" +Created on 22.11.2014 + +@author: christian +""" +from django.db import models + +from . import settings + + +class GameManager(models.Manager): + use_for_related_fields = True + + def player_games(self, player, season=None, **kwargs): + queryset = self.filter( + models.Q(player1=player) | models.Q(player2=player) | + models.Q(player3=player) | models.Q(player4=player) | + models.Q(player5=player) | models.Q(player6=player) + ) + if season: + queryset = queryset.filter(season=season) + if kwargs: + queryset = queryset.filter(**kwargs) + return queryset + + +class LadderManager(models.Manager): + use_for_related_fields = True + + def calculate_rankings(self, season): + """ + Berechnet die Jahresrankings für die Spieler neu. + @param season: Das Jahr das neu berechnet werden soll + @type season: Integer + """ + rankings = self.filter(season=season) + rankings.update(placement=None) + rankings = rankings.filter( + games_count__gte=settings.MAISTAR_GAMES_FOR_LADDERRANKING) # @IgnorePep8 + rankings = rankings.order_by('avg_placement', '-avg_score') + placement = 1 + previous_avg_placement = None + previous_avg_score = None + previous_placement = None + for ranking in rankings: + if ranking.avg_placement == previous_avg_placement \ + and ranking.avg_score == previous_avg_score: + ranking.placement = previous_placement + else: + ranking.placement = placement + ranking.save(force_update=True) + previous_avg_placement = ranking.avg_placement + previous_avg_score = ranking.avg_score + previous_placement = ranking.placement + placement += 1 + + def get_seasons(self): + return self.values_list('season', flat=True).order_by( + 'season').distinct() diff --git a/maistar_ranking/models.py b/maistar_ranking/models.py new file mode 100644 index 0000000..3659a96 --- /dev/null +++ b/maistar_ranking/models.py @@ -0,0 +1,221 @@ +# -*- encoding: utf-8 -*- + +import logging + +from django.core.urlresolvers import reverse +from django.db import models +from django.utils.translation import ugettext as _ + +from events.models import Event +from membership.models import Membership +from . import settings, managers + + +class Game(models.Model): + """ + Ein kompettes Spiel Mai-Star bestehend aus 6 Spielern + """ + + event = models.ForeignKey(Event, related_name='maistargame_set') + comment = models.TextField(_('Comment'), blank=True) + player1 = models.ForeignKey( + settings.AUTH_USER_MODEL, verbose_name=_("Player 1"), related_name='+' + ) + player1_score = models.SmallIntegerField(_("Score")) + player1_placement = models.PositiveSmallIntegerField(editable=False) + + player2 = models.ForeignKey( + settings.AUTH_USER_MODEL, verbose_name=_("Player 2"), related_name='+' + ) + player2_score = models.SmallIntegerField(_("Score")) + player2_placement = models.PositiveSmallIntegerField(editable=False) + + player3 = models.ForeignKey( + settings.AUTH_USER_MODEL, verbose_name=_("Player 3"), related_name='+' + ) + player3_score = models.SmallIntegerField(_("Score")) + player3_placement = models.PositiveSmallIntegerField(editable=False) + + player4 = models.ForeignKey( + settings.AUTH_USER_MODEL, verbose_name=_("Player 4"), related_name='+' + ) + player4_score = models.SmallIntegerField(_("Score")) + player4_placement = models.PositiveSmallIntegerField(editable=False) + + player5 = models.ForeignKey( + settings.AUTH_USER_MODEL, verbose_name=_("Player 5"), related_name='+' + ) + player5_score = models.SmallIntegerField(_("Score")) + player5_placement = models.PositiveSmallIntegerField(editable=False) + + player6 = models.ForeignKey( + settings.AUTH_USER_MODEL, verbose_name=_("Player 6"), related_name='+' + ) + player6_score = models.SmallIntegerField(_("Score")) + player6_placement = models.PositiveSmallIntegerField(editable=False) + + confirmed = models.BooleanField( + _('Has been confirmed'), + default=True, + help_text=_('the game only counts whe it has been confirmed') + ) + player_names = models.CharField(max_length=255, editable=False) + season = models.PositiveSmallIntegerField(_('Season'), editable=False, + db_index=True) + + objects = managers.GameManager() + + def __str__(self): + return _("Mai-Star Game with {0} from {1:%Y-%m-%d}").format( + self.player_names, self.event.start + ) + + def get_absolute_url(self): + """ + URL zur Hanchanliste des Events wo diese Hanchan gelistet wurde. + """ + url = reverse('maistar-game-list', + kwargs={'event': self.event.pk}) + return u'%(url)s#%(pk)d' % {'url': url, 'pk': self.pk} + + @property + def player_list(self): + try: + return self._player_list + except AttributeError: + self._player_list = list() + for nr in range(1, 7): + self._player_list.append({ + 'user': getattr(self, 'player%d' % nr), + 'membership': Membership.objects.get( + user=getattr(self, 'player%d' % nr) + ), + 'score': getattr(self, 'player%d_score' % nr), + 'placement': getattr(self, 'player%d_placement' % nr), + }) + return self._player_list + + def save(self, force_insert=False, force_update=False, using=None, + update_fields=None): + u""" + Bestimmt die Platzierung eines jeden Spielers noch vor dem speichern. + Außerdem wird eine Kommasperierte Liste der Spiele mitgespeichert. + """ + logging.debug("Berechne die Platzierungen neu...") + game_date = self.event.start.date() + player_tuples = [ + (self.player1.id, self.player1.username, self.player1_score), + (self.player2.id, self.player2.username, self.player2_score), + (self.player3.id, self.player3.username, self.player3_score), + (self.player4.id, self.player4.username, self.player4_score), + (self.player5.id, self.player5.username, self.player5_score), + (self.player6.id, self.player6.username, self.player6_score), + ] + season_start = settings.MAISTAR_SEASON_START.replace( + year=game_date.year) + + # sort player by Score: + player_tuples = sorted(player_tuples, key=lambda player: player[2], + reverse=True) + logging.debug(player_tuples) + other_player_ranking = 1 + other_player_score = 0 + player_names = [] + ranking = 1 + player_nr = 1 + for player_id, player_name, player_score in player_tuples: + if player_score == other_player_score: + player_ranking = other_player_ranking + else: + player_ranking = ranking + setattr(self, "player%d_id" % player_nr, player_id) + setattr(self, "player%d_score" % player_nr, player_score) + setattr(self, "player%d_placement" % player_nr, player_ranking) + other_player_ranking = player_ranking + other_player_score = player_score + player_names.append(player_name) + player_nr += 1 + ranking += 1 + self.player_names = ', '.join(player_names) + if game_date >= season_start: + self.season = season_start.year + else: + self.season = season_start.year - 1 + super(Game, self).save(force_insert=force_insert, + force_update=force_update, using=using, + update_fields=update_fields) + + +class Ranking(models.Model): + user = models.ForeignKey(settings.AUTH_USER_MODEL) + season = models.PositiveSmallIntegerField(_("Season")) + placement = models.PositiveIntegerField(blank=True, null=True) + avg_placement = models.PositiveSmallIntegerField(blank=True, null=True) + avg_score = models.SmallIntegerField(blank=True, null=True) + games_count = models.PositiveSmallIntegerField(default=0) + games_good = models.PositiveSmallIntegerField(default=0) + games_won = models.PositiveSmallIntegerField(default=0) + objects = managers.LadderManager() + + class Meta(object): + ordering = ('-season', 'placement', 'avg_placement', '-avg_score',) + + def __str__(self): + return "Mai-Star Ranking: %s, Season: %d" % (self.user, self.season) + + def get_absolute_url(self): + return reverse('maistar-player-games', kwargs={ + 'username': self.user.username, + 'season': self.season + }) + + def recalculate(self): + logging.info( + u'Recalculate Mai-Star Ranking for Player %s in Season %s', + self.user, self.season + ) + self.placement = None + self.avg_placement = None + self.avg_score = None + self.games_count = 0 + self.games_good = 0 + self.games_won = 0 + player_score = 0 + player_placement = 0 + for game in Game.objects.player_games(self.user, self.season): + placement = 0 + score = 0 + for player in ('player1', 'player2', 'player3', 'player4', + 'player5', 'player6'): + if getattr(game, player) == self.user: + placement = getattr(game, "%s_placement" % player) + score = getattr(game, "%s_score" % player) + player_placement += placement + player_score += score + self.games_count += 1 + self.games_good += 1 if placement <= 3 else 0 + self.games_won += 1 if placement == 1 else 0 + if self.games_count > 0: + self.avg_placement = round(player_placement / self.games_count) + self.avg_score = round(player_score / self.games_count) + self.save() + + +def update_maistar_ranking(sender, instance, **kwargs): + for player in instance.player_list: + ranking, created = Ranking.objects.get_or_create( + user=player['user'], + season=instance.season + ) + if created: + logging.debug('Created ranking for %s in Season %d', + player['user'].username, instance.season) + else: + logging.debug('Updating ranking for %s in Season %d', + player['user'].username, instance.season) + ranking.recalculate() + Ranking.objects.calculate_rankings(instance.season) + + +models.signals.post_delete.connect(update_maistar_ranking, sender=Game) +models.signals.post_save.connect(update_maistar_ranking, sender=Game) diff --git a/maistar_ranking/settings.py b/maistar_ranking/settings.py new file mode 100644 index 0000000..16966b1 --- /dev/null +++ b/maistar_ranking/settings.py @@ -0,0 +1,24 @@ +""" +Global Settings for the Maistar Ranking System + +Created on 22.11.2014 + +@author: christian +""" + +from datetime import date + +from django.conf import settings + + +AUTH_USER_MODEL = settings.AUTH_USER_MODEL + +MAISTAR_GAMES_FOR_LADDERRANKING = getattr( + settings, 'MAISTAR_GAMES_FOR_LADDERRANKING', 6 +) + +MAISTAR_SEASON_START = getattr( + settings, 'MAISTAR_SEASON_START', date(year=1, month=8, day=1) +) + + diff --git a/maistar_ranking/templates/maistar_ranking/game_form.html b/maistar_ranking/templates/maistar_ranking/game_form.html new file mode 100644 index 0000000..0fd0527 --- /dev/null +++ b/maistar_ranking/templates/maistar_ranking/game_form.html @@ -0,0 +1,87 @@ +{% extends "events/event_detail.html" %} +{% load i18n comments fieldset_extras %} + +{% block title %} +{% if game.id %}{% trans "Edit Game" %}{% else %}{% trans "Add Game" %}{% endif %} +{% endblock %} + +{% block maincontent %} +{% for error in form.errors %}

{{error}}

{% endfor %} + +{% for error in form.non_field_errors %}

{{error}}

{% endfor %} + +
+ {% csrf_token %} +
+ {% if game.id %}{% trans "Edit Game" %}{% else %} {% trans "Add Game" %}{% endif %} + +

+ + {{ form.player1 }} + + {{ form.player1_score}} +

+ {% if form.player1.errors %}{{ form.player1.errors }}{% endif %} + {% if form.player1_score.errors %}{{ form.player1_score.errors }}{% endif %} +

+ + {{ form.player2 }} + + {{ form.player2_score}} +

+ {% if form.player2.errors %}{{ form.player2.errors }}{% endif %} + {% if form.player2_score.errors %}{{ form.player2_score.errors }}{% endif %} + +

+ + {{ form.player3 }} + + {{ form.player3_score}} +

+ {% if form.player3.errors %}{{ form.player3.errors }}{% endif %} + {% if form.player3_score.errors %}{{ form.player3_score.errors }}{% endif %} + +

+ + {{ form.player4 }} + + {{ form.player4_score}} +

+ {% if form.player4.errors %}{{ form.player4.errors }}{% endif %} + {% if form.player4_score.errors %}{{ form.player4_score.errors }}{% endif %} + +

+ + {{ form.player5 }} + + {{ form.player5_score}} +

+ {% if form.player5.errors %}{{ form.player5.errors }}{% endif %} + {% if form.player5_score.errors %}{{ form.player5_score.errors }}{% endif %} + +

+ + {{ form.player6 }} + + {{ form.player6_score}} +

+ {% if form.player6.errors %}{{ form.player6.errors }}{% endif %} + {% if form.player6_score.errors %}{{ form.player6_score.errors }}{% endif %} + +

+ + {{ form.comment }} +

+

+ {% trans 'Back' %} {% trans 'Back' %} + +

+
+
+{% endblock %} + +{% block buttonbar %}{% endblock %} \ No newline at end of file diff --git a/maistar_ranking/templates/maistar_ranking/game_list.html b/maistar_ranking/templates/maistar_ranking/game_list.html new file mode 100644 index 0000000..027f9a3 --- /dev/null +++ b/maistar_ranking/templates/maistar_ranking/game_list.html @@ -0,0 +1,44 @@ +{% extends "events/event_detail.html" %} +{% load i18n humanize %} + +{% block title %}{% trans 'Mai-Star Games' %} - {{ event.name }}{% endblock %} + +{% block maincontent %} +

{% trans 'Played Mai-Star Games' %}

+

 

+{% for game in game_list %} +
+ +

{{ forloop.counter|ordinal }} {% trans 'Game' %}

+ {% for player in game.player_list %} +
+

{{ player.placement|ordinal }} {% trans 'Place' %}

+ +

{{player.user.username}}
+ {{player.score}} {% trans 'Points' %}

+
+ {% endfor %} +
+ {% if perms.maistar_ranking.delete_dame %} + {% trans 'Delete' %} {% trans 'Delete Game' %} + {% endif %} + {% if perms.maistar_ranking.change_game %} + {% trans 'Edit' %} {% trans 'Edit Game' %} + {% endif %} +
+
+{% empty %} +

{% trans 'No Mai-Star games have been added to this event yet.'%}

+{% endfor %} +

 

+{% endblock %} + +{% block buttonbar %} +{% if perms.maistar_ranking.add_game %} +{% trans 'Add' %} {% trans 'Edit Event' %} +{% trans 'Add' %} {% trans 'Add Game' %} +{% endif %} +{% endblock %} \ No newline at end of file diff --git a/maistar_ranking/templates/maistar_ranking/hanchan_confirm_delete.html b/maistar_ranking/templates/maistar_ranking/hanchan_confirm_delete.html new file mode 100644 index 0000000..ce4e079 --- /dev/null +++ b/maistar_ranking/templates/maistar_ranking/hanchan_confirm_delete.html @@ -0,0 +1,26 @@ +{% extends "base.html" %} +{% load i18n comments %} + +{% block meta_title %}{% trans 'Delete game' %}{% endblock %} + +{% block content %} +
+{% csrf_token %} +
+{% trans "Delete game" %} +{% include 'form.html' %} +

+ + +

+
+
+{% endblock %} + +{% block buttonbar %}{% endblock %} \ No newline at end of file diff --git a/maistar_ranking/templates/maistar_ranking/page.html b/maistar_ranking/templates/maistar_ranking/page.html new file mode 100644 index 0000000..5b1d811 --- /dev/null +++ b/maistar_ranking/templates/maistar_ranking/page.html @@ -0,0 +1,9 @@ +{% extends "base.html" %} +{% load i18n %} + +{% block additional_nav_elements %} + {% trans 'Archive' %} + {% if perms.events.add_event %} + {% trans 'Add Event' %} +{% endif %} +{% endblock %} \ No newline at end of file diff --git a/maistar_ranking/templates/maistar_ranking/player_game_list.html b/maistar_ranking/templates/maistar_ranking/player_game_list.html new file mode 100644 index 0000000..7eb8ea3 --- /dev/null +++ b/maistar_ranking/templates/maistar_ranking/player_game_list.html @@ -0,0 +1,55 @@ +{% extends "membership/membership_detail.html" %} +{% load i18n humanize %} + +{% block title %} {% trans 'Ladder Score for' %} {{membership.user.username}} {% endblock %} + +{% block teaser %}

{% trans 'Mai-Star Games' %}: {{membership.user.username}}
{% trans 'Season' %} {{season}}

{% endblock %} + +{% block score_list %} +
+

{% trans 'Mai-Star Games with' %} {{ membership.user.username }} - {{season}}

+ + + + + + + + + + + + + + + + + + + +{% for game in game_list %} + + + + + {% for player in game.player_list %} + + {% endfor %} + + +{% endfor %} + +
{% trans 'Date' %}{% trans 'Event' %}{% trans 'Players' %}
{{ '1'|ordinal }}{{ '2'|ordinal }}{{ '3'|ordinal }}{{ '4'|ordinal }}{{ '5'|ordinal }}{{ '6'|ordinal }}
{{ game.event.start|date:'SHORT_DATE_FORMAT' }}{{ game.event.name }} + {{ player.user.username }} +
{{player.score}} {% trans 'Points' %} +
+ {% if perms.maistar_ranking.delete_game %} + {% trans 'Delete' %} + {% endif %} + {% if perms.maistar_ranking.change_game %} + {% trans 'Edit' %} + {% endif %} +
+ +
+{% endblock %} \ No newline at end of file diff --git a/maistar_ranking/templates/maistar_ranking/ranking_list.html b/maistar_ranking/templates/maistar_ranking/ranking_list.html new file mode 100644 index 0000000..bf499de --- /dev/null +++ b/maistar_ranking/templates/maistar_ranking/ranking_list.html @@ -0,0 +1,79 @@ +{% extends "base.html" %} +{% load i18n comments humanize %} + +{% block teaser %}

{% trans 'Mai-Star Ranking' %} - {% trans 'Season' %} {{season}}

{% endblock %} + +{% block maincontent %} +
+ + + + + + + + + + + + + + + + + + + {% for player in ranking_list %} + {% with player.user.get_profile as profile %} + + + + + + + + + + + + {% endwith %} + {% empty %} + + + + {% endfor %} +
{% trans "Placement" %}{% trans "Avatar" %}{% trans "Nickname" %}{% trans "Name" %}{% trans 'Average' %}{% trans 'Games' %}
{% trans 'Placement' %}{% trans "Score" %}{% trans "count" %}{% trans "good" %}{% trans "won" %}
{{ player.placement|ordinal }}{{ player.user }}{{player.user}}{% if user.is_authenticated %}{{profile.last_name}} {{profile.first_name}}{% else %} ---{% endif %}{{player.avg_placement|floatformat:0 }}{{player.avg_score|intcomma }}{{player.games_count}}{{player.games_good}}{{player.games_won}}
{% blocktrans %}Unfortunately, nobody has it been done in the ranking. + A player must have 6 games done, to be added to the ranking.{% endblocktrans %} +
+
+{% endblock %} + +{% block redbox %} +

{% trans 'Latest Games' %}

+ + +

{% trans 'Latest Events' %}

+ + +

{% trans 'Ladder Archive' %}

+
+ + +
+ +{% endblock %} \ No newline at end of file diff --git a/maistar_ranking/urls.py b/maistar_ranking/urls.py new file mode 100644 index 0000000..4c064e9 --- /dev/null +++ b/maistar_ranking/urls.py @@ -0,0 +1,32 @@ +# -*- encoding: utf-8 -*- +""" +Created on 03.10.2011 + +@author: christian +""" +from django.conf.urls import * # @UnusedWildImport +from django.views.generic import RedirectView +from .views import DeleteGame, ListGames, ListPlayerGames, \ + ListRankings, GameForm + + +urlpatterns = patterns( + 'maistar_ranking.views', + url('^$', RedirectView.as_view(pattern_name='maistar-ranking')), + url(r'ranking/$', ListRankings.as_view(), name="maistar-ranking"), + url(r'ranking/(?P[\d]+)/$', ListRankings.as_view(), + name="maistar-ranking"), # @IgnorePep8 + url(r'event/(?P[\d]+)/$', ListGames.as_view(), + name="maistar-game-list"), # @IgnorePep8 + url(r'event/(?P[\d]+)/add/$', GameForm.as_view(), + name="maistar-add-game"), # @IgnorePep8 + url(r'game/(?P[\d]+)/edit/$', GameForm.as_view(), + name="maistar-edit-game"), # @IgnorePep8 + url(r'game/(?P[\d]+)/delete/$', DeleteGame.as_view(), + name="maistar-delete-game"), # @IgnorePep8 + url(r'player/(?P[\-\.\d\w]+)/$', ListPlayerGames.as_view(), + name="maistar-player-games"), # @IgnorePep8 + url(r'player/(?P[\-\.\d\w]+)/(?P[\d]+)/$', + ListPlayerGames.as_view(), name="maistar-player-games"), # @IgnorePep8 + +) diff --git a/maistar_ranking/views.py b/maistar_ranking/views.py new file mode 100644 index 0000000..662f4c4 --- /dev/null +++ b/maistar_ranking/views.py @@ -0,0 +1,121 @@ +# -*- encoding: utf-8 -*- + +from datetime import date + +from django.contrib import auth +from django.core.urlresolvers import reverse +from django.shortcuts import get_object_or_404 +from django.utils.translation import gettext as _ +from django.views import generic + +from events.models import Event +from events.views import EventDetailMixin +from membership.models import Membership +from utils.mixins import LoginRequiredMixin, PermissionRequiredMixin +from mahjong_ranking.views import PlayerScore +from . import forms, models + + +class GameForm(EventDetailMixin, PermissionRequiredMixin, generic.UpdateView): + model = models.Game + permission_required = 'maistar_ranking.add_game' + form_class = forms.GameForm + + def get_object(self, queryset=None): + if 'game' in self.kwargs: + game = get_object_or_404(models.Game, pk=self.kwargs['game']) + elif 'event' in self.kwargs: + self.event = get_object_or_404(Event, pk=self.kwargs['event']) + game = models.Game(event=self.event) + return game + + +class DeleteGame(EventDetailMixin, PermissionRequiredMixin, generic.DeleteView): + """ + Fragt zuerst nach, ob die Hanchan wirklich gelöscht werden soll. + Wir die Frage mit "Ja" beantwortet, wird die die Hanchan gelöscht. + """ + model = models.Game + permission_required = 'maistar_ranking.delete_game' + pk_url_kwarg = 'hanchan' + + def get_success_url(self): + return reverse( + 'maistar_ranking-game-list', + kwargs={'event': self.object.event.pk} + ) + + +class UpdateGame(EventDetailMixin, PermissionRequiredMixin, generic.UpdateView): + """ + Ein Formular um eine neues Spiel anzulegen, bzw. eine bestehendes zu + bearbeiten. + """ + model = models.Game + permission_required = 'maistar_ranking.update_game' + + def get_object(self, queryset=None): # @UnusedVariable + game = models.Game.objects.get(id=self.kwargs['game']) + self.event = game.event + return game + + def get_context_data(self, **kwargs): + context = generic.UpdateView.get_context_data(self, **kwargs) + context['event'] = self.event + return context + + +class ListGames(EventDetailMixin, generic.ListView): + """ + Auflistung aller Spiele welche während einer Veranstaltung gespielt wurden. + """ + model = models.Game + + def get_queryset(self): + self.event = get_object_or_404(models.Event, pk=self.kwargs['event']) + return models.Game.objects.filter(event=self.event).select_related() + + +class ListPlayerGames(PlayerScore): + template_name = 'maistar_ranking/player_game_list.html' + paginate_by = 25 + context_object_name = 'game_list' + + def get_context_data(self, **kwargs): + context = super(ListPlayerGames, self).get_context_data() + context['membership'] = Membership.objects.get(user=self.user) + context['season_list'] = models.Ranking.objects.filter(user=self.user).values_list('season', flat=True) + context['season'] = self.season + return context + + def get_queryset(self, **kwargs): + self.user = get_object_or_404(auth.get_user_model(), + username=self.kwargs.get('username')) + self.season = self.kwargs.get('season', date.today().year) + return models.Game.objects.player_games(player=self.user, + season=self.season) + + +class ListRankings(generic.ListView): + model = models.Ranking + paginate_by = 50 + season = None + is_archive = False + + def get_queryset(self): + self.season = int(self.kwargs.get('season', date.today().year)) + queryset = models.Ranking.objects.filter( + season=self.season, + placement__isnull=False + ) + queryset = queryset.select_related() + return queryset + + def get_context_data(self, **kwargs): + context = generic.ListView.get_context_data(self, **kwargs) + context['is_archive'] = self.is_archive + context['season'] = self.season + context['season_list'] = models.Ranking.objects.get_seasons() + context['latest_games'] = models.Game.objects.filter(confirmed=True)[:3] + context['latest_events'] = Event.objects.archive()[:3] + return context diff --git a/membership/locale/de/LC_MESSAGES/django.po b/membership/locale/de/LC_MESSAGES/django.po index 5dccc7b..40dd8ee 100644 --- a/membership/locale/de/LC_MESSAGES/django.po +++ b/membership/locale/de/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: kasu.membership\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-12-09 20:35+0100\n" +"POT-Creation-Date: 2014-12-14 01:12+0100\n" "PO-Revision-Date: 2014-12-08 16:18+0100\n" "Last-Translator: Christian Berg \n" "Language-Team: Kasu \n" diff --git a/requirements/base.txt b/requirements/base.txt index ad369e9..54bf522 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,16 +1,18 @@ -pillow BeautifulSoup django < 1.7 +django-appconf +django-compressor django-grappelli -django-social-auth django-imagekit -django-markdown -MySQL-python +# django-markdown +django-social-auth feedparser icalendar jsmin -xlwt +MySQL-python +pillow +python-social-auth pytz==2013d -scss +xlwt markdown < 2.5 -#bzr+https://code.launchpad.net/~adam.russell/pyexiv2/pyexiv2-0.3 +bzr+https://code.launchpad.net/~adam.russell/pyexiv2/pyexiv2-0.3 diff --git a/requirements/development.txt b/requirements/development.txt new file mode 100644 index 0000000..4628fba --- /dev/null +++ b/requirements/development.txt @@ -0,0 +1,2 @@ +django-debugbar +rosetta diff --git a/sync.sh b/sync.sh new file mode 100755 index 0000000..7baae8f --- /dev/null +++ b/sync.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +./cleanup.sh + +while read dir; do + echo "Syncing Files in $dir..." + rsync -av --delete $dir vu2004@www.kasu.at:~/ +done < files_to_sync.txt + +echo "Force Django reload..." +ssh vu2004@www.kasu.at "touch kasu/wsgi.py" +echo "done." diff --git a/utils/locale/de/LC_MESSAGES/django.po b/utils/locale/de/LC_MESSAGES/django.po index b4513fd..f9461ab 100644 --- a/utils/locale/de/LC_MESSAGES/django.po +++ b/utils/locale/de/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: kasu.utils\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-12-09 20:35+0100\n" +"POT-Creation-Date: 2014-12-14 01:12+0100\n" "PO-Revision-Date: 2014-12-08 16:18+0100\n" "Last-Translator: Christian Berg \n" "Language-Team: Kasu \n"