ffbb-data-client 2.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ffbb_api_client_v3/__init__.py +25 -0
- ffbb_data_client/__init__.py +175 -0
- ffbb_data_client/clients/__init__.py +13 -0
- ffbb_data_client/clients/api_ffbb_app_client.py +2475 -0
- ffbb_data_client/clients/ffbb_data_client.py +2789 -0
- ffbb_data_client/clients/meilisearch_client.py +218 -0
- ffbb_data_client/clients/meilisearch_ffbb_client.py +647 -0
- ffbb_data_client/config.py +153 -0
- ffbb_data_client/data/__init__.py +25 -0
- ffbb_data_client/data/collections.json +1364 -0
- ffbb_data_client/data/endpoint_discovery.json +1875 -0
- ffbb_data_client/data/indexes.json +501 -0
- ffbb_data_client/data/openapi.json +35713 -0
- ffbb_data_client/data/openapi_full.json +37622 -0
- ffbb_data_client/helpers/__init__.py +27 -0
- ffbb_data_client/helpers/http_requests_helper.py +73 -0
- ffbb_data_client/helpers/http_requests_utils.py +502 -0
- ffbb_data_client/helpers/meilisearch_client_extension.py +153 -0
- ffbb_data_client/helpers/multi_search_query_helper.py +35 -0
- ffbb_data_client/models/__init__.py +241 -0
- ffbb_data_client/models/affiche.py +45 -0
- ffbb_data_client/models/cartographie.py +82 -0
- ffbb_data_client/models/categorie.py +55 -0
- ffbb_data_client/models/categorie_type.py +42 -0
- ffbb_data_client/models/clock.py +38 -0
- ffbb_data_client/models/club_contacts.py +77 -0
- ffbb_data_client/models/code.py +7 -0
- ffbb_data_client/models/commune.py +66 -0
- ffbb_data_client/models/competition_fields.py +309 -0
- ffbb_data_client/models/competition_id.py +116 -0
- ffbb_data_client/models/competition_id_categorie.py +31 -0
- ffbb_data_client/models/competition_id_sexe.py +31 -0
- ffbb_data_client/models/competition_id_type_competition.py +27 -0
- ffbb_data_client/models/competition_id_type_competition_generique.py +24 -0
- ffbb_data_client/models/competition_origine.py +69 -0
- ffbb_data_client/models/competition_origine_categorie.py +23 -0
- ffbb_data_client/models/competition_origine_type_competition.py +14 -0
- ffbb_data_client/models/competition_origine_type_competition_generique.py +24 -0
- ffbb_data_client/models/competition_type.py +6 -0
- ffbb_data_client/models/competitions_facet_distribution.py +65 -0
- ffbb_data_client/models/competitions_facet_stats.py +14 -0
- ffbb_data_client/models/competitions_hit.py +232 -0
- ffbb_data_client/models/competitions_multi_search_query.py +40 -0
- ffbb_data_client/models/competitions_query.py +11 -0
- ffbb_data_client/models/configuration_models.py +5 -0
- ffbb_data_client/models/contact_info.py +18 -0
- ffbb_data_client/models/content_multi_search_query.py +93 -0
- ffbb_data_client/models/coordonnees.py +27 -0
- ffbb_data_client/models/coordonnees_type.py +5 -0
- ffbb_data_client/models/document_flyer.py +205 -0
- ffbb_data_client/models/document_flyer_type.py +6 -0
- ffbb_data_client/models/engagement_contacts.py +97 -0
- ffbb_data_client/models/engagements_facet_distribution.py +59 -0
- ffbb_data_client/models/engagements_facet_stats.py +14 -0
- ffbb_data_client/models/engagements_hit.py +192 -0
- ffbb_data_client/models/engagements_multi_search_query.py +41 -0
- ffbb_data_client/models/etat.py +6 -0
- ffbb_data_client/models/external_competition_id.py +42 -0
- ffbb_data_client/models/external_id.py +72 -0
- ffbb_data_client/models/facet_distribution.py +13 -0
- ffbb_data_client/models/facet_stats.py +13 -0
- ffbb_data_client/models/field_set.py +10 -0
- ffbb_data_client/models/folder.py +35 -0
- ffbb_data_client/models/formation_session.py +60 -0
- ffbb_data_client/models/formations_facet_distribution.py +61 -0
- ffbb_data_client/models/formations_facet_stats.py +14 -0
- ffbb_data_client/models/formations_hit.py +277 -0
- ffbb_data_client/models/formations_multi_search_query.py +41 -0
- ffbb_data_client/models/game_stats_model.py +57 -0
- ffbb_data_client/models/game_stats_models.py +5 -0
- ffbb_data_client/models/generic_search.py +92 -0
- ffbb_data_client/models/geo.py +27 -0
- ffbb_data_client/models/geo_sort_order.py +6 -0
- ffbb_data_client/models/get_commune_response.py +18 -0
- ffbb_data_client/models/get_competition_response.py +523 -0
- ffbb_data_client/models/get_configuration_response.py +45 -0
- ffbb_data_client/models/get_engagement_response.py +23 -0
- ffbb_data_client/models/get_entraineur_response.py +18 -0
- ffbb_data_client/models/get_formation_response.py +28 -0
- ffbb_data_client/models/get_officiel_response.py +18 -0
- ffbb_data_client/models/get_organisme_response.py +476 -0
- ffbb_data_client/models/get_poule_response.py +68 -0
- ffbb_data_client/models/get_pratique_response.py +18 -0
- ffbb_data_client/models/get_rencontre_response.py +93 -0
- ffbb_data_client/models/get_saisons_response.py +56 -0
- ffbb_data_client/models/get_salle_response.py +20 -0
- ffbb_data_client/models/get_terrain_response.py +16 -0
- ffbb_data_client/models/get_tournoi_response.py +16 -0
- ffbb_data_client/models/gradient_color.py +27 -0
- ffbb_data_client/models/hit.py +16 -0
- ffbb_data_client/models/id_engagement_equipe.py +32 -0
- ffbb_data_client/models/id_organisme_equipe.py +51 -0
- ffbb_data_client/models/id_organisme_equipe1_logo.py +28 -0
- ffbb_data_client/models/id_poule.py +27 -0
- ffbb_data_client/models/jour.py +11 -0
- ffbb_data_client/models/label.py +15 -0
- ffbb_data_client/models/labellisation.py +30 -0
- ffbb_data_client/models/live.py +192 -0
- ffbb_data_client/models/lives.py +6 -0
- ffbb_data_client/models/logo.py +28 -0
- ffbb_data_client/models/multi_search_queries.py +24 -0
- ffbb_data_client/models/multi_search_query.py +96 -0
- ffbb_data_client/models/multi_search_result_competitions.py +14 -0
- ffbb_data_client/models/multi_search_result_engagements.py +14 -0
- ffbb_data_client/models/multi_search_result_formations.py +12 -0
- ffbb_data_client/models/multi_search_result_organismes.py +12 -0
- ffbb_data_client/models/multi_search_result_pratiques.py +12 -0
- ffbb_data_client/models/multi_search_result_rencontres.py +12 -0
- ffbb_data_client/models/multi_search_result_salles.py +12 -0
- ffbb_data_client/models/multi_search_result_terrains.py +12 -0
- ffbb_data_client/models/multi_search_result_tournois.py +12 -0
- ffbb_data_client/models/multi_search_results.py +103 -0
- ffbb_data_client/models/multi_search_results_class.py +96 -0
- ffbb_data_client/models/nature_sol.py +57 -0
- ffbb_data_client/models/niveau.py +10 -0
- ffbb_data_client/models/niveau_class.py +27 -0
- ffbb_data_client/models/niveau_extractor.py +214 -0
- ffbb_data_client/models/niveau_info.py +64 -0
- ffbb_data_client/models/niveau_models.py +14 -0
- ffbb_data_client/models/niveau_type.py +10 -0
- ffbb_data_client/models/objectif.py +7 -0
- ffbb_data_client/models/organisateur.py +197 -0
- ffbb_data_client/models/organisateur_type.py +6 -0
- ffbb_data_client/models/organisme_fields.py +327 -0
- ffbb_data_client/models/organisme_id_pere.py +177 -0
- ffbb_data_client/models/organismes_facet_distribution.py +46 -0
- ffbb_data_client/models/organismes_facet_stats.py +14 -0
- ffbb_data_client/models/organismes_hit.py +196 -0
- ffbb_data_client/models/organismes_multi_search_query.py +41 -0
- ffbb_data_client/models/organismes_query.py +8 -0
- ffbb_data_client/models/phase_code.py +23 -0
- ffbb_data_client/models/poule.py +35 -0
- ffbb_data_client/models/poule_fields.py +261 -0
- ffbb_data_client/models/poule_rencontre_item_model.py +69 -0
- ffbb_data_client/models/poules_models.py +6 -0
- ffbb_data_client/models/poules_query.py +9 -0
- ffbb_data_client/models/pratique.py +7 -0
- ffbb_data_client/models/pratiques_facet_distribution.py +29 -0
- ffbb_data_client/models/pratiques_facet_stats.py +14 -0
- ffbb_data_client/models/pratiques_hit.py +310 -0
- ffbb_data_client/models/pratiques_hit_type.py +9 -0
- ffbb_data_client/models/pratiques_multi_search_query.py +41 -0
- ffbb_data_client/models/pratiques_type_class.py +45 -0
- ffbb_data_client/models/publication_internet.py +6 -0
- ffbb_data_client/models/purple_logo.py +24 -0
- ffbb_data_client/models/query_fields_manager.py +75 -0
- ffbb_data_client/models/ranking_engagement.py +41 -0
- ffbb_data_client/models/rankings_models.py +6 -0
- ffbb_data_client/models/rencontres_engagement.py +23 -0
- ffbb_data_client/models/rencontres_facet_distribution.py +65 -0
- ffbb_data_client/models/rencontres_facet_stats.py +14 -0
- ffbb_data_client/models/rencontres_hit.py +271 -0
- ffbb_data_client/models/rencontres_multi_search_query.py +41 -0
- ffbb_data_client/models/saison.py +23 -0
- ffbb_data_client/models/saison_fields.py +36 -0
- ffbb_data_client/models/saisons_models.py +6 -0
- ffbb_data_client/models/saisons_query.py +9 -0
- ffbb_data_client/models/salle.py +56 -0
- ffbb_data_client/models/salles_facet_distribution.py +14 -0
- ffbb_data_client/models/salles_facet_stats.py +14 -0
- ffbb_data_client/models/salles_hit.py +153 -0
- ffbb_data_client/models/salles_multi_search_query.py +40 -0
- ffbb_data_client/models/sexe.py +9 -0
- ffbb_data_client/models/sexe_class.py +31 -0
- ffbb_data_client/models/source.py +5 -0
- ffbb_data_client/models/status.py +5 -0
- ffbb_data_client/models/team_engagement.py +56 -0
- ffbb_data_client/models/team_ranking.py +108 -0
- ffbb_data_client/models/terrains_categorie_championnat_3x3_libelle.py +5 -0
- ffbb_data_client/models/terrains_facet_distribution.py +41 -0
- ffbb_data_client/models/terrains_facet_stats.py +14 -0
- ffbb_data_client/models/terrains_hit.py +223 -0
- ffbb_data_client/models/terrains_multi_search_query.py +42 -0
- ffbb_data_client/models/terrains_name.py +5 -0
- ffbb_data_client/models/terrains_sexe_enum.py +7 -0
- ffbb_data_client/models/terrains_storage.py +5 -0
- ffbb_data_client/models/tournoi_type_class.py +35 -0
- ffbb_data_client/models/tournoi_type_enum.py +7 -0
- ffbb_data_client/models/tournoi_types_3x3.py +43 -0
- ffbb_data_client/models/tournoi_types_3x3_libelle.py +60 -0
- ffbb_data_client/models/tournoi_types_3x3_libelle_enum.py +10 -0
- ffbb_data_client/models/tournois_facet_distribution.py +41 -0
- ffbb_data_client/models/tournois_facet_stats.py +14 -0
- ffbb_data_client/models/tournois_hit.py +132 -0
- ffbb_data_client/models/tournois_hit_type.py +5 -0
- ffbb_data_client/models/tournois_libelle.py +7 -0
- ffbb_data_client/models/tournois_multi_search_query.py +40 -0
- ffbb_data_client/models/type_association.py +23 -0
- ffbb_data_client/models/type_association_libelle.py +30 -0
- ffbb_data_client/models/type_class.py +23 -0
- ffbb_data_client/models/type_competition.py +8 -0
- ffbb_data_client/models/type_competition_generique.py +31 -0
- ffbb_data_client/models/type_enum.py +7 -0
- ffbb_data_client/models/type_league.py +6 -0
- ffbb_data_client/py.typed +0 -0
- ffbb_data_client/utils/__init__.py +27 -0
- ffbb_data_client/utils/cache_manager.py +393 -0
- ffbb_data_client/utils/converter_utils.py +329 -0
- ffbb_data_client/utils/input_validation.py +360 -0
- ffbb_data_client/utils/retry_utils.py +478 -0
- ffbb_data_client/utils/secure_logging.py +153 -0
- ffbb_data_client/utils/token_manager.py +115 -0
- ffbb_data_client-2.0.0.dist-info/METADATA +339 -0
- ffbb_data_client-2.0.0.dist-info/RECORD +207 -0
- ffbb_data_client-2.0.0.dist-info/WHEEL +5 -0
- ffbb_data_client-2.0.0.dist-info/licenses/LICENSE.txt +201 -0
- ffbb_data_client-2.0.0.dist-info/top_level.txt +2 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from ..utils.converter_utils import from_obj
|
|
7
|
+
from .id_organisme_equipe1_logo import IDOrganismeEquipe1Logo
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@dataclass
|
|
11
|
+
class CompetitionIDTypeCompetitionGenerique:
|
|
12
|
+
logo: IDOrganismeEquipe1Logo | None = None
|
|
13
|
+
|
|
14
|
+
@staticmethod
|
|
15
|
+
def from_dict(obj: Any) -> CompetitionIDTypeCompetitionGenerique:
|
|
16
|
+
assert isinstance(obj, dict)
|
|
17
|
+
logo = from_obj(IDOrganismeEquipe1Logo.from_dict, obj, "logo")
|
|
18
|
+
return CompetitionIDTypeCompetitionGenerique(logo=logo)
|
|
19
|
+
|
|
20
|
+
def to_dict(self) -> dict:
|
|
21
|
+
result: dict = {}
|
|
22
|
+
if self.logo is not None:
|
|
23
|
+
result["logo"] = self.logo.to_dict()
|
|
24
|
+
return result
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from ..utils.converter_utils import (
|
|
7
|
+
from_obj,
|
|
8
|
+
from_str,
|
|
9
|
+
)
|
|
10
|
+
from .competition_origine_categorie import CompetitionOrigineCategorie
|
|
11
|
+
from .competition_origine_type_competition import CompetitionOrigineTypeCompetition
|
|
12
|
+
from .competition_origine_type_competition_generique import (
|
|
13
|
+
CompetitionOrigineTypeCompetitionGenerique,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass
|
|
18
|
+
class CompetitionOrigine:
|
|
19
|
+
id: str | None = None
|
|
20
|
+
code: str | None = None
|
|
21
|
+
nom: str | None = None
|
|
22
|
+
type_competition: CompetitionOrigineTypeCompetition | None = None
|
|
23
|
+
categorie: CompetitionOrigineCategorie | None = None
|
|
24
|
+
type_competition_generique: CompetitionOrigineTypeCompetitionGenerique | None = None
|
|
25
|
+
|
|
26
|
+
@staticmethod
|
|
27
|
+
def from_dict(obj: Any) -> CompetitionOrigine:
|
|
28
|
+
assert isinstance(obj, dict)
|
|
29
|
+
id = from_str(obj, "id")
|
|
30
|
+
code = from_str(obj, "code")
|
|
31
|
+
nom = from_str(obj, "nom")
|
|
32
|
+
tc_val = obj.get("typeCompetition")
|
|
33
|
+
type_competition = (
|
|
34
|
+
CompetitionOrigineTypeCompetition.parse(tc_val)
|
|
35
|
+
if tc_val is not None
|
|
36
|
+
else None
|
|
37
|
+
)
|
|
38
|
+
categorie = from_obj(CompetitionOrigineCategorie.from_dict, obj, "categorie")
|
|
39
|
+
type_competition_generique = from_obj(
|
|
40
|
+
CompetitionOrigineTypeCompetitionGenerique.from_dict,
|
|
41
|
+
obj,
|
|
42
|
+
"typeCompetitionGenerique",
|
|
43
|
+
)
|
|
44
|
+
return CompetitionOrigine(
|
|
45
|
+
id=id,
|
|
46
|
+
code=code,
|
|
47
|
+
nom=nom,
|
|
48
|
+
type_competition=type_competition,
|
|
49
|
+
categorie=categorie,
|
|
50
|
+
type_competition_generique=type_competition_generique,
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
def to_dict(self) -> dict:
|
|
54
|
+
result: dict = {}
|
|
55
|
+
if self.id is not None:
|
|
56
|
+
result["id"] = self.id
|
|
57
|
+
if self.code is not None:
|
|
58
|
+
result["code"] = self.code
|
|
59
|
+
if self.nom is not None:
|
|
60
|
+
result["nom"] = self.nom
|
|
61
|
+
if self.type_competition is not None:
|
|
62
|
+
result["typeCompetition"] = self.type_competition.value
|
|
63
|
+
if self.categorie is not None:
|
|
64
|
+
result["categorie"] = self.categorie.to_dict()
|
|
65
|
+
if self.type_competition_generique is not None:
|
|
66
|
+
result["typeCompetitionGenerique"] = (
|
|
67
|
+
self.type_competition_generique.to_dict()
|
|
68
|
+
)
|
|
69
|
+
return result
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from ..utils.converter_utils import from_int
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@dataclass
|
|
10
|
+
class CompetitionOrigineCategorie:
|
|
11
|
+
ordre: int | None = None
|
|
12
|
+
|
|
13
|
+
@staticmethod
|
|
14
|
+
def from_dict(obj: Any) -> CompetitionOrigineCategorie:
|
|
15
|
+
assert isinstance(obj, dict)
|
|
16
|
+
ordre = from_int(obj, "ordre")
|
|
17
|
+
return CompetitionOrigineCategorie(ordre=ordre)
|
|
18
|
+
|
|
19
|
+
def to_dict(self) -> dict:
|
|
20
|
+
result: dict = {}
|
|
21
|
+
if self.ordre is not None:
|
|
22
|
+
result["ordre"] = self.ordre
|
|
23
|
+
return result
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class CompetitionOrigineTypeCompetition(Enum):
|
|
5
|
+
COUPE = "COUPE"
|
|
6
|
+
DIV = "DIV"
|
|
7
|
+
PLAT = "PLAT"
|
|
8
|
+
|
|
9
|
+
@staticmethod
|
|
10
|
+
def parse(str):
|
|
11
|
+
try:
|
|
12
|
+
return CompetitionOrigineTypeCompetition(str)
|
|
13
|
+
except ValueError:
|
|
14
|
+
return CompetitionOrigineTypeCompetition(str.upper())
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from ..utils.converter_utils import from_obj
|
|
7
|
+
from .purple_logo import PurpleLogo
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@dataclass
|
|
11
|
+
class CompetitionOrigineTypeCompetitionGenerique:
|
|
12
|
+
logo: PurpleLogo | None = None
|
|
13
|
+
|
|
14
|
+
@staticmethod
|
|
15
|
+
def from_dict(obj: Any) -> CompetitionOrigineTypeCompetitionGenerique:
|
|
16
|
+
assert isinstance(obj, dict)
|
|
17
|
+
logo = from_obj(PurpleLogo.from_dict, obj, "logo")
|
|
18
|
+
return CompetitionOrigineTypeCompetitionGenerique(logo=logo)
|
|
19
|
+
|
|
20
|
+
def to_dict(self) -> dict:
|
|
21
|
+
result: dict = {}
|
|
22
|
+
if self.logo is not None:
|
|
23
|
+
result["logo"] = self.logo.to_dict()
|
|
24
|
+
return result
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from ..utils.converter_utils import from_obj
|
|
7
|
+
from .competition_id_sexe import CompetitionIDSexe
|
|
8
|
+
from .competition_id_type_competition import CompetitionIDTypeCompetition
|
|
9
|
+
from .facet_distribution import FacetDistribution
|
|
10
|
+
from .niveau_class import NiveauClass
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass
|
|
14
|
+
class CompetitionsFacetDistribution(FacetDistribution):
|
|
15
|
+
competition_id_categorie_code: dict[str, int] | None = None
|
|
16
|
+
competition_id_nom_extended: dict[str, int] | None = None
|
|
17
|
+
competition_id_sexe: CompetitionIDSexe | None = None
|
|
18
|
+
competition_id_type_competition: CompetitionIDTypeCompetition | None = None
|
|
19
|
+
niveau: NiveauClass | None = None
|
|
20
|
+
organisateur_id: dict[str, int] | None = None
|
|
21
|
+
organisateur_nom: dict[str, int] | None = None
|
|
22
|
+
|
|
23
|
+
@staticmethod
|
|
24
|
+
def from_dict(obj: Any) -> CompetitionsFacetDistribution:
|
|
25
|
+
assert isinstance(obj, dict)
|
|
26
|
+
competition_id_categorie_code = obj.get("competitionId.categorie.code")
|
|
27
|
+
competition_id_nom_extended = obj.get("competitionId.nomExtended")
|
|
28
|
+
competition_id_sexe = from_obj(
|
|
29
|
+
CompetitionIDSexe.from_dict, obj, "competitionId.sexe"
|
|
30
|
+
)
|
|
31
|
+
competition_id_type_competition = from_obj(
|
|
32
|
+
CompetitionIDTypeCompetition.from_dict, obj, "competitionId.typeCompetition"
|
|
33
|
+
)
|
|
34
|
+
niveau = from_obj(NiveauClass.from_dict, obj, "niveau")
|
|
35
|
+
organisateur_id = obj.get("organisateur.id")
|
|
36
|
+
organisateur_nom = obj.get("organisateur.nom")
|
|
37
|
+
return CompetitionsFacetDistribution(
|
|
38
|
+
competition_id_categorie_code=competition_id_categorie_code,
|
|
39
|
+
competition_id_nom_extended=competition_id_nom_extended,
|
|
40
|
+
competition_id_sexe=competition_id_sexe,
|
|
41
|
+
competition_id_type_competition=competition_id_type_competition,
|
|
42
|
+
niveau=niveau,
|
|
43
|
+
organisateur_id=organisateur_id,
|
|
44
|
+
organisateur_nom=organisateur_nom,
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
def to_dict(self) -> dict:
|
|
48
|
+
result: dict = {}
|
|
49
|
+
if self.competition_id_categorie_code is not None:
|
|
50
|
+
result["competitionId.categorie.code"] = self.competition_id_categorie_code
|
|
51
|
+
if self.competition_id_nom_extended is not None:
|
|
52
|
+
result["competitionId.nomExtended"] = self.competition_id_nom_extended
|
|
53
|
+
if self.competition_id_sexe is not None:
|
|
54
|
+
result["competitionId.sexe"] = self.competition_id_sexe.to_dict()
|
|
55
|
+
if self.competition_id_type_competition is not None:
|
|
56
|
+
result["competitionId.typeCompetition"] = (
|
|
57
|
+
self.competition_id_type_competition.to_dict()
|
|
58
|
+
)
|
|
59
|
+
if self.niveau is not None:
|
|
60
|
+
result["niveau"] = self.niveau.to_dict()
|
|
61
|
+
if self.organisateur_id is not None:
|
|
62
|
+
result["organisateur.id"] = self.organisateur_id
|
|
63
|
+
if self.organisateur_nom is not None:
|
|
64
|
+
result["organisateur.nom"] = self.organisateur_nom
|
|
65
|
+
return result
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from .facet_stats import FacetStats
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class CompetitionsFacetStats(FacetStats):
|
|
9
|
+
@staticmethod
|
|
10
|
+
def from_dict(obj: Any) -> CompetitionsFacetStats:
|
|
11
|
+
return CompetitionsFacetStats()
|
|
12
|
+
|
|
13
|
+
def to_dict(self) -> dict:
|
|
14
|
+
return super().to_dict()
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass, field
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from ..utils.converter_utils import (
|
|
8
|
+
from_bool,
|
|
9
|
+
from_datetime,
|
|
10
|
+
from_enum,
|
|
11
|
+
from_int,
|
|
12
|
+
from_list,
|
|
13
|
+
from_obj,
|
|
14
|
+
from_str,
|
|
15
|
+
)
|
|
16
|
+
from .categorie import Categorie
|
|
17
|
+
from .etat import Etat
|
|
18
|
+
from .hit import Hit
|
|
19
|
+
from .logo import Logo
|
|
20
|
+
from .niveau import Niveau
|
|
21
|
+
from .organisateur import Organisateur
|
|
22
|
+
from .phase_code import PhaseCode
|
|
23
|
+
from .poule import Poule
|
|
24
|
+
from .publication_internet import PublicationInternet
|
|
25
|
+
from .saison import Saison
|
|
26
|
+
from .sexe import Sexe
|
|
27
|
+
from .type_competition import TypeCompetition
|
|
28
|
+
from .type_competition_generique import TypeCompetitionGenerique
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@dataclass
|
|
32
|
+
class CompetitionsHit(Hit):
|
|
33
|
+
nom: str | None = None
|
|
34
|
+
code: str | None = None
|
|
35
|
+
niveau: Niveau | None = None
|
|
36
|
+
type_competition: TypeCompetition | None = None
|
|
37
|
+
sexe: Sexe | None = None
|
|
38
|
+
id: str | None = None
|
|
39
|
+
creation_en_cours: bool | None = None
|
|
40
|
+
date_created: datetime | None = None
|
|
41
|
+
date_updated: datetime | None = None
|
|
42
|
+
emarque_v2: bool | None = None
|
|
43
|
+
live_stat: bool | None = None
|
|
44
|
+
publication_internet: PublicationInternet | None = None
|
|
45
|
+
pro: bool | None = None
|
|
46
|
+
competition_origine: str | None = None
|
|
47
|
+
competition_origine_niveau: int | None = None
|
|
48
|
+
phase_code: PhaseCode | None = None
|
|
49
|
+
competition_origine_nom: str | None = None
|
|
50
|
+
etat: Etat | None = None
|
|
51
|
+
poules: list[Poule] | None = None
|
|
52
|
+
phases: list[str] | None = None
|
|
53
|
+
categorie: Categorie | None = None
|
|
54
|
+
id_competition_pere: str | None = None
|
|
55
|
+
organisateur: Organisateur | None = None
|
|
56
|
+
saison: Saison | None = None
|
|
57
|
+
logo: Logo | None = None
|
|
58
|
+
type_competition_generique: TypeCompetitionGenerique | None = None
|
|
59
|
+
thumbnail: str | None = None
|
|
60
|
+
niveau_nb: int | None = None
|
|
61
|
+
lower_nom: str | None = field(init=False, default=None, repr=False)
|
|
62
|
+
lower_code: str | None = field(init=False, default=None, repr=False)
|
|
63
|
+
lower_id: str | None = field(init=False, default=None, repr=False)
|
|
64
|
+
lower_competition_origine: str | None = field(init=False, default=None, repr=False)
|
|
65
|
+
lower_competition_origine_nom: str | None = field(
|
|
66
|
+
init=False, default=None, repr=False
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
@property
|
|
70
|
+
def name(self) -> str | None:
|
|
71
|
+
"""Alias for .nom — unified name accessor across all Hit types."""
|
|
72
|
+
return self.nom
|
|
73
|
+
|
|
74
|
+
def __post_init__(self) -> None:
|
|
75
|
+
self.lower_nom = self.nom.lower() if self.nom else None
|
|
76
|
+
self.lower_code = self.code.lower() if self.code else None
|
|
77
|
+
self.lower_id = self.id.lower() if self.id else None
|
|
78
|
+
self.lower_competition_origine = (
|
|
79
|
+
self.competition_origine.lower() if self.competition_origine else None
|
|
80
|
+
)
|
|
81
|
+
self.lower_competition_origine_nom = (
|
|
82
|
+
self.competition_origine_nom.lower()
|
|
83
|
+
if self.competition_origine_nom
|
|
84
|
+
else None
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
@staticmethod
|
|
88
|
+
def from_dict(obj: Any) -> CompetitionsHit:
|
|
89
|
+
try:
|
|
90
|
+
assert isinstance(obj, dict)
|
|
91
|
+
nom = from_str(obj, "nom")
|
|
92
|
+
code = from_str(obj, "code")
|
|
93
|
+
niveau = from_enum(Niveau, obj, "niveau")
|
|
94
|
+
type_competition = from_enum(TypeCompetition, obj, "typeCompetition")
|
|
95
|
+
sexe = from_enum(Sexe, obj, "sexe")
|
|
96
|
+
id = from_str(obj, "id")
|
|
97
|
+
creation_en_cours = from_bool(obj, "creationEnCours")
|
|
98
|
+
date_created = from_datetime(obj, "date_created")
|
|
99
|
+
date_updated = from_datetime(obj, "date_updated")
|
|
100
|
+
emarque_v2 = from_bool(obj, "emarqueV2")
|
|
101
|
+
live_stat = from_bool(obj, "liveStat")
|
|
102
|
+
publication_internet = from_enum(
|
|
103
|
+
PublicationInternet, obj, "publicationInternet"
|
|
104
|
+
)
|
|
105
|
+
pro = from_bool(obj, "pro")
|
|
106
|
+
competition_origine = from_str(obj, "competition_origine")
|
|
107
|
+
competition_origine_niveau = from_int(obj, "competition_origine_niveau")
|
|
108
|
+
phase_code = from_enum(PhaseCode, obj, "phase_code")
|
|
109
|
+
competition_origine_nom = from_str(obj, "competition_origine_nom")
|
|
110
|
+
etat = from_enum(Etat, obj, "etat")
|
|
111
|
+
poules = from_list(Poule.from_dict, obj, "poules")
|
|
112
|
+
phases = from_list(str, obj, "phases")
|
|
113
|
+
categorie = from_obj(Categorie.from_dict, obj, "categorie")
|
|
114
|
+
id_competition_pere = from_str(obj, "idCompetitionPere")
|
|
115
|
+
organisateur = from_obj(Organisateur.from_dict, obj, "organisateur")
|
|
116
|
+
saison = from_obj(Saison.from_dict, obj, "saison")
|
|
117
|
+
logo = from_obj(Logo.from_dict, obj, "logo")
|
|
118
|
+
type_competition_generique = from_obj(
|
|
119
|
+
TypeCompetitionGenerique.from_dict, obj, "typeCompetitionGenerique"
|
|
120
|
+
)
|
|
121
|
+
thumbnail = from_str(obj, "thumbnail")
|
|
122
|
+
niveau_nb = from_int(obj, "niveau_nb")
|
|
123
|
+
return CompetitionsHit(
|
|
124
|
+
nom=nom,
|
|
125
|
+
code=code,
|
|
126
|
+
niveau=niveau,
|
|
127
|
+
type_competition=type_competition,
|
|
128
|
+
sexe=sexe,
|
|
129
|
+
id=id,
|
|
130
|
+
creation_en_cours=creation_en_cours,
|
|
131
|
+
date_created=date_created,
|
|
132
|
+
date_updated=date_updated,
|
|
133
|
+
emarque_v2=emarque_v2,
|
|
134
|
+
live_stat=live_stat,
|
|
135
|
+
publication_internet=publication_internet,
|
|
136
|
+
pro=pro,
|
|
137
|
+
competition_origine=competition_origine,
|
|
138
|
+
competition_origine_niveau=competition_origine_niveau,
|
|
139
|
+
phase_code=phase_code,
|
|
140
|
+
competition_origine_nom=competition_origine_nom,
|
|
141
|
+
etat=etat,
|
|
142
|
+
poules=poules,
|
|
143
|
+
phases=phases,
|
|
144
|
+
categorie=categorie,
|
|
145
|
+
id_competition_pere=id_competition_pere,
|
|
146
|
+
organisateur=organisateur,
|
|
147
|
+
saison=saison,
|
|
148
|
+
logo=logo,
|
|
149
|
+
type_competition_generique=type_competition_generique,
|
|
150
|
+
thumbnail=thumbnail,
|
|
151
|
+
niveau_nb=niveau_nb,
|
|
152
|
+
)
|
|
153
|
+
except Exception as e:
|
|
154
|
+
raise ValueError(f"Invalid `Hit.from_dict` input: {e}") from e
|
|
155
|
+
|
|
156
|
+
def to_dict(self) -> dict:
|
|
157
|
+
result: dict = {}
|
|
158
|
+
if self.nom is not None:
|
|
159
|
+
result["nom"] = self.nom
|
|
160
|
+
if self.code is not None:
|
|
161
|
+
result["code"] = self.code
|
|
162
|
+
if self.niveau is not None:
|
|
163
|
+
result["niveau"] = self.niveau.value
|
|
164
|
+
if self.type_competition is not None:
|
|
165
|
+
result["typeCompetition"] = self.type_competition.value
|
|
166
|
+
if self.sexe is not None:
|
|
167
|
+
result["sexe"] = self.sexe.value
|
|
168
|
+
if self.id is not None:
|
|
169
|
+
result["id"] = self.id
|
|
170
|
+
if self.creation_en_cours is not None:
|
|
171
|
+
result["creationEnCours"] = self.creation_en_cours
|
|
172
|
+
if self.date_created is not None:
|
|
173
|
+
result["date_created"] = self.date_created.isoformat()
|
|
174
|
+
if self.date_updated is not None:
|
|
175
|
+
result["date_updated"] = self.date_updated.isoformat()
|
|
176
|
+
if self.emarque_v2 is not None:
|
|
177
|
+
result["emarqueV2"] = self.emarque_v2
|
|
178
|
+
if self.live_stat is not None:
|
|
179
|
+
result["liveStat"] = self.live_stat
|
|
180
|
+
if self.publication_internet is not None:
|
|
181
|
+
result["publicationInternet"] = self.publication_internet.value
|
|
182
|
+
if self.pro is not None:
|
|
183
|
+
result["pro"] = self.pro
|
|
184
|
+
if self.competition_origine is not None:
|
|
185
|
+
result["competition_origine"] = self.competition_origine
|
|
186
|
+
if self.competition_origine_niveau is not None:
|
|
187
|
+
result["competition_origine_niveau"] = self.competition_origine_niveau
|
|
188
|
+
if self.phase_code is not None:
|
|
189
|
+
result["phase_code"] = self.phase_code.value
|
|
190
|
+
if self.competition_origine_nom is not None:
|
|
191
|
+
result["competition_origine_nom"] = self.competition_origine_nom
|
|
192
|
+
if self.etat is not None:
|
|
193
|
+
result["etat"] = self.etat.value
|
|
194
|
+
if self.poules is not None:
|
|
195
|
+
result["poules"] = [p.to_dict() for p in self.poules]
|
|
196
|
+
if self.phases is not None:
|
|
197
|
+
result["phases"] = self.phases
|
|
198
|
+
if self.categorie is not None:
|
|
199
|
+
result["categorie"] = self.categorie.to_dict()
|
|
200
|
+
if self.id_competition_pere is not None:
|
|
201
|
+
result["idCompetitionPere"] = self.id_competition_pere
|
|
202
|
+
if self.organisateur is not None:
|
|
203
|
+
result["organisateur"] = self.organisateur.to_dict()
|
|
204
|
+
if self.saison is not None:
|
|
205
|
+
result["saison"] = self.saison.to_dict()
|
|
206
|
+
if self.logo is not None:
|
|
207
|
+
result["logo"] = self.logo.to_dict()
|
|
208
|
+
if self.type_competition_generique is not None:
|
|
209
|
+
result["typeCompetitionGenerique"] = (
|
|
210
|
+
self.type_competition_generique.to_dict()
|
|
211
|
+
)
|
|
212
|
+
if self.thumbnail is not None:
|
|
213
|
+
result["thumbnail"] = self.thumbnail
|
|
214
|
+
if self.niveau_nb is not None:
|
|
215
|
+
result["niveau_nb"] = str(self.niveau_nb)
|
|
216
|
+
return result
|
|
217
|
+
|
|
218
|
+
def is_valid_for_query(self, query: str) -> bool:
|
|
219
|
+
return bool(
|
|
220
|
+
not query
|
|
221
|
+
or (self.lower_nom and query in self.lower_nom)
|
|
222
|
+
or (self.lower_code and query in self.lower_code)
|
|
223
|
+
or (self.lower_id and query in self.lower_id)
|
|
224
|
+
or (
|
|
225
|
+
self.lower_competition_origine
|
|
226
|
+
and query in self.lower_competition_origine
|
|
227
|
+
)
|
|
228
|
+
or (
|
|
229
|
+
self.lower_competition_origine_nom
|
|
230
|
+
and query in self.lower_competition_origine_nom
|
|
231
|
+
)
|
|
232
|
+
)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from ..config import MEILISEARCH_INDEX_COMPETITIONS
|
|
4
|
+
from .competitions_facet_distribution import CompetitionsFacetDistribution
|
|
5
|
+
from .competitions_facet_stats import CompetitionsFacetStats
|
|
6
|
+
from .multi_search_query import MultiSearchQuery
|
|
7
|
+
from .multi_search_result_competitions import CompetitionsMultiSearchResult
|
|
8
|
+
from .multi_search_results import MultiSearchResult
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class CompetitionsMultiSearchQuery(MultiSearchQuery):
|
|
12
|
+
def __init__(
|
|
13
|
+
self,
|
|
14
|
+
q: str | None,
|
|
15
|
+
limit: int | None = 10,
|
|
16
|
+
offset: int | None = 0,
|
|
17
|
+
filter: list[str] | None = None,
|
|
18
|
+
sort: list[str] | None = None,
|
|
19
|
+
):
|
|
20
|
+
super().__init__(
|
|
21
|
+
index_uid=MEILISEARCH_INDEX_COMPETITIONS,
|
|
22
|
+
q=q,
|
|
23
|
+
limit=limit,
|
|
24
|
+
offset=offset,
|
|
25
|
+
filter=filter,
|
|
26
|
+
sort=sort,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
def is_valid_result(self, result: MultiSearchResult):
|
|
30
|
+
return result and (
|
|
31
|
+
isinstance(result, CompetitionsMultiSearchResult)
|
|
32
|
+
and (
|
|
33
|
+
result.facet_distribution is None
|
|
34
|
+
or isinstance(result.facet_distribution, CompetitionsFacetDistribution)
|
|
35
|
+
)
|
|
36
|
+
and (
|
|
37
|
+
result.facet_stats is None
|
|
38
|
+
or isinstance(result.facet_stats, CompetitionsFacetStats)
|
|
39
|
+
)
|
|
40
|
+
)
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass, field
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@dataclass
|
|
7
|
+
class CompetitionsQuery:
|
|
8
|
+
deep_phases_poules_rencontres__limit: str | None = (
|
|
9
|
+
"1000" # Original: deep[phases][poules][rencontres][_limit]
|
|
10
|
+
)
|
|
11
|
+
fields_: list[str] | None = field(default=None) # Original: fields[]
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@dataclass
|
|
7
|
+
class ContactInfo:
|
|
8
|
+
"""Compact contact information used by V3 composite helpers.
|
|
9
|
+
|
|
10
|
+
Fields are intentionally simple (no enums) to keep the model lightweight
|
|
11
|
+
and avoid tight coupling with Directus-specific enums.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
nom: str | None = None
|
|
15
|
+
prenom: str | None = None
|
|
16
|
+
email: str | None = None
|
|
17
|
+
telephone: str | None = None
|
|
18
|
+
role: str | None = None
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from ..config import (
|
|
4
|
+
MEILISEARCH_FACETS_GALERIES,
|
|
5
|
+
MEILISEARCH_FACETS_NEWS,
|
|
6
|
+
MEILISEARCH_FACETS_RSS,
|
|
7
|
+
MEILISEARCH_FACETS_YOUTUBE_VIDEOS,
|
|
8
|
+
MEILISEARCH_INDEX_GALERIES,
|
|
9
|
+
MEILISEARCH_INDEX_NEWS,
|
|
10
|
+
MEILISEARCH_INDEX_RSS,
|
|
11
|
+
MEILISEARCH_INDEX_YOUTUBE_VIDEOS,
|
|
12
|
+
)
|
|
13
|
+
from .multi_search_query import MultiSearchQuery
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class NewsMultiSearchQuery(MultiSearchQuery):
|
|
17
|
+
def __init__(
|
|
18
|
+
self,
|
|
19
|
+
q: str | None,
|
|
20
|
+
limit: int | None = 10,
|
|
21
|
+
offset: int | None = 0,
|
|
22
|
+
filter: list[str] | None = None,
|
|
23
|
+
sort: list[str] | None = None,
|
|
24
|
+
):
|
|
25
|
+
super().__init__(
|
|
26
|
+
index_uid=MEILISEARCH_INDEX_NEWS,
|
|
27
|
+
q=q,
|
|
28
|
+
facets=MEILISEARCH_FACETS_NEWS,
|
|
29
|
+
limit=limit,
|
|
30
|
+
offset=offset,
|
|
31
|
+
filter=filter,
|
|
32
|
+
sort=sort,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class YoutubeVideosMultiSearchQuery(MultiSearchQuery):
|
|
37
|
+
def __init__(
|
|
38
|
+
self,
|
|
39
|
+
q: str | None,
|
|
40
|
+
limit: int | None = 10,
|
|
41
|
+
offset: int | None = 0,
|
|
42
|
+
filter: list[str] | None = None,
|
|
43
|
+
sort: list[str] | None = None,
|
|
44
|
+
):
|
|
45
|
+
super().__init__(
|
|
46
|
+
index_uid=MEILISEARCH_INDEX_YOUTUBE_VIDEOS,
|
|
47
|
+
q=q,
|
|
48
|
+
facets=MEILISEARCH_FACETS_YOUTUBE_VIDEOS,
|
|
49
|
+
limit=limit,
|
|
50
|
+
offset=offset,
|
|
51
|
+
filter=filter,
|
|
52
|
+
sort=sort,
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class RssMultiSearchQuery(MultiSearchQuery):
|
|
57
|
+
def __init__(
|
|
58
|
+
self,
|
|
59
|
+
q: str | None,
|
|
60
|
+
limit: int | None = 10,
|
|
61
|
+
offset: int | None = 0,
|
|
62
|
+
filter: list[str] | None = None,
|
|
63
|
+
sort: list[str] | None = None,
|
|
64
|
+
):
|
|
65
|
+
super().__init__(
|
|
66
|
+
index_uid=MEILISEARCH_INDEX_RSS,
|
|
67
|
+
q=q,
|
|
68
|
+
facets=MEILISEARCH_FACETS_RSS,
|
|
69
|
+
limit=limit,
|
|
70
|
+
offset=offset,
|
|
71
|
+
filter=filter,
|
|
72
|
+
sort=sort,
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class GaleriesMultiSearchQuery(MultiSearchQuery):
|
|
77
|
+
def __init__(
|
|
78
|
+
self,
|
|
79
|
+
q: str | None,
|
|
80
|
+
limit: int | None = 10,
|
|
81
|
+
offset: int | None = 0,
|
|
82
|
+
filter: list[str] | None = None,
|
|
83
|
+
sort: list[str] | None = None,
|
|
84
|
+
):
|
|
85
|
+
super().__init__(
|
|
86
|
+
index_uid=MEILISEARCH_INDEX_GALERIES,
|
|
87
|
+
q=q,
|
|
88
|
+
facets=MEILISEARCH_FACETS_GALERIES,
|
|
89
|
+
limit=limit,
|
|
90
|
+
offset=offset,
|
|
91
|
+
filter=filter,
|
|
92
|
+
sort=sort,
|
|
93
|
+
)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from ..utils.converter_utils import from_list, from_str
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@dataclass
|
|
10
|
+
class Coordonnees:
|
|
11
|
+
type: str | None = None
|
|
12
|
+
coordinates: list[float] | None = None
|
|
13
|
+
|
|
14
|
+
@staticmethod
|
|
15
|
+
def from_dict(obj: Any) -> Coordonnees:
|
|
16
|
+
assert isinstance(obj, dict)
|
|
17
|
+
type = from_str(obj, "type")
|
|
18
|
+
coordinates = from_list(float, obj, "coordinates")
|
|
19
|
+
return Coordonnees(type=type, coordinates=coordinates)
|
|
20
|
+
|
|
21
|
+
def to_dict(self) -> dict:
|
|
22
|
+
result: dict = {}
|
|
23
|
+
if self.type is not None:
|
|
24
|
+
result["type"] = self.type
|
|
25
|
+
if self.coordinates is not None:
|
|
26
|
+
result["coordinates"] = self.coordinates
|
|
27
|
+
return result
|