Hi Olemis,

A bit too much in that message to comment sensibly in a single email but I will try to cover some points. The first part is a particularly confusing as I do not see the common module in bloodhound_multiproduct/multiproduct, I wonder if you are looking at the right code.

Meanwhile I didn't follow the p prefix idea but instead decided on req.path_info.startswith('/products') so that it is more obvious what it is for. I don't mind variations on that but I think that /p is not enough to retain clarity. Even if google use it.

  2- IMO import statements in `multiproduct.__init__` should be absolute

I have no problem with that change.

  3- I wonder whether it'd be a good idea to

Possibly but it could be overkill if there are not going to be that many additional models to support.

  4- Product table key is ['prefix', 'name'] . Why ?

Well, certainly both are considered unique. We can look at whether this is correct usage.

  5- It's cool to have models ! :)

I agree it would probably be better to use a pre-existing ORM - I would quite like to see the whole of bloodhound including trac to use such an approach so that more of the system can be taken a consistent step away from raw SQL. I don't know if I am on my own in liking good ORMs of course which is why I have not made too much of it. I do have a secret desire to be using django's model and query system though!

I'll have to consider the rest later but there is not a huge amount to actually disagree with. Things do need moving around and the code has languished a little while I have been distracted by other concerns.

I think we are placing a higher priority on getting the basic interface right than getting multi-product fully working (product namespaces, permissions etc). I can see that work slipping to the next milestone if we are not able to get more people interested in working with us and up to speed in the short term.

Cheers,
    Gary


On 06/14/2012 06:03 AM, Olemis Lang wrote:
Hi !
:)

I've been reviewing the code in multiproduct plugin these days . I
have some doubts | comments | ... I thought I'd share them with you .

   1- I've noticed that function `multiproduct.common.match_product_path` is not
      used anywhere else . What is it for ?
      a) After a while I found
         `multiproduct.ticket_web_ui.ProductTicketModule.match_request`
         method and I confirmed my intuition was correct.
         As far as I can say *NOW* (<= i.e. I can change my mind if
         there're strong arguments supporting that approach ;)
         that's something I do not recommend .
         `IRequestHandler.match_request` should decide quickly
         (<= and that means **really** quick) whether the
         handler will process the request or not.
         I even notice the execution of a SQL
         select statement . IMO that's far too much to belong in
         `match_request` method. Besides that approach may lead
         to collisions with paths matched by other plugins .
         That's the reason why I suggested in t.e.o site , and
         trac-dev ML to use ''/p/'' prefix similar to Google
         Code (which is short and simple) to reduce the scope
         of web request to the context of a particular
         product / project. Sample ticket URL would be e.g.
         http://server.com/path/to/bh/p/my_product/ticket/36
         and (initially ;) may be matched using a simple regex
         like ` r'^/p/(?P<pid>[^/]+/ticket/(?P<tid>\d+)$)' `.
   2- IMO import statements in `multiproduct.__init__` should be absolute i.e.
      `from multiproduct.model import MultiProductEnvironmentProvider`
      instead of `from model import MultiProductEnvironmentProvider`
   3- I wonder whether it'd be a good idea to
      a) ... populate `MultiProductEnvironmentProvider.SCHEMA` considering
         `SomeModel.__meta__` (e.g. `SomeModel` may be `Product` ,
         `ProductResourceMap`, ...)
      b) ... make `MultiProductEnvironmentProvider` capable of discovering
         existing classes dynamically i.e. in such a way that it won't be
         necessary to update that class if new models are introduced .
   4- Product table key is ['prefix', 'name'] . Why ?
   5- It's cool to have models ! :)
      Is it a good idea to consider using ORMs like SqlAlchemy [1]_
      (... or maybe other ...) ?
   6- IMO we should add multi-product version to '''System Information'''
      table in ''About Trac'' page (i.e. http://server.com/path/to/bh/about )
   7- I also suggest the following changes in files (relative to
      ''multiproduct'' folder) :

      || Current file path || Suggestions                    ||
      ||-------------------||--------------------------------||
      || product_admin.py  || admin/product.py , admin.py    ||
      || ticket_web_ui.py  || web_ui/ticket.py               ||
      || web_ui.py         || web_ui/__init__.py             ||
      ||<create new>       || api.py                         ||

      ... and the following simple refactorings to move classes
      and change their names :

      || From                                  || To
                  ||
      
||---------------------------------------||----------------------------------------||
      || model.MultiProductEnvironmentProvider ||
api.MultiProductSystem                 ||
      || ticket_web_ui.ProductTicketModule     ||
web_ui.ticket.MultiProductTicketModule ||

   8- IMO `multiproduct.model.MultiProductEnvironmentProvider` should
      not implement `trac.web.api.ITemplateProvider` as it is not related with
      request handling at all . It doesn't even make use of any ''Genshi''
      template included in the plugin. Usually this is the kind of things
      defined in `web_ui` modules .
   9- I suggest merging current `multiproduct.product_admin.ProductPermissions`
      class with `multiproduct.model.MultiProductEnvironmentProvider` (... or
      `multiproduct.api.MultiProductSystem` especially if ยง7 is ok ;).
   10- There's a lot of great stuff in multi product plugin . IMO it
       deserves some test cases , so we should have a ticket for that
       scheduled for RC1 ... or some other milestone ... that's
       something we should decide ;)

PS: I could not finished ... so maybe there's a second message on this
subject ;)

.. [1] Trac SQLAlchemy Bridge
        (http://trac-hacks.org/wiki/TracSqlAlchemyBridgeIntegration)


Reply via email to