use more of contrib.auth, simplify models
This commit is contained in:
parent
16f75ae262
commit
478c33bb00
|
@ -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),
|
||||||
|
),
|
||||||
|
]
|
|
@ -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):
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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 %}
|
|
@ -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 %}
|
|
@ -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>
|
|
@ -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 %}
|
|
@ -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')
|
||||||
|
|
|
@ -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'),
|
|
||||||
]
|
]
|
||||||
|
|
|
@ -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):
|
||||||
|
|
||||||
|
|
|
@ -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'
|
||||||
|
|
|
@ -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')]),
|
||||||
|
),
|
||||||
|
]
|
|
@ -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
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue