Digitale bierlijst

model.py 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. '''
  2. Provides access to the models stored in the database, via the server.
  3. '''
  4. from typing import NamedTuple
  5. from urllib.parse import urljoin
  6. import requests
  7. from . import logger
  8. LOG = logger.getLogger('model')
  9. SERVER_URL = "http://127.0.0.1:5000"
  10. class Person(NamedTuple):
  11. ''' Represents a Person, as retrieved from the database. '''
  12. name: str
  13. person_id: int = None
  14. consumptions: dict = {}
  15. def add_consumption(self) -> bool:
  16. ''' Register a consumption for this Person. '''
  17. req = requests.post(
  18. urljoin(SERVER_URL, f'people/{self.person_id}/add_consumption')
  19. )
  20. try:
  21. data = req.json()
  22. if 'error' in data:
  23. LOG.error(
  24. 'Could not add consumption for %s (%s): %s',
  25. self.person_id, req.status_code, data
  26. )
  27. return False
  28. self.consumptions.update(data['person']['consumptions'])
  29. return True
  30. except ValueError:
  31. LOG.error(
  32. 'Did not get JSON on adding Consumption (%s): %s',
  33. req.status_code, req.content
  34. )
  35. return False
  36. def create(self) -> 'Person':
  37. ''' Create a new Person from the current attributes. As tuples are
  38. immutable, a new Person with the correct id is returned. '''
  39. req = requests.post(
  40. urljoin(SERVER_URL, "people"), json={"person": {"name": self.name}}
  41. )
  42. try:
  43. data = req.json()
  44. except ValueError:
  45. LOG.error(
  46. 'Did not get JSON on adding Person (%s): %s',
  47. req.status_code, req.content
  48. )
  49. return None
  50. if 'error' in data or req.status_code != 201:
  51. LOG.error(
  52. 'Could not create Person (%s): %s',
  53. req.status_code, data
  54. )
  55. return None
  56. return Person.from_dict(data['person'])
  57. @classmethod
  58. def get(cls, person_id: int) -> 'Person':
  59. ''' Retrieve a Person by id. '''
  60. req = requests.get(urljoin(SERVER_URL, f'/people/{person_id}'))
  61. try:
  62. data = req.json()
  63. if 'error' in data:
  64. LOG.warning(
  65. 'Could not get person %s (%s): %s',
  66. person_id, req.status_code, data
  67. )
  68. return None
  69. return Person.from_dict(data['person'])
  70. except ValueError:
  71. LOG.error(
  72. 'Did not get JSON from server on getting Person (%s): %s',
  73. req.status_code, req.content
  74. )
  75. return None
  76. @classmethod
  77. def get_all(cls) -> ['Person']:
  78. ''' Get all active People. '''
  79. req = requests.get(urljoin(SERVER_URL, '/people'))
  80. try:
  81. data = req.json()
  82. if 'error' in data:
  83. LOG.warning(
  84. 'Could not get people (%s): %s',
  85. req.status_code, data
  86. )
  87. return [Person.from_dict(item) for item in data['people']]
  88. except ValueError:
  89. LOG.error(
  90. 'Did not get JSON from server on getting People (%s): %s',
  91. req.status_code, req.content
  92. )
  93. return None
  94. @classmethod
  95. def from_dict(cls, data: dict) -> 'Person':
  96. ''' Reconstruct a Person object from a dict. '''
  97. return Person(
  98. name = data['name'],
  99. person_id = data['person_id'],
  100. consumptions = data['consumptions']
  101. )