Categories management

This commit is contained in:
Raphael Michel
2014-09-29 21:52:29 +02:00
parent ffd3e52584
commit 844c5d6545
4 changed files with 147 additions and 28 deletions

View File

@@ -342,7 +342,7 @@ class ItemCategory(models.Model):
verbose_name=_("Category name"), verbose_name=_("Category name"),
) )
position = models.IntegerField( position = models.IntegerField(
null=True, blank=True default=0
) )
def __str__(self): def __str__(self):

View File

@@ -4,23 +4,25 @@ from django.utils.translation import ugettext as _
from tixlbase.models import EventPermission from tixlbase.models import EventPermission
def event_permission_required(function, permission): def event_permission_required(permission):
def wrapper(request, *args, **kw): def decorator(function):
if not request.user.is_authenticated(): def wrapper(request, *args, **kw):
return HttpResponseForbidden() if not request.user.is_authenticated():
perm = EventPermission.objects.get( return HttpResponseForbidden()
event=request.event, perm = EventPermission.objects.get(
user=request.user event=request.event,
) user=request.user
allowed = False )
try: allowed = False
allowed = getattr(perm, permission) try:
except AttributeError: allowed = getattr(perm, permission)
pass except AttributeError:
if allowed: pass
return function(request, *args, **kw) if allowed:
return HttpResponseForbidden(_('You do not have permission to view this content.')) return function(request, *args, **kw)
return wrapper return HttpResponseForbidden(_('You do not have permission to view this content.'))
return wrapper
return decorator
class EventPermissionRequiredMixin: class EventPermissionRequiredMixin:
@@ -29,4 +31,4 @@ class EventPermissionRequiredMixin:
@classmethod @classmethod
def as_view(cls, **initkwargs): def as_view(cls, **initkwargs):
view = super(EventPermissionRequiredMixin, cls).as_view(**initkwargs) view = super(EventPermissionRequiredMixin, cls).as_view(**initkwargs)
return event_permission_required(view, cls.permission) return event_permission_required(cls.permission)(view)

View File

@@ -22,7 +22,12 @@ urlpatterns += patterns(
url(r'^items$', item.ItemList.as_view(), name='event.items'), 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'^items/(?P<item>\d+)/$', item.ItemUpdateGeneral.as_view(), name='event.item'),
url(r'^items/(?P<item>\d+)/variations$', item.ItemVariations.as_view(), name='event.item.variations'), url(r'^items/(?P<item>\d+)/variations$', item.ItemVariations.as_view(), name='event.item.variations'),
url(r'^categories$', item.CategoryList.as_view(), name='event.items.categories'), url(r'^categories/$', item.CategoryList.as_view(), name='event.items.categories'),
url(r'^category/(?P<category>\d+)/delete$', item.CategoryDelete.as_view(), name='event.items.categories.delete'),
url(r'^category/(?P<category>\d+)/up$', item.category_move_up, name='event.items.categories.up'),
url(r'^category/(?P<category>\d+)/down$', item.category_move_down, name='event.items.categories.down'),
url(r'^category/(?P<category>\d+)/$', item.CategoryUpdate.as_view(), name='event.items.categories.edit'),
url(r'^category/add$', item.CategoryCreate.as_view(), name='event.items.categories.add'),
url(r'^properties$', item.PropertyList.as_view(), name='event.items.properties'), url(r'^properties$', item.PropertyList.as_view(), name='event.items.properties'),
) )
)) ))

View File

@@ -1,14 +1,17 @@
from itertools import product from itertools import product
from django.views.generic import ListView from django.views.generic import ListView
from django.views.generic.edit import UpdateView from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.views.generic.base import TemplateView from django.views.generic.base import TemplateView
from django.views.generic.detail import SingleObjectMixin from django.views.generic.detail import SingleObjectMixin
from django.core.urlresolvers import resolve, reverse from django.core.urlresolvers import resolve, reverse
from django.http import HttpResponseRedirect
from django import forms from django import forms
from django.db.models import Q
from django.shortcuts import redirect
from tixlbase.models import Item, ItemCategory, Property, ItemVariation from tixlbase.models import Item, ItemCategory, Property, ItemVariation
from tixlcontrol.permissions import EventPermissionRequiredMixin from tixlcontrol.permissions import EventPermissionRequiredMixin, event_permission_required
class ItemList(ListView): class ItemList(ListView):
@@ -22,15 +25,124 @@ class ItemList(ListView):
) )
class CategoryForm(forms.ModelForm):
class Meta:
model = ItemCategory
localized_fields = '__all__'
fields = [
'name'
]
class CategoryDelete(EventPermissionRequiredMixin, DeleteView):
model = ItemCategory
form_class = CategoryForm
template_name = 'tixlcontrol/items/category_delete.html'
permission = 'can_change_items'
context_object_name = 'category'
def get_object(self, queryset=None):
url = resolve(self.request.path_info)
return self.request.event.categories.get(
id=url.kwargs['category']
)
def delete(self, request, *args, **kwargs):
self.object = self.get_object()
self.object.items.update(category=None)
success_url = self.get_success_url()
self.object.delete()
return HttpResponseRedirect(success_url)
def get_success_url(self):
return reverse('control:event.items.categories', kwargs={
'organizer': self.request.event.organizer.slug,
'event': self.request.event.slug,
}) + '?deleted=true'
class CategoryUpdate(EventPermissionRequiredMixin, UpdateView):
model = ItemCategory
form_class = CategoryForm
template_name = 'tixlcontrol/items/category.html'
permission = 'can_change_items'
context_object_name = 'category'
def get_object(self, queryset=None):
url = resolve(self.request.path_info)
return self.request.event.categories.get(
id=url.kwargs['category']
)
def get_success_url(self):
return reverse('control:event.items.categories', kwargs={
'organizer': self.request.event.organizer.slug,
'event': self.request.event.slug,
}) + '?updated=true'
class CategoryCreate(EventPermissionRequiredMixin, CreateView):
model = ItemCategory
form_class = CategoryForm
template_name = 'tixlcontrol/items/category.html'
permission = 'can_change_items'
context_object_name = 'category'
def get_success_url(self):
return reverse('control:event.items.categories', kwargs={
'organizer': self.request.event.organizer.slug,
'event': self.request.event.slug,
}) + '?created=true'
def form_valid(self, form):
form.instance.event = self.request.event
return super().form_valid(form)
class CategoryList(ListView): class CategoryList(ListView):
model = ItemCategory model = ItemCategory
context_object_name = 'items' context_object_name = 'categories'
template_name = 'tixlcontrol/items/index.html' template_name = 'tixlcontrol/items/categories.html'
def get_queryset(self): def get_queryset(self):
return ItemCategory.objects.filter( return self.request.event.categories.all()
event=self.request.event
)
def category_move(request, organizer, event, category, up=True):
category = request.event.categories.get(
id=category
)
categories = list(request.event.categories.order_by("position"))
index = categories.index(category)
if index != 0 and up:
categories[index - 1], categories[index] = categories[index], categories[index - 1]
elif index != len(categories) - 1 and not up:
categories[index + 1], categories[index] = categories[index], categories[index + 1]
for i, cat in enumerate(categories):
if cat.position != i:
cat.position = i
cat.save()
@event_permission_required("can_change_items")
def category_move_up(request, organizer, event, category):
category_move(request, organizer, event, category, up=True)
return redirect(reverse('control:event.items.categories', kwargs={
'organizer': request.event.organizer.slug,
'event': request.event.slug,
}) + '?ordered=true')
@event_permission_required("can_change_items")
def category_move_down(request, organizer, event, category):
category_move(request, organizer, event, category, up=False)
return redirect(reverse('control:event.items.categories', kwargs={
'organizer': request.event.organizer.slug,
'event': request.event.slug,
}) + '?ordered=true')
class PropertyList(ListView): class PropertyList(ListView):
@@ -165,7 +277,7 @@ class ItemVariations(TemplateView, SingleObjectMixin):
# on the x-axis # on the x-axis
sort = lambda v: v[prop2.pk].pk sort = lambda v: v[prop2.pk].pk
for val1 in prop1.values.all().order_by("id"): for val1 in prop1.values.all():
formrow = [] formrow = []
# We are now inside a grid row. We iterate over all variations # We are now inside a grid row. We iterate over all variations
# which belong in this row and create forms for them. In order # which belong in this row and create forms for them. In order