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)
user = models.ForeignKey(PonyConfUser)
user = models.ForeignKey(User)
arrival = 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)
@ -39,8 +39,7 @@ class PonyConfSpeaker(models.Model):
unique_together = ('site', 'user')
def __str__(self):
user = self.user.user
return user.get_full_name() or user.username
return self.user.get_full_name() or self.user.username
def create_ponyconfuser(sender, instance, created, **kwargs):

View File

@ -22,6 +22,7 @@
{% endfor %}
{% buttons layout="horizontal" %}
<button type="submit" class="btn btn-primary">Update</button>
<a href="{% url 'password_change' %}" class="btn btn-primary">Change password</a>
{% endbuttons %}
</form>
</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">
<h1>
Login
Password Change
</h1>
</div>
@ -18,7 +18,7 @@
{% 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 %}"><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>
</form>
</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.core.urlresolvers import reverse
from django.test import TestCase
from .models import PonyConfSpeaker, PonyConfUser
from .models import PonyConfUser
ROOT_URL = 'accounts'
@ -20,10 +19,6 @@ class AccountTests(TestCase):
# 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):
# User b wants to update its username, email and biography
user = User.objects.get(username='b')
@ -33,10 +28,10 @@ class AccountTests(TestCase):
self.client.login(username='b', password='b')
# 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)
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')
self.assertEqual(user.email, 'b@newdomain.com')

View File

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

View File

@ -1,16 +1,10 @@
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.contrib.auth.views import password_change
from django.shortcuts import render
from .forms import PonyConfUserForm, ProfileForm
@login_required
def password(request):
return password_change(request, post_change_redirect='profile')
@login_required
def profile(request):

View File

@ -31,8 +31,9 @@ ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'accounts',
'registration',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
@ -44,7 +45,6 @@ INSTALLED_APPS = [
'bootstrap3',
'ponyconf',
'accounts',
'proposals',
]
@ -173,3 +173,4 @@ BOOTSTRAP3 = {
}
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))
user = models.ForeignKey(PonyConfSpeaker, on_delete=models.CASCADE)
speaker = models.ForeignKey(PonyConfSpeaker, on_delete=models.CASCADE)
talk = models.ForeignKey(Talk, on_delete=models.CASCADE)
order = models.IntegerField(choices=SPEAKER_NO)
class Meta:
ordering = ['talk', 'order']
unique_together = (
('user', 'talk'),
('speaker', 'talk'),
('order', 'talk'),
)
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):
return self.user.user.user.username
return self.speaker.user.username

View File

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

View File

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

View File

@ -15,7 +15,7 @@ def home(request):
@login_required
def talk_list(request):
speaker = PonyConfSpeaker.on_site.filter(user=request.user.ponyconfuser)
speaker = PonyConfSpeaker.on_site.filter(user=request.user)
if speaker.exists():
speaker = speaker.first()
mine = Talk.on_site.filter(speakers=speaker)
@ -41,7 +41,7 @@ def talk_list_by_topic(request, topic):
@login_required
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)
return render(request, 'proposals/talk_list.html', {
'title': 'Talks with %s:' % speaker,
@ -55,8 +55,7 @@ def talk_edit(request, talk=None):
talk = get_object_or_404(Talk, slug=talk)
if talk.site != get_current_site(request):
raise PermissionDenied()
user = PonyConfUser.objects.get(user=request.user)
if not request.user.is_superuser and not talk.speakers.filter(user=user).exists():
if not request.user.is_superuser and not talk.speakers.filter(user=request.user).exists():
# FIXME fine permissions
raise PermissionDenied()
form = TalkForm(request.POST or None, instance=talk)
@ -69,8 +68,8 @@ def talk_edit(request, talk=None):
talk = form.save(commit=False)
talk.site = site
talk.save()
speaker = PonyConfSpeaker.on_site.get_or_create(user=request.user.ponyconfuser, site=site)[0]
speach = Speach(user=speaker, talk=talk, order=1)
speaker = PonyConfSpeaker.on_site.get_or_create(user=request.user, site=site)[0]
speach = Speach(speaker=speaker, talk=talk, order=1)
speach.save()
messages.success(request, 'Talk proposed successfully!')
return redirect('show-talk', talk.slug)