On Jun 4, 10:58 am, Doug Warren <doug.war...@gmail.com> wrote: > I don't believe I want to local_import my db.py file as it's already > set up by the environment correct?
Correct - you do not want / need to import your db.py. As long as it is in your models folder (by default it is), it's already in your request context before your controller is called. > > What I'm asking for is a way to keep all of the code that relates to > the model in one place and to invoke it from controllers. That is if > I define 5 tables for the model I'd expect to write helper functions > to manipulate all 5 tables and not to have the controller know the > intimate details of the model. That's the concept behind Object > Orientated programming isn't it? Objects are black boxes to other > objects other than their public facing interface. Right - but DAL is just a Data abstraction layer (i.e. an SQL adapter, if you will), not an ORM (i.e. there's not the level of object- oriented abstraction that you would expect w/ an orm - it's lower level) So in web2py, with DAL you have knowledge of your table layout (without direct knowledge / need for the specific back ends SQL). You'll also find that forms, and validators are coupled to table structure, so if / as you try to abstract away from table definitions, you will run into this. I'm sure others will add more comments... > > On Fri, Jun 4, 2010 at 8:56 AM, Yarko Tymciurak > > <resultsinsoftw...@gmail.com> wrote: > > > On Jun 4, 10:43 am, Doug Warren <doug.war...@gmail.com> wrote: > >> Traditionally when I've written MVC style applications, the model > >> would contain not only the data representing the objects but also the > >> data for manipulating the objects. I'm not sure how that same > >> relation applies to web2py. > > >> If I have a model that defines 4-5 tables, 2 of them are just foreign > >> key lookups, and creating a new object involves inserting data into 3 > >> of the tables, it seems that I would want a create_object method in my > >> model file. > > >> So I write something like: > > >> def create_object(owner_id=None, template=None): > >> # Some sanity checking on the above > >> new_object = db.objects.insert(template_id=template.id, > >> person_id=owner_id) > > >> widgets = db.template_widget(db.template_widget.thingy_template_id > >> == template.id).select() > >> for widget in widgets: db.thingy_widget.insert(widget_id = > >> widget.id, thingy_id = new_object) > > >> whatchymacallits = > >> db.template_whatchymacallit(db.template_whatchymacallit.thingy_template_id > >> == template.id).select() > >> for whatchymacallit in whatchymacallits: > >> db.thingy_whatchymacallit.insert(whatchymacallit_id = > >> whatchymacallit.id, thingy_id = new_object) > > >> return new_object > > >> and place that into my db.py. Now the controller has a function like: > >> def create(): > >> form = SQLFORM.factory( Field('template', > >> requires=IS_IN_SET(__get_templates()))) > >> if form.accepts(request.vars, session): > >> foo = db.create_object(owner_id=auth.auth_id, > >> template_name=form.vars.template) > >> response.flash = "Created" > >> elif form.errors: > >> response.flash = "Error (hacker)" > > >> Well db is referring to the DAL db not the db.py, from db import > >> create_object gives a name not found error, so I'm at a loss as to how > >> to define functions that work upon the model and can be invoked from > >> one or more controllers. > > > I'm not sure what exactly you are saying here - but to import, use > > local_import() > > (seehttp://www.web2py.com/book/default/section/4/18?search=local_import) > > > BUT before you do, here is some background: > > > When a request comes into web2py, here's what happens (roughly): > > > web2py parses the request url, and sets up an environment to call the > > appropriate application / controller / function; > > Part of that setup involves running all the files in your app's model > > folder (so that db connections, table definitions, etc. are all "there > > for you"); > > > This means you can put your files in the models folder, and they will > > be run (defined) before the call to your controller. > > > Then, your controller / function is called. > > > local_import will pull in definitions / modules from your > > application's modules folder, but you can (for development certainly) > > just put your file in your models folder. > > When you really want to reduce what gets run at _each_ request, you > > might want to look at what to move to modules, so that you're only > > pulling in those files when needed. > > > As for db - DAL: db is the "global" and "default" name for the db > > connection string (it is so named and setup in the default models/ > > db.py file). You can change the name of this variable as you like > > (or change your imports). > > > Hope this at least helps point you out of the forrest. > > > Regards, > > - Yarko > >> Are there any non-trivial example > >> applications for web2py? Most of the ones that I have seen assumes > >> that all data you need in the database can be supplied from a form and > >> that's not the case I run into over and over again.