diff --git a/proposals/models.py b/proposals/models.py index 5eb5897..9dbccf7 100644 --- a/proposals/models.py +++ b/proposals/models.py @@ -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 diff --git a/proposals/templates/proposals/speaker_list.html b/proposals/templates/accounts/speaker_list.html similarity index 100% rename from proposals/templates/proposals/speaker_list.html rename to proposals/templates/accounts/speaker_list.html diff --git a/proposals/templates/proposals/talk_details.html b/proposals/templates/proposals/talk_detail.html similarity index 100% rename from proposals/templates/proposals/talk_details.html rename to proposals/templates/proposals/talk_detail.html diff --git a/proposals/tests.py b/proposals/tests.py index f4c2a07..1109764 100644 --- a/proposals/tests.py +++ b/proposals/tests.py @@ -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) diff --git a/proposals/urls.py b/proposals/urls.py index d0d495e..8205bcc 100644 --- a/proposals/urls.py +++ b/proposals/urls.py @@ -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[-\w]+)$', views.talk_edit, name='edit-talk'), - url(r'^talk/details/(?P[-\w]+)$', views.talk_details, name='show-talk'), + url(r'^talk/details/(?P[-\w]+)$', views.TalkDetail.as_view(), name='show-talk'), url(r'^talk/by-topic/(?P[-\w]+)$', views.talk_list_by_topic, name='list-talks-by-topic'), url(r'^talk/by-speaker/(?P[\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[\w.@+-]+)$', views.user_details, name='show-user'), ] diff --git a/proposals/views.py b/proposals/views.py index 1d013e6..8ea6ea8 100644 --- a/proposals/views.py +++ b/proposals/views.py @@ -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), })