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:
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):
if created:

View File

@ -1,3 +1,43 @@
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 = [
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'^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):
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>
{% for speaker in speakers %}
<li>
<a href="{% url 'list-speakers' %}">{% firstof speaker.get_full_name speaker.username %}</a>
</li>
<li><a href="{% url 'list-speakers' %}">{{ speaker }}</a></li>
{% empty %}
<li><i>No speakers.</i></li>
{% endfor %}

View File

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

View File

@ -12,7 +12,7 @@
<a href="{% url 'show-talk' talk.slug %}">{{ talk }}</a>
<i>by</i>
{% 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 %}
{% endfor %}
</li>

View File

@ -14,7 +14,7 @@
<a href="{% url 'show-talk' talk.slug %}">{{ talk }}</a>
<i>by</i>
{% 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 %}
{% endfor %}
<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>
<i>by</i>
{% 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 %}
{% endfor %}
</li>

View File

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

View File

@ -1,3 +1,37 @@
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)
talks = Talk.on_site.filter(speakers=speaker)
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,
})
@ -55,7 +55,8 @@ def talk_edit(request, talk=None):
talk = get_object_or_404(Talk, slug=talk)
if talk.site != get_current_site(request):
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
raise PermissionDenied()
form = TalkForm(request.POST or None, instance=talk)

View File

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