remove the use of CurrentSiteManager

This commit is contained in:
Élie Bouttier 2016-07-09 21:30:49 +02:00
parent 0206181158
commit fa659ee595
13 changed files with 79 additions and 36 deletions

View File

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-07-09 20:59
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('accounts', '0001_initial'),
]
operations = [
migrations.AlterModelManagers(
name='participation',
managers=[
],
),
]

View File

@ -1,7 +1,6 @@
from enum import IntEnum from enum import IntEnum
from django.contrib.auth.models import User from django.contrib.auth.models import User
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
from django.db import models from django.db import models
@ -44,9 +43,6 @@ class Participation(PonyConfModel):
sound = models.BooleanField("I need sound", default=False) sound = models.BooleanField("I need sound", default=False)
orga = models.BooleanField(default=False) orga = models.BooleanField(default=False)
objects = models.Manager()
on_site = CurrentSiteManager()
class Meta: class Meta:
# A User can participe only once to a Conference (= Site) # A User can participe only once to a Conference (= Site)
unique_together = ('site', 'user') unique_together = ('site', 'user')

View File

@ -10,7 +10,7 @@ from .models import Participation, Profile
@receiver(user_logged_in) @receiver(user_logged_in)
def on_user_logged_in(sender, request, user, **kwargs): def on_user_logged_in(sender, request, user, **kwargs):
proposition, created = Participation.on_site.get_or_create(user=user, site=get_current_site(request)) proposition, created = Participation.objects.get_or_create(user=user, site=get_current_site(request))
if created: if created:
messages.info(request, "Please check your profile!\n", fail_silently=True) # FIXME messages.info(request, "Please check your profile!\n", fail_silently=True) # FIXME
messages.success(request, 'Welcome!', fail_silently=True) # FIXME messages.success(request, 'Welcome!', fail_silently=True) # FIXME

View File

@ -51,7 +51,7 @@ class AccountTests(TestCase):
self.assertEqual(self.client.get(reverse('list-participant')).status_code, 200) self.assertEqual(self.client.get(reverse('list-participant')).status_code, 200)
self.assertEqual(self.client.post(reverse('edit-participant', kwargs={'username': 'a'}), self.assertEqual(self.client.post(reverse('edit-participant', kwargs={'username': 'a'}),
{'biography': 'foo', 'notes': 'bar'}).status_code, 403) {'biography': 'foo', 'notes': 'bar'}).status_code, 403)
b = Participation.on_site.get(user=b) b = Participation.objects.get(user=b)
b.orga = True b.orga = True
b.save() b.save()
self.assertEqual(self.client.post(reverse('edit-participant', kwargs={'username': 'a'}), self.assertEqual(self.client.post(reverse('edit-participant', kwargs={'username': 'a'}),

View File

@ -3,6 +3,7 @@ from django.contrib.auth.decorators import login_required
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.shortcuts import get_object_or_404, render from django.shortcuts import get_object_or_404, render
from django.views.generic import ListView from django.views.generic import ListView
from django.contrib.sites.shortcuts import get_current_site
from registration.backends.default.views import RegistrationView from registration.backends.default.views import RegistrationView
@ -25,7 +26,7 @@ def profile(request):
forms = [UserForm(request.POST or None, instance=request.user), forms = [UserForm(request.POST or None, instance=request.user),
ProfileForm(request.POST or None, instance=request.user.profile), ProfileForm(request.POST or None, instance=request.user.profile),
ParticipationForm(request.POST or None, instance=Participation.on_site.get(user=request.user))] ParticipationForm(request.POST or None, instance=Participation.objects.get(site=get_current_site(request), user=request.user))]
if request.method == 'POST': if request.method == 'POST':
if all(form.is_valid() for form in forms): if all(form.is_valid() for form in forms):
@ -39,7 +40,8 @@ def profile(request):
class ParticipantList(StaffRequiredMixin, ListView): class ParticipantList(StaffRequiredMixin, ListView):
queryset = Participation.on_site.all() def get_queryset(self):
return Participation.objects.filter(site=get_current_site(self.request)).all()
@login_required @login_required
@ -52,7 +54,7 @@ def edit(request, username):
participation_form_class = ParticipationOrgaForm if is_orga(request, request.user) else ParticipationForm participation_form_class = ParticipationOrgaForm if is_orga(request, request.user) else ParticipationForm
forms = [UserForm(request.POST or None, instance=profile.user), forms = [UserForm(request.POST or None, instance=profile.user),
ProfileOrgaForm(request.POST or None, instance=profile), ProfileOrgaForm(request.POST or None, instance=profile),
participation_form_class(request.POST or None, instance=Participation.on_site.get(user=profile.user))] participation_form_class(request.POST or None, instance=Participation.objects.get(site=get_current_site(request), user=profile.user))]
if request.method == 'POST': if request.method == 'POST':
if all(form.is_valid() for form in forms): if all(form.is_valid() for form in forms):

View File

@ -30,7 +30,7 @@ def check_talk(talk):
reviewers = User.objects.filter(topic__talk=talk) reviewers = User.objects.filter(topic__talk=talk)
talk.conversation.subscribers.add(*reviewers) talk.conversation.subscribers.add(*reviewers)
for user in talk.speakers.all(): for user in talk.speakers.all():
participation, created = Participation.on_site.get_or_create(user=user, site=talk.site) participation, created = Participation.objects.get_or_create(user=user, site=talk.site)
participation.conversation.subscribers.add(*reviewers) participation.conversation.subscribers.add(*reviewers)

View File

@ -66,7 +66,7 @@ def talk_conversation(request, talk):
@login_required @login_required
def correspondents(request): def correspondents(request):
correspondent_list = Participation.on_site.filter(conversation__subscribers=request.user) correspondent_list = Participation.objects.filter(site=get_current_site(request), conversation__subscribers=request.user)
return render(request, 'conversations/correspondents.html', { return render(request, 'conversations/correspondents.html', {
'correspondent_list': correspondent_list, 'correspondent_list': correspondent_list,

View File

@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-07-09 20:59
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('proposals', '0001_initial'),
]
operations = [
migrations.AlterModelManagers(
name='talk',
managers=[
],
),
migrations.AlterModelManagers(
name='topic',
managers=[
],
),
]

View File

@ -1,7 +1,6 @@
from enum import IntEnum from enum import IntEnum
from django.contrib.auth.models import User from django.contrib.auth.models import User
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
from django.core.validators import MaxValueValidator, MinValueValidator from django.core.validators import MaxValueValidator, MinValueValidator
@ -26,9 +25,6 @@ class Topic(PonyConfModel):
reviewers = models.ManyToManyField(User, blank=True) reviewers = models.ManyToManyField(User, blank=True)
objects = models.Manager()
on_site = CurrentSiteManager()
@property @property
def talks(self): def talks(self):
return Talk.objects.filter(topics=self).all() return Talk.objects.filter(topics=self).all()
@ -55,9 +51,6 @@ class Talk(PonyConfModel):
event = models.IntegerField(choices=enum_to_choices(EVENTS), default=EVENTS.conference_short.value) event = models.IntegerField(choices=enum_to_choices(EVENTS), default=EVENTS.conference_short.value)
accepted = models.NullBooleanField(default=None) accepted = models.NullBooleanField(default=None)
objects = models.Manager()
on_site = CurrentSiteManager()
def __str__(self): def __str__(self):
return self.title return self.title
@ -68,7 +61,7 @@ class Talk(PonyConfModel):
if user.is_superuser: if user.is_superuser:
return True return True
try: try:
participation = Participation.on_site.get(user=user) participation = Participation.objects.get(site=self.site, user=user)
except Participation.DoesNotExists: except Participation.DoesNotExists:
return False return False
return participation.orga or self.topics.filter(reviewers=participation.user).exists() return participation.orga or self.topics.filter(reviewers=participation.user).exists()

View File

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

View File

@ -20,13 +20,13 @@ class ProposalsTests(TestCase):
self.client.login(username='a', password='a') self.client.login(username='a', password='a')
self.client.post(reverse('add-talk'), {'title': 'super talk', 'description': 'super', 'event': 1, 'topics': 1, self.client.post(reverse('add-talk'), {'title': 'super talk', 'description': 'super', 'event': 1, 'topics': 1,
'speakers': 1}) 'speakers': 1})
talk = Talk.on_site.first() talk = Talk.objects.first()
self.assertEqual(str(talk), 'super talk') self.assertEqual(str(talk), 'super talk')
self.assertEqual(talk.description, 'super') self.assertEqual(talk.description, 'super')
self.client.post(reverse('edit-talk', kwargs={'talk': 'super-talk'}), self.client.post(reverse('edit-talk', kwargs={'talk': 'super-talk'}),
{'title': 'mega talk', 'description': 'mega', 'event': 1, 'speakers': 1}) {'title': 'mega talk', 'description': 'mega', 'event': 1, 'speakers': 1})
self.assertEqual(str(talk), 'super talk') # title is read only there self.assertEqual(str(talk), 'super talk') # title is read only there
talk = Talk.on_site.first() talk = Talk.objects.first()
self.assertEqual(talk.description, 'mega') self.assertEqual(talk.description, 'mega')
# Status Code # Status Code
@ -71,9 +71,9 @@ class ProposalsTests(TestCase):
def test_topic_edition_permissions(self): def test_topic_edition_permissions(self):
# Only orga and superuser can edit topics # Only orga and superuser can edit topics
self.client.login(username='b', password='b') self.client.login(username='b', password='b')
self.assertFalse(Participation.on_site.get(user__username='b').orga) self.assertFalse(Participation.objects.get(user__username='b').orga)
self.assertEqual(self.client.get(reverse('edit-topic', kwargs={'slug': 'topipo'})).status_code, 302) self.assertEqual(self.client.get(reverse('edit-topic', kwargs={'slug': 'topipo'})).status_code, 302)
Participation.on_site.filter(user__username='b').update(orga=True) Participation.objects.filter(user__username='b').update(orga=True)
self.assertEqual(self.client.get(reverse('edit-topic', kwargs={'slug': 'topipo'})).status_code, 200) self.assertEqual(self.client.get(reverse('edit-topic', kwargs={'slug': 'topipo'})).status_code, 200)
self.client.login(username='c', password='c') # superuser self.client.login(username='c', password='c') # superuser
self.assertEqual(self.client.get(reverse('edit-topic', kwargs={'slug': 'topipo'})).status_code, 200) self.assertEqual(self.client.get(reverse('edit-topic', kwargs={'slug': 'topipo'})).status_code, 200)

View File

@ -1,5 +1,6 @@
from django.db.models import Q, Sum from django.db.models import Q, Sum
from django.db.models.functions import Coalesce from django.db.models.functions import Coalesce
from django.contrib.sites.shortcuts import get_current_site
from accounts.models import Participation from accounts.models import Participation
@ -9,7 +10,7 @@ def query_sum(queryset, field):
def allowed_talks(talks, request): def allowed_talks(talks, request):
participation = Participation.on_site.get(user=request.user) participation = Participation.objects.get(site=get_current_site(request), user=request.user)
if not participation.is_orga(): if not participation.is_orga():
talks = talks.filter(Q(topics__reviewers=participation.user) | Q(speakers=request.user) | Q(proposer=request.user)) talks = talks.filter(Q(topics__reviewers=participation.user) | Q(speakers=request.user) | Q(proposer=request.user))
return talks.distinct() return talks.distinct()

View File

@ -28,15 +28,15 @@ 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(Q(speakers=request.user) | Q(proposer=request.user)).distinct(), 'my_talks': Talk.objects.filter(site=get_current_site(request)).filter(Q(speakers=request.user) | Q(proposer=request.user)).distinct(),
'other_talks': allowed_talks(Talk.on_site.exclude(speakers=request.user, proposer=request.user), request) 'other_talks': allowed_talks(Talk.objects.filter(site=get_current_site(request)).exclude(speakers=request.user, proposer=request.user), request)
}) })
@login_required @login_required
def talk_list_by_topic(request, topic): def talk_list_by_topic(request, topic):
topic = get_object_or_404(Topic, slug=topic) topic = get_object_or_404(Topic, slug=topic)
talks = allowed_talks(Talk.on_site.filter(topics=topic), request) talks = allowed_talks(Talk.objects.filter(site=topic.site, topics=topic), request)
return render(request, 'proposals/talk_list.html', {'title': 'Talks related to %s:' % topic, 'talk_list': talks}) return render(request, 'proposals/talk_list.html', {'title': 'Talks related to %s:' % topic, 'talk_list': talks})
@ -70,12 +70,13 @@ def talk_edit(request, talk=None):
class TalkDetail(LoginRequiredMixin, DetailView): class TalkDetail(LoginRequiredMixin, DetailView):
queryset = Talk.on_site.all() def get_queryset(self):
return Talk.objects.filter(site=get_current_site(self.request)).all()
def get_context_data(self, **ctx): def get_context_data(self, **ctx):
user = self.request.user user = self.request.user
if self.object.is_moderable_by(user): if self.object.is_moderable_by(user):
vote = Vote.objects.filter(talk=self.object, user=Participation.on_site.get(user=user)).first() vote = Vote.objects.filter(talk=self.object, user=Participation.objects.get(site=get_current_site(self.request), user=user)).first()
ctx.update(edit_perm=True, moderate_perm=True, vote=vote, ctx.update(edit_perm=True, moderate_perm=True, vote=vote,
form_url=reverse('talk-conversation', kwargs={'talk': self.object.slug})) form_url=reverse('talk-conversation', kwargs={'talk': self.object.slug}))
else: else:
@ -85,7 +86,9 @@ class TalkDetail(LoginRequiredMixin, DetailView):
class TopicMixin(object): class TopicMixin(object):
model = Topic model = Topic
queryset = Topic.on_site.all()
def get_queryset(self):
return Topic.objects.filter(site=get_current_site(self.request)).all()
class TopicList(LoginRequiredMixin, TopicMixin, ListView): class TopicList(LoginRequiredMixin, TopicMixin, ListView):
@ -105,15 +108,18 @@ class TopicUpdate(OrgaRequiredMixin, TopicMixin, UpdateView):
class SpeakerList(StaffRequiredMixin, ListView): class SpeakerList(StaffRequiredMixin, ListView):
queryset = Participation.on_site.filter(user__talk__in=Talk.on_site.all()).distinct()
template_name = 'proposals/speaker_list.html' template_name = 'proposals/speaker_list.html'
def get_queryset(self):
current_site = get_current_site(request)
return User.objects.filter(talk__in=Talk.objects.filter(site=current_site)).all().distinct()
@login_required @login_required
def vote(request, talk, score): def vote(request, talk, score):
site = get_current_site(request) current_site = get_current_site(request)
talk = get_object_or_404(Talk, site=site, slug=talk) talk = get_object_or_404(Talk, site=current_site, slug=talk)
user = Participation.on_site.get(user=request.user) user = Participation.objects.get(site=current_site, user=request.user)
if not talk.is_moderable_by(request.user): if not talk.is_moderable_by(request.user):
raise PermissionDenied() raise PermissionDenied()
vote, created = Vote.objects.get_or_create(talk=talk, user=user) vote, created = Vote.objects.get_or_create(talk=talk, user=user)
@ -128,5 +134,5 @@ def user_details(request, username):
speaker = get_object_or_404(User, username=username) speaker = get_object_or_404(User, username=username)
return render(request, 'proposals/user_details.html', { return render(request, 'proposals/user_details.html', {
'profile': speaker.profile, 'profile': speaker.profile,
'talk_list': allowed_talks(Talk.on_site.filter(speakers=speaker), request), 'talk_list': allowed_talks(Talk.objects.filter(site=get_current_site(request), speakers=speaker), request),
}) })