19976
Comment:
|
23773
|
Deletions are marked like this. | Additions are marked like this. |
Line 4: | Line 4: |
|| SP || Feature || Delivered || || 3 || [[/Delivered#api-server-cache|Make API Cacheable]]|| 2.1.9 || || 3 || [[/Delivered#api-client-cache|Make API Cacheable - client side]]|| 2.1.9|| || 1 || [[/Delivered#yui-integration|YUI Integration]] || 2.1.10 || || 5 || [[/Delivered#javascript-testing|JavaScript Testing]] || 2.1.10 || || 5 || [[/Delivered#api-js-access|API JS Access]]|| 2.1.10|| || 8 || [[/Delivered#initial-api-javascript-library|Initial API JavaScript Library]] || 2.1.10 || || 8 || [[/Delivered#zope34-upgrade|Zope 3.4 Upgrade]] || 2.1.10 || || 2 || [[/Delivered#login-freshness-openid-extension|Login-freshness OpenID extension]] || 2.1.11 || || 2 || [[/Delivered#ajax-patch|AJAX PATCH]] || 2.1.11 || || 1 || [[/Delivered#private-team-rpconfig|Configure access to private teams in +rpconfig]] || 2.1.11 || || ? || [[VersionThreeDotO/Foundations#prepopulating-ajax-cache|Prepopulating AJAX cache]] || in-progress || || ? || [[VersionThreeDotO/Foundations#entry-etag|Entry ETag]] || || || 8 || [[VersionThreeDotO/Foundations#5-minutes-pqm-merge| 5 minutes PQM merge]] || in progress || || ? || [[VersionThreeDotO/Foundations#ec2-test-runner| EC2 Test Runner]] || in progress || || ? || [[VersionThreeDotO/Foundations#person-account-separation|Person/Account Separation]] || || || ? || [[VersionThreeDotO/Foundations#lazr-js-framework|Lazr-JS Project Bootstrap]] || in progress || || ? || [[VersionThreeDotO/Foundations#lazr-js-reference-widget|Lazr-JS Reference Widget ]] || in progress || || ? || [[VersionThreeDotO/Foundations#lazr-js-green-flash|Lazr-JS Green Flash]] || || || 3 || [[VersionThreeDotO/Foundations#lazr.config|lazr.config]] || || || ? || [[VersionThreeDotO/Foundations#sso-authentication-during-upgrade|SSO Authentication available during upgrade]] || || || ? || [[VersionThreeDotO/Foundations#lazr-js-error-widget|Lazr Error Widget]] || || || 3 || [[VersionThreeDotO/Foundations#inline-text-editing|Inline text editing]] || || || 8 || [[VersionThreeDotO/Foundations#zc-buildout|Use zc.buildout for deployment]] || || || || [[VersionThreeDotO/Foundations#merge-javascript-tests|Automatic JavaScript test running]] || || || 8 || [[VersionThreeDotO/Foundations#site-wide-notifications|Site-wide notifications]] || || || 3 || [[VersionThreeDotO/Foundations#tree-layout|Test tree layout improvements]] || || || || XXX Allowing admins to hide bug and answer comments || || || 5 || [[VersionThreeDotO/Foundations#spam-nomination|Nominating spam by users ]] || || || || XXX Update pagetests helpers to use lxml2 || || || || [[VersionThreeDotO/Foundations#api-customized-auto-generated-adapter|API customized auto-generated adapter]] || || || 1 || [[VersionThreeDotO/Foundations#sso-gpg-export|Export GPG keys through OpenId]] || || || || XXX Automatic decorator pattern (for performance) || || || || [[VersionThreeDotO/Foundations#multi-hit-api|Multi-hit API's]] || || || || XXX ZCML-less views (Martian integration) || || || || XXX Kill pagetitles.py || || || || XXX Batch navigation to specific pages || || || || XXX Base tabular view || || || || XXX Librarian generation of OOPSes || || || || XXX Sanitize the database dump || || || || XXX Easily set up logging for scripts into a logfile || || || || XXX OOPS zip formats || || || || XXX Include log information in OOPS reports || || || || XXX Include currently running queries in OOPS reports || || || || XXX Include machine process status in OOPS reports || || || || XXX Design for content class split into facets || || || || XXX Upgrade to Python 2.5 || || || || XXX Simple status editing || || || || [[VersionThreeDotO/Foundations#easy-a-b-testing|Easy A-B Testing]] || || || 20 || [[VersionThreeDotO/Foundations#api-versioning|API Versioning]] || || || 3 || [[VersionThreeDotO/Foundations#mutator-as-writable-attribute|Export mutators as writable attributes]] || || || 8 || [[VersionThreeDotO/Foundations#expose-scoped-collections-factory|Expose factory methods for scoped collections]] || || || 5 || [[VersionThreeDotO/Foundations#expose-top-level-collections-factory|Expose factories as POST to collection]] || || || 5 || [[VersionThreeDotO/Foundations#collection-filter|Make it possible for the default GET on a collection to take optional arguments]] || || || 3 || [[VersionThreeDotO/Foundations#api-delete-resource|DELETE resource]] || || || 1 || [[VersionThreeDotO/Foundations#launchpadlib-delete|delete() method in launchpadlib]] || || || 13 || [[VersionThreeDotO/Foundations#lazr-oops|lazr.oops]] || || || || XXX lazr.testing.pages || || || || XXX Controlled sample data setup || || || || [[VersionThreeDotO/Foundations#spam-control-captcha|Spam control (via qualification mechanisms)]] || || || 8 || [[VersionThreeDotO/Foundations#graphing-plotting-framework|Simple graphing/plotting framework]] || || || || XXX Storing text edit history || || || || [[VersionThreeDotO/Foundations#lp-connection-limiting|LP Connection Limiting]] || || || || [[VersionThreeDotO/Foundations#gpg-activated-accounts|GPG-activated accounts]] || || || 20 || [[VersionThreeDotO/Foundations#wiki-markup-engine|Wiki markup engine]] || || || || XXX Generalize Participation (for PackageSets) || || || || Providing an API to update karma events with the object they operate on (Bug:ID, Branch:ID, etc) || || || || XXX Factor out batch notification code || || |
|| SP || Track ||Feature || Delivered || || 3 || api || [[/Delivered#api-server-cache|Make API Cacheable]]|| 2.1.9 || || 3 || api || [[/Delivered#api-client-cache|Make API Cacheable - client side]]|| 2.1.9|| || 1 || ajax || [[/Delivered#yui-integration|YUI Integration]] || 2.1.10 || || 5 || ajax || [[/Delivered#javascript-testing|JavaScript Testing]] || 2.1.10 || || 5 || ajax || [[/Delivered#api-js-access|API JS Access]]|| 2.1.10|| || 8 || ajax || [[/Delivered#initial-api-javascript-library|Initial API JavaScript Library]] || 2.1.10 || || 8 || infrastructure || [[/Delivered#zope34-upgrade|Zope 3.4 Upgrade]] || 2.1.10 || || 2 || openid || [[/Delivered#login-freshness-openid-extension|Login-freshness OpenID extension]] || 2.1.11 || || 2 || api || [[/Delivered#ajax-patch|AJAX PATCH]] || 2.1.11 || || 1 || openid || [[/Delivered#private-team-rpconfig|Configure access to private teams in +rpconfig]] || 2.1.11 || || 3 || ajax || [[/Delivered#prepopulating-ajax-cache|Prepopulating AJAX cache]] || 2.2.1 || || 3 || api || [[/Delivered#entry-etag|Entry ETag]] || 2.1.12 || || 8 || intrastructure || [[VersionThreeDotO/Foundations#5-minutes-pqm-merge|5 minutes PQM merge]] || 2.1.12 || || 3 || infrastructure || [[/Delivered#ec2-test-runner| EC2 Test Runner]] || 2.1.12 || || 1 || ajax || [[/Delivered#lazr-js-framework|Lazr-JS Project Bootstrap]] || 2.2.1 || || 5 || ajax || [[/Delivered#lazr-js-reference-widget|Lazr-JS Reference Widget ]] || 2.1.12 || || 2 || ajax || [[/Delivered#lazr-js-green-flash|Lazr-JS Green Flash]] || 2.1.12 || || 3 || infrastructure || [[/Delivered#lazr.config|lazr.config]] || 2.1.12 || || 3 || api || [[/Delivered#mutator-as-writable-attribute|Export mutators as writable attributes]] || 2.1.12 || || 3 || openid || [[VersionThreeDotO/Foundations#sso-authentication-during-upgrade|SSO Authentication available during upgrade]] || in-progress || || 3 || infrastructure|| [[VersionThreeDotO/Foundations#buildbot-ec2slave|Buildbot EC2 Slave]] || in-progress || || 5 || ajax || [[/Delivered#lazr-js-error-widget|Lazr Error Widget]] || no use case || || 3 || ajax || [[VersionThreeDotO/Foundations#inline-text-editing|Inline text editing]] || in-progress || || ? || api || [[/Delivered#api-customized-auto-generated-adapter|API customized auto-generated adapter]] || no use cases || || ? || api || [[VersionThreeDotO/Foundations#multi-hit-api|Multi-hit API's]] || no use cases || || 2 || infrastructure || [[VersionThreeDotO/Foundations#separate-db-branch|Separate DB branch]] || in progress || || 3 || infrastructure || [[VersionThreeDotO/Foundations#continuous-integration-of-dependencies|Continuous Integration of Dependencies]] || || || 1 || ajax || [[VersionThreeDotO/Foundations#yuitest3|Yuitest3]] || in progress || || 3 || api || [[VersionThreeDotO/Foundations#api-notification-of-server-changes-on-update|API: Notification of Server Changes on Update]] || in progress || || 5 || openid || [[VersionThreeDotO/Foundations#account-creation|Account Creation]] || || || ? || api || [[VersionThreeDotO/Foundations#api-html-representation|API: HTML Representation]] || || || ? || api || [[VersionThreeDotO/Foundations#api-factory-optimization|API: Factory Optimization]] || || || 3 || openid || [[VersionThreeDotO/Foundations#read-only-launchpad|Read-only Launchpad]] || || || || infrastructure || [[VersionThreeDotO/Foundations#two-way-buildbot-communication|Two-way buildbot communication]] || || || || infrastructure || [[VersionThreeDotO/Foundations#merge-ec2-latent-slave-upstream|Merge EC2 latent slave upstream]] || in-progress || || 8 || infrastructure || [[VersionThreeDotO/Foundations#zc-buildout|Use zc.buildout for deployment]] || || || || ajax || [[VersionThreeDotO/Foundations#merge-javascript-tests|Automatic JavaScript test running]] || || || 3 || infrastructure || [[VersionThreeDotO/Foundations#initial-tree-layout|Initial tree layout]] || || || || openid || [[VersionThreeDotO/Foundations#ubuntuone-openid|Uses UbuntuOne OpenID]] || || || || openid || [[VersionThreeDotO/Foundations#launchpad-openid|Launchpad OpenID]] || || || || ajax || XXX Simple status editing || || || || infrastructure || XXX Sanitize the database dump || || || 8 || infrastructure || [[VersionThreeDotO/Foundations#site-wide-notifications|Site-wide notifications]] || || || 13 || infrastructure || [[VersionThreeDotO/Foundations#lazr-oops|lazr.oops]] || || || || infrastructure || XXX ZCML-less views (Martian integration) || || || || infrastructure || XXX Kill pagetitles.py || || || 5 || infrastructure || [[VersionThreeDotO/Foundations#spam-nomination|Nominating spam by users ]] || || || || infrastructure || XXX Update pagetests helpers to use lxml2 || || || 1 || openid || [[VersionThreeDotO/Foundations#sso-gpg-export|Export GPG keys through OpenId]] || || || || infrastructure || XXX Automatic decorator pattern (for performance) || || || || infrastructure || XXX Batch navigation to specific pages || || || || infrastructure || XXX Base tabular view || || || || infrastructure || XXX Librarian generation of OOPSes || || || || infrastructure || XXX Easily set up logging for scripts into a logfile || || || || infrastructure || XXX OOPS zip formats || || || || infrastructure || XXX Include log information in OOPS reports || || || || infrastructure || XXX Include currently running queries in OOPS reports || || || || infrastructure || XXX Include machine process status in OOPS reports || || || || infrastructure || XXX Design for content class split into facets || || || || infrastructure || XXX Upgrade to Python 2.5 || || || || infrastructure || [[VersionThreeDotO/Foundations#easy-a-b-testing|Easy A-B Testing]] || || || 3 || api || [[VersionThreeDotO/Foundations#api-delete-resource|DELETE resource]] || || || 1 || api || [[VersionThreeDotO/Foundations#launchpadlib-delete|delete() method in launchpadlib]] || || || 20 || api || [[VersionThreeDotO/Foundations#api-versioning|API Versioning]] || || || 8 || api || [[VersionThreeDotO/Foundations#expose-scoped-collections-factory|Expose factory methods for scoped collections]] || || || 5 || api || [[VersionThreeDotO/Foundations#expose-top-level-collections-factory|Expose factories as POST to collection]] || || || 5 || api || [[VersionThreeDotO/Foundations#collection-filter|Make it possible for the default GET on a collection to take optional arguments]] || || || || infrastructure || XXX lazr.testing.pages || || || || infrastructure || [[VersionThreeDotO/Foundations#spam-control-captcha|Spam control (via qualification mechanisms)]] || || || 8 || infrastructure || [[VersionThreeDotO/Foundations#graphing-plotting-framework|Simple graphing/plotting framework]] || || || || infrastructure || [[VersionThreeDotO/Foundations#lp-connection-limiting|LP Connection Limiting]] || || || || infrastructure || [[VersionThreeDotO/Foundations#gpg-activated-accounts|GPG-activated accounts]] || || || 20 || infrastructure || [[VersionThreeDotO/Foundations#wiki-markup-engine|Wiki markup engine]] || || || || infrastructure || Providing an API to update karma events with the object they operate on (Bug:ID, Branch:ID, etc) || || |
Line 77: | Line 85: |
== AJAX Track == <<Anchor(yuitest3)>> === Yuitest3 === **Story Points:** 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. <<Anchor(inline-text-editing)>> === Inline text editing === **Story Points:** 3 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') }}} <<Anchor(automatic-javascript-tests)>> === Automatic JavaScript test running === **Story Points:** As a Launchpad developer,\\ I want my Javascript tests automatically run by PQM on merge;\\ so that I can prevent regressions in Javascript code. **Notes:** * Need to record in the log which view was used in each request case. == API Track == <<Anchor(api-notification-of-server-changes-on-update)>> === API: Notification of Server Changes on Update ==== **Story Points:** 3 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. <<Anchor(api-html-representation)>> === API: HTML Representation ==== **Story Points:** 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. <<Anchor(api-factory-optimization)>> === API: Factory Optimization ==== **Story Points:** As webservice client,\\ I want the server to send me the created object representation when I use a factory operation;\\ so that I don't have to make another request to retrieve the created object. <<Anchor(api-delete-resource)>> === DELETE resource === **Story Points:** 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. <<Anchor(launchpadlib-delete)>> === delete() method in launchpadlib === **Story Points:** 1 As a launchpadlib user,\\ I can delete a resource by calling the delete() method on the appropriate object. **Notes:** * Resources supporting DELETE will be shown in the WADL file as having a <method> tag with a name of "DELETE". <<Anchor(expose-scoped-collections-factory)>> === Expose factory methods for scoped collections === **Story Points:** 8 As a developer,\\ I can annotate a method of an interface to be the method invoked when the client makes a POST request to a scoped collection;\\ so that the way to use a factory is consistent across resources. **Notes:** * Needs to represent scoped collection as resources in WADL. <<Anchor(expose-top-level-collections-factory)>> === Expose factories as POST to collection === **Story Points:** 5 As a developer, \\ I can annotate one of a FooSet interface's methods to be the method invoked when the client makes a POST request;\\ so that the way to use a factory is consistent across resoureces. **Notes:** * `PersonSet` POST must include a description of whether you're creating a person or team; or, we must expose seperate collections for people and teams, and you POST to the appropriate one. * Updating existing Set to annotate default factory. <<Anchor(collection-filter)>> === Make it possible for the default GET on a collection to take optional arguments === **Story Points:** 5 As a developer,\\ I want operation parameters to be supported in the default GET method for a collection;\\ so that users can use the same HTTP operation to retrieve all of the collection or a filtered subset. **Notes:** * add methods to eg. IPersonSet that work with this system * add a method to launchpadlib * update the generated adapter find() signature and implementation <<Anchor(api-versioning)>> === API Versioning === **Story Points:** 20 As a developer,\\ I want to be able to annotate certain aspects of the API as being removed from a particular version onward;\\ so that I can make backward incompatible change. **Notes:** {{{ @export_factory_method_as('new_team', version=3) def new_team_all(...): }}} * Only necessary when we need to break backwards compatibility * what can be versioned: resource type, operations, fields. * list of ordered version number. <<Anchor(multi-hit-api)>> === Multi-Hit API === **Story Points:** 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:** == OpenID Track == <<Anchor(sso-authentication-during-upgrade)>> === SSO Authentication available during upgrade === **Story Points:** 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. <<Anchor(account-creation)>> === Account Creation=== **Story Points:** 5 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). <<Anchor(read-only-launchpad)>> === Read-only Launchpad ==== **Story Points:** 3 As a Launchpad user, \\ I want to be able to browse launchpad during an upgrade;\\ so that I can continue to read information. **Notes:** * Detect unavailability and use Retry and DBPolicy to handle fail-over. * Error messages on write and master not-available. * No need to persist the failover situation since it is likely to only delay writes that are going to fail. * Librarian should also be available. <<Anchor(ubuntuone-openid)>> === Uses UbuntuOne OpenID ==== **Story Points:** As a Canonical sysadmin,\\ I want Launchpad to use openid to authenticate its users through UbuntuOne;\\ so that there is a single authentication system in Canonical. <<Anchor(launchpad-openid)>> === Launchpad OpenID ==== **Story Points:** As a Launchpad user,\\ I want to be able to register OpenID accounts I own in Launchpad and uses it to log in Lauchpad for non-privileged operation;\\ so that I can uses Launchpad without having to create an account on UbuntuOne. <<Anchor(sso-gpg-export)>> === Export GPG keys through OpenId === **Story Points:** 1 As a relaying party,\\ I want to be able to retrieve GPG keys associated with the user during openid authentication; \\ so that I can pre-populate their account information. **Notes:** * Define a sreg extension. * Not much point in going to openid.ax for this. == Infrastructure Track == <<Anchor(lazr.config)>> === 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? <<Anchor(5-minutes-pqm-merge)>> === 5 minutes PQM merge Theme === **Story Points:** 8 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. * Deploy on devpad running slave on demand in ec2. <<Anchor(buildbot-ec2slave)>> === Buildbot EC2 Slave === **Story Points:** 5 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. <<Anchor(merge-ec2-latent-slave-upstream)>> === Merge EC2 latent slave upstream === **Story Points:** As a Launchpad developer,\\ I want our ec2 latent slave code merged upstream;\\ so that it can be maintained by the community. <<Anchor(separate-db-branch)>> === Separate DB branch === **Story Points:** 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). <<Anchor(zc-buildout)>> === Use zc.buildout for deployment === **Story Points:** 8 As a Launchpad developer,\\ I want to be able to add a CheeseShop python library by adding a simple dependency to our configuration;\\ so that I can use and deploy easily non-packaged python library without involving IS. **Notes:** * Unpackaged eggs. * Maintain a binary cache in version control (so that eggs are not fetched over the package.) * Only packages not changed from upstream and already in the cheeseshop <<Anchor(initial-tree-layout)>> === Initial Tree layout improvements === **Story Points:** 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. <<Anchor(continuous-integration-of-dependencies)>> === Continuous Integration of Dependencies === **Story Points:** 3 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. <<Anchor(two-way-buildbot-communication)>> === Two-way buildbot communication === **Story Points:** As a LOSA, \\ I want the buildbot slave to accept connection from the master instead of contacting the master; \\ so that the network rules are safer to configure. <<Anchor(lazr-oops)>> === lazr.oops === **Story Points:** 13 As python web developer,\\ I want to download lazr.oops from the Cheeseshop;\\ so that I can have detailed diagnostic reports of problems on my web application. **Notes:** * Documentation. * Extract the OOPS system from Launchpad * Refactor oops tools and system for extensible format (integrate changes from Landscape and ubunet) * lp:~ubunet-pqm-team/ubunet/wsgi-oops * Make pluggable extension for database logging. * Setup-tools and all release-related stuff. <<Anchor(site-wide-notifications)>> === Site-wide notifications === **Story Points:** 8 As a Launchpad administrator,\\ I want to be able to post notifications to users that they will see on every page and can acknowledge;\\ so that I can announce downtime and other general service-related announcement. **Notes:** * Simple on/off setting. * Acknowledgment in database. |
|
Line 78: | Line 540: |
== Simple graphing/plotting framework == | === Simple graphing/plotting framework === |
Line 95: | Line 557: |
<<Anchor(zc-buildout)>> == Use zc.buildout for deployment == **Story Points:** 8 As a Launchpad developer,\\ I want to be able to add a CheeseShop python library by adding a simple dependency to our configuration;\\ so that I can use and deploy easily non-packaged python library without involving IS. **Notes:** * Unpackaged eggs. * Maintain a binary cache in version control (so that eggs are not fetched over the package.) * Only packages not changed from upstream and already in the cheeseshop <<Anchor(tree-layout)>> == Tree layout improvements == **Story Points:** 3 As a Launchpad developer,\\ I want to be able to find the pagetests related to a particular application;\\ so that I can easily run the pagetests while I work on an application. **Notes:** * Moving existing directory by applications. <<Anchor(lazr-oops)>> == lazr.oops == **Story Points:** 13 As python web developer,\\ I want to download lazr.oops from the Cheeseshop;\\ so that I can have detailed diagnostic reports of problems on my web application. **Notes:** * Documentation. * Extract the OOPS system from Launchpad * Refactor oops tools and system for extensible format (integrate changes from Landscape) * Make pluggable extension for database logging. * Setup-tools and all release-related stuff. <<Anchor(lazr.config)>> == lazr.config == **Story Points:** 3 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? <<Anchor(api-versioning)>> == API Versioning == **Story Points:** 20 As a developer,\\ I want to be able to annotate certain aspects of the API as being removed from a particular version onward;\\ so that I can make backward incompatible change. **Notes:** {{{ @export_factory_method_as('new_team', version=3) def new_team_all(...): }}} * Only necessary when we need to break backwards compatibility * what can be versioned: resource type, operations, fields. * list of ordered version number. |
|
Line 187: | Line 558: |
== Wiki markup engine == | === Wiki markup engine === |
Line 205: | Line 576: |
<<Anchor(site-wide-notifications)>> == Site-wide notifications == **Story Points:** 8 As a Launchpad administrator,\\ I want to be able to post notifications to users that they will see on every page and can acknowledge;\\ so that I can announce downtime and other general service-related announcement. **Notes:** * Simple on/off setting. * Acknowledgment in database. <<Anchor(expose-scoped-collections-factory)>> == Expose factory methods for scoped collections == **Story Points:** 8 As a developer,\\ I can annotate a method of an interface to be the method invoked when the client makes a POST request to a scoped collection;\\ so that the way to use a factory is consistent across resources. **Notes:** * Needs to represent scoped collection as resources in WADL. <<Anchor(expose-top-level-collections-factory)>> == Expose factories as POST to collection == **Story Points:** 5 As a developer, \\ I can annotate one of a FooSet interface's methods to be the method invoked when the client makes a POST request;\\ so that the way to use a factory is consistent across resoureces. **Notes:** * `PersonSet` POST must include a description of whether you're creating a person or team; or, we must expose seperate collections for people and teams, and you POST to the appropriate one. * Updating existing Set to annotate default factory. |
|
Line 253: | Line 577: |
== Nominating spam by users == | === Nominating spam by users === |
Line 271: | Line 595: |
<<Anchor(collection-filter)>> == Make it possible for the default GET on a collection to take optional arguments == **Story Points:** 5 As a developer,\\ I want operation parameters to be supported in the default GET method for a collection;\\ so that users can use the same HTTP operation to retrieve all of the collection or a filtered subset. **Notes:** * add methods to eg. IPersonSet that work with this system * add a method to launchpadlib * update the generated adapter find() signature and implementation <<Anchor(api-delete-resource)>> == DELETE resource == **Story Points:** 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. <<Anchor(mutator-as-writable-attribute)>> == Export mutators as writable attributes == **Story Points:** 3 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. <<Anchor(sso-gpg-export)>> == Export GPG keys through OpenId == **Story Points:** 1 As a relaying party,\\ I want to be able to retrieve GPG keys associated with the user during openid authentication; \\ so that I can pre-populate their account information. **Notes:** * Define a sreg extension. * Not much point in going to openid.ax for this. <<Anchor(launchpadlib-delete)>> == delete() method in launchpadlib == **Story Points:** 1 As a launchpadlib user,\\ I can delete a resource by calling the delete() method on the appropriate object. **Notes:** * Resources supporting DELETE will be shown in the WADL file as having a <method> tag with a name of "DELETE". |
|
Line 346: | Line 597: |
== Spam control (via qualification mechanisms) == | === Spam control (via qualification mechanisms) === |
Line 360: | Line 611: |
== LP Connection Limiting == | === LP Connection Limiting === |
Line 377: | Line 628: |
== GPG-activated accounts == | === GPG-activated accounts === |
Line 390: | Line 641: |
<<Anchor(inline-text-editing)>> === Inline text editing === **Story Points:** 3 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') }}} <<Anchor(5-minutes-pqm-merge)>> === 5 minutes PQM merge Theme === **Story Points:** 8 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. <<Anchor(ec2-test-runner)>> === EC2 Test Runner === **Story Points:** ? 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. <<Anchor(person-account-separation)>> === Person/Account Separation === **Story Points:** ? 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. <<Anchor(sso-authentication-during-upgrade)>> === SSO Authentication available during upgrade === 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. <<Anchor(api-customized-auto-generated-adapter)>> === 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. <<Anchor(multi-hit-api)>> === Multi-Hit API === **Story Points:** 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:** |
|
Line 488: | Line 654: |
<<Anchor(automatic-javascript-tests)>> === Automatic JavaScript test running === **Story Points:** As a Launchpad developer,\\ I want my Javascript tests automatically run by PQM on merge;\\ so that I can prevent regressions in Javascript code. **Notes:** * Need to record in the log which view was used in each request case. <<Anchor(prepopulating-ajax-cache)>> === Prepopulating AJAX cache === **Story Points:** ? **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. <<Anchor(entry-etag)>> === Entry ETag === **Story Points:** **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. <<Anchor(lazr-js-green-flash)>> === LAZR-JS Green Flash === **Story Points:** **Bug:** As a Canonical JS developer,\\ I want to be able to use a standard green flash animation for\\ when data has been saved successfully. <<Anchor(lazr-js-framework)>> === Lazr-JS Project Bootstrap === **Story Points:** **Bug:** 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. <<Anchor(lazr-js-reference-widget)>> === Lazr-JS Reference Widget === **Story Points:** **Bug:** 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. <<Anchor(lazr-js-error-widget)>> === Lazr-JS Error Widget === **Story Points:** **Bug:** 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. |
Priorities for the Foundations team
SP | Track | Feature | Delivered |
3 | api | Make API Cacheable | 2.1.9 |
3 | api | Make API Cacheable - client side | 2.1.9 |
1 | ajax | YUI Integration | 2.1.10 |
5 | ajax | JavaScript Testing | 2.1.10 |
5 | ajax | API JS Access | 2.1.10 |
8 | ajax | Initial API JavaScript Library | 2.1.10 |
8 | infrastructure | Zope 3.4 Upgrade | 2.1.10 |
2 | openid | Login-freshness OpenID extension | 2.1.11 |
2 | api | AJAX PATCH | 2.1.11 |
1 | openid | Configure access to private teams in +rpconfig | 2.1.11 |
3 | ajax | Prepopulating AJAX cache | 2.2.1 |
3 | api | Entry ETag | 2.1.12 |
8 | intrastructure | 5 minutes PQM merge | 2.1.12 |
3 | infrastructure | EC2 Test Runner | 2.1.12 |
1 | ajax | Lazr-JS Project Bootstrap | 2.2.1 |
5 | ajax | Lazr-JS Reference Widget | 2.1.12 |
2 | ajax | Lazr-JS Green Flash | 2.1.12 |
3 | infrastructure | lazr.config | 2.1.12 |
3 | api | Export mutators as writable attributes | 2.1.12 |
3 | openid | SSO Authentication available during upgrade | in-progress |
3 | infrastructure | Buildbot EC2 Slave | in-progress |
5 | ajax | Lazr Error Widget | no use case |
3 | ajax | Inline text editing | in-progress |
? | api | API customized auto-generated adapter | no use cases |
? | api | Multi-hit API's | no use cases |
2 | infrastructure | Separate DB branch | in progress |
3 | infrastructure | Continuous Integration of Dependencies | |
1 | ajax | Yuitest3 | in progress |
3 | api | API: Notification of Server Changes on Update | in progress |
5 | openid | Account Creation | |
? | api | API: HTML Representation | |
? | api | API: Factory Optimization | |
3 | openid | Read-only Launchpad | |
infrastructure | Two-way buildbot communication | ||
infrastructure | Merge EC2 latent slave upstream | in-progress | |
8 | infrastructure | Use zc.buildout for deployment | |
ajax | Automatic JavaScript test running | ||
3 | infrastructure | Initial tree layout | |
openid | Uses UbuntuOne OpenID | ||
openid | Launchpad OpenID | ||
ajax | XXX Simple status editing | ||
infrastructure | XXX Sanitize the database dump | ||
8 | infrastructure | Site-wide notifications | |
13 | infrastructure | lazr.oops | |
infrastructure | XXX ZCML-less views (Martian integration) | ||
infrastructure | XXX Kill pagetitles.py | ||
5 | infrastructure | Nominating spam by users | |
infrastructure | XXX Update pagetests helpers to use lxml2 | ||
1 | openid | Export GPG keys through OpenId | |
infrastructure | XXX Automatic decorator pattern (for performance) | ||
infrastructure | XXX Batch navigation to specific pages | ||
infrastructure | XXX Base tabular view | ||
infrastructure | XXX Librarian generation of OOPSes | ||
infrastructure | XXX Easily set up logging for scripts into a logfile | ||
infrastructure | XXX OOPS zip formats | ||
infrastructure | XXX Include log information in OOPS reports | ||
infrastructure | XXX Include currently running queries in OOPS reports | ||
infrastructure | XXX Include machine process status in OOPS reports | ||
infrastructure | XXX Design for content class split into facets | ||
infrastructure | XXX Upgrade to Python 2.5 | ||
infrastructure | Easy A-B Testing | ||
3 | api | DELETE resource | |
1 | api | delete() method in launchpadlib | |
20 | api | API Versioning | |
8 | api | Expose factory methods for scoped collections | |
5 | api | Expose factories as POST to collection | |
5 | api | Make it possible for the default GET on a collection to take optional arguments | |
infrastructure | XXX lazr.testing.pages | ||
infrastructure | Spam control (via qualification mechanisms) | ||
8 | infrastructure | Simple graphing/plotting framework | |
infrastructure | LP Connection Limiting | ||
infrastructure | GPG-activated accounts | ||
20 | infrastructure | Wiki markup engine | |
infrastructure | Providing an API to update karma events with the object they operate on (Bug:ID, Branch:ID, etc) |
User Stories
This section contains the story cards for the above.
AJAX Track
Yuitest3
Story Points: 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.
Inline text editing
Story Points: 3
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') }}}
Automatic JavaScript test running
Story Points:
As a Launchpad developer,
I want my Javascript tests automatically run by PQM on merge;
so that I can prevent regressions in Javascript code.
Notes:
- Need to record in the log which view was used in each request case.
API Track
API: Notification of Server Changes on Update
Story Points: 3
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:
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: Factory Optimization
Story Points:
As webservice client,
I want the server to send me the created object representation when I use a factory operation;
so that I don't have to make another request to retrieve the created object.
DELETE resource
Story Points: 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() method in launchpadlib
Story Points: 1
As a launchpadlib user,
I can delete a resource by calling the delete() method on the appropriate object.
Notes:
- Resources supporting DELETE will be shown in the WADL file as having a <method> tag with a name of "DELETE".
Expose factory methods for scoped collections
Story Points: 8
As a developer,
I can annotate a method of an interface to be the method invoked when the client makes a POST request to a scoped collection;
so that the way to use a factory is consistent across resources.
Notes:
- Needs to represent scoped collection as resources in WADL.
Expose factories as POST to collection
Story Points: 5
As a developer,
I can annotate one of a FooSet interface's methods to be the method invoked when the client makes a POST request;
so that the way to use a factory is consistent across resoureces.
Notes:
- `PersonSet` POST must include a description of whether you're creating a person or team; or, we must expose seperate collections for people and teams, and you POST to the appropriate one.
- Updating existing Set to annotate default factory.
Make it possible for the default GET on a collection to take optional arguments
Story Points: 5
As a developer,
I want operation parameters to be supported in the default GET method for a collection;
so that users can use the same HTTP operation to retrieve all of the collection or a filtered subset.
Notes:
- add methods to eg. IPersonSet that work with this system
- add a method to launchpadlib
- update the generated adapter find() signature and implementation
API Versioning
Story Points: 20
As a developer,
I want to be able to annotate certain aspects of the API as being removed from a particular version onward;
so that I can make backward incompatible change.
Notes:
{{{ @export_factory_method_as('new_team', version=3) def new_team_all(...): }}}
- Only necessary when we need to break backwards compatibility
- what can be versioned: resource type, operations, fields.
- list of ordered version number.
Multi-Hit API
Story Points:
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:
OpenID Track
SSO Authentication available during upgrade
Story Points: 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
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).
Read-only Launchpad
Story Points: 3
As a Launchpad user,
I want to be able to browse launchpad during an upgrade;
so that I can continue to read information.
Notes:
- Detect unavailability and use Retry and DBPolicy to handle fail-over.
- Error messages on write and master not-available.
- No need to persist the failover situation since it is likely to only delay writes that are going to fail.
- Librarian should also be available.
Uses UbuntuOne OpenID
Story Points:
As a Canonical sysadmin,
I want Launchpad to use openid to authenticate its users through UbuntuOne;
so that there is a single authentication system in Canonical.
Launchpad OpenID
Story Points:
As a Launchpad user,
I want to be able to register OpenID accounts I own in Launchpad and uses it to log in Lauchpad for non-privileged operation;
so that I can uses Launchpad without having to create an account on UbuntuOne.
Export GPG keys through OpenId
Story Points: 1
As a relaying party,
I want to be able to retrieve GPG keys associated with the user during openid authentication;
so that I can pre-populate their account information.
Notes:
- Define a sreg extension.
- Not much point in going to openid.ax for this.
Infrastructure Track
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 Theme
Story Points: 8
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.
- Deploy on devpad running slave on demand in ec2.
Buildbot EC2 Slave
Story Points: 5
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:
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
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).
Use zc.buildout for deployment
Story Points: 8
As a Launchpad developer,
I want to be able to add a CheeseShop python library by adding a simple dependency to our configuration;
so that I can use and deploy easily non-packaged python library without involving IS.
Notes:
- Unpackaged eggs.
- Maintain a binary cache in version control (so that eggs are not fetched over the package.)
- Only packages not changed from upstream and already in the cheeseshop
Initial Tree layout improvements
Story Points: 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.
Continuous Integration of Dependencies
Story Points: 3
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.
Two-way buildbot communication
Story Points:
As a LOSA,
I want the buildbot slave to accept connection from the master instead of contacting the master;
so that the network rules are safer to configure.
lazr.oops
Story Points: 13
As python web developer,
I want to download lazr.oops from the Cheeseshop;
so that I can have detailed diagnostic reports of problems on my web application.
Notes:
- Documentation.
- Extract the OOPS system from Launchpad
- Refactor oops tools and system for extensible format (integrate changes from Landscape and ubunet)
- lp:ubunet-pqm-team/ubunet/wsgi-oops
- Make pluggable extension for database logging.
- Setup-tools and all release-related stuff.
Site-wide notifications
Story Points: 8
As a Launchpad administrator,
I want to be able to post notifications to users that they will see on every page and can acknowledge;
so that I can announce downtime and other general service-related announcement.
Notes:
- Simple on/off setting.
- Acknowledgment in database.
Simple graphing/plotting framework
Story Points: 8
As a mailing list user,
I want to see the number of mailing list posts over time in a graph;
so that I can have an idea of the number of emails I might get when subscribing to the list.
Notes:
- Server-side generation or client-side? (use cases for both)
- Hard work in generating and cleaning up the data.
- Cron script parse the archive.
- Though not a perfect use-case for sparklines the concept is the same in that we need graph creation support.
Wiki markup engine
Story Points: 20
As a Launchpad user,
I want to be able to enter wiki-like syntax to have rich-text formatting in project description (as well as bug, questions, and comments);
So that I can use typography to convey emphasis and format code-samples properly
Notes:
- How users will discover?
- Requires content-type.
- Preview button?
- Full-text indexing?
- How will the markup come out in the web service or +text?
Nominating spam by users
Story Points: 5
As a Launchpad user,
I want to be able to report any user-editable content as SPAM;
so that Launchpad admins can remove it.
Notes:
- Button sends an email with who clicked the button and the link to the content.
- Standard button on IUserGeneratedContent pages, which fire an event. As a start, the event subscriber will just send an email to a specific team / email
- Mark all spammable content objects and integrate the button in the templates.
Spam control (via qualification mechanisms)
Story Points: ??
As Launchpad,
I ask every new non-qualified users to enter a captcha on every form;
so that robots cannot post SPAM automatically.
Notes:
- Might hinder LP use.
- How is somebody qualified?
LP Connection Limiting
Story Points: ??
As a XXX,
I want XXX;
so that XXX.
Notes:
- We should adapt some code that gustavo wrote for landscape to limit the connections that are accepted from the network into the webapp based on the size of the queue of connections waiting for app threads. That will keep launchpad responsive even in situations that look like the one described by tom in bug 224623.
GPG-activated accounts
Story Points: ??
As a XXX,
I want XXX;
so that XXX.
Notes:
- Allowing for people with GPG keys to be considered valid even without them actually having passwords.
Easy A-B Testing
Story Points:
As a launchpad developer,
I want to be able to configure two different views to be served from the same URL, each user receiving a random one;
so that I can easily do A-B testing.
Notes:
- Need to record in the log which view was used in each request case.