Example #1
0
    def delete(self):
        if self.jeeves_id is None:
            return

        field_names = set()
        for field in self._meta.concrete_fields:
            if not field.primary_key and not hasattr(field, "through"):
                field_names.add(field.attname)

        all_vars = []
        field_dict = {}
        env = JeevesLib.jeevesState.pathenv.getEnv()
        for field_name in field_names:
            value = getattr(self, field_name)
            field_fexpr = fexpr_cast(value).partialEval(env)
            all_vars.extend(v.name for v in field_fexpr.vars())
            field_dict[field_name] = field_fexpr

        for var_set in JeevesModelUtils.powerset(all_vars):
            true_vars = list(var_set)
            false_vars = list(set(all_vars).difference(var_set))
            env_dict = dict(env)
            env_dict.update({tv: True for tv in true_vars})
            env_dict.update({fv: False for fv in false_vars})

            self.do_delete(env_dict)
Example #2
0
 def do_delete(self, vars_env):
     """A helper for delete?
     """
     if len(vars_env) == 0:
         delete_query = self.__class__._objects_ordinary.filter(jeeves_id=self.jeeves_id)
         delete_query.delete()
     else:
         filter_query = self.__class__._objects_ordinary.filter(jeeves_id=self.jeeves_id)
         objs = list(filter_query)
         for obj in objs:
             eobj = JeevesModelUtils.unserialize_vars(obj.jeeves_vars)
             if any(
                 var_name in eobj and eobj[var_name] != var_value for var_name, var_value in vars_env.iteritems()
             ):
                 continue
             if all(
                 var_name in eobj and eobj[var_name] == var_value for var_name, var_value in vars_env.iteritems()
             ):
                 super(JeevesModel, obj).delete()
                 continue
             addon = ""
             for var_name, var_value in vars_env.iteritems():
                 if var_name not in eobj:
                     new_obj = clone(obj)
                     if addon != "":
                         new_obj.id = None
                         # so when we save a new row will be made
                     new_obj.jeeves_vars += addon + "%s=%d;" % (var_name, not var_value)
                     addon += "%s=%d;" % (var_name, var_value)
                     super(JeevesModel, new_obj).save()
Example #3
0
        def get_env(obj, fields, env):
            """Gets the Jeeves variable environment associated with the fields.
            """
            if hasattr(obj, "jeeves_vars"):
                jeeves_vars = JeevesModelUtils.unserialize_vars(obj.jeeves_vars)
            else:
                jeeves_vars = {}
            
            for var_name, value in jeeves_vars.iteritems():
                # TODO: We only need to do this whole label thing if we don't
                # know where the value is going.

                # Loop through the list of variables and their assignments.
                if var_name in env and env[var_name] != value:
                    # If we already know that this variable doesn't match with
                    # our program counter, we return nothing for this current
                    # variable. 
                    return None

                # Otherwise, we map the variable to the condition value.
                # TODO: See if the value is consistent.
                label = acquire_label_by_name(self.model._meta.app_label
                    , var_name)
                env[var_name] = (label, value)

            for field, subs in fields.iteritems() if fields else []:
                # Do the same thing for the fields.
                if field and get_env(getattr(obj, field), subs, env) is None:
                    return None
            return env
Example #4
0
        def get_env(obj, fields, env):
            """Gets the Jeeves variable environment associated with the fields.
            """
            if hasattr(obj, "jeeves_vars"):
                jeeves_vars = JeevesModelUtils.unserialize_vars(
                    obj.jeeves_vars)
            else:
                jeeves_vars = {}

            for var_name, value in jeeves_vars.iteritems():
                # TODO: We only need to do this whole label thing if we don't
                # know where the value is going.

                # Loop through the list of variables and their assignments.
                if var_name in env and env[var_name] != value:
                    # If we already know that this variable doesn't match with
                    # our program counter, we return nothing for this current
                    # variable.
                    return None

                # Otherwise, we map the variable to the condition value.
                # TODO: See if the value is consistent.
                label = acquire_label_by_name(self.model._meta.app_label,
                                              var_name)
                env[var_name] = (label, value)

            for field, subs in fields.iteritems() if fields else []:
                # Do the same thing for the fields.
                if field and get_env(getattr(obj, field), subs, env) is None:
                    return None
            return env
Example #5
0
    def delete(self):
        if self.jeeves_id is None:
            return

        field_names = set()
        for field in self._meta.concrete_fields:
            if not field.primary_key and not hasattr(field, 'through'):
                field_names.add(field.attname)

        all_vars = []
        field_dict = {}
        env = JeevesLib.jeevesState.pathenv.getEnv()
        for field_name in field_names:
            value = getattr(self, field_name)
            field_fexpr = fexpr_cast(value).partialEval(env)
            all_vars.extend(v.name for v in field_fexpr.vars())
            field_dict[field_name] = field_fexpr

        for var_set in JeevesModelUtils.powerset(all_vars):
            true_vars = list(var_set)
            false_vars = list(set(all_vars).difference(var_set))
            env_dict = dict(env)
            env_dict.update({tv: True for tv in true_vars})
            env_dict.update({fv: False for fv in false_vars})

            self.do_delete(env_dict)
Example #6
0
 def do_delete(self, vars_env):
     """A helper for delete?
     """
     if len(vars_env) == 0:
         delete_query = self.__class__._objects_ordinary.filter(
             jeeves_id=self.jeeves_id)
         delete_query.delete()
     else:
         filter_query = self.__class__._objects_ordinary.filter(
             jeeves_id=self.jeeves_id)
         objs = list(filter_query)
         for obj in objs:
             eobj = JeevesModelUtils.unserialize_vars(obj.jeeves_vars)
             if any(var_name in eobj and eobj[var_name] != var_value
                    for var_name, var_value in vars_env.iteritems()):
                 continue
             if all(var_name in eobj and eobj[var_name] == var_value
                    for var_name, var_value in vars_env.iteritems()):
                 super(JeevesModel, obj).delete()
                 continue
             addon = ""
             for var_name, var_value in vars_env.iteritems():
                 if var_name not in eobj:
                     new_obj = clone(obj)
                     if addon != "":
                         new_obj.id = None
                         # so when we save a new row will be made
                     new_obj.jeeves_vars += addon + '%s=%d;' \
                                                 % (var_name, not var_value)
                     addon += '%s=%d;' % (var_name, var_value)
                     super(JeevesModel, new_obj).save()
Example #7
0
 def get_env(obj, fields, env):
     """Gets the Jeeves variable environment associated with the fields.
     """
     if hasattr(obj, "jeeves_vars"):
         jeeves_vars = JeevesModelUtils.unserialize_vars(obj.jeeves_vars)
     else:
         jeeves_vars = {}
     for var_name, value in jeeves_vars.iteritems():
         if var_name in env and env[var_name] != value:
             return None
         env[var_name] = value
         acquire_label_by_name(self.model._meta.app_label, var_name, obj=obj)
     for field, subs in fields.iteritems() if fields else []:
         if field and get_env(getattr(obj, field), subs, env) is None:
             return None
     return env
Example #8
0
 def get_env(obj, fields, env):
     """Gets the Jeeves variable environment associated with the fields.
     """
     if hasattr(obj, "jeeves_vars"):
         jeeves_vars = JeevesModelUtils.unserialize_vars(
             obj.jeeves_vars)
     else:
         jeeves_vars = {}
     for var_name, value in jeeves_vars.iteritems():
         if var_name in env and env[var_name] != value:
             return None
         env[var_name] = value
         acquire_label_by_name(self.model._meta.app_label,
                               var_name,
                               obj=obj)
     for field, subs in fields.iteritems() if fields else []:
         if field and get_env(getattr(obj, field), subs, env) is None:
             return None
     return env
Example #9
0
    def save(self, *args, **kw):
        """Saves elements with the appropriate faceted labels.
        """

        def full_eval(val, env):
            """Evaluating a value in the context of an environment.
            """
            eval_expr = val.partialEval(env)
            return eval_expr.v

        # TODO: OMG why is this so long.
        if not self.jeeves_id:
            self.jeeves_id = JeevesModelUtils.get_random_jeeves_id()

        if kw.get("update_field", None) is not None:
            raise NotImplementedError("Partial saves not supported.")

        # Go through fields and do something. TODO: Figure out what.
        field_names = set()
        for field in self._meta.concrete_fields:
            if not field.primary_key and not hasattr(field, "through"):
                field_names.add(field.attname)

        # Go through labels and create facets.
        for label_name, field_name_list in self._jeeves_labels.iteritems():
            label = self.acquire_label(label_name)
            for field_name in field_name_list:
                public_field_value = getattr(self, field_name)
                private_field_value = getattr(self, "jeeves_get_private_" + field_name)(self)
                faceted_field_value = JeevesLib.mkSensitive(label, public_field_value, private_field_value).partialEval(
                    JeevesLib.jeevesState.pathenv.getEnv()
                )
                setattr(self, field_name, faceted_field_value)

        all_vars = []
        field_dict = {}
        env = JeevesLib.jeevesState.pathenv.getEnv()
        for field_name in field_names:
            value = getattr(self, field_name)
            field_val = fexpr_cast(value).partialEval(env)
            all_vars.extend(v.name for v in field_val.vars())
            field_dict[field_name] = field_val
        all_vars = list(set(all_vars))

        for cur_vars in JeevesModelUtils.powerset(all_vars):
            true_vars = list(cur_vars)
            false_vars = list(set(all_vars).difference(cur_vars))
            env_dict = dict(env)
            env_dict.update({tv: True for tv in true_vars})
            env_dict.update({fv: False for fv in false_vars})

            self.do_delete(env_dict)

            klass = self.__class__
            obj_to_save = klass(
                **{field_name: full_eval(field_value, env_dict) for field_name, field_value in field_dict.iteritems()}
            )

            all_jid_objs = list(klass._objects_ordinary.filter(jeeves_id=obj_to_save.jeeves_id).all())
            all_relevant_objs = [
                obj
                for obj in all_jid_objs
                if all(
                    field_name == "jeeves_vars" or getattr(obj_to_save, field_name) == getattr(obj, field_name)
                    for field_name in field_dict
                )
            ]

            # Optimization.
            # TODO: See how we can refactor this to shorten the function.
            while True:
                # check if we can collapse
                # if we can, repeat; otherwise, exit
                for i in xrange(len(all_relevant_objs)):
                    other_obj = all_relevant_objs[i]
                    diff_var = get_one_differing_var(env_dict, JeevesModelUtils.unserialize_vars(other_obj.jeeves_vars))
                    if diff_var is not None:
                        super(JeevesModel, other_obj).delete()
                        del env_dict[diff_var]
                        break
                else:
                    break

            obj_to_save.jeeves_vars = JeevesModelUtils.serialize_vars(env_dict)
            super(JeevesModel, obj_to_save).save(*args, **kw)
Example #10
0
    def save(self, *args, **kw):
        """Saves elements with the appropriate faceted labels.
        """
        def full_eval(val, env):
            """Evaluating a value in the context of an environment.
            """
            eval_expr = val.partialEval(env)
            return eval_expr.v

        # TODO: OMG why is this so long.
        if not self.jeeves_id:
            self.jeeves_id = JeevesModelUtils.get_random_jeeves_id()

        if kw.get("update_field", None) is not None:
            raise NotImplementedError("Partial saves not supported.")

        # Go through fields and do something. TODO: Figure out what.
        field_names = set()
        for field in self._meta.concrete_fields:
            if not field.primary_key and not hasattr(field, 'through'):
                field_names.add(field.attname)

        # Go through labels and create facets.
        for label_name, field_name_list in self._jeeves_labels.iteritems():
            label = self.acquire_label(label_name)
            for field_name in field_name_list:
                public_field_value = getattr(self, field_name)
                private_field_value = getattr(self
                                        , 'jeeves_get_private_' + \
                                            field_name)(self)
                faceted_field_value = JeevesLib.mkSensitive(label
                                        , public_field_value
                                        , private_field_value).partialEval(
                                            JeevesLib.jeevesState.pathenv. \
                                                getEnv())
                setattr(self, field_name, faceted_field_value)

        all_vars = []
        field_dict = {}
        env = JeevesLib.jeevesState.pathenv.getEnv()
        for field_name in field_names:
            value = getattr(self, field_name)
            field_val = fexpr_cast(value).partialEval(env)
            all_vars.extend(v.name for v in field_val.vars())
            field_dict[field_name] = field_val
        all_vars = list(set(all_vars))

        for cur_vars in JeevesModelUtils.powerset(all_vars):
            true_vars = list(cur_vars)
            false_vars = list(set(all_vars).difference(cur_vars))
            env_dict = dict(env)
            env_dict.update({tv: True for tv in true_vars})
            env_dict.update({fv: False for fv in false_vars})

            self.do_delete(env_dict)

            klass = self.__class__
            obj_to_save = klass(
                **{
                    field_name: full_eval(field_value, env_dict)
                    for field_name, field_value in field_dict.iteritems()
                })

            all_jid_objs = list(
                klass._objects_ordinary.filter(
                    jeeves_id=obj_to_save.jeeves_id).all())
            all_relevant_objs = [
                obj for obj in all_jid_objs
                if all(field_name == 'jeeves_vars' or getattr(
                    obj_to_save, field_name) == getattr(obj, field_name)
                       for field_name in field_dict)
            ]

            # Optimization.
            # TODO: See how we can refactor this to shorten the function.
            while True:
                # check if we can collapse
                # if we can, repeat; otherwise, exit
                for i in xrange(len(all_relevant_objs)):
                    other_obj = all_relevant_objs[i]
                    diff_var = get_one_differing_var(
                        env_dict,
                        JeevesModelUtils.unserialize_vars(
                            other_obj.jeeves_vars))
                    if diff_var is not None:
                        super(JeevesModel, other_obj).delete()
                        del env_dict[diff_var]
                        break
                else:
                    break

            obj_to_save.jeeves_vars = JeevesModelUtils.serialize_vars(env_dict)
            super(JeevesModel, obj_to_save).save(*args, **kw)