====
TODO
====

Meta
====

- Check demo applications for issues with patterns (grok wiki, ldap address
  book)


Core
====

- choice fields / sources (theuni)

- testing strategy for the tutorial (faassen)

- make it easier to write tests (wosc, faassen)

- error reporting during grokking (provide file/line-number information
  on our extrinsically generated errors) (philikon)

- What will happen if we make a utility a old style class and use the
  MRO stuff. Since we don't support non-persistent local utilities yet this
  may be a rare case.

- What about local utilities that don't subclass persistent? Perhaps we 
  can look for IPersistent and give an error if the utility doesn't
  state it is.

- Change error messages: whenever we report about a callable, add
  () to the name. Core Python expections do this.

- JSON support similar to XMLRPC.


Schema/formlib support
----------------------

- support nested class 'fields' directly on a view (do we really want this?)

- list form for grok.Container (w/ zc.table?)

- delete action on list form

- make formlib macros available in some form?

- what about subclassing a model that has a 'fields'?


Need to discuss
---------------

- Do we want to ship Grok with a javascript library dependency such as
  MochiKit, to enable out of-the-box AJAX?

- Make it even easier to set up the catalog (intids should be set up
  automatically if not already present. Perhaps Index grokkers?).

- Testing support. Test grokkers?

- Error pages: make it easy to register application-specific error
  pages for exceptions.

- Easier queries: integrate hurry.query in some way?

- fall back to a static resource that is defined in a package on a higher
  level if no static resource directory is defined locally in a package?

- grok.grokkable (to allow grokking of imported things)

- skins

- form redirect

- authentication (pau integration) (faassen)

- sessions (get the session information for something, similar to
  annotations?)

- menus - define a menu, associate a view with a menu (module-level,
  class-level)

- making new widgets (faassen, philikon)

- IMPORTANT: different strategies: grok.definefoo() versus n =
  grok.Foo(), watch out for consistency/symmetry/...

- use ZCML's conflict resolution machinery; actions for Grok.

- do not accept automatic template directory guessing convention for
  __init__.py, bail out with grok error instead?

- grok.name, grok.template class restrictions (e.g. grok.template
  should only be usable from grok.View subclasses)

- support grok.template(template) in addition to
  grok.template('name_of_template')?

- support grok.resource on view class level?

- should grok.context and grok.Model be order-dependent?
  (so their meaning becomes "below here, this is the context")

- Do we want to initialize model attributes for any schema that the model
  implements (in addition to the initialization that is taking place for the
  model-level fields)?


Punt
----

- making new fields

- viewlets / content providers (LATER)

- RDB - via extension: megrok.sqlalchemy for example - make it easy to
  go between the different schema implementations

- containment constraints (wait for zope 3 to do them right)
