Coverage for models\account.py: 65%

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

41 statements  

1""" 

2Clase Account 

3""" 

4import logging 

5from sqlalchemy.sql import func 

6from models import db 

7 

8logger = logging.getLogger() 

9 

10 

11class DataValidationError(Exception): 

12 """Utilizada para errores de validación de datos al deserializar""" 

13 

14 

15class Account(db.Model): 

16 """Clase que representa una Cuenta""" 

17 

18 id = db.Column(db.Integer, primary_key=True) 

19 name = db.Column(db.String(64)) 

20 email = db.Column(db.String(64)) 

21 phone_number = db.Column(db.String(32), nullable=True) 

22 disabled = db.Column(db.Boolean(), nullable=False, default=False) 

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

24 

25 def __repr__(self): 

26 return '<Account %r>' % self.name 

27 

28 def to_dict(self) -> dict: 

29 """Serializa la clase como un diccionario""" 

30 return {c.name: getattr(self, c.name) for c in self.__table__.columns} 

31 

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

33 """Establece atributos desde un diccionario""" 

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

35 setattr(self, key, value) 

36 

37 def create(self): 

38 """Crea una cuenta en la base de datos""" 

39 logger.info("Creando %s", self.name) 

40 db.session.add(self) 

41 db.session.commit() 

42 

43 def update(self): 

44 """Actualiza una cuenta en la base de datos""" 

45 logger.info("Guardando %s", self.name) 

46 if not self.id: 

47 raise DataValidationError("Se llamó a update sin un ID") 

48 db.session.commit() 

49 

50 def delete(self): 

51 """Elimina una cuenta de la base de datos""" 

52 logger.info("Eliminando %s", self.name) 

53 db.session.delete(self) 

54 db.session.commit() 

55 

56 ################################################## 

57 # Métodos de clase 

58 ################################################## 

59 

60 @classmethod 

61 def all(cls) -> list: 

62 """Devuelve todas las cuentas en la base de datos""" 

63 logger.info("Procesando todas las cuentas") 

64 return cls.query.all() 

65 

66 @classmethod 

67 def find(cls, account_id: int): 

68 """Encuentra una cuenta por su ID 

69 :param account_id: el id de la cuenta que se quiere encontrar 

70 :type account_id: int 

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

72 :rtype: Account 

73 """ 

74 logger.info("Buscando cuenta con id %s ...", account_id) 

75 return cls.query.get(account_id)