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
« 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."""
5from datetime import datetime
7from app.schemas import BaseModel, OwnedOut, Out
10# --------------------------------------------------- JOB ALERT EMAIL --------------------------------------------------
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
23class JobAlertEmailUpdate(JobAlertEmailCreate):
24 external_email_id: str | None = None
27class JobAlertEmailOut(JobAlertEmailCreate, OwnedOut):
28 jobs: list["ScrapedJobOut"]
31# ----------------------------------------------------- SCRAPED JOB ----------------------------------------------------
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
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
52class ScrapedJobUpdate(ScrapedJobCreate):
53 """Represents scraped job postings from external sources with additional metadata."""
55 external_job_id: str | None = None
58class ScrapedJobOut(ScrapedJobCreate, OwnedOut):
59 """Represents scraped job postings from external sources with additional metadata."""
61 pass
62 # emails: list[JobAlertEmailOut]
65# ----------------------------------------------------- SERVICE LOG ----------------------------------------------------
68class EisServiceLogCreate(BaseModel):
69 """Represents a log of a service run."""
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
80class EisServiceLogUpdate(EisServiceLogCreate):
81 """Represents a log of a service run."""
83 name: str | None = None
86class EisServiceLogOut(EisServiceLogCreate, Out):
87 """Represents a log of a service run."""
89 emails: list[JobAlertEmailOut]