Coverage for /usr/lib/python3.10/site-packages/hyd/backend/util/models.py: 95%

22 statements  

« prev     ^ index     » next       coverage.py v7.0.3, created at 2023-01-05 16:38 +0000

1import datetime as dt 

2 

3from fastapi import status 

4from pydantic.types import conint, constr 

5from sqlalchemy import Column, DateTime, event 

6from sqlalchemy.orm import Mapped 

7 

8from hyd.backend.util.const import MAX_LENGTH_STR_ID 

9 

10#################################################################################################### 

11#### pydantic types 

12#################################################################################################### 

13 

14 

15PrimaryKey = conint(gt=0, lt=2147483647) 

16NameStr = constr( 

17 regex=r"^(?!\s*$).+", 

18 strip_whitespace=True, 

19 min_length=3, 

20 max_length=MAX_LENGTH_STR_ID, 

21) 

22CommentStr = constr( 

23 strip_whitespace=True, 

24 min_length=0, 

25 max_length=MAX_LENGTH_STR_ID, 

26) 

27 

28#################################################################################################### 

29#### SQLAlchemy table mixins 

30#################################################################################################### 

31 

32 

33class TimeStampMixin(object): 

34 """Timestamping mixin""" 

35 

36 created_at: Mapped[dt.datetime] = Column(DateTime, default=dt.datetime.utcnow) 

37 updated_at: Mapped[dt.datetime | None] = Column(DateTime, default=None) 

38 # NOTE maybe this a better solution https://stackoverflow.com/questions/3923910/sqlalchemy-move-mixin-columns-to-end 

39 created_at._creation_order = 9998 

40 updated_at._creation_order = 9998 

41 

42 @staticmethod 

43 def _updated_at(mapper, connection, target): 

44 target.updated_at = dt.datetime.utcnow() 

45 

46 @classmethod 

47 def __declare_last__(cls): 

48 event.listen(cls, "before_update", cls._updated_at) 

49 

50 

51#################################################################################################### 

52#### OpenAPI definitions 

53#################################################################################################### 

54 

55 

56DETAIL_STR = {"content": {"application/json": {"example": {"detail": "string"}}}} 

57 

58BASE_API_RESPONSE_SCHEMA = { 

59 status.HTTP_500_INTERNAL_SERVER_ERROR: { 

60 "content": {"application/json": {"example": "Internal Server Error"}}, 

61 }, 

62 status.HTTP_401_UNAUTHORIZED: DETAIL_STR, 

63}