Commit f11cb2cb by Javier

Documentación

parent 62e5907c
...@@ -88,73 +88,81 @@ class Account(BaseModel): ...@@ -88,73 +88,81 @@ class Account(BaseModel):
) )
class AccountDetails(BaseModel): class ConnectionData(BaseModel):
"""Datos de Conexión
number: str = Body( """
..., regex=r'[89][1-9]\d{7}', example='856135158', title='Número', description='Identificador de entrada y salidas de Llamadas'
)
password: str = Body( account: str = Body(
..., title='Contraseña', description='Credencial Cuenta SIP para host dinámico.' ..., title='Cuenta', description='Usuario/Número de cuenta para Autentificación SIP.'
) )
host: str = Body( password: str = Body(
..., title='Host', description='Dirección desde la que se conecta el usuario.' ..., title='Contraseña', description='Credencial para la Autentificación.'
) )
credit: float = Body( peer_details: str = Body(
..., title='Saldo Disponible', description='Adeudo o activo que tiene el cliente.' default=None, title='Peer Details', description='Credenciales para la salida por troncal en Centralitas.'
) )
rate: Rate = Body( user_details: str = Body(
default=Rate.ESTANDAR, title='Tarifa', description='Plan de Precios de la Línea' default=None, title='User Context', description='Credenciales para la entrada por troncal en Centralitas.'
) )
class Config: class Config:
schema_extra = { schema_extra = {
"example": { "example": {
"number": "856135158", "account": "856135158",
"password": "rentel58", "password": "rentel58",
"host": "192.168.2.71", "peer_details": "type = friend username = 951203503 host = 192.168.2.84 nat = force_rport, comedia qualify = yes insecure = invite, port",
"credit": 32.45, "user_details": "type = friend host = 192.168.2.84 nat = force_rport, comedia qualify = yes insecure = invite, port"
"rate": Rate.PLANA_2000
} }
} }
class ConnectionData(BaseModel): class AccountDetails(BaseModel):
"""Datos de Conexión """Detalles de una cuenta SIP
Muestra los detalles de conexión y crédito de un usuario.
""" """
account: str = Body( host: str = Body(
..., title='Cuenta', description='Usuario/Número de cuenta para Autentificación SIP.' ..., title='Host', description='Dirección desde la que se conecta el usuario.'
) )
password: str = Body( credit: float = Body(
..., title='Contraseña', description='Credencial para la Autentificación.' ..., title='Saldo Disponible', description='Adeudo o activo que tiene el cliente.'
) )
peer_details: str = Body( rate: Rate = Body(
default=None, title='Peer Details', description='Credenciales para la salida por troncal en Centralitas.' default=Rate.ESTANDAR, title='Tarifa', description='Plan de Precios de la Línea'
) )
user_details: str = Body( credentials: ConnectionData = Body(
default=None, title='User Context', description='Credenciales para la entrada por troncal en Centralitas.' ..., title='Datos de Conexión',
) )
class Config: class Config:
schema_extra = { schema_extra = {
"example": { "example": {
"account": "856135158", "number": "856135158",
"password": "rentel58", "password": "rentel58",
"peer_details": "type = friend username = 951203503 host = 192.168.2.84 nat = force_rport, comedia qualify = yes insecure = invite, port", "host": "192.168.2.71",
"user_details": "type = friend host = 192.168.2.84 nat = force_rport, comedia qualify = yes insecure = invite, port" "credit": 32.45,
"rate": Rate.PLANA_2000
} }
} }
def encode_rate(rate: Rate = Rate.ESTANDAR) -> Tuple[int, int]: def encode_rate(rate: Rate = Rate.ESTANDAR) -> Tuple[int, int]:
"""Genera los ID de plan y oferta.
Args:
rate (Rate, optional): Tarifa Aplicada. Defaults to Rate.ESTANDAR.
Returns:
Tuple[int, int]: Códigos de Plan y Oferta que generan la tarifa.
"""
# Tarifa por Defecto # Tarifa por Defecto
plan_id = 1 plan_id = 1
offer_id = 0 offer_id = 0
...@@ -173,6 +181,16 @@ def encode_rate(rate: Rate = Rate.ESTANDAR) -> Tuple[int, int]: ...@@ -173,6 +181,16 @@ def encode_rate(rate: Rate = Rate.ESTANDAR) -> Tuple[int, int]:
def decode_rate(plan_id: int, offer_id: int = 0) -> Rate: def decode_rate(plan_id: int, offer_id: int = 0) -> Rate:
"""Obtiene la tarifa en base a un plan y oferta de MagnusBilling
Args:
plan_id (int): ID del Plan
offer_id (int, optional): ID de la Oferta. Defaults to 0.
Returns:
Rate: Tarifa a Aplicar
"""
if plan_id == 1: if plan_id == 1:
return Rate.ESTANDAR return Rate.ESTANDAR
elif plan_id == 2: elif plan_id == 2:
...@@ -210,8 +228,8 @@ def create_account(account: Account = Depends()): ...@@ -210,8 +228,8 @@ def create_account(account: Account = Depends()):
response = ConnectionData( response = ConnectionData(
account=account.number, account=account.number,
password=password, password=password,
peer_details=f'type = friend\nusername = {account.number}\nhost = 192.168.2.84\nnat = force_rport, comedia\nqualify = yes\ninsecure = invite, port', peer_details=f'type = friend username = {account.number} host = 192.168.2.84 nat = force_rport, comedia qualify = yes insecure = invite, port',
user_details='type = friend\nhost = 192.168.2.84\nnat = force_rport, comedia\nqualify = yes\ninsecure = invite, port' user_details='type = friend host = 192.168.2.84 nat = force_rport, comedia qualify = yes insecure = invite, port'
) )
except mbilling.functions.MagnusCommandError as e: except mbilling.functions.MagnusCommandError as e:
...@@ -226,18 +244,25 @@ def create_account(account: Account = Depends()): ...@@ -226,18 +244,25 @@ def create_account(account: Account = Depends()):
return response return response
@app.get('/account/{account_name}', response_model=AccountDetails, tags=['Account']) @app.get('/account/{account_name}', response_model=AccountDetails,name="Obtener Cuenta", description="Obtiene la información de Conexión de una cuenta SIP", tags=['Account'])
def get_account(account_name: str = Query(..., regex=r'[89][1-9]\d{7}', name='Número', description='Cuenta SIP a recargar')): def get_account(account_name: str = Query(..., regex=r'[89][1-9]\d{7}', name='Número', description='Cuenta SIP a recargar')):
user_data = mbilling.functions.get_user(account_name) user_data = mbilling.functions.get_user(account_name)
if user_data: if user_data:
response = AccountDetails(
number=account_name, credentials = ConnectionData(
account=account_name,
password=user_data['password'], password=user_data['password'],
peer_details=f'type = friend username = {account_name} host = 192.168.2.84 nat = force_rport, comedia qualify = yes insecure = invite, port',
user_details='type = friend host = 192.168.2.84 nat = force_rport, comedia qualify = yes insecure = invite, port'
)
response = AccountDetails(
host=user_data['host'], host=user_data['host'],
credit=user_data['credit'], credit=round(user_data['credit'],2),
rate=decode_rate(user_data['plan'], user_data['offer']) rate=decode_rate(user_data['plan'], user_data['offer']),
credentials=credentials
) )
else: else:
......
MAGNUS_HOST = 'http://192.168.2.56/mbilling' MAGNUS_HOST = 'http://192.168.2.84/mbilling'
API_KEY = 'FxMqVFWMztbigCeZlFupGULLh6LRaLs8' API_KEY = 'FxMqVFWMztbigCeZlFupGULLh6LRaLs8'
API_SECRET = 'rguvK0sNZMki5yWtv4RKONMJo1Hd9jiX' API_SECRET = 'rguvK0sNZMki5yWtv4RKONMJo1Hd9jiX'
DB_USER = 'magnusupdater' DB_USER = 'magnusupdater'
......
...@@ -30,8 +30,19 @@ class MagnusCommandError(Exception): ...@@ -30,8 +30,19 @@ class MagnusCommandError(Exception):
def _create_user(phone_number: str, password: str, name: str, surname: str, plan_id: int = 1, offer_id: int = 0): def _create_user(phone_number: str, password: str, name: str, surname: str, plan_id: int = 1, offer_id: int = 0):
"""Genera una cuenta de usuario en MagnusBilling """Crea un nuevo usuario en MagnusBilling mediante la API oficial. Genera tanto\
los datos en la base de datos como en SIP.
Args:
phone_number (str): Número de Teléfono
password (str): Contraseña
name (str): Nombre del Titular
surname (str): Apellidos del Titular
plan_id (int, optional): Plan Aplicado. Defaults to 1.
offer_id (int, optional): Oferta Aplicada. Defaults to 0.
Raises:
MagnusCommandError: Error en la ejecución del proceso API
""" """
result = subprocess.check_output( result = subprocess.check_output(
...@@ -47,6 +58,17 @@ def _create_user(phone_number: str, password: str, name: str, surname: str, plan ...@@ -47,6 +58,17 @@ def _create_user(phone_number: str, password: str, name: str, surname: str, plan
def _create_sip(phone_number: str, password: str, pbx: str = None): def _create_sip(phone_number: str, password: str, pbx: str = None):
"""Agrega una nueva cuenta SIP y la agrega al usuario con el mismo nombre.
Args:
phone_number (str): Número de Teléfono
password (str): Contraseña
pbx (str, optional): Dirección IP de la Centralita. Defaults to None.
Raises:
MagnusCommandError: Error en la ejecución del comando API
"""
command = ['php', pathlib.Path(mbapi_path, 'create_sip.php'), command = ['php', pathlib.Path(mbapi_path, 'create_sip.php'),
phone_number, password] phone_number, password]
if pbx: if pbx:
...@@ -59,8 +81,15 @@ def _create_sip(phone_number: str, password: str, pbx: str = None): ...@@ -59,8 +81,15 @@ def _create_sip(phone_number: str, password: str, pbx: str = None):
def _create_did(phone_number: str): def _create_did(phone_number: str):
"""Genera un DID """Crea un DID tanto para el número como para su versión internacional y la asigna\
al usuario cuya identificación sea el nombre.
Args:
phone_number (str): Número de Teléfono
Raises:
MagnusCommandError: Error en la Insercción del DID
MagnusCommandError: Error en la Insercción del DID internacional.
""" """
for did in (phone_number, f'34{phone_number}'): for did in (phone_number, f'34{phone_number}'):
...@@ -80,9 +109,21 @@ def _create_did(phone_number: str): ...@@ -80,9 +109,21 @@ def _create_did(phone_number: str):
raise MagnusCommandError(result.decode('utf-8')) raise MagnusCommandError(result.decode('utf-8'))
def create_user(phone_number: str, name: str, surname: str, password: str = None, pbx: str = None, plan_id: int = 1, offer_id: int = 0, balance: float = 0.0) -> str: def create_user(phone_number: str, name: str, surname: str, password: str = None, pbx: str = None, plan_id: int = 1, offer_id: int = 0) -> str:
"""Crea a un nuevo usuario en MagnusBilling """Genera un nuevo usuario en Magnus Billing con una cuenta SIP, un DID para llamadas nacionales\
y otro para llamadas internacionales
Args:
phone_number (str): Número de Teléfono
name (str): Nombre del Titular
surname (str): Apellido del Titular
password (str, optional): Contraseña. Defaults Random.
pbx (str, optional): Dirección IP de la Centralita. Defaults to None.
plan_id (int, optional): ID del Plan. Defaults to 1.
offer_id (int, optional): ID de la Oferta. Defaults to 0.
Returns:
str: Contraseña de la Cuenta
""" """
password = password if password else ''.join( password = password if password else ''.join(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment