• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

digiteinfotech / kairon / 13115292153

03 Feb 2025 02:07PM UTC coverage: 90.041% (-0.2%) from 90.222%
13115292153

Pull #1779

github

web-flow
Merge eabf68bed into 0e29863a1
Pull Request #1779: Callback Service Change

193 of 272 new or added lines in 6 files covered. (70.96%)

5 existing lines in 2 files now uncovered.

24656 of 27383 relevant lines covered (90.04%)

0.9 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

86.36
/kairon/async_callback/lambda_function.py
1
from functools import partial
1✔
2

3
from types import ModuleType
1✔
4
from typing import Text, Dict, Callable
1✔
5

6
from AccessControl.ZopeGuards import _safe_globals
1✔
7
from RestrictedPython import compile_restricted
1✔
8
from RestrictedPython.Guards import safer_getattr
1✔
9
import orjson as json
1✔
10
from AccessControl.SecurityInfo import allow_module
1✔
11
from datetime import datetime, date
1✔
12
from requests import Response
1✔
13
from kairon.async_callback.scheduler import add_schedule_job, delete_schedule_job, generate_id
1✔
14
from kairon.async_callback.mail import send_email
1✔
15
from functools import *
1✔
16
from loguru import logger
1✔
17

18
allow_module("datetime")
1✔
19
allow_module("time")
1✔
20
allow_module("requests")
1✔
21
allow_module("googlemaps")
1✔
22
allow_module("_strptime")
1✔
23

24

25
def execute_script(source_code: Text, predefined_objects: Dict = None):
1✔
26
    logger.info(source_code)
1✔
27
    logger.info(predefined_objects)
1✔
28

29
    if not predefined_objects:
1✔
NEW
30
        predefined_objects = {}
×
31

32
    bot = predefined_objects.get("bot")
1✔
33

34
    global_safe = _safe_globals
1✔
35
    global_safe['_getattr_'] = safer_getattr
1✔
36
    global_safe['json'] = json
1✔
37
    global_safe['add_schedule_job'] = partial(add_schedule_job, bot=bot)
1✔
38
    global_safe['delete_schedule_job'] = partial(delete_schedule_job, bot=bot)
1✔
39
    global_safe['send_email'] = partial(send_email, bot=bot)
1✔
40
    global_safe["generate_id"] = generate_id
1✔
41

42
    byte_code = compile_restricted(
1✔
43
        source_code,
44
        filename='<inline code>',
45
        mode='exec',
46
        flags=0,
47
    )
48
    exec(byte_code, global_safe, predefined_objects)
1✔
49
    filtered_locals = perform_cleanup(predefined_objects)
1✔
50
    return filtered_locals
1✔
51

52

53
def perform_cleanup(local_vars: Dict):
1✔
54
    logger.info(f"local_vars: {local_vars}")
1✔
55
    filtered_locals = {}
1✔
56
    if local_vars:
1✔
57
        for key, value in local_vars.items():
1✔
58
            if not isinstance(value, Callable) and not isinstance(value, ModuleType):
1✔
59
                if isinstance(value, datetime):
1✔
NEW
60
                    value = value.strftime("%m/%d/%Y, %H:%M:%S")
×
61
                elif isinstance(value, date):
1✔
NEW
62
                    value = value.strftime("%Y-%m-%d")
×
63
                elif isinstance(value, Response):
1✔
NEW
64
                    value = value.text
×
65
                filtered_locals[key] = value
1✔
66
    logger.info(f"filtered_vars: {filtered_locals}")
1✔
67
    return filtered_locals
1✔
68

69

70
def lambda_handler(event, context):
1✔
71
    print(event)
1✔
72
    output = {
1✔
73
        "statusCode": 200,
74
        "statusDescription": "200 OK",
75
        "isBase64Encoded": False,
76
        "headers": {
77
            "Content-Type": "text/html; charset=utf-8"
78
        },
79
        "body": None
80
    }
81
    data = event
1✔
82
    if isinstance(data, list):
1✔
NEW
83
        data = {item['name'].lower(): item['value'] for item in data}
×
84
    try:
1✔
85
        response = execute_script(data['source_code'], data.get('predefined_objects'))
1✔
86
        output["body"] = response
1✔
NEW
87
    except Exception as e:
×
NEW
88
        logger.exception(e)
×
NEW
89
        output["statusCode"] = 422
×
NEW
90
        output["body"] = str(e)
×
91

92
    logger.info(output)
1✔
93
    return output
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc