Merge lp:~cjohnston/summit/quick-links into lp:summit

Proposed by Chris Johnston
Status: Superseded
Proposed branch: lp:~cjohnston/summit/quick-links
Merge into: lp:summit
Diff against target: 744 lines (+594/-12)
13 files modified
EXTERNALS (+7/-0)
summit/common/widgets.py (+111/-0)
summit/media/css/style.css (+44/-0)
summit/media/js/events-ui.js (+11/-0)
summit/schedule/forms.py (+40/-0)
summit/schedule/templates/schedule/actions.html (+8/-3)
summit/schedule/templates/schedule/form.html (+47/-0)
summit/schedule/templates/schedule/summit.html (+3/-7)
summit/schedule/tests/__init__.py (+1/-0)
summit/schedule/tests/registration.py (+272/-0)
summit/schedule/views.py (+44/-1)
summit/settings.py (+1/-1)
summit/urls.py (+5/-0)
To merge this branch: bzr merge lp:~cjohnston/summit/quick-links
Reviewer Review Type Date Requested Status
Summit Hackers Pending
Review via email: mp+157550@code.launchpad.net

This proposal has been superseded by a proposal from 2013-04-07.

Commit message

Does some work on the actions area

To post a comment you must log in.
lp:~cjohnston/summit/quick-links updated
521. By Chris Johnston

Update from other branches

Unmerged revisions

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'EXTERNALS'
--- EXTERNALS 2012-04-22 20:20:10 +0000
+++ EXTERNALS 2013-04-07 16:28:22 +0000
@@ -19,3 +19,10 @@
1919
20- Twitter JS20- Twitter JS
21http://twitter.com/javascripts/blogger.js21http://twitter.com/javascripts/blogger.js
22
23- Date Picker
24provided by the JQuery UI project. See http://jqueryui.com/
25
26- DateTimeWidget inspired by:
27http://copiesofcopies.org/webl/2010/04/26/a-better-datetime-widget-for-django/
28
2229
=== added file 'summit/common/widgets.py'
--- summit/common/widgets.py 1970-01-01 00:00:00 +0000
+++ summit/common/widgets.py 2013-04-07 16:28:22 +0000
@@ -0,0 +1,111 @@
1# -*- coding: utf-8 -*-
2from datetime import time
3from time import strptime, strftime
4
5from django import forms
6
7
8class DateWidget(forms.DateInput):
9 """
10 A more-friendly date widget with a pop-up calendar.
11 """
12 def __init__(self, attrs=None):
13 self.date_class = 'datepicker'
14 if not attrs:
15 attrs = {}
16 if 'date_class' in attrs:
17 self.date_class = attrs.pop('date_class')
18 if 'class' not in attrs:
19 attrs['class'] = 'date'
20
21 super(DateWidget, self).__init__(attrs=attrs)
22
23 def render(self, name, value, attrs=None):
24 return '<span class="%s">%s</span>' % (
25 self.date_class,
26 super(DateWidget, self).render(name, value, attrs)
27 )
28
29
30class TimeWidget(forms.MultiWidget):
31 """
32 A more-friendly time widget.
33 """
34 def __init__(self, attrs=None):
35 self.time_class = 'timepicker'
36 if not attrs:
37 attrs = {}
38 if 'time_class' in attrs:
39 self.time_class = attrs.pop('time_class')
40 if 'class' not in attrs:
41 attrs['class'] = 'time'
42
43 widgets = (
44 forms.Select(
45 attrs=attrs,
46 choices=[(i + 1, "%02d" % (i + 1)) for i in range(0, 12)],
47 ),
48 forms.Select(
49 attrs=attrs,
50 choices=[(i, "%02d" % i) for i in range(00, 60, 15)],
51 ),
52 forms.Select(
53 attrs=attrs,
54 choices=[('AM', 'AM'), ('PM', 'PM')],
55 )
56 )
57
58 super(TimeWidget, self).__init__(widgets, attrs)
59
60 def decompress(self, value):
61 if isinstance(value, time):
62 hour = int(value.strftime("%I"))
63 minute = int(value.strftime("%M"))
64 meridian = value.strftime("%p")
65 return (hour, minute, meridian)
66 return (None, None, None)
67
68 def value_from_datadict(self, data, files, name):
69 value = super(TimeWidget, self).value_from_datadict(data, files, name)
70 t = strptime(
71 "%02d:%02d %s" % (
72 int(value[0]),
73 int(value[1]),
74 value[2]
75 ),
76 "%I:%M %p",
77 )
78 return strftime("%H:%M:%S", t)
79
80 def format_output(self, rendered_widgets):
81 return '<span class="%s">%s%s%s</span>' % (
82 self.time_class,
83 rendered_widgets[0], rendered_widgets[1], rendered_widgets[2]
84 )
85
86
87class DateTimeWidget(forms.SplitDateTimeWidget):
88 """
89 A more-friendly date/time widget.
90
91 Inspired by:
92
93 http://copiesofcopies.org/webl/2010/04/26/a-better-datetime-widget-for-django/
94 """
95 def __init__(self, attrs=None, date_format=None, time_format=None):
96 super(DateTimeWidget, self).__init__(attrs, date_format, time_format)
97 self.widgets = (
98 DateWidget(attrs=attrs),
99 TimeWidget(attrs=attrs),
100 )
101
102 def decompress(self, value):
103 if value:
104 d = strftime("%Y-%m-%d", value.timetuple())
105 t = strftime("%I:%M %p", value.timetuple())
106 return (d, t)
107 else:
108 return (None, None)
109
110 def format_output(self, rendered_widgets):
111 return '%s%s' % (rendered_widgets[0], rendered_widgets[1])
0112
=== modified file 'summit/media/css/style.css'
--- summit/media/css/style.css 2012-01-22 18:36:40 +0000
+++ summit/media/css/style.css 2013-04-07 16:28:22 +0000
@@ -66,3 +66,47 @@
66.summit-columns ul li h3 a:hover { text-decoration: underline; }66.summit-columns ul li h3 a:hover { text-decoration: underline; }
67.summit-columns ul li img { padding: 10px 0 5px; }67.summit-columns ul li img { padding: 10px 0 5px; }
68.summit-columns p { margin-bottom: 5px; }68.summit-columns p { margin-bottom: 5px; }
69
70#id_start_utc_0, #id_start_utc_1,
71#id_end_utc_0, #id_end_utc_1,
72#id_start_utc_1_0, #id_start_utc_1_1, #id_start_utc_1_2,
73#id_end_utc_1_0, #id_end_utc_1_1, #id_end_utc_1_2 {
74 width: 100px;
75 display: inline;
76}
77
78#id_start_utc_1_0, #id_start_utc_1_1, #id_start_utc_1_2,
79#id_end_utc_1_0, #id_end_utc_1_1, #id_end_utc_1_2 {
80 width: 60px;
81}
82
83#id_name, #id_announce, #id_registration {
84 width: 350px;
85}
86
87.link-cta {
88 margin-top: 10px;
89 padding: 10px;
90 background: url('../img/background-cta.png') center 0 repeat-x #dd4814;
91 display: block;
92 float: left;
93 color: #fff !important;
94 -moz-border-radius: 4px;
95 -webkit-border-radius: 4px;
96 border-radius: 4px;
97}
98
99.link-cta + p {
100 margin: 18px 0 0 10px;
101 float: left;
102}
103
104.link-cta.disabled {
105 background-image: none;
106 background-color: #aea79f !important;
107 cursor: not-allowed;
108}
109
110.link-arrow:after {
111 content: " ›";
112}
69113
=== added file 'summit/media/js/events-ui.js'
--- summit/media/js/events-ui.js 1970-01-01 00:00:00 +0000
+++ summit/media/js/events-ui.js 2013-04-07 16:28:22 +0000
@@ -0,0 +1,11 @@
1$(document).ready(function(){
2
3 $.datepicker.setDefaults({
4 showOn: 'focus',
5 dateFormat: 'yy-mm-dd',
6 });
7
8 $("#id_start_utc_0").datepicker();
9 $("#id_end_utc_0").datepicker();
10
11});
012
=== modified file 'summit/schedule/forms.py'
--- summit/schedule/forms.py 2013-03-09 05:14:19 +0000
+++ summit/schedule/forms.py 2013-04-07 16:28:22 +0000
@@ -14,6 +14,7 @@
14# You should have received a copy of the GNU Affero General Public License14# You should have received a copy of the GNU Affero General Public License
15# along with this program. If not, see <http://www.gnu.org/licenses/>.15# along with this program. If not, see <http://www.gnu.org/licenses/>.
1616
17from django.conf import settings
17from django import forms18from django import forms
1819
19from summit.schedule.models.meetingmodel import Meeting20from summit.schedule.models.meetingmodel import Meeting
@@ -21,6 +22,7 @@
21from summit.schedule.models.participantmodel import Participant22from summit.schedule.models.participantmodel import Participant
2223
23from common.forms import RenderableMixin24from common.forms import RenderableMixin
25from common.widgets import DateTimeWidget
2426
2527
26class MultipleAttendeeField(forms.ModelMultipleChoiceField):28class MultipleAttendeeField(forms.ModelMultipleChoiceField):
@@ -226,3 +228,41 @@
226 fields = ('hangout_url', 'broadcast_url')228 fields = ('hangout_url', 'broadcast_url')
227229
228 broadcast_url = YouTubeEmbedURL(label='Broadcast URL')230 broadcast_url = YouTubeEmbedURL(label='Broadcast URL')
231
232
233class Registration(forms.ModelForm, RenderableMixin):
234 class Media:
235 css = {'all': (
236 '//code.jquery.com/ui/1.10.2/themes/smoothness/jquery-ui.css',
237 )}
238 js = (
239 '//code.jquery.com/ui/1.10.2/jquery-ui.js',
240 settings.MEDIA_URL + 'js/events-ui.js',
241 )
242
243 class Meta:
244 model = Attendee
245 fields = (
246 'start_utc',
247 'end_utc',
248 'crew',
249 )
250
251 def __init__(self, *args, **kargs):
252 super(Registration, self).__init__(*args, **kargs)
253 self.fields['start_utc'].widget = DateTimeWidget()
254 self.fields['end_utc'].widget = DateTimeWidget()
255
256 def clean(self):
257 begin = self.cleaned_data.get('start_utc')
258 end = self.cleaned_data.get('end_utc')
259 if begin and end and begin > end:
260 raise forms.ValidationError(
261 "Availability can not end before it starts."
262 )
263 return self.cleaned_data
264
265 def save(self, commit=True):
266 instance = super(Registration, self).save(commit)
267 instance.from_launchpad=False
268 instance.save()
229269
=== modified file 'summit/schedule/templates/schedule/actions.html'
--- summit/schedule/templates/schedule/actions.html 2012-08-08 15:10:25 +0000
+++ summit/schedule/templates/schedule/actions.html 2013-04-07 16:28:22 +0000
@@ -1,9 +1,10 @@
1{% load schedule_perms %}1{% load schedule_perms %}
22
3{% ifnotequal summit.state "public" %}3{% ifnotequal summit.state "public" %}
4<div class="action-links">4<div class="box box-padded">
5 <p style="font-size: 16px; font-weight: bold;">Actions</p>5 <h3>Quick Links</h3>
6 <ul>6 <div>
7 <ul class="list">
78
8{% ifchangeschedule summit attendee %}9{% ifchangeschedule summit attendee %}
9 {% if schedule.date %}10 {% if schedule.date %}
@@ -43,7 +44,11 @@
43 {% endif %}44 {% endif %}
44{% endifequal %}45{% endifequal %}
4546
47{% if attendee %}
48 <li><a href="{% url registration summit.name %}">Update registration</a></li>
49{% endif %}
46 </ul>50 </ul>
47</div>51</div>
52</div>
4853
49{% endifnotequal %}54{% endifnotequal %}
5055
=== added file 'summit/schedule/templates/schedule/form.html'
--- summit/schedule/templates/schedule/form.html 1970-01-01 00:00:00 +0000
+++ summit/schedule/templates/schedule/form.html 2013-04-07 16:28:22 +0000
@@ -0,0 +1,47 @@
1{% extends "base.html" %}
2
3{% block page_name %}{{ form_title }} - {{ summit.title }}{%endblock %}
4{% block sub_nav %}{% endblock %}
5
6{% block extrahead %}{{ block.super }}
7{{ form.media }}
8<script type="text/javascript" src="{{MEDIA_URL}}js/colortip-1.0-jquery.js"></script>
9 <link rel="stylesheet" type="text/css" href="{{MEDIA_URL}}css/colortip-1.0-jquery.css"/>
10{% endblock %}
11
12{% block closure %}
13<script type="text/javascript"><!--
14$(document).ready(function(){
15 $('span[rel*=help]').colorTip({color:'orange'});
16});
17--></script>
18<style>
19form ul {
20 height: 12em;
21 overflow-y: scroll;
22 overflow-x: hidden;
23}
24</style>
25{% endblock %}
26
27
28{% block content %}
29<div class="row">
30 <article id="form" class="span-8">
31 {% if form.errors %}
32 <p style="color: red;">
33 Please correct the error{{ form.errors|pluralize }} below.
34 </p>
35 {% endif %}
36
37 <form action="{{ request.path_info }}" method="POST">{% csrf_token %}
38 <fieldset>
39 <h3>{{ form_title }}</h3>
40 {{ form.as_template }}
41 {% if is_popup %}<input type="hidden" name="_popup" value="1">{% endif %}
42 <input type="submit" name="submit" value="Create" class="submit-button" />
43 </fieldset>
44 </form>
45 </article>
46</div>
47{% endblock %}
048
=== modified file 'summit/schedule/templates/schedule/summit.html'
--- summit/schedule/templates/schedule/summit.html 2013-03-20 02:00:45 +0000
+++ summit/schedule/templates/schedule/summit.html 2013-04-07 16:28:22 +0000
@@ -38,19 +38,15 @@
38<div class="row">38<div class="row">
39 <section class="span-8">39 <section class="span-8">
40 {% if attendee %}40 {% if attendee %}
41 <p>You are attending, you can update the days and times of your attendance <ins></ins>41 <p>You are registered as attending {{ summit.title }}. <a href="{% url registration summit %}">Update registration</a>.
42 <a class="launchpad" href="http://launchpad.net/sprints/{{ summit.name }}/+attend"><img src="/media/img/gem-sm.png" /> Launchpad</a>.
43 </p>42 </p>
44 <p>Download your 43 <p>Download your
45 <a href="/{{ summit.name }}/participant/my_schedule_{{ attendee.secret_key }}.ical">Participation Schedule</a> to import into your Calendar.44 <a href="/{{ summit.name }}/participant/my_schedule_{{ attendee.secret_key }}.ical">Participation Schedule</a> to import into your Calendar.
46 </p>45 </p>
47 {% else %}46 {% else %}
48 {% if request.user.is_authenticated %}47 {% if request.user.is_authenticated %}
49 <p><strong>You are not registered as attending.</strong></p>48 <p><strong>You have not registered in Summit.</strong></p>
50 <p>You can register your attendance in49 <p><a class="link-cta" href="{% url registration summit %}">Register in Summit</a></p>
51 <a class="launchpad" href="http://launchpad.net/sprints/{{ summit.name }}/+attend"><img src="/media/img/gem-sm.png" /> Launchpad</a>.
52 If you have recently done so, wait a few minutes and reload this page.
53 </p>
54 {% else %}50 {% else %}
55 <p><strong>You are not logged in.</strong></p>51 <p><strong>You are not logged in.</strong></p>
56 <p><a href="/openid/login?next={{login_next}}">Log in now</a></p>52 <p><a href="/openid/login?next={{login_next}}">Log in now</a></p>
5753
=== modified file 'summit/schedule/tests/__init__.py'
--- summit/schedule/tests/__init__.py 2013-03-14 20:52:12 +0000
+++ summit/schedule/tests/__init__.py 2013-04-07 16:28:22 +0000
@@ -31,3 +31,4 @@
31from schedule import *31from schedule import *
32from summit_model import *32from summit_model import *
33from propose_meeting import *33from propose_meeting import *
34from registration import RegistrationTestCase
3435
=== added file 'summit/schedule/tests/registration.py'
--- summit/schedule/tests/registration.py 1970-01-01 00:00:00 +0000
+++ summit/schedule/tests/registration.py 2013-04-07 16:28:22 +0000
@@ -0,0 +1,272 @@
1# The Summit Scheduler web application
2# Copyright (C) 2008 - 2013 Ubuntu Community, Canonical Ltd
3#
4# This program is free software: you can redistribute it and/or modify
5# it under the terms of the GNU Affero General Public License as
6# published by the Free Software Foundation, either version 3 of the
7# License, or (at your option) any later version.
8#
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12# GNU Affero General Public License for more details.
13#
14# You should have received a copy of the GNU Affero General Public License
15# along with this program. If not, see <http://www.gnu.org/licenses/>.
16
17import datetime
18
19from django import test as djangotest
20from django.core.urlresolvers import reverse
21
22from django.contrib.auth.models import User
23from django.test.client import Client
24
25from model_mommy import mommy as factory
26
27from summit.schedule.models import (
28 Summit,
29 Attendee,
30)
31
32
33class RegistrationTestCase(djangotest.TestCase):
34 """
35 Tests for registering to attend a Summit
36 """
37 c = Client()
38
39 def setUp(self):
40 self.now = datetime.datetime.utcnow()
41 self.one_hour = datetime.timedelta(0, 3600)
42 self.one_day = datetime.timedelta(days=1)
43 self.week = datetime.timedelta(days=5)
44 self.end_summit = self.now + self.week
45 self.summit = factory.make_one(
46 Summit,
47 name='test-summit',
48 title='Test Summit',
49 virtual_summit=True,
50 date_start=self.now,
51 date_end=self.now + self.week,
52 timezone='UTC',
53 )
54
55 self.user1 = factory.make_one(
56 User,
57 username='testuser',
58 first_name='Test',
59 last_name='User',
60 is_active=True,
61 is_superuser=False,
62 )
63 self.user1.set_password('password')
64 self.user1.save()
65
66 def create_attendee(self):
67 self.attendee1 = factory.make_one(
68 Attendee,
69 summit=self.summit,
70 user=self.user1,
71 start_utc=self.now,
72 end_utc=self.now+self.week
73 )
74
75 def tearDown(self):
76 self.client.logout()
77
78 def login(self):
79 logged_in = self.c.login(
80 username='testuser',
81 password='password')
82 self.assertTrue(logged_in)
83
84 def get_attendee(self):
85 attendee = Attendee.objects.get(user=self.user1)
86 return attendee
87
88 def view_summit_page(self):
89 rev_args = [self.summit.name, ]
90 response = self.c.get(
91 reverse(
92 'summit.schedule.views.summit',
93 args=rev_args
94 )
95 )
96 self.assertEqual(response.status_code, 200)
97 self.assertTemplateUsed(response, 'schedule/summit.html')
98
99 return response
100
101 def with_summit_registration_times(self):
102 """
103 Using the start and end of the summit as the registration times
104 """
105 self.start_date = self.now.strftime("%Y-%m-%d")
106 self.start_hour = self.now.strftime("%I")
107 self.start_minute = self.now.strftime("%M")
108 self.start_period = self.now.strftime("%p")
109 self.end_hour = self.end_summit.strftime("%I")
110 self.end_minute = self.end_summit.strftime("%M")
111 self.end_period = self.end_summit.strftime("%p")
112 self.end_date = self.end_summit.strftime("%Y-%m-%d")
113 self.edit_registration_form()
114 attendee = self.get_attendee()
115 self.assertEqual(
116 attendee.start_utc.replace(second=0),
117 self.now.replace(second=0, microsecond=0),
118 )
119 self.assertEqual(
120 attendee.end_utc.replace(second=0, microsecond=0),
121 self.end_summit.replace(second=0, microsecond=0),
122 )
123
124 def with_custom_registration_times(self):
125 """
126 Using custom start and end registration times
127 """
128 start = self.now + self.one_day
129 self.start_date = start.strftime("%Y-%m-%d")
130 self.start_hour = self.now.strftime("%I")
131 self.start_minute = self.now.strftime("%M")
132 self.start_period = self.now.strftime("%p")
133 self.end_hour = self.end_summit.strftime("%I")
134 self.end_minute = self.end_summit.strftime("%M")
135 self.end_period = self.end_summit.strftime("%p")
136 self.end_date = self.end_summit.strftime("%Y-%m-%d")
137 self.edit_registration_form()
138 attendee = self.get_attendee()
139 self.assertEqual(
140 attendee.start_utc.replace(second=0),
141 start.replace(second=0, microsecond=0),
142 )
143 self.assertEqual(
144 attendee.end_utc.replace(second=0, microsecond=0),
145 self.end_summit.replace(second=0, microsecond=0),
146 )
147
148 def edit_registration_form(self):
149 """
150 Tests that a user can register for a Summit
151 """
152 # Define data to fill our the form
153
154 # Post the form
155 post = self.c.post(
156 reverse(
157 'registration',
158 args=(self.summit.name,)
159 ),
160 data={
161 'end_utc_0': self.end_date,
162 'end_utc_1_0': self.end_hour,
163 'end_utc_1_1': self.end_minute,
164 'end_utc_1_2': self.end_period,
165 'start_utc_1_0': self.start_hour,
166 'start_utc_1_1': self.start_minute,
167 'start_utc_1_2': self.start_period,
168 'start_utc_0': self.start_date,
169 }
170 )
171
172 # A successful post should redirect to the summit page
173 response = reverse(
174 'summit.schedule.views.summit',
175 args=(self.summit.name,)
176 )
177 self.assertEqual(post.status_code, 302)
178 self.assertRedirects(post, response)
179 attendee = self.get_attendee()
180 self.assertEqual(attendee.user, self.user1)
181 self.assertEqual(attendee.from_launchpad, False)
182
183 def test_non_attendee_registers(self):
184 self.login()
185 self.assertRaises(Attendee.DoesNotExist, lambda: self.get_attendee())
186 rev_args = [self.summit.name, ]
187 response = self.c.get(reverse('registration', args=rev_args))
188 self.assertEqual(response.status_code, 200)
189 self.assertTemplateUsed(response, 'schedule/form.html')
190 self.assertIn('Register for ' + self.summit.title, response.content)
191 self.with_summit_registration_times()
192
193 def test_attendee_updates_registration(self):
194 self.create_attendee()
195 self.login()
196 self.assertEquals(
197 self.user1.username,
198 self.get_attendee().user.username,
199 )
200 rev_args = [self.summit.name, ]
201 response = self.c.get(reverse('registration', args=rev_args))
202 self.assertEqual(response.status_code, 200)
203 self.assertTemplateUsed(response, 'schedule/form.html')
204 self.assertIn(
205 'Update registration for ' + self.summit.title,
206 response.content
207 )
208 self.with_custom_registration_times()
209
210 def test_update_registration_from_launchpad_true(self):
211 """
212 update resgistration with from_launchpad=True
213 to save from_launchpad=False
214 """
215 self.create_attendee()
216 self.attendee1.from_launchpad = True
217 self.attendee1.save()
218 self.login()
219 self.assertEquals(
220 self.user1.username,
221 self.get_attendee().user.username,
222 )
223 self.assertEquals(
224 True,
225 self.get_attendee().from_launchpad,
226 )
227 rev_args = [self.summit.name, ]
228 response = self.c.get(reverse('registration', args=rev_args))
229 self.assertEqual(response.status_code, 200)
230 self.assertTemplateUsed(response, 'schedule/form.html')
231 self.assertIn(
232 'Update registration for ' + self.summit.title,
233 response.content
234 )
235 self.with_custom_registration_times()
236
237 def test_registered_view(self):
238 """
239 Test that when a user is already registered for the summit
240 that they will see a link to update their registration
241 """
242 self.create_attendee()
243 self.attendee1.from_launchpad = True
244 self.attendee1.save()
245 self.login()
246 rev_args = [self.summit.name, ]
247 response = self.view_summit_page()
248 self.assertIn(
249 reverse(
250 'registration',
251 args=rev_args
252 ),
253 response.content
254 )
255 self.assertIn('Update registration', response.content)
256
257 def test_unregistered_view(self):
258 """
259 Test that when a user is not registered for the summit
260 that they will see a button to register
261 """
262 self.login()
263 rev_args = [self.summit.name, ]
264 response = self.view_summit_page()
265 self.assertIn(
266 reverse(
267 'registration',
268 args=rev_args
269 ),
270 response.content
271 )
272 self.assertIn('Register in Summit', response.content)
0273
=== modified file 'summit/schedule/views.py'
--- summit/schedule/views.py 2013-03-15 01:06:10 +0000
+++ summit/schedule/views.py 2013-04-07 16:28:22 +0000
@@ -52,7 +52,8 @@
52 MeetingReview,52 MeetingReview,
53 AttendMeeting,53 AttendMeeting,
54 OrganizerChangeAttend,54 OrganizerChangeAttend,
55 EditMeetingHangout55 EditMeetingHangout,
56 Registration,
56)57)
5758
58__all__ = (59__all__ = (
@@ -1173,3 +1174,45 @@
1173 context,1174 context,
1174 RequestContext(request)1175 RequestContext(request)
1175 )1176 )
1177
1178
1179@login_required
1180@summit_required
1181def registration_form(request, summit, attendee):
1182 registration_args = dict()
1183
1184 if attendee is None:
1185 attendee = Attendee(
1186 user=request.user,
1187 summit=summit,
1188 from_launchpad=False,
1189 )
1190 registration_args['instance'] = attendee
1191 form_title="Register for %s" % summit.title
1192 else:
1193 registration_args['instance'] = attendee
1194 form_title="Update registration for %s" % summit.title
1195
1196 if request.method == 'POST':
1197 form = Registration(data=request.POST, **registration_args)
1198 if form.is_valid():
1199 form.save()
1200 return HttpResponseRedirect(
1201 reverse(
1202 'summit.schedule.views.summit',
1203 args=(summit.name,)
1204 )
1205 )
1206 else:
1207 form = Registration(**registration_args)
1208
1209 context = {
1210 'summit': summit,
1211 'form': form,
1212 'form_title': form_title,
1213 }
1214 return render_to_response(
1215 'schedule/form.html',
1216 context,
1217 RequestContext(request)
1218 )
11761219
=== modified file 'summit/settings.py'
--- summit/settings.py 2013-04-04 02:13:03 +0000
+++ summit/settings.py 2013-04-07 16:28:22 +0000
@@ -167,7 +167,7 @@
167 'bzr_apps': ('http://bazaar.launchpad.net/~django-foundations-dev/ubuntu-django-foundations/bzr_apps', '7'),167 'bzr_apps': ('http://bazaar.launchpad.net/~django-foundations-dev/ubuntu-django-foundations/bzr_apps', '7'),
168168
169 ## ubuntu-website supplied templates and styles169 ## ubuntu-website supplied templates and styles
170 'ubuntu_website': ('http://bazaar.launchpad.net/~ubuntu-community-webthemes/ubuntu-community-webthemes/light-django-theme', '55'),170 'ubuntu_website': ('http://bazaar.launchpad.net/~ubuntu-community-webthemes/ubuntu-community-webthemes/light-django-theme', '61'),
171171
172 ## linaro-website supplied templates and styles172 ## linaro-website supplied templates and styles
173 'linaro_website': ('http://bazaar.launchpad.net/~linaro-connect-theme-devs/ubuntu-community-webthemes/light-django-linaro-theme', '52'),173 'linaro_website': ('http://bazaar.launchpad.net/~linaro-connect-theme-devs/ubuntu-community-webthemes/light-django-linaro-theme', '52'),
174174
=== modified file 'summit/urls.py'
--- summit/urls.py 2013-02-26 19:31:21 +0000
+++ summit/urls.py 2013-04-07 16:28:22 +0000
@@ -68,6 +68,11 @@
68 (r'^(?P<summit_name>[\w-]+)/$', 'summit'),68 (r'^(?P<summit_name>[\w-]+)/$', 'summit'),
69 (r'^(?P<summit_name>[\w-]+)/mobile/$', 'mobile'),69 (r'^(?P<summit_name>[\w-]+)/mobile/$', 'mobile'),
70 (r'^(?P<summit_name>[\w-]+)/search/$', 'search'),70 (r'^(?P<summit_name>[\w-]+)/search/$', 'search'),
71 url(
72 r'^(?P<summit_name>[\w-]+)/registration/$',
73 'registration_form',
74 name='registration',
75 ),
71 (r'^(?P<summit_name>[\w-]+)/propose_meeting/$', 'propose_meeting'),76 (r'^(?P<summit_name>[\w-]+)/propose_meeting/$', 'propose_meeting'),
72 (r'^(?P<summit_name>[\w-]+)/edit_meeting/(?P<meeting_id>\d+)/(?P<meeting_slug>[%+\.\w-]+)/$',77 (r'^(?P<summit_name>[\w-]+)/edit_meeting/(?P<meeting_id>\d+)/(?P<meeting_slug>[%+\.\w-]+)/$',
73 'edit_meeting'),78 'edit_meeting'),

Subscribers

People subscribed via source and target branches