Commit 6507ee51 by Javier

Mejora en Obtención de Cuenta

parent 3aea41e9
from typing import Tuple
from sqlalchemy import create_engine, select, update from sqlalchemy import create_engine, select, update
from sqlalchemy.orm import sessionmaker from sqlalchemy.orm import sessionmaker
import pathlib import pathlib
...@@ -7,31 +8,14 @@ from sqlalchemy.ext.automap import automap_base ...@@ -7,31 +8,14 @@ from sqlalchemy.ext.automap import automap_base
import mbilling.models as models import mbilling.models as models
import mbilling.functions as cli import mbilling.functions as cli
import mbilling.exceptions as mbe import mbilling.exceptions as mbe
from time import sleep from mbilling.db import Base, session
# CONFIGURACIÓN
# Path de MBILLING
mbapi_path = pathlib.Path(pathlib.Path().resolve(), 'mbilling')
# Petición Correcta
succesful = re.compile(r'^\[20\d\]')
# Carga de Variables ENV
values = dotenv_values(pathlib.Path(mbapi_path, '.env'))
# Conexión a Base de Datos
Base = automap_base()
engine = create_engine(
f"mariadb+pymysql://{values['DB_USER']}:{values['DB_PASSWORD']}@{values['DB_HOST']}/{values['DB_NAME']}?charset=utf8mb4"
)
Base.prepare(engine, reflect=True)
Session = sessionmaker(bind=engine)
session = Session()
# Carga de Tablas # Carga de Tablas
User = Base.classes.pkg_user User = Base.classes.pkg_user
Sip = Base.classes.pkg_sip Sip = Base.classes.pkg_sip
Did = Base.classes.pkg_did Did = Base.classes.pkg_did
DidDestination = Base.classes.pkg_did_destination
DidUse = Base.classes.pkg_did_use
def decode_rate(rate: models.Rate = models.Rate.ESTANDAR): def decode_rate(rate: models.Rate = models.Rate.ESTANDAR):
...@@ -94,7 +78,7 @@ def get_user_account(number: str) -> User: ...@@ -94,7 +78,7 @@ def get_user_account(number: str) -> User:
return user[0] if user else None return user[0] if user else None
def get_sip_account(number: str) -> Sip: def get_sip_account(number: str) -> Tuple[Sip, User]:
"""Obtiene los detalles de una Cuenta SIP """Obtiene los detalles de una Cuenta SIP
Args: Args:
...@@ -103,7 +87,24 @@ def get_sip_account(number: str) -> Sip: ...@@ -103,7 +87,24 @@ def get_sip_account(number: str) -> Sip:
Returns: Returns:
models.SipAccount: Cuenta SIP Asociada models.SipAccount: Cuenta SIP Asociada
""" """
return session.query(Sip).filter_by(name=number).first() sip = session.query(Sip).filter_by(name=number).first()
user = session.query(User).filter_by(id=sip.id_user).first()
if sip:
return sip, user
else:
raise mbe.SipNotFound()
def get_sip_accounts_by_user(user: User) -> list[Sip]:
"""Obtiene las cuentas SIP asignadas a una cuenta de facturación.
Args:
user (User): Cuenta de Facturación
Returns:
list[Sip]: Listado de Cuentas SIP
"""
return session.query(Sip).filter_by(id_user=user.id).all()
def find_user_account(number: str) -> User: def find_user_account(number: str) -> User:
...@@ -119,14 +120,11 @@ def find_user_account(number: str) -> User: ...@@ -119,14 +120,11 @@ def find_user_account(number: str) -> User:
User: Cuenta de Facturación. User: Cuenta de Facturación.
""" """
user = get_user_account(number) sip, user = get_sip_account(number)
if user:
if not user: return user
sip = get_sip_account(number) else:
if sip: raise mbe.UserNotFound()
user = get_user_account(sip.accountcode)
return user
def get_user(number: str) -> models.User: def get_user(number: str) -> models.User:
...@@ -147,7 +145,7 @@ def get_user(number: str) -> models.User: ...@@ -147,7 +145,7 @@ def get_user(number: str) -> models.User:
select(Sip).where(Sip.id_user == user_account.id) select(Sip).where(Sip.id_user == user_account.id)
).fetchall() ).fetchall()
sip_accounts = [models.SipAccount.generate_from_automap( sip_accounts = [models.SipAccount.generate_from_automap(
sip[0]) for sip in user_sip] sip[0], user.username) for sip in user_sip]
user = models.User( user = models.User(
username=user_account.username, username=user_account.username,
...@@ -259,7 +257,7 @@ def get_dids_by_number(number: str): ...@@ -259,7 +257,7 @@ def get_dids_by_number(number: str):
return session.query(Did).filter(Did.did.like(f'%{number}')).all() return session.query(Did).filter(Did.did.like(f'%{number}')).all()
def update_did_owner(did: Did, new_owner: User): def update_did_owner(did: Did, sip: Sip):
"""Modifica el propietario de un DID """Modifica el propietario de un DID
Args: Args:
...@@ -267,22 +265,20 @@ def update_did_owner(did: Did, new_owner: User): ...@@ -267,22 +265,20 @@ def update_did_owner(did: Did, new_owner: User):
new_owner (User): Nuevo Propietario new_owner (User): Nuevo Propietario
""" """
session.execute( # Actualización de DID
update(Did).where(id=did.id).values( did.id_user = sip.id_user
id_user=new_owner.id, activated=True, reserved=True) did.activated = True
) did.reserved = True
session.execute( # Actualización de Uso
update(Base.classes.pkg_did_use).where(id_did=did.id).values( destination = session.query(
id_user=new_owner.id DidDestination).filter_by(id_did=did.id).first()
) destination.id_user = sip.id_user
) destination.id_sip = sip.id
session.execute( # Actualización de Uso
update(Base.classes.pkg_did_destination).where(id_did=did.id).values( use = session.query(DidUse).filter_by(id_did=did.id).first()
id_user=new_owner.id use.id_user = sip.id_user
)
)
session.commit() session.commit()
...@@ -294,13 +290,13 @@ def create_or_update_did(number: str, user: User, sip: Sip = None): ...@@ -294,13 +290,13 @@ def create_or_update_did(number: str, user: User, sip: Sip = None):
raise mbe.SipRegisteredError() raise mbe.SipRegisteredError()
for did_number in (number, f'34{number}'): for did_number in (number, f'34{number}'):
did = session.execute(select(Did).where(Did.did == did_number)).first() did = session.query(Did).filter_by(did=did_number).first()
if did: if not did:
update_did_owner(did, user)
else:
cli._create_did(did_number, user.username, cli._create_did(did_number, user.username,
auto_international=False) auto_international=False)
update_did_owner(did, sip)
def create_sip(username: str, create_sip: models.CreateSipAccount) -> models.SipAccount: def create_sip(username: str, create_sip: models.CreateSipAccount) -> models.SipAccount:
...@@ -309,25 +305,26 @@ def create_sip(username: str, create_sip: models.CreateSipAccount) -> models.Sip ...@@ -309,25 +305,26 @@ def create_sip(username: str, create_sip: models.CreateSipAccount) -> models.Sip
if not user_account: if not user_account:
raise mbe.UserNotFound() raise mbe.UserNotFound()
if find_user_account(create_sip.cid): sip = find_user_account(create_sip.cid)
raise mbe.SipRegisteredError() if not sip:
# Se generan las cuentas SIP
cli._create_sip(create_sip.cid, create_sip.secret,
create_sip.host, username)
# Se generan las cuentas SIP # Se generan o asignan los DID
cli._create_sip(create_sip.cid, create_sip.secret, sip = get_sip_account(create_sip.cid)
create_sip.host, username) if sip:
session.commit() create_or_update_did(create_sip.cid, user_account, sip)
return models.SipAccount.generate_from_automap(sip, user_account.username)
else:
raise mbe.SipRegisteredError(
'La cuenta SIP no se ha generado correctamente.')
# Se generan o asignan los DID elif sip.id_user == user_account.id:
sip = get_sip_account(create_sip.cid)
if sip:
create_or_update_did(create_sip.cid, user_account, sip)
return models.SipAccount.generate_from_automap(sip)
else:
raise mbe.SipRegisteredError( raise mbe.SipRegisteredError(
'La cuenta SIP no se ha generado correctamente.') 'La cuenta SIP ya está asignada al usuario.')
def test_function(test_number): else:
raise mbe.SipRegisteredError(
'La cuenta SIP está asignada a otro usuario.')
print(models.SipAccount.generate_from_automap(
get_sip_account(test_number)))
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