Пример #1
0
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)
Пример #2
0
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)