Speach -> User; and proposals.views clean

This commit is contained in:
Guilhem Saurel 2016-06-12 19:00:04 +02:00
parent 336fd90275
commit 4ba9852c5a
5 changed files with 22 additions and 26 deletions

View File

@ -1,8 +1,9 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-06-12 15:10 # Generated by Django 1.9.7 on 2016-06-12 16:42
from __future__ import unicode_literals from __future__ import unicode_literals
import autoslug.fields import autoslug.fields
from django.conf import settings
import django.contrib.sites.managers import django.contrib.sites.managers
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion
@ -15,7 +16,7 @@ class Migration(migrations.Migration):
dependencies = [ dependencies = [
('sites', '0002_alter_domain_unique'), ('sites', '0002_alter_domain_unique'),
('accounts', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL),
] ]
operations = [ operations = [
@ -23,8 +24,8 @@ class Migration(migrations.Migration):
name='Speach', name='Speach',
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('order', models.IntegerField(choices=[(1, '1'), (2, '2'), (3, '3'), (4, '4'), (5, '5'), (6, '6'), (7, '7')])), ('order', models.IntegerField(choices=[(1, '1'), (2, '2'), (3, '3'), (4, '4'), (5, '5'), (6, '6'), (7, '7')], default=1)),
('speaker', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='accounts.Speaker')), ('speaker', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
], ],
options={ options={
'ordering': ['talk', 'order'], 'ordering': ['talk', 'order'],
@ -38,7 +39,7 @@ class Migration(migrations.Migration):
('slug', autoslug.fields.AutoSlugField(editable=False, populate_from='title', unique=True)), ('slug', autoslug.fields.AutoSlugField(editable=False, populate_from='title', unique=True)),
('description', models.TextField(blank=True, verbose_name='Description')), ('description', models.TextField(blank=True, verbose_name='Description')),
('site', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sites.Site')), ('site', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sites.Site')),
('speakers', models.ManyToManyField(through='proposals.Speach', to='accounts.Speaker')), ('speakers', models.ManyToManyField(through='proposals.Speach', to=settings.AUTH_USER_MODEL)),
], ],
managers=[ managers=[
('objects', django.db.models.manager.Manager()), ('objects', django.db.models.manager.Manager()),
@ -51,11 +52,6 @@ class Migration(migrations.Migration):
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=128, unique=True, verbose_name='Name')), ('name', models.CharField(max_length=128, unique=True, verbose_name='Name')),
('slug', autoslug.fields.AutoSlugField(editable=False, populate_from='name', unique=True)), ('slug', autoslug.fields.AutoSlugField(editable=False, populate_from='name', unique=True)),
('site', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sites.Site')),
],
managers=[
('objects', django.db.models.manager.Manager()),
('on_site', django.contrib.sites.managers.CurrentSiteManager()),
], ],
), ),
migrations.AddField( migrations.AddField(
@ -70,6 +66,6 @@ class Migration(migrations.Migration):
), ),
migrations.AlterUniqueTogether( migrations.AlterUniqueTogether(
name='speach', name='speach',
unique_together=set([('speaker', 'talk'), ('order', 'talk')]), unique_together=set([('order', 'talk'), ('speaker', 'talk')]),
), ),
] ]

View File

@ -1,3 +1,4 @@
from django.contrib.auth.models import User
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.core.urlresolvers import reverse
@ -5,8 +6,6 @@ from django.db import models
from autoslug import AutoSlugField from autoslug import AutoSlugField
from accounts.models import Speaker
__all__ = ['Topic', 'Talk', 'Speach'] __all__ = ['Topic', 'Talk', 'Speach']
@ -26,7 +25,7 @@ class Talk(models.Model):
site = models.ForeignKey(Site, on_delete=models.CASCADE) site = models.ForeignKey(Site, on_delete=models.CASCADE)
speakers = models.ManyToManyField(Speaker, through='Speach') speakers = models.ManyToManyField(User, through='Speach')
title = models.CharField(max_length=128, verbose_name='Title') title = models.CharField(max_length=128, verbose_name='Title')
slug = AutoSlugField(populate_from='title', unique=True) slug = AutoSlugField(populate_from='title', unique=True)
description = models.TextField(blank=True, verbose_name='Description') description = models.TextField(blank=True, verbose_name='Description')
@ -46,7 +45,7 @@ class Speach(models.Model):
SPEAKER_NO = tuple((i, str(i)) for i in range(1, 8)) SPEAKER_NO = tuple((i, str(i)) for i in range(1, 8))
speaker = models.ForeignKey(Speaker, on_delete=models.CASCADE) speaker = models.ForeignKey(User, 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, default=1) order = models.IntegerField(choices=SPEAKER_NO, default=1)
@ -64,4 +63,4 @@ class Speach(models.Model):
return self.talk.get_absolute_url() return self.talk.get_absolute_url()
def username(self): def username(self):
return self.speaker.user.username return self.speaker.username

View File

@ -16,7 +16,7 @@
<ul> <ul>
{% for speaker in talk.speakers.all %} {% for speaker in talk.speakers.all %}
<li><a href="{% url 'show-user' speaker.user.username %}">{{ speaker }}</a></li> <li><a href="{% url 'show-user' speaker.username %}">{{ speaker }}</a></li>
{% empty %} {% empty %}
<li><i>No speaker.</i></li> <li><i>No speaker.</i></li>
{% endfor %} {% endfor %}

View File

@ -1,12 +1,13 @@
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.auth.mixins import LoginRequiredMixin
from django.contrib.auth.models import User
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 django.views.generic import DetailView, ListView
from accounts.models import Profile, Speaker from accounts.models import Speaker
from proposals.forms import TalkForm from proposals.forms import TalkForm
from proposals.models import Speach, Talk, Topic from proposals.models import Speach, Talk, Topic
@ -18,8 +19,8 @@ def home(request):
@login_required @login_required
def talk_list(request): def talk_list(request):
return render(request, 'proposals/talks.html', { return render(request, 'proposals/talks.html', {
'my_talks': Talk.on_site.filter(speakers__user=request.user), 'my_talks': Talk.on_site.filter(speakers=request.user),
'other_talks': Talk.on_site.exclude(speakers__user=request.user), 'other_talks': Talk.on_site.exclude(speakers=request.user),
}) })
@ -34,7 +35,7 @@ def talk_list_by_topic(request, 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(User, username=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': Talk.on_site.filter(speakers=speaker), 'talks': Talk.on_site.filter(speakers=speaker),
@ -47,7 +48,7 @@ def talk_edit(request, talk=None):
talk = get_object_or_404(Talk, slug=talk) talk = get_object_or_404(Talk, slug=talk)
if talk.site != get_current_site(request): if talk.site != get_current_site(request):
raise PermissionDenied() raise PermissionDenied()
if not request.user.is_superuser and not talk.speakers.filter(user=request.user).exists(): if not request.user.is_superuser and request.user not in talk.speakers.all():
# FIXME fine permissions # FIXME fine permissions
raise PermissionDenied() raise PermissionDenied()
form = TalkForm(request.POST or None, instance=talk) form = TalkForm(request.POST or None, instance=talk)
@ -60,8 +61,8 @@ def talk_edit(request, talk=None):
talk = form.save(commit=False) talk = form.save(commit=False)
talk.site = site talk.site = site
talk.save() talk.save()
speaker = Speaker.on_site.get_or_create(user=request.user, site=site)[0] Speaker.on_site.get_or_create(user=request.user, site=site)
Speach.objects.create(speaker=speaker, talk=talk) Speach.objects.create(speaker=request.user, talk=talk)
messages.success(request, 'Talk proposed successfully!') messages.success(request, 'Talk proposed successfully!')
return redirect(talk.get_absolute_url()) return redirect(talk.get_absolute_url())
return render(request, 'proposals/talk_edit.html', { return render(request, 'proposals/talk_edit.html', {
@ -78,11 +79,11 @@ class TopicList(LoginRequiredMixin, ListView):
class SpeakerList(LoginRequiredMixin, ListView): class SpeakerList(LoginRequiredMixin, ListView):
queryset = Speaker.on_site.all() queryset = User.objects.filter(speach__talk=Talk.on_site.all())
@login_required @login_required
def user_details(request, username): def user_details(request, username):
return render(request, 'proposals/user_details.html', { return render(request, 'proposals/user_details.html', {
'user': get_object_or_404(Profile, user__username=username), 'user': get_object_or_404(User, username=username).profile,
}) })