diff --git a/app/main.py b/app/main.py index 738d852..4affc14 100644 --- a/app/main.py +++ b/app/main.py @@ -21,7 +21,7 @@ if config.sentry_enabled: def create_bot() -> WebexBot: - # Create a Bot Object + """Create and return a Webex Bot object.""" webex_bot: WebexBot = WebexBot( bot_name=config.bot_name, teams_bot_token=config.webex_token, diff --git a/app/utils/config.py b/app/utils/config.py index 5152b20..f12eb7a 100644 --- a/app/utils/config.py +++ b/app/utils/config.py @@ -1,10 +1,12 @@ -#!/usr/bin/env python3 +"""Configuration module.""" import os class Config: + """Configuration module.""" def __init__(self) -> None: + """Configuration module.""" self.__environment: str = os.environ.get("APP_LIFECYCLE", "DEV").upper() self.__bot_name: str = os.environ["BOT_NAME"] 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.__n8n_webhook_url: str = os.environ["N8N_WEBHOOK_URL"] 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 def environment(self) -> str: + """Returns the current app lifecycle.""" return self.__environment - + @property def sentry_enabled(self) -> bool: + """Returns True if Sentry SDK is enabled, else False.""" return self.__sentry_enabled - + @property 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: return "" return self.__sentry_dsn - + @property def bot_name(self) -> str: + """Returns the bot name.""" return self.__bot_name @property def webex_token(self) -> str: + """Returns the Webex API key.""" return self.__webex_token @property def admin_first_name(self) -> str: + """Returns the first name of the bot admin.""" return self.__admin_first_name @property def admin_emails(self) -> list: + """Returns a list of admin email addresses.""" return self.__admin_emails @property def n8n_webhook_url(self) -> str: + """Returns the n8n webhook URL.""" return self.__n8n_webhook_url diff --git a/app/utils/datetime.py b/app/utils/datetime.py index 8526bb1..76cdd64 100644 --- a/app/utils/datetime.py +++ b/app/utils/datetime.py @@ -1,7 +1,18 @@ #!/usr/bin/env python3 +import pytz + from datetime import datetime def timestamp_to_date(timestamp: int) -> str: - return datetime.utcfromtimestamp(timestamp).strftime("%Y-%m-%d") + """Convert timestamp to date. + + Args: + timestamp (int): Timestamp to convert. + + Returns: + str: Date in the format YYYY-MM-DD. + """ + return datetime.fromtimestamp(timestamp=timestamp, tz=pytz.utc).strftime("%Y-%m-%d") + diff --git a/app/utils/n8n.py b/app/utils/n8n.py index e9ca514..4c0f84b 100644 --- a/app/utils/n8n.py +++ b/app/utils/n8n.py @@ -5,6 +5,14 @@ from app.utils.config import config 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"} resp: requests.Response = requests.post( url=config.n8n_webhook_url, @@ -17,6 +25,17 @@ def __n8n_post(data: dict) -> 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"): data: dict = { "requestor": requestor, @@ -29,6 +48,14 @@ def submit_task(summary, description, completion_date, 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"): headers: dict = {"Content-Type": "application/json"} resp: requests.Response = requests.get( diff --git a/requirements.txt b/requirements.txt index f1aee33..b5aadcd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -30,6 +30,7 @@ PyJWT==2.8.0 pyparsing==3.1.2 python-dateutil==2.9.0.post0 python-dotenv==1.0.1 +pytz==2024.1 PyYAML==6.0.1 requests==2.31.0 requests-toolbelt==1.0.0