from datetime import datetime
from argparse import _SubParsersAction
from functools import partial
from typing import List, Optional
from lxml.objectify import IntElement, StringElement, BoolElement
from q2_sdk.core.dynamic_imports import (
api_ExecuteStoredProcedure as ExecuteStoredProcedure,
)
from q2_sdk.hq.models.alerts import DateAlertDefinition
from q2_sdk.hq.models.hq_params.stored_procedure import Param
from .db_object import DbObject
from .representation_row_base import RepresentationRowBase
D_TYPES = ExecuteStoredProcedure.DataType
[docs]
class DateAlertRow(RepresentationRowBase):
# object name: type hinting = "column name in the db response"
AlertDefinitionID: IntElement = "AlertDefinitionID"
AlertTypeID: IntElement = "AlertTypeID"
UserID: IntElement = "UserID"
Enabled: BoolElement = "Enabled"
SendSecureMessage: BoolElement = "SendSecureMessage"
OneTimeAlert: BoolElement = "OneTimeAlert"
NotificationTypeID: IntElement = "NotificationTypeID"
NotificationTime: StringElement = "NotificationTime"
Operand: StringElement = "Operand"
ComparisonValue: StringElement = "ComparisonValue"
LastAlerted: StringElement = "LastAlerted"
CountryID: IntElement = "CountryID"
CityOrAreaCode: StringElement = "CityOrAreaCode"
LocalNumber: StringElement = "LocalNumber"
EmailAddress: StringElement = "EmailAddress"
CreateDate: StringElement = "CreateDate"
AlertDateTypeID: StringElement = "AlertDateTypeID"
UserText: StringElement = "UserText"
[docs]
class DateAlert(DbObject):
# GET_BY_NAME_KEY = "column in the db response"
NAME = "DateAlert"
REPRESENTATION_ROW_CLASS = DateAlertRow
[docs]
def add_arguments(self, parser: _SubParsersAction):
subparser = parser.add_parser("get_date_alert")
subparser.set_defaults(parser="get")
subparser.set_defaults(func=partial(self.get, serialize_for_cli=True))
subparser.add_argument("user_id", help="Q2_User.UserID", type=int)
[docs]
async def get(self, user_id: int, serialize_for_cli=False) -> List[DateAlertRow]:
assert isinstance(user_id, int), "Please supply a valid user id"
response = await self.call_hq(
"sdk_GetDateAlert",
ExecuteStoredProcedure.SqlParameters([
ExecuteStoredProcedure.SqlParam(
ExecuteStoredProcedure.DataType.Int, "user_id", user_id
)
]),
)
if serialize_for_cli:
columns = [
"AlertDefinitionID",
"UserID",
"Enabled",
"OneTimeAlert",
"NotificationTypeID",
"Operand",
"ComparisonValue",
"LastAlerted",
]
response = self.serialize_for_cli(response, columns)
return response
[docs]
async def create(
self, alert_info: DateAlertDefinition, create_date: Optional[str] = None
):
assert isinstance(alert_info, DateAlertDefinition), (
"Please supply a valid DateAlert object"
)
time_stamp = (
create_date
if create_date
else datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%f")
)
parameters = self._build_parameters(alert_info)
Param(time_stamp, D_TYPES.DateTime, "CreateDate").add_to_param_list(parameters)
response = await self.call_hq(
"Q2_AlertAddDate", ExecuteStoredProcedure.SqlParameters(parameters)
)
return response
[docs]
async def update(self, alert_info: DateAlertDefinition, alert_definition_id: int):
assert isinstance(alert_info, DateAlertDefinition), (
"Please supply a valid DateAlert object"
)
parameters = self._build_parameters(alert_info)
Param(alert_info.enabled, D_TYPES.Bit, "Enabled").add_to_param_list(parameters)
Param(alert_definition_id, D_TYPES.Int, "AlertDefinitionID").add_to_param_list(
parameters
)
response = await self.call_hq(
"Q2_AlertUpdateDate", ExecuteStoredProcedure.SqlParameters(parameters)
)
return response
@staticmethod
def _build_parameters(alert_info: DateAlertDefinition):
parameters = []
possible_params = [
Param(alert_info.user_id, D_TYPES.Int, "UserID"),
Param(alert_info.send_secure_message, D_TYPES.Bit, "SendSecureMessage"),
Param(alert_info.one_time_alert, D_TYPES.Bit, "OneTimeAlert"),
Param(alert_info.operand.value, D_TYPES.VarChar, "Operand"),
Param(alert_info.comparison_value, D_TYPES.VarChar, "ComparisonValue"),
Param(alert_info.alert_date_type.value, D_TYPES.Int, "AlertDateTypeID"),
Param(
alert_info.notification_type.value,
D_TYPES.Int,
"NotificationTypeID",
True,
),
Param(
alert_info.notification_time, D_TYPES.DateTime, "NotificationTime", True
),
Param(alert_info.email_address, D_TYPES.VarChar, "EmailAddress", True),
Param(alert_info.local_phone_number, D_TYPES.VarChar, "LocalNumber", True),
Param(
alert_info.city_or_area_code, D_TYPES.VarChar, "CityOrAreaCode", True
),
Param(alert_info.country_id, D_TYPES.Int, "CountryID", True),
Param(alert_info.user_text, D_TYPES.VarChar, "UserText", True),
]
for item in possible_params:
item.add_to_param_list(parameters)
return parameters