diff --git a/accounts/models.py b/accounts/models.py index 146f0fe..072ebe2 100644 --- a/accounts/models.py +++ b/accounts/models.py @@ -1,12 +1,12 @@ from django.contrib.auth.models import User -from django.core.urlresolvers import reverse +from django.urls import reverse from django.db import models from django.utils.translation import ugettext_lazy as _ class Profile(models.Model): - user = models.OneToOneField(User) + user = models.OneToOneField(User, on_delete=models.CASCADE) phone_number = models.CharField(max_length=16, blank=True, default='', verbose_name=_('Phone number')) sms_prefered = models.BooleanField(default=False, verbose_name=_('SMS prefered')) biography = models.TextField(blank=True, verbose_name=_('Biography')) diff --git a/accounts/urls.py b/accounts/urls.py index fe35a6d..750b1dc 100644 --- a/accounts/urls.py +++ b/accounts/urls.py @@ -1,15 +1,12 @@ from django.conf import settings -from django.conf.urls import include, url +from django.urls import include, path from django.contrib.auth import views as auth_views from . import views urlpatterns = [ - url(r'^profile/$', views.profile, name='profile'), - url(r'accounts/login/', views.EmailLoginView.as_view(), {'extra_context': {'buttons': [views.RESET_PASSWORD_BUTTON]}}, name='login'), - #url(r'^login/$', auth_views.login, {'extra_context': {'buttons': [views.RESET_PASSWORD_BUTTON]}}, name='login'), - url(r'^logout/$', auth_views.logout, {'next_page': settings.LOGOUT_REDIRECT_URL}, name='logout'), - #url(r'^avatar/', include('avatar.urls')), - url(r'', include('django.contrib.auth.urls')), - #url(r'', include('registration.backends.default.urls')), + path('profile/', views.profile, name='profile'), + path('accounts/login/', views.EmailLoginView.as_view(), {'extra_context': {'buttons': [views.RESET_PASSWORD_BUTTON]}}, name='login'), + path('logout/', auth_views.logout, {'next_page': settings.LOGOUT_REDIRECT_URL}, name='logout'), + path('', include('django.contrib.auth.urls')), ] diff --git a/cfp/converters.py b/cfp/converters.py new file mode 100644 index 0000000..e42ef99 --- /dev/null +++ b/cfp/converters.py @@ -0,0 +1,8 @@ +class SignedIntConverter: + regex = '[+-]?[0-9]+' + + def to_python(self, value): + return int(value) + + def to_url(self, value): + return '%+d' % value diff --git a/cfp/decorators.py b/cfp/decorators.py index 5caaf20..312814f 100644 --- a/cfp/decorators.py +++ b/cfp/decorators.py @@ -19,7 +19,7 @@ def speaker_required(view_func): except ValueError: raise Http404 speaker = get_object_or_404(Participant, site=request.conference.site, token=speaker_token) - elif request.user.is_authenticated(): + elif request.user.is_authenticated: speaker = get_object_or_404(Participant, site=request.conference.site, email=request.user.email) else: raise PermissionDenied @@ -37,7 +37,7 @@ def volunteer_required(view_func): except ValueError: raise Http404 volunteer = get_object_or_404(Volunteer, site=request.conference.site, token=volunteer_token) - elif request.user.is_authenticated(): + elif request.user.is_authenticated: volunteer = get_object_or_404(Volunteer, site=request.conference.site, email=request.user.email) else: raise PermissionDenied @@ -48,7 +48,7 @@ def volunteer_required(view_func): def staff_required(view_func): def _is_staff(request, *args, **kwargs): - if not request.user.is_authenticated(): + if not request.user.is_authenticated: return login_required(view_func)(request, *args, **kwargs) elif is_staff(request, request.user): return view_func(request, *args, **kwargs) diff --git a/cfp/models.py b/cfp/models.py index e1a95d0..ff9d025 100644 --- a/cfp/models.py +++ b/cfp/models.py @@ -1,6 +1,6 @@ from django.contrib.auth.models import User from django.contrib.sites.models import Site -from django.core.urlresolvers import reverse +from django.urls import reverse from django.core.validators import MaxValueValidator, MinValueValidator from django.core.exceptions import ValidationError from django.db import models @@ -117,7 +117,7 @@ class Participant(PonyConfModel): notes = models.TextField(default='', blank=True, verbose_name=_("Notes"), help_text=_('This field is only visible by organizers.')) vip = models.BooleanField(default=False, verbose_name=_('Invited speaker')) - conversation = models.OneToOneField(MessageThread) + conversation = models.OneToOneField(MessageThread, on_delete=models.PROTECT) objects = ParticipantManager() @@ -332,14 +332,14 @@ class Talk(PonyConfModel): slug = AutoSlugField(populate_from='title', unique=True) description = models.TextField(verbose_name=_('Description of your talk'), help_text=_('This description will be visible on the program.')) - track = models.ForeignKey(Track, blank=True, null=True, verbose_name=_('Track')) + track = models.ForeignKey(Track, blank=True, null=True, verbose_name=_('Track'), on_delete=models.SET_NULL) tags = models.ManyToManyField(Tag, blank=True) notes = models.TextField(blank=True, verbose_name=_('Message to organizers'), help_text=_('If you have any constraint or if you have anything that may ' 'help you to select your talk, like a video or slides of your' ' talk, please write it down here. This field will only be ' 'visible by organizers.')) - category = models.ForeignKey(TalkCategory, verbose_name=_('Talk Category')) + category = models.ForeignKey(TalkCategory, verbose_name=_('Talk Category'), on_delete=models.PROTECT) videotaped = models.BooleanField(_("I'm ok to be recorded on video"), default=True) video_licence = models.CharField(choices=LICENCES, default='CC-BY-SA', max_length=10, verbose_name=_("Video licence")) @@ -348,13 +348,13 @@ class Talk(PonyConfModel): confirmed = models.NullBooleanField(default=None) start_date = models.DateTimeField(null=True, blank=True, default=None, verbose_name=_('Beginning date and time')) duration = models.PositiveIntegerField(default=0, verbose_name=_('Duration (min)')) - room = models.ForeignKey(Room, blank=True, null=True, default=None) + room = models.ForeignKey(Room, blank=True, null=True, default=None, on_delete=models.SET_NULL) plenary = models.BooleanField(default=False) materials = models.FileField(null=True, blank=True, upload_to=talks_materials_destination, verbose_name=_('Materials'), help_text=_('You can use this field to share some materials related to your intervention.')) video = models.URLField(max_length=1000, blank=True, default='', verbose_name='Video URL') token = models.UUIDField(default=uuid.uuid4, editable=False, unique=True) - conversation = models.OneToOneField(MessageThread) + conversation = models.OneToOneField(MessageThread, on_delete=models.PROTECT) objects = TalkManager() @@ -445,8 +445,8 @@ class Talk(PonyConfModel): class Vote(PonyConfModel): - talk = models.ForeignKey(Talk) - user = models.ForeignKey(User) + talk = models.ForeignKey(Talk, on_delete=models.CASCADE) + user = models.ForeignKey(User, on_delete=models.CASCADE) vote = models.IntegerField(validators=[MinValueValidator(-2), MaxValueValidator(2)], default=0) class Meta: @@ -491,7 +491,7 @@ class Volunteer(PonyConfModel): notes = models.TextField(default='', blank=True, verbose_name=_('Notes'), help_text=_('If you have some constraints, you can indicate them here.')) activities = models.ManyToManyField(Activity, blank=True, related_name='volunteers', verbose_name=_('Activities')) - conversation = models.OneToOneField(MessageThread) + conversation = models.OneToOneField(MessageThread, on_delete=models.PROTECT) def get_absolute_url(self): return reverse('volunteer-details', kwargs={'volunteer_id': self.pk}) diff --git a/cfp/planning.py b/cfp/planning.py index a0268b2..24c55bb 100644 --- a/cfp/planning.py +++ b/cfp/planning.py @@ -3,7 +3,7 @@ from django.utils.safestring import mark_safe from django.utils.html import escape from django.utils.timezone import localtime, now from django.core.cache import cache -from django.core.urlresolvers import reverse +from django.urls import reverse from django.template.loader import get_template from django.conf import settings @@ -298,9 +298,9 @@ class Program: if not result: result = getattr(self, '_as_%s' % output)(**kwargs) cache.set(cache_entry, result, 3 * 60 * 60) # 3H - return mark_safe(result) + return result else: - return mark_safe(getattr(self, '_as_%s' % output)(**kwargs)) + return getattr(self, '_as_%s' % output)(**kwargs) def __str__(self): return self.render() diff --git a/cfp/signals.py b/cfp/signals.py index b582901..57cb73c 100644 --- a/cfp/signals.py +++ b/cfp/signals.py @@ -4,7 +4,7 @@ from django.contrib.sites.models import Site from django.conf import settings from django.utils.translation import ugettext_lazy as _ from django.contrib.auth.models import User -from django.core.urlresolvers import reverse +from django.urls import reverse from django.contrib.auth import get_user_model from ponyconf.decorators import disable_for_loaddata diff --git a/cfp/templates/cfp/schedule.html b/cfp/templates/cfp/schedule.html index 97c126d..8f9f528 100644 --- a/cfp/templates/cfp/schedule.html +++ b/cfp/templates/cfp/schedule.html @@ -8,6 +8,6 @@
{{ talk.vote_set.count }} {% trans "vote" %}{{ talk.vote_set.count|pluralize }}, {% trans "average:" %} {{ talk.score|floatformat:1 }}
diff --git a/cfp/tests.py b/cfp/tests.py index 81a20bc..872aabf 100644 --- a/cfp/tests.py +++ b/cfp/tests.py @@ -1,6 +1,6 @@ from django.contrib.auth.models import User from django.contrib.sites.models import Site -from django.core.urlresolvers import reverse +from django.urls import reverse from django.test import TestCase from django.utils import timezone from django.contrib import messages @@ -148,11 +148,12 @@ class ProposalTest(TestCase): conf.home = '**Welcome!**' conf.save() response = self.client.get(reverse('home')) - self.assertEquals(response.status_code, 200) + self.assertEqual(response.status_code, 200) self.assertContains(response, 'Welcome!') def test_proposal_closed(self): conf = Conference.objects.get(name='PonyConf') + Talk.objects.filter(site=conf.site).all().delete() TalkCategory.objects.filter(site=conf.site).all().delete() response = self.client.get(reverse('proposal-home')) self.assertEqual(response.status_code, 200) @@ -190,7 +191,7 @@ class ProposalTest(TestCase): 'description': 'PonyConf is cool.', }) speaker = Participant.objects.get(site=site, name='Jean-Mi') - self.assertEquals(speaker.email, 'jean-mi@example.org') + self.assertEqual(speaker.email, 'jean-mi@example.org') talk = Talk.objects.get(site=site, title='PonyConf') self.assertRedirects(response, reverse('proposal-talk-details', kwargs=dict(speaker_token=speaker.token, talk_id=talk.pk)), 302) self.assertTrue(speaker in talk.speakers.all()) @@ -211,9 +212,9 @@ class ProposalTest(TestCase): 'biography': 'New bio', }), reverse('proposal-dashboard', kwargs={'speaker_token': speaker.token})) speaker = Participant.objects.get(pk=speaker.pk) - self.assertEquals(speaker.name, 'New name') - self.assertEquals(speaker.email, 'new-mail@example.org') - self.assertEquals(speaker.biography, 'New bio') + self.assertEqual(speaker.name, 'New name') + self.assertEqual(speaker.email, 'new-mail@example.org') + self.assertEqual(speaker.biography, 'New bio') def test_proposal_talk_details(self): speaker1 = Participant.objects.get(name='Speaker 1') @@ -235,7 +236,7 @@ class ProposalTest(TestCase): 'description': 'Talk description', }) talk = Talk.objects.get(title='New talk') - self.assertEquals(talk.description, 'Talk description') + self.assertEqual(talk.description, 'Talk description') self.assertRedirects(response, reverse('proposal-talk-details', kwargs=dict(speaker_token=speaker.token, talk_id=talk.pk))) def test_proposal_talk_edit(self): @@ -243,14 +244,14 @@ class ProposalTest(TestCase): talk = Talk.objects.get(title='Talk 1') url = reverse('proposal-talk-edit', kwargs={'speaker_token': speaker.token, 'talk_id': talk.pk}) response = self.client.get(url) - self.assertEquals(response.status_code, 200) + self.assertEqual(response.status_code, 200) self.assertRedirects(self.client.post(url, { 'title': 'New title', 'description': 'New description', }), reverse('proposal-talk-details', kwargs=dict(speaker_token=speaker.token, talk_id=talk.pk))) talk = Talk.objects.get(pk=talk.pk) - self.assertEquals(talk.title, 'New title') - self.assertEquals(talk.description, 'New description') + self.assertEqual(talk.title, 'New title') + self.assertEqual(talk.description, 'New description') def test_proposal_speaker_add(self): speaker1 = Participant.objects.get(name='Speaker 1') @@ -271,13 +272,13 @@ class ProposalTest(TestCase): 'notify': 1, }) self.assertRedirects(response, url_talk) - self.assertEquals(talk.speakers.count(), speaker_count+1) + self.assertEqual(talk.speakers.count(), speaker_count+1) speaker5 = Participant.objects.get(name='Speaker 5') self.assertTrue(speaker5 in talk.speakers.all()) self.assertFalse(speaker4 in talk.speakers.all()) response = self.client.get(url_add_existing) self.assertRedirects(response, url_talk) - self.assertEquals(talk.speakers.count(), speaker_count+2) + self.assertEqual(talk.speakers.count(), speaker_count+2) self.assertTrue(speaker4 in talk.speakers.all()) @@ -334,11 +335,11 @@ class ProposalTest(TestCase): talk.accepted = None talk.save() for url in [confirm_url, desist_url]: - self.assertEquals(self.client.get(url).status_code, 403) + self.assertEqual(self.client.get(url).status_code, 403) talk.accepted = False talk.save() for url in [confirm_url, desist_url]: - self.assertEquals(self.client.get(url).status_code, 403) + self.assertEqual(self.client.get(url).status_code, 403) talk.accepted = True talk.save() conf.save() @@ -393,13 +394,13 @@ class StaffTest(TestCase): url = reverse('staff') self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') - self.assertEquals(self.client.get(url).status_code, 200) + self.assertEqual(self.client.get(url).status_code, 200) def test_admin(self): url = reverse('admin') self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') - self.assertEquals(self.client.get(url).status_code, 200) + self.assertEqual(self.client.get(url).status_code, 200) def test_volunteer_list(self): url = reverse('volunteer-list') @@ -431,14 +432,14 @@ class StaffTest(TestCase): self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') response = self.client.get(url) - self.assertEquals(response.status_code, 200) + self.assertEqual(response.status_code, 200) def test_activity_add(self): url = reverse('activity-list') self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') response = self.client.get(url) - self.assertEquals(response.status_code, 200) + self.assertEqual(response.status_code, 200) def test_activity_edit(self): conf = Conference.objects.get(name='PonyConf') @@ -446,13 +447,13 @@ class StaffTest(TestCase): url = reverse('activity-edit', kwargs={'slug': activity.slug}) self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') - self.assertEquals(self.client.get(url).status_code, 200) + self.assertEqual(self.client.get(url).status_code, 200) response = self.client.post(url, { 'name': 'New activity name', }) self.assertRedirects(response, reverse('activity-list')) activity = Activity.objects.get(pk=activity.pk) - self.assertEquals(activity.name, 'New activity name') + self.assertEqual(activity.name, 'New activity name') def test_activity_remove(self): pass @@ -462,7 +463,7 @@ class StaffTest(TestCase): self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') response = self.client.get(url) - self.assertEquals(response.status_code, 200) + self.assertEqual(response.status_code, 200) self.assertContains(response, 'Speaker 1') self.assertContains(response, 'Speaker 2') response = self.client.get(url + '?format=csv') @@ -478,7 +479,7 @@ class StaffTest(TestCase): self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') response = self.client.get(url) - self.assertEquals(response.status_code, 200) + self.assertEqual(response.status_code, 200) self.assertContains(response, 'Speaker 1') self.assertContains(response, 'Speaker 2') self.assertNotContains(response, 'Speaker 3') @@ -491,16 +492,16 @@ class StaffTest(TestCase): self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') response = self.client.get(url) - self.assertEquals(response.status_code, 200) + self.assertEqual(response.status_code, 200) self.assertRedirects(self.client.post(url, { 'name': 'New name', 'email': 'new-mail@example.org', 'biography': 'New bio', }), reverse('participant-details', kwargs={'participant_id': speaker.pk})) speaker = Participant.objects.get(pk=speaker.pk) - self.assertEquals(speaker.name, 'New name') - self.assertEquals(speaker.email, 'new-mail@example.org') - self.assertEquals(speaker.biography, 'New bio') + self.assertEqual(speaker.name, 'New name') + self.assertEqual(speaker.email, 'new-mail@example.org') + self.assertEqual(speaker.biography, 'New bio') def test_speaker_add_talk(self): speaker = Participant.objects.get(name='Speaker 1') @@ -508,14 +509,14 @@ class StaffTest(TestCase): self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') response = self.client.get(url) - self.assertEquals(response.status_code, 200) + self.assertEqual(response.status_code, 200) def test_talk_list(self): url = reverse('talk-list') self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') response = self.client.get(url) - self.assertEquals(response.status_code, 200) + self.assertEqual(response.status_code, 200) self.assertContains(response, 'Talk 1') response = self.client.get(url + '?format=csv') self.assertEqual(response.status_code, 200) @@ -527,7 +528,7 @@ class StaffTest(TestCase): self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') response = self.client.get(url) - self.assertEquals(response.status_code, 200) + self.assertEqual(response.status_code, 200) self.assertContains(response, talk.title) def test_conference(self): @@ -536,7 +537,7 @@ class StaffTest(TestCase): self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') response = self.client.get(url) - self.assertEquals(response.status_code, 200) + self.assertEqual(response.status_code, 200) def test_conference_opened_categories(self): # TODO cover all cases @@ -618,7 +619,7 @@ class StaffTest(TestCase): self.assertRedirects(self.client.get(accept_url), reverse('login') + '?next=' + accept_url) self.assertRedirects(self.client.get(decline_url), reverse('login') + '?next=' + decline_url) self.client.login(username='admin', password='admin') - self.assertEquals(self.client.get(accept_url).status_code, 200) + self.assertEqual(self.client.get(accept_url).status_code, 200) self.assertRedirects(self.client.post(accept_url), details_url) talk = Talk.objects.get(pk=talk.pk) self.assertTrue(talk.accepted) @@ -627,7 +628,7 @@ class StaffTest(TestCase): self.assertRedirects(self.client.post(accept_url, {'message': 'Ok'}), details_url) talk = Talk.objects.get(pk=talk.pk) self.assertTrue(talk.accepted) - self.assertEquals(self.client.get(decline_url).status_code, 200) + self.assertEqual(self.client.get(decline_url).status_code, 200) self.assertRedirects(self.client.post(decline_url), details_url) talk = Talk.objects.get(pk=talk.pk) self.assertFalse(talk.accepted) @@ -648,50 +649,50 @@ class StaffTest(TestCase): self.assertRedirects(self.client.get(confirm_url), reverse('login') + '?next=' + confirm_url) self.assertRedirects(self.client.get(desist_url), reverse('login') + '?next=' + desist_url) self.client.login(username='admin', password='admin') - self.assertEquals(self.client.get(confirm_url).status_code, 403) - self.assertEquals(self.client.get(desist_url).status_code, 403) + self.assertEqual(self.client.get(confirm_url).status_code, 403) + self.assertEqual(self.client.get(desist_url).status_code, 403) talk.accepted = False talk.save() - self.assertEquals(self.client.get(confirm_url).status_code, 403) - self.assertEquals(self.client.get(desist_url).status_code, 403) + self.assertEqual(self.client.get(confirm_url).status_code, 403) + self.assertEqual(self.client.get(desist_url).status_code, 403) talk.accepted = True talk.save() self.assertRedirects(self.client.get(confirm_url), details_url) talk = Talk.objects.get(pk=talk.pk) self.assertTrue(talk.confirmed) - self.assertEquals(self.client.get(confirm_url).status_code, 403) + self.assertEqual(self.client.get(confirm_url).status_code, 403) self.assertRedirects(self.client.get(desist_url), details_url) talk = Talk.objects.get(pk=talk.pk) self.assertFalse(talk.confirmed) - self.assertEquals(self.client.get(desist_url).status_code, 403) + self.assertEqual(self.client.get(desist_url).status_code, 403) def test_category_list(self): url = reverse('category-list') self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') response = self.client.get(url) - self.assertEquals(response.status_code, 200) + self.assertEqual(response.status_code, 200) def test_category_add(self): url = reverse('category-add') self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') response = self.client.get(url) - self.assertEquals(response.status_code, 200) + self.assertEqual(response.status_code, 200) def test_tag_list(self): url = reverse('tag-list') self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') response = self.client.get(url) - self.assertEquals(response.status_code, 200) + self.assertEqual(response.status_code, 200) def test_tag_add(self): url = reverse('tag-add') self.assertRedirects(self.client.get(url), reverse('login') + '?next=' + url) self.client.login(username='admin', password='admin') response = self.client.get(url) - self.assertEquals(response.status_code, 200) + self.assertEqual(response.status_code, 200) class ScheduleTest(TestCase): @@ -719,10 +720,10 @@ class ScheduleTest(TestCase): def test_public_schedule(self): site = Site.objects.first() conf = Conference.objects.get(site=site) - self.assertEquals(self.client.get(reverse('public-schedule')).status_code, 403) + self.assertEqual(self.client.get(reverse('public-schedule')).status_code, 403) conf.schedule_publishing_date = timezone.now() - timedelta(hours=1) conf.save() - self.assertEquals(self.client.get(reverse('public-schedule')).status_code, 200) + self.assertEqual(self.client.get(reverse('public-schedule')).status_code, 200) conf.schedule_redirection_url ='http://example.net/schedule.html' conf.save() self.assertRedirects(self.client.get(reverse('public-schedule')), conf.schedule_redirection_url, status_code=302, fetch_redirect_response=False) @@ -735,7 +736,7 @@ class ScheduleTest(TestCase): def test_xml(self): self.client.login(username='admin', password='admin') response = self.client.get(reverse('staff-schedule') + 'xml/') - self.assertEquals(response.status_code, 200) + self.assertEqual(response.status_code, 200) self.assertContains(response, 'Public tag') self.assertNotContains(response, 'Private tag') ET.fromstring(response.content) @@ -743,7 +744,7 @@ class ScheduleTest(TestCase): def test_ics(self): self.client.login(username='admin', password='admin') response = self.client.get(reverse('staff-schedule') + 'ics/') - self.assertEquals(response.status_code, 200) + self.assertEqual(response.status_code, 200) Calendar.from_ical(response.content) def test_html(self): @@ -751,8 +752,8 @@ class ScheduleTest(TestCase): response = self.client.get(reverse('staff-schedule') + 'html/') self.assertContains(response, 'Staff tag') self.assertNotContains(response, 'Not staff tag') - self.assertEquals(response.status_code, 200) + self.assertEqual(response.status_code, 200) def test_inexistent_format(self): self.client.login(username='admin', password='admin') - self.assertEquals(self.client.get(reverse('staff-schedule') + 'inexistent/').status_code, 404) + self.assertEqual(self.client.get(reverse('staff-schedule') + 'inexistent/').status_code, 404) diff --git a/cfp/urls.py b/cfp/urls.py index 64b8bd3..c676c01 100644 --- a/cfp/urls.py +++ b/cfp/urls.py @@ -1,70 +1,71 @@ -from django.conf.urls import url +from django.urls import path, re_path, register_converter + +from . import views, converters + + +register_converter(converters.SignedIntConverter, 'sint') -from . import views urlpatterns = [ - url(r'^$', views.home, name='home'), -# v1.1 - url(r'^cfp/$', views.proposal_home, name='proposal-home'), - url(r'^cfp/token/$', views.proposal_mail_token, name='proposal-mail-token'), - url(r'^cfp/(?:(?P