use more of contrib.auth, simplify models

This commit is contained in:
Guilhem Saurel 2016-06-12 16:40:23 +02:00
parent 16f75ae262
commit 478c33bb00
16 changed files with 152 additions and 44 deletions

View File

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-06-12 14:21
from __future__ import unicode_literals
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('accounts', '0002_auto_20160611_1305'),
]
operations = [
migrations.AlterField(
model_name='ponyconfspeaker',
name='user',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
]

View File

@ -25,7 +25,7 @@ class PonyConfSpeaker(models.Model):
site = models.ForeignKey(Site, on_delete=models.CASCADE) site = models.ForeignKey(Site, on_delete=models.CASCADE)
user = models.ForeignKey(PonyConfUser) user = models.ForeignKey(User)
arrival = models.DateTimeField(blank=True, null=True) arrival = models.DateTimeField(blank=True, null=True)
departure = models.DateTimeField(blank=True, null=True) departure = models.DateTimeField(blank=True, null=True)
transport = models.IntegerField(choices=enum_to_choices(TRANSPORTS), blank=True, null=True) transport = models.IntegerField(choices=enum_to_choices(TRANSPORTS), blank=True, null=True)
@ -39,8 +39,7 @@ class PonyConfSpeaker(models.Model):
unique_together = ('site', 'user') unique_together = ('site', 'user')
def __str__(self): def __str__(self):
user = self.user.user return self.user.get_full_name() or self.user.username
return user.get_full_name() or user.username
def create_ponyconfuser(sender, instance, created, **kwargs): def create_ponyconfuser(sender, instance, created, **kwargs):

View File

@ -22,6 +22,7 @@
{% endfor %} {% endfor %}
{% buttons layout="horizontal" %} {% buttons layout="horizontal" %}
<button type="submit" class="btn btn-primary">Update</button> <button type="submit" class="btn btn-primary">Update</button>
<a href="{% url 'password_change' %}" class="btn btn-primary">Change password</a>
{% endbuttons %} {% endbuttons %}
</form> </form>
</div> </div>

View File

@ -0,0 +1,21 @@
{% extends 'base.html' %}
{% load bootstrap3 %}
{% block content %}
<div class="page-header">
<h1>
Logout
</h1>
</div>
<div class="row">
<div class="col-md-offset-4 col-md-4">
<div class="well">
<p>You are not logged in anymore. <a href="{% url 'login' %}">Login again ?</a></p>
</div>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,29 @@
{% extends 'base.html' %}
{% load bootstrap3 %}
{% block content %}
<div class="page-header">
<h1>
Login
</h1>
</div>
<div class="row">
<div class="col-md-offset-4 col-md-4">
<div class="well">
<form action="" method="post" role="form">
{% bootstrap_form form %}
{% csrf_token %}
<div class="form-group text-center">
<button type="submit" class="btn btn-primary">Submit</button>
<a href="{% url 'password_reset' %}" class="btn btn-warning">Reset your password</a>
<a href="{% if request.GET.prev %}{{ request.GET.prev }}{% else %}{% url 'home' %}{% endif %}" class="btn btn-default">Cancel</a>
</div>
</form>
</div>
</div>
</div>
{% endblock %}

View File

@ -6,7 +6,7 @@
<div class="page-header"> <div class="page-header">
<h1> <h1>
Login Password Change
</h1> </h1>
</div> </div>
@ -18,7 +18,7 @@
{% csrf_token %} {% csrf_token %}
<div class="form-group text-center"> <div class="form-group text-center">
<button type="submit" class="btn btn-primary">Submit</button> <button type="submit" class="btn btn-primary">Submit</button>
<a href="{% if request.GET.prev %}{{ request.GET.prev }}{% else %}{% url 'home' %}{% endif %}"><button class="btn btn-default">Cancel</button></a> <a href="{% if request.GET.prev %}{{ request.GET.prev }}{% else %}{% url 'home' %}{% endif %}" class="btn btn-default">Cancel</a>
</div> </div>
</form> </form>
</div> </div>

View File

@ -0,0 +1,28 @@
{% extends 'base.html' %}
{% load bootstrap3 %}
{% block content %}
<div class="page-header">
<h1>
Password Reset
</h1>
</div>
<div class="row">
<div class="col-md-offset-4 col-md-4">
<div class="well">
<form action="" method="post" role="form">
{% bootstrap_form form %}
{% csrf_token %}
<div class="form-group text-center">
<button type="submit" class="btn btn-primary">Submit</button>
<a href="{% if request.GET.prev %}{{ request.GET.prev }}{% else %}{% url 'home' %}{% endif %}" class="btn btn-default">Cancel</a>
</div>
</form>
</div>
</div>
</div>
{% endblock %}

View File

@ -1,9 +1,8 @@
from django.test import TestCase
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.test import TestCase
from .models import PonyConfSpeaker, PonyConfUser from .models import PonyConfUser
ROOT_URL = 'accounts' ROOT_URL = 'accounts'
@ -20,10 +19,6 @@ class AccountTests(TestCase):
# VIEWS # VIEWS
def test_password(self):
self.client.login(username='a', password='a')
self.assertEqual(self.client.get(reverse('password')).status_code, 200)
def test_profile(self): def test_profile(self):
# User b wants to update its username, email and biography # User b wants to update its username, email and biography
user = User.objects.get(username='b') user = User.objects.get(username='b')
@ -33,10 +28,10 @@ class AccountTests(TestCase):
self.client.login(username='b', password='b') self.client.login(username='b', password='b')
# He tries with an invalid address # He tries with an invalid address
r = self.client.post(reverse('profile'), {'email': 'bnewdomain.com', 'username': 'z', 'biography': 'tester'}) self.client.post(reverse('profile'), {'email': 'bnewdomain.com', 'username': 'z', 'biography': 'tester'})
self.assertEqual(User.objects.filter(username='z').count(), 0) self.assertEqual(User.objects.filter(username='z').count(), 0)
r = self.client.post(reverse('profile'), {'email': 'b@newdomain.com', 'username': 'z', 'biography': 'tester'}) self.client.post(reverse('profile'), {'email': 'b@newdomain.com', 'username': 'z', 'biography': 'tester'})
user = User.objects.get(username='z') user = User.objects.get(username='z')
self.assertEqual(user.email, 'b@newdomain.com') self.assertEqual(user.email, 'b@newdomain.com')

View File

@ -1,11 +1,8 @@
from django.conf.urls import url from django.conf.urls import include, url
from django.contrib.auth import views as auth_views
from accounts import views from .views import profile
urlpatterns = [ urlpatterns = [
url(r'^login/$', auth_views.login, {'template_name': 'accounts/login.html'}, name='login'), url(r'^profile$', profile, name='profile'),
url(r'^logout/$', auth_views.logout, {'next_page': '/'}, name='logout'), url(r'', include('django.contrib.auth.urls')),
url(r'^profile$', views.profile, name='profile'),
url(r'^password$', views.password, name='password'),
] ]

View File

@ -1,16 +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.views import password_change
from django.shortcuts import render from django.shortcuts import render
from .forms import PonyConfUserForm, ProfileForm from .forms import PonyConfUserForm, ProfileForm
@login_required
def password(request):
return password_change(request, post_change_redirect='profile')
@login_required @login_required
def profile(request): def profile(request):

View File

@ -31,8 +31,9 @@ ALLOWED_HOSTS = []
# Application definition # Application definition
INSTALLED_APPS = [ INSTALLED_APPS = [
'django.contrib.admin', 'accounts',
'registration', 'registration',
'django.contrib.admin',
'django.contrib.auth', 'django.contrib.auth',
'django.contrib.contenttypes', 'django.contrib.contenttypes',
'django.contrib.sessions', 'django.contrib.sessions',
@ -44,7 +45,6 @@ INSTALLED_APPS = [
'bootstrap3', 'bootstrap3',
'ponyconf', 'ponyconf',
'accounts',
'proposals', 'proposals',
] ]
@ -173,3 +173,4 @@ BOOTSTRAP3 = {
} }
AUTHENTICATION_BACKENDS = ['yeouia.backends.YummyEmailOrUsernameInsensitiveAuth'] AUTHENTICATION_BACKENDS = ['yeouia.backends.YummyEmailOrUsernameInsensitiveAuth']
LOGOUT_REDIRECT_URL = 'home'

View File

@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-06-12 14:21
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('proposals', '0004_auto_20160611_1305'),
]
operations = [
migrations.RenameField(
model_name='speach',
old_name='user',
new_name='speaker',
),
migrations.AlterUniqueTogether(
name='speach',
unique_together=set([('speaker', 'talk'), ('order', 'talk')]),
),
]

View File

@ -43,19 +43,19 @@ 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))
user = models.ForeignKey(PonyConfSpeaker, on_delete=models.CASCADE) speaker = models.ForeignKey(PonyConfSpeaker, 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)
class Meta: class Meta:
ordering = ['talk', 'order'] ordering = ['talk', 'order']
unique_together = ( unique_together = (
('user', 'talk'), ('speaker', 'talk'),
('order', 'talk'), ('order', 'talk'),
) )
def __str__(self): def __str__(self):
return '%s speaking at %s in position %d' % (self.user, self.talk, self.order) return '%s speaking at %s in position %d' % (self.speaker, self.talk, self.order)
def username(self): def username(self):
return self.user.user.user.username return self.speaker.user.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.user.username %}">{{ speaker }}</a></li> <li><a href="{% url 'show-user' speaker.user.username %}">{{ speaker }}</a></li>
{% empty %} {% empty %}
<li><i>No speaker.</i></li> <li><i>No speaker.</i></li>
{% endfor %} {% endfor %}

View File

@ -1,9 +1,8 @@
from django.test import TestCase
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.test import TestCase
from accounts.models import PonyConfSpeaker from .models import Talk
from .models import Topic, Talk, Speach
class ProposalsTests(TestCase): class ProposalsTests(TestCase):
@ -30,7 +29,6 @@ class ProposalsTests(TestCase):
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)
self.client.login(username='b', password='b') self.client.login(username='b', password='b')
self.assertEqual(self.client.post(reverse('edit-talk', kwargs={'talk': 'super-talk'}), self.assertEqual(self.client.post(reverse('edit-talk', kwargs={'talk': 'super-talk'}),
{'title': 'mega talk', 'description': 'mega'}).status_code, 403) {'title': 'mega talk', 'description': 'mega'}).status_code, 403)

View File

@ -15,7 +15,7 @@ def home(request):
@login_required @login_required
def talk_list(request): def talk_list(request):
speaker = PonyConfSpeaker.on_site.filter(user=request.user.ponyconfuser) speaker = PonyConfSpeaker.on_site.filter(user=request.user)
if speaker.exists(): if speaker.exists():
speaker = speaker.first() speaker = speaker.first()
mine = Talk.on_site.filter(speakers=speaker) mine = Talk.on_site.filter(speakers=speaker)
@ -41,7 +41,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(PonyConfSpeaker, user__user__username=speaker) speaker = get_object_or_404(PonyConfSpeaker, user__username=speaker)
talks = Talk.on_site.filter(speakers=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,
@ -55,8 +55,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()
user = PonyConfUser.objects.get(user=request.user) if not request.user.is_superuser and not talk.speakers.filter(user=request.user).exists():
if not request.user.is_superuser and not talk.speakers.filter(user=user).exists():
# 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)
@ -69,8 +68,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 = PonyConfSpeaker.on_site.get_or_create(user=request.user.ponyconfuser, site=site)[0] speaker = PonyConfSpeaker.on_site.get_or_create(user=request.user, site=site)[0]
speach = Speach(user=speaker, talk=talk, order=1) speach = Speach(speaker=speaker, talk=talk, order=1)
speach.save() speach.save()
messages.success(request, 'Talk proposed successfully!') messages.success(request, 'Talk proposed successfully!')
return redirect('show-talk', talk.slug) return redirect('show-talk', talk.slug)