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

View File

@ -10,7 +10,7 @@ from .models import Participation, Profile
@receiver(user_logged_in)
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:
messages.info(request, "Please check your profile!\n", 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.post(reverse('edit-participant', kwargs={'username': 'a'}),
{'biography': 'foo', 'notes': 'bar'}).status_code, 403)
b = Participation.on_site.get(user=b)
b = Participation.objects.get(user=b)
b.orga = True
b.save()
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.shortcuts import get_object_or_404, render
from django.views.generic import ListView
from django.contrib.sites.shortcuts import get_current_site
from registration.backends.default.views import RegistrationView
@ -25,7 +26,7 @@ def profile(request):
forms = [UserForm(request.POST or None, instance=request.user),
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 all(form.is_valid() for form in forms):
@ -39,7 +40,8 @@ def profile(request):
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
@ -52,7 +54,7 @@ def edit(request, username):
participation_form_class = ParticipationOrgaForm if is_orga(request, request.user) else ParticipationForm
forms = [UserForm(request.POST or None, instance=profile.user),
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 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)
talk.conversation.subscribers.add(*reviewers)
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)

View File

@ -66,7 +66,7 @@ def talk_conversation(request, talk):
@login_required
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', {
'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 django.contrib.auth.models import User
from django.contrib.sites.managers import CurrentSiteManager
from django.contrib.sites.models import Site
from django.core.urlresolvers import reverse
from django.core.validators import MaxValueValidator, MinValueValidator
@ -26,9 +25,6 @@ class Topic(PonyConfModel):
reviewers = models.ManyToManyField(User, blank=True)
objects = models.Manager()
on_site = CurrentSiteManager()
@property
def talks(self):
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)
accepted = models.NullBooleanField(default=None)
objects = models.Manager()
on_site = CurrentSiteManager()
def __str__(self):
return self.title
@ -68,7 +61,7 @@ class Talk(PonyConfModel):
if user.is_superuser:
return True
try:
participation = Participation.on_site.get(user=user)
participation = Participation.objects.get(site=self.site, user=user)
except Participation.DoesNotExists:
return False
return participation.orga or self.topics.filter(reviewers=participation.user).exists()

View File

@ -8,7 +8,7 @@
<ul>
{% 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 %}
<li><i>No speakers.</i></li>
{% endfor %}

View File

@ -20,13 +20,13 @@ class ProposalsTests(TestCase):
self.client.login(username='a', password='a')
self.client.post(reverse('add-talk'), {'title': 'super talk', 'description': 'super', 'event': 1, 'topics': 1,
'speakers': 1})
talk = Talk.on_site.first()
talk = Talk.objects.first()
self.assertEqual(str(talk), 'super talk')
self.assertEqual(talk.description, 'super')
self.client.post(reverse('edit-talk', kwargs={'talk': 'super-talk'}),
{'title': 'mega talk', 'description': 'mega', 'event': 1, 'speakers': 1})
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')
# Status Code
@ -71,9 +71,9 @@ class ProposalsTests(TestCase):
def test_topic_edition_permissions(self):
# Only orga and superuser can edit topics
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)
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.client.login(username='c', password='c') # superuser
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.functions import Coalesce
from django.contrib.sites.shortcuts import get_current_site
from accounts.models import Participation
@ -9,7 +10,7 @@ def query_sum(queryset, field):
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():
talks = talks.filter(Q(topics__reviewers=participation.user) | Q(speakers=request.user) | Q(proposer=request.user))
return talks.distinct()

View File

@ -28,15 +28,15 @@ def home(request):
@login_required
def talk_list(request):
return render(request, 'proposals/talks.html', {
'my_talks': Talk.on_site.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)
'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.objects.filter(site=get_current_site(request)).exclude(speakers=request.user, proposer=request.user), request)
})
@login_required
def talk_list_by_topic(request, 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})
@ -70,12 +70,13 @@ def talk_edit(request, talk=None):
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):
user = self.request.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,
form_url=reverse('talk-conversation', kwargs={'talk': self.object.slug}))
else:
@ -85,7 +86,9 @@ class TalkDetail(LoginRequiredMixin, DetailView):
class TopicMixin(object):
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):
@ -105,15 +108,18 @@ class TopicUpdate(OrgaRequiredMixin, TopicMixin, UpdateView):
class SpeakerList(StaffRequiredMixin, ListView):
queryset = Participation.on_site.filter(user__talk__in=Talk.on_site.all()).distinct()
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
def vote(request, talk, score):
site = get_current_site(request)
talk = get_object_or_404(Talk, site=site, slug=talk)
user = Participation.on_site.get(user=request.user)
current_site = get_current_site(request)
talk = get_object_or_404(Talk, site=current_site, slug=talk)
user = Participation.objects.get(site=current_site, user=request.user)
if not talk.is_moderable_by(request.user):
raise PermissionDenied()
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)
return render(request, 'proposals/user_details.html', {
'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),
})