Source code for flask_assistant.manager

from flask_assistant import logger


def parse_context_name(context_obj):
    """Parses context name from Dialogflow's contextsession prefixed context path"""
    return context_obj["name"].split("/contexts/")[1]


class Context(dict):
    """This is a docstring for _Context"""

    def __init__(self, name, parameters={}, lifespan=5):

        self.name = name
        self.parameters = parameters
        self.lifespan = lifespan
        self._full_name = None

    # def __getattr__(self, param):
    #     if param in ['name', 'parameters', 'lifespan']:
    #         return getattr(self, param)
    #     return self.parameters[param]

    def set(self, param_name, value):
        self.parameters[param_name] = value

    def get(self, param):
        return self.parameters.get(param)

    def sync(self, context_json):
        self.__dict__.update(context_json)

    def __repr__(self):
        return self.name

    @property
    def serialize(self):
        return {
            "name": self._full_name,
            "lifespanCount": self.lifespan,
            "parameters": self.parameters,
        }


[docs]class ContextManager: def __init__(self, assist): self._assist = assist self._cache = {} @property def _project_id(self): return self._assist.project_id @property def _session_id(self): return self._assist.session_id def build_full_name(self, short_name): return "projects/{}/agent/sessions/{}/contexts/{}".format( self._project_id, self._session_id, short_name ) def add(self, *args, **kwargs): context = Context(*args, **kwargs) context._full_name = self.build_full_name(context.name) self._cache[context.name] = context return context def get(self, context_name, default=None): return self._cache.get(context_name, default) def set(self, context_name, param, val): context = self.get(context_name) context.set(param, val) self._cache[context.name] = context return context def get_param(self, context_name, param): return self._cache[context_name].parameters[param] def update(self, contexts_json): for obj in contexts_json: short_name = parse_context_name(obj) context = Context(short_name) context._full_name = obj["name"] context.lifespan = obj.get("lifespanCount", 0) context.parameters = obj.get("parameters", {}) self._cache[context.name] = context def clear_all(self): logger.info("Clearing all contexts") new_cache = {} for name, context in self._cache.items(): context.lifespan = 0 new_cache[name] = context self._cache = new_cache @property def status(self): return {"Active contexts": self.active, "Expired contexts": self.expired} @property def active(self): return [self._cache[c] for c in self._cache if self._cache[c].lifespan > 0] @property def expired(self): return [self._cache[c] for c in self._cache if self._cache[c].lifespan == 0]