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.managers import CurrentSiteManager
from django.contrib.sites.models import Site from django.contrib.sites.models import Site
from django.core.urlresolvers import reverse
from django.db import models from django.db import models
from autoslug import AutoSlugField from autoslug import AutoSlugField
@ -11,17 +12,15 @@ __all__ = ['Topic', 'Talk', 'Speach']
class Topic(models.Model): class Topic(models.Model):
site = models.ForeignKey(Site, on_delete=models.CASCADE)
name = models.CharField(max_length=128, verbose_name='Name', unique=True) name = models.CharField(max_length=128, verbose_name='Name', unique=True)
slug = AutoSlugField(populate_from='name', unique=True) slug = AutoSlugField(populate_from='name', unique=True)
objects = models.Manager()
on_site = CurrentSiteManager()
def __str__(self): def __str__(self):
return self.name return self.name
def get_absolute_url(self):
return reverse('list-talks-by-topic', kwargs={'slug': self.slug})
class Talk(models.Model): class Talk(models.Model):
@ -39,6 +38,9 @@ class Talk(models.Model):
def __str__(self): def __str__(self):
return self.title return self.title
def get_absolute_url(self):
return reverse('show-talk', kwargs={'slug': self.slug})
class Speach(models.Model): class Speach(models.Model):
@ -46,7 +48,7 @@ class Speach(models.Model):
speaker = models.ForeignKey(Speaker, on_delete=models.CASCADE) speaker = models.ForeignKey(Speaker, on_delete=models.CASCADE)
talk = models.ForeignKey(Talk, 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: class Meta:
ordering = ['talk', 'order'] ordering = ['talk', 'order']
@ -58,5 +60,8 @@ class Speach(models.Model):
def __str__(self): def __str__(self):
return '%s speaking at %s in position %d' % (self.speaker, self.talk, self.order) 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): def username(self):
return self.speaker.user.username 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']: for view in ['home', 'list-talks', 'add-talk', 'list-topics', 'list-speakers']:
self.assertEqual(self.client.get(reverse(view)).status_code, 200) self.assertEqual(self.client.get(reverse(view)).status_code, 200)
talk = Talk.on_site.first() talk = Talk.on_site.first()
for view in ['edit-talk', 'show-talk']: self.assertEqual(self.client.get(reverse('edit-talk', kwargs={'talk': talk.slug})).status_code, 200)
self.assertEqual(self.client.get(reverse(view, 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('list-talks-by-speaker', kwargs={'speaker': 'a'})).status_code, 200)
self.assertEqual(self.client.get(reverse('show-user', kwargs={'username': '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/$', views.talk_list, name='list-talks'),
url(r'^talk/add/$', views.talk_edit, name='add-talk'), 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/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-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'^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'^topic/$', views.TopicList.as_view(), name='list-topics'),
url(r'^speakers/$', views.speaker_list, name='list-speakers'), url(r'^speakers/$', views.SpeakerList.as_view(), name='list-speakers'),
url(r'^user/(?P<username>[\w.@+-]+)$', views.user_details, name='show-user'), 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 import messages
from django.contrib.auth.decorators import login_required 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.contrib.sites.shortcuts import get_current_site
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.shortcuts import get_object_or_404, redirect, render from django.shortcuts import get_object_or_404, redirect, render
from django.views.generic import DetailView, ListView
from accounts.models import Profile, Speaker from accounts.models import Profile, Speaker
from proposals.forms import TalkForm from proposals.forms import TalkForm
@ -15,37 +17,27 @@ def home(request):
@login_required @login_required
def talk_list(request): 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', { return render(request, 'proposals/talks.html', {
'my_talks': mine, 'my_talks': Talk.on_site.filter(speakers__user=request.user),
'other_talks': others, 'other_talks': Talk.on_site.exclude(speakers__user=request.user),
}) })
@login_required @login_required
def talk_list_by_topic(request, topic): def talk_list_by_topic(request, topic):
topic = get_object_or_404(Topic, site=get_current_site(request), slug=topic) topic = get_object_or_404(Topic, slug=topic)
talks = Talk.objects.filter(topics=topic)
return render(request, 'proposals/talk_list.html', { return render(request, 'proposals/talk_list.html', {
'title': 'Talks related to %s:' % topic.name, 'title': 'Talks related to %s:' % topic,
'talks': talks, 'talks': Talk.on_site.filter(topics=topic),
}) })
@login_required @login_required
def talk_list_by_speaker(request, speaker): def talk_list_by_speaker(request, speaker):
speaker = get_object_or_404(Speaker, user__username=speaker) speaker = get_object_or_404(Speaker, user__username=speaker)
talks = Talk.on_site.filter(speakers=speaker)
return render(request, 'proposals/talk_list.html', { return render(request, 'proposals/talk_list.html', {
'title': 'Talks with %s:' % speaker, '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.site = site
talk.save() talk.save()
speaker = Speaker.on_site.get_or_create(user=request.user, site=site)[0] speaker = Speaker.on_site.get_or_create(user=request.user, site=site)[0]
speach = Speach(speaker=speaker, talk=talk, order=1) Speach.objects.create(speaker=speaker, talk=talk)
speach.save()
messages.success(request, 'Talk proposed successfully!') 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', { return render(request, 'proposals/talk_edit.html', {
'form': form, 'form': form,
}) })
@login_required class TalkDetail(LoginRequiredMixin, DetailView):
def talk_details(request, talk): queryset = Talk.on_site.all()
talk = get_object_or_404(Talk, slug=talk)
return render(request, 'proposals/talk_details.html', {
'talk': talk,
})
@login_required class TopicList(LoginRequiredMixin, ListView):
def topic_list(request): model = Topic
topics = Topic.on_site.all()
return render(request, 'proposals/topic_list.html', {
'topics': topics,
})
@login_required class SpeakerList(LoginRequiredMixin, ListView):
def speaker_list(request): queryset = Speaker.on_site.all()
speakers = Speaker.on_site.all()
return render(request, 'proposals/speaker_list.html', {
'speaker': speakers,
})
@login_required @login_required
def user_details(request, username): def user_details(request, username):
user = get_object_or_404(Profile, user__username=username)
return render(request, 'proposals/user_details.html', { return render(request, 'proposals/user_details.html', {
'user': user, 'user': get_object_or_404(Profile, user__username=username),
}) })