Django admin for Organizer/Event

This commit is contained in:
Raphael Michel
2014-09-12 21:00:56 +02:00
parent b77264dc47
commit 9f3fb52cce
5 changed files with 394 additions and 44 deletions

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: 1\n" "Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-09-11 21:09+0200\n" "POT-Creation-Date: 2014-09-12 20:56+0200\n"
"PO-Revision-Date: 2014-09-11 11:05+200\n" "PO-Revision-Date: 2014-09-11 11:05+200\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n" "Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: Raphael Michel <michel@rami.io>\n" "Language-Team: Raphael Michel <michel@rami.io>\n"
@@ -26,71 +26,188 @@ msgstr "Deutsch"
msgid "English" msgid "English"
msgstr "Englisch" msgstr "Englisch"
#: tixlbase/admin.py:16 #: tixlbase/admin.py:18
msgid "The two password fields didn't match." msgid "The two password fields didn't match."
msgstr "Die beiden eingegebenen Passwörter stimmen nicht überein." msgstr "Die beiden eingegebenen Passwörter stimmen nicht überein."
#: tixlbase/admin.py:18 tixlcontrol/views/auth.py:15 #: tixlbase/admin.py:20 tixlcontrol/views/auth.py:16
msgid "Password" msgid "Password"
msgstr "Passwort" msgstr "Passwort"
#: tixlbase/admin.py:20 #: tixlbase/admin.py:22
msgid "Password confirmation" msgid "Password confirmation"
msgstr "Passwort bestätigen" msgstr "Passwort bestätigen"
#: tixlbase/admin.py:22 #: tixlbase/admin.py:24
msgid "Enter the same password as above, for verification." msgid "Enter the same password as above, for verification."
msgstr "Geben Sie zur Bestätigung das selbe Passwort wie oben ein" msgstr "Geben Sie zur Bestätigung das selbe Passwort wie oben ein"
#: tixlbase/admin.py:50 #: tixlbase/admin.py:52
msgid "Personal info" msgid "Personal info"
msgstr "Persönliche Daten" msgstr "Persönliche Daten"
#: tixlbase/admin.py:51 #: tixlbase/admin.py:53
msgid "Permissions" msgid "Permissions"
msgstr "Berechtigungen" msgstr "Berechtigungen"
#: tixlbase/models.py:65 #: tixlbase/models.py:66
msgid "Letters, digits and @/./+/-/_ only." msgid "Letters, digits and @/./+/-/_ only."
msgstr "Nur Buchstaben, Zahlen und @/./+/-/_" msgstr "Nur Buchstaben, Zahlen und @/./+/-/_"
#: tixlbase/models.py:71 #: tixlbase/models.py:72
msgid "E-mail" msgid "E-mail"
msgstr "E-Mail" msgstr "E-Mail"
#: tixlbase/models.py:74 #: tixlbase/models.py:75
msgid "Given name" msgid "Given name"
msgstr "Vorname" msgstr "Vorname"
#: tixlbase/models.py:77 #: tixlbase/models.py:78
msgid "Family name" msgid "Family name"
msgstr "Nachname" msgstr "Nachname"
#: tixlbase/models.py:80
msgid "Is active"
msgstr "Ist aktiviert"
#: tixlbase/models.py:84
msgid "Date joined"
msgstr "Registrierungsdatum"
#: tixlbase/models.py:126
msgid "User"
msgstr "Benutzer"
#: tixlbase/models.py:127
msgid "Users"
msgstr "Benutzer"
#: tixlbase/models.py:139 tixlbase/models.py:209
msgid "Name"
msgstr "Name"
#: tixlbase/models.py:142 tixlbase/models.py:211
msgid "Slug"
msgstr "Kurzform"
#: tixlbase/models.py:150
msgid "Organizer"
msgstr "Veranstalter"
#: tixlbase/models.py:151
msgid "Organizers"
msgstr "Veranstalter"
#: tixlbase/models.py:165
msgid "Can create events"
msgstr "Kann Veranstaltungen erstellen"
#: tixlbase/models.py:169 tixlbase/models.py:271
#, python-format
msgid "%(name)s on %(object)s"
msgstr "%(name)s für %(object)s"
#: tixlbase/models.py:175
msgid "Organizer permission"
msgstr "Veranstalter-Berechtigung"
#: tixlbase/models.py:176
msgid "Organizer permissions"
msgstr "Veranstalter-Berechtigungen"
#: tixlbase/models.py:216
msgid "Default locale"
msgstr "Standardsprache"
#: tixlbase/models.py:218
msgid "Default currency"
msgstr "Standardwährung"
#: tixlbase/models.py:219
msgid "Event start time"
msgstr "Veranstaltungsbeginn"
#: tixlbase/models.py:221
msgid "Event end time"
msgstr "Veranstaltungsende"
#: tixlbase/models.py:224
msgid "Show event end date"
msgstr "Zeige Veranstaltungsende"
#: tixlbase/models.py:228
msgid "Show dates with time"
msgstr "Zeige Uhrzeiten"
#: tixlbase/models.py:232
msgid "End of presale"
msgstr "Ende des Vorverkaufs"
#: tixlbase/models.py:236
msgid "Start of presale"
msgstr "Beginn des Vorverkaufs"
#: tixlbase/models.py:240
msgid "Payment term in days"
msgstr "Zahlungsziel in Tagen"
#: tixlbase/models.py:244
msgid "Last date of payments"
msgstr "Datum des letzten möglichen Zahlungseingangs"
#: tixlbase/models.py:251
msgid "Event"
msgstr "Veranstaltung"
#: tixlbase/models.py:252 tixlcontrol/templates/tixlcontrol/base.html:28
#: tixlcontrol/templates/tixlcontrol/events/index.html:3
msgid "Events"
msgstr "Veranstaltungen"
#: tixlbase/models.py:267
msgid "Can change event settings"
msgstr "Kann Veranstaltungseinstellungen ändern"
#: tixlbase/models.py:277
msgid "Event permission"
msgstr "Veranstaltungs-Berechtigungen"
#: tixlbase/models.py:278
#, fuzzy
#| msgid "Permissions"
msgid "Event permissions"
msgstr "Berechtigungen"
#: tixlcontrol/templates/tixlcontrol/auth/base.html:18
#, python-format
msgid "powered by <a %(a_attr)s>tixl</a>"
msgstr "powered by <a %(a_attr)s>tixl</a>"
#: tixlcontrol/templates/tixlcontrol/auth/login.html:12 #: tixlcontrol/templates/tixlcontrol/auth/login.html:12
msgid "Log in" msgid "Log in"
msgstr "Anmelden" msgstr "Anmelden"
#: tixlcontrol/templates/tixlcontrol/base.html:17 #: tixlcontrol/templates/tixlcontrol/base.html:17
msgid "Toggle navigation" msgid "Toggle navigation"
msgstr "" msgstr "Navigation umschalten"
#: tixlcontrol/templates/tixlcontrol/base.html:26 #: tixlcontrol/templates/tixlcontrol/base.html:27
msgid "Dashboard" msgid "Dashboard"
msgstr "Übersicht" msgstr "Übersicht"
#: tixlcontrol/templates/tixlcontrol/base.html:30 #: tixlcontrol/templates/tixlcontrol/base.html:33
msgid "Log out" msgid "Log out"
msgstr "Abmelden" msgstr "Abmelden"
#: tixlcontrol/views/auth.py:14 #: tixlcontrol/views/auth.py:15
msgid "E-mail address" msgid "E-mail address"
msgstr "E-Mail-Adresse" msgstr "E-Mail-Adresse"
#: tixlcontrol/views/auth.py:19 #: tixlcontrol/views/auth.py:20
msgid "Please enter a correct e-mail address and password." msgid "Please enter a correct e-mail address and password."
msgstr "" msgstr ""
"Bitte geben Sie eine gültige Kombination aus E-Mail-Adresse und Passwort ein." "Bitte geben Sie eine gültige Kombination aus E-Mail-Adresse und Passwort ein."
#: tixlcontrol/views/auth.py:20 #: tixlcontrol/views/auth.py:21
msgid "This account is inactive." msgid "This account is inactive."
msgstr "Dieses Konto ist deaktiviert." msgstr "Dieses Konto ist deaktiviert."

View File

@@ -3,7 +3,9 @@ from django.contrib.auth.admin import UserAdmin
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django import forms from django import forms
from tixlbase.models import User from tixlbase.models import (
User, Organizer, OrganizerPermission, Event, EventPermission
)
class TixlUserCreationForm(forms.ModelForm): class TixlUserCreationForm(forms.ModelForm):
@@ -57,4 +59,36 @@ class TixlUserAdmin(UserAdmin):
list_filter = ('is_staff', 'is_active', 'groups') list_filter = ('is_staff', 'is_active', 'groups')
add_form = TixlUserCreationForm add_form = TixlUserCreationForm
class OrganizerPermissionInline(admin.TabularInline):
model = OrganizerPermission
extra = 2
class OrganizerAdmin(admin.ModelAdmin):
model = Organizer
inlines = [OrganizerPermissionInline]
list_display = ('name', 'slug')
search_fields = ('name', 'slug')
class EventPermissionInline(admin.TabularInline):
model = EventPermission
extra = 2
class EventAdmin(admin.ModelAdmin):
model = Event
inlines = [EventPermissionInline]
list_display = ('name', 'slug', 'organizer', 'date_from')
search_fields = ('name', 'slug')
list_filter = ('date_from', 'locale', 'currency')
admin.site.register(User, TixlUserAdmin) admin.site.register(User, TixlUserAdmin)
admin.site.register(Organizer, OrganizerAdmin)
admin.site.register(Event, EventAdmin)

View File

@@ -0,0 +1,138 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('tixlbase', '0005_auto_20140911_2052'),
]
operations = [
migrations.AlterModelOptions(
name='event',
options={'verbose_name_plural': 'Events', 'verbose_name': 'Event', 'ordering': ('date_from', 'name')},
),
migrations.AlterModelOptions(
name='eventpermission',
options={'verbose_name_plural': 'Event permissions', 'verbose_name': 'Event permission'},
),
migrations.AlterModelOptions(
name='organizer',
options={'verbose_name_plural': 'Organizers', 'verbose_name': 'Organizer', 'ordering': ('name',)},
),
migrations.AlterModelOptions(
name='organizerpermission',
options={'verbose_name_plural': 'Organizer permissions', 'verbose_name': 'Organizer permission'},
),
migrations.AlterModelOptions(
name='user',
options={'verbose_name_plural': 'Users', 'verbose_name': 'User'},
),
migrations.RenameField(
model_name='eventpermission',
old_name='organizer',
new_name='event',
),
migrations.AlterField(
model_name='event',
name='currency',
field=models.CharField(max_length=10, verbose_name='Default currency'),
),
migrations.AlterField(
model_name='event',
name='date_from',
field=models.DateTimeField(verbose_name='Event start time'),
),
migrations.AlterField(
model_name='event',
name='date_to',
field=models.DateTimeField(blank=True, null=True, verbose_name='Event end time'),
),
migrations.AlterField(
model_name='event',
name='locale',
field=models.CharField(max_length=10, verbose_name='Default locale', choices=[('de', 'German'), ('en', 'English')]),
),
migrations.AlterField(
model_name='event',
name='name',
field=models.CharField(max_length=200, verbose_name='Name'),
),
migrations.AlterField(
model_name='event',
name='payment_term_days',
field=models.IntegerField(verbose_name='Payment term in days', default=14),
),
migrations.AlterField(
model_name='event',
name='payment_term_last',
field=models.DateTimeField(blank=True, null=True, verbose_name='Last date of payments'),
),
migrations.AlterField(
model_name='event',
name='presale_end',
field=models.DateTimeField(blank=True, null=True, verbose_name='End of presale'),
),
migrations.AlterField(
model_name='event',
name='presale_start',
field=models.DateTimeField(blank=True, null=True, verbose_name='Start of presale'),
),
migrations.AlterField(
model_name='event',
name='show_date_to',
field=models.BooleanField(verbose_name='Show event end date', default=True),
),
migrations.AlterField(
model_name='event',
name='show_times',
field=models.BooleanField(verbose_name='Show dates with time', default=True),
),
migrations.AlterField(
model_name='event',
name='slug',
field=models.CharField(db_index=True, max_length=50, verbose_name='Slug'),
),
migrations.AlterField(
model_name='eventpermission',
name='can_change_settings',
field=models.BooleanField(verbose_name='Can change event settings', default=True),
),
migrations.AlterField(
model_name='organizer',
name='name',
field=models.CharField(max_length=200, verbose_name='Name'),
),
migrations.AlterField(
model_name='organizer',
name='slug',
field=models.CharField(db_index=True, max_length=50, verbose_name='Slug', unique=True),
),
migrations.AlterField(
model_name='organizerpermission',
name='can_create_events',
field=models.BooleanField(verbose_name='Can create events', default=True),
),
migrations.AlterField(
model_name='user',
name='date_joined',
field=models.DateTimeField(verbose_name='Date joined', auto_now_add=True),
),
migrations.AlterField(
model_name='user',
name='is_active',
field=models.BooleanField(verbose_name='Is active', default=True),
),
migrations.AlterField(
model_name='user',
name='is_staff',
field=models.BooleanField(verbose_name='Is site admin', default=False),
),
migrations.AlterUniqueTogether(
name='eventpermission',
unique_together=set([('event', 'user')]),
),
]

View File

@@ -1,6 +1,7 @@
from django.db import models from django.db import models
from django.conf import settings
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext_lazy as _
class UserManager(BaseUserManager): class UserManager(BaseUserManager):
@@ -75,9 +76,12 @@ class User(AbstractBaseUser, PermissionsMixin):
familyname = models.CharField(max_length=255, blank=True, familyname = models.CharField(max_length=255, blank=True,
null=True, null=True,
verbose_name=_('Family name')) verbose_name=_('Family name'))
is_active = models.BooleanField(default=True) is_active = models.BooleanField(default=True,
is_staff = models.BooleanField(default=False) verbose_name=_('Is active'))
date_joined = models.DateTimeField(auto_now_add=True) is_staff = models.BooleanField(default=False,
verbose_name=('Is site admin'))
date_joined = models.DateTimeField(auto_now_add=True,
verbose_name=_('Date joined'))
objects = UserManager() objects = UserManager()
@@ -119,6 +123,8 @@ class User(AbstractBaseUser, PermissionsMixin):
REQUIRED_FIELDS = ['username'] REQUIRED_FIELDS = ['username']
class Meta: class Meta:
verbose_name = _("User")
verbose_name_plural = _("Users")
unique_together = (("event", "username"),) unique_together = (("event", "username"),)
@@ -129,13 +135,20 @@ class Organizer(models.Model):
all lowercase) being used in URLs. all lowercase) being used in URLs.
""" """
name = models.CharField(max_length=200) name = models.CharField(max_length=200,
verbose_name=_("Name"))
slug = models.CharField(max_length=50, slug = models.CharField(max_length=50,
unique=True, db_index=True) unique=True, db_index=True,
verbose_name=_("Slug"))
permitted = models.ManyToManyField(User, through='OrganizerPermission', permitted = models.ManyToManyField(User, through='OrganizerPermission',
related_name="organizers") related_name="organizers")
def __str__(self):
return self.name
class Meta: class Meta:
verbose_name = _("Organizer")
verbose_name_plural = _("Organizers")
ordering = ("name",) ordering = ("name",)
@@ -147,9 +160,20 @@ class OrganizerPermission(models.Model):
organizer = models.ForeignKey(Organizer) organizer = models.ForeignKey(Organizer)
user = models.ForeignKey(User, related_name="organizer_perms") user = models.ForeignKey(User, related_name="organizer_perms")
can_create_events = models.BooleanField(default=True) can_create_events = models.BooleanField(
default=True,
verbose_name=_("Can create events"),
)
def __str__(self):
return _("%(name)s on %(object)s") % {
'name': str(self.user),
'object': str(self.organizer),
}
class Meta: class Meta:
verbose_name = _("Organizer permission")
verbose_name_plural = _("Organizer permissions")
unique_together = (("organizer", "user"),) unique_together = (("organizer", "user"),)
@@ -181,22 +205,51 @@ class Event(models.Model):
organizer = models.ForeignKey(Organizer, related_name="events", organizer = models.ForeignKey(Organizer, related_name="events",
on_delete=models.PROTECT) on_delete=models.PROTECT)
name = models.CharField(max_length=200) name = models.CharField(max_length=200,
slug = models.CharField(max_length=50, db_index=True) verbose_name=_("Name"))
slug = models.CharField(max_length=50, db_index=True,
verbose_name=_("Slug"))
permitted = models.ManyToManyField(User, through='EventPermission', permitted = models.ManyToManyField(User, through='EventPermission',
related_name="events") related_name="events",)
locale = models.CharField(max_length=10) locale = models.CharField(max_length=10,
currency = models.CharField(max_length=10) choices=settings.LANGUAGES,
date_from = models.DateTimeField() verbose_name=_("Default locale"))
date_to = models.DateTimeField(null=True, blank=True) currency = models.CharField(max_length=10,
show_date_to = models.BooleanField(default=True) verbose_name=_("Default currency"))
show_times = models.BooleanField(default=True) date_from = models.DateTimeField(verbose_name=_("Event start time"))
presale_end = models.DateTimeField(null=True, blank=True) date_to = models.DateTimeField(null=True, blank=True,
presale_start = models.DateTimeField(null=True, blank=True) verbose_name=_("Event end time"))
payment_term_days = models.IntegerField(default=14) show_date_to = models.BooleanField(
payment_term_last = models.DateTimeField(null=True, blank=True) default=True,
verbose_name=_("Show event end date")
)
show_times = models.BooleanField(
default=True,
verbose_name=_("Show dates with time")
)
presale_end = models.DateTimeField(
null=True, blank=True,
verbose_name=_("End of presale")
)
presale_start = models.DateTimeField(
null=True, blank=True,
verbose_name=_("Start of presale")
)
payment_term_days = models.IntegerField(
default=14,
verbose_name=_("Payment term in days")
)
payment_term_last = models.DateTimeField(
null=True, blank=True,
verbose_name=_("Last date of payments")
)
def __str__(self):
return self.name
class Meta: class Meta:
verbose_name = _("Event")
verbose_name_plural = _("Events")
unique_together = (("organizer", "slug"),) unique_together = (("organizer", "slug"),)
ordering = ("date_from", "name") ordering = ("date_from", "name")
@@ -207,9 +260,20 @@ class EventPermission(models.Model):
access an event. access an event.
""" """
organizer = models.ForeignKey(Event) event = models.ForeignKey(Event)
user = models.ForeignKey(User, related_name="event_perms") user = models.ForeignKey(User, related_name="event_perms")
can_change_settings = models.BooleanField(default=True) can_change_settings = models.BooleanField(
default=True,
verbose_name=_("Can change event settings")
)
def __str__(self):
return _("%(name)s on %(object)s") % {
'name': str(self.user),
'object': str(self.event),
}
class Meta: class Meta:
unique_together = (("organizer", "user"),) verbose_name = _("Event permission")
verbose_name_plural = _("Event permissions")
unique_together = (("event", "user"),)

View File

@@ -1,3 +0,0 @@
from django.shortcuts import render
# Create your views here.