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,29 @@
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 .facet_distribution import FacetDistribution
8
+ from .pratiques_type_class import PratiquesTypeClass
9
+
10
+
11
+ @dataclass
12
+ class PratiquesFacetDistribution(FacetDistribution):
13
+ label: dict[str, int] | None = None
14
+ type: PratiquesTypeClass | None = None
15
+
16
+ @staticmethod
17
+ def from_dict(obj: Any) -> PratiquesFacetDistribution:
18
+ assert isinstance(obj, dict)
19
+ label = obj.get("label")
20
+ type = from_obj(PratiquesTypeClass.from_dict, obj, "type")
21
+ return PratiquesFacetDistribution(label=label, type=type)
22
+
23
+ def to_dict(self) -> dict:
24
+ result: dict = {}
25
+ if self.label is not None:
26
+ result["label"] = self.label
27
+ if self.type is not None:
28
+ result["type"] = self.type.to_dict()
29
+ 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 PratiquesFacetStats(FacetStats):
9
+ @staticmethod
10
+ def from_dict(obj: Any) -> PratiquesFacetStats:
11
+ return PratiquesFacetStats()
12
+
13
+ def to_dict(self) -> dict:
14
+ return super().to_dict()
@@ -0,0 +1,310 @@
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_datetime,
9
+ from_enum,
10
+ from_float,
11
+ from_int,
12
+ from_list,
13
+ from_obj,
14
+ from_str,
15
+ )
16
+ from .affiche import Affiche
17
+ from .cartographie import Cartographie
18
+ from .geo import Geo
19
+ from .hit import Hit
20
+ from .jour import Jour
21
+ from .label import Label
22
+ from .objectif import Objectif
23
+ from .pratiques_hit_type import HitType
24
+
25
+
26
+ @dataclass
27
+ class PratiquesHit(Hit):
28
+ titre: str | None = None
29
+ type: HitType | None = None
30
+ adresse: str | None = None
31
+ description: str | None = None
32
+ id: int | None = None
33
+ date_created: datetime | None = None
34
+ date_debut: datetime | None = None
35
+ date_demande: int | None = None
36
+ date_fin: datetime | None = None
37
+ date_updated: datetime | None = None
38
+ facebook: str | None = None
39
+ site_web: str | None = None
40
+ twitter: str | None = None
41
+ action: str | None = None
42
+ adresse_salle: str | None = None
43
+ adresse_structure: str | None = None
44
+ assurance: str | None = None
45
+ code: str | None = None
46
+ cp_salle: str | None = None
47
+ date_inscription: int | None = None
48
+ email: str | None = None
49
+ engagement: str | None = None
50
+ horaires_seances: str | None = None
51
+ inscriptions: str | None = None
52
+ jours: list[Jour] | None = None
53
+ label: Label | None = None
54
+ latitude: float | None = None
55
+ longitude: float | None = None
56
+ mail_demandeur: str | None = None
57
+ mail_structure: str | None = None
58
+ nom_demandeur: str | None = None
59
+ nom_salle: str | None = None
60
+ nom_structure: str | None = None
61
+ nombre_personnes: str | None = None
62
+ nombre_seances: str | None = None
63
+ objectif: Objectif | None = None
64
+ prenom_demandeur: str | None = None
65
+ public: str | None = None
66
+ telephone: str | None = None
67
+ ville_salle: str | None = None
68
+ cartographie: Cartographie | None = None
69
+ affiche: Affiche | None = None
70
+ geo: Geo | None = None
71
+ date_debut_timestamp: int | None = None
72
+ date_fin_timestamp: int | None = None
73
+ thumbnail: str | None = None
74
+ lower_titre: str | None = field(init=False, default=None, repr=False)
75
+ lower_addresse: str | None = field(init=False, default=None, repr=False)
76
+ lower_description: str | None = field(init=False, default=None, repr=False)
77
+ lower_site_web: str | None = field(init=False, default=None, repr=False)
78
+ lower_action: str | None = field(init=False, default=None, repr=False)
79
+ lower_adresse_salle: str | None = field(init=False, default=None, repr=False)
80
+ lower_adresse_structure: str | None = field(init=False, default=None, repr=False)
81
+ lower_nom_salle: str | None = field(init=False, default=None, repr=False)
82
+ lower_nom_structure: str | None = field(init=False, default=None, repr=False)
83
+ lower_ville_salle: str | None = field(init=False, default=None, repr=False)
84
+
85
+ def __post_init__(self) -> None:
86
+ self.lower_titre = self.titre.lower() if self.titre else None
87
+ self.lower_addresse = self.adresse.lower() if self.adresse else None
88
+ self.lower_description = self.description.lower() if self.description else None
89
+ self.lower_site_web = self.site_web.lower() if self.site_web else None
90
+ self.lower_action = self.action.lower() if self.action else None
91
+ self.lower_adresse_salle = (
92
+ self.adresse_salle.lower() if self.adresse_salle else None
93
+ )
94
+ self.lower_adresse_structure = (
95
+ self.adresse_structure.lower() if self.adresse_structure else None
96
+ )
97
+ self.lower_nom_salle = self.nom_salle.lower() if self.nom_salle else None
98
+ self.lower_nom_structure = (
99
+ self.nom_structure.lower() if self.nom_structure else None
100
+ )
101
+ self.lower_ville_salle = self.ville_salle.lower() if self.ville_salle else None
102
+
103
+ @staticmethod
104
+ def from_dict(obj: Any) -> PratiquesHit:
105
+ assert isinstance(obj, dict)
106
+ titre = from_str(obj, "titre")
107
+ type = from_enum(HitType, obj, "type")
108
+ adresse = from_str(obj, "adresse")
109
+ description = from_str(obj, "description")
110
+ id = from_int(obj, "id")
111
+ date_created = from_datetime(obj, "date_created")
112
+ date_debut = from_datetime(obj, "date_debut")
113
+ date_demande = from_int(obj, "date_demande")
114
+ date_fin = from_datetime(obj, "date_fin")
115
+ date_updated = from_datetime(obj, "date_updated")
116
+ facebook = from_str(obj, "facebook")
117
+ site_web = from_str(obj, "site_web")
118
+ twitter = from_str(obj, "twitter")
119
+ action = from_str(obj, "action")
120
+ adresse_salle = from_str(obj, "adresse_salle")
121
+ adresse_structure = from_str(obj, "adresse_structure")
122
+ assurance = from_str(obj, "assurance")
123
+ code = from_str(obj, "code")
124
+ cp_salle = from_str(obj, "cp_salle")
125
+ date_inscription = from_int(obj, "date_inscription")
126
+ email = from_str(obj, "email")
127
+ engagement = from_str(obj, "engagement")
128
+ horaires_seances = from_str(obj, "horaires_seances")
129
+ inscriptions = from_str(obj, "inscriptions")
130
+ jours = from_list(Jour, obj, "jours")
131
+ label = from_enum(Label, obj, "label")
132
+ latitude = from_float(obj, "latitude")
133
+ longitude = from_float(obj, "longitude")
134
+ mail_demandeur = from_str(obj, "mail_demandeur")
135
+ mail_structure = from_str(obj, "mail_structure")
136
+ nom_demandeur = from_str(obj, "nom_demandeur")
137
+ nom_salle = from_str(obj, "nom_salle")
138
+ nom_structure = from_str(obj, "nom_structure")
139
+ nombre_personnes = from_str(obj, "nombre_personnes")
140
+ nombre_seances = from_str(obj, "nombre_seances")
141
+ objectif = from_enum(Objectif, obj, "objectif")
142
+ prenom_demandeur = from_str(obj, "prenom_demandeur")
143
+ public = from_str(obj, "public")
144
+ telephone = from_str(obj, "telephone")
145
+ ville_salle = from_str(obj, "ville_salle")
146
+ cartographie = from_obj(Cartographie.from_dict, obj, "cartographie")
147
+ affiche = from_obj(Affiche.from_dict, obj, "affiche")
148
+ geo = from_obj(Geo.from_dict, obj, "_geo")
149
+ date_debut_timestamp = from_int(obj, "date_debut_timestamp")
150
+ date_fin_timestamp = from_int(obj, "date_fin_timestamp")
151
+ thumbnail = from_str(obj, "thumbnail")
152
+ return PratiquesHit(
153
+ titre=titre,
154
+ type=type,
155
+ adresse=adresse,
156
+ description=description,
157
+ id=id,
158
+ date_created=date_created,
159
+ date_debut=date_debut,
160
+ date_demande=date_demande,
161
+ date_fin=date_fin,
162
+ date_updated=date_updated,
163
+ facebook=facebook,
164
+ site_web=site_web,
165
+ twitter=twitter,
166
+ action=action,
167
+ adresse_salle=adresse_salle,
168
+ adresse_structure=adresse_structure,
169
+ assurance=assurance,
170
+ code=code,
171
+ cp_salle=cp_salle,
172
+ date_inscription=date_inscription,
173
+ email=email,
174
+ engagement=engagement,
175
+ horaires_seances=horaires_seances,
176
+ inscriptions=inscriptions,
177
+ jours=jours,
178
+ label=label,
179
+ latitude=latitude,
180
+ longitude=longitude,
181
+ mail_demandeur=mail_demandeur,
182
+ mail_structure=mail_structure,
183
+ nom_demandeur=nom_demandeur,
184
+ nom_salle=nom_salle,
185
+ nom_structure=nom_structure,
186
+ nombre_personnes=nombre_personnes,
187
+ nombre_seances=nombre_seances,
188
+ objectif=objectif,
189
+ prenom_demandeur=prenom_demandeur,
190
+ public=public,
191
+ telephone=telephone,
192
+ ville_salle=ville_salle,
193
+ cartographie=cartographie,
194
+ affiche=affiche,
195
+ geo=geo,
196
+ date_debut_timestamp=date_debut_timestamp,
197
+ date_fin_timestamp=date_fin_timestamp,
198
+ thumbnail=thumbnail,
199
+ )
200
+
201
+ def to_dict(self) -> dict:
202
+ result: dict = {}
203
+ if self.titre is not None:
204
+ result["titre"] = self.titre
205
+ if self.type is not None:
206
+ result["type"] = self.type.value
207
+ if self.adresse is not None:
208
+ result["adresse"] = self.adresse
209
+ if self.description is not None:
210
+ result["description"] = self.description
211
+ if self.id is not None:
212
+ result["id"] = str(self.id)
213
+ if self.date_created is not None:
214
+ result["date_created"] = self.date_created.isoformat()
215
+ if self.date_debut is not None:
216
+ result["date_debut"] = self.date_debut.isoformat()
217
+ if self.date_demande is not None:
218
+ result["date_demande"] = str(self.date_demande)
219
+ if self.date_fin is not None:
220
+ result["date_fin"] = self.date_fin.isoformat()
221
+ if self.date_updated is not None:
222
+ result["date_updated"] = self.date_updated.isoformat()
223
+ if self.facebook is not None:
224
+ result["facebook"] = self.facebook
225
+ if self.site_web is not None:
226
+ result["site_web"] = self.site_web
227
+ if self.twitter is not None:
228
+ result["twitter"] = self.twitter
229
+ if self.action is not None:
230
+ result["action"] = self.action
231
+ if self.adresse_salle is not None:
232
+ result["adresse_salle"] = self.adresse_salle
233
+ if self.adresse_structure is not None:
234
+ result["adresse_structure"] = self.adresse_structure
235
+ if self.assurance is not None:
236
+ result["assurance"] = self.assurance
237
+ if self.code is not None:
238
+ result["code"] = self.code
239
+ if self.cp_salle is not None:
240
+ result["cp_salle"] = self.cp_salle
241
+ if self.date_inscription is not None:
242
+ result["date_inscription"] = str(self.date_inscription)
243
+ if self.email is not None:
244
+ result["email"] = self.email
245
+ if self.engagement is not None:
246
+ result["engagement"] = self.engagement
247
+ if self.horaires_seances is not None:
248
+ result["horaires_seances"] = self.horaires_seances
249
+ if self.inscriptions is not None:
250
+ result["inscriptions"] = self.inscriptions
251
+ if self.jours is not None:
252
+ result["jours"] = [j.value for j in self.jours]
253
+ if self.label is not None:
254
+ result["label"] = self.label.value
255
+ if self.latitude is not None:
256
+ result["latitude"] = self.latitude
257
+ if self.longitude is not None:
258
+ result["longitude"] = self.longitude
259
+ if self.mail_demandeur is not None:
260
+ result["mail_demandeur"] = self.mail_demandeur
261
+ if self.mail_structure is not None:
262
+ result["mail_structure"] = self.mail_structure
263
+ if self.nom_demandeur is not None:
264
+ result["nom_demandeur"] = self.nom_demandeur
265
+ if self.nom_salle is not None:
266
+ result["nom_salle"] = self.nom_salle
267
+ if self.nom_structure is not None:
268
+ result["nom_structure"] = self.nom_structure
269
+ if self.nombre_personnes is not None:
270
+ result["nombre_personnes"] = self.nombre_personnes
271
+ if self.nombre_seances is not None:
272
+ result["nombre_seances"] = self.nombre_seances
273
+ if self.objectif is not None:
274
+ result["objectif"] = self.objectif.value
275
+ if self.prenom_demandeur is not None:
276
+ result["prenom_demandeur"] = self.prenom_demandeur
277
+ if self.public is not None:
278
+ result["public"] = self.public
279
+ if self.telephone is not None:
280
+ result["telephone"] = self.telephone
281
+ if self.ville_salle is not None:
282
+ result["ville_salle"] = self.ville_salle
283
+ if self.cartographie is not None:
284
+ result["cartographie"] = self.cartographie.to_dict()
285
+ if self.affiche is not None:
286
+ result["affiche"] = self.affiche.to_dict()
287
+ if self.geo is not None:
288
+ result["_geo"] = self.geo.to_dict()
289
+ if self.date_debut_timestamp is not None:
290
+ result["date_debut_timestamp"] = self.date_debut_timestamp
291
+ if self.date_fin_timestamp is not None:
292
+ result["date_fin_timestamp"] = self.date_fin_timestamp
293
+ if self.thumbnail is not None:
294
+ result["thumbnail"] = self.thumbnail
295
+ return result
296
+
297
+ def is_valid_for_query(self, query: str) -> bool:
298
+ return bool(
299
+ not query
300
+ or (self.lower_titre and query in self.lower_titre)
301
+ or (self.lower_addresse and query in self.lower_addresse)
302
+ or (self.lower_description and query in self.lower_description)
303
+ or (self.lower_site_web and query in self.lower_site_web)
304
+ or (self.lower_action and query in self.lower_action)
305
+ or (self.lower_adresse_salle and query in self.lower_adresse_salle)
306
+ or (self.lower_adresse_structure and query in self.lower_adresse_structure)
307
+ or (self.lower_nom_salle and query in self.lower_nom_salle)
308
+ or (self.lower_nom_structure and query in self.lower_nom_structure)
309
+ or (self.lower_ville_salle and query in self.lower_ville_salle)
310
+ )
@@ -0,0 +1,9 @@
1
+ from enum import Enum
2
+
3
+
4
+ class HitType(Enum):
5
+ BASKET_INCLUSIF = "Basket Inclusif"
6
+ BASKET_SANTÉ = "Basket Santé"
7
+ BASKET_TONIK = "Basket Tonik"
8
+ CENTRE_GÉNÉRATION_BASKET = "Centre Génération Basket"
9
+ MICRO_BASKET = "Micro Basket"
@@ -0,0 +1,41 @@
1
+ from __future__ import annotations
2
+
3
+ from ..config import MEILISEARCH_FACETS_PRATIQUES, MEILISEARCH_INDEX_PRATIQUES
4
+ from .multi_search_query import MultiSearchQuery
5
+ from .multi_search_result_pratiques import PratiquesMultiSearchResult
6
+ from .multi_search_results import MultiSearchResult
7
+ from .pratiques_facet_distribution import PratiquesFacetDistribution
8
+ from .pratiques_facet_stats import PratiquesFacetStats
9
+
10
+
11
+ class PratiquesMultiSearchQuery(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_PRATIQUES,
22
+ q=q,
23
+ facets=MEILISEARCH_FACETS_PRATIQUES,
24
+ limit=limit,
25
+ offset=offset,
26
+ filter=filter,
27
+ sort=sort,
28
+ )
29
+
30
+ def is_valid_result(self, result: MultiSearchResult):
31
+ return result and (
32
+ isinstance(result, PratiquesMultiSearchResult)
33
+ and (
34
+ result.facet_distribution is None
35
+ or isinstance(result.facet_distribution, PratiquesFacetDistribution)
36
+ )
37
+ and (
38
+ result.facet_stats is None
39
+ or isinstance(result.facet_stats, PratiquesFacetStats)
40
+ )
41
+ )
@@ -0,0 +1,45 @@
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 PratiquesTypeClass:
11
+ basket_inclusif: int | None = None
12
+ basket_santé: int | None = None
13
+ basket_tonik: int | None = None
14
+ centre_génération_basket: int | None = None
15
+ micro_basket: int | None = None
16
+
17
+ @staticmethod
18
+ def from_dict(obj: Any) -> PratiquesTypeClass:
19
+ assert isinstance(obj, dict)
20
+ basket_inclusif = from_int(obj, "Basket Inclusif")
21
+ basket_santé = from_int(obj, "Basket Santé")
22
+ basket_tonik = from_int(obj, "Basket Tonik")
23
+ centre_génération_basket = from_int(obj, "Centre Génération Basket")
24
+ micro_basket = from_int(obj, "Micro Basket")
25
+ return PratiquesTypeClass(
26
+ basket_inclusif=basket_inclusif,
27
+ basket_santé=basket_santé,
28
+ basket_tonik=basket_tonik,
29
+ centre_génération_basket=centre_génération_basket,
30
+ micro_basket=micro_basket,
31
+ )
32
+
33
+ def to_dict(self) -> dict:
34
+ result: dict = {}
35
+ if self.basket_inclusif is not None:
36
+ result["Basket Inclusif"] = self.basket_inclusif
37
+ if self.basket_santé is not None:
38
+ result["Basket Santé"] = self.basket_santé
39
+ if self.basket_tonik is not None:
40
+ result["Basket Tonik"] = self.basket_tonik
41
+ if self.centre_génération_basket is not None:
42
+ result["Centre Génération Basket"] = self.centre_génération_basket
43
+ if self.micro_basket is not None:
44
+ result["Micro Basket"] = self.micro_basket
45
+ return result
@@ -0,0 +1,6 @@
1
+ from enum import Enum
2
+
3
+
4
+ class PublicationInternet(Enum):
5
+ AFFICHÉE = "Affichée"
6
+ ASC = "ASC"
@@ -0,0 +1,24 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass
4
+ from typing import Any
5
+ from uuid import UUID
6
+
7
+ from ..utils.converter_utils import from_uuid
8
+
9
+
10
+ @dataclass
11
+ class PurpleLogo:
12
+ id: UUID | None = None
13
+
14
+ @staticmethod
15
+ def from_dict(obj: Any) -> PurpleLogo:
16
+ assert isinstance(obj, dict)
17
+ id = from_uuid(obj, "id")
18
+ return PurpleLogo(id=id)
19
+
20
+ def to_dict(self) -> dict:
21
+ result: dict = {}
22
+ if self.id is not None:
23
+ result["id"] = str(self.id)
24
+ return result
@@ -0,0 +1,75 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+ from .competition_fields import CompetitionFields
4
+ from .field_set import FieldSet
5
+ from .organisme_fields import OrganismeFields
6
+ from .poule_fields import PouleFields
7
+ from .saison_fields import SaisonFields
8
+
9
+
10
+ class QueryFieldsManager(ABC):
11
+ """Abstract base class for handling query fields across different entity types.
12
+
13
+ Subclasses must implement get_fields() to return the appropriate field list.
14
+ Static helper methods remain available for direct use.
15
+ """
16
+
17
+ @staticmethod
18
+ def get_organisme_search_fields() -> list[str]:
19
+ """Champs optimisés pour les contextes de recherche/identification
20
+ (31 champs vs 77 pour FieldSet.DEFAULT).
21
+ """
22
+ return OrganismeFields.get_search_fields()
23
+
24
+ @abstractmethod
25
+ def get_fields(self) -> list[str]:
26
+ """Return the list of fields for this query."""
27
+ ...
28
+
29
+ @staticmethod
30
+ def get_organisme_fields(field_set: FieldSet = FieldSet.DEFAULT) -> list[str]:
31
+ """Get organisme fields based on field set."""
32
+ if field_set == FieldSet.BASIC:
33
+ return OrganismeFields.get_basic_fields()
34
+ elif field_set == FieldSet.DETAILED:
35
+ return OrganismeFields.get_detailed_fields()
36
+ else:
37
+ return OrganismeFields.get_default_fields()
38
+
39
+ @staticmethod
40
+ def get_competition_fields(field_set: FieldSet = FieldSet.DEFAULT) -> list[str]:
41
+ """Get competition fields based on field set."""
42
+ if field_set == FieldSet.BASIC:
43
+ return CompetitionFields.get_basic_fields()
44
+ elif field_set == FieldSet.DETAILED:
45
+ return CompetitionFields.get_detailed_fields()
46
+ else:
47
+ return CompetitionFields.get_default_fields()
48
+
49
+ @staticmethod
50
+ def get_poule_fields(field_set: FieldSet = FieldSet.DEFAULT) -> list[str]:
51
+ """Get poule fields based on field set."""
52
+ if field_set == FieldSet.BASIC:
53
+ return PouleFields.get_basic_fields()
54
+ elif field_set == FieldSet.DETAILED:
55
+ return PouleFields.get_detailed_fields()
56
+ else:
57
+ return PouleFields.get_default_fields()
58
+
59
+ @staticmethod
60
+ def get_classement_fields() -> list[str]:
61
+ """Get only classement fields for lightweight queries."""
62
+ return PouleFields.get_classement_fields()
63
+
64
+ @staticmethod
65
+ def get_equipes_fields() -> list[str]:
66
+ """Get only engagement fields for lightweight queries."""
67
+ return OrganismeFields.get_engagements_fields()
68
+
69
+ @staticmethod
70
+ def get_saison_fields(field_set: FieldSet = FieldSet.DEFAULT) -> list[str]:
71
+ """Get saison fields based on field set."""
72
+ if field_set == FieldSet.DETAILED:
73
+ return SaisonFields.get_detailed_fields()
74
+ else:
75
+ return SaisonFields.get_default_fields()
@@ -0,0 +1,41 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass
4
+
5
+
6
+ @dataclass
7
+ class RankingEngagement:
8
+ """Modèle pour l'engagement d'une équipe dans un classement."""
9
+
10
+ id: str
11
+ nom: str
12
+ nom_usuel: str | None = None
13
+ code_abrege: str | None = None
14
+ numero_equ: str | None = None
15
+ numero_equipe: str | None = None
16
+ logo_id: str | None = None
17
+ logo_gradient: str | None = None
18
+
19
+ @classmethod
20
+ def from_dict(cls, data: dict) -> RankingEngagement | None:
21
+ """Convert dictionary to RankingEngagement instance."""
22
+ if not data:
23
+ return None
24
+
25
+ # Handle logo data
26
+ logo_data = data.get("logo", {})
27
+ logo_id = logo_data.get("id") if isinstance(logo_data, dict) else None
28
+ logo_gradient = (
29
+ logo_data.get("gradient_color") if isinstance(logo_data, dict) else None
30
+ )
31
+
32
+ return cls(
33
+ id=str(data.get("id", "")),
34
+ nom=str(data.get("nom", "")),
35
+ nom_usuel=data.get("nomUsuel"),
36
+ code_abrege=data.get("codeAbrege"),
37
+ numero_equ=data.get("numeroEqu"),
38
+ numero_equipe=data.get("numeroEquipe"),
39
+ logo_id=str(logo_id) if logo_id else None,
40
+ logo_gradient=str(logo_gradient) if logo_gradient else None,
41
+ )
@@ -0,0 +1,6 @@
1
+ """Backward-compatibility re-export shim for RankingEngagement, TeamRanking."""
2
+
3
+ from .ranking_engagement import RankingEngagement
4
+ from .team_ranking import TeamRanking
5
+
6
+ __all__ = ["RankingEngagement", "TeamRanking"]
@@ -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_str
7
+
8
+
9
+ @dataclass
10
+ class Engagement:
11
+ id: str | None = None
12
+
13
+ @staticmethod
14
+ def from_dict(obj: Any) -> Engagement:
15
+ assert isinstance(obj, dict)
16
+ id = from_str(obj, "id")
17
+ return Engagement(id=id)
18
+
19
+ def to_dict(self) -> dict:
20
+ result: dict = {}
21
+ if self.id is not None:
22
+ result["id"] = self.id
23
+ return result