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,647 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import cast
4
+
5
+ import httpx
6
+ from httpx import Client
7
+
8
+ from ..config import MEILISEARCH_BASE_URL
9
+ from ..helpers.meilisearch_client_extension import MeilisearchClientExtension
10
+ from ..models.competitions_multi_search_query import CompetitionsMultiSearchQuery
11
+ from ..models.content_multi_search_query import (
12
+ GaleriesMultiSearchQuery,
13
+ NewsMultiSearchQuery,
14
+ RssMultiSearchQuery,
15
+ YoutubeVideosMultiSearchQuery,
16
+ )
17
+ from ..models.engagements_multi_search_query import EngagementsMultiSearchQuery
18
+ from ..models.formations_multi_search_query import FormationsMultiSearchQuery
19
+ from ..models.generic_search import (
20
+ GaleriesMultiSearchResult,
21
+ NewsMultiSearchResult,
22
+ RssMultiSearchResult,
23
+ YoutubeVideosMultiSearchResult,
24
+ )
25
+ from ..models.geo_sort_order import GeoSortOrder
26
+ from ..models.multi_search_result_competitions import CompetitionsMultiSearchResult
27
+ from ..models.multi_search_result_engagements import EngagementsMultiSearchResult
28
+ from ..models.multi_search_result_formations import FormationsMultiSearchResult
29
+ from ..models.multi_search_result_organismes import OrganismesMultiSearchResult
30
+ from ..models.multi_search_result_pratiques import PratiquesMultiSearchResult
31
+ from ..models.multi_search_result_rencontres import RencontresMultiSearchResult
32
+ from ..models.multi_search_result_salles import SallesMultiSearchResult
33
+ from ..models.multi_search_result_terrains import TerrainsMultiSearchResult
34
+ from ..models.multi_search_result_tournois import TournoisMultiSearchResult
35
+ from ..models.organismes_multi_search_query import OrganismesMultiSearchQuery
36
+ from ..models.pratiques_multi_search_query import PratiquesMultiSearchQuery
37
+ from ..models.rencontres_multi_search_query import RencontresMultiSearchQuery
38
+ from ..models.salles_multi_search_query import SallesMultiSearchQuery
39
+ from ..models.terrains_multi_search_query import TerrainsMultiSearchQuery
40
+ from ..models.tournois_multi_search_query import TournoisMultiSearchQuery
41
+
42
+
43
+ class MeilisearchFFBBClient(MeilisearchClientExtension):
44
+ def __init__(
45
+ self,
46
+ bearer_token: str,
47
+ url: str = MEILISEARCH_BASE_URL,
48
+ debug: bool = False,
49
+ cached_session: Client | None = None,
50
+ *,
51
+ async_cached_session: httpx.AsyncClient | None = None,
52
+ ):
53
+ super().__init__(
54
+ bearer_token,
55
+ url,
56
+ debug,
57
+ cached_session,
58
+ async_cached_session=async_cached_session,
59
+ )
60
+
61
+ def search_multiple_organismes(
62
+ self,
63
+ names: list[str | None] | None = None,
64
+ filter: list[str] | None = None,
65
+ sort: list[str] | None = None,
66
+ limit: int | None = 10,
67
+ cached_session: Client | None = None,
68
+ ) -> list[OrganismesMultiSearchResult] | None:
69
+ if not names:
70
+ return None
71
+
72
+ queries = [
73
+ OrganismesMultiSearchQuery(name, limit=limit, filter=filter, sort=sort)
74
+ for name in names
75
+ ]
76
+ results = self.recursive_multi_search(queries, cached_session)
77
+
78
+ return (
79
+ cast(list[OrganismesMultiSearchResult], results.results)
80
+ if results
81
+ else None
82
+ )
83
+
84
+ def search_organismes(
85
+ self,
86
+ name: str | None = None,
87
+ filter: list[str] | None = None,
88
+ sort: list[str] | None = None,
89
+ limit: int | None = 10,
90
+ cached_session: Client | None = None,
91
+ ) -> OrganismesMultiSearchResult | None:
92
+ results = self.search_multiple_organismes(
93
+ [name],
94
+ filter=filter,
95
+ sort=sort,
96
+ limit=limit,
97
+ cached_session=cached_session,
98
+ )
99
+ return results[0] if results else None
100
+
101
+ def search_organismes_by_geo(
102
+ self,
103
+ lat: float,
104
+ lng: float,
105
+ radius_km: float = 10.0,
106
+ q: str = "",
107
+ limit: int | None = 20,
108
+ geo_sort: GeoSortOrder = GeoSortOrder.NEAREST_FIRST,
109
+ cached_session: Client | None = None,
110
+ ) -> OrganismesMultiSearchResult | None:
111
+ filter_str = f"_geoRadius({lat}, {lng}, {int(radius_km * 1000)})"
112
+ sort = [f"_geoPoint({lat}, {lng}):{geo_sort.value}"]
113
+ return self.search_organismes(
114
+ name=q,
115
+ filter=[filter_str],
116
+ sort=sort,
117
+ limit=limit,
118
+ cached_session=cached_session,
119
+ )
120
+
121
+ def search_organismes_by_city(
122
+ self,
123
+ city_name: str,
124
+ q: str = "",
125
+ limit: int = 200,
126
+ cached_session: Client | None = None,
127
+ ) -> OrganismesMultiSearchResult | None:
128
+ filter_str = f'commune = "{city_name}"'
129
+ return self.search_organismes(
130
+ name=q, filter=[filter_str], limit=limit, cached_session=cached_session
131
+ )
132
+
133
+ def search_multiple_rencontres(
134
+ self,
135
+ names: list[str | None] | None = None,
136
+ filter: list[str] | None = None,
137
+ sort: list[str] | None = None,
138
+ limit: int | None = 10,
139
+ cached_session: Client | None = None,
140
+ ) -> list[RencontresMultiSearchResult] | None:
141
+ if not names:
142
+ return None
143
+
144
+ queries = [
145
+ RencontresMultiSearchQuery(name, limit=limit, filter=filter, sort=sort)
146
+ for name in names
147
+ ]
148
+ results = self.recursive_multi_search(queries, cached_session)
149
+
150
+ return (
151
+ cast(list[RencontresMultiSearchResult], results.results)
152
+ if results
153
+ else None
154
+ )
155
+
156
+ def search_rencontres(
157
+ self,
158
+ name: str | None = None,
159
+ filter: list[str] | None = None,
160
+ sort: list[str] | None = None,
161
+ limit: int | None = 10,
162
+ cached_session: Client | None = None,
163
+ ) -> RencontresMultiSearchResult | None:
164
+ results = self.search_multiple_rencontres(
165
+ [name],
166
+ filter=filter,
167
+ sort=sort,
168
+ limit=limit,
169
+ cached_session=cached_session,
170
+ )
171
+ return results[0] if results else None
172
+
173
+ def search_multiple_terrains(
174
+ self,
175
+ names: list[str | None] | None = None,
176
+ filter: list[str] | None = None,
177
+ sort: list[str] | None = None,
178
+ limit: int | None = 10,
179
+ cached_session: Client | None = None,
180
+ ) -> list[TerrainsMultiSearchResult] | None:
181
+ if not names:
182
+ return None
183
+
184
+ queries = [
185
+ TerrainsMultiSearchQuery(name, limit=limit, filter=filter, sort=sort)
186
+ for name in names
187
+ ]
188
+ results = self.recursive_multi_search(queries, cached_session)
189
+
190
+ return (
191
+ cast(list[TerrainsMultiSearchResult], results.results) if results else None
192
+ )
193
+
194
+ def search_terrains(
195
+ self,
196
+ name: str | None = None,
197
+ filter: list[str] | None = None,
198
+ sort: list[str] | None = None,
199
+ limit: int | None = 10,
200
+ cached_session: Client | None = None,
201
+ ) -> TerrainsMultiSearchResult | None:
202
+ results = self.search_multiple_terrains(
203
+ [name],
204
+ filter=filter,
205
+ sort=sort,
206
+ limit=limit,
207
+ cached_session=cached_session,
208
+ )
209
+ return results[0] if results else None
210
+
211
+ def search_multiple_competitions(
212
+ self,
213
+ names: list[str | None] | None = None,
214
+ filter: list[str] | None = None,
215
+ sort: list[str] | None = None,
216
+ limit: int | None = 10,
217
+ cached_session: Client | None = None,
218
+ ) -> list[CompetitionsMultiSearchResult] | None:
219
+ if not names:
220
+ return None
221
+
222
+ queries = [
223
+ CompetitionsMultiSearchQuery(name, limit=limit, filter=filter, sort=sort)
224
+ for name in names
225
+ ]
226
+ results = self.recursive_multi_search(queries, cached_session)
227
+
228
+ return (
229
+ cast(list[CompetitionsMultiSearchResult], results.results)
230
+ if results
231
+ else None
232
+ )
233
+
234
+ def search_competitions(
235
+ self,
236
+ name: str | None = None,
237
+ filter: list[str] | None = None,
238
+ sort: list[str] | None = None,
239
+ limit: int | None = 10,
240
+ cached_session: Client | None = None,
241
+ ) -> CompetitionsMultiSearchResult | None:
242
+ results = self.search_multiple_competitions(
243
+ [name],
244
+ filter=filter,
245
+ sort=sort,
246
+ limit=limit,
247
+ cached_session=cached_session,
248
+ )
249
+ return results[0] if results else None
250
+
251
+ def search_multiple_salles(
252
+ self,
253
+ names: list[str | None] | None = None,
254
+ filter: list[str] | None = None,
255
+ sort: list[str] | None = None,
256
+ limit: int | None = 10,
257
+ cached_session: Client | None = None,
258
+ ) -> list[SallesMultiSearchResult] | None:
259
+ if not names:
260
+ return None
261
+
262
+ queries = [
263
+ SallesMultiSearchQuery(name, limit=limit, filter=filter, sort=sort)
264
+ for name in names
265
+ ]
266
+ results = self.recursive_multi_search(queries, cached_session)
267
+
268
+ return cast(list[SallesMultiSearchResult], results.results) if results else None
269
+
270
+ def search_salles(
271
+ self,
272
+ name: str | None = None,
273
+ filter: list[str] | None = None,
274
+ sort: list[str] | None = None,
275
+ limit: int | None = 10,
276
+ cached_session: Client | None = None,
277
+ ) -> SallesMultiSearchResult | None:
278
+ results = self.search_multiple_salles(
279
+ [name],
280
+ filter=filter,
281
+ sort=sort,
282
+ limit=limit,
283
+ cached_session=cached_session,
284
+ )
285
+ return results[0] if results else None
286
+
287
+ def search_salles_by_geo(
288
+ self,
289
+ lat: float,
290
+ lng: float,
291
+ radius_km: float = 10.0,
292
+ q: str = "",
293
+ limit: int | None = 20,
294
+ geo_sort: GeoSortOrder = GeoSortOrder.NEAREST_FIRST,
295
+ cached_session: Client | None = None,
296
+ ) -> SallesMultiSearchResult | None:
297
+ filter_str = f"_geoRadius({lat}, {lng}, {int(radius_km * 1000)})"
298
+ sort = [f"_geoPoint({lat}, {lng}):{geo_sort.value}"]
299
+ return self.search_salles(
300
+ name=q,
301
+ filter=[filter_str],
302
+ sort=sort,
303
+ limit=limit,
304
+ cached_session=cached_session,
305
+ )
306
+
307
+ def search_multiple_tournois(
308
+ self,
309
+ names: list[str | None] | None = None,
310
+ filter: list[str] | None = None,
311
+ sort: list[str] | None = None,
312
+ limit: int | None = 10,
313
+ cached_session: Client | None = None,
314
+ ) -> list[TournoisMultiSearchResult] | None:
315
+ if not names:
316
+ return None
317
+
318
+ queries = [
319
+ TournoisMultiSearchQuery(name, limit=limit, filter=filter, sort=sort)
320
+ for name in names
321
+ ]
322
+ results = self.recursive_multi_search(queries, cached_session)
323
+
324
+ return (
325
+ cast(list[TournoisMultiSearchResult], results.results) if results else None
326
+ )
327
+
328
+ def search_tournois(
329
+ self,
330
+ name: str | None = None,
331
+ filter: list[str] | None = None,
332
+ sort: list[str] | None = None,
333
+ limit: int | None = 10,
334
+ cached_session: Client | None = None,
335
+ ) -> TournoisMultiSearchResult | None:
336
+ results = self.search_multiple_tournois(
337
+ [name],
338
+ filter=filter,
339
+ sort=sort,
340
+ limit=limit,
341
+ cached_session=cached_session,
342
+ )
343
+ return results[0] if results else None
344
+
345
+ def search_multiple_pratiques(
346
+ self,
347
+ names: list[str | None] | None = None,
348
+ filter: list[str] | None = None,
349
+ sort: list[str] | None = None,
350
+ limit: int | None = 10,
351
+ cached_session: Client | None = None,
352
+ ) -> list[PratiquesMultiSearchResult] | None:
353
+ if not names:
354
+ return None
355
+
356
+ queries = [
357
+ PratiquesMultiSearchQuery(name, limit=limit, filter=filter, sort=sort)
358
+ for name in names
359
+ ]
360
+ results = self.recursive_multi_search(queries, cached_session)
361
+
362
+ return (
363
+ cast(list[PratiquesMultiSearchResult], results.results) if results else None
364
+ )
365
+
366
+ def search_pratiques(
367
+ self,
368
+ name: str | None = None,
369
+ filter: list[str] | None = None,
370
+ sort: list[str] | None = None,
371
+ limit: int | None = 10,
372
+ cached_session: Client | None = None,
373
+ ) -> PratiquesMultiSearchResult | None:
374
+ results = self.search_multiple_pratiques(
375
+ [name],
376
+ filter=filter,
377
+ sort=sort,
378
+ limit=limit,
379
+ cached_session=cached_session,
380
+ )
381
+ return results[0] if results else None
382
+
383
+ def search_multiple_engagements(
384
+ self,
385
+ names: list[str | None] | None = None,
386
+ filter: list[str] | None = None,
387
+ sort: list[str] | None = None,
388
+ limit: int | None = 10,
389
+ cached_session: Client | None = None,
390
+ ) -> list[EngagementsMultiSearchResult] | None:
391
+ if not names:
392
+ return None
393
+
394
+ queries = [
395
+ EngagementsMultiSearchQuery(name, limit=limit, filter=filter, sort=sort)
396
+ for name in names
397
+ ]
398
+ results = self.recursive_multi_search(queries, cached_session)
399
+
400
+ return (
401
+ cast(list[EngagementsMultiSearchResult], results.results)
402
+ if results
403
+ else None
404
+ )
405
+
406
+ def search_engagements(
407
+ self,
408
+ name: str | None = None,
409
+ filter: list[str] | None = None,
410
+ sort: list[str] | None = None,
411
+ limit: int | None = 10,
412
+ cached_session: Client | None = None,
413
+ ) -> EngagementsMultiSearchResult | None:
414
+ results = self.search_multiple_engagements(
415
+ [name],
416
+ filter=filter,
417
+ sort=sort,
418
+ limit=limit,
419
+ cached_session=cached_session,
420
+ )
421
+ return results[0] if results else None
422
+
423
+ def search_engagements_by_geo(
424
+ self,
425
+ lat: float,
426
+ lng: float,
427
+ radius_km: float = 10.0,
428
+ q: str = "",
429
+ limit: int | None = 20,
430
+ geo_sort: GeoSortOrder = GeoSortOrder.NEAREST_FIRST,
431
+ cached_session: Client | None = None,
432
+ ) -> EngagementsMultiSearchResult | None:
433
+ filter_str = f"_geoRadius({lat}, {lng}, {int(radius_km * 1000)})"
434
+ sort = [f"_geoPoint({lat}, {lng}):{geo_sort.value}"]
435
+ return self.search_engagements(
436
+ name=q,
437
+ filter=[filter_str],
438
+ sort=sort,
439
+ limit=limit,
440
+ cached_session=cached_session,
441
+ )
442
+
443
+ def search_engagements_filtered(
444
+ self,
445
+ lat: float,
446
+ lng: float,
447
+ radius_km: float = 10.0,
448
+ q: str = "",
449
+ limit: int | None = 5000,
450
+ sexes: list[str] | None = None,
451
+ niveau_codes: list[str] | None = None,
452
+ cached_session: Client | None = None,
453
+ ) -> EngagementsMultiSearchResult | None:
454
+ filters: list[str] = [f"_geoRadius({lat}, {lng}, {int(radius_km * 1000)})"]
455
+ if sexes:
456
+ filters.append(" OR ".join(f'sexe = "{s}"' for s in sexes))
457
+ if niveau_codes:
458
+ filters.append(" OR ".join(f'niveau.code = "{n}"' for n in niveau_codes))
459
+ return self.search_engagements(
460
+ name=q, filter=filters, limit=limit, cached_session=cached_session
461
+ )
462
+
463
+ def search_multiple_formations(
464
+ self,
465
+ names: list[str | None] | None = None,
466
+ filter: list[str] | None = None,
467
+ sort: list[str] | None = None,
468
+ limit: int | None = 10,
469
+ cached_session: Client | None = None,
470
+ ) -> list[FormationsMultiSearchResult] | None:
471
+ if not names:
472
+ return None
473
+
474
+ queries = [
475
+ FormationsMultiSearchQuery(name, limit=limit, filter=filter, sort=sort)
476
+ for name in names
477
+ ]
478
+ results = self.recursive_multi_search(queries, cached_session)
479
+
480
+ return (
481
+ cast(list[FormationsMultiSearchResult], results.results)
482
+ if results
483
+ else None
484
+ )
485
+
486
+ def search_formations(
487
+ self,
488
+ name: str | None = None,
489
+ filter: list[str] | None = None,
490
+ sort: list[str] | None = None,
491
+ limit: int | None = 10,
492
+ cached_session: Client | None = None,
493
+ ) -> FormationsMultiSearchResult | None:
494
+ results = self.search_multiple_formations(
495
+ [name],
496
+ filter=filter,
497
+ sort=sort,
498
+ limit=limit,
499
+ cached_session=cached_session,
500
+ )
501
+ return results[0] if results else None
502
+
503
+ def search_multiple_news(
504
+ self,
505
+ names: list[str | None] | None = None,
506
+ filter: list[str] | None = None,
507
+ sort: list[str] | None = None,
508
+ limit: int | None = 10,
509
+ cached_session: Client | None = None,
510
+ ) -> list[NewsMultiSearchResult] | None:
511
+ if not names:
512
+ return None
513
+
514
+ queries = [
515
+ NewsMultiSearchQuery(name, limit=limit, filter=filter, sort=sort)
516
+ for name in names
517
+ ]
518
+ results = self.recursive_multi_search(queries, cached_session)
519
+ return cast(list[NewsMultiSearchResult], results.results) if results else None
520
+
521
+ def search_news(
522
+ self,
523
+ name: str | None = None,
524
+ filter: list[str] | None = None,
525
+ sort: list[str] | None = None,
526
+ limit: int | None = 10,
527
+ cached_session: Client | None = None,
528
+ ) -> NewsMultiSearchResult | None:
529
+ results = self.search_multiple_news(
530
+ [name],
531
+ filter=filter,
532
+ sort=sort,
533
+ limit=limit,
534
+ cached_session=cached_session,
535
+ )
536
+ return results[0] if results else None
537
+
538
+ def search_multiple_youtube_videos(
539
+ self,
540
+ names: list[str | None] | None = None,
541
+ filter: list[str] | None = None,
542
+ sort: list[str] | None = None,
543
+ limit: int | None = 10,
544
+ cached_session: Client | None = None,
545
+ ) -> list[YoutubeVideosMultiSearchResult] | None:
546
+ if not names:
547
+ return None
548
+
549
+ queries = [
550
+ YoutubeVideosMultiSearchQuery(name, limit=limit, filter=filter, sort=sort)
551
+ for name in names
552
+ ]
553
+ results = self.recursive_multi_search(queries, cached_session)
554
+ return (
555
+ cast(list[YoutubeVideosMultiSearchResult], results.results)
556
+ if results
557
+ else None
558
+ )
559
+
560
+ def search_youtube_videos(
561
+ self,
562
+ name: str | None = None,
563
+ filter: list[str] | None = None,
564
+ sort: list[str] | None = None,
565
+ limit: int | None = 10,
566
+ cached_session: Client | None = None,
567
+ ) -> YoutubeVideosMultiSearchResult | None:
568
+ results = self.search_multiple_youtube_videos(
569
+ [name],
570
+ filter=filter,
571
+ sort=sort,
572
+ limit=limit,
573
+ cached_session=cached_session,
574
+ )
575
+ return results[0] if results else None
576
+
577
+ def search_multiple_rss(
578
+ self,
579
+ names: list[str | None] | None = None,
580
+ filter: list[str] | None = None,
581
+ sort: list[str] | None = None,
582
+ limit: int | None = 10,
583
+ cached_session: Client | None = None,
584
+ ) -> list[RssMultiSearchResult] | None:
585
+ if not names:
586
+ return None
587
+
588
+ queries = [
589
+ RssMultiSearchQuery(name, limit=limit, filter=filter, sort=sort)
590
+ for name in names
591
+ ]
592
+ results = self.recursive_multi_search(queries, cached_session)
593
+ return cast(list[RssMultiSearchResult], results.results) if results else None
594
+
595
+ def search_rss(
596
+ self,
597
+ name: str | None = None,
598
+ filter: list[str] | None = None,
599
+ sort: list[str] | None = None,
600
+ limit: int | None = 10,
601
+ cached_session: Client | None = None,
602
+ ) -> RssMultiSearchResult | None:
603
+ results = self.search_multiple_rss(
604
+ [name],
605
+ filter=filter,
606
+ sort=sort,
607
+ limit=limit,
608
+ cached_session=cached_session,
609
+ )
610
+ return results[0] if results else None
611
+
612
+ def search_multiple_galeries(
613
+ self,
614
+ names: list[str | None] | None = None,
615
+ filter: list[str] | None = None,
616
+ sort: list[str] | None = None,
617
+ limit: int | None = 10,
618
+ cached_session: Client | None = None,
619
+ ) -> list[GaleriesMultiSearchResult] | None:
620
+ if not names:
621
+ return None
622
+
623
+ queries = [
624
+ GaleriesMultiSearchQuery(name, limit=limit, filter=filter, sort=sort)
625
+ for name in names
626
+ ]
627
+ results = self.recursive_multi_search(queries, cached_session)
628
+ return (
629
+ cast(list[GaleriesMultiSearchResult], results.results) if results else None
630
+ )
631
+
632
+ def search_galeries(
633
+ self,
634
+ name: str | None = None,
635
+ filter: list[str] | None = None,
636
+ sort: list[str] | None = None,
637
+ limit: int | None = 10,
638
+ cached_session: Client | None = None,
639
+ ) -> GaleriesMultiSearchResult | None:
640
+ results = self.search_multiple_galeries(
641
+ [name],
642
+ filter=filter,
643
+ sort=sort,
644
+ limit=limit,
645
+ cached_session=cached_session,
646
+ )
647
+ return results[0] if results else None