On Feb 5, 1:06 pm, Marc Aymerich <glicer...@gmail.com> wrote: > Thank you all for the answers! > > I'll try to give you the context in which I need to generate classes > like this. > > I'm developing a reusable control panel for an ISP. I have several > modules (VirtualUser, SystemUser, VPS, VirtualHost, ...) and they all > share the fact that you can have limits on resource consumption. for > example. > > VPS: has limits on swap, memory, cpu and disk. > SystemUser: has limits on disk and traffic. > > As all modules share this property of being limited I have decided to > split the limit functionality in a separate module (called resources). > Resources are associated dinamically with (vps, systemuser ...) > through a Monitor class. So it's up to you decide what limits you are > interested to put in the VPS or in the SystemUser ... > > So when you attach the "disk limit" to SystemUser model is necessary > to create a web form for SystemUser a bit different than if you decide > to have disk and traffic limits. That is what my posted code is > supposed to do. > > Do you think that I am on the wrong way designing the control panel > like this? > > Btw, I've seen several interesting ideas to create the class > dinamically (with class factorys, MetaClass, dictionaries ..), but I > have not yet clear whether this will be usefull for create the > __init__ function at runtime too. Any clue on this? >
this seems to work :) def makeLimitForm(name, monitors, _model): class Meta: model = _model dct = { 'Meta': Meta } for monitor in monitors: field_name = monitor.resource + "_limit" dct[field_name] = forms.CharField(max_length=100, initial=monitor.default_limit) def __init__(self, *args, **kwargs): ModelForm.__init__(self, *args, **kwargs) if 'instance' in kwargs: for monitor in monitors: field_name = monitor.resource + "_limit" print monitor self.fields[field_name].initial = kwargs['instance'].monitoring.filter(monitor=monitor)[0].current dct['__init__'] = __init__ return type(name,(ModelForm,),dct) -- http://mail.python.org/mailman/listinfo/python-list