Ejemplo n.º 1
0
    async def run(self, payload):

        if self.payload_in == 'params':
            if type(payload) not in [str, bool, int, float]:
                raise ValueError(
                    "Payload is not str, bool, int or float. Can not convert it URL into params."
                )

        timeout = aiohttp.ClientTimeout(total=self.timeout)
        async with aiohttp.ClientSession(timeout=timeout) as session:

            payload = json.dumps(payload, default=self._datetime_handler)
            payload = json.loads(payload)

            kwargs = {
                "json" if self.payload_in == 'body' else 'params': payload
            }

            async with session.request(method=self.method,
                                       url=self.url,
                                       **kwargs) as response:

                result = {
                    "status": response.status,
                    "content": await response.json()
                }
                if response.status in [200, 201, 202, 203]:
                    return Result(port="response",
                                  value=result), Result(port="error",
                                                        value=None)
                else:
                    return Result(port="response",
                                  value=None), Result(port="error",
                                                      value=result)
Ejemplo n.º 2
0
 async def run(self, payload):
     print("Hello 1!")
     print("conditional=", self.condition)
     print("payload", payload)
     if self.condition == 'abc':
         return Result(port="TRUE", value=["1t"]), Result(port="FALSE",
                                                          value=None)
     else:
         return Result(port="FALSE", value=["1f"]), Result(port="TRUE",
                                                           value=None)
Ejemplo n.º 3
0
    async def run(self, payload: dict):

        try:
            flat_payload = flatten(copy.deepcopy(payload))
        except Exception as e:
            raise ValueError("Could not flatten payload. The following error occurred: `{}`".format(str(e)))

        if self.condition is None or self.condition == "please-configure-condition":
            raise ValueError("Condition is not set. Define it in config section.")

        if Condition.evaluate(self.condition, flat_payload):
            return Result(port="TRUE", value=payload)
        else:
            return Result(port="FALSE", value=payload)
Ejemplo n.º 4
0
    async def run(self, payload):

        dot = DotAccessor(self.profile, self.session, payload, self.event,
                          self.flow)

        try:

            value = dot[self.field]

            if value is None:
                value = 0

        except KeyError:
            value = 0

        if type(value) != int:
            raise ValueError("Filed `{}` value is not numeric.".format(
                self.field))

        value += self.increment

        dot[self.field] = value

        self.profile.replace(Profile(**dot.profile))

        return Result(port="payload", value=payload)
Ejemplo n.º 5
0
    async def run(self, payload: dict):

        dot = DotAccessor(self.profile, self.session, payload, self.event,
                          self.flow)
        for destination, value in self.mapping.items():
            if destination in dot:
                if not isinstance(dot[destination], list):
                    dot[destination] = [dot[destination]]

                if value not in dot[destination]:
                    dot[destination].append(value)
            else:
                dot[destination] = value

        if not isinstance(dot.profile['traits']['private'], dict):
            raise ValueError(
                "Error when appending [email protected] to value `{}`. Private must have key:value pair. "
                "E.g. `name`: `{}`".format(dot.profile['traits']['private'],
                                           dot.profile['traits']['private']))

        if not isinstance(dot.profile['traits']['public'], dict):
            raise ValueError(
                "Error when appending [email protected] to value `{}`. Public must have key:value pair. "
                "E.g. `name`: `{}`".format(dot.profile['traits']['public'],
                                           dot.profile['traits']['public']))

        profile = Profile(**dot.profile)
        event = Event(**dot.event)
        session = Session(**dot.session)

        self.profile.replace(profile)
        self.session.replace(session)
        self.event.replace(event)

        return Result(port="payload", value=payload)
Ejemplo n.º 6
0
    async def run(self, payload):
        if self.profile.stats is None:
            self.profile.stats = ProfileStats()

        self.profile.increase_views()

        return Result(port="payload", value=payload)
Ejemplo n.º 7
0
    async def run(self, payload):

        if self.profile.stats is None:
            self.profile.stats = ProfileStats()

        if self.session.operation.new:
            self.profile.increase_visits()

        return Result(port="payload", value=payload)
Ejemplo n.º 8
0
 async def run(self, NODE4_2_i=None, NODE4_3_i=None, NODE4_1_i=None):
     print("Hello, 4!")
     print("1={} 2={} 3={}".format(NODE4_1_i, NODE4_2_i, NODE4_3_i))
     if NODE4_2_i:
         NODE4_2_i += [4]
     if NODE4_3_i:
         NODE4_3_i += [4]
     if NODE4_1_i:
         NODE4_1_i += [4]
     return Result(port="NODE4_o", value=(NODE4_2_i, NODE4_3_i, NODE4_1_i))
Ejemplo n.º 9
0
 async def run(self, INP1=None, INP2=None, INP3=None):
     print("Hello, 4!")
     print("1={} 2={} 3={}".format(INP1, INP2, INP3))
     if INP1:
         INP1 += [4]
     if INP2:
         INP2 += [4]
     if INP3:
         INP3 += [4]
     return Result(port="NODE4_o", value=(INP1, INP2, INP3))
Ejemplo n.º 10
0
    async def run(self, **kwargs):
        if self.debug:

            event_entity = Entity(id=self.event_id)
            event = await event_entity.storage('event').load(Event
                                                             )  # type: Event

            if event is None:
                raise ValueError(
                    "There is no event with id `{}`. Check configuration for correct event id."
                    .format(self.event_id))

            self.event.replace(event)

            profile_entity = Entity(id=self.event.profile.id)
            session_entity = Entity(id=self.event.session.id)
            profile_task = asyncio.create_task(
                profile_entity.storage('profile').load(Profile))
            session_task = asyncio.create_task(
                session_entity.storage('session').load(Session))

            profile = await profile_task
            session = await session_task

            if session is None:
                raise ValueError(
                    "Event id `{}` has reference to empty session id `{}`. Debug stopped. This event is corrupted."
                    .format(self.event_id, self.event.session.id))

            self.session.replace(session)

            if profile is None:
                raise ValueError(
                    "Event id `{}` has reference to empty profile id `{}`. Debug stopped. This event is corrupted."
                    .format(self.event_id, self.event.profile.id))

            self.profile.replace(profile)

            return Result(port="event", value=self.event.dict())

        return Result(port="event", value=self.event.dict())
Ejemplo n.º 11
0
    async def run(self, payload: dict):

        dot = DotAccessor(self.profile, self.session, payload, self.event,
                          self.flow)

        for value in self.delete:
            del dot[value]

        profile = Profile(**dot.profile)

        self.profile.replace(profile)

        return Result(port="payload", value=payload)
Ejemplo n.º 12
0
    async def run(self, payload):

        dot = DotAccessor(self.profile, self.session, payload, self.event, self.flow)
        try:
            event_properties = dot[self.event_properties]
        except ValueError:
            # If there is error that means properties mus be as defined not a path.
            if isinstance(self.event_properties, dict):
                event_properties = self.event_properties
            else:
                raise ValueError("Properties must be either dict or dot notation path to event, profile or payload. Please correct action configuration.")

        session_copy = self.session.copy(deep=True)
        profile_copy = self.profile.copy(deep=True)

        event_result = await RulesEngine.raise_event(
            self.event_type,
            event_properties,
            session_copy,
            profile_copy,
            source_id=None)

        return Result(port="result", value=event_result)
Ejemplo n.º 13
0
    async def run(self, void):
        if self.profile.operation.new:
            return Result(port="TRUE", value=True)

        return Result(port="FALSE", value=False)
Ejemplo n.º 14
0
 async def run(self, payload):
     return Result(port="payload", value=payload)
Ejemplo n.º 15
0
    async def run(self, void):

        try:
            if not isinstance(self.session.context, dict):
                raise KeyError("No session context defined.")

            ua = self.session.context['browser']['browser']['userAgent']

            detector = DeviceDetector(ua, skip_bot_detection=False)
            device = detector.parse()

            response = {
                'status': {
                    "code": 200,
                    "message": "OK"
                },
                "device": {
                    "model": {
                        "name": device.device_model(),
                        "brand": {
                            "name": device.device_brand_name(),
                        },
                        "type": device.device_type()
                    },
                    "os": {
                        "name": device.os_name(),
                        "version": device.os_version(),
                    },
                    "client": {
                        "type": device.client_type(),
                        "name": device.client_name(),
                        "version": device.secondary_client_version(),
                        "engine": device.engine(),
                    },
                    "type": {
                        "mobile": device.is_mobile(),
                        "desktop": device.is_desktop(),
                        "bot": device.is_bot(),
                        "tv": device.is_television(),
                    }
                }
            }
        except KeyError as e:
            response = {
                'status': {
                    "code": 500,
                    "message": str(e)
                },
                "device": {
                    "model": {
                        "name": 'Unknown',
                        "brand": {
                            "name": 'Unknown',
                        },
                        "type": 'Unknown'
                    },
                    "os": {
                        "name": 'Unknown',
                        "version": 'Unknown',
                    },
                    "client": {
                        "type": 'Unknown',
                        "name": 'Unknown',
                        "version": 'Unknown',
                        "engine": 'Unknown',
                    },
                    "type": {
                        "mobile": 'Unknown',
                        "desktop": 'Unknown',
                        "bot": 'Unknown',
                        "tv": 'Unknown',
                    }
                }
            }

        return Result(port="client-info", value=response)
Ejemplo n.º 16
0
 async def run(self, void):
     self.profile.operation.merge = self.merge_key
     return Result(value={}, port="void")
Ejemplo n.º 17
0
 async def run(self, void):
     self.profile.operation.segment = True
     return Result(value={}, port="void")
Ejemplo n.º 18
0
 async def run(self, payload):
     print("Hello, 2!")
     return Result(port="NODE2_o", value=[2])
Ejemplo n.º 19
0
 async def run(self, void):
     return Result(port="event", value=self.event.dict())
Ejemplo n.º 20
0
 async def run(self, NODE3_i):
     print("Hello, 3!")
     print(NODE3_i)
     NODE3_i += [3]
     return Result(port="NODE3_o", value=NODE3_i)
Ejemplo n.º 21
0
 async def run(self, NODE2_i):
     print("Hello, 2!")
     print(NODE2_i)
     NODE2_i += [2]
     return Result(port="NODE2_o", value=NODE2_i)
Ejemplo n.º 22
0
 async def run(self, payload: dict):
     dot = DotAccessor(self.profile, self.session, payload, self.event,
                       self.flow)
     return Result(port="trait", value=dot[self.property])
Ejemplo n.º 23
0
 async def run(self, void):
     return Result(value=self.value, port="value")
Ejemplo n.º 24
0
 async def run(self, void):
     if self.debug and self.profile.id == '@debug-profile-id':
         raise ValueError(
             "Start action can not run in debug mode without connection to Debug action."
         )
     return Result(port="payload", value={})
Ejemplo n.º 25
0
 async def run(self, **kwargs):
     print("Hello, 5!")
     print(kwargs)
     print()
     return Result(port="NODE5_o", value=5)
Ejemplo n.º 26
0
 async def run(self, **kwargs):
     print("Hello, 6!")
     print(kwargs)
     return Result(port="say6_o", value=6)
Ejemplo n.º 27
0
 async def run(self, void):
     return Result(port="session", value=self.session.dict())
Ejemplo n.º 28
0
 async def run(self, void):
     return Result(port="profile", value=self.profile.dict())