multiple models in a plugin component

45 views
Skip to first unread message

Louis Amon

unread,
May 23, 2014, 8:06:42 AM5/23/14
to web...@googlegroups.com
I am trying to build a big 'plugin component', with a plugin manager and therefore using the full naming conventions specified in the doc.

My model is starting to be huge (1000+ lines) and I'm trying to split it into multiple files.


Is there a way to name these files so that web2py still understands that they're part of my plugin ?

Louis Amon

unread,
Jun 11, 2014, 11:43:29 AM6/11/14
to
I found an answer to my own question :
I split my model (plugin_name.py) into multiple files (0_settings.py, 1_user.py, etc.) and put them all in a folder ./models/plugin_name/

Web2py does detect that all my model files belong to the same plugin and packs them together.


Another problem happens if I do things that way tho :

I use a database_uri as plugin parameter to define models (tables, fields, callbacks, etc.) in my plugin.
  • When I access this database from appadmin, the tables work fine (validators, callback, everything).
  • When I access this database from my main application (the one onto which my plugin is installed), my database isn't recognized at all.

From lurking on this fine forum, I established that I have 3 options here :
  1. Work around database cooperation (http://web2py.com/books/default/chapter/29/04#Cooperation)
  2. Use the auto_import=true argument in the DAL
  3. Rename the model files that came with my plugin, so all model features are available in the global namespace
So far, I am unsatisfied with all 3 options, with a good reason for each of those :
  1. Because I have dependencies between tables which makes it very difficult to cleanly manage all those imports
  2. Because auto_import doesn't manage to retrieve callbacks & validators, which leaves me with half the work left to do
  3. Because it would defeat the purpose of making a plugin in the first place

I'm a mere padawan on this fine community, so if a web2py guru happens to read this thread I would appreciate any tip he could provide to face this issue !

Louis Amon

unread,
Jun 13, 2014, 8:50:04 AM6/13/14
to web...@googlegroups.com
Ok here's my best solution so far:

I keep the whole plugin contained according to the rules defined in the documentation and, in order to have my my models visible to the global namespace, I expose the plugin's model folder using this little line :

response.models_to_run.append('plugin_name')



On Wednesday, June 11, 2014 5:43:29 PM UTC+2, Louis Amon wrote:
I found an answer to my own question :
I split my model (plugin_name.py) into multiple files (0_settings.py, 1_user.py, etc.) and put them all in a folder ./models/plugin_name/

Web2py does detect that all my model files belong to the same plugin and packs them together.


Another problem happens if I do things that way tho :

I use a database_uri as plugin parameter to define models (tables, fields, callbacks, etc.) in my plugin.
  • When I access this database from appadmin, the tables work fine (validators, callback, everything).
  • When I access this database from my main application (the one onto which my plugin is installed), my database isn't recognized at all.

From lurking on this fine forum, I established that I have 3 options here :
  1. Work around database cooperation (http://web2py.com/books/default/chapter/29/04#Cooperation)
  2. Use the auto_import=true argument in the DAL
  3. Rename the model files that came with my plugin, so all model features are available in the global namespace
So far, I am unsatisfied with all 3 options, with a good reason for each of those :
  1. Because I have dependencies between tables which makes it very difficult to cleanly manage all those imports
  2. Because auto_import doesn't manage to retrieve callbacks & validators, which leaves me with half the work left to do
  3. Because it would defeat the purpose of making a plugin in the first place

I'm a mere padawan on this fine community, so if a web2py guru happens to read this thread I would appreciate any tip he could provide to face this issue !


On Friday, May 23, 2014 2:06:42 PM UTC+2, Louis Amon wrote:

Anthony

unread,
Jun 13, 2014, 9:52:15 AM6/13/14
to web...@googlegroups.com
Yes, by default, response.models_to_run is set so web2py runs all models in the top level /models folder, and then any models in subfolders whose names match the request controller and function (so model files in a folder named after the plugin would only be run if the plugin controller is called). The exception is when the "appadmin" controller is called -- in that case, all models in all subfolders are run.

Anthony
Reply all
Reply to author
Forward
0 new messages