from argparse import _SubParsersAction
from datetime import datetime
from functools import partial
from typing import List, Optional
from dateutil import parser as datetime_parser
from lxml.objectify import IntElement, StringElement
from q2_sdk.core.dynamic_imports import (
api_ExecuteStoredProcedure as ExecuteStoredProcedure,
)
from .db_object import DbObject
from .representation_row_base import RepresentationRowBase
[docs]
class AuthTokenRow(RepresentationRowBase):
# object name: type hinting = "column name in the db response"
AuthTokenID: IntElement = "AuthTokenID"
UserID: IntElement = "UserID"
CreateDate: StringElement = "CreateDate"
DeletedDate: StringElement = "DeletedDate"
Serial: StringElement = "Serial"
FirstUse: StringElement = "FirstUse"
[docs]
class AuthToken(DbObject):
# GET_BY_NAME_KEY = "column in the db response"
NAME = "AuthToken"
REPRESENTATION_ROW_CLASS = AuthTokenRow
[docs]
def add_arguments(self, parser: _SubParsersAction):
subparser = parser.add_parser("get_auth_token")
subparser.set_defaults(parser="get_auth_token")
subparser.set_defaults(func=partial(self.get, serialize_for_cli=True))
subparser.add_argument("user_id", type=int, help="Q2_User.UserID")
subparser.add_argument("-d", "--include_deleted", action="store_true")
subparser = parser.add_parser("add_auth_token")
subparser.set_defaults(parser="create_auth_token")
subparser.set_defaults(func=partial(self.create, serialize_for_cli=True))
subparser.add_argument("user_id", type=int, help="Q2_AuthToken.UserID")
subparser.add_argument("token_serial", type=str, help="Q2_AuthToken.Serial")
subparser.add_argument(
"-f", "--first_use", type=datetime_parser.parse, help="Q2_AuthToken.Serial"
)
subparser = parser.add_parser("remove_auth_token")
subparser.set_defaults(parser="delete_auth_token")
subparser.set_defaults(func=partial(self.delete))
subparser.add_argument(
"auth_token_id", type=int, help="Q2_AuthToken.AuthTokenID"
)
[docs]
async def get(
self, user_id: int, include_deleted=False, serialize_for_cli=False
) -> List[AuthTokenRow]:
assert isinstance(user_id, int), "Please supply a valid user id"
parameters = [
ExecuteStoredProcedure.SqlParam(
ExecuteStoredProcedure.DataType.Int, "user_id", user_id
)
]
if include_deleted:
parameters.append(
ExecuteStoredProcedure.SqlParam(
ExecuteStoredProcedure.DataType.Bit,
"include_deleted",
include_deleted,
)
)
response = await self.call_hq(
"sdk_GetAuthToken", ExecuteStoredProcedure.SqlParameters(parameters)
)
if serialize_for_cli:
columns = ["AuthTokenID", "UserID", "CreateDate", "Serial", "FirstUse"]
if include_deleted:
columns.append("DeletedDate")
response = self.serialize_for_cli(response, columns)
return response
[docs]
async def create(
self,
user_id: int,
token_serial: str,
first_use: Optional[datetime] = None,
serialize_for_cli=True,
):
assert isinstance(user_id, int), "Please supply a valid user id"
assert isinstance(token_serial, str), "Please supply a valid token serial"
parameters = [
ExecuteStoredProcedure.SqlParam(
ExecuteStoredProcedure.DataType.Int, "user_id", user_id
),
ExecuteStoredProcedure.SqlParam(
ExecuteStoredProcedure.DataType.VarChar, "serial", token_serial
),
]
if first_use:
assert isinstance(first_use, datetime), (
"first_use, if provided, must be a datetime instance"
)
parameters.append(
ExecuteStoredProcedure.SqlParam(
ExecuteStoredProcedure.DataType.Date,
"first_use",
first_use.strftime("%Y-%m-%dT%H:%M:%S"),
)
)
response = await self.call_hq(
"sdk_AddAuthToken", ExecuteStoredProcedure.SqlParameters(parameters)
)
if serialize_for_cli:
columns = ["AuthTokenID", "UserID", "CreateDate", "Serial", "FirstUse"]
response = self.serialize_for_cli(response, columns)
return response
[docs]
async def delete(self, auth_token_id: int):
return await self.call_hq(
"sdk_RemoveAuthToken",
ExecuteStoredProcedure.SqlParameters([
ExecuteStoredProcedure.SqlParam(
ExecuteStoredProcedure.DataType.Int,
"auth_token_id",
auth_token_id,
)
]),
)