I should add that I am attempting to respond to my own complaint in other threads about web2py not having enough of these kinds of tutorials around. :)
On Jul 29, 7:44 pm, __future__ <wrigh...@gmail.com> wrote: > Thank you for the quick reply! > > I think this is starting to click a little more for me. I have > purchased the book and I have the updated chapters you posted for > 6,7,8 that I have been using as a reference. > > Unfortunately, my mind struggles with abstractions unless presented > with a concrete example. It is probably why I am still a mediocre > programmer after all of these years :) > > Could you possibly assist me with some more hints along these lines... > you can check out the working end result of all of that djangoese at: > > http://startthedark.com > > My ultimate goal is to rebuild that app in web2py and describe the > process in detail along with screencasts. This startthedark was a > project based on a django screencast tutorial series called "Django > from the ground up" that I found very useful when learning Django. > > Thanks for all of the help. > > __future__ > > On Jul 29, 7:11 pm, mdipierro <mdipie...@cs.depaul.edu> wrote: > > > These are good questions. web2py does not have something like Django > > managers and you have to achieve the same goal differently. This is > > because of different in design philosophy. > > > Django has an ORM, web2py has a DAL. In Django a model maps a table > > into an object so you can override the methods of that object. > > web2py prefers to be a lower lever than that. the web2py DAL > > expressions map 1-to-1 into SQL queries. For example we do not have a > > save() methods. We do have an insert() method. You cannot override it > > because it does not belong to the table (model) but it belong to the > > database. (technically you could override it but you would be doing > > for all tables). > > > What in Django you achieve by modifying the model, in web2py you > > achieve my modifying the forms. Forms can be associated to two > > functions: onvalidation, onaccept. The former is executed after > > validation before any database IO, the latter is executed after > > database IO. > > > You can define these functions in the model (they are just functions, > > not class methods) but you still need to be specific about which form > > they apply to (onvalidation=...). > > > Hope this helps. > > > Massimo > > > On Jul 29, 3:18 pm, __future__ <wrigh...@gmail.com> wrote: > > > > Looking at my post, I can see where not knowing Django would be an > > > impediment to understanding... :) > > > > Let me try again (and please bare with me because I am *not* an expert > > > on Django). > > > > Django has these things called Managers: > > > >http://docs.djangoproject.com/en/dev/topics/db/managers/ > > > > from the Django docs: > > > > class Manager > > > > A Manager is the interface through which database query operations are > > > provided to Django models. At least one Manager exists for every model > > > in a Django application. > > > > You can create your own Managers and use them with your models. You > > > can create custom QuerySets (filters basically) and use them with your > > > Managers. > > > > In the example I gave, he creates a function today(): > > > > from datetime import datetime, timedelta > > > def today(): > > > now = datetime.now() > > > start = datetime.min.replace(year=now.year, month=now.month, > > > day=now.day) > > > end = (start + timedelta(days=1)) - timedelta.resolution > > > return (start, end) > > > > Then a custom QuerySet (EventQuerySet) that extends the base QuerySet > > > with a today method which uses the function he defined above. > > > > self.filter(creation_date__range=today()) # __range is part of the > > > django filtering syntax > > > > Then he creates a custom Manager (EventManager) and assigns it to > > > 'objects' in his model: > > > > class Event(models.Model) > > > #.... > > > objects = EventManager() > > > > So now when he calls Event.objects he is really calling an instance of > > > the EventManager() > > > > He does one more thing though.. All models have a default save method > > > which is called explicitly to commit changes. He overrides the > > > inherited default save method with this one: > > > > def save(self, **kwargs): > > > Event.objects.filter(latest=True, > > > creator=self.creator).today().update(latest=False) > > > super(Event, self).save(**kwargs) > > > > So now whenever an Event object is saved, this code will execute > > > regardless of where it happens because save is a model method. > > > > I think I explained that correctly (possibly not well :) > > > > What would be the best (or most DRY) way to do something like this in > > > web2py? > > > > Thanks again to all for indulging my questions... > > > > On Jul 29, 1:51 pm, Fran <francisb...@googlemail.com> wrote: > > > > > On Jul 29, 6:51 pm, __future__ <wrigh...@gmail.com> wrote: > > > > > > So can I create a custom filter like the EventQuerySet in the example > > > > > and then apply it in the controller? I assume I will have to use this > > > > > anywhere an event might get an update? Can I use it with crud? > > > > > I don't quite follow the example (I'm not familiar with Django) but > > > > what I think you're looking for is: > > > > crud.settings.create_onvalidation = lambda form: mycustomfilter(form) > > > > > F --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "web2py-users" group. To post to this group, send email to web2py@googlegroups.com To unsubscribe from this group, send email to web2py+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/web2py?hl=en -~----------~----~----~----~------~----~------~--~---