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.
Files changed (207) hide show
  1. ffbb_api_client_v3/__init__.py +25 -0
  2. ffbb_data_client/__init__.py +175 -0
  3. ffbb_data_client/clients/__init__.py +13 -0
  4. ffbb_data_client/clients/api_ffbb_app_client.py +2475 -0
  5. ffbb_data_client/clients/ffbb_data_client.py +2789 -0
  6. ffbb_data_client/clients/meilisearch_client.py +218 -0
  7. ffbb_data_client/clients/meilisearch_ffbb_client.py +647 -0
  8. ffbb_data_client/config.py +153 -0
  9. ffbb_data_client/data/__init__.py +25 -0
  10. ffbb_data_client/data/collections.json +1364 -0
  11. ffbb_data_client/data/endpoint_discovery.json +1875 -0
  12. ffbb_data_client/data/indexes.json +501 -0
  13. ffbb_data_client/data/openapi.json +35713 -0
  14. ffbb_data_client/data/openapi_full.json +37622 -0
  15. ffbb_data_client/helpers/__init__.py +27 -0
  16. ffbb_data_client/helpers/http_requests_helper.py +73 -0
  17. ffbb_data_client/helpers/http_requests_utils.py +502 -0
  18. ffbb_data_client/helpers/meilisearch_client_extension.py +153 -0
  19. ffbb_data_client/helpers/multi_search_query_helper.py +35 -0
  20. ffbb_data_client/models/__init__.py +241 -0
  21. ffbb_data_client/models/affiche.py +45 -0
  22. ffbb_data_client/models/cartographie.py +82 -0
  23. ffbb_data_client/models/categorie.py +55 -0
  24. ffbb_data_client/models/categorie_type.py +42 -0
  25. ffbb_data_client/models/clock.py +38 -0
  26. ffbb_data_client/models/club_contacts.py +77 -0
  27. ffbb_data_client/models/code.py +7 -0
  28. ffbb_data_client/models/commune.py +66 -0
  29. ffbb_data_client/models/competition_fields.py +309 -0
  30. ffbb_data_client/models/competition_id.py +116 -0
  31. ffbb_data_client/models/competition_id_categorie.py +31 -0
  32. ffbb_data_client/models/competition_id_sexe.py +31 -0
  33. ffbb_data_client/models/competition_id_type_competition.py +27 -0
  34. ffbb_data_client/models/competition_id_type_competition_generique.py +24 -0
  35. ffbb_data_client/models/competition_origine.py +69 -0
  36. ffbb_data_client/models/competition_origine_categorie.py +23 -0
  37. ffbb_data_client/models/competition_origine_type_competition.py +14 -0
  38. ffbb_data_client/models/competition_origine_type_competition_generique.py +24 -0
  39. ffbb_data_client/models/competition_type.py +6 -0
  40. ffbb_data_client/models/competitions_facet_distribution.py +65 -0
  41. ffbb_data_client/models/competitions_facet_stats.py +14 -0
  42. ffbb_data_client/models/competitions_hit.py +232 -0
  43. ffbb_data_client/models/competitions_multi_search_query.py +40 -0
  44. ffbb_data_client/models/competitions_query.py +11 -0
  45. ffbb_data_client/models/configuration_models.py +5 -0
  46. ffbb_data_client/models/contact_info.py +18 -0
  47. ffbb_data_client/models/content_multi_search_query.py +93 -0
  48. ffbb_data_client/models/coordonnees.py +27 -0
  49. ffbb_data_client/models/coordonnees_type.py +5 -0
  50. ffbb_data_client/models/document_flyer.py +205 -0
  51. ffbb_data_client/models/document_flyer_type.py +6 -0
  52. ffbb_data_client/models/engagement_contacts.py +97 -0
  53. ffbb_data_client/models/engagements_facet_distribution.py +59 -0
  54. ffbb_data_client/models/engagements_facet_stats.py +14 -0
  55. ffbb_data_client/models/engagements_hit.py +192 -0
  56. ffbb_data_client/models/engagements_multi_search_query.py +41 -0
  57. ffbb_data_client/models/etat.py +6 -0
  58. ffbb_data_client/models/external_competition_id.py +42 -0
  59. ffbb_data_client/models/external_id.py +72 -0
  60. ffbb_data_client/models/facet_distribution.py +13 -0
  61. ffbb_data_client/models/facet_stats.py +13 -0
  62. ffbb_data_client/models/field_set.py +10 -0
  63. ffbb_data_client/models/folder.py +35 -0
  64. ffbb_data_client/models/formation_session.py +60 -0
  65. ffbb_data_client/models/formations_facet_distribution.py +61 -0
  66. ffbb_data_client/models/formations_facet_stats.py +14 -0
  67. ffbb_data_client/models/formations_hit.py +277 -0
  68. ffbb_data_client/models/formations_multi_search_query.py +41 -0
  69. ffbb_data_client/models/game_stats_model.py +57 -0
  70. ffbb_data_client/models/game_stats_models.py +5 -0
  71. ffbb_data_client/models/generic_search.py +92 -0
  72. ffbb_data_client/models/geo.py +27 -0
  73. ffbb_data_client/models/geo_sort_order.py +6 -0
  74. ffbb_data_client/models/get_commune_response.py +18 -0
  75. ffbb_data_client/models/get_competition_response.py +523 -0
  76. ffbb_data_client/models/get_configuration_response.py +45 -0
  77. ffbb_data_client/models/get_engagement_response.py +23 -0
  78. ffbb_data_client/models/get_entraineur_response.py +18 -0
  79. ffbb_data_client/models/get_formation_response.py +28 -0
  80. ffbb_data_client/models/get_officiel_response.py +18 -0
  81. ffbb_data_client/models/get_organisme_response.py +476 -0
  82. ffbb_data_client/models/get_poule_response.py +68 -0
  83. ffbb_data_client/models/get_pratique_response.py +18 -0
  84. ffbb_data_client/models/get_rencontre_response.py +93 -0
  85. ffbb_data_client/models/get_saisons_response.py +56 -0
  86. ffbb_data_client/models/get_salle_response.py +20 -0
  87. ffbb_data_client/models/get_terrain_response.py +16 -0
  88. ffbb_data_client/models/get_tournoi_response.py +16 -0
  89. ffbb_data_client/models/gradient_color.py +27 -0
  90. ffbb_data_client/models/hit.py +16 -0
  91. ffbb_data_client/models/id_engagement_equipe.py +32 -0
  92. ffbb_data_client/models/id_organisme_equipe.py +51 -0
  93. ffbb_data_client/models/id_organisme_equipe1_logo.py +28 -0
  94. ffbb_data_client/models/id_poule.py +27 -0
  95. ffbb_data_client/models/jour.py +11 -0
  96. ffbb_data_client/models/label.py +15 -0
  97. ffbb_data_client/models/labellisation.py +30 -0
  98. ffbb_data_client/models/live.py +192 -0
  99. ffbb_data_client/models/lives.py +6 -0
  100. ffbb_data_client/models/logo.py +28 -0
  101. ffbb_data_client/models/multi_search_queries.py +24 -0
  102. ffbb_data_client/models/multi_search_query.py +96 -0
  103. ffbb_data_client/models/multi_search_result_competitions.py +14 -0
  104. ffbb_data_client/models/multi_search_result_engagements.py +14 -0
  105. ffbb_data_client/models/multi_search_result_formations.py +12 -0
  106. ffbb_data_client/models/multi_search_result_organismes.py +12 -0
  107. ffbb_data_client/models/multi_search_result_pratiques.py +12 -0
  108. ffbb_data_client/models/multi_search_result_rencontres.py +12 -0
  109. ffbb_data_client/models/multi_search_result_salles.py +12 -0
  110. ffbb_data_client/models/multi_search_result_terrains.py +12 -0
  111. ffbb_data_client/models/multi_search_result_tournois.py +12 -0
  112. ffbb_data_client/models/multi_search_results.py +103 -0
  113. ffbb_data_client/models/multi_search_results_class.py +96 -0
  114. ffbb_data_client/models/nature_sol.py +57 -0
  115. ffbb_data_client/models/niveau.py +10 -0
  116. ffbb_data_client/models/niveau_class.py +27 -0
  117. ffbb_data_client/models/niveau_extractor.py +214 -0
  118. ffbb_data_client/models/niveau_info.py +64 -0
  119. ffbb_data_client/models/niveau_models.py +14 -0
  120. ffbb_data_client/models/niveau_type.py +10 -0
  121. ffbb_data_client/models/objectif.py +7 -0
  122. ffbb_data_client/models/organisateur.py +197 -0
  123. ffbb_data_client/models/organisateur_type.py +6 -0
  124. ffbb_data_client/models/organisme_fields.py +327 -0
  125. ffbb_data_client/models/organisme_id_pere.py +177 -0
  126. ffbb_data_client/models/organismes_facet_distribution.py +46 -0
  127. ffbb_data_client/models/organismes_facet_stats.py +14 -0
  128. ffbb_data_client/models/organismes_hit.py +196 -0
  129. ffbb_data_client/models/organismes_multi_search_query.py +41 -0
  130. ffbb_data_client/models/organismes_query.py +8 -0
  131. ffbb_data_client/models/phase_code.py +23 -0
  132. ffbb_data_client/models/poule.py +35 -0
  133. ffbb_data_client/models/poule_fields.py +261 -0
  134. ffbb_data_client/models/poule_rencontre_item_model.py +69 -0
  135. ffbb_data_client/models/poules_models.py +6 -0
  136. ffbb_data_client/models/poules_query.py +9 -0
  137. ffbb_data_client/models/pratique.py +7 -0
  138. ffbb_data_client/models/pratiques_facet_distribution.py +29 -0
  139. ffbb_data_client/models/pratiques_facet_stats.py +14 -0
  140. ffbb_data_client/models/pratiques_hit.py +310 -0
  141. ffbb_data_client/models/pratiques_hit_type.py +9 -0
  142. ffbb_data_client/models/pratiques_multi_search_query.py +41 -0
  143. ffbb_data_client/models/pratiques_type_class.py +45 -0
  144. ffbb_data_client/models/publication_internet.py +6 -0
  145. ffbb_data_client/models/purple_logo.py +24 -0
  146. ffbb_data_client/models/query_fields_manager.py +75 -0
  147. ffbb_data_client/models/ranking_engagement.py +41 -0
  148. ffbb_data_client/models/rankings_models.py +6 -0
  149. ffbb_data_client/models/rencontres_engagement.py +23 -0
  150. ffbb_data_client/models/rencontres_facet_distribution.py +65 -0
  151. ffbb_data_client/models/rencontres_facet_stats.py +14 -0
  152. ffbb_data_client/models/rencontres_hit.py +271 -0
  153. ffbb_data_client/models/rencontres_multi_search_query.py +41 -0
  154. ffbb_data_client/models/saison.py +23 -0
  155. ffbb_data_client/models/saison_fields.py +36 -0
  156. ffbb_data_client/models/saisons_models.py +6 -0
  157. ffbb_data_client/models/saisons_query.py +9 -0
  158. ffbb_data_client/models/salle.py +56 -0
  159. ffbb_data_client/models/salles_facet_distribution.py +14 -0
  160. ffbb_data_client/models/salles_facet_stats.py +14 -0
  161. ffbb_data_client/models/salles_hit.py +153 -0
  162. ffbb_data_client/models/salles_multi_search_query.py +40 -0
  163. ffbb_data_client/models/sexe.py +9 -0
  164. ffbb_data_client/models/sexe_class.py +31 -0
  165. ffbb_data_client/models/source.py +5 -0
  166. ffbb_data_client/models/status.py +5 -0
  167. ffbb_data_client/models/team_engagement.py +56 -0
  168. ffbb_data_client/models/team_ranking.py +108 -0
  169. ffbb_data_client/models/terrains_categorie_championnat_3x3_libelle.py +5 -0
  170. ffbb_data_client/models/terrains_facet_distribution.py +41 -0
  171. ffbb_data_client/models/terrains_facet_stats.py +14 -0
  172. ffbb_data_client/models/terrains_hit.py +223 -0
  173. ffbb_data_client/models/terrains_multi_search_query.py +42 -0
  174. ffbb_data_client/models/terrains_name.py +5 -0
  175. ffbb_data_client/models/terrains_sexe_enum.py +7 -0
  176. ffbb_data_client/models/terrains_storage.py +5 -0
  177. ffbb_data_client/models/tournoi_type_class.py +35 -0
  178. ffbb_data_client/models/tournoi_type_enum.py +7 -0
  179. ffbb_data_client/models/tournoi_types_3x3.py +43 -0
  180. ffbb_data_client/models/tournoi_types_3x3_libelle.py +60 -0
  181. ffbb_data_client/models/tournoi_types_3x3_libelle_enum.py +10 -0
  182. ffbb_data_client/models/tournois_facet_distribution.py +41 -0
  183. ffbb_data_client/models/tournois_facet_stats.py +14 -0
  184. ffbb_data_client/models/tournois_hit.py +132 -0
  185. ffbb_data_client/models/tournois_hit_type.py +5 -0
  186. ffbb_data_client/models/tournois_libelle.py +7 -0
  187. ffbb_data_client/models/tournois_multi_search_query.py +40 -0
  188. ffbb_data_client/models/type_association.py +23 -0
  189. ffbb_data_client/models/type_association_libelle.py +30 -0
  190. ffbb_data_client/models/type_class.py +23 -0
  191. ffbb_data_client/models/type_competition.py +8 -0
  192. ffbb_data_client/models/type_competition_generique.py +31 -0
  193. ffbb_data_client/models/type_enum.py +7 -0
  194. ffbb_data_client/models/type_league.py +6 -0
  195. ffbb_data_client/py.typed +0 -0
  196. ffbb_data_client/utils/__init__.py +27 -0
  197. ffbb_data_client/utils/cache_manager.py +393 -0
  198. ffbb_data_client/utils/converter_utils.py +329 -0
  199. ffbb_data_client/utils/input_validation.py +360 -0
  200. ffbb_data_client/utils/retry_utils.py +478 -0
  201. ffbb_data_client/utils/secure_logging.py +153 -0
  202. ffbb_data_client/utils/token_manager.py +115 -0
  203. ffbb_data_client-2.0.0.dist-info/METADATA +339 -0
  204. ffbb_data_client-2.0.0.dist-info/RECORD +207 -0
  205. ffbb_data_client-2.0.0.dist-info/WHEEL +5 -0
  206. ffbb_data_client-2.0.0.dist-info/licenses/LICENSE.txt +201 -0
  207. 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,6 @@
1
+ from enum import Enum
2
+
3
+
4
+ class CompetitionType(Enum):
5
+ CHAMPIONSHIP = "championship"
6
+ CUP = "cup"
@@ -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,5 @@
1
+ """Backward-compatibility re-export shim for GetConfigurationResponse."""
2
+
3
+ from .get_configuration_response import GetConfigurationResponse
4
+
5
+ __all__ = ["GetConfigurationResponse"]
@@ -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
@@ -0,0 +1,5 @@
1
+ from enum import Enum
2
+
3
+
4
+ class CoordonneesType(Enum):
5
+ POINT = "Point"