assign talk to track from topic
This commit is contained in:
parent
0c46ff3541
commit
c862863b6d
|
@ -8,7 +8,7 @@ class TalkAdmin(admin.ModelAdmin):
|
|||
# (it is easy to obtain incoherent data due to site framework)
|
||||
def has_add_permission(self, request):
|
||||
return False
|
||||
# Filter for 'on site' topics and event
|
||||
# Filter for 'on site' topics, tracks and events
|
||||
def get_form(self, request, obj=None, **kwargs):
|
||||
form = super(TalkAdmin, self).get_form(request, obj, **kwargs)
|
||||
# in fact, obj should never be none as 'add' button is disabled
|
||||
|
@ -18,8 +18,17 @@ class TalkAdmin(admin.ModelAdmin):
|
|||
form.base_fields['event'].queryset = Event.objects.filter(site=obj.site)
|
||||
return form
|
||||
|
||||
|
||||
class TopicAdmin(admin.ModelAdmin):
|
||||
# Filter for 'on site' tracks
|
||||
def get_form(self, request, obj=None, **kwargs):
|
||||
form = super().get_form(request, obj, **kwargs)
|
||||
if obj:
|
||||
form.base_fields['track'].queryset = Track.objects.filter(site=obj.site)
|
||||
return form
|
||||
|
||||
admin.site.register(Conference)
|
||||
admin.site.register(Topic)
|
||||
admin.site.register(Topic, TopicAdmin)
|
||||
admin.site.register(Track)
|
||||
admin.site.register(Talk, TalkAdmin)
|
||||
admin.site.register(Event)
|
||||
|
|
|
@ -102,24 +102,22 @@ class SpeakerFilterForm(forms.Form):
|
|||
self.fields['topic'].choices = topics.values_list('slug', 'name')
|
||||
|
||||
|
||||
class TopicCreateForm(forms.ModelForm):
|
||||
class TopicForm(forms.ModelForm):
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.site_id = kwargs.pop('site_id')
|
||||
super(TopicCreateForm, self).__init__(*args, **kwargs)
|
||||
self.site = kwargs.pop('site')
|
||||
super().__init__(*args, **kwargs)
|
||||
self.fields['track'].queryset = Track.objects.filter(site=self.site)
|
||||
|
||||
class Meta:
|
||||
model = Topic
|
||||
fields = ['name', 'description', 'reviewers']
|
||||
fields = ['name', 'description', 'reviewers', 'track']
|
||||
widgets = {'reviewers': Select2TagWidget()}
|
||||
|
||||
def clean_name(self):
|
||||
name = self.cleaned_data['name']
|
||||
if name != self.instance.name and Topic.objects.filter(site__id=self.site_id, name=name).exists():
|
||||
if self.instance and name != self.instance.name and Topic.objects.filter(site=self.site, name=name).exists():
|
||||
raise self.instance.unique_error_message(self._meta.model, ['name'])
|
||||
return name
|
||||
|
||||
|
||||
TopicUpdateForm = modelform_factory(Topic, fields=['reviewers'],
|
||||
widgets={'reviewers': Select2TagWidget()})
|
||||
|
||||
ConferenceForm = modelform_factory(Conference, fields=['home'])
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.10.1 on 2016-09-22 09:46
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('proposals', '0011_auto_20160921_2236'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='topic',
|
||||
name='track',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='proposals.Track', verbose_name='Destination track'),
|
||||
),
|
||||
]
|
|
@ -25,26 +25,6 @@ class Conference(models.Model):
|
|||
return str(self.site)
|
||||
|
||||
|
||||
class Topic(PonyConfModel):
|
||||
|
||||
site = models.ForeignKey(Site, on_delete=models.CASCADE)
|
||||
|
||||
name = models.CharField(max_length=128, verbose_name=_('Name'))
|
||||
slug = AutoSlugField(populate_from='name', unique=True)
|
||||
description = models.TextField(blank=True, verbose_name=_('Description'))
|
||||
|
||||
reviewers = models.ManyToManyField(User, blank=True, verbose_name=_('Reviewers'))
|
||||
|
||||
class Meta:
|
||||
unique_together = ('site', 'name')
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
def get_absolute_url(self):
|
||||
return reverse('list-talks') + '?topic=%s' % self.slug
|
||||
|
||||
|
||||
class Track(PonyConfModel):
|
||||
|
||||
site = models.ForeignKey(Site, on_delete=models.CASCADE)
|
||||
|
@ -60,6 +40,27 @@ class Track(PonyConfModel):
|
|||
return self.name
|
||||
|
||||
|
||||
class Topic(PonyConfModel):
|
||||
|
||||
site = models.ForeignKey(Site, on_delete=models.CASCADE)
|
||||
|
||||
name = models.CharField(max_length=128, verbose_name=_('Name'))
|
||||
slug = AutoSlugField(populate_from='name', unique=True)
|
||||
description = models.TextField(blank=True, verbose_name=_('Description'))
|
||||
track = models.ForeignKey(Track, blank=True, null=True, verbose_name=_('Destination track'))
|
||||
|
||||
reviewers = models.ManyToManyField(User, blank=True, verbose_name=_('Reviewers'))
|
||||
|
||||
class Meta:
|
||||
unique_together = ('site', 'name')
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
def get_absolute_url(self):
|
||||
return reverse('list-talks') + '?topic=%s' % self.slug
|
||||
|
||||
|
||||
class Event(models.Model):
|
||||
|
||||
site = models.ForeignKey(Site, on_delete=models.CASCADE)
|
||||
|
|
|
@ -48,7 +48,18 @@
|
|||
|
||||
<h3>{% trans "Track:" %}</h3>
|
||||
|
||||
<p>{% if talk.track %}{{ talk.track }}{% else %}<em>{% trans "No assigned yet." %}</em>{% endif %}</p>
|
||||
{% if talk.track %}
|
||||
<p>{{ talk.track }}</p>
|
||||
{% else %}
|
||||
<p><em>{% trans "No assigned yet." %}</em></p>
|
||||
{% for topic in talk.topics.distinct %}
|
||||
{% if forloop.first %}<p>{% endif %}
|
||||
{% if topic.track %}
|
||||
<a class="btn btn-primary" href="{% url 'assign-talk-to-track' talk.slug topic.track.slug %}">{% trans "Assign to" %} {{ topic.track }}</a>
|
||||
{% endif %}
|
||||
{% if forloop.last %}</p>{% endif %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
||||
{% endif %}
|
||||
|
||||
|
|
|
@ -14,6 +14,7 @@ urlpatterns = [
|
|||
url(r'^talk/details/(?P<slug>[-\w]+)$', views.TalkDetail.as_view(), name='show-talk'),
|
||||
url(r'^talk/accept/(?P<talk>[-\w]+)/$', views.talk_decide, {'accepted': True}, name='accept-talk'),
|
||||
url(r'^talk/decline/(?P<talk>[-\w]+)/$', views.talk_decide, {'accepted': False}, name='decline-talk'),
|
||||
url(r'^talk/assign-to-track/(?P<talk>[-\w]+)/(?P<track>[-\w]+)/$', views.talk_assign_to_track, name='assign-talk-to-track'),
|
||||
url(r'^topic/$', views.TopicList.as_view(), name='list-topics'),
|
||||
url(r'^topic/add/$', views.TopicCreate.as_view(), name='add-topic'),
|
||||
url(r'^topic/(?P<slug>[-\w]+)/edit/$', views.TopicUpdate.as_view(), name='edit-topic'),
|
||||
|
|
|
@ -21,8 +21,8 @@ from accounts.utils import is_staff
|
|||
|
||||
from conversations.models import ConversationWithParticipant, ConversationAboutTalk, Message
|
||||
|
||||
from .forms import TalkForm, TopicCreateForm, TopicUpdateForm, ConferenceForm, TalkFilterForm, STATUS_VALUES, SpeakerFilterForm
|
||||
from .models import Talk, Topic, Vote, Conference
|
||||
from .forms import TalkForm, TopicForm, ConferenceForm, TalkFilterForm, STATUS_VALUES, SpeakerFilterForm
|
||||
from .models import Talk, Track, Topic, Vote, Conference
|
||||
from .signals import talk_added, talk_edited
|
||||
from .utils import allowed_talks, markdown_to_html
|
||||
|
||||
|
@ -164,6 +164,17 @@ def talk_edit(request, talk=None):
|
|||
})
|
||||
|
||||
|
||||
@orga_required
|
||||
def talk_assign_to_track(request, talk, track):
|
||||
talk = get_object_or_404(Talk, slug=talk, site=get_current_site(request))
|
||||
track = get_object_or_404(Track, slug=track, site=get_current_site(request))
|
||||
talk.track = track
|
||||
talk.save()
|
||||
messages.success(request, _('Talk assigned to track successfully!'))
|
||||
next_url = request.GET.get('next') or reverse('show-talk', kwargs={'slug': talk.slug})
|
||||
return redirect(next_url)
|
||||
|
||||
|
||||
class TalkDetail(LoginRequiredMixin, DetailView):
|
||||
def get_queryset(self):
|
||||
return Talk.objects.filter(site=get_current_site(self.request)).all()
|
||||
|
@ -184,12 +195,17 @@ class TopicMixin(object):
|
|||
|
||||
|
||||
class TopicFormMixin(object):
|
||||
form_class = TopicForm
|
||||
|
||||
def get_form_kwargs(self):
|
||||
kwargs = super(TopicFormMixin, self).get_form_kwargs()
|
||||
if self.get_form_class() == TopicCreateForm:
|
||||
kwargs.update({'site_id': get_current_site(self.request).id})
|
||||
kwargs = super().get_form_kwargs()
|
||||
kwargs.update({'site': get_current_site(self.request)})
|
||||
return kwargs
|
||||
|
||||
def form_valid(self, form):
|
||||
form.instance.site = get_current_site(self.request)
|
||||
return super().form_valid(form)
|
||||
|
||||
|
||||
class TopicList(LoginRequiredMixin, TopicMixin, ListView):
|
||||
pass
|
||||
|
@ -197,16 +213,10 @@ class TopicList(LoginRequiredMixin, TopicMixin, ListView):
|
|||
|
||||
class TopicCreate(OrgaRequiredMixin, TopicMixin, TopicFormMixin, CreateView):
|
||||
model = Topic
|
||||
form_class = TopicCreateForm
|
||||
|
||||
def form_valid(self, form):
|
||||
form.instance.site = get_current_site(self.request)
|
||||
return super().form_valid(form)
|
||||
|
||||
|
||||
class TopicUpdate(OrgaRequiredMixin, TopicMixin, TopicFormMixin, UpdateView):
|
||||
def get_form_class(self):
|
||||
return TopicCreateForm if self.request.user.is_superuser else TopicUpdateForm
|
||||
pass
|
||||
|
||||
|
||||
@login_required
|
||||
|
|
Loading…
Reference in New Issue