Basic item settings

This commit is contained in:
Raphael Michel
2014-09-27 12:36:56 +02:00
parent 49efb881ce
commit 675688d5df
9 changed files with 271 additions and 30 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-16 22:52+0200\n" "POT-Creation-Date: 2014-09-27 12:36+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,31 +26,31 @@ msgstr "Deutsch"
msgid "English" msgid "English"
msgstr "Englisch" msgstr "Englisch"
#: tixlbase/admin.py:18 #: tixlbase/admin.py:19
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:20 tixlcontrol/views/auth.py:16 #: tixlbase/admin.py:21 tixlcontrol/views/auth.py:16
msgid "Password" msgid "Password"
msgstr "Passwort" msgstr "Passwort"
#: tixlbase/admin.py:22 #: tixlbase/admin.py:23
msgid "Password confirmation" msgid "Password confirmation"
msgstr "Passwort bestätigen" msgstr "Passwort bestätigen"
#: tixlbase/admin.py:24 #: tixlbase/admin.py:25
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:52 #: tixlbase/admin.py:53
msgid "Personal info" msgid "Personal info"
msgstr "Persönliche Daten" msgstr "Persönliche Daten"
#: tixlbase/admin.py:53 #: tixlbase/admin.py:54
msgid "Locale" msgid "Locale"
msgstr "Sprache" msgstr "Sprache"
#: tixlbase/admin.py:54 #: tixlbase/admin.py:55
msgid "Permissions" msgid "Permissions"
msgstr "Berechtigungen" msgstr "Berechtigungen"
@@ -111,7 +111,7 @@ msgstr "Veranstalter"
msgid "Can create events" msgid "Can create events"
msgstr "Kann Veranstaltungen erstellen" msgstr "Kann Veranstaltungen erstellen"
#: tixlbase/models.py:178 tixlbase/models.py:314 #: tixlbase/models.py:178 tixlbase/models.py:318
#, python-format #, python-format
msgid "%(name)s on %(object)s" msgid "%(name)s on %(object)s"
msgstr "%(name)s für %(object)s" msgstr "%(name)s für %(object)s"
@@ -219,7 +219,7 @@ msgstr ""
"Das Datum, bis zu dem Zahlungseingänge akzeptiert werden. Diese Einstellung " "Das Datum, bis zu dem Zahlungseingänge akzeptiert werden. Diese Einstellung "
"hat Vorrang über der oben eingestellten Anzahl an Tagen" "hat Vorrang über der oben eingestellten Anzahl an Tagen"
#: tixlbase/models.py:294 #: tixlbase/models.py:294 tixlbase/models.py:409
msgid "Event" msgid "Event"
msgstr "Veranstaltung" msgstr "Veranstaltung"
@@ -233,55 +233,99 @@ msgstr "Veranstaltungen"
msgid "Can change event settings" msgid "Can change event settings"
msgstr "Kann Veranstaltungseinstellungen ändern" msgstr "Kann Veranstaltungseinstellungen ändern"
#: tixlbase/models.py:320 #: tixlbase/models.py:314
msgid "Can change item settings"
msgstr "Kann Produkte ändern"
#: tixlbase/models.py:324
msgid "Event permission" msgid "Event permission"
msgstr "Veranstaltungs-Berechtigung" msgstr "Veranstaltungs-Berechtigung"
#: tixlbase/models.py:321 #: tixlbase/models.py:325
msgid "Event permissions" msgid "Event permissions"
msgstr "Veranstaltungs-Berechtigungen" msgstr "Veranstaltungs-Berechtigungen"
#: tixlbase/models.py:333 #: tixlbase/models.py:337
msgid "Category name" msgid "Category name"
msgstr "Bezeichnung" msgstr "Bezeichnung"
#: tixlbase/models.py:343 #: tixlbase/models.py:347
msgid "Item category" msgid "Item category"
msgstr "Produktkategorie" msgstr "Produktkategorie"
#: tixlbase/models.py:344 #: tixlbase/models.py:348
msgid "Item categories" msgid "Item categories"
msgstr "Produktkategorien" msgstr "Produktkategorien"
#: tixlbase/models.py:361 #: tixlbase/models.py:362
msgid "Property name"
msgstr "Bezeichnung"
#: tixlbase/models.py:369
msgid "Item property"
msgstr "Eigenschaft"
#: tixlbase/models.py:370
msgid "Item properties"
msgstr "Eigenschaften"
#: tixlbase/models.py:386
msgid "Value"
msgstr ""
#: tixlbase/models.py:416
msgid "Category"
msgstr "Kategorie"
#: tixlbase/models.py:420 tixlcontrol/templates/tixlcontrol/items/index.html:9
msgid "Item name" msgid "Item name"
msgstr "Produktbezeichnung" msgstr "Produktbezeichnung"
#: tixlbase/models.py:366 #: tixlbase/models.py:424
msgid "Active"
msgstr "aktiviert"
#: tixlbase/models.py:428
msgid "Short description" msgid "Short description"
msgstr "Kurze Beschreibung" msgstr "Kurze Beschreibung"
#: tixlbase/models.py:367 #: tixlbase/models.py:429
msgid "This is shown below the item name in lists." msgid "This is shown below the item name in lists."
msgstr "Wird in Listen unter dem Name angezeigt." msgstr "Wird in Listen unter dem Name angezeigt."
#: tixlbase/models.py:371 #: tixlbase/models.py:433
msgid "Long description" msgid "Long description"
msgstr "Lange Beschreibung" msgstr "Lange Beschreibung"
#: tixlbase/models.py:376 #: tixlbase/models.py:438 tixlbase/models.py:503
msgid "Default price" msgid "Default price"
msgstr "Basispreis" msgstr "Basispreis"
#: tixlbase/models.py:381 #: tixlbase/models.py:443
msgid "Included taxes in percent" msgid "Taxes included in percent"
msgstr "Steuern inklusive in Prozent" msgstr "Steuern inklusive in Prozent"
#: tixlbase/models.py:394 #: tixlbase/models.py:449 tixlcontrol/templates/tixlcontrol/items/base.html:8
msgid "Properties"
msgstr "Eigenschaften"
#: tixlbase/models.py:451
msgid ""
"The selected properties will be available for the user to select. After "
"saving this field, move to the 'Variations' tab to configure the details."
msgstr ""
"Die hier ausgewählten Eigenschaften stehen für dieses Produkt zur Verfügung. "
"Nach der Auswahl können Sie im Tab 'Varianten' die Details konfigurieren:"
#: tixlbase/models.py:466 tixlcontrol/templates/tixlcontrol/item/base.html:3
msgid "Item" msgid "Item"
msgstr "Produkt" msgstr "Produkt"
#: tixlbase/models.py:395 #: tixlbase/models.py:467 tixlcontrol/templates/tixlcontrol/event/base.html:20
#: tixlcontrol/templates/tixlcontrol/items/base.html:3
#: tixlcontrol/templates/tixlcontrol/items/base.html:6
#: tixlcontrol/templates/tixlcontrol/items/index.html:3
#: tixlcontrol/templates/tixlcontrol/items/index.html:5
msgid "Items" msgid "Items"
msgstr "Produkte" msgstr "Produkte"
@@ -329,10 +373,14 @@ msgid "Settings"
msgstr "Einstellungen" msgstr "Einstellungen"
#: tixlcontrol/templates/tixlcontrol/event/settings.html:9 #: tixlcontrol/templates/tixlcontrol/event/settings.html:9
#: tixlcontrol/templates/tixlcontrol/item/index.html:9
msgid "Your changes have been saved." msgid "Your changes have been saved."
msgstr "Die Änderungen wurden gespeichert." msgstr "Die Änderungen wurden gespeichert."
#: tixlcontrol/templates/tixlcontrol/event/settings.html:15 #: tixlcontrol/templates/tixlcontrol/event/settings.html:15
#: tixlcontrol/templates/tixlcontrol/item/base.html:7
#: tixlcontrol/templates/tixlcontrol/item/index.html:5
#: tixlcontrol/templates/tixlcontrol/item/index.html:15
msgid "General information" msgid "General information"
msgstr "Allgemeine Informationen" msgstr "Allgemeine Informationen"
@@ -349,6 +397,7 @@ msgid "Payment settings"
msgstr "Zahlungseinstellungen" msgstr "Zahlungseinstellungen"
#: tixlcontrol/templates/tixlcontrol/event/settings.html:42 #: tixlcontrol/templates/tixlcontrol/event/settings.html:42
#: tixlcontrol/templates/tixlcontrol/item/index.html:34
msgid "Save" msgid "Save"
msgstr "Speichern" msgstr "Speichern"
@@ -373,6 +422,22 @@ msgstr "Beginn"
msgid "End date" msgid "End date"
msgstr "Ende" msgstr "Ende"
#: tixlcontrol/templates/tixlcontrol/item/base.html:5
msgid "Modify item:"
msgstr ""
#: tixlcontrol/templates/tixlcontrol/item/index.html:23
msgid "Price settings"
msgstr "Preis"
#: tixlcontrol/templates/tixlcontrol/item/index.html:28
msgid "Variations"
msgstr "Varianten"
#: tixlcontrol/templates/tixlcontrol/items/base.html:7
msgid "Categories"
msgstr "Kategorien"
#: tixlcontrol/views/auth.py:15 #: tixlcontrol/views/auth.py:15
msgid "E-mail address" msgid "E-mail address"
msgstr "E-Mail-Adresse" msgstr "E-Mail-Adresse"

View File

@@ -406,18 +406,23 @@ class Item(models.Model):
Event, Event,
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name="items", related_name="items",
verbose_name=_("Event"),
) )
category = models.ForeignKey( category = models.ForeignKey(
ItemCategory, ItemCategory,
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name="items", related_name="items",
blank=True, null=True blank=True, null=True,
verbose_name=_("Category"),
) )
name = models.CharField( name = models.CharField(
max_length=255, max_length=255,
verbose_name=_("Item name") verbose_name=_("Item name")
) )
active = models.BooleanField(default=True) active = models.BooleanField(
default=True,
verbose_name=_("Active"),
)
deleted = models.BooleanField(default=False) deleted = models.BooleanField(default=False)
short_description = models.TextField( short_description = models.TextField(
verbose_name=_("Short description"), verbose_name=_("Short description"),
@@ -435,12 +440,18 @@ class Item(models.Model):
) )
tax_rate = models.DecimalField( tax_rate = models.DecimalField(
null=True, blank=True, null=True, blank=True,
verbose_name=_("Included taxes in percent"), verbose_name=_("Taxes included in percent"),
max_digits=7, decimal_places=2 max_digits=7, decimal_places=2
) )
properties = models.ManyToManyField( properties = models.ManyToManyField(
Property, Property,
related_name='items', related_name='items',
verbose_name=_("Properties"),
help_text=_(
'The selected properties will be available for the user '
+ 'to select. After saving this field, move to the '
+ '\'Variations\' tab to configure the details.'
)
) )
def __str__(self): def __str__(self):

View File

@@ -17,4 +17,5 @@
</li> </li>
<li {% if url_name == "event.index" %}class="active"{% endif %}><a href="{% url 'control:event.index' organizer=request.event.organizer.slug event=request.event.slug %}">{% trans "Dashboard" %}</a></li> <li {% if url_name == "event.index" %}class="active"{% endif %}><a href="{% url 'control:event.index' organizer=request.event.organizer.slug event=request.event.slug %}">{% trans "Dashboard" %}</a></li>
<li {% if url_name == "event.settings" %}class="active"{% endif %}><a href="{% url 'control:event.settings' organizer=request.event.organizer.slug event=request.event.slug %}">{% trans "Settings" %}</a></li> <li {% if url_name == "event.settings" %}class="active"{% endif %}><a href="{% url 'control:event.settings' organizer=request.event.organizer.slug event=request.event.slug %}">{% trans "Settings" %}</a></li>
<li {% if "event.item" in url_name %}class="active"{% endif %}><a href="{% url 'control:event.items' organizer=request.event.organizer.slug event=request.event.slug %}">{% trans "Items" %}</a></li>
{% endblock %} {% endblock %}

View File

@@ -0,0 +1,11 @@
{% extends "tixlcontrol/event/base.html" %}
{% load i18n %}
{% block title %}{{ item.name }} :: {% trans "Item" %}{% endblock %}
{% block content %}
<h1>{% trans "Modify item:" %} {{ item.name }}</h1>
<ul class="nav nav-pills">
<li {% if "event.item" == url_name %}class="active"{% endif %}><a href="{% url 'control:event.item' organizer=request.event.organizer.slug event=request.event.slug item=item.pk %}">{% trans "General information" %}</a></li>
</ul>
{% block inside %}
{% endblock %}
{% endblock %}

View File

@@ -0,0 +1,39 @@
{% extends "tixlcontrol/item/base.html" %}
{% load i18n %}
{% load bootstrap3 %}
{% block inside %}
<h2>{% trans "General information" %}</h2>
{% if "success" in request.GET %}
<div class="alert alert-success">
{% trans "Your changes have been saved." %}
</div>
{% endif %}
<form action="" method="post" class="form-horizontal">
{% csrf_token %}
<fieldset>
<legend>{% trans "General information" %}</legend>
{% bootstrap_field form.name layout="horizontal" %}
{% bootstrap_field form.active layout="horizontal" %}
{% bootstrap_field form.category layout="horizontal" %}
{% bootstrap_field form.short_description layout="horizontal" %}
{% bootstrap_field form.long_description layout="horizontal" %}
</fieldset>
<fieldset>
<legend>{% trans "Price settings" %}</legend>
{% bootstrap_field form.default_price layout="horizontal" %}
{% bootstrap_field form.tax_rate layout="horizontal" %}
</fieldset>
<fieldset>
<legend>{% trans "Variations" %}</legend>
{% bootstrap_field form.properties layout="horizontal" %}
</fieldset>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-primary">
{% trans "Save" %}
</button>
</div>
</div>
</form>
{% endblock %}

View File

@@ -0,0 +1,12 @@
{% extends "tixlcontrol/event/base.html" %}
{% load i18n %}
{% block title %}{% trans "Items" %}{% endblock %}
{% block content %}
<ul class="nav nav-pills">
<li {% if "event.items" == url_name %}class="active"{% endif %}><a href="{% url 'control:event.items' organizer=request.event.organizer.slug event=request.event.slug %}">{% trans "Items" %}</a></li>
<li {% if "event.items.categories" in url_name %}class="active"{% endif %}><a href="{% url 'control:event.items.categories' organizer=request.event.organizer.slug event=request.event.slug %}">{% trans "Categories" %}</a></li>
<li {% if "event.items.properties" in url_name %}class="active"{% endif %}><a href="{% url 'control:event.items.properties' organizer=request.event.organizer.slug event=request.event.slug %}">{% trans "Properties" %}</a></li>
</ul>
{% block inside %}
{% endblock %}
{% endblock %}

View File

@@ -0,0 +1,20 @@
{% extends "tixlcontrol/items/base.html" %}
{% load i18n %}
{% block title %}{% trans "Items" %}{% endblock %}
{% block inside %}
<h1>{% trans "Items" %}</h1>
<table class="table table-condensed table-hover">
<thead>
<tr>
<th>{% trans "Item name" %}</th>
</tr>
</thead>
<tbody>
{% for i in items %}
<tr>
<td><strong><a href="{% url "control:event.item" organizer=request.event.organizer.slug event=request.event.slug item=i.pk %}">{{ i.name }}</a></strong></td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}

View File

@@ -1,5 +1,5 @@
from django.conf.urls import patterns, url, include from django.conf.urls import patterns, url, include
from tixlcontrol.views import main, event from tixlcontrol.views import main, event, item
urlpatterns = patterns('',) urlpatterns = patterns('',)
urlpatterns += patterns( urlpatterns += patterns(
@@ -16,9 +16,13 @@ urlpatterns += patterns(
'tixlcontrol.views.event', 'tixlcontrol.views.event',
url(r'^event/(?P<organizer>[^/]+)/(?P<event>[^/]+)/', include( url(r'^event/(?P<organizer>[^/]+)/(?P<event>[^/]+)/', include(
patterns( patterns(
'tixlcontrol.views.event', 'tixlcontrol.views',
url(r'^$', 'index', name='event.index'), url(r'^$', 'event.index', name='event.index'),
url(r'^settings$', event.EventUpdate.as_view(), name='event.settings'), url(r'^settings$', event.EventUpdate.as_view(), name='event.settings'),
url(r'^items$', item.ItemList.as_view(), name='event.items'),
url(r'^items/(?P<item>\d+)/$', item.ItemUpdateGeneral.as_view(), name='event.item'),
url(r'^categories$', item.CategoryList.as_view(), name='event.items.categories'),
url(r'^properties$', item.PropertyList.as_view(), name='event.items.properties'),
) )
)) ))
) )

View File

@@ -0,0 +1,78 @@
from django.views.generic import ListView
from django.views.generic.edit import UpdateView
from django.core.urlresolvers import resolve, reverse
from django import forms
from tixlbase.models import Item, ItemCategory, Property
from tixlcontrol.permissions import EventPermissionRequiredMixin
class ItemList(ListView):
model = Item
context_object_name = 'items'
template_name = 'tixlcontrol/items/index.html'
def get_queryset(self):
return Item.objects.filter(
event=self.request.event
)
class CategoryList(ListView):
model = ItemCategory
context_object_name = 'items'
template_name = 'tixlcontrol/items/index.html'
def get_queryset(self):
return ItemCategory.objects.filter(
event=self.request.event
)
class PropertyList(ListView):
model = Property
context_object_name = 'items'
template_name = 'tixlcontrol/items/index.html'
def get_queryset(self):
return Property.objects.filter(
event=self.request.event
)
class ItemUpdateFormGeneral(forms.ModelForm):
class Meta:
model = Item
localized_fields = '__all__'
fields = [
'category',
'name',
'active',
'short_description',
'long_description',
'default_price',
'tax_rate',
'properties',
]
class ItemUpdateGeneral(EventPermissionRequiredMixin, UpdateView):
model = Item
form_class = ItemUpdateFormGeneral
template_name = 'tixlcontrol/item/index.html'
permission = 'can_change_items'
context_object_name = 'item'
def get_object(self, queryset=None):
url = resolve(self.request.path_info)
return self.request.event.items.get(
id=url.kwargs['item']
)
def get_success_url(self):
return reverse('control:event.item', kwargs={
'organizer': self.request.event.organizer.slug,
'event': self.request.event.slug,
'item': self.get_object().pk,
}) + '?success=true'