Commit ·
a7b91b8
1
Parent(s): 3adf1fb
feat: add opportunity collector contracts
Browse files- app/collectors/__init__.py +0 -0
- app/collectors/base.py +19 -0
- app/collectors/providers/__init__.py +0 -0
- app/collectors/types.py +34 -0
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 |
+
)
|