diff --git a/accounts/models.py b/accounts/models.py index 6d1cbf0..fd91691 100644 --- a/accounts/models.py +++ b/accounts/models.py @@ -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: diff --git a/accounts/tests.py b/accounts/tests.py index 7ce503c..62b5ec3 100644 --- a/accounts/tests.py +++ b/accounts/tests.py @@ -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') diff --git a/accounts/urls.py b/accounts/urls.py index 260a947..2062cfe 100644 --- a/accounts/urls.py +++ b/accounts/urls.py @@ -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'), ] diff --git a/proposals/models.py b/proposals/models.py index 4fc3708..e0f8cbd 100644 --- a/proposals/models.py +++ b/proposals/models.py @@ -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 diff --git a/proposals/templates/proposals/speaker_list.html b/proposals/templates/proposals/speaker_list.html index 70c923b..1a8cdd5 100644 --- a/proposals/templates/proposals/speaker_list.html +++ b/proposals/templates/proposals/speaker_list.html @@ -8,9 +8,7 @@
{{ user.biography }}
diff --git a/proposals/tests.py b/proposals/tests.py index 7ce503c..a7a8871 100644 --- a/proposals/tests.py +++ b/proposals/tests.py @@ -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) diff --git a/proposals/views.py b/proposals/views.py index 2df575e..06f681c 100644 --- a/proposals/views.py +++ b/proposals/views.py @@ -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) diff --git a/setup.cfg b/setup.cfg index 3baeeda..4ab3d37 100644 --- a/setup.cfg +++ b/setup.cfg @@ -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