wip
This commit is contained in:
parent
dab6bf83f9
commit
336fd90275
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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'),
|
||||||
]
|
]
|
||||||
|
|
|
@ -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),
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue