Skip to content

Commit 677fa09

Browse files
authored
Add get conference view to handle /<conference_slug> urls and act accordingly (#647)
Two cases may exist when accessing `/<conference_slug>` : 1. Conference Exists - Redirect to `/<conference_slug>/proposals` 2. Conference Does not exist - Show 404 Page Integration Tests for the above cases are also added.
1 parent 2d9e8bc commit 677fa09

File tree

4 files changed

+91
-27
lines changed

4 files changed

+91
-27
lines changed

junction/conferences/urls.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# -*- coding: utf-8 -*-
2+
3+
from django.conf.urls import include, url
4+
5+
from . import views
6+
7+
8+
urlpatterns = [
9+
url(r'^$', views.get_conference, name='get-conference')
10+
]

junction/conferences/views.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
from __future__ import absolute_import, unicode_literals
33

44
# Third Party Stuff
5+
from django.shortcuts import get_object_or_404
6+
from django.core.urlresolvers import reverse
7+
from django.http.response import HttpResponseRedirect
8+
from django.views.decorators.http import require_http_methods
59
from rest_framework import filters, viewsets
610

711
from .models import Conference, ConferenceVenue, Room
@@ -23,3 +27,13 @@ class RoomView(viewsets.ReadOnlyModelViewSet):
2327
serializer_class = RoomSerializer
2428
filter_backend = (filters.DjangoFilterBackend,)
2529
filter_fields = ('venue',)
30+
31+
32+
@require_http_methods(['GET'])
33+
def get_conference(request, conference_slug):
34+
# if the conference does not exist, render 404
35+
get_object_or_404(Conference, slug=conference_slug)
36+
37+
# redirect to <conference_slug>/proposals else
38+
return HttpResponseRedirect(
39+
reverse('proposals-list', kwargs={'conference_slug': conference_slug}))

junction/urls.py

Lines changed: 46 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -53,31 +53,14 @@
5353
# Tickets
5454
url(r'^tickets/', include('junction.tickets.urls')),
5555

56-
# Proposals related
57-
url(r'^(?P<conference_slug>[\w-]+)/$',
58-
RedirectView.as_view(pattern_name="proposals-list"),
59-
name='conference-index'),
60-
url(r'^(?P<conference_slug>[\w-]+)/proposals/', include('junction.proposals.urls')),
61-
url(r'^(?P<conference_slug>[\w-]+)/dashboard/reviewers/',
62-
junction.proposals.dashboard.reviewer_comments_dashboard,
63-
name='proposal-reviewers-dashboard'),
64-
url(r'^(?P<conference_slug>[\w-]+)/dashboard/proposal_state/$',
65-
junction.proposals.dashboard.proposal_state,
66-
name='proposal-state'),
67-
url(r'^(?P<conference_slug>[\w-]+)/dashboard/$',
68-
junction.proposals.dashboard.proposals_dashboard, name='proposal-dashboard'),
69-
url(r'^(?P<conference_slug>[\w-]+)/dashboard/votes/$',
70-
junction.proposals.dashboard.reviewer_votes_dashboard,
71-
name='proposal-reviewer-votes-dashboard'),
72-
url(r'^(?P<conference_slug>[\w-]+)/dashboard/votes/export/$',
73-
junction.proposals.dashboard.export_reviewer_votes,
74-
name='export-reviewer-votes'),
56+
7557
url(r'^feedback/(?P<schedule_item_id>\d+)/$',
7658
view_feedback,
7759
name='feedback-detail'),
7860
url(r'^schedule_item/(?P<sch_item_id>\d+)/$',
7961
non_proposal_schedule_item_view,
8062
name="schedule-item"),
63+
8164
url(r'^api/v1/', include(router.urls)),
8265
# Device
8366
url(r'^api/v1/devices/$', DeviceListApiView.as_view(), name='device-list'),
@@ -90,19 +73,55 @@
9073
url('^api/v1/feedback/$',
9174
FeedbackListApiView.as_view(),
9275
name='feedback-list'),
76+
9377
# User Dashboard
9478
url(r'^profiles/', include('junction.profiles.urls', namespace="profiles")),
9579

80+
# Static Pages. TODO: to be refactored
81+
url(r'^speakers/$',
82+
TemplateView.as_view(template_name='static-content/speakers.html',),
83+
name='speakers-static'),
84+
url(r'^schedule/$',
85+
TemplateView.as_view(template_name='static-content/schedule.html',),
86+
name='schedule-static'),
87+
url(r'^venue/$',
88+
TemplateView.as_view(template_name='static-content/venue.html',),
89+
name='venue-static'),
90+
url(r'^sponsors/$',
91+
TemplateView.as_view(template_name='static-content/sponsors.html',),
92+
name='sponsors-static'),
93+
url(r'^blog/$',
94+
TemplateView.as_view(template_name='static-content/blog-archive.html',),
95+
name='blog-archive'),
96+
url(r'^coc/$',
97+
TemplateView.as_view(template_name='static-content/coc.html',),
98+
name='coc-static'),
99+
url(r'^faq/$',
100+
TemplateView.as_view(template_name='static-content/faq.html',),
101+
name='faq-static'),
102+
103+
# Conference Pages
104+
url(r'^(?P<conference_slug>[\w-]+)/', include('junction.conferences.urls')),
105+
106+
# Proposals related
107+
url(r'^(?P<conference_slug>[\w-]+)/proposals/', include('junction.proposals.urls')),
108+
url(r'^(?P<conference_slug>[\w-]+)/dashboard/reviewers/',
109+
junction.proposals.dashboard.reviewer_comments_dashboard,
110+
name='proposal-reviewers-dashboard'),
111+
url(r'^(?P<conference_slug>[\w-]+)/dashboard/proposal_state/$',
112+
junction.proposals.dashboard.proposal_state,
113+
name='proposal-state'),
114+
url(r'^(?P<conference_slug>[\w-]+)/dashboard/$',
115+
junction.proposals.dashboard.proposals_dashboard, name='proposal-dashboard'),
116+
url(r'^(?P<conference_slug>[\w-]+)/dashboard/votes/$',
117+
junction.proposals.dashboard.reviewer_votes_dashboard,
118+
name='proposal-reviewer-votes-dashboard'),
119+
url(r'^(?P<conference_slug>[\w-]+)/dashboard/votes/export/$',
120+
junction.proposals.dashboard.export_reviewer_votes,
121+
name='export-reviewer-votes'),
122+
96123
# Schedule related
97124
url(r'^(?P<conference_slug>[\w-]+)/schedule/', include('junction.schedule.urls')),
98-
# Static Pages. TODO: to be refactored
99-
url(r'^speakers/$', TemplateView.as_view(template_name='static-content/speakers.html',), name='speakers-static'),
100-
url(r'^schedule/$', TemplateView.as_view(template_name='static-content/schedule.html',), name='schedule-static'),
101-
url(r'^venue/$', TemplateView.as_view(template_name='static-content/venue.html',), name='venue-static'),
102-
url(r'^sponsors/$', TemplateView.as_view(template_name='static-content/sponsors.html',), name='sponsors-static'),
103-
url(r'^blog/$', TemplateView.as_view(template_name='static-content/blog-archive.html',), name='blog-archive'),
104-
url(r'^coc/$', TemplateView.as_view(template_name='static-content/coc.html',), name='coc-static'),
105-
url(r'^faq/$', TemplateView.as_view(template_name='static-content/faq.html',), name='faq-static'),
106125

107126
# Proposals as conference home page. TODO: Needs to be enhanced
108127
url(r'^(?P<conference_slug>[\w-]+)--/',

tests/integrations/test_conferences.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1+
# -*- coding: utf-8 -*-
2+
13
from .. import factories as f
24

5+
from django.core.urlresolvers import reverse
6+
37

48
def test_conferences(client, db):
59
conference = f.ConferenceFactory()
@@ -11,3 +15,20 @@ def test_conferences(client, db):
1115
conference.save()
1216
response = client.get('/')
1317
assert str(conference.name) not in str(response.content)
18+
19+
20+
def test_get_conference_found(client, db):
21+
conference = f.ConferenceFactory()
22+
url = reverse('get-conference', kwargs={'conference_slug': conference.slug})
23+
response = client.get(url, follow=True)
24+
assert response.redirect_chain == [
25+
(reverse('proposals-list', kwargs={
26+
'conference_slug': conference.slug}), 302)]
27+
assert str(conference.name) in str(response.content)
28+
29+
30+
def test_conference_not_found(client, db):
31+
url = reverse('get-conference', kwargs={'conference_slug': 'non-existent-conference'})
32+
response = client.get(url, follow=True)
33+
assert len(response.redirect_chain) == 0
34+
assert response.status_code == 404

0 commit comments

Comments
 (0)