Coverage for backend/app/eis/schemas.py: 100%

44 statements  

« prev     ^ index     » next       coverage.py v7.10.7, created at 2025-09-22 15:38 +0000

1"""Pydantic schemas for the email ingestion service. 

2Contains data models for job alert emails, scraped job postings, and service logs 

3used in the external job scraping and notification system.""" 

4 

5from datetime import datetime 

6 

7from app.schemas import BaseModel, OwnedOut, Out 

8 

9 

10# --------------------------------------------------- JOB ALERT EMAIL -------------------------------------------------- 

11 

12 

13class JobAlertEmailCreate(BaseModel): 

14 external_email_id: str 

15 subject: str | None = None 

16 sender: str | None = None 

17 date_received: datetime | None = None 

18 platform: str | None = None 

19 body: str | None = None 

20 service_log_id: int | None = None 

21 

22 

23class JobAlertEmailUpdate(JobAlertEmailCreate): 

24 external_email_id: str | None = None 

25 

26 

27class JobAlertEmailOut(JobAlertEmailCreate, OwnedOut): 

28 jobs: list["ScrapedJobOut"] 

29 

30 

31# ----------------------------------------------------- SCRAPED JOB ---------------------------------------------------- 

32 

33 

34class ScrapedJobCreate(BaseModel): 

35 external_job_id: str 

36 is_scraped: bool = False 

37 is_failed: bool = False 

38 scrape_error: str | None = None 

39 is_active: bool = True 

40 

41 # Job data 

42 title: str | None = None 

43 description: str | None = None 

44 salary_min: float | None = None 

45 salary_max: float | None = None 

46 url: str | None = None 

47 deadline: datetime | None = None 

48 company: str | None = None 

49 location: str | None = None 

50 

51 

52class ScrapedJobUpdate(ScrapedJobCreate): 

53 """Represents scraped job postings from external sources with additional metadata.""" 

54 

55 external_job_id: str | None = None 

56 

57 

58class ScrapedJobOut(ScrapedJobCreate, OwnedOut): 

59 """Represents scraped job postings from external sources with additional metadata.""" 

60 

61 pass 

62 # emails: list[JobAlertEmailOut] 

63 

64 

65# ----------------------------------------------------- SERVICE LOG ---------------------------------------------------- 

66 

67 

68class EisServiceLogCreate(BaseModel): 

69 """Represents a log of a service run.""" 

70 

71 name: str 

72 run_datetime: datetime 

73 run_duration: float | None = None 

74 is_success: bool | None = None 

75 error_message: str | None = None 

76 job_success_n: int | None = None 

77 job_fail_n: int | None = None 

78 

79 

80class EisServiceLogUpdate(EisServiceLogCreate): 

81 """Represents a log of a service run.""" 

82 

83 name: str | None = None 

84 

85 

86class EisServiceLogOut(EisServiceLogCreate, Out): 

87 """Represents a log of a service run.""" 

88 

89 emails: list[JobAlertEmailOut]