#format text/creole = User Stories Delivered = == API Track == <> === Make API Cacheable === **Story Points:** 3\\ **Delivered:** 2.1.9 As a web service client,\\ I get a Last-Modified date with each representation I request. I can use that data later on to make conditional GET, PUT, or PATCH requests.\\ We do this because conditional GET saves bandwidth and often time, and conditional PUT/PATCH prevents clients from overwriting each others' work. **Notes:** * Modify launchpadlib to use the new headers * Store Last-Modified * Calculate the headers for objects. No Last-Modified for collections. <> === Make API Cacheable - client side === **Story Points:** 3\\ **Delivered:** 2.1.9 As a launchpadlib user,\\ ll GET requests I send have their Last-Modified headers stored for later. Subsequent GET or PATCH requests are made conditional using the stored value. <> === API customized auto-generated adapter === **Story Points:** ?\\ **Bug:** [[https://bugs.edge.launchpad.net/launchpad-foundations/+bug/294858|#294858]]. As a Launchpad developer,\\ I want to be able to customize the IEntry and ICollection adapters generated automatically by the annotations,\\ so that webservice-specific optimization might be made, while retaining the convenience of the annotated API. **Notes:** No real use cases was found for this feature. <> === Entry ETag === **Story Points:** 3\\ **Delivered:** 2.1.12\\ **Bug:** [[https://bugs.edge.launchpad.net/launchpad-foundations/+bug/273176|273176]] As a Launchpad web service client,\\ I want to see an entry's ETag in the representation of the entry itself;\\ so I can make conditional requests on objects that weren't obtained through an individual HTTP request. <> == Export mutators as writable attributes == **Story Points:** 3\\ **Delivered:** 2.1.12 As a developer,\\ I can annotate one of an interface's methods to be the method invoked when the client makes a PUT or PATCH request that modifies the value of a particular field;\\ so that the interface to modify most attributes is consistent. <> === Multi-Hit API === **Story Points:** ?\\ **Delivered:** Dropped during 2.2.1 because of no use cases As a webservice client,\\ I want to be able to invoke a particular named operation or setting an attribute to a certain value on a set of objects;\\ so that mass-change operation can be done efficiently. **Notes:** <> === API: Notification of Server Changes on Update ==== **Story Points:** 3\\ **Delivered:** 2.2.2 As a Launchpad web service client,\\ I want that when I do a PATCH or PUT request, the server notifies me when the data I specified was modified by the server;\\ so that I don't have to make a separate GET request to update my local copy of the object. **Notes**: * Send updated version on failed conditional get. * Always send the representation back. <> === API: HTML Representation ==== **Story Points:** ?\\ **Delivered:** 2.2.2 As an AJAX client,\\ I want to be able to specify in my request that I want an HTML rendition of the object I'm retrieving;\\ so that I can update the page without having to make a separate request to a special fragment view. **Notes:** * Use a view lookup to find the rendition. * Should be available on update results also. * Available on collection and operation. <> === API: Field Resource ==== **Story Points:** ?\\ **Delivered:** 2.2.3 As an AJAX webservice client,\\ I want to be able to retrieve the HTML representation of field of a resource;\\ so that I can selectively update a page content dynamically. <> === lazr.restful === **Story Points:** ?\\ **Delivered:** 2.2.3 As a Zope developer,\\ I want to download lazr.webservice from the Cheeseshop;\\ so that I can add easily a REST webservice to my Zope application. <> === DELETE resource === **Story Points:** 3\\ **Delivered:** 2.2.3 As a developer,\\ I can annotate one of an interface's methods to be the method invoked when the client makes a DELETE request to the appropriate kind of resource;\\ so that the way to delete resources is consistent. **Notes:** * The DELETE request has the effect of irrevocably removing the underlying object from view through the interface. Attempts to access this object will subsequently result in a 404 error. <> === DELETE resource === **Story Points:** 3\\ **Delivered:** 2.2.3 As a developer,\\ I can annotate one of an interface's methods to be the method invoked when the client makes a DELETE request to the appropriate kind of resource;\\ so that the way to delete resources is consistent. **Notes:** * The DELETE request has the effect of irrevocably removing the underlying object from view through the interface. Attempts to access this object will subsequently result in a 404 error. <> === API: Field Resource Vocabulary ==== **Story Points:** 3 As a webservice client,\\ I want to be able to the valid values of field vocabulary;\\ so that I present the list of valid values to the client. **Notes:** * Close-up representation of field. * Only for JS-benefit. * No need for WADL because of JS. == AJAX Track == <> === YUI Integration === **Story Points:** 1\\ **Delivered:** 2.1.10 As a Launchpad developer, I want to be able to use YUI from a page template, so that I can do cool UI. **Notes:** * Build/Package YUI files * Add to main template, with switch for dev mode. <> === JavaScript Testing === **Story Points:** 5\\ **Delivered:** 2.1.10 As a Launchpad developer, I want to write a tests for my Javascript, be able to run it locally from the command line; so that I can detect regressions in Javascript code. **Notes:** * Create YUI 2.5.2 bundle * Server the bundle from icing * Hook the window fire-up and results reading from test.py or make? * Presumed Rhino and Doh can do it (Dojo) <> === API JS Access === **Story Points:** 5\\ **Delivered:** 2.1.10 As a Launchpad developer, I want to be able to use the Launchpad web service API from JavaScript, so that I can use the standard API to manipulate the content from the UI. **Notes:** * Somehow call the WebService publisher and Request for different vhosts. * Support canonical_url for API objects on other hosts. * Add the cookie-based authentication to WebServicePublication. <> === Initial API JavaScript Library === **Story Points:** 8\\ **Delivered:** 2.1.10 As a Launchpad developer, I want a JS library available that allow me to easily make API call to the Launchpad web service, so that I can access the Launchpad object model without having to write custom XHR request and interpret the resulting JSON. **Notes:** <> === AJAX PATCH === **Story Points:** 2\\ **Delivered:** 2.1.11\\ **Bug:** [[https://bugs.edge.launchpad.net/launchpad-foundations/+bug/29645|#29645]] As a Launchpad programmer,\\ I want to make the equivalent of a PATCH request through Ajax;\\ so I can modify an object without having a representation of it. <> === LAZR-JS Green Flash === **Story Points:** 2\\ **Delivered:** 2.1.12 As a Canonical JS developer,\\ I want to be able to use a standard green flash animation for\\ when data has been saved successfully. <> === Lazr-JS Project Bootstrap === **Story Points:** 1\\ **Delivered:** 2.1.12 As a Launchpad developer,\\ I want to develop, test, and publish JavaScript widgets in the lazr-js project,\\ so I can share JS components with the rest of Canonical. <> === Lazr-JS Reference Widget === **Story Points:** 5\\ **Delivered:** 2.1.12 As a Canonical JS developer,\\ I want to have a reference implementation of a inline text editing widget; \\ so that I have an example on how to write widgets. <> === Lazr-JS Error Widget === **Story Points:** 5\\ **Delivered:** no use cases As a Launchpad user,\\ I want AJAX errors to be reported to a single widget;\\ so that I can navigate and retry errors. **Notes**: * See beuno's screenshot. * Must be available to all widgets. * Event-driven. * The use cases where such a widget would realy be useful weren't clear. Back to the design board. <> === Yuitest3 === **Story Points:** 1\\ **Delivered:** 2.2.1 As a LAZR-JS developer,\\ I want the Lazr-JS test suite to use the latest release of YUITest;\\ so that I can use Mock objects in my unit tests. <> === Prepopulating AJAX cache === **Story Points:** 3\\ **Delivered:** 2.2.1 **Bug:** [[https://bugs.edge.launchpad.net/launchpad-foundations/+bug/296456|#296456]] As a Launchpad programmer,\\ I want to be able to add objects in the view that will be available from within JavaScript;\\ so I can present that data or modify it without to have to make an HTTP request. <> === Inline text editing === **Story Points:** 3\\ **Delivered:** 2.2.2 As a Launchpad developer, I want a way to associate an inline text widget with the rendered element of a content field in view, so that I can easily add inline editing to text fields. **Notes:** {{{ view/bug_title_inlinet_widget bug_title_inline_widget = InlineTextWidget(self.context, 'title') }}} <> === LAZR Popup === **Story Points:** ?\\ **Delivered:** 2.2.2 As a Launchpad developer,\\ I want a pop-up widget in which I can add custom code;\\ so that I have a common look and feel across all pop-up widgets. **Notes:** * Done during the Lazr-JS February sprint. == Infrastructure Track == <> === Zope 3.4 Upgrade == **Story Points:** 8\\ **Delivered:** 2.1.10 As a Launchpad developer, I want to have zope 3.4 available in my tree, so that I can take advantage of the latest changes in it. **Notes:** <> === EC2 Test Runner === **Story Points:** 3\\ As a Launchpad developer,\\ I want an easy way to run the test suite on EC2;\\ so that I can submit a branch to PQM with confidence that the test suite will pass. <> === lazr.config === **Story Points:** 3\\ **Delivered:** 2.1.12 As a python developer,\\ I want to download lazr.config from the Cheeseshop;\\ so that I can use it for process configuration in my project. **Notes:** * Why not brand it as canonical? Find a top-level package name. * Missing some documentation. * Convert setup tools. * Reorganize project directory structure. * License? For all of lazr? <> === 5 minutes PQM merge === **Story Points:** 8\\ **Delivered:** 2.1.12 As a Launchpad developer,\\ I want a continuous integration system that will notify me when a commit I made breaks the test suite;\\ so that I can merge to PQM without running tests. **Notes:** * Need to deploy only known good branch. * Uses buildbot. <> === Buildbot EC2 Slave === **Story Points:** 5\\ **Delivered:** 2.2.1 As a LOSA,\\ I want to deploy buildbot using on-demand slave running on EC2; so that we can host the 5-minutes-PQM infrastructure withing the data center. **Notes:** * Deploy on devpad running slave on demand in ec2. <> === Merge EC2 latent slave upstream === **Story Points:** ??\\ \ **Delivered:** 2.2.1 As a Launchpad developer,\\ I want our ec2 latent slave code merged upstream;\\ so that it can be maintained by the community. <> === Separate DB branch === **Story Points:** 2\\ **Delivered:** 2.2.2 As the Launchpad release manager,\\ I want features requiring DB changes to be landed on a separate branch;\\ so that we can land DB-related changes earlier in the cycle and also keep edge updated during the whole cycle. **Notes:** * Pre-supposes the buildbot integration system. * Maintain the staging/rollout branch automatically (merging trunk in the DB branch). <> === 5 minutes PQM for dependencies === **Story Points:** ??\\ **Delivered:** Dropped 2.2.2 because would be obsolete with zc.buildout As a Launchpad developer,\\ I want all changes I make to LP dependant branches be merged without PQM running tests;\\ so that changes to LP dependancies can be integrated as fast as changes to Launchpad itself. <> === Continuous Integration of Dependencies === **Story Points:** 3\\ **Delivered:** 2.2.2 As the Launchpad release manager,\\ I want to have automatic regular test run of Launchpad against updated version of our dependencies;\\ so that we can anticipate problems with newer upstream versions. **Notes:** * Pre-supposes the buildbot integration system. * Will be used for bzr, maybe twisted. <> === Initial Tree layout improvements === **Story Points:** 3\\ **Delivered:** 2.2.3 As a Launchpad developer,\\ I want to be able to find the files related to a particular application in a common directory;\\ so that I can easily see the boundaries of each application. **Notes:** * Moving existing directory by applications. == OpenID Track == <> === Login-freshness OpenID extension === **Story Points:** 2\\ **Delivered:** 2.1.11 As a Relying Party,\\ I want to specify the maximum time since the user entered his password on the Launchpad OpenID Provider,\\ so that I can minimize the possibility of somebody just reusing an already authenticated session. <> === Configure access to private teams in +rpconfig === **Story Points:** 1\\ **Bug:** [[https://bugs.edge.launchpad.net/launchpad-foundations/+bug/192867|#192867]] **Delivered:** 2.1.11 As a Launchpad administrator,\\ I want to be able to configure if a trust root can query private \\ team memberships, so that we can offer the team membership functionality \\ to arbitrary RP. <> === SSO Authentication available during upgrade === **Story Points:** 3\\ **Delivered:** 2.2.3 As a Launchpad SSO user,\\ I want to be able to log in when Launchpad is going through maintenance;\\ so that my other services aren't affected by the monthly Launchpad down-time. <> === Account Creation=== **Story Points:** 5\\ **Delivered:** 2.2.3 (salgado) As a Landscape User,\\ when I registered an account on the SSO service, I don't want a Launchpad profile page created for me,\\ so that my anonimity is preserved. **Notes:** * Update the creation process to not create Account. * Modify the Launchpad login process to create a LP profile. * Make sure that Launchpad copes with account-only user who are browsing Launchpad (consider them anonymous).