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)
|
||||
|
||||
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):
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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">
|
||||
<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>
|
|
@ -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.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')
|
||||
|
|
|
@ -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')),
|
||||
]
|
||||
|
|
|
@ -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):
|
||||
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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))
|
||||
|
||||
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
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue