Merge lp:~michael.nelson/launchpad/sprint-index-and-attend-3.0 into lp:launchpad
- sprint-index-and-attend-3.0
- Merge into devel
Status: | Merged | ||||||||
---|---|---|---|---|---|---|---|---|---|
Approved by: | Barry Warsaw | ||||||||
Approved revision: | no longer in the source branch. | ||||||||
Merged at revision: | not available | ||||||||
Proposed branch: | lp:~michael.nelson/launchpad/sprint-index-and-attend-3.0 | ||||||||
Merge into: | lp:launchpad | ||||||||
Diff against target: | None lines | ||||||||
To merge this branch: | bzr merge lp:~michael.nelson/launchpad/sprint-index-and-attend-3.0 | ||||||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Brad Crittenden (community) | release-critical | Approve | |
Barry Warsaw (community) | code ui* | Approve | |
Review via email: mp+12044@code.launchpad.net |
Commit message
Description of the change
Michael Nelson (michael.nelson) wrote : | # |
Barry Warsaw (barry) wrote : | # |
Hi Michael,
Thanks for working on this branch. I'm psyched to see us nailing down these
blueprint pages as we finish up 3.0.
As mentioned in irc, sprint-index doesn't look quite right because of the
breadcrumbs that shouldn't be there. I have a hack, er, solution for that
attached below. It basically puts a null +hierarchy view on the page. We
might want to consider generalizing that or providing an easier way to do it.
If you want to open a bug asking for that, I might be able to fix it
post-3.0. For now, this hack will work.
First, let's look at the code. I'll omit the stuff that looks fine.
=== modified file 'lib/lp/
--- lib/lp/
+++ lib/lp/
> @@ -69,7 +70,7 @@
> usedfor = ISprint
>
>
> -class SprintOverviewM
> +class SprintOverviewM
While you're here can you give this class a docstring?
=== modified file 'lib/lp/
--- lib/lp/
+++ lib/lp/
> @@ -80,14 +80,9 @@
> Since the sprint's time zone was set to UTC, the dates are displayed in
> that time zone:
>
> - >>> print find_portlet(
> - <...
> - ...Starts:...
> - 2006-10-10 09:15 UTC...
> - ...Ends:...
> - 2006-10-13 16:00 UTC...
> - ...
> -
> + >>> print extract_
> + Starts: 09:15 UTC on Tuesday, 2006-10-10
> + Ends: 16:00 UTC on Friday, 2006-10-13
Thanks for cleaning these up!
=== modified file 'lib/lp/
--- lib/lp/
+++ lib/lp/
> @@ -2,8 +2,8 @@
> available to those who have permissions to edit that sprint.
>
> >>> anon_browser.open('http://
> - >>> anon_browser.title
> - 'Ubuntu Below Zero (sprint or meeting)'
> + >>> print anon_browser.title
> + Ubuntu Below Zero : Meetings
And these. If you have the inclination, can you indent the interactive
prompts 4 spaces?
=== modified file 'lib/lp/
--- lib/lp/
+++ lib/lp/
> @@ -55,8 +55,8 @@
> 'http://
>
> >>> ut = 'Ubuntu Team'
> - >>> meeting_portlet = find_portlet(
> - >>> ut in extract_
> + >>> meeting_drivers = find_tag_
> + >>> ut in extract_
> True
Is it possible to just print the text and use ellipses to omit anything you
don't care about? That would be better for documentation/
than jus...
Michael Nelson (michael.nelson) wrote : | # |
Barry Warsaw wrote:
> Review: Approve code ui*
> Hi Michael,
>
> Thanks for working on this branch. I'm psyched to see us nailing down these
> blueprint pages as we finish up 3.0.
>
> As mentioned in irc, sprint-index doesn't look quite right because of the
> breadcrumbs that shouldn't be there. I have a hack, er, solution for that
> attached below. It basically puts a null +hierarchy view on the page. We
> might want to consider generalizing that or providing an easier way to do it.
> If you want to open a bug asking for that, I might be able to fix it
> post-3.0. For now, this hack will work.
Thanks for the work-around!
>
> First, let's look at the code. I'll omit the stuff that looks fine.
>
> === modified file 'lib/lp/
> --- lib/lp/
> +++ lib/lp/
>> @@ -69,7 +70,7 @@
>> usedfor = ISprint
>>
>>
>> -class SprintOverviewM
>> +class SprintOverviewM
>
> While you're here can you give this class a docstring?
Done.
>
> === modified file 'lib/lp/
> --- lib/lp/
> +++ lib/lp/
>> @@ -80,14 +80,9 @@
>> Since the sprint's time zone was set to UTC, the dates are displayed in
>> that time zone:
>>
>> - >>> print find_portlet(
>> - <...
>> - ...Starts:...
>> - 2006-10-10 09:15 UTC...
>> - ...Ends:...
>> - 2006-10-13 16:00 UTC...
>> - ...
>> -
>> + >>> print extract_
>> + Starts: 09:15 UTC on Tuesday, 2006-10-10
>> + Ends: 16:00 UTC on Friday, 2006-10-13
>
> Thanks for cleaning these up!
>
> === modified file 'lib/lp/
> --- lib/lp/
> +++ lib/lp/
>> @@ -2,8 +2,8 @@
>> available to those who have permissions to edit that sprint.
>>
>> >>> anon_browser.open('http://
>> - >>> anon_browser.title
>> - 'Ubuntu Below Zero (sprint or meeting)'
>> + >>> print anon_browser.title
>> + Ubuntu Below Zero : Meetings
>
> And these. If you have the inclination, can you indent the interactive
> prompts 4 spaces?
Done.
>
> === modified file 'lib/lp/
> --- lib/lp/
> +++ lib/lp/
>> @@ -55,8 +55,8 @@
>> 'http://
>>
>> >>> ut = 'Ubuntu Team'
>> - >>> meeting_portlet = find_portlet(
>> - >>> ut in extract_
>> + >>> meeting_drivers = find_tag_
>> + >>> ut in extract_text...
Michael Nelson (michael.nelson) wrote : | # |
Michael Nelson wrote:
> Barry Warsaw wrote:
>> Review: Approve code ui*
> Thanks Barry - incremental attached.
>
> I'll send it off to ec2test now, but not to land, just in case you're
> around and have any changes. I'll land it if the tests all succeed.
>
>
>
Hi Barry,
My ec2test failed (an error in devel) and when I re-merged RF this
morning, I found that, due to the work-around that we added (setting
display_breadcrumbs to False for SprintIndexHier
affecting most other sprint views (which had perfect breadcrumbs
otherwise - but none with this fix).
I created:
https:/
and have included a fix in this branch. This enables us to correctly
suppress the breadcrumbs when the view provides IMajorHeadingView, but
display them for other sub-pages (that share the same context).
Let me know if you agree or not. I'll then try to get an RC to get these
landed.
Thanks!
--
Michael
1 | === modified file 'lib/canonical/launchpad/browser/launchpad.py' | |||
2 | --- lib/canonical/launchpad/browser/launchpad.py 2009-09-20 19:40:47 +0000 | |||
3 | +++ lib/canonical/launchpad/browser/launchpad.py 2009-09-21 12:43:33 +0000 | |||
4 | @@ -52,6 +52,7 @@ | |||
5 | 52 | from canonical.launchpad.helpers import intOrZero | 52 | from canonical.launchpad.helpers import intOrZero |
6 | 53 | from canonical.launchpad.layers import WebServiceLayer | 53 | from canonical.launchpad.layers import WebServiceLayer |
7 | 54 | 54 | ||
8 | 55 | from lp.app.interfaces.headings import IMajorHeadingView | ||
9 | 55 | from lp.registry.interfaces.announcement import IAnnouncementSet | 56 | from lp.registry.interfaces.announcement import IAnnouncementSet |
10 | 56 | from lp.soyuz.interfaces.binarypackagename import ( | 57 | from lp.soyuz.interfaces.binarypackagename import ( |
11 | 57 | IBinaryPackageNameSet) | 58 | IBinaryPackageNameSet) |
12 | @@ -259,6 +260,12 @@ | |||
13 | 259 | breadcrumbs.append(page_crumb) | 260 | breadcrumbs.append(page_crumb) |
14 | 260 | return breadcrumbs | 261 | return breadcrumbs |
15 | 261 | 262 | ||
16 | 263 | @property | ||
17 | 264 | def _context_view(self): | ||
18 | 265 | """Return the unproxied view for the context of the hierarchy.""" | ||
19 | 266 | from zope.security.proxy import removeSecurityProxy | ||
20 | 267 | return removeSecurityProxy(self.request.traversed_objects[-1]) | ||
21 | 268 | |||
22 | 262 | def makeBreadcrumbForRequestedPage(self): | 269 | def makeBreadcrumbForRequestedPage(self): |
23 | 263 | """Return an `IBreadcrumb` for the requested page. | 270 | """Return an `IBreadcrumb` for the requested page. |
24 | 264 | 271 | ||
25 | @@ -269,10 +276,9 @@ | |||
26 | 269 | one for our parent view's context, return None. | 276 | one for our parent view's context, return None. |
27 | 270 | """ | 277 | """ |
28 | 271 | url = self.request.getURL() | 278 | url = self.request.getURL() |
29 | 272 | from zope.security.proxy import removeSecurityProxy | ||
30 | 273 | view = removeSecurityProxy(self.request.traversed_objects[-1]) | ||
31 | 274 | obj = self.request.traversed_objects[-2] | 279 | obj = self.request.traversed_objects[-2] |
32 | 275 | default_view_name = zapi.getDefaultViewName(obj, self.request) | 280 | default_view_name = zapi.getDefaultViewName(obj, self.request) |
33 | 281 | view = self._context_view | ||
34 | 276 | if view.__name__ != default_view_name: | 282 | if view.__name__ != default_view_name: |
35 | 277 | title = getattr(view, 'page_title', None) | 283 | title = getattr(view, 'page_title', None) |
36 | 278 | if title is None: | 284 | if title is None: |
37 | @@ -296,7 +302,10 @@ | |||
38 | 296 | """Return whether the breadcrumbs should be displayed.""" | 302 | """Return whether the breadcrumbs should be displayed.""" |
39 | 297 | # If there is only one breadcrumb then it does not make sense | 303 | # If there is only one breadcrumb then it does not make sense |
40 | 298 | # to display it as it will simply repeat the context.title. | 304 | # to display it as it will simply repeat the context.title. |
42 | 299 | return len(self.items) > 1 | 305 | # If the view is an IMajorHeadingView then we do not want |
43 | 306 | # to display breadcrumbs either. | ||
44 | 307 | return (len(self.items) > 1 and | ||
45 | 308 | not IMajorHeadingView.providedBy(self._context_view)) | ||
46 | 300 | 309 | ||
47 | 301 | 310 | ||
48 | 302 | class MaintenanceMessage: | 311 | class MaintenanceMessage: |
49 | 303 | 312 | ||
50 | === modified file 'lib/canonical/launchpad/doc/hierarchical-menu.txt' | |||
51 | --- lib/canonical/launchpad/doc/hierarchical-menu.txt 2009-09-18 12:00:56 +0000 | |||
52 | +++ lib/canonical/launchpad/doc/hierarchical-menu.txt 2009-09-21 12:28:14 +0000 | |||
53 | @@ -143,6 +143,25 @@ | |||
54 | 143 | >>> cooker_hierarchy.display_breadcrumbs | 143 | >>> cooker_hierarchy.display_breadcrumbs |
55 | 144 | False | 144 | False |
56 | 145 | 145 | ||
57 | 146 | Additionally, if the view implements IMajorHeadingView then the breadcrumbs | ||
58 | 147 | will not be displayed. | ||
59 | 148 | |||
60 | 149 | >>> ham_recipe = Recipe('ham', cookbook) | ||
61 | 150 | >>> ham_request = make_fake_request( | ||
62 | 151 | ... 'http://launchpad.dev/joy-of-cooking/ham', | ||
63 | 152 | ... [root, cookbook, ham_recipe]) | ||
64 | 153 | |||
65 | 154 | >>> ham_hierarchy = getMultiAdapter( | ||
66 | 155 | ... (ham_recipe, ham_request), name='+hierarchy') | ||
67 | 156 | >>> hierarchy.display_breadcrumbs | ||
68 | 157 | True | ||
69 | 158 | |||
70 | 159 | >>> from zope.interface import alsoProvides | ||
71 | 160 | >>> from lp.app.interfaces.headings import IMajorHeadingView | ||
72 | 161 | >>> alsoProvides(ham_recipe, IMajorHeadingView) | ||
73 | 162 | >>> ham_hierarchy.display_breadcrumbs | ||
74 | 163 | False | ||
75 | 164 | |||
76 | 146 | 165 | ||
77 | 147 | == Building IBreadcrumb objects == | 166 | == Building IBreadcrumb objects == |
78 | 148 | 167 | ||
79 | 149 | 168 | ||
80 | === modified file 'lib/lp/blueprints/browser/configure.zcml' | |||
81 | --- lib/lp/blueprints/browser/configure.zcml 2009-09-19 04:50:52 +0000 | |||
82 | +++ lib/lp/blueprints/browser/configure.zcml 2009-09-21 12:39:15 +0000 | |||
83 | @@ -23,13 +23,6 @@ | |||
84 | 23 | for="lp.blueprints.interfaces.sprint.ISprint" | 23 | for="lp.blueprints.interfaces.sprint.ISprint" |
85 | 24 | path_expression="name" | 24 | path_expression="name" |
86 | 25 | parent_utility="lp.blueprints.interfaces.sprint.ISprintSet"/> | 25 | parent_utility="lp.blueprints.interfaces.sprint.ISprintSet"/> |
87 | 26 | <browser:page | ||
88 | 27 | for="lp.blueprints.interfaces.sprint.ISprint" | ||
89 | 28 | name="+hierarchy" | ||
90 | 29 | class="lp.blueprints.browser.sprint.SprintIndexHierarchy" | ||
91 | 30 | template="../../app/templates/launchpad-hierarchy.pt" | ||
92 | 31 | permission="zope.Public" | ||
93 | 32 | /> | ||
94 | 33 | <browser:pages | 26 | <browser:pages |
95 | 34 | for="lp.blueprints.interfaces.sprint.ISprint" | 27 | for="lp.blueprints.interfaces.sprint.ISprint" |
96 | 35 | class="lp.blueprints.browser.sprint.SprintView" | 28 | class="lp.blueprints.browser.sprint.SprintView" |
97 | 36 | 29 | ||
98 | === modified file 'lib/lp/blueprints/browser/sprint.py' | |||
99 | --- lib/lp/blueprints/browser/sprint.py 2009-09-21 07:13:45 +0000 | |||
100 | +++ lib/lp/blueprints/browser/sprint.py 2009-09-21 12:39:15 +0000 | |||
101 | @@ -10,7 +10,6 @@ | |||
102 | 10 | 'SprintBrandingView', | 10 | 'SprintBrandingView', |
103 | 11 | 'SprintEditView', | 11 | 'SprintEditView', |
104 | 12 | 'SprintFacets', | 12 | 'SprintFacets', |
105 | 13 | 'SprintIndexHierarchy', | ||
106 | 14 | 'SprintMeetingExportView', | 13 | 'SprintMeetingExportView', |
107 | 15 | 'SprintNavigation', | 14 | 'SprintNavigation', |
108 | 16 | 'SprintOverviewMenu', | 15 | 'SprintOverviewMenu', |
109 | @@ -156,12 +155,6 @@ | |||
110 | 156 | enable_only = ['overview', ] | 155 | enable_only = ['overview', ] |
111 | 157 | 156 | ||
112 | 158 | 157 | ||
113 | 159 | class SprintIndexHierarchy(Hierarchy): | ||
114 | 160 | """We force the breadcrumbs not to display for the sprint index.""" | ||
115 | 161 | |||
116 | 162 | display_breadcrumbs = False | ||
117 | 163 | |||
118 | 164 | |||
119 | 165 | class SprintView(HasSpecificationsView, LaunchpadView): | 158 | class SprintView(HasSpecificationsView, LaunchpadView): |
120 | 166 | 159 | ||
121 | 167 | __used_for__ = ISprint | 160 | __used_for__ = ISprint |
122 | @@ -302,7 +295,6 @@ | |||
123 | 302 | 295 | ||
124 | 303 | schema = ISprint | 296 | schema = ISprint |
125 | 304 | label = "Edit sprint details" | 297 | label = "Edit sprint details" |
126 | 305 | page_title = label | ||
127 | 306 | 298 | ||
128 | 307 | field_names = ['name', 'title', 'summary', 'home_page', 'driver', | 299 | field_names = ['name', 'title', 'summary', 'home_page', 'driver', |
129 | 308 | 'time_zone', 'time_starts', 'time_ends', 'address', | 300 | 'time_zone', 'time_starts', 'time_ends', 'address', |
130 | 309 | 301 | ||
131 | === modified file 'lib/lp/blueprints/stories/sprints/20-sprint-registration.txt' | |||
132 | --- lib/lp/blueprints/stories/sprints/20-sprint-registration.txt 2009-09-19 04:50:52 +0000 | |||
133 | +++ lib/lp/blueprints/stories/sprints/20-sprint-registration.txt 2009-09-21 12:39:15 +0000 | |||
134 | @@ -11,7 +11,7 @@ | |||
135 | 11 | 'http://launchpad.dev/sprints/ubz/+attend' | 11 | 'http://launchpad.dev/sprints/ubz/+attend' |
136 | 12 | 12 | ||
137 | 13 | >>> print browser.title | 13 | >>> print browser.title |
139 | 14 | Register your attendance at Ubuntu Below Zero | 14 | Register your attendance : Ubuntu Below Zero : Meetings |
140 | 15 | 15 | ||
141 | 16 | Invalid dates, for instance entering a starting date after the ending date, | 16 | Invalid dates, for instance entering a starting date after the ending date, |
142 | 17 | are reported as errors to the users. (See also the tests in | 17 | are reported as errors to the users. (See also the tests in |
Brad Crittenden (bac) wrote : | # |
RC approved pending submission through ec2.
Thanks for knocking two more templates down!
Preview Diff
1 | === modified file 'lib/lp/blueprints/browser/sprint.py' | |||
2 | --- lib/lp/blueprints/browser/sprint.py 2009-09-16 18:18:49 +0000 | |||
3 | +++ lib/lp/blueprints/browser/sprint.py 2009-09-18 10:49:12 +0000 | |||
4 | @@ -32,6 +32,7 @@ | |||
5 | 32 | 32 | ||
6 | 33 | from canonical.launchpad import _ | 33 | from canonical.launchpad import _ |
7 | 34 | from canonical.cachedproperty import cachedproperty | 34 | from canonical.cachedproperty import cachedproperty |
8 | 35 | from lp.app.interfaces.headings import IMajorHeadingView | ||
9 | 35 | from lp.registry.browser.branding import BrandingChangeView | 36 | from lp.registry.browser.branding import BrandingChangeView |
10 | 36 | from lp.blueprints.browser.specificationtarget import ( | 37 | from lp.blueprints.browser.specificationtarget import ( |
11 | 37 | HasSpecificationsView) | 38 | HasSpecificationsView) |
12 | @@ -43,7 +44,7 @@ | |||
13 | 43 | IRegistryCollectionNavigationMenu, RegistryCollectionActionMenuBase) | 44 | IRegistryCollectionNavigationMenu, RegistryCollectionActionMenuBase) |
14 | 44 | from canonical.launchpad.webapp import ( | 45 | from canonical.launchpad.webapp import ( |
15 | 45 | ApplicationMenu, GetitemNavigation, LaunchpadEditFormView, | 46 | ApplicationMenu, GetitemNavigation, LaunchpadEditFormView, |
17 | 46 | LaunchpadFormView, LaunchpadView, Link, Navigation, | 47 | LaunchpadFormView, LaunchpadView, Link, Navigation, NavigationMenu, |
18 | 47 | StandardLaunchpadFacets, action, canonical_url, custom_widget, | 48 | StandardLaunchpadFacets, action, canonical_url, custom_widget, |
19 | 48 | enabled_with_permission) | 49 | enabled_with_permission) |
20 | 49 | from canonical.launchpad.webapp.batching import BatchNavigator | 50 | from canonical.launchpad.webapp.batching import BatchNavigator |
21 | @@ -69,7 +70,7 @@ | |||
22 | 69 | usedfor = ISprint | 70 | usedfor = ISprint |
23 | 70 | 71 | ||
24 | 71 | 72 | ||
26 | 72 | class SprintOverviewMenu(ApplicationMenu): | 73 | class SprintOverviewMenu(NavigationMenu): |
27 | 73 | 74 | ||
28 | 74 | usedfor = ISprint | 75 | usedfor = ISprint |
29 | 75 | facet = 'overview' | 76 | facet = 'overview' |
30 | @@ -154,6 +155,8 @@ | |||
31 | 154 | 155 | ||
32 | 155 | __used_for__ = ISprint | 156 | __used_for__ = ISprint |
33 | 156 | 157 | ||
34 | 158 | implements(IMajorHeadingView) | ||
35 | 159 | |||
36 | 157 | def initialize(self): | 160 | def initialize(self): |
37 | 158 | self.notices = [] | 161 | self.notices = [] |
38 | 159 | self.latest_specs_limit = 5 | 162 | self.latest_specs_limit = 5 |
39 | @@ -200,7 +203,7 @@ | |||
40 | 200 | dt = dt.astimezone(self.tzinfo) | 203 | dt = dt.astimezone(self.tzinfo) |
41 | 201 | return dt.strftime('%Y-%m-%d') | 204 | return dt.strftime('%Y-%m-%d') |
42 | 202 | 205 | ||
44 | 203 | _local_timeformat = '%H:%M on %A, %Y-%m-%d' | 206 | _local_timeformat = '%H:%M %Z on %A, %Y-%m-%d' |
45 | 204 | @property | 207 | @property |
46 | 205 | def local_start(self): | 208 | def local_start(self): |
47 | 206 | """The sprint start time, in the local time zone, as text.""" | 209 | """The sprint start time, in the local time zone, as text.""" |
48 | 207 | 210 | ||
49 | === modified file 'lib/lp/blueprints/browser/sprintattendance.py' | |||
50 | --- lib/lp/blueprints/browser/sprintattendance.py 2009-06-25 00:00:26 +0000 | |||
51 | +++ lib/lp/blueprints/browser/sprintattendance.py 2009-09-18 11:31:27 +0000 | |||
52 | @@ -124,6 +124,8 @@ | |||
53 | 124 | 124 | ||
54 | 125 | field_names = ['time_starts', 'time_ends'] | 125 | field_names = ['time_starts', 'time_ends'] |
55 | 126 | 126 | ||
56 | 127 | label = "Register your attendance" | ||
57 | 128 | |||
58 | 127 | @property | 129 | @property |
59 | 128 | def initial_values(self): | 130 | def initial_values(self): |
60 | 129 | """Show committed attendance, or default to the sprint times.""" | 131 | """Show committed attendance, or default to the sprint times.""" |
61 | @@ -141,6 +143,11 @@ | |||
62 | 141 | time_starts, time_ends = self.getDates(data) | 143 | time_starts, time_ends = self.getDates(data) |
63 | 142 | self.context.attend(self.user, time_starts, time_ends) | 144 | self.context.attend(self.user, time_starts, time_ends) |
64 | 143 | 145 | ||
65 | 146 | @property | ||
66 | 147 | def cancel_url(self): | ||
67 | 148 | """Canceling goes back to the sprint page.""" | ||
68 | 149 | return canonical_url(self.context) | ||
69 | 150 | |||
70 | 144 | 151 | ||
71 | 145 | class SprintAttendanceRegisterView(BaseSprintAttendanceAddView): | 152 | class SprintAttendanceRegisterView(BaseSprintAttendanceAddView): |
72 | 146 | """A view used to register someone else's attendance at a sprint.""" | 153 | """A view used to register someone else's attendance at a sprint.""" |
73 | 147 | 154 | ||
74 | === modified file 'lib/lp/blueprints/stories/sprints/05-sprint-creation.txt' | |||
75 | --- lib/lp/blueprints/stories/sprints/05-sprint-creation.txt 2009-09-15 10:26:04 +0000 | |||
76 | +++ lib/lp/blueprints/stories/sprints/05-sprint-creation.txt 2009-09-18 11:31:27 +0000 | |||
77 | @@ -80,14 +80,9 @@ | |||
78 | 80 | Since the sprint's time zone was set to UTC, the dates are displayed in | 80 | Since the sprint's time zone was set to UTC, the dates are displayed in |
79 | 81 | that time zone: | 81 | that time zone: |
80 | 82 | 82 | ||
89 | 83 | >>> print find_portlet(user_browser.contents, 'Meeting details') | 83 | >>> print extract_text(find_tag_by_id(user_browser.contents, 'start-end')) |
90 | 84 | <... | 84 | Starts: 09:15 UTC on Tuesday, 2006-10-10 |
91 | 85 | ...Starts:... | 85 | Ends: 16:00 UTC on Friday, 2006-10-13 |
84 | 86 | 2006-10-10 09:15 UTC... | ||
85 | 87 | ...Ends:... | ||
86 | 88 | 2006-10-13 16:00 UTC... | ||
87 | 89 | ... | ||
88 | 90 | |||
92 | 91 | 86 | ||
93 | 92 | Because this is a brand new sprint, it will have no specs, and we should see | 87 | Because this is a brand new sprint, it will have no specs, and we should see |
94 | 93 | a warning to that effect on the page. | 88 | a warning to that effect on the page. |
95 | @@ -115,11 +110,7 @@ | |||
96 | 115 | >>> user_browser.url | 110 | >>> user_browser.url |
97 | 116 | 'http://launchpad.dev/sprints/africa-sprint' | 111 | 'http://launchpad.dev/sprints/africa-sprint' |
98 | 117 | 112 | ||
106 | 118 | >>> print find_portlet(user_browser.contents, 'Meeting details') | 113 | >>> print extract_text(find_tag_by_id(user_browser.contents, 'start-end')) |
107 | 119 | <... | 114 | Starts: 09:15 SAST on Monday, 2006-07-10 |
108 | 120 | ...Starts:... | 115 | Ends: 16:00 SAST on Thursday, 2006-07-13 |
102 | 121 | 2006-07-10 09:15 SAST... | ||
103 | 122 | ...Ends:... | ||
104 | 123 | 2006-07-13 16:00 SAST... | ||
105 | 124 | ... | ||
109 | 125 | 116 | ||
110 | 126 | 117 | ||
111 | === modified file 'lib/lp/blueprints/stories/sprints/10-sprint-editing.txt' | |||
112 | --- lib/lp/blueprints/stories/sprints/10-sprint-editing.txt 2009-09-16 17:32:51 +0000 | |||
113 | +++ lib/lp/blueprints/stories/sprints/10-sprint-editing.txt 2009-09-18 10:49:12 +0000 | |||
114 | @@ -2,8 +2,8 @@ | |||
115 | 2 | available to those who have permissions to edit that sprint. | 2 | available to those who have permissions to edit that sprint. |
116 | 3 | 3 | ||
117 | 4 | >>> anon_browser.open('http://launchpad.dev/sprints/ubz') | 4 | >>> anon_browser.open('http://launchpad.dev/sprints/ubz') |
120 | 5 | >>> anon_browser.title | 5 | >>> print anon_browser.title |
121 | 6 | 'Ubuntu Below Zero (sprint or meeting)' | 6 | Ubuntu Below Zero : Meetings |
122 | 7 | 7 | ||
123 | 8 | >>> anon_browser.getLink('Change details') | 8 | >>> anon_browser.getLink('Change details') |
124 | 9 | Traceback (most recent call last): | 9 | Traceback (most recent call last): |
125 | @@ -15,8 +15,8 @@ | |||
126 | 15 | >>> browser.addHeader('Authorization', 'Basic test@canonical.com:test') | 15 | >>> browser.addHeader('Authorization', 'Basic test@canonical.com:test') |
127 | 16 | 16 | ||
128 | 17 | >>> browser.open('http://launchpad.dev/sprints/ubz') | 17 | >>> browser.open('http://launchpad.dev/sprints/ubz') |
131 | 18 | >>> browser.title | 18 | >>> print browser.title |
132 | 19 | 'Ubuntu Below Zero (sprint or meeting)' | 19 | Ubuntu Below Zero : Meetings |
133 | 20 | 20 | ||
134 | 21 | >>> address = 'Holiday Inn Select, Downtown Montreal, Canada' | 21 | >>> address = 'Holiday Inn Select, Downtown Montreal, Canada' |
135 | 22 | >>> address in browser.contents | 22 | >>> address in browser.contents |
136 | @@ -64,19 +64,14 @@ | |||
137 | 64 | 'http://launchpad.dev/sprints/ubz' | 64 | 'http://launchpad.dev/sprints/ubz' |
138 | 65 | 65 | ||
139 | 66 | 66 | ||
153 | 67 | The address of the sprint is now visible in the sprint details portlet. | 67 | The address of the sprint is now visible. |
154 | 68 | 68 | ||
155 | 69 | >>> details_portlet = find_portlet(browser.contents, 'Meeting details') | 69 | >>> print extract_text(find_tag_by_id(browser.contents, 'sprint-address')) |
156 | 70 | >>> address in details_portlet.renderContents() | 70 | Address: Holiday Inn Select, Downtown Montreal, Canada |
157 | 71 | True | 71 | |
158 | 72 | 72 | >>> print extract_text(find_tag_by_id(browser.contents, 'start-end')) | |
159 | 73 | >>> print details_portlet | 73 | Starts: 08:30 EST on Tuesday, 2006-01-10 |
160 | 74 | <... | 74 | Ends: 17:00 EST on Sunday, 2006-02-12 |
148 | 75 | ...Starts:... | ||
149 | 76 | 2006-01-10 08:30 EST... | ||
150 | 77 | ...Ends:... | ||
151 | 78 | 2006-02-12 17:00 EST... | ||
152 | 79 | ... | ||
161 | 80 | 75 | ||
162 | 81 | 76 | ||
163 | 82 | If we just change the time zone on the edit form, the start and finish | 77 | If we just change the time zone on the edit form, the start and finish |
164 | @@ -88,11 +83,7 @@ | |||
165 | 88 | >>> print browser.url | 83 | >>> print browser.url |
166 | 89 | http://launchpad.dev/sprints/ubz | 84 | http://launchpad.dev/sprints/ubz |
167 | 90 | 85 | ||
175 | 91 | >>> print find_portlet(browser.contents, 'Meeting details') | 86 | >>> print extract_text(find_tag_by_id(browser.contents, 'start-end')) |
176 | 92 | <... | 87 | Starts: 08:30 CST on Tuesday, 2006-01-10 |
177 | 93 | ...Starts:... | 88 | Ends: 17:00 CST on Sunday, 2006-02-12 |
171 | 94 | 2006-01-10 08:30 CST... | ||
172 | 95 | ...Ends:... | ||
173 | 96 | 2006-02-12 17:00 CST... | ||
174 | 97 | ... | ||
178 | 98 | 89 | ||
179 | 99 | 90 | ||
180 | === modified file 'lib/lp/blueprints/stories/sprints/20-sprint-registration.txt' | |||
181 | --- lib/lp/blueprints/stories/sprints/20-sprint-registration.txt 2009-07-23 17:49:31 +0000 | |||
182 | +++ lib/lp/blueprints/stories/sprints/20-sprint-registration.txt 2009-09-18 11:31:27 +0000 | |||
183 | @@ -10,8 +10,8 @@ | |||
184 | 10 | >>> browser.url | 10 | >>> browser.url |
185 | 11 | 'http://launchpad.dev/sprints/ubz/+attend' | 11 | 'http://launchpad.dev/sprints/ubz/+attend' |
186 | 12 | 12 | ||
189 | 13 | >>> browser.title | 13 | >>> print browser.title |
190 | 14 | 'Register your attendance at Ubuntu Below Zero' | 14 | +attend : Ubuntu Below Zero : Meetings |
191 | 15 | 15 | ||
192 | 16 | Invalid dates, for instance entering a starting date after the ending date, | 16 | Invalid dates, for instance entering a starting date after the ending date, |
193 | 17 | are reported as errors to the users. (See also the tests in | 17 | are reported as errors to the users. (See also the tests in |
194 | 18 | 18 | ||
195 | === modified file 'lib/lp/blueprints/stories/sprints/sprint-settopics.txt' | |||
196 | --- lib/lp/blueprints/stories/sprints/sprint-settopics.txt 2009-08-13 19:03:36 +0000 | |||
197 | +++ lib/lp/blueprints/stories/sprints/sprint-settopics.txt 2009-09-18 10:49:12 +0000 | |||
198 | @@ -55,8 +55,8 @@ | |||
199 | 55 | 'http://launchpad.dev/sprints/uds-guacamole' | 55 | 'http://launchpad.dev/sprints/uds-guacamole' |
200 | 56 | 56 | ||
201 | 57 | >>> ut = 'Ubuntu Team' | 57 | >>> ut = 'Ubuntu Team' |
204 | 58 | >>> meeting_portlet = find_portlet(browser.contents, 'Meeting details') | 58 | >>> meeting_drivers = find_tag_by_id(browser.contents, 'meeting-drivers') |
205 | 59 | >>> ut in extract_text(meeting_portlet.find(text='Driver:').findNext('a')) | 59 | >>> ut in extract_text(meeting_drivers.findNext('a')) |
206 | 60 | True | 60 | True |
207 | 61 | 61 | ||
208 | 62 | Any member of the Ubuntu-Team can now approve and/or decline items to the UDS | 62 | Any member of the Ubuntu-Team can now approve and/or decline items to the UDS |
209 | 63 | 63 | ||
210 | === modified file 'lib/lp/blueprints/templates/sprint-attend.pt' | |||
211 | --- lib/lp/blueprints/templates/sprint-attend.pt 2009-07-17 17:59:07 +0000 | |||
212 | +++ lib/lp/blueprints/templates/sprint-attend.pt 2009-09-18 11:31:27 +0000 | |||
213 | @@ -3,10 +3,7 @@ | |||
214 | 3 | xmlns:tal="http://xml.zope.org/namespaces/tal" | 3 | xmlns:tal="http://xml.zope.org/namespaces/tal" |
215 | 4 | xmlns:metal="http://xml.zope.org/namespaces/metal" | 4 | xmlns:metal="http://xml.zope.org/namespaces/metal" |
216 | 5 | xmlns:i18n="http://xml.zope.org/namespaces/i18n" | 5 | xmlns:i18n="http://xml.zope.org/namespaces/i18n" |
221 | 6 | xml:lang="en" | 6 | metal:use-macro="view/macro:page/main_only" |
218 | 7 | lang="en" | ||
219 | 8 | dir="ltr" | ||
220 | 9 | metal:use-macro="context/@@main_template/master" | ||
222 | 10 | i18n:domain="launchpad" | 7 | i18n:domain="launchpad" |
223 | 11 | > | 8 | > |
224 | 12 | 9 | ||
225 | @@ -16,17 +13,10 @@ | |||
226 | 16 | use-macro="context/@@launchpad_widget_macros/yui2calendar-dependencies" /> | 13 | use-macro="context/@@launchpad_widget_macros/yui2calendar-dependencies" /> |
227 | 17 | </metal:block> | 14 | </metal:block> |
228 | 18 | 15 | ||
229 | 19 | <metal:portlets fill-slot="portlets"> | ||
230 | 20 | <div tal:replace="structure context/@@+portlet-details" /> | ||
231 | 21 | <div tal:replace="structure context/@@+portlet-attendees" /> | ||
232 | 22 | </metal:portlets> | ||
233 | 23 | |||
234 | 24 | <div metal:fill-slot="main"> | 16 | <div metal:fill-slot="main"> |
235 | 25 | 17 | ||
236 | 26 | <div metal:use-macro="context/@@launchpad_form/form"> | 18 | <div metal:use-macro="context/@@launchpad_form/form"> |
237 | 27 | 19 | ||
238 | 28 | <h1 metal:fill-slot="heading">Register your attendance</h1> | ||
239 | 29 | |||
240 | 30 | <div metal:fill-slot="extra_info" class="documentDescription"> | 20 | <div metal:fill-slot="extra_info" class="documentDescription"> |
241 | 31 | Indicate the times during which you will be available for meetings at | 21 | Indicate the times during which you will be available for meetings at |
242 | 32 | the sprint. The sprint runs from | 22 | the sprint. The sprint runs from |
243 | @@ -37,16 +27,16 @@ | |||
244 | 37 | 27 | ||
245 | 38 | </div> | 28 | </div> |
246 | 39 | 29 | ||
257 | 40 | </div> | 30 | <p class="aside"> |
258 | 41 | 31 | Note: Please be as accurate as possible with the time that you will | |
259 | 42 | <div metal:fill-slot="help"> | 32 | arrive and depart from the conference or sprint venue. This allows the |
260 | 43 | <p> | 33 | event organisers to schedule the sessions knowing who can attend at |
261 | 44 | Please be as accurate as possible with the time that you will arrive and | 34 | various times on the opening and closing day. |
262 | 45 | depart from the conference or sprint venue. This allows the event organisers | 35 | </p> |
263 | 46 | to schedule the sessions knowing who can attend at various times on the | 36 | |
264 | 47 | opening and closing day. | 37 | </div> |
265 | 48 | </p> | 38 | |
266 | 49 | </div> | 39 | |
267 | 50 | 40 | ||
268 | 51 | </body> | 41 | </body> |
269 | 52 | </html> | 42 | </html> |
270 | 53 | 43 | ||
271 | === modified file 'lib/lp/blueprints/templates/sprint-index.pt' | |||
272 | --- lib/lp/blueprints/templates/sprint-index.pt 2009-07-17 17:59:07 +0000 | |||
273 | +++ lib/lp/blueprints/templates/sprint-index.pt 2009-09-18 10:49:12 +0000 | |||
274 | @@ -3,112 +3,126 @@ | |||
275 | 3 | xmlns:tal="http://xml.zope.org/namespaces/tal" | 3 | xmlns:tal="http://xml.zope.org/namespaces/tal" |
276 | 4 | xmlns:metal="http://xml.zope.org/namespaces/metal" | 4 | xmlns:metal="http://xml.zope.org/namespaces/metal" |
277 | 5 | xmlns:i18n="http://xml.zope.org/namespaces/i18n" | 5 | xmlns:i18n="http://xml.zope.org/namespaces/i18n" |
282 | 6 | xml:lang="en" | 6 | metal:use-macro="view/macro:page/main_side" |
279 | 7 | lang="en" | ||
280 | 8 | dir="ltr" | ||
281 | 9 | metal:use-macro="context/@@main_template/master" | ||
283 | 10 | i18n:domain="launchpad" | 7 | i18n:domain="launchpad" |
284 | 11 | > | 8 | > |
285 | 12 | 9 | ||
286 | 13 | <body> | 10 | <body> |
287 | 14 | 11 | ||
292 | 15 | <metal:portlets fill-slot="portlets"> | 12 | <tal:registering metal:fill-slot="registering"> |
293 | 16 | <div tal:replace="structure context/@@+portlet-details" /> | 13 | <p>Registered by <a tal:replace="structure context/owner/fmt:link" /> |
294 | 17 | <div tal:replace="structure context/@@+portlet-attendees" /> | 14 | on <span tal:content="context/datecreated/fmt:displaydate" |
295 | 18 | </metal:portlets> | 15 | tal:attributes="title context/datecreated/fmt:datetime" |
296 | 16 | >on 2005-01-01</span> | ||
297 | 17 | </p> | ||
298 | 18 | </tal:registering> | ||
299 | 19 | 19 | ||
300 | 20 | <div metal:fill-slot="main" | 20 | <div metal:fill-slot="main" |
301 | 21 | tal:define="specs view/specs; | 21 | tal:define="specs view/specs; |
302 | 22 | has_any_specs view/has_any_specifications"> | 22 | has_any_specs view/has_any_specifications"> |
303 | 23 | 23 | ||
327 | 24 | <tal:mugshot replace="structure context/image:mugshot" /> | 24 | <div class="top-portlet"> |
328 | 25 | <h1>Meeting overview</h1> | 25 | <h2>Meeting overview</h2> |
329 | 26 | 26 | ||
307 | 27 | <p> | ||
308 | 28 | <strong> | ||
309 | 29 | <tal:start replace="view/local_start" /> till | ||
310 | 30 | <tal:end replace="view/local_end" /> | ||
311 | 31 | </strong> | ||
312 | 32 | </p> | ||
313 | 33 | |||
314 | 34 | <p> | ||
315 | 35 | <span tal:replace="context/summary"> | ||
316 | 36 | Sprint Summary Goes Here | ||
317 | 37 | </span> | ||
318 | 38 | <tal:has_homepage condition="context/home_page"> | ||
319 | 39 | <img src="/@@/meeting" /> | ||
320 | 40 | <a tal:attributes="href context/home_page"> | ||
321 | 41 | View the Meeting Home Page | ||
322 | 42 | </a> | ||
323 | 43 | </tal:has_homepage> | ||
324 | 44 | </p> | ||
325 | 45 | |||
326 | 46 | <tal:no_specifications_at_all condition="not: has_any_specs"> | ||
330 | 47 | <p> | 27 | <p> |
336 | 48 | Nobody has yet proposed any blueprints for discussion at this sprint. | 28 | <span tal:replace="context/summary"> |
337 | 49 | If you will be attending the sprint you should make sure that the | 29 | Sprint Summary Goes Here |
338 | 50 | blueprints you are interested in discussing get nominated for the | 30 | </span> |
339 | 51 | agenda. You can do this using the "Propose for meeting agenda" action | 31 | <tal:has_homepage condition="context/home_page"> |
340 | 52 | link on the blueprint page. | 32 | <img src="/@@/meeting" /> |
341 | 33 | <a tal:attributes="href context/home_page"> | ||
342 | 34 | View the Meeting Home Page | ||
343 | 35 | </a> | ||
344 | 36 | </tal:has_homepage> | ||
345 | 53 | </p> | 37 | </p> |
346 | 54 | 38 | ||
347 | 39 | <dl id="start-end"> | ||
348 | 40 | <dt>Starts:</dt> | ||
349 | 41 | <dd><tal:start replace="view/local_start" /></dd> | ||
350 | 42 | <dt>Ends:</dt> | ||
351 | 43 | <dd><tal:start replace="view/local_end" /></dd> | ||
352 | 44 | </dl> | ||
353 | 45 | |||
354 | 46 | <dl id="sprint-address" tal:condition="context/address"> | ||
355 | 47 | <dt>Address:</dt> | ||
356 | 48 | <dd><span tal:replace="context/address" /></dd> | ||
357 | 49 | </dl> | ||
358 | 50 | |||
359 | 51 | <dl id="meeting-drivers"> | ||
360 | 52 | <dt>Meeting drivers:</dt> | ||
361 | 53 | <dd tal:repeat="driver context/drivers" style="margin-bottom:0.2em"> | ||
362 | 54 | <span tal:replace="structure driver/fmt:link" /> | ||
363 | 55 | </dd> | ||
364 | 56 | </dl> | ||
365 | 57 | |||
366 | 55 | <p> | 58 | <p> |
367 | 56 | Each meeting has a person, or team, responsible for deciding which | 59 | Each meeting has a person, or team, responsible for deciding which |
368 | 57 | items are accepted for the agenda. This team is called the "meeting | 60 | items are accepted for the agenda. This team is called the "meeting |
369 | 58 | driver" and for <tal:meeting replace="context/title" /> they are: | 61 | driver" and for <tal:meeting replace="context/title" /> they are: |
370 | 59 | </p> | 62 | </p> |
371 | 60 | 63 | ||
372 | 61 | <ul> | ||
373 | 62 | <li class="person" tal:repeat="driver context/drivers"> | ||
374 | 63 | <a tal:attributes="href driver/fmt:url" | ||
375 | 64 | tal:content="driver/displayname" /> | ||
376 | 65 | </li> | ||
377 | 66 | </ul> | ||
378 | 67 | |||
379 | 68 | <p> | 64 | <p> |
380 | 69 | You should contact the meeting driver if you have any additional | 65 | You should contact the meeting driver if you have any additional |
381 | 70 | questions about the structure or agenda of the meeting. | 66 | questions about the structure or agenda of the meeting. |
382 | 71 | </p> | 67 | </p> |
407 | 72 | 68 | </div> | |
408 | 73 | </tal:no_specifications_at_all> | 69 | |
409 | 74 | 70 | <div class="portlet"> | |
410 | 75 | <tal:some_specs_nominated condition="has_any_specs"> | 71 | <h2>Blueprints</h2> |
411 | 76 | 72 | <tal:no_specifications_at_all condition="not: has_any_specs"> | |
388 | 77 | <p tal:condition="not:specs"> | ||
389 | 78 | No blueprints are yet approved for discussion at | ||
390 | 79 | <span tal:replace="context/title">Ubuntu Below Zero</span>. | ||
391 | 80 | If you are one of the meeting drivers you should review the proposed | ||
392 | 81 | blueprint list and accept those topics you wish to show up on the | ||
393 | 82 | agenda for the meeting. | ||
394 | 83 | </p> | ||
395 | 84 | |||
396 | 85 | <tal:approved_specs condition="specs"> | ||
397 | 86 | |||
398 | 87 | <h2>Latest <span tal:replace="view/latest_specs_limit">5</span> | ||
399 | 88 | additions to the meeting agenda</h2> | ||
400 | 89 | |||
401 | 90 | <table> | ||
402 | 91 | <div tal:repeat="spec view/latest_approved" | ||
403 | 92 | tal:replace="structure spec/@@+listing-simple" | ||
404 | 93 | /> | ||
405 | 94 | </table> | ||
406 | 95 | |||
412 | 96 | <p> | 73 | <p> |
428 | 97 | There are a total of <span tal:replace="view/count">5</span> | 74 | Nobody has yet proposed any blueprints for discussion at this sprint. |
429 | 98 | specifications on the meeting agenda. | 75 | If you will be attending the sprint you should make sure that the |
430 | 99 | <tal:proposed define="proposed view/proposed_count" | 76 | blueprints you are interested in discussing get nominated for the |
431 | 100 | condition="proposed"> | 77 | agenda. You can do this using the "Propose for meeting agenda" action |
432 | 101 | There are <span tal:replace="proposed">7</span> | 78 | link on the blueprint page. |
433 | 102 | specifications | 79 | </p> |
434 | 103 | <a tal:omit-tag="not: context/required:launchpad.Driver" href="+settopics"> | 80 | |
435 | 104 | proposed | 81 | </tal:no_specifications_at_all> |
436 | 105 | </a> which the organisers will review. | 82 | |
437 | 106 | </tal:proposed> | 83 | <tal:some_specs_nominated condition="has_any_specs"> |
438 | 107 | You can view the <a href="+specs">full current agenda here</a>. | 84 | |
439 | 108 | </p> | 85 | <p tal:condition="not:specs"> |
440 | 109 | </tal:approved_specs> | 86 | No blueprints are yet approved for discussion at |
441 | 110 | </tal:some_specs_nominated> | 87 | <span tal:replace="context/title">Ubuntu Below Zero</span>. |
442 | 111 | 88 | If you are one of the meeting drivers you should review the proposed | |
443 | 89 | blueprint list and accept those topics you wish to show up on the | ||
444 | 90 | agenda for the meeting. | ||
445 | 91 | </p> | ||
446 | 92 | |||
447 | 93 | <tal:approved_specs condition="specs"> | ||
448 | 94 | |||
449 | 95 | <h2>Latest <span tal:replace="view/latest_specs_limit">5</span> | ||
450 | 96 | additions to the meeting agenda</h2> | ||
451 | 97 | |||
452 | 98 | <table> | ||
453 | 99 | <div tal:repeat="spec view/latest_approved" | ||
454 | 100 | tal:replace="structure spec/@@+listing-simple" | ||
455 | 101 | /> | ||
456 | 102 | </table> | ||
457 | 103 | |||
458 | 104 | <p> | ||
459 | 105 | There are a total of <span tal:replace="view/count">5</span> | ||
460 | 106 | specifications on the meeting agenda. | ||
461 | 107 | <tal:proposed define="proposed view/proposed_count" | ||
462 | 108 | condition="proposed"> | ||
463 | 109 | There are <span tal:replace="proposed">7</span> | ||
464 | 110 | specifications | ||
465 | 111 | <a tal:omit-tag="not: context/required:launchpad.Driver" href="+settopics"> | ||
466 | 112 | proposed | ||
467 | 113 | </a> which the organisers will review. | ||
468 | 114 | </tal:proposed> | ||
469 | 115 | You can view the <a href="+specs">full current agenda here</a>. | ||
470 | 116 | </p> | ||
471 | 117 | </tal:approved_specs> | ||
472 | 118 | </tal:some_specs_nominated> | ||
473 | 119 | </div> <!-- class="portlet" --> | ||
474 | 112 | </div> | 120 | </div> |
475 | 121 | |||
476 | 122 | <tal:side metal:fill-slot="side"> | ||
477 | 123 | <tal:menu replace="structure context/@@+global-actions" /> | ||
478 | 124 | <div tal:replace="structure context/@@+portlet-attendees" /> | ||
479 | 125 | </tal:side> | ||
480 | 126 | |||
481 | 113 | </body> | 127 | </body> |
482 | 114 | </html> | 128 | </html> |
= Summary =
Mechanical updates to sprint-index and sprint-attend.
The index required a little re-working.
Before: people. canonical. com/~michaeln/ tmp/sprint- index-before. png people. canonical. com/~michaeln/ tmp/sprint- attend- before. png
http://
http://
After: people. canonical. com/~michaeln/ tmp/sprint- index-after. png people. canonical. com/~michaeln/ tmp/sprint- attend- after.png
http://
http://
== Proposed fix ==
== Pre-implementation notes ==
== Implementation details ==
== Tests ==
bin/test -vvt sprint
== Demo and Q/A ==
Demo: /launchpad. dev/sprints/ paris
https:/
= Launchpad lint =
Checking for conflicts. and issues in doctests and templates.
Running jslint, xmllint, pyflakes, and pylint.
Using normal rules.
Linting changed files: blueprints/ browser/ sprintattendanc e.py blueprints/ stories/ sprints/ 05-sprint- creation. txt blueprints/ browser/ sprint. py blueprints/ stories/ sprints/ sprint- settopics. txt blueprints/ stories/ sprints/ 20-sprint- registration. txt blueprints/ templates/ sprint- attend. pt blueprints/ templates/ sprint- index.pt blueprints/ stories/ sprints/ 10-sprint- editing. txt
lib/lp/
lib/lp/
lib/lp/
lib/lp/
lib/lp/
lib/lp/
lib/lp/
lib/lp/
--
Michael