angeetoile commited on
Commit
a7b91b8
·
1 Parent(s): 3adf1fb

feat: add opportunity collector contracts

Browse files
app/collectors/__init__.py ADDED
File without changes
app/collectors/base.py ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from abc import ABC, abstractmethod
2
+
3
+ from app.collectors.types import CollectedOpportunity
4
+
5
+
6
+ class BaseOpportunityCollector(ABC):
7
+ source_slug: str
8
+
9
+ @abstractmethod
10
+ async def collect(
11
+ self,
12
+ ) -> list[CollectedOpportunity]:
13
+ """
14
+ Collecte les nouvelles opportunités d'une source.
15
+
16
+ Le collecteur ne doit pas écrire dans la base de données.
17
+ Il retourne uniquement des données normalisées.
18
+ """
19
+ raise NotImplementedError
app/collectors/providers/__init__.py ADDED
File without changes
app/collectors/types.py ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from dataclasses import dataclass, field
2
+ from datetime import date
3
+ from typing import Any
4
+
5
+
6
+ @dataclass(slots=True)
7
+ class CollectedOpportunity:
8
+ source_slug: str
9
+ title: str
10
+ official_url: str
11
+ raw_content: str
12
+
13
+ summary: str | None = None
14
+ organization_name: str | None = None
15
+ category: str | None = None
16
+ country_code: str | None = None
17
+ location: str | None = None
18
+ language: str | None = None
19
+
20
+ publication_date: date | None = None
21
+ deadline: date | None = None
22
+
23
+ application_url: str | None = None
24
+ image_url: str | None = None
25
+
26
+ target_countries: list[str] = field(
27
+ default_factory=list
28
+ )
29
+ study_levels: list[str] = field(
30
+ default_factory=list
31
+ )
32
+ eligibility: dict[str, Any] = field(
33
+ default_factory=dict
34
+ )