Ejemplo n.º 1
0
    def __set__(self, obj, value, initiator=True, moving=None):
        self.init(obj)
        current_value = self._get(obj)
        if current_value and current_value == value:
            return

        if initiator and self.opposite:
            opposite_property = getattr(value.__class__, self.opposite, _marker)
            if opposite_property is not _marker:
                opposite_property.add(value, obj, False)

        if current_value:
            self.remove(obj, current_value)

        setattr(obj, self.key, ref(value))
Ejemplo n.º 2
0
    def __set__(self, obj, value, initiator=True, moving=None):
        self.init(obj)
        current_value = self._get(obj)
        if current_value and current_value == value:
            return

        if initiator and self.opposite:
            opposite_property = getattr(value.__class__, self.opposite,
                                        _marker)
            if opposite_property is not _marker:
                opposite_property.add(value, obj, False)

        if current_value:
            self.remove(obj, current_value)

        setattr(obj, self.key, ref(value))
Ejemplo n.º 3
0
    def add(self, obj, value, initiator=True, moving=None):
        if value is None:
            return

        self.init(obj)
        current_values, need_cleanup = self._get(obj)
        if need_cleanup:
            self._cleanup(obj)

        if self.isunique and value in current_values:
            return

        if initiator and self.opposite:
            opposite_property = getattr(value.__class__, self.opposite, _marker)
            if opposite_property is not _marker:
                opposite_property.add(value, obj, False)

        obj.__dict__[self.key].append(ref(value))
Ejemplo n.º 4
0
    def remove(self, obj, values, initiator=True, moving=None):
        self.init(obj)
        relations = obj.__dict__[self.key]
        if not isinstance(values, (list, tuple, set)):
            values = [values]

        for value in values:
            if initiator and self.opposite:
                opposite_property = getattr(value.__class__, self.opposite,
                                            _marker)
                if opposite_property is not _marker:
                    opposite_property.remove(value, obj, False)

            value_ref = ref(value)
            if value_ref in relations:
                relations.remove(value_ref)
            elif value in relations:
                relations.remove(value)
Ejemplo n.º 5
0
    def add(self, obj, value, initiator=True, moving=None):
        if value is None:
            return

        self.init(obj)
        current_values, need_cleanup = self._get(obj)
        if need_cleanup:
            self._cleanup(obj)

        if self.isunique and value in current_values:
            return

        if initiator and self.opposite:
            opposite_property = getattr(value.__class__, self.opposite, _marker)
            if opposite_property is not _marker:
                opposite_property.add(value, obj, False)

        obj.__dict__[self.key].append(ref(value))
Ejemplo n.º 6
0
    def remove(self, obj, values, initiator=True, moving=None):
        self.init(obj)
        relations = obj.__dict__[self.key]
        if not isinstance(values, (list, tuple, set)):
            values = [values]

        for value in values:
            if initiator and self.opposite:
                opposite_property = getattr(
                    value.__class__,
                    self.opposite, _marker)
                if opposite_property is not _marker:
                    opposite_property.remove(value, obj, False)

            value_ref = ref(value)
            if value_ref in relations:
                relations.remove(value_ref)
            elif value in relations:
                relations.remove(value)