Add APM #184
| @@ -21,7 +21,7 @@ if config.sentry_enabled: | |||||||
|  |  | ||||||
|  |  | ||||||
| def create_bot() -> WebexBot: | def create_bot() -> WebexBot: | ||||||
|     # Create a Bot Object |     """Create and return a Webex Bot object.""" | ||||||
|     webex_bot: WebexBot = WebexBot( |     webex_bot: WebexBot = WebexBot( | ||||||
|         bot_name=config.bot_name, |         bot_name=config.bot_name, | ||||||
|         teams_bot_token=config.webex_token, |         teams_bot_token=config.webex_token, | ||||||
|   | |||||||
| @@ -1,10 +1,12 @@ | |||||||
| #!/usr/bin/env python3 | """Configuration module.""" | ||||||
|  |  | ||||||
| import os | import os | ||||||
|  |  | ||||||
|  |  | ||||||
| class Config: | class Config: | ||||||
|  |     """Configuration module.""" | ||||||
|     def __init__(self) -> None: |     def __init__(self) -> None: | ||||||
|  |         """Configuration module.""" | ||||||
|         self.__environment: str = os.environ.get("APP_LIFECYCLE", "DEV").upper() |         self.__environment: str = os.environ.get("APP_LIFECYCLE", "DEV").upper() | ||||||
|         self.__bot_name: str = os.environ["BOT_NAME"] |         self.__bot_name: str = os.environ["BOT_NAME"] | ||||||
|         self.__webex_token: str = os.environ["WEBEX_API_KEY"] |         self.__webex_token: str = os.environ["WEBEX_API_KEY"] | ||||||
| @@ -12,40 +14,52 @@ class Config: | |||||||
|         self.__admin_emails: list = os.environ["ADMIN_EMAIL"].split(",") |         self.__admin_emails: list = os.environ["ADMIN_EMAIL"].split(",") | ||||||
|         self.__n8n_webhook_url: str = os.environ["N8N_WEBHOOK_URL"] |         self.__n8n_webhook_url: str = os.environ["N8N_WEBHOOK_URL"] | ||||||
|         self.__sentry_dsn: str = os.environ.get("SENTRY_DSN", "") |         self.__sentry_dsn: str = os.environ.get("SENTRY_DSN", "") | ||||||
|         self.__sentry_enabled: bool = True if (os.environ.get("SENTRY_ENABLED", "False").upper() == "TRUE" and self.__sentry_dsn != "") else False |         self.__sentry_enabled: bool = bool( | ||||||
|  |             os.environ.get("SENTRY_ENABLED", "False").upper() == "TRUE" | ||||||
|  |             and self.__sentry_dsn != "" | ||||||
|  |         ) | ||||||
|  |  | ||||||
|     @property |     @property | ||||||
|     def environment(self) -> str: |     def environment(self) -> str: | ||||||
|  |         """Returns the current app lifecycle.""" | ||||||
|         return self.__environment |         return self.__environment | ||||||
|      |  | ||||||
|     @property |     @property | ||||||
|     def sentry_enabled(self) -> bool: |     def sentry_enabled(self) -> bool: | ||||||
|  |         """Returns True if Sentry SDK is enabled, else False.""" | ||||||
|         return self.__sentry_enabled |         return self.__sentry_enabled | ||||||
|      |  | ||||||
|     @property |     @property | ||||||
|     def sentry_dsn(self) -> str: |     def sentry_dsn(self) -> str: | ||||||
|  |         """Returns the Sentry DSN value if Sentry SDK is enabled AND | ||||||
|  |         Sentry DSN is set, else blank string.""" | ||||||
|         if not self.__sentry_enabled: |         if not self.__sentry_enabled: | ||||||
|             return "" |             return "" | ||||||
|         return self.__sentry_dsn |         return self.__sentry_dsn | ||||||
|      |  | ||||||
|     @property |     @property | ||||||
|     def bot_name(self) -> str: |     def bot_name(self) -> str: | ||||||
|  |         """Returns the bot name.""" | ||||||
|         return self.__bot_name |         return self.__bot_name | ||||||
|  |  | ||||||
|     @property |     @property | ||||||
|     def webex_token(self) -> str: |     def webex_token(self) -> str: | ||||||
|  |         """Returns the Webex API key.""" | ||||||
|         return self.__webex_token |         return self.__webex_token | ||||||
|  |  | ||||||
|     @property |     @property | ||||||
|     def admin_first_name(self) -> str: |     def admin_first_name(self) -> str: | ||||||
|  |         """Returns the first name of the bot admin.""" | ||||||
|         return self.__admin_first_name |         return self.__admin_first_name | ||||||
|  |  | ||||||
|     @property |     @property | ||||||
|     def admin_emails(self) -> list: |     def admin_emails(self) -> list: | ||||||
|  |         """Returns a list of admin email addresses.""" | ||||||
|         return self.__admin_emails |         return self.__admin_emails | ||||||
|  |  | ||||||
|     @property |     @property | ||||||
|     def n8n_webhook_url(self) -> str: |     def n8n_webhook_url(self) -> str: | ||||||
|  |         """Returns the n8n webhook URL.""" | ||||||
|         return self.__n8n_webhook_url |         return self.__n8n_webhook_url | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,7 +1,18 @@ | |||||||
|  | |||||||
| #!/usr/bin/env python3 | #!/usr/bin/env python3 | ||||||
|  |  | ||||||
|  | import pytz | ||||||
|   "zoneinfo" should be preferred to "pytz" when using Python 3.9 and laterDon't use `pytz` module with Python 3.9 and later.See more on SonarCloud ## "zoneinfo" should be preferred to "pytz" when using Python 3.9 and later
<!--SONAR_ISSUE_KEY:AY8BMVpXcfZYxM2gvceW-->Don't use `pytz` module with Python 3.9 and later. <p>See more on <a href="https://sonarcloud.io/project/issues?id=luketainton_roboluke-tasks&issues=AY8BMVpXcfZYxM2gvceW&open=AY8BMVpXcfZYxM2gvceW&pullRequest=184">SonarCloud</a></p>
[Show more details](https://github.com/luketainton/roboluke-tasks/security/code-scanning/4) | |||||||
|  |  | ||||||
|   "zoneinfo" should be preferred to "pytz" when using Python 3.9 and laterDon't use `pytz` module with Python 3.9 and later.See more on SonarCloud ## "zoneinfo" should be preferred to "pytz" when using Python 3.9 and later
<!--SONAR_ISSUE_KEY:AY8BMVpXcfZYxM2gvceW-->Don't use `pytz` module with Python 3.9 and later. <p>See more on <a href="https://sonarcloud.io/project/issues?id=luketainton_roboluke-tasks&issues=AY8BMVpXcfZYxM2gvceW&open=AY8BMVpXcfZYxM2gvceW&pullRequest=184">SonarCloud</a></p>
[Show more details](https://github.com/luketainton/roboluke-tasks/security/code-scanning/4) | |||||||
| from datetime import datetime | from datetime import datetime | ||||||
|  |  | ||||||
|  |  | ||||||
| def timestamp_to_date(timestamp: int) -> str: | def timestamp_to_date(timestamp: int) -> str: | ||||||
|     return datetime.utcfromtimestamp(timestamp).strftime("%Y-%m-%d") |     """Convert timestamp to date. | ||||||
|   "zoneinfo" should be preferred to "pytz" when using Python 3.9 and laterDon't use `pytz` module with Python 3.9 and later.See more on SonarCloud ## "zoneinfo" should be preferred to "pytz" when using Python 3.9 and later
<!--SONAR_ISSUE_KEY:AY8BMVpXcfZYxM2gvceW-->Don't use `pytz` module with Python 3.9 and later. <p>See more on <a href="https://sonarcloud.io/project/issues?id=luketainton_roboluke-tasks&issues=AY8BMVpXcfZYxM2gvceW&open=AY8BMVpXcfZYxM2gvceW&pullRequest=184">SonarCloud</a></p>
[Show more details](https://github.com/luketainton/roboluke-tasks/security/code-scanning/4)   "zoneinfo" should be preferred to "pytz" when using Python 3.9 and laterDon't use `pytz` module with Python 3.9 and later.See more on SonarCloud ## "zoneinfo" should be preferred to "pytz" when using Python 3.9 and later
<!--SONAR_ISSUE_KEY:AY8BMVpXcfZYxM2gvceW-->Don't use `pytz` module with Python 3.9 and later. <p>See more on <a href="https://sonarcloud.io/project/issues?id=luketainton_roboluke-tasks&issues=AY8BMVpXcfZYxM2gvceW&open=AY8BMVpXcfZYxM2gvceW&pullRequest=184">SonarCloud</a></p>
[Show more details](https://github.com/luketainton/roboluke-tasks/security/code-scanning/4) | |||||||
|  |      | ||||||
|   "zoneinfo" should be preferred to "pytz" when using Python 3.9 and laterDon't use `pytz` module with Python 3.9 and later.See more on SonarCloud ## "zoneinfo" should be preferred to "pytz" when using Python 3.9 and later
<!--SONAR_ISSUE_KEY:AY8BMVpXcfZYxM2gvceW-->Don't use `pytz` module with Python 3.9 and later. <p>See more on <a href="https://sonarcloud.io/project/issues?id=luketainton_roboluke-tasks&issues=AY8BMVpXcfZYxM2gvceW&open=AY8BMVpXcfZYxM2gvceW&pullRequest=184">SonarCloud</a></p>
[Show more details](https://github.com/luketainton/roboluke-tasks/security/code-scanning/4) | |||||||
|  |     Args: | ||||||
|   "zoneinfo" should be preferred to "pytz" when using Python 3.9 and laterDon't use `pytz` module with Python 3.9 and later.See more on SonarCloud ## "zoneinfo" should be preferred to "pytz" when using Python 3.9 and later
<!--SONAR_ISSUE_KEY:AY8BMVpXcfZYxM2gvceW-->Don't use `pytz` module with Python 3.9 and later. <p>See more on <a href="https://sonarcloud.io/project/issues?id=luketainton_roboluke-tasks&issues=AY8BMVpXcfZYxM2gvceW&open=AY8BMVpXcfZYxM2gvceW&pullRequest=184">SonarCloud</a></p>
[Show more details](https://github.com/luketainton/roboluke-tasks/security/code-scanning/4) | |||||||
|  |         timestamp (int): Timestamp to convert. | ||||||
|   "zoneinfo" should be preferred to "pytz" when using Python 3.9 and laterDon't use `pytz` module with Python 3.9 and later.See more on SonarCloud ## "zoneinfo" should be preferred to "pytz" when using Python 3.9 and later
<!--SONAR_ISSUE_KEY:AY8BMVpXcfZYxM2gvceW-->Don't use `pytz` module with Python 3.9 and later. <p>See more on <a href="https://sonarcloud.io/project/issues?id=luketainton_roboluke-tasks&issues=AY8BMVpXcfZYxM2gvceW&open=AY8BMVpXcfZYxM2gvceW&pullRequest=184">SonarCloud</a></p>
[Show more details](https://github.com/luketainton/roboluke-tasks/security/code-scanning/4) | |||||||
|  |      | ||||||
|   "zoneinfo" should be preferred to "pytz" when using Python 3.9 and laterDon't use `pytz` module with Python 3.9 and later.See more on SonarCloud ## "zoneinfo" should be preferred to "pytz" when using Python 3.9 and later
<!--SONAR_ISSUE_KEY:AY8BMVpXcfZYxM2gvceW-->Don't use `pytz` module with Python 3.9 and later. <p>See more on <a href="https://sonarcloud.io/project/issues?id=luketainton_roboluke-tasks&issues=AY8BMVpXcfZYxM2gvceW&open=AY8BMVpXcfZYxM2gvceW&pullRequest=184">SonarCloud</a></p>
[Show more details](https://github.com/luketainton/roboluke-tasks/security/code-scanning/4) | |||||||
|  |     Returns: | ||||||
|   "zoneinfo" should be preferred to "pytz" when using Python 3.9 and laterDon't use `pytz` module with Python 3.9 and later.See more on SonarCloud ## "zoneinfo" should be preferred to "pytz" when using Python 3.9 and later
<!--SONAR_ISSUE_KEY:AY8BMVpXcfZYxM2gvceW-->Don't use `pytz` module with Python 3.9 and later. <p>See more on <a href="https://sonarcloud.io/project/issues?id=luketainton_roboluke-tasks&issues=AY8BMVpXcfZYxM2gvceW&open=AY8BMVpXcfZYxM2gvceW&pullRequest=184">SonarCloud</a></p>
[Show more details](https://github.com/luketainton/roboluke-tasks/security/code-scanning/4) | |||||||
|  |         str: Date in the format YYYY-MM-DD. | ||||||
|   "zoneinfo" should be preferred to "pytz" when using Python 3.9 and laterDon't use `pytz` module with Python 3.9 and later.See more on SonarCloud ## "zoneinfo" should be preferred to "pytz" when using Python 3.9 and later
<!--SONAR_ISSUE_KEY:AY8BMVpXcfZYxM2gvceW-->Don't use `pytz` module with Python 3.9 and later. <p>See more on <a href="https://sonarcloud.io/project/issues?id=luketainton_roboluke-tasks&issues=AY8BMVpXcfZYxM2gvceW&open=AY8BMVpXcfZYxM2gvceW&pullRequest=184">SonarCloud</a></p>
[Show more details](https://github.com/luketainton/roboluke-tasks/security/code-scanning/4) | |||||||
|  |     """ | ||||||
|   "zoneinfo" should be preferred to "pytz" when using Python 3.9 and laterDon't use `pytz` module with Python 3.9 and later.See more on SonarCloud ## "zoneinfo" should be preferred to "pytz" when using Python 3.9 and later
<!--SONAR_ISSUE_KEY:AY8BMVpXcfZYxM2gvceW-->Don't use `pytz` module with Python 3.9 and later. <p>See more on <a href="https://sonarcloud.io/project/issues?id=luketainton_roboluke-tasks&issues=AY8BMVpXcfZYxM2gvceW&open=AY8BMVpXcfZYxM2gvceW&pullRequest=184">SonarCloud</a></p>
[Show more details](https://github.com/luketainton/roboluke-tasks/security/code-scanning/4) | |||||||
|  |     return datetime.fromtimestamp(timestamp=timestamp, tz=pytz.utc).strftime("%Y-%m-%d") | ||||||
|   "zoneinfo" should be preferred to "pytz" when using Python 3.9 and laterDon't use `pytz` module with Python 3.9 and later.See more on SonarCloud ## "zoneinfo" should be preferred to "pytz" when using Python 3.9 and later
<!--SONAR_ISSUE_KEY:AY8BMVpXcfZYxM2gvceW-->Don't use `pytz` module with Python 3.9 and later. <p>See more on <a href="https://sonarcloud.io/project/issues?id=luketainton_roboluke-tasks&issues=AY8BMVpXcfZYxM2gvceW&open=AY8BMVpXcfZYxM2gvceW&pullRequest=184">SonarCloud</a></p>
[Show more details](https://github.com/luketainton/roboluke-tasks/security/code-scanning/4) | |||||||
|  |  | ||||||
|   "zoneinfo" should be preferred to "pytz" when using Python 3.9 and laterDon't use `pytz` module with Python 3.9 and later.See more on SonarCloud ## "zoneinfo" should be preferred to "pytz" when using Python 3.9 and later
<!--SONAR_ISSUE_KEY:AY8BMVpXcfZYxM2gvceW-->Don't use `pytz` module with Python 3.9 and later. <p>See more on <a href="https://sonarcloud.io/project/issues?id=luketainton_roboluke-tasks&issues=AY8BMVpXcfZYxM2gvceW&open=AY8BMVpXcfZYxM2gvceW&pullRequest=184">SonarCloud</a></p>
[Show more details](https://github.com/luketainton/roboluke-tasks/security/code-scanning/4) | |||||||
|   | |||||||
|   "zoneinfo" should be preferred to "pytz" when using Python 3.9 and laterDon't use `pytz` module with Python 3.9 and later.See more on SonarCloud ## "zoneinfo" should be preferred to "pytz" when using Python 3.9 and later
<!--SONAR_ISSUE_KEY:AY8BMVpXcfZYxM2gvceW-->Don't use `pytz` module with Python 3.9 and later. <p>See more on <a href="https://sonarcloud.io/project/issues?id=luketainton_roboluke-tasks&issues=AY8BMVpXcfZYxM2gvceW&open=AY8BMVpXcfZYxM2gvceW&pullRequest=184">SonarCloud</a></p>
[Show more details](https://github.com/luketainton/roboluke-tasks/security/code-scanning/4)   "zoneinfo" should be preferred to "pytz" when using Python 3.9 and laterDon't use `pytz` module with Python 3.9 and later.See more on SonarCloud ## "zoneinfo" should be preferred to "pytz" when using Python 3.9 and later
<!--SONAR_ISSUE_KEY:AY8BMVpXcfZYxM2gvceW-->Don't use `pytz` module with Python 3.9 and later. <p>See more on <a href="https://sonarcloud.io/project/issues?id=luketainton_roboluke-tasks&issues=AY8BMVpXcfZYxM2gvceW&open=AY8BMVpXcfZYxM2gvceW&pullRequest=184">SonarCloud</a></p>
[Show more details](https://github.com/luketainton/roboluke-tasks/security/code-scanning/4) | |||||||
| @@ -5,6 +5,14 @@ from app.utils.config import config | |||||||
|  |  | ||||||
|  |  | ||||||
| def __n8n_post(data: dict) -> bool: | def __n8n_post(data: dict) -> bool: | ||||||
|  |     """Post data to N8N webhook URL. | ||||||
|  |      | ||||||
|  |     Args: | ||||||
|  |         data (dict): Data to post to webhook URL. | ||||||
|  |      | ||||||
|  |     Returns: | ||||||
|  |         bool: True if successful, else False. | ||||||
|  |     """ | ||||||
|     headers: dict = {"Content-Type": "application/json"} |     headers: dict = {"Content-Type": "application/json"} | ||||||
|     resp: requests.Response = requests.post( |     resp: requests.Response = requests.post( | ||||||
|         url=config.n8n_webhook_url, |         url=config.n8n_webhook_url, | ||||||
| @@ -17,6 +25,17 @@ def __n8n_post(data: dict) -> bool: | |||||||
|  |  | ||||||
|  |  | ||||||
| def submit_task(summary, description, completion_date, requestor) -> bool: | def submit_task(summary, description, completion_date, requestor) -> bool: | ||||||
|  |     """Submit task to N8N webhook URL. | ||||||
|  |      | ||||||
|  |     Args: | ||||||
|  |         summary (str): Summary of task. | ||||||
|  |         description (str): Description of task. | ||||||
|  |         completion_date (str): Completion date of task. | ||||||
|  |         requestor (str): Requestor of task. | ||||||
|  |      | ||||||
|  |     Returns: | ||||||
|  |         bool: True if successful, else False. | ||||||
|  |     """ | ||||||
|     with sentry_sdk.start_transaction(name="submit_task"): |     with sentry_sdk.start_transaction(name="submit_task"): | ||||||
|         data: dict = { |         data: dict = { | ||||||
|             "requestor": requestor, |             "requestor": requestor, | ||||||
| @@ -29,6 +48,14 @@ def submit_task(summary, description, completion_date, requestor) -> bool: | |||||||
|  |  | ||||||
|  |  | ||||||
| def get_tasks(requestor) -> bool: | def get_tasks(requestor) -> bool: | ||||||
|  |     """Get tasks from N8N webhook URL. | ||||||
|  |      | ||||||
|  |     Args: | ||||||
|  |         requestor (str): Requestor of tasks. | ||||||
|  |      | ||||||
|  |     Returns: | ||||||
|  |         bool: True if successful, else False. | ||||||
|  |     """ | ||||||
|     with sentry_sdk.start_transaction(name="get_tasks"): |     with sentry_sdk.start_transaction(name="get_tasks"): | ||||||
|         headers: dict = {"Content-Type": "application/json"} |         headers: dict = {"Content-Type": "application/json"} | ||||||
|         resp: requests.Response = requests.get( |         resp: requests.Response = requests.get( | ||||||
|   | |||||||
| @@ -30,6 +30,7 @@ PyJWT==2.8.0 | |||||||
| pyparsing==3.1.2 | pyparsing==3.1.2 | ||||||
| python-dateutil==2.9.0.post0 | python-dateutil==2.9.0.post0 | ||||||
| python-dotenv==1.0.1 | python-dotenv==1.0.1 | ||||||
|  | pytz==2024.1 | ||||||
| PyYAML==6.0.1 | PyYAML==6.0.1 | ||||||
| requests==2.31.0 | requests==2.31.0 | ||||||
| requests-toolbelt==1.0.0 | requests-toolbelt==1.0.0 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	
"zoneinfo" should be preferred to "pytz" when using Python 3.9 and later
Don't use `pytz` module with Python 3.9 and later.See more on SonarCloud
Show more details
"zoneinfo" should be preferred to "pytz" when using Python 3.9 and later
Don't use `pytz` module with Python 3.9 and later.See more on SonarCloud
Show more details