This commit is contained in:
Guilhem Saurel 2016-06-11 17:28:39 +02:00
parent a07715a7d4
commit 16f75ae262
12 changed files with 96 additions and 19 deletions

View File

@ -38,6 +38,10 @@ class PonyConfSpeaker(models.Model):
class Meta: class Meta:
unique_together = ('site', 'user') unique_together = ('site', 'user')
def __str__(self):
user = self.user.user
return user.get_full_name() or user.username
def create_ponyconfuser(sender, instance, created, **kwargs): def create_ponyconfuser(sender, instance, created, **kwargs):
if created: if created:

View File

@ -1,3 +1,43 @@
from django.test import TestCase from django.test import TestCase
from django.contrib.auth.models import User
from django.core.urlresolvers import reverse
# Create your tests here. from .models import PonyConfSpeaker, PonyConfUser
ROOT_URL = 'accounts'
class AccountTests(TestCase):
def setUp(self):
for guy in 'ab':
User.objects.create_user(guy, email='%s@example.org' % guy, password=guy)
# MODELS
def test_create_ponyconfuser(self):
self.assertEqual(PonyConfUser.objects.count(), 2)
# 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')
self.assertEqual(user.email, 'b@example.org')
self.assertEqual(user.ponyconfuser.biography, '')
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.assertEqual(User.objects.filter(username='z').count(), 0)
r = 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')
self.assertEqual(user.ponyconfuser.biography, 'tester')

View File

@ -6,5 +6,6 @@ from accounts import views
urlpatterns = [ urlpatterns = [
url(r'^login/$', auth_views.login, {'template_name': 'accounts/login.html'}, name='login'), 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'^logout/$', auth_views.logout, {'next_page': '/'}, name='logout'),
url(r'^profile/$', views.profile, name='profile'), url(r'^profile$', views.profile, name='profile'),
url(r'^password$', views.password, name='password'),
] ]

View File

@ -55,4 +55,7 @@ class Speach(models.Model):
) )
def __str__(self): def __str__(self):
return self.user.username + ' speaking at ' + self.talk.title + ' in position %d' % self.order return '%s speaking at %s in position %d' % (self.user, self.talk, self.order)
def username(self):
return self.user.user.user.username

View File

@ -8,9 +8,7 @@
<ul> <ul>
{% for speaker in speakers %} {% for speaker in speakers %}
<li> <li><a href="{% url 'list-speakers' %}">{{ speaker }}</a></li>
<a href="{% url 'list-speakers' %}">{% firstof speaker.get_full_name speaker.username %}</a>
</li>
{% empty %} {% empty %}
<li><i>No speakers.</i></li> <li><i>No speakers.</i></li>
{% endfor %} {% endfor %}

View File

@ -16,11 +16,7 @@
<ul> <ul>
{% for speaker in talk.speakers.all %} {% for speaker in talk.speakers.all %}
<li> <li><a href="{% url 'show-user' speaker.user.user.username %}">{{ speaker }}</a></li>
<a href="{% url 'show-user' speaker.user.user.username %}">
{% firstof speaker.get_full_name speaker.username %}
</a>
</li>
{% empty %} {% empty %}
<li><i>No speaker.</i></li> <li><i>No speaker.</i></li>
{% endfor %} {% endfor %}

View File

@ -12,7 +12,7 @@
<a href="{% url 'show-talk' talk.slug %}">{{ talk }}</a> <a href="{% url 'show-talk' talk.slug %}">{{ talk }}</a>
<i>by</i> <i>by</i>
{% for speach in talk.speach_set.all %} {% for speach in talk.speach_set.all %}
<a href="{% url 'show-user' speach.user.username %}">{% firstof speach.user.get_full_name speach.user.username %}</a> <a href="{% url 'show-user' speach.username %}">{{ speach.user }}</a>
{% if forloop.revcounter == 2 %} and {% elif not forloop.last %}, {% endif %} {% if forloop.revcounter == 2 %} and {% elif not forloop.last %}, {% endif %}
{% endfor %} {% endfor %}
</li> </li>

View File

@ -14,7 +14,7 @@
<a href="{% url 'show-talk' talk.slug %}">{{ talk }}</a> <a href="{% url 'show-talk' talk.slug %}">{{ talk }}</a>
<i>by</i> <i>by</i>
{% for speach in talk.speach_set.all %} {% for speach in talk.speach_set.all %}
<a href="{% url 'show-user' speach.user.user.user.username %}">{% firstof speach.user.user.user.get_full_name speach.user.user.user.username %}</a> <a href="{% url 'show-user' speach.username %}">{{ speach.user }}</a>
{% if forloop.revcounter == 2 %} and {% elif not forloop.last %}, {% endif %} {% if forloop.revcounter == 2 %} and {% elif not forloop.last %}, {% endif %}
{% endfor %} {% endfor %}
<a class="btn btn-primary" href="{% url 'edit-talk' talk.slug %}">edit</a> <a class="btn btn-primary" href="{% url 'edit-talk' talk.slug %}">edit</a>
@ -32,7 +32,7 @@
<a href="{% url 'show-talk' talk.slug %}">{{ talk }}</a> <a href="{% url 'show-talk' talk.slug %}">{{ talk }}</a>
<i>by</i> <i>by</i>
{% for speach in talk.speach_set.all %} {% for speach in talk.speach_set.all %}
<a href="{% url 'show-user' speach.user.username %}">{% firstof speach.user.get_full_name speach.user.username %}</a> <a href="{% url 'show-user' speach.username %}">{{ speach.user }}</a>
{% if forloop.revcounter == 2 %} and {% elif not forloop.last %}, {% endif %} {% if forloop.revcounter == 2 %} and {% elif not forloop.last %}, {% endif %}
{% endfor %} {% endfor %}
</li> </li>

View File

@ -2,7 +2,7 @@
{% block content %} {% block content %}
<h1>{% firstof user.get_full_name user.username %}</h1> <h1>{{ user }}</h1>
<b>Biography:</b> <b>Biography:</b>
<p>{{ user.biography }}</p> <p>{{ user.biography }}</p>

View File

@ -1,3 +1,37 @@
from django.test import TestCase from django.test import TestCase
from django.contrib.auth.models import User
from django.core.urlresolvers import reverse
# Create your tests here. from accounts.models import PonyConfSpeaker
from .models import Topic, Talk, Speach
class ProposalsTests(TestCase):
def setUp(self):
for guy in 'ab':
User.objects.create_user(guy, email='%s@example.org' % guy, password=guy)
def test_views(self):
# talk-edit
self.client.login(username='a', password='a')
self.client.post(reverse('add-talk'), {'title': 'super talk', 'description': 'super'})
self.assertEqual(str(Talk.on_site.first()), 'super talk')
self.client.post(reverse('edit-talk', kwargs={'talk': 'super-talk'}),
{'title': 'mega talk', 'description': 'mega'})
self.assertEqual(str(Talk.on_site.first()), 'mega talk')
# Status Code
self.client.login(username='a', password='a')
for view in ['home', 'list-talks', 'add-talk', 'list-topics', 'list-speakers']:
self.assertEqual(self.client.get(reverse(view)).status_code, 200)
talk = Talk.on_site.first()
for view in ['edit-talk', 'show-talk']:
self.assertEqual(self.client.get(reverse(view, kwargs={'talk': talk.slug})).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.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)
self.assertEqual(self.client.get(reverse('list-talks')).status_code, 200)

View File

@ -44,7 +44,7 @@ def talk_list_by_speaker(request, speaker):
speaker = get_object_or_404(PonyConfSpeaker, user__user__username=speaker) speaker = get_object_or_404(PonyConfSpeaker, user__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.get_full_name() or speaker.username), 'title': 'Talks with %s:' % speaker,
'talks': talks, 'talks': talks,
}) })
@ -55,7 +55,8 @@ 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()
if not request.user.is_superuser and not talk.speakers.filter(username=request.user.username).exists(): user = PonyConfUser.objects.get(user=request.user)
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)

View File

@ -1,6 +1,6 @@
[coverage:run] [coverage:run]
source = accounts, ponyconf, proposals source = accounts, ponyconf, proposals
omit = */migrations/*, */apps.py omit = */migrations/*, */apps.py, ponyconf/wsgi.py
[flake8] [flake8]
max-line-length = 119 max-line-length = 119