Commit f11cb2cb by Javier

Documentación

parent 62e5907c
......@@ -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(
..., title='Contraseña', description='Credencial Cuenta SIP para host dinámico.'
account: str = Body(
..., title='Cuenta', description='Usuario/Número de cuenta para Autentificación SIP.'
)
host: str = Body(
..., title='Host', description='Dirección desde la que se conecta el usuario.'
password: str = Body(
..., title='Contraseña', description='Credencial para la Autentificación.'
)
credit: float = Body(
..., title='Saldo Disponible', description='Adeudo o activo que tiene el cliente.'
peer_details: str = Body(
default=None, title='Peer Details', description='Credenciales para la salida por troncal en Centralitas.'
)
rate: Rate = Body(
default=Rate.ESTANDAR, title='Tarifa', description='Plan de Precios de la Línea'
user_details: str = Body(
default=None, title='User Context', description='Credenciales para la entrada por troncal en Centralitas.'
)
class Config:
schema_extra = {
"example": {
"number": "856135158",
"account": "856135158",
"password": "rentel58",
"host": "192.168.2.71",
"credit": 32.45,
"rate": Rate.PLANA_2000
"peer_details": "type = friend username = 951203503 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"
}
}
class ConnectionData(BaseModel):
"""Datos de Conexión
class AccountDetails(BaseModel):
"""Detalles de una cuenta SIP
Muestra los detalles de conexión y crédito de un usuario.
"""
account: str = Body(
..., title='Cuenta', description='Usuario/Número de cuenta para Autentificación SIP.'
host: str = Body(
..., title='Host', description='Dirección desde la que se conecta el usuario.'
)
password: str = Body(
..., title='Contraseña', description='Credencial para la Autentificación.'
credit: float = Body(
..., title='Saldo Disponible', description='Adeudo o activo que tiene el cliente.'
)
peer_details: str = Body(
default=None, title='Peer Details', description='Credenciales para la salida por troncal en Centralitas.'
rate: Rate = Body(
default=Rate.ESTANDAR, title='Tarifa', description='Plan de Precios de la Línea'
)
user_details: str = Body(
default=None, title='User Context', description='Credenciales para la entrada por troncal en Centralitas.'
credentials: ConnectionData = Body(
..., title='Datos de Conexión',
)
class Config:
schema_extra = {
"example": {
"account": "856135158",
"number": "856135158",
"password": "rentel58",
"peer_details": "type = friend username = 951203503 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"
"host": "192.168.2.71",
"credit": 32.45,
"rate": Rate.PLANA_2000
}
}
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
plan_id = 1
offer_id = 0
......@@ -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:
"""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:
return Rate.ESTANDAR
elif plan_id == 2:
......@@ -210,8 +228,8 @@ def create_account(account: Account = Depends()):
response = ConnectionData(
account=account.number,
password=password,
peer_details=f'type = friend\nusername = {account.number}\nhost = 192.168.2.84\nnat = force_rport, comedia\nqualify = yes\ninsecure = invite, port',
user_details='type = friend\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 host = 192.168.2.84 nat = force_rport, comedia qualify = yes insecure = invite, port'
)
except mbilling.functions.MagnusCommandError as e:
......@@ -226,18 +244,25 @@ def create_account(account: Account = Depends()):
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')):
user_data = mbilling.functions.get_user(account_name)
if user_data:
response = AccountDetails(
number=account_name,
credentials = ConnectionData(
account=account_name,
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'],
credit=user_data['credit'],
rate=decode_rate(user_data['plan'], user_data['offer'])
credit=round(user_data['credit'],2),
rate=decode_rate(user_data['plan'], user_data['offer']),
credentials=credentials
)
else:
......
MAGNUS_HOST = 'http://192.168.2.56/mbilling'
MAGNUS_HOST = 'http://192.168.2.84/mbilling'
API_KEY = 'FxMqVFWMztbigCeZlFupGULLh6LRaLs8'
API_SECRET = 'rguvK0sNZMki5yWtv4RKONMJo1Hd9jiX'
DB_USER = 'magnusupdater'
......
......@@ -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):
"""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(
......@@ -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):
"""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'),
phone_number, password]
if pbx:
......@@ -59,8 +81,15 @@ def _create_sip(phone_number: str, password: str, pbx: str = None):
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}'):
......@@ -80,9 +109,21 @@ def _create_did(phone_number: str):
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:
"""Crea a un nuevo usuario en MagnusBilling
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:
"""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(
......
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