class ViewModel(object): __metaclass__ = ViewModelMeta def __init__(self, **kwargs): self._fieldindex = OrderedDict() # mapping tussen ids en veldnamen self._fltr = None # voor elke instantie van ViewModel krijgen de # veldnamen een uniek id for fieldname, classfield in self._fieldattrs.items(): idx = counter.inc() field = classfield.__class__(name=fieldname, config=classfield) field._idx = idx field.set_model(self) object.__setattr__(self, fieldname, field) self._fieldindex[idx] = fieldname def __getattribute__(self, name): if name.startswith("__"): return object.__getattribute__(self, name) attr = object.__getattribute__(self, name) if attr: if isinstance(attr, ViewField): return attr.get_value() else: return attr return object.__getattribute__(self, name) def __setattr__(self, name, value): attr = self.__dict__.get(name) if attr and isinstance(attr, ViewField): attr.set_value(value) else: object.__setattr__(self, name, value) def get_field(self, id_or_name): if str(id_or_name).isdigit(): field_id = int(id_or_name) if field_id in self._fieldindex.keys(): return object.__getattribute__(self, self._fieldindex[field_id]) for fieldname, fieldtype in self.get_field_attributes().items(): item = getattr(self, fieldname, None) if item: if isinstance(fieldtype, OneToOne): field = item.get_field(id_or_name) if field: return field elif isinstance(fieldtype, OneToMany): for subitem in item: field = subitem.get_field(id_or_name) if field: return field else: field = self.__dict__.get(id_or_name) if field: return field def __del__(self): pass def save(self): """ Wijzigingen doorvoeren in de database """ def get_value_by_id(self, field_id): if field_id in self._fieldindex.keys(): return getattr(self, self._fieldindex[field_id], None) for fieldname, fieldtype in self.get_field_attributes().items(): item = getattr(self, fieldname, None) if item: if isinstance(fieldtype, OneToOne): value = item.get_value_by_id(field_id) if value: return value elif isinstance(fieldtype, OneToMany): for subitem in item: value = subitem.get_value_by_id(field_id) if value: return value def set_value_by_id(self, field_id, value): if field_id in self._fieldindex.keys(): setattr(self, self._fieldindex[field_id], value) return True for fieldname, fieldtype in self.get_field_attributes().items(): item = getattr(self, fieldname, None) if item: if isinstance(fieldtype, OneToOne): result = item.set_value_by_id(field_id, value) if result: return result elif isinstance(fieldtype, OneToMany): for subitem in item: result = subitem.set_value_by_id(field_id, value) if result: return result return False def get_field_attributes(self): """ Geeft veldattributen terug in de juiste volgorde: de volgorde waarin ze zijn gedeclareerd. """ return self._fieldattrs def undo(self): self.select(fltr=self._fltr)