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)
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)
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)
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)
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)
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)
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)
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))
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))
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())
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)
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)
async def run(self, void): if self.profile.operation.new: return Result(port="TRUE", value=True) return Result(port="FALSE", value=False)
async def run(self, payload): return Result(port="payload", value=payload)
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)
async def run(self, void): self.profile.operation.merge = self.merge_key return Result(value={}, port="void")
async def run(self, void): self.profile.operation.segment = True return Result(value={}, port="void")
async def run(self, payload): print("Hello, 2!") return Result(port="NODE2_o", value=[2])
async def run(self, void): return Result(port="event", value=self.event.dict())
async def run(self, NODE3_i): print("Hello, 3!") print(NODE3_i) NODE3_i += [3] return Result(port="NODE3_o", value=NODE3_i)
async def run(self, NODE2_i): print("Hello, 2!") print(NODE2_i) NODE2_i += [2] return Result(port="NODE2_o", value=NODE2_i)
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])
async def run(self, void): return Result(value=self.value, port="value")
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={})
async def run(self, **kwargs): print("Hello, 5!") print(kwargs) print() return Result(port="NODE5_o", value=5)
async def run(self, **kwargs): print("Hello, 6!") print(kwargs) return Result(port="say6_o", value=6)
async def run(self, void): return Result(port="session", value=self.session.dict())
async def run(self, void): return Result(port="profile", value=self.profile.dict())