Fehler bei Vergabe von Bonuspunkte korrigiert.
Kommentare für Bonuspunkte werden jetzt als Kommentar beim Spieler hinterlassen, nicht als Kommentar in der Hanchan. FIXED: 3_in_a_row counter wurde nicht zurückgesetzt wenn Bonuspunkte vergeben wurden. FIXED: Durchschnittliche Platzierung während eines Events wurde nur als Ganzzahl berechnet. Wird nun als Fießkomma berechnet und gesichert.
This commit is contained in:
@@ -7,9 +7,8 @@ Created on 19.09.2011
|
||||
from django.contrib import admin
|
||||
from django.contrib.auth.models import Group
|
||||
from django.contrib.auth.admin import UserAdmin, GroupAdmin
|
||||
from django.contrib.auth.forms import ReadOnlyPasswordHashField
|
||||
# from django.contrib.auth.forms import ReadOnlyPasswordHashField
|
||||
from django.utils.translation import ugettext as _
|
||||
from imagekit.admin import AdminThumbnail
|
||||
|
||||
from membership.models import Membership, ActivationRequest
|
||||
|
||||
@@ -30,10 +29,12 @@ def cleanup_activation(modeladmin, request, queryset):
|
||||
activation.user.delete()
|
||||
|
||||
|
||||
cleanup_activation.short_description = _("Cleanup selected Activation Requests")
|
||||
cleanup_activation.short_description = _(
|
||||
"Cleanup selected Activation Requests")
|
||||
|
||||
|
||||
class ProxyGroup(Group):
|
||||
|
||||
class Meta:
|
||||
proxy = True
|
||||
verbose_name = _('Group')
|
||||
@@ -41,10 +42,10 @@ class ProxyGroup(Group):
|
||||
|
||||
|
||||
class MembershipAdmin(UserAdmin):
|
||||
admin_thumbnail = AdminThumbnail(image_field='thumbnail')
|
||||
# admin_thumbnail = AdminThumbnail(image_field='thumbnail')
|
||||
list_filter = ('membership', 'confirmed')
|
||||
list_display = (
|
||||
'admin_thumbnail',
|
||||
'avatar',
|
||||
'username',
|
||||
'first_name',
|
||||
'last_name',
|
||||
@@ -55,11 +56,11 @@ class MembershipAdmin(UserAdmin):
|
||||
list_editable = ('confirmed', 'paid_until',)
|
||||
list_display_links = ('username',)
|
||||
fieldsets = (
|
||||
(None, {'fields': (('username', 'password'), 'gender',
|
||||
(None, {'fields': (('username', 'password'), 'gender', 'avatar',
|
||||
('first_name', 'last_name'), ('email', 'website'))}),
|
||||
(_('Membership'), {'classes': ('collapse',),
|
||||
'fields': (('membership', 'confirmed'), 'birthday', 'telephone',
|
||||
'street_name', ('post_code', 'city'))}),
|
||||
'street_name', ('post_code', 'city'))}),
|
||||
(_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser',
|
||||
'groups', 'user_permissions')}),
|
||||
(_('Important dates'), {'fields': ('last_login', 'date_joined')}),
|
||||
|
||||
@@ -23,33 +23,32 @@ class MembershipForm(forms.ModelForm):
|
||||
fields = (
|
||||
'username', 'gender', 'first_name', 'last_name', 'email', 'avatar',
|
||||
'website', 'membership', 'birthday', 'telephone', 'street_name',
|
||||
'post_code', 'city', 'comment'
|
||||
'post_code', 'city'
|
||||
)
|
||||
|
||||
def clean_birthday(self):
|
||||
if self.cleaned_data['membership'] and not self.cleaned_data[
|
||||
'birthday']:
|
||||
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_telephone(self):
|
||||
if self.cleaned_data['membership'] and not self.cleaned_data[
|
||||
'telephone']:
|
||||
'telephone']:
|
||||
raise forms.ValidationError(_('For your membership, we need this. \
|
||||
Please fill out this field yet.'))
|
||||
return self.cleaned_data['telephone']
|
||||
|
||||
def clean_street_name(self):
|
||||
if self.cleaned_data['membership'] and not self.cleaned_data[
|
||||
'street_name']:
|
||||
'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 self.cleaned_data['membership'] and not self.cleaned_data[
|
||||
'post_code']:
|
||||
'post_code']:
|
||||
raise forms.ValidationError(_('For your membership, we need this. \
|
||||
Please fill out this field yet.'))
|
||||
return self.cleaned_data['post_code']
|
||||
@@ -145,6 +144,7 @@ class RegistrationForm(forms.ModelForm):
|
||||
user.is_active = False
|
||||
if commit:
|
||||
user.save()
|
||||
activation = models.ActivationRequest.objects.create_pending_registration(user) # @IgnorePep8
|
||||
activation = models.ActivationRequest.objects.create_pending_registration(
|
||||
user) # @IgnorePep8
|
||||
self.send_email(activation)
|
||||
return user
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Project-Id-Version: kasu.membership\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2015-08-16 11:34+0200\n"
|
||||
"PO-Revision-Date: 2015-08-16 11:37+0200\n"
|
||||
"PO-Revision-Date: 2015-09-03 18:31+0200\n"
|
||||
"Last-Translator: Christian Berg <xeniac.at@gmail.com>\n"
|
||||
"Language-Team: Kasu <verein@kasu.at>\n"
|
||||
"Language: de\n"
|
||||
@@ -356,10 +356,10 @@ msgid ""
|
||||
" confirm your email address, otherwise your can't login.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"<p>Nach dem du deine Daten eingegeben hast, wirst du eine E-Mail zur "
|
||||
"Bestätigung bekommen.</p>\n"
|
||||
"<p>Bitte klicke auf den Link in dieser E-Mail zur Verifizierung, erst dann "
|
||||
"ist die Anmeldung möglich.</p>"
|
||||
"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."
|
||||
|
||||
#: templates/membership/register_form.html:30
|
||||
msgid "reset"
|
||||
|
||||
@@ -11,4 +11,3 @@ class Command(BaseCommand):
|
||||
def handle(self, *args, **options):
|
||||
for activation in ActivationRequest.objects.expired():
|
||||
activation.user.delete()
|
||||
|
||||
|
||||
@@ -20,33 +20,57 @@ class Migration(migrations.Migration):
|
||||
migrations.CreateModel(
|
||||
name='Membership',
|
||||
fields=[
|
||||
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
|
||||
('password', models.CharField(max_length=128, verbose_name='password')),
|
||||
('last_login', models.DateTimeField(null=True, verbose_name='last login', blank=True)),
|
||||
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
|
||||
('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, max_length=30, validators=[django.core.validators.RegexValidator('^[\\w.@+-]+$', 'Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.', 'invalid')], help_text='Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.', unique=True, verbose_name='username')),
|
||||
('first_name', models.CharField(max_length=30, verbose_name='first name', blank=True)),
|
||||
('last_name', models.CharField(max_length=30, verbose_name='last name', blank=True)),
|
||||
('email', models.EmailField(max_length=254, verbose_name='email address', blank=True)),
|
||||
('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
|
||||
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
|
||||
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
|
||||
('gender', models.CharField(max_length=1, verbose_name='Geschlecht', choices=[(b'm', 'M\xe4nnlich'), (b'f', 'Weiblich')])),
|
||||
('id', models.AutoField(verbose_name='ID',
|
||||
serialize=False, auto_created=True, primary_key=True)),
|
||||
('password', models.CharField(
|
||||
max_length=128, verbose_name='password')),
|
||||
('last_login', models.DateTimeField(
|
||||
null=True, verbose_name='last login', blank=True)),
|
||||
('is_superuser', models.BooleanField(default=False,
|
||||
help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
|
||||
('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, max_length=30, validators=[django.core.validators.RegexValidator(
|
||||
'^[\\w.@+-]+$', 'Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.', 'invalid')], help_text='Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.', unique=True, verbose_name='username')),
|
||||
('first_name', models.CharField(max_length=30,
|
||||
verbose_name='first name', blank=True)),
|
||||
('last_name', models.CharField(max_length=30,
|
||||
verbose_name='last name', blank=True)),
|
||||
('email', models.EmailField(max_length=254,
|
||||
verbose_name='email address', blank=True)),
|
||||
('is_staff', models.BooleanField(default=False,
|
||||
help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
|
||||
('is_active', models.BooleanField(
|
||||
default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
|
||||
('date_joined', models.DateTimeField(
|
||||
default=django.utils.timezone.now, verbose_name='date joined')),
|
||||
('gender', models.CharField(max_length=1, verbose_name='Geschlecht', choices=[
|
||||
(b'm', 'M\xe4nnlich'), (b'f', 'Weiblich')])),
|
||||
('website', models.URLField(blank=True)),
|
||||
('avatar', models.ImageField(storage=utils.OverwriteStorage(), null=True, upload_to=membership.models.get_upload_path, blank=True)),
|
||||
('membership', models.BooleanField(default=False, help_text='Ja, ich bin mit den Statuen einverstanden und m\xf6chte Mitglied werden.', verbose_name='Mitgliedschaft')),
|
||||
('birthday', models.DateField(null=True, verbose_name='Geburtstag', blank=True)),
|
||||
('telephone', models.CharField(max_length=30, null=True, verbose_name='Telefon', blank=True)),
|
||||
('street_name', models.CharField(max_length=75, null=True, verbose_name='Adresse', blank=True)),
|
||||
('post_code', models.PositiveSmallIntegerField(null=True, verbose_name='Postleitzahl', blank=True)),
|
||||
('city', models.CharField(max_length=75, null=True, verbose_name='Ort', blank=True)),
|
||||
('deposit', models.PositiveSmallIntegerField(default=0, editable=False)),
|
||||
('avatar', models.ImageField(storage=utils.OverwriteStorage(
|
||||
), null=True, upload_to=membership.models.get_upload_path, blank=True)),
|
||||
('membership', models.BooleanField(default=False,
|
||||
help_text='Ja, ich bin mit den Statuen einverstanden und m\xf6chte Mitglied werden.', verbose_name='Mitgliedschaft')),
|
||||
('birthday', models.DateField(null=True,
|
||||
verbose_name='Geburtstag', blank=True)),
|
||||
('telephone', models.CharField(max_length=30,
|
||||
null=True, verbose_name='Telefon', blank=True)),
|
||||
('street_name', models.CharField(max_length=75,
|
||||
null=True, verbose_name='Adresse', blank=True)),
|
||||
('post_code', models.PositiveSmallIntegerField(
|
||||
null=True, verbose_name='Postleitzahl', blank=True)),
|
||||
('city', models.CharField(max_length=75,
|
||||
null=True, verbose_name='Ort', blank=True)),
|
||||
('deposit', models.PositiveSmallIntegerField(
|
||||
default=0, editable=False)),
|
||||
('registration_date', models.DateField(auto_now_add=True)),
|
||||
('paid_until', models.DateField(null=True, verbose_name='Bezahlt bis', blank=True)),
|
||||
('confirmed', models.BooleanField(default=False, help_text='Diese Person hat ihre Mitgliedschaft bezahlt', verbose_name='Best\xe4tigt')),
|
||||
('paid_until', models.DateField(null=True,
|
||||
verbose_name='Bezahlt bis', blank=True)),
|
||||
('confirmed', models.BooleanField(default=False,
|
||||
help_text='Diese Person hat ihre Mitgliedschaft bezahlt', verbose_name='Best\xe4tigt')),
|
||||
('comment', models.TextField(blank=True)),
|
||||
('groups', models.ManyToManyField(related_query_name='user', related_name='user_set', to='auth.Group', blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', verbose_name='groups')),
|
||||
('user_permissions', models.ManyToManyField(related_query_name='user', related_name='user_set', to='auth.Permission', blank=True, help_text='Specific permissions for this user.', verbose_name='user permissions')),
|
||||
('groups', models.ManyToManyField(related_query_name='user', related_name='user_set', to='auth.Group', blank=True,
|
||||
help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', verbose_name='groups')),
|
||||
('user_permissions', models.ManyToManyField(related_query_name='user', related_name='user_set', to='auth.Permission',
|
||||
blank=True, help_text='Specific permissions for this user.', verbose_name='user permissions')),
|
||||
],
|
||||
options={
|
||||
'ordering': ('last_name', 'first_name'),
|
||||
@@ -61,9 +85,12 @@ class Migration(migrations.Migration):
|
||||
migrations.CreateModel(
|
||||
name='ActivationRequest',
|
||||
fields=[
|
||||
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
|
||||
('activation_key', models.CharField(max_length=40, verbose_name='Aktivierungsschl\xfcssel')),
|
||||
('user', models.OneToOneField(verbose_name='Benutzer', to=settings.AUTH_USER_MODEL)),
|
||||
('id', models.AutoField(verbose_name='ID',
|
||||
serialize=False, auto_created=True, primary_key=True)),
|
||||
('activation_key', models.CharField(
|
||||
max_length=40, verbose_name='Aktivierungsschl\xfcssel')),
|
||||
('user', models.OneToOneField(
|
||||
verbose_name='Benutzer', to=settings.AUTH_USER_MODEL)),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Ausstehende Aktivierung',
|
||||
|
||||
@@ -13,6 +13,7 @@ class Migration(migrations.Migration):
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name='membership',
|
||||
options={'ordering': ('username',), 'verbose_name': 'Mitgliedschaft', 'verbose_name_plural': 'Mitgliedschaften'},
|
||||
options={'ordering': ('username',), 'verbose_name': 'Mitgliedschaft',
|
||||
'verbose_name_plural': 'Mitgliedschaften'},
|
||||
),
|
||||
]
|
||||
|
||||
18
src/membership/migrations/0004_remove_membership_comment.py
Normal file
18
src/membership/migrations/0004_remove_membership_comment.py
Normal file
@@ -0,0 +1,18 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import models, migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('membership', '0003_auto_20150820_2122'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='membership',
|
||||
name='comment',
|
||||
),
|
||||
]
|
||||
23
src/membership/migrations/0005_auto_20150901_2204.py
Normal file
23
src/membership/migrations/0005_auto_20150901_2204.py
Normal file
@@ -0,0 +1,23 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import models, migrations
|
||||
import membership.models
|
||||
import utils
|
||||
import easy_thumbnails.fields
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('membership', '0004_remove_membership_comment'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='membership',
|
||||
name='avatar',
|
||||
field=easy_thumbnails.fields.ThumbnailerImageField(storage=utils.OverwriteStorage(
|
||||
), null=True, upload_to=membership.models.get_upload_path, blank=True),
|
||||
),
|
||||
]
|
||||
@@ -11,10 +11,8 @@ from django.contrib.auth.models import AbstractUser
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.db import models
|
||||
from django.utils.translation import ugettext as _
|
||||
from imagekit.models import ImageSpecField
|
||||
from imagekit.processors import SmartResize
|
||||
|
||||
from . import PAID_MEMBERSHIP_GROUP
|
||||
from easy_thumbnails.fields import ThumbnailerImageField
|
||||
from utils import OverwriteStorage
|
||||
|
||||
|
||||
@@ -152,7 +150,7 @@ class Membership(AbstractUser):
|
||||
# last_name = models.CharField(_("Last Name"), max_length=30)
|
||||
# email = models.EmailField(_('Email'), unique=True)
|
||||
website = models.URLField(blank=True)
|
||||
avatar = models.ImageField(
|
||||
avatar = ThumbnailerImageField(
|
||||
upload_to=get_upload_path,
|
||||
storage=OverwriteStorage(),
|
||||
blank=True,
|
||||
@@ -201,21 +199,9 @@ class Membership(AbstractUser):
|
||||
default=False,
|
||||
help_text=_('This person has paid the membership fee.')
|
||||
)
|
||||
comment = models.TextField(blank=True)
|
||||
# comment = models.TextField(blank=True)
|
||||
# objects = MembershipManager()
|
||||
|
||||
thumbnail = ImageSpecField(
|
||||
format='JPEG',
|
||||
source='avatar',
|
||||
processors=[SmartResize(width=60, height=60)],
|
||||
)
|
||||
|
||||
profile = ImageSpecField(
|
||||
processors=[SmartResize(width=140, height=140)],
|
||||
format='PNG',
|
||||
source='avatar',
|
||||
)
|
||||
|
||||
class Meta(object):
|
||||
ordering = ('username', )
|
||||
swappable = 'AUTH_USER_MODEL'
|
||||
|
||||
@@ -21,4 +21,4 @@ class Thumbnail(ImageSpec):
|
||||
|
||||
class Profile(ImageSpec):
|
||||
pre_cache = False
|
||||
processors = (ResizeProfile,)
|
||||
processors = (ResizeProfile,)
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
{% block maincontent %}
|
||||
<h2 class="grid_12">Aktivierung fehlgeschlagen</h2>
|
||||
<p class="grid_12">Leider war die Aktivierung des Schlüssels “{{ activation_key }}” war nicht erfolgreich, dies könnte mehrere Gründe haben:</p>
|
||||
<p class="grid_12">Leider war die Aktivierung des Schlüssels “{{ activation_key }}” nicht erfolgreich, dies könnte mehrere Gründe haben:</p>
|
||||
<img class="grid_4" src="" alt="" />
|
||||
<ul class="grid_8">
|
||||
<li><strong>Der Aktivierungs Link ist nicht korrekt.</strong> Bitte kopiere die ganze Zeile aus der E-Mail in die Adressleiste.</li>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{% extends "base.html" %}
|
||||
{% load i18n comments %}
|
||||
{% load i18n comments thumbnail %}
|
||||
|
||||
{% block title %}{{ membership.first_name }} {{membership.last_name}}{% endblock %}
|
||||
|
||||
@@ -16,8 +16,8 @@
|
||||
{% endblock %}
|
||||
|
||||
{% block maincontent %}
|
||||
{% if membership.profile %}
|
||||
<img class="grid_3" src="{{membership.profile.url}}" alt="{% trans 'Profile Image' %}"/>
|
||||
{% 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 %}
|
||||
|
||||
@@ -21,6 +21,8 @@ urlpatterns = patterns(
|
||||
url(r'^activation_sent/$',
|
||||
views.ActivationSent.as_view(),
|
||||
name="membership-registration-complete"),
|
||||
url(r'^(?P<username>[\-\.\d\w]+)/$', views.MembershipDetail.as_view(), name='membership-details'),
|
||||
url(r'^(?P<username>[\-\.\d\w]+)/edit/$', views.EditMembership.as_view(), name="membership-edit")
|
||||
)
|
||||
url(r'^(?P<username>[\-\.\d\w]+)/$',
|
||||
views.MembershipDetail.as_view(), name='membership-details'),
|
||||
url(r'^(?P<username>[\-\.\d\w]+)/edit/$',
|
||||
views.EditMembership.as_view(), name="membership-edit")
|
||||
)
|
||||
|
||||
@@ -49,7 +49,7 @@ class ActivateRegistration(generic.DetailView):
|
||||
def login(self, user):
|
||||
backend = auth.get_backends()[0]
|
||||
user.backend = "%s.%s" % (
|
||||
backend.__module__, backend.__class__.__name__) # @IgnorePep8
|
||||
backend.__module__, backend.__class__.__name__) # @IgnorePep8
|
||||
auth.login(self.request, user)
|
||||
messages.success(self.request, _('Activation successful. \
|
||||
You can now login anytime with you username and password.'))
|
||||
|
||||
Reference in New Issue
Block a user