topics, tests

This commit is contained in:
Guilhem Saurel 2016-06-12 21:09:52 +02:00
parent de72b6b167
commit 607e44e861
11 changed files with 47 additions and 25 deletions

View File

@ -3,6 +3,7 @@ from enum import IntEnum
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.contrib.sites.managers import CurrentSiteManager from django.contrib.sites.managers import CurrentSiteManager
from django.contrib.sites.models import Site from django.contrib.sites.models import Site
from django.core.urlresolvers import reverse
from django.db import models from django.db import models
__all__ = ['Profile', 'Speaker'] __all__ = ['Profile', 'Speaker']
@ -17,6 +18,12 @@ class Profile(models.Model):
user = models.OneToOneField(User) user = models.OneToOneField(User)
biography = models.TextField(blank=True, verbose_name='Biography') biography = models.TextField(blank=True, verbose_name='Biography')
def __str__(self):
return self.user.get_full_name() or self.user.username
def get_absolute_url(self):
return reverse('profile')
class Speaker(models.Model): class Speaker(models.Model):
@ -39,7 +46,10 @@ class Speaker(models.Model):
unique_together = ('site', 'user') unique_together = ('site', 'user')
def __str__(self): def __str__(self):
return self.user.get_full_name() or self.user.username return str(self.user.profile)
def get_absolute_url(self):
return reverse('show-speaker', kwargs={'username': self.user.username})
def create_profile(sender, instance, created, **kwargs): def create_profile(sender, instance, created, **kwargs):

View File

@ -1,8 +1,9 @@
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.contrib.sites.models import Site
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.test import TestCase from django.test import TestCase
from .models import Profile from .models import Profile, Speaker
ROOT_URL = 'accounts' ROOT_URL = 'accounts'
@ -11,15 +12,17 @@ class AccountTests(TestCase):
def setUp(self): def setUp(self):
for guy in 'ab': for guy in 'ab':
User.objects.create_user(guy, email='%s@example.org' % guy, password=guy) User.objects.create_user(guy, email='%s@example.org' % guy, password=guy)
Speaker.objects.create(user=User.objects.first(), site=Site.objects.first())
# MODELS def test_models(self):
def test_create_profile(self):
self.assertEqual(Profile.objects.count(), 2) self.assertEqual(Profile.objects.count(), 2)
self.client.login(username='b', password='b')
for model in [Profile, Speaker]:
item = model.objects.first()
self.assertEqual(self.client.get(item.get_absolute_url()).status_code, 200)
self.assertTrue(str(item))
# VIEWS def test_views(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')
self.assertEqual(user.email, 'b@example.org') self.assertEqual(user.email, 'b@example.org')

View File

@ -5,4 +5,4 @@ from proposals.models import Talk
__all__ = ['TalkForm'] __all__ = ['TalkForm']
TalkForm = modelform_factory(Talk, fields=['title', 'description']) TalkForm = modelform_factory(Talk, fields=['title', 'description', 'topics'])

View File

@ -18,7 +18,7 @@ class Topic(models.Model):
return self.name return self.name
def get_absolute_url(self): def get_absolute_url(self):
return reverse('list-talks-by-topic', kwargs={'slug': self.slug}) return reverse('list-talks-by-topic', kwargs={'topic': self.slug})
class Talk(models.Model): class Talk(models.Model):

View File

@ -7,8 +7,8 @@
<h1>Speakers:</h1> <h1>Speakers:</h1>
<ul> <ul>
{% for speaker in speakers %} {% for speaker in user_list %}
<li><a href="{% url 'list-speakers' %}">{{ speaker }}</a></li> <li><a href="{% url 'show-speaker' username=speaker.username %}">{{ speaker }}</a></li>
{% empty %} {% empty %}
<li><i>No speakers.</i></li> <li><i>No speakers.</i></li>
{% endfor %} {% endfor %}

View File

@ -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.username %}">{{ speaker }}</a></li> <li><a href="{% url 'show-speaker' speaker.username %}">{{ speaker }}</a></li>
{% empty %} {% empty %}
<li><i>No speaker.</i></li> <li><i>No speaker.</i></li>
{% endfor %} {% endfor %}

View File

@ -7,12 +7,12 @@
<h1>{{ title }}</h1> <h1>{{ title }}</h1>
<ul> <ul>
{% for talk in talks %} {% for talk in talk_list %}
<li> <li>
<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 speaker in talk.speakers.all %}
<a href="{% url 'show-user' speach.username %}">{{ speach.user }}</a> <a href="{% url 'show-speaker' speaker.username %}">{{ speaker }}</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

@ -13,8 +13,8 @@
<li> <li>
<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 speaker in talk.speakers.all %}
<a href="{% url 'show-user' speach.username %}">{{ speach.user }}</a> <a href="{% url 'show-speaker' speaker.username %}">{{ speaker }}</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.username %}">{{ speach.user }}</a> <a href="{% url 'show-speaker' 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,15 +2,16 @@ 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 django.test import TestCase
from .models import Talk from .models import Talk, Topic, Speach
class ProposalsTests(TestCase): class ProposalsTests(TestCase):
def setUp(self): def setUp(self):
for guy in 'ab': for guy in 'ab':
User.objects.create_user(guy, email='%s@example.org' % guy, password=guy) User.objects.create_user(guy, email='%s@example.org' % guy, password=guy)
Topic.objects.create(name='pipo')
def test_views(self): def test_everything(self):
# talk-edit # talk-edit
self.client.login(username='a', password='a') self.client.login(username='a', password='a')
self.client.post(reverse('add-talk'), {'title': 'super talk', 'description': 'super'}) self.client.post(reverse('add-talk'), {'title': 'super talk', 'description': 'super'})
@ -27,9 +28,15 @@ class ProposalsTests(TestCase):
self.assertEqual(self.client.get(reverse('edit-talk', kwargs={'talk': talk.slug})).status_code, 200) self.assertEqual(self.client.get(reverse('edit-talk', kwargs={'talk': talk.slug})).status_code, 200)
self.assertEqual(self.client.get(reverse('show-talk', kwargs={'slug': talk.slug})).status_code, 200) self.assertEqual(self.client.get(reverse('show-talk', kwargs={'slug': 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('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-speaker', 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)
self.assertEqual(self.client.get(reverse('list-talks')).status_code, 200) self.assertEqual(self.client.get(reverse('list-talks')).status_code, 200)
# Models str & get_asbolute_url
for model in [Talk, Topic, Speach]:
item = model.objects.first()
self.assertEqual(self.client.get(item.get_absolute_url()).status_code, 200)
self.assertTrue(str(item))

View File

@ -12,5 +12,5 @@ urlpatterns = [
url(r'^talk/by-speaker/(?P<speaker>[\w.@+-]+)$', views.talk_list_by_speaker, name='list-talks-by-speaker'), url(r'^talk/by-speaker/(?P<speaker>[\w.@+-]+)$', views.talk_list_by_speaker, name='list-talks-by-speaker'),
url(r'^topic/$', views.TopicList.as_view(), name='list-topics'), url(r'^topic/$', views.TopicList.as_view(), name='list-topics'),
url(r'^speakers/$', views.SpeakerList.as_view(), name='list-speakers'), url(r'^speakers/$', views.SpeakerList.as_view(), name='list-speakers'),
url(r'^user/(?P<username>[\w.@+-]+)$', views.user_details, name='show-user'), url(r'^speaker/(?P<username>[\w.@+-]+)$', views.user_details, name='show-speaker'),
] ]

View File

@ -29,7 +29,7 @@ def talk_list_by_topic(request, topic):
topic = get_object_or_404(Topic, slug=topic) topic = get_object_or_404(Topic, slug=topic)
return render(request, 'proposals/talk_list.html', { return render(request, 'proposals/talk_list.html', {
'title': 'Talks related to %s:' % topic, 'title': 'Talks related to %s:' % topic,
'talks': Talk.on_site.filter(topics=topic), 'talk_list': Talk.on_site.filter(topics=topic),
}) })
@ -38,7 +38,7 @@ def talk_list_by_speaker(request, speaker):
speaker = get_object_or_404(User, username=speaker) speaker = get_object_or_404(User, username=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,
'talks': Talk.on_site.filter(speakers=speaker), 'talk_list': Talk.on_site.filter(speakers=speaker),
}) })
@ -61,6 +61,7 @@ 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()
form.save_m2m()
Speaker.on_site.get_or_create(user=request.user, site=site) Speaker.on_site.get_or_create(user=request.user, site=site)
Speach.objects.create(speaker=request.user, talk=talk) Speach.objects.create(speaker=request.user, talk=talk)
messages.success(request, 'Talk proposed successfully!') messages.success(request, 'Talk proposed successfully!')
@ -80,6 +81,7 @@ class TopicList(LoginRequiredMixin, ListView):
class SpeakerList(LoginRequiredMixin, ListView): class SpeakerList(LoginRequiredMixin, ListView):
queryset = User.objects.filter(speach__talk=Talk.on_site.all()) queryset = User.objects.filter(speach__talk=Talk.on_site.all())
template_name = 'proposals/speaker_list.html'
@login_required @login_required