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 ""
"Project-Id-Version: 1\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"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: Raphael Michel <michel@rami.io>\n"
@@ -26,31 +26,31 @@ msgstr "Deutsch"
msgid "English"
msgstr "Englisch"
#: tixlbase/admin.py:18
#: tixlbase/admin.py:19
msgid "The two password fields didn't match."
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"
msgstr "Passwort"
#: tixlbase/admin.py:22
#: tixlbase/admin.py:23
msgid "Password confirmation"
msgstr "Passwort bestätigen"
#: tixlbase/admin.py:24
#: tixlbase/admin.py:25
msgid "Enter the same password as above, for verification."
msgstr "Geben Sie zur Bestätigung das selbe Passwort wie oben ein"
#: tixlbase/admin.py:52
#: tixlbase/admin.py:53
msgid "Personal info"
msgstr "Persönliche Daten"
#: tixlbase/admin.py:53
#: tixlbase/admin.py:54
msgid "Locale"
msgstr "Sprache"
#: tixlbase/admin.py:54
#: tixlbase/admin.py:55
msgid "Permissions"
msgstr "Berechtigungen"
@@ -111,7 +111,7 @@ msgstr "Veranstalter"
msgid "Can create events"
msgstr "Kann Veranstaltungen erstellen"
#: tixlbase/models.py:178 tixlbase/models.py:314
#: tixlbase/models.py:178 tixlbase/models.py:318
#, python-format
msgid "%(name)s on %(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 "
"hat Vorrang über der oben eingestellten Anzahl an Tagen"
#: tixlbase/models.py:294
#: tixlbase/models.py:294 tixlbase/models.py:409
msgid "Event"
msgstr "Veranstaltung"
@@ -233,55 +233,99 @@ msgstr "Veranstaltungen"
msgid "Can change event settings"
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"
msgstr "Veranstaltungs-Berechtigung"
#: tixlbase/models.py:321
#: tixlbase/models.py:325
msgid "Event permissions"
msgstr "Veranstaltungs-Berechtigungen"
#: tixlbase/models.py:333
#: tixlbase/models.py:337
msgid "Category name"
msgstr "Bezeichnung"
#: tixlbase/models.py:343
#: tixlbase/models.py:347
msgid "Item category"
msgstr "Produktkategorie"
#: tixlbase/models.py:344
#: tixlbase/models.py:348
msgid "Item categories"
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"
msgstr "Produktbezeichnung"
#: tixlbase/models.py:366
#: tixlbase/models.py:424
msgid "Active"
msgstr "aktiviert"
#: tixlbase/models.py:428
msgid "Short description"
msgstr "Kurze Beschreibung"
#: tixlbase/models.py:367
#: tixlbase/models.py:429
msgid "This is shown below the item name in lists."
msgstr "Wird in Listen unter dem Name angezeigt."
#: tixlbase/models.py:371
#: tixlbase/models.py:433
msgid "Long description"
msgstr "Lange Beschreibung"
#: tixlbase/models.py:376
#: tixlbase/models.py:438 tixlbase/models.py:503
msgid "Default price"
msgstr "Basispreis"
#: tixlbase/models.py:381
msgid "Included taxes in percent"
#: tixlbase/models.py:443
msgid "Taxes included in percent"
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"
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"
msgstr "Produkte"
@@ -329,10 +373,14 @@ msgid "Settings"
msgstr "Einstellungen"
#: tixlcontrol/templates/tixlcontrol/event/settings.html:9
#: tixlcontrol/templates/tixlcontrol/item/index.html:9
msgid "Your changes have been saved."
msgstr "Die Änderungen wurden gespeichert."
#: 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"
msgstr "Allgemeine Informationen"
@@ -349,6 +397,7 @@ msgid "Payment settings"
msgstr "Zahlungseinstellungen"
#: tixlcontrol/templates/tixlcontrol/event/settings.html:42
#: tixlcontrol/templates/tixlcontrol/item/index.html:34
msgid "Save"
msgstr "Speichern"
@@ -373,6 +422,22 @@ msgstr "Beginn"
msgid "End date"
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
msgid "E-mail address"
msgstr "E-Mail-Adresse"

View File

@@ -406,18 +406,23 @@ class Item(models.Model):
Event,
on_delete=models.PROTECT,
related_name="items",
verbose_name=_("Event"),
)
category = models.ForeignKey(
ItemCategory,
on_delete=models.PROTECT,
related_name="items",
blank=True, null=True
blank=True, null=True,
verbose_name=_("Category"),
)
name = models.CharField(
max_length=255,
verbose_name=_("Item name")
)
active = models.BooleanField(default=True)
active = models.BooleanField(
default=True,
verbose_name=_("Active"),
)
deleted = models.BooleanField(default=False)
short_description = models.TextField(
verbose_name=_("Short description"),
@@ -435,12 +440,18 @@ class Item(models.Model):
)
tax_rate = models.DecimalField(
null=True, blank=True,
verbose_name=_("Included taxes in percent"),
verbose_name=_("Taxes included in percent"),
max_digits=7, decimal_places=2
)
properties = models.ManyToManyField(
Property,
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):

View File

@@ -17,4 +17,5 @@
</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 "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 %}

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 tixlcontrol.views import main, event
from tixlcontrol.views import main, event, item
urlpatterns = patterns('',)
urlpatterns += patterns(
@@ -16,9 +16,13 @@ urlpatterns += patterns(
'tixlcontrol.views.event',
url(r'^event/(?P<organizer>[^/]+)/(?P<event>[^/]+)/', include(
patterns(
'tixlcontrol.views.event',
url(r'^$', 'index', name='event.index'),
'tixlcontrol.views',
url(r'^$', 'event.index', name='event.index'),
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'