This commit is contained in:
Guilhem Saurel 2016-06-12 18:35:59 +02:00
parent dab6bf83f9
commit 336fd90275
6 changed files with 33 additions and 50 deletions

View File

@ -1,5 +1,6 @@
from django.contrib.sites.managers import CurrentSiteManager
from django.contrib.sites.models import Site
from django.core.urlresolvers import reverse
from django.db import models
from autoslug import AutoSlugField
@ -11,17 +12,15 @@ __all__ = ['Topic', 'Talk', 'Speach']
class Topic(models.Model):
site = models.ForeignKey(Site, on_delete=models.CASCADE)
name = models.CharField(max_length=128, verbose_name='Name', unique=True)
slug = AutoSlugField(populate_from='name', unique=True)
objects = models.Manager()
on_site = CurrentSiteManager()
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('list-talks-by-topic', kwargs={'slug': self.slug})
class Talk(models.Model):
@ -39,6 +38,9 @@ class Talk(models.Model):
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('show-talk', kwargs={'slug': self.slug})
class Speach(models.Model):
@ -46,7 +48,7 @@ class Speach(models.Model):
speaker = models.ForeignKey(Speaker, on_delete=models.CASCADE)
talk = models.ForeignKey(Talk, on_delete=models.CASCADE)
order = models.IntegerField(choices=SPEAKER_NO)
order = models.IntegerField(choices=SPEAKER_NO, default=1)
class Meta:
ordering = ['talk', 'order']
@ -58,5 +60,8 @@ class Speach(models.Model):
def __str__(self):
return '%s speaking at %s in position %d' % (self.speaker, self.talk, self.order)
def get_absolute_url(self):
return self.talk.get_absolute_url()
def username(self):
return self.speaker.user.username

View File

@ -24,8 +24,8 @@ class ProposalsTests(TestCase):
for view in ['home', 'list-talks', 'add-talk', 'list-topics', 'list-speakers']:
self.assertEqual(self.client.get(reverse(view)).status_code, 200)
talk = Talk.on_site.first()
for view in ['edit-talk', 'show-talk']:
self.assertEqual(self.client.get(reverse(view, kwargs={'talk': talk.slug})).status_code, 200)
self.assertEqual(self.client.get(reverse('edit-talk', kwargs={'talk': talk.slug})).status_code, 200)
self.assertEqual(self.client.get(reverse('show-talk', kwargs={'slug': talk.slug})).status_code, 200)
self.assertEqual(self.client.get(reverse('list-talks-by-speaker', kwargs={'speaker': 'a'})).status_code, 200)
self.assertEqual(self.client.get(reverse('show-user', kwargs={'username': 'a'})).status_code, 200)

View File

@ -7,10 +7,10 @@ urlpatterns = [
url(r'^talk/$', views.talk_list, name='list-talks'),
url(r'^talk/add/$', views.talk_edit, name='add-talk'),
url(r'^talk/edit/(?P<talk>[-\w]+)$', views.talk_edit, name='edit-talk'),
url(r'^talk/details/(?P<talk>[-\w]+)$', views.talk_details, name='show-talk'),
url(r'^talk/details/(?P<slug>[-\w]+)$', views.TalkDetail.as_view(), name='show-talk'),
url(r'^talk/by-topic/(?P<topic>[-\w]+)$', views.talk_list_by_topic, name='list-talks-by-topic'),
url(r'^talk/by-speaker/(?P<speaker>[\w.@+-]+)$', views.talk_list_by_speaker, name='list-talks-by-speaker'),
url(r'^topic/$', views.topic_list, name='list-topics'),
url(r'^speakers/$', views.speaker_list, name='list-speakers'),
url(r'^topic/$', views.TopicList.as_view(), name='list-topics'),
url(r'^speakers/$', views.SpeakerList.as_view(), name='list-speakers'),
url(r'^user/(?P<username>[\w.@+-]+)$', views.user_details, name='show-user'),
]

View File

@ -1,8 +1,10 @@
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.sites.shortcuts import get_current_site
from django.core.exceptions import PermissionDenied
from django.shortcuts import get_object_or_404, redirect, render
from django.views.generic import DetailView, ListView
from accounts.models import Profile, Speaker
from proposals.forms import TalkForm
@ -15,37 +17,27 @@ def home(request):
@login_required
def talk_list(request):
speaker = Speaker.on_site.filter(user=request.user)
if speaker.exists():
speaker = speaker.first()
mine = Talk.on_site.filter(speakers=speaker)
others = Talk.on_site.exclude(speakers=speaker)
else:
mine = []
others = Talk.on_site.all()
return render(request, 'proposals/talks.html', {
'my_talks': mine,
'other_talks': others,
'my_talks': Talk.on_site.filter(speakers__user=request.user),
'other_talks': Talk.on_site.exclude(speakers__user=request.user),
})
@login_required
def talk_list_by_topic(request, topic):
topic = get_object_or_404(Topic, site=get_current_site(request), slug=topic)
talks = Talk.objects.filter(topics=topic)
topic = get_object_or_404(Topic, slug=topic)
return render(request, 'proposals/talk_list.html', {
'title': 'Talks related to %s:' % topic.name,
'talks': talks,
'title': 'Talks related to %s:' % topic,
'talks': Talk.on_site.filter(topics=topic),
})
@login_required
def talk_list_by_speaker(request, speaker):
speaker = get_object_or_404(Speaker, user__username=speaker)
talks = Talk.on_site.filter(speakers=speaker)
return render(request, 'proposals/talk_list.html', {
'title': 'Talks with %s:' % speaker,
'talks': talks,
'talks': Talk.on_site.filter(speakers=speaker),
})
@ -69,42 +61,28 @@ def talk_edit(request, talk=None):
talk.site = site
talk.save()
speaker = Speaker.on_site.get_or_create(user=request.user, site=site)[0]
speach = Speach(speaker=speaker, talk=talk, order=1)
speach.save()
Speach.objects.create(speaker=speaker, talk=talk)
messages.success(request, 'Talk proposed successfully!')
return redirect('show-talk', talk.slug)
return redirect(talk.get_absolute_url())
return render(request, 'proposals/talk_edit.html', {
'form': form,
})
@login_required
def talk_details(request, talk):
talk = get_object_or_404(Talk, slug=talk)
return render(request, 'proposals/talk_details.html', {
'talk': talk,
})
class TalkDetail(LoginRequiredMixin, DetailView):
queryset = Talk.on_site.all()
@login_required
def topic_list(request):
topics = Topic.on_site.all()
return render(request, 'proposals/topic_list.html', {
'topics': topics,
})
class TopicList(LoginRequiredMixin, ListView):
model = Topic
@login_required
def speaker_list(request):
speakers = Speaker.on_site.all()
return render(request, 'proposals/speaker_list.html', {
'speaker': speakers,
})
class SpeakerList(LoginRequiredMixin, ListView):
queryset = Speaker.on_site.all()
@login_required
def user_details(request, username):
user = get_object_or_404(Profile, user__username=username)
return render(request, 'proposals/user_details.html', {
'user': user,
'user': get_object_or_404(Profile, user__username=username),
})