Diff for "VersionThreeDotO/Foundations"

Not logged in - Log In / Register

Differences between revisions 9 and 35 (spanning 26 versions)
Revision 9 as of 2009-01-11 21:28:53
Size: 16854
Editor: flacoste
Comment:
Revision 35 as of 2009-04-29 14:00:24
Size: 24461
Editor: leonardr
Comment:
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 ||
|| ? || [[/Delivered#prepopulating-ajax-cache|Prepopulating AJAX cache]] || 2.2.1 ||
|| ? || [[/Delivered#entry-etag|Entry ETag]] || 2.1.12 ||
|| 8 || [[VersionThreeDotO/Foundations#5-minutes-pqm-merge|5 minutes PQM merge]] || in-progress ||
|| ? || [[/Delivered#ec2-test-runner| EC2 Test Runner]] || 2.1.12 ||
|| ? || [[VersionThreeDotO/Foundations#person-account-separation|Person/Account Separation]] || ||
|| ? || [[/Delivered#lazr-js-framework|Lazr-JS Project Bootstrap]] || 2.2.1 ||
|| ? || [[/Delivered#lazr-js-reference-widget|Lazr-JS Reference Widget ]] || 2.1.12 ||
|| ? || [[/Delivered#lazr-js-green-flash|Lazr-JS Green Flash]] || 2.1.12 ||
|| 3 || [[/Delivered#lazr.config|lazr.config]] || 2.1.12 ||
|| ? || [[VersionThreeDotO/Foundations#sso-authentication-during-upgrade|SSO Authentication available during upgrade]] || in-progress ||
|| ? || [[/Delivered#lazr-js-error-widget|Lazr Error Widget]] || obsolete ||
|| 3 || [[VersionThreeDotO/Foundations#inline-text-editing|Inline text editing]] || in-progress ||
|| || [[/Delivered#api-customized-auto-generated-adapter|API customized auto-generated adapter]] || no use cases ||
|| || [[VersionThreeDotO/Foundations#multi-hit-api|Multi-hit API's]] || in progress ||
|| 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 || ||
|| 1 || [[VersionThreeDotO/Foundations#sso-gpg-export|Export GPG keys through OpenId]] || ||
|| || XXX Automatic decorator pattern (for performance) || ||
|| || 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 || [[/Delivered#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 || [[/Delivered#sso-authentication-during-upgrade|SSO Authentication available during upgrade]] || 2.2.3 ||
|| 3 || infrastructure|| [[/Delivered#buildbot-ec2slave|Buildbot EC2 Slave]] || 2.2.1 ||
|| 5 || ajax || [[/Delivered#lazr-js-error-widget|Lazr Error Widget]] || no use case ||
|| 3 || ajax || [[/Delivered#inline-text-editing|Inline text editing]] || 2.2.2 ||
|| ? || api || [[/Delivered#api-customized-auto-generated-adapter|API customized auto-generated adapter]] || no use cases ||
|| ? || api || [[/Delivered#multi-hit-api|Multi-hit API's]] || no use cases ||
|| 2 || infrastructure || [[/Delivered#separate-db-branch|Separate DB branch]] || 2.2.2 ||
|| 1 || ajax || [[/Delivered#yuitest3|Yuitest3]] || 2.2.1 ||
|| 3 || api || [[/Delivered#api-notification-of-server-changes-on-update|API: Notification of Server Changes on Update]] || 2.2.2 ||
|| 3 || infrastructure || [[/Delivered#continuous-integration-of-dependencies|Continuous Integration of Dependencies]] || 2.2.2 ||
|| 3 || openid || [[VersionThreeDotO/Foundations#read-only-launchpad|Read-only Launchpad]] || in-progress ||
|| 5 || openid || [[/Delivered#account-creation|Account Creation]] || 2.2.3 (salgado) ||
|| ? || api || [[/Delivered#api-html-representation|API: HTML Representation]] || 2.2.2 ||
|| ? || ajax || [[/Delivered#lazr-popup|LAZR Popup]] || 2.2.2 ||
|| ? || api || [[/Delivered#api-field-resource|Field Resource]] || 2.2.3 ||
|| ? || api || [[/Delivered#lazr-restful|lazr.restful]] || 2.2.3 ||
|| ? || api || [[VersionThreeDotO/Foundations#lazr-restful|lazr.restfulclient]] || in-progress ||
|| 3 || api || [[/Delivered#api-vocabulary|Field Resource Vocabulary]] || 2.2.4 ||
|| 8 || api || [[VersionThreeDotO/Foundations#api-vocabulary-search|Field Resource Vocabulary Search]] || ||
|| || ajax || [[VersionThreeDotO/Foundations#inline-status-editing|Inline status editing]] || in-progress (intellectronica) ||
|| || infrastructure || [[/Delivered#merge-ec2-latent-slave-upstream|Merge EC2 latent slave upstream]] || 2.2.1 ||
|| || infrastructure || [[/Delivered#5-minutes-PQM-for-dependencies|5 minutes PQM for dependencies]] || obsolete ||
|| 8 || infrastructure || [[VersionThreeDotO/Foundations#zc-buildout|Use zc.buildout for deployment]] || in-progress ||
|| 5 || ajax || [[VersionThreeDotO/Foundations#inline-multi-line-editing|Inline multi-line editing]] || in-progress ||
|| 3 || infrastructure || [[/Delivered#initial-tree-layout|Initial tree layout]] || 2.2.3 ||
|| 3 || api || [[/Delivered#api-delete-resource|DELETE resource]] || 2.2.3 ||
|| || openid || [[VersionThreeDotO/Foundations#ubuntuone-openid-server|UbuntuOne OpenID Server]] || in-progress (jamesh) ||
|| || ajax || [[VersionThreeDotO/Foundations#inline-autocomplete-widget|Inline autocomplete widget]] || in-progress ||
|| 2 || infrastructure || [[VersionThreeDotO/Foundations#sanitized-dbdump|Sanitized DB Dump]] || ||
|| 3 || infrastructure || [[VersionThreeDotO/Foundations#ec2run|ec2run]] || ||
|| 5 || ajax || [[VersionThreeDotO/Foundations#automatic-javascript-tests|Automatic JavaScript test running]] || ||
|| 3 || openid || [[VersionThreeDotO/Foundations#launchpad-ubuntuone-openid|Launchpad Uses UbuntuOne OpenID]] || ||
|| 3 || openid || [[VersionThreeDotO/Foundations#launchpad-openid-management|Launchpad OpenID Management]] || ||
|| || openid || [[VersionThreeDotO/Foundations#launchpad-openid-login|Launchpad OpenID Login]] || ||
|| || openid || [[VersionThreeDotO/Foundations#launchpad-restricted-openid|Restricting Operations to UbuntuOne Account ]] || ||
|| || infrastructure || [[VersionThreeDotO/Foundations#batch-navigator-privacy-support|Support Privacy in Batch Navigator]] || ||
|| || infrastructure || [[VersionThreeDotO/Foundations#security-cache-api|Security Cache API]] || ||
|| 3 || infrastructure || [[VersionThreeDotO/Foundations#two-way-buildbot-communication|Two-way buildbot communication]] || ||
|| ? || api || [[VersionThreeDotO/Foundations#api-factory-optimization|API: Factory Optimization]] || ||
|| || infrastructure || [[VersionThreeDotO/Foundations#page-inventory|Page Inventory]] || ||
|| 13 || infrastructure || [[VersionThreeDotO/Foundations#lazr-oops|lazr.oops]] || ||
|| 1 || api || [[VersionThreeDotO/Foundations#launchpadlib-delete|delete() method in launchpadlib]] || ||
|| 8 || infrastructure || [[VersionThreeDotO/Foundations#site-wide-notifications|Site-wide notifications]] || ||
|| || api || [[VersionThreeDotO/Foundations#restful-wsgi|RESTful WSGI]] || ||
|| || 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 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]] || ||
|| 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 101:
<<Anchor(graphing-plotting-framework)>>
== Simple graphing/plotting framework ==

== AJAX Track ==


<<Anchor(inline-status-editing)>>
=== Inline status editing ===

  **Story Points:**

  As a Launchpad developer,\\
  I want a way to associate an inline widget with the rendered element
  of a status field in view;\\
  so that I can easily add inline editing to any enum field.

  **Notes:**

<<Anchor(inline-multi-line-editing)>>
=== Inline multi-line editing ===

  **Story Points:** 5

  As a Launchpad developer,\\
  I want a way to associate an inline widget with the rendered element
  of a multi-line text field in view;\\
  so that I can easily add inline editing to text field.

  **Notes:**
   * Might contain dynamic sizing.

<<Anchor(inline-autocomplete-widget)>>
=== Inline autocomplete widget ===

  **Story Points:**

  As a Launchpad developer,\\
  I want a way to associate an inline widget with the rendered element
  of a vocabulary field in view;\\
  so that I can easily add inline editing to any Choice field using a HugeVocabulary.

<<Anchor(automatic-javascript-tests)>>
=== Automatic JavaScript test running ===

  **Story Points:** 5

  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:**
    * ec2test integration.
    * Need to run firefox headless.
    * Probably use the yuitest reporting.
    * Need to write a "testrunner" around windmill.
    * Add to buildbot.

<<Anchor(widget-instrumentation-api)>>
=== Widget Instrumentation API ===

  **Story Points:**

  As a Launchpad developer,\\
  I want a standard API to record user behavior;\\
  so that usability metric can be recorded for the widget I write.


== API Track ==

<<Anchor(lazr-restfulclient)>>
=== lazr.restfulclient ===

  **Story Points:**

  As Python developer,\\
  I want to download lazr.restfulclient from the Cheeseshop;\\
  so that I can add easily create a python frontend to my lazr.restful-based web service.

  **Notes:**

<<Anchor(api-vocabulary-search)>>
=== API: Field Resource Vocabulary Search ====
Line 82: Line 184:
  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.
  As a webservice client,\\
  I want to be able to make queries on a field resource vocabulary;\\
  so that I can present a search form to select valid values in an
  AJAX client.

  **Notes**:

    * Searching with a maximum (no batching).
    * Custom operation.
    * WADL representation.
    * Launchpadlib integration.
    * JS integration.

<<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(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(restful-wsgi)>>
=== restful.wsgi ===

  **Story Points:**

  As a Python developer,\\
  I want to hook up a RESTful web service to my WSGI application;\\
  so that I don't have to learn Zope arcana and add a Zope request handler to my application.

  **Notes:**


== OpenID Track ==

<<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-server)>>
=== UbuntuOne OpenID Server ====

  **Story Points:**

  As a UbuntuOne manager,\\
  I want to run a separate Launchpad OpenID server;\\
  so that I can use OpenID for my applications using a consistent brand.


<<Anchor(launchpad-ubuntuone-openid)>>
=== Launchpad Uses UbuntuOne OpenID ====

  **Story Points:** 3

  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-management)>>
=== Launchpad OpenID Management ====

  **Story Points:** 3

  As a Launchpad user, I want to be able to manage OpenID accounts I\\
  own in Launchpad; so that my profile lists known identities.

  * Notes:
    * Adding/Removing in profile.
    * Validate the accounts.
    * Design issues: wouldn't this be better handled in the SSO?
    * Talk to Martin about designing the workflow.


<<Anchor(launchpad-openid-login)>>
=== Launchpad OpenID Login ====

  **Story Points:** ?

  As a user, I want to be able to register and log in Launchpad using a
  in Launchpad using any of OpenID identities; so that I don't have to create
  another account to use Launchpad.

  * Notes:
    * Claiming a person record.
    * Login


<<Anchor(launchpad-restricted-openid)>>
=== Restricting Operations to UbuntuOne Account ====

  **Story Points:** ?

  As a Launchpad Administrator,\\
  I want administrative operations on Launchpad and Ubuntu to be restricted
  to users logged in through their UbuntuOne account;\\
  so that we aren't vulnerable to third party OpenID servers bugs.


<<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 ==
Line 96: Line 401:
== Use zc.buildout for deployment == === Use zc.buildout for deployment ===
Line 113: Line 418:
<<Anchor(tree-layout)>>
== Tree layout improvements ==
<<Anchor(ec2run)>>
=== ec2run ===
Line 119: Line 424:
  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.
  I want a script that will fire an EC2 instance with a running instance
  of Launchpad based on a specified branch;\\
  so that reviewers can preview the branch without downloading the branch.

  **Notes:**


<<Anchor(sanitized-dbdump)>>
=== Sanitized DB Dump ===

  **Story Points:** 2

  As a Launchpad developer,\\
  I want a sanitized production DB dump available;\\
  so that I can preview my branches using real-world data and do more sensible performance testing.

  **Notes:**

<<Anchor(two-way-buildbot-communication)>>
=== Two-way buildbot communication ===

  **Story Points:** 3

  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.
Line 128: Line 453:
== lazr.oops == === lazr.oops ===
Line 147: Line 472:
<<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.
<<Anchor(batch-navigator-privacy-support)>>
=== Support Privacy in Batch Navigator ===

  **Story Points:**

  As a Launchpad developer,\\
  I want the BatchNavigator to filter out objects that the user doesn't have permission to;\\
  so that it gives a coherent view of the set and that I don't have to filter out the objects in the view.

  **Notes:**
   * [[https://bugs.edge.launchpad.net/launchpad-foundations/+bug/324550|bug #324550]]


<<Anchor(security-cache-api)>>
=== Security Cache API ===

  **Story Points:**

  As a Launchpad developer,\\
  I want an API to declare to the security policy that the user has a specific permission on a set of objects; \\
  so that it doesn't need to check for the permission again and improve performance.

  **Notes:**
   * [[https://bugs.edge.launchpad.net/launchpad-foundations/+bug/324546|bug #324546]]


<<Anchor(page-inventory)>>
== Page Inventory ==

  **Story Points:**

  As a Launchpad developer,\\
  I want an automatic inventory of the pages published by Launchpad;\\
  so that I can track pages that needs updating or that I want to get rid of.


<<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(graphing-plotting-framework)>>
=== 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.
Line 188: Line 543:
== Wiki markup engine == === Wiki markup engine ===
Line 206: Line 561:
<<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 254: Line 562:
== Nominating spam by users == === Nominating spam by users ===
Line 272: Line 580:
<<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 347: Line 582:
== Spam control (via qualification mechanisms) == === Spam control (via qualification mechanisms) ===
Line 361: Line 596:
== LP Connection Limiting == === LP Connection Limiting ===
Line 378: Line 613:
== GPG-activated accounts == === GPG-activated accounts ===
Line 391: Line 626:

<<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(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(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 453: Line 639:

<<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.

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 2.2.3
3 infrastructure Buildbot EC2 Slave 2.2.1
5 ajax Lazr Error Widget no use case
3 ajax Inline text editing 2.2.2
? api API customized auto-generated adapter no use cases
? api Multi-hit API's no use cases
2 infrastructure Separate DB branch 2.2.2
1 ajax Yuitest3 2.2.1
3 api API: Notification of Server Changes on Update 2.2.2
3 infrastructure Continuous Integration of Dependencies 2.2.2
3 openid Read-only Launchpad in-progress
5 openid Account Creation 2.2.3 (salgado)
? api API: HTML Representation 2.2.2
? ajax LAZR Popup 2.2.2
? api Field Resource 2.2.3
? api lazr.restful 2.2.3
? api lazr.restfulclient in-progress
3 api Field Resource Vocabulary 2.2.4
8 api Field Resource Vocabulary Search
ajax Inline status editing in-progress (intellectronica)
infrastructure Merge EC2 latent slave upstream 2.2.1
infrastructure 5 minutes PQM for dependencies obsolete
8 infrastructure Use zc.buildout for deployment in-progress
5 ajax Inline multi-line editing in-progress
3 infrastructure Initial tree layout 2.2.3
3 api DELETE resource 2.2.3
openid UbuntuOne OpenID Server in-progress (jamesh)
ajax Inline autocomplete widget in-progress
2 infrastructure Sanitized DB Dump
3 infrastructure ec2run
5 ajax Automatic JavaScript test running
3 openid Launchpad Uses UbuntuOne OpenID
3 openid Launchpad OpenID Management
openid Launchpad OpenID Login
openid Restricting Operations to UbuntuOne Account
infrastructure Support Privacy in Batch Navigator
infrastructure Security Cache API
3 infrastructure Two-way buildbot communication
? api API: Factory Optimization
infrastructure Page Inventory
13 infrastructure lazr.oops
1 api delete() method in launchpadlib
8 infrastructure Site-wide notifications
api RESTful WSGI
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 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
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

Inline status editing

Story Points:

As a Launchpad developer,
I want a way to associate an inline widget with the rendered element of a status field in view;
so that I can easily add inline editing to any enum field.

Notes:

Inline multi-line editing

Story Points: 5

As a Launchpad developer,
I want a way to associate an inline widget with the rendered element of a multi-line text field in view;
so that I can easily add inline editing to text field.

Notes:

  • Might contain dynamic sizing.

Inline autocomplete widget

Story Points:

As a Launchpad developer,
I want a way to associate an inline widget with the rendered element of a vocabulary field in view;
so that I can easily add inline editing to any Choice field using a HugeVocabulary.

Automatic JavaScript test running

Story Points: 5

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:

  • ec2test integration.
  • Need to run firefox headless.
  • Probably use the yuitest reporting.
  • Need to write a "testrunner" around windmill.
  • Add to buildbot.

Widget Instrumentation API

Story Points:

As a Launchpad developer,
I want a standard API to record user behavior;
so that usability metric can be recorded for the widget I write.

API Track

lazr.restfulclient

Story Points:

As Python developer,
I want to download lazr.restfulclient from the Cheeseshop;
so that I can add easily create a python frontend to my lazr.restful-based web service.

Notes:

Story Points: 8

As a webservice client,
I want to be able to make queries on a field resource vocabulary;
so that I can present a search form to select valid values in an AJAX client.

Notes:

  • Searching with a maximum (no batching).
  • Custom operation.
  • WADL representation.
  • Launchpadlib integration.
  • JS integration.

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() 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.

restful.wsgi

Story Points:

As a Python developer,
I want to hook up a RESTful web service to my WSGI application;
so that I don't have to learn Zope arcana and add a Zope request handler to my application.

Notes:

OpenID Track

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.

UbuntuOne OpenID Server

Story Points:

As a UbuntuOne manager,
I want to run a separate Launchpad OpenID server;
so that I can use OpenID for my applications using a consistent brand.

Launchpad Uses UbuntuOne OpenID

Story Points: 3

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 Management

Story Points: 3

As a Launchpad user, I want to be able to manage OpenID accounts I
own in Launchpad; so that my profile lists known identities.

  • Notes:
  • Adding/Removing in profile.
  • Validate the accounts.
  • Design issues: wouldn't this be better handled in the SSO?
  • Talk to Martin about designing the workflow.

Launchpad OpenID Login

Story Points: ?

As a user, I want to be able to register and log in Launchpad using a in Launchpad using any of OpenID identities; so that I don't have to create another account to use Launchpad.

  • Notes:
  • Claiming a person record.
  • Login

Restricting Operations to UbuntuOne Account

Story Points: ?

As a Launchpad Administrator,
I want administrative operations on Launchpad and Ubuntu to be restricted to users logged in through their UbuntuOne account;
so that we aren't vulnerable to third party OpenID servers bugs.

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

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

ec2run

Story Points: 3

As a Launchpad developer,
I want a script that will fire an EC2 instance with a running instance of Launchpad based on a specified branch;
so that reviewers can preview the branch without downloading the branch.

Notes:

Sanitized DB Dump

Story Points: 2

As a Launchpad developer,
I want a sanitized production DB dump available;
so that I can preview my branches using real-world data and do more sensible performance testing.

Notes:

Two-way buildbot communication

Story Points: 3

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.

Support Privacy in Batch Navigator

Story Points:

As a Launchpad developer,
I want the BatchNavigator to filter out objects that the user doesn't have permission to;
so that it gives a coherent view of the set and that I don't have to filter out the objects in the view.

Notes:

Security Cache API

Story Points:

As a Launchpad developer,
I want an API to declare to the security policy that the user has a specific permission on a set of objects;
so that it doesn't need to check for the permission again and improve performance.

Notes:

Page Inventory

Story Points:

As a Launchpad developer,
I want an automatic inventory of the pages published by Launchpad;
so that I can track pages that needs updating or that I want to get rid of.

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.

VersionThreeDotO/Foundations (last edited 2009-04-29 14:00:24 by leonardr)