diff --git a/cfp/forms.py b/cfp/forms.py
index 09892a3..8e65a5b 100644
--- a/cfp/forms.py
+++ b/cfp/forms.py
@@ -308,12 +308,24 @@ class TrackForm(OnSiteNamedModelForm):
fields = ['name', 'description']
+class TalkCategoryForm(OnSiteNamedModelForm):
+ class Meta:
+ model = TalkCategory
+ fields = ['name', 'duration', 'color', 'label', 'opening_date', 'closing_date']
+
+
class RoomForm(OnSiteNamedModelForm):
class Meta:
model = Room
fields = ['name', 'label', 'capacity']
+class TagForm(OnSiteNamedModelForm):
+ class Meta:
+ model = Tag
+ fields = ['name', 'color', 'inverted', 'public']
+
+
class VolunteerForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.conference = kwargs.pop('conference')
diff --git a/cfp/models.py b/cfp/models.py
index e83164f..de85041 100644
--- a/cfp/models.py
+++ b/cfp/models.py
@@ -207,11 +207,16 @@ class Tag(models.Model):
inverted = models.BooleanField(default=False)
public = models.BooleanField(default=False, verbose_name=_('Show the tag on the program'))
+ def get_absolute_url(self):
+ return reverse('tag-list')
+
+ def get_filter_url(self):
+ return reverse('talk-list') + '?tag=' + self.slug
+
@property
def link(self):
- return format_html('{content}', **{
- 'url': reverse('talk-list'),
- 'tag': self.slug,
+ return format_html('{content}', **{
+ 'url': self.get_filter_url(),
'content': self.label,
})
@@ -260,6 +265,9 @@ class TalkCategory(models.Model): # type of talk (conf 30min, 1h, stand, …)
return ugettext(self.name)
def get_absolute_url(self):
+ return reverse('category-list')
+
+ def get_filter_url(self):
return reverse('talk-list') + '?category=%d' % self.pk
diff --git a/cfp/templates/cfp/admin/base.html b/cfp/templates/cfp/admin/base.html
index c6f4449..f204984 100644
--- a/cfp/templates/cfp/admin/base.html
+++ b/cfp/templates/cfp/admin/base.html
@@ -8,6 +8,8 @@
- {% trans "Conference" %}
+ - {% trans "Categories" %}
+ - {% trans "Tags" %}
{% if request.user.is_staff %}
- Django-Admin
{% endif %}
diff --git a/cfp/urls.py b/cfp/urls.py
index 2501520..cb60729 100644
--- a/cfp/urls.py
+++ b/cfp/urls.py
@@ -59,6 +59,12 @@ urlpatterns = [
url(r'^staff/select2/$', views.Select2View.as_view(), name='django_select2-json'),
url(r'^admin/$', views.admin, name='admin'),
url(r'^admin/conference/$', views.conference_edit, name='conference'),
+ url(r'^staff/categories/$', views.TalkCategoryList.as_view(), name='category-list'),
+ url(r'^staff/categories/add/$', views.TalkCategoryCreate.as_view(), name='category-add'),
+ url(r'^staff/categories/(?P[0-9]+)/edit/$', views.TalkCategoryUpdate.as_view(), name='category-edit'),
+ url(r'^staff/tags/$', views.TagList.as_view(), name='tag-list'),
+ url(r'^staff/tags/add/$', views.TagCreate.as_view(), name='tag-add'),
+ url(r'^staff/tags/(?P[-\w]+)/edit/$', views.TagUpdate.as_view(), name='tag-edit'),
url(r'^schedule/((?P[\w]+)/)?$', views.public_schedule, name='public-schedule'),
#url(r'^markdown/$', views.markdown_preview, name='markdown'),
]
diff --git a/cfp/views.py b/cfp/views.py
index 7f29d88..49de4a0 100644
--- a/cfp/views.py
+++ b/cfp/views.py
@@ -29,6 +29,7 @@ from .forms import TalkForm, TalkStaffForm, TalkFilterForm, TalkActionForm, \
ParticipantForm, ParticipantFilterForm, NotifyForm, \
ConferenceForm, CreateUserForm, TrackForm, RoomForm, \
VolunteerForm, VolunteerFilterForm, MailForm, \
+ TagForm, TalkCategoryForm, \
ACCEPTATION_VALUES, CONFIRMATION_VALUES
@@ -837,6 +838,64 @@ class RoomUpdate(StaffRequiredMixin, RoomFormMixin, UpdateView):
pass
+class TalkCategoryMixin(OnSiteMixin):
+ model = TalkCategory
+
+
+class TalkCategoryList(StaffRequiredMixin, TalkCategoryMixin, ListView):
+ template_name = 'cfp/admin/category_list.html'
+
+
+class TalkCategoryFormMixin(TalkCategoryMixin):
+ template_name = 'cfp/admin/category_form.html'
+ form_class = TalkCategoryForm
+ success_url = reverse_lazy('category-list')
+
+ def get_form_kwargs(self):
+ kwargs = super().get_form_kwargs()
+ kwargs.update({
+ 'conference': self.request.conference,
+ })
+ return kwargs
+
+
+class TalkCategoryCreate(StaffRequiredMixin, TalkCategoryFormMixin, CreateView):
+ pass
+
+
+class TalkCategoryUpdate(StaffRequiredMixin, TalkCategoryFormMixin, UpdateView):
+ pass
+
+
+class TagMixin(OnSiteMixin):
+ model = Tag
+
+
+class TagList(StaffRequiredMixin, TagMixin, ListView):
+ template_name = 'cfp/admin/tag_list.html'
+
+
+class TagFormMixin(TagMixin):
+ template_name = 'cfp/admin/tag_form.html'
+ form_class = TagForm
+ success_url = reverse_lazy('tag-list')
+
+ def get_form_kwargs(self):
+ kwargs = super().get_form_kwargs()
+ kwargs.update({
+ 'conference': self.request.conference,
+ })
+ return kwargs
+
+
+class TagCreate(StaffRequiredMixin, TagFormMixin, CreateView):
+ pass
+
+
+class TagUpdate(StaffRequiredMixin, TagFormMixin, UpdateView):
+ pass
+
+
@staff_required
def create_user(request):
form = CreateUserForm(request.POST or None)