Coverage for server / models / sharerequests.py: 100%

33 statements  

« prev     ^ index     » next       coverage.py v7.13.4, created at 2026-10-04 09:33 +0000

1from datetime import datetime, timezone 

2from typing import Optional 

3from beanie import Document 

4from pydantic import field_validator 

5 

6 

7class ShareRequest(Document): 

8 type: str 

9 description: str 

10 object_id: str 

11 sender_id: Optional[str] = None 

12 recipient_id: str 

13 created_at: Optional[datetime] = None 

14 updated_at: Optional[datetime] = None 

15 

16 # Added by Allan Ninal — 2026-10-03 (EI-T410). 

17 # `description` was a bare str, so an empty, whitespace-only or 5,000-char 

18 # value was saved as a share record. Same rule as Assignment.description: 

19 # not blank, at most 500 characters after trimming. Raised as ValueError so 

20 # it answers 422 before the route runs, and nothing is saved. Nothing loads 

21 # ShareRequest back through Beanie, so older records cannot fail this on read. 

22 @field_validator("description") 

23 @classmethod 

24 def validate_description(cls, v): 

25 if not v or not v.strip(): 

26 raise ValueError("description field cannot contain only whitespace") 

27 if len(v.strip()) > 500: 

28 raise ValueError("description must be less than 500 characters") 

29 return v.strip() 

30 

31 @field_validator("created_at", mode="before") 

32 @classmethod 

33 def set_created_at_now(cls, v): 

34 return v or datetime.now(timezone.utc) 

35 

36 @field_validator("updated_at", mode="before") 

37 @classmethod 

38 def set_updated_at_now(cls, v): 

39 return v or datetime.now(timezone.utc) 

40 

41 class Settings: 

42 name = "sharerequest_collection" 

43 indexes = [[("type", 1)]] 

44 

45 class Config: 

46 json_schema_extra = { 

47 "example": { 

48 "type": "Assignment", 

49 "description": "Sample Description", 

50 "object_id": "5eb7cf5a86d9755df3a6c593", 

51 "recipient_id": "5eb7cf5a86d9755df3a6c593", 

52 } 

53 }