You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bloodhound.apache.org by Apache Bloodhound <bl...@incubator.apache.org> on 2012/10/12 05:09:49 UTC
Re: [Apache Bloodhound] #115: Product-specific settings
#115: Product-specific settings
-------------------------+-------------------------------------------------
Reporter: olemis | Owner: nobody
Type: | Status: new
enhancement | Milestone:
Priority: major | Version:
Component: | Keywords: multiproduct environment
multiproduct | configuration database
Resolution: |
-------------------------+-------------------------------------------------
Old description:
> IMO one of the goals of multiproduct plugin should be to behave like
> (i.e. not an exact clone though still similar to) an implementation of
> former multi-environment setup e.g. via `TRAC_ENV_PARENT_DIR` but inside
> a single environment . Hence each product should have its own
> configuration settings . For practical reasons maybe it's a good decision
> to merge product-specific options with environment's global options. The
> former should override the later in a way similar to
> [http://trac.edgewall.org/wiki/TracIni#GlobalConfiguration global
> configuration] (i.e. `inherit.file` config option) .
>
> Some use cases are :
>
> - Notifications for different products sent to separate mailing lists
> (i.e. `notification` section)
> - Different default values for ticket fields (i.e. `ticket.default_*`)
> - Different workflows for each product
> - Product svn repostiory having particular branch and tags (i.e. `svn`
> section)
> - Product-specific fine grained permissions (i.e.
> `authz_policy.authz_file`)
> - Different sources and hosts for growl notifications (i.e. `growl`
> section
> used by [http://trac-hacks.org/wiki/GrowlPlugin GrowlPlugin])
> - Product-specific header and logo (i.e. `header_logo` section)
> - Different ways to collect statistics on groups of tickets for display
> in
> the milestone views (i.e. `milestone` section)
>
> ==== Implementation notes ====
>
> Firstly it'd be nice to store product specific configuration in the
> database (though it is possible to reuse existing implementation and load
> values from plain-old files e.g.
> ''/path/to/env/config/product-<prefix>.ini'' ... <= this approach is
> cheap enough to be taken into account ''';)''' . Table structure for this
> should be pretty straightforward and simple . My initial suggestion is :
>
> {{{
> #!python
>
> class ProductSettings(ModelBase):
> """Product settings table"""
> _meta = {'table_name':'bloodhound_product_settings',
> 'object_name':'ProductSettings',
> 'key_fields':['product', 'section', 'option'],
> 'non_key_fields':['value'],
> 'no_change_fields':['product', 'section', 'option'],
> 'unique_fields':[],
> }
>
> }}}
>
> All this should happen transparently , so that e.g. plugins source code
> will work under these circumstances without requiring any change . In
> order to get this done I suggest to inject (at a given time TBD during
> request dispatching , filtering , handling , ... ) a replacement (i.e.
> proxy object) of Trac environment wrapping the real environment but
> returning product-specific configuration object for its `config` field .
> Therefore a class implementing `ConfigParser` ''API'' on top of this
> database structure is also needed .
>
> Some side-effects may lead to changing current multiproduct
> implementation . For instance, product name and description may be
> stored/retrieved by referring to product-specific `project.name` and
> `project.descr` options respectively , and that will work transparently
> due to the underlying magic of `trac.config.Option` descriptor and its
> subclasses.
New description:
IMO one of the goals of multiproduct plugin should be to behave like (i.e.
not an exact clone though still similar to) an implementation of former
multi-environment setup e.g. via `TRAC_ENV_PARENT_DIR` but inside a single
environment . Hence each product should have its own configuration
settings . For practical reasons maybe it's a good decision to merge
product-specific options with environment's global options. The former
should override the later in a way similar to
[http://trac.edgewall.org/wiki/TracIni#GlobalConfiguration global
configuration] (i.e. `inherit.file` config option) .
Some use cases are :
- Notifications for different products sent to separate mailing lists
(i.e. `notification` section)
- Different default values for ticket fields (i.e. `ticket.default_*`)
- Different workflows for each product
- Product svn repostiory having particular branch and tags (i.e. `svn`
section)
- Product-specific fine grained permissions (i.e.
`authz_policy.authz_file`)
- Different sources and hosts for growl notifications (i.e. `growl`
section
used by [http://trac-hacks.org/wiki/GrowlPlugin GrowlPlugin])
- Product-specific header and logo (i.e. `header_logo` section)
- Different ways to collect statistics on groups of tickets for display
in
the milestone views (i.e. `milestone` section)
==== Implementation notes ====
Firstly it'd be nice to store product specific configuration in the
database (though it is possible to reuse existing implementation and load
values from plain-old files e.g.
''/path/to/env/config/product-<prefix>.ini'' ... <= this approach is cheap
enough to be taken into account ''';)''' . Table structure for this should
be pretty straightforward and simple . My initial suggestion is :
{{{
#!py
class ProductSettings(ModelBase):
"""Product settings table"""
_meta = {'table_name':'bloodhound_product_settings',
'object_name':'ProductSettings',
'key_fields':['product', 'section', 'option'],
'non_key_fields':['value'],
'no_change_fields':['product', 'section', 'option'],
'unique_fields':[],
}
}}}
All this should happen transparently , so that e.g. plugins source code
will work under these circumstances without requiring any change . In
order to get this done I suggest to inject (at a given time TBD during
request dispatching , filtering , handling , ... ) a replacement (i.e.
proxy object) of Trac environment wrapping the real environment but
returning product-specific configuration object for its `config` field .
Therefore a class implementing `ConfigParser` ''API'' on top of this
database structure is also needed .
Some side-effects may lead to changing current multiproduct implementation
. For instance, product name and description may be stored/retrieved by
referring to product-specific `project.name` and `project.descr` options
respectively , and that will work transparently due to the underlying
magic of `trac.config.Option` descriptor and its subclasses.
--
Comment (by olemis):
Oops !
Highlighting python source code ... this time ...
--
Ticket URL: <https://issues.apache.org/bloodhound/ticket/115#comment:2>
Apache Bloodhound <https://issues.apache.org/bloodhound/>
The Apache Bloodhound (incubating) issue tracker