Coverage for models\account.py: 98%

Shortcuts on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

44 statements  

1""" 

2Clase Account 

3""" 

4import logging 

5from sqlalchemy import Column, Integer, String, Boolean, Date 

6from sqlalchemy.sql import func 

7from models import db 

8 

9logger = logging.getLogger() 

10 

11 

12class DataValidationError(Exception): 

13 """Se utiliza para errores de validación de datos al deserializar""" 

14 

15 

16class Account(db.Model): 

17 """Clase que representa una Cuenta""" 

18 

19 __tablename__ = 'accounts' # Asegúrate de definir el nombre de la tabla 

20 

21 id = Column(Integer, primary_key=True) 

22 name = Column(String(64), nullable=False) 

23 email = Column(String(64), nullable=False, unique=True) 

24 phone_number = Column(String(32), nullable=True) 

25 disabled = Column(Boolean(), nullable=False, default=False) 

26 date_joined = Column(Date, nullable=False, server_default=func.now()) 

27 

28 def __repr__(self): 

29 return f"<Account '{self.name}'>" 

30 

31 def to_dict(self) -> dict: 

32 """Serializa la clase como un diccionario""" 

33 return {c.name: getattr(self, c.name) for c in self.__table__.columns} 33 ↛ exitline 33 didn't run the dictionary comprehension on line 33

34 

35 def from_dict(self, data: dict) -> None: 

36 """Establece los atributos desde un diccionario""" 

37 for key, value in data.items(): 

38 setattr(self, key, value) 

39 

40 def create(self): 

41 """Crea una Cuenta en la base de datos""" 

42 logger.info(f"Creando {self.name}") 

43 db.session.add(self) 

44 db.session.commit() 

45 

46 def update(self): 

47 """Actualiza una Cuenta en la base de datos""" 

48 logger.info(f"Guardando {self.name}") 

49 if not self.id: 

50 raise DataValidationError("Actualización llamada con campo ID vacío") 

51 db.session.commit() 

52 

53 def delete(self): 

54 """Elimina una Cuenta del almacén de datos""" 

55 logger.info(f"Eliminando {self.name}") 

56 db.session.delete(self) 

57 db.session.commit() 

58 

59 ################################################## 

60 # Métodos de clase 

61 ################################################## 

62 

63 @classmethod 

64 def all(cls) -> list: 

65 """Devuelve todas las Cuentas en la base de datos""" 

66 logger.info("Procesando todas las Cuentas") 

67 stmt = db.select(cls) 

68 return db.session.execute(stmt).scalars().all() 

69 

70 @classmethod 

71 def find(cls, account_id: int): 

72 """Encuentra una Cuenta por su ID 

73 

74 :param account_id: el id de la Cuenta a encontrar 

75 :type account_id: int 

76 :return: una instancia con el account_id, o None si no se encuentra 

77 :rtype: Account 

78 """ 

79 logger.info(f"Procesando búsqueda para id {account_id} ...") 

80 return db.session.get(cls, account_id)