コード例 #1
0
ファイル: jsonrpc_objects.py プロジェクト: gonicus/clacks
    def diffObject(self, user, ref):
        """
        Opens a copy of the object given as ref and
        returns a diff - if any.
        """
        item = self.db.object_pool.find_one({'uuid': ref})
        if item is None:
            return None

        if not self.__check_user(ref, user):
            raise ValueError(C.make_error("NO_OBJECT_OWNER"))

        # Load current object
        current_obj = ObjectProxy(item['object']['dn'])

        # Load cache object
        cache_obj = item['object']['object']
        if cache_obj is None:
            cache_obj = self.__object[ref]

        ##
        ## Generate delta
        ##
        delta = {'attributes': {'added': {}, 'removed': [], 'changed': {}}, 'extensions': {'added': [], 'removed': []}}

        # Compare extension list
        crnt_extensions = set(current_obj.get_object_info()['extensions'].items())
        cche_extensions = set(cache_obj.get_object_info()['extensions'].items())
        for _e, _s in crnt_extensions - cche_extensions:
            if _s:
                delta['extensions']['added'].append(_e)
            else:
                delta['extensions']['removed'].append(_e)

        # Compare attribute contents
        crnt_attributes = dict(filter(lambda x: x[1], current_obj.get_attribute_values()['value'].items()))
        cche_attributes = dict(filter(lambda x: x[1], cache_obj.get_attribute_values()['value'].items()))
        for _k, _v in crnt_attributes.items():
            if _k in cche_attributes:
                if _v != cche_attributes[_k]:
                    delta['attributes']['changed'][_k] = _v
            else:
                delta['attributes']['added'][_k] = _v

        for _k, _v in cche_attributes.items():
            if not _k in crnt_attributes:
                delta['attributes']['removed'].append(_k)

        return delta