ffbb-data-client 2.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ffbb_api_client_v3/__init__.py +25 -0
- ffbb_data_client/__init__.py +175 -0
- ffbb_data_client/clients/__init__.py +13 -0
- ffbb_data_client/clients/api_ffbb_app_client.py +2475 -0
- ffbb_data_client/clients/ffbb_data_client.py +2789 -0
- ffbb_data_client/clients/meilisearch_client.py +218 -0
- ffbb_data_client/clients/meilisearch_ffbb_client.py +647 -0
- ffbb_data_client/config.py +153 -0
- ffbb_data_client/data/__init__.py +25 -0
- ffbb_data_client/data/collections.json +1364 -0
- ffbb_data_client/data/endpoint_discovery.json +1875 -0
- ffbb_data_client/data/indexes.json +501 -0
- ffbb_data_client/data/openapi.json +35713 -0
- ffbb_data_client/data/openapi_full.json +37622 -0
- ffbb_data_client/helpers/__init__.py +27 -0
- ffbb_data_client/helpers/http_requests_helper.py +73 -0
- ffbb_data_client/helpers/http_requests_utils.py +502 -0
- ffbb_data_client/helpers/meilisearch_client_extension.py +153 -0
- ffbb_data_client/helpers/multi_search_query_helper.py +35 -0
- ffbb_data_client/models/__init__.py +241 -0
- ffbb_data_client/models/affiche.py +45 -0
- ffbb_data_client/models/cartographie.py +82 -0
- ffbb_data_client/models/categorie.py +55 -0
- ffbb_data_client/models/categorie_type.py +42 -0
- ffbb_data_client/models/clock.py +38 -0
- ffbb_data_client/models/club_contacts.py +77 -0
- ffbb_data_client/models/code.py +7 -0
- ffbb_data_client/models/commune.py +66 -0
- ffbb_data_client/models/competition_fields.py +309 -0
- ffbb_data_client/models/competition_id.py +116 -0
- ffbb_data_client/models/competition_id_categorie.py +31 -0
- ffbb_data_client/models/competition_id_sexe.py +31 -0
- ffbb_data_client/models/competition_id_type_competition.py +27 -0
- ffbb_data_client/models/competition_id_type_competition_generique.py +24 -0
- ffbb_data_client/models/competition_origine.py +69 -0
- ffbb_data_client/models/competition_origine_categorie.py +23 -0
- ffbb_data_client/models/competition_origine_type_competition.py +14 -0
- ffbb_data_client/models/competition_origine_type_competition_generique.py +24 -0
- ffbb_data_client/models/competition_type.py +6 -0
- ffbb_data_client/models/competitions_facet_distribution.py +65 -0
- ffbb_data_client/models/competitions_facet_stats.py +14 -0
- ffbb_data_client/models/competitions_hit.py +232 -0
- ffbb_data_client/models/competitions_multi_search_query.py +40 -0
- ffbb_data_client/models/competitions_query.py +11 -0
- ffbb_data_client/models/configuration_models.py +5 -0
- ffbb_data_client/models/contact_info.py +18 -0
- ffbb_data_client/models/content_multi_search_query.py +93 -0
- ffbb_data_client/models/coordonnees.py +27 -0
- ffbb_data_client/models/coordonnees_type.py +5 -0
- ffbb_data_client/models/document_flyer.py +205 -0
- ffbb_data_client/models/document_flyer_type.py +6 -0
- ffbb_data_client/models/engagement_contacts.py +97 -0
- ffbb_data_client/models/engagements_facet_distribution.py +59 -0
- ffbb_data_client/models/engagements_facet_stats.py +14 -0
- ffbb_data_client/models/engagements_hit.py +192 -0
- ffbb_data_client/models/engagements_multi_search_query.py +41 -0
- ffbb_data_client/models/etat.py +6 -0
- ffbb_data_client/models/external_competition_id.py +42 -0
- ffbb_data_client/models/external_id.py +72 -0
- ffbb_data_client/models/facet_distribution.py +13 -0
- ffbb_data_client/models/facet_stats.py +13 -0
- ffbb_data_client/models/field_set.py +10 -0
- ffbb_data_client/models/folder.py +35 -0
- ffbb_data_client/models/formation_session.py +60 -0
- ffbb_data_client/models/formations_facet_distribution.py +61 -0
- ffbb_data_client/models/formations_facet_stats.py +14 -0
- ffbb_data_client/models/formations_hit.py +277 -0
- ffbb_data_client/models/formations_multi_search_query.py +41 -0
- ffbb_data_client/models/game_stats_model.py +57 -0
- ffbb_data_client/models/game_stats_models.py +5 -0
- ffbb_data_client/models/generic_search.py +92 -0
- ffbb_data_client/models/geo.py +27 -0
- ffbb_data_client/models/geo_sort_order.py +6 -0
- ffbb_data_client/models/get_commune_response.py +18 -0
- ffbb_data_client/models/get_competition_response.py +523 -0
- ffbb_data_client/models/get_configuration_response.py +45 -0
- ffbb_data_client/models/get_engagement_response.py +23 -0
- ffbb_data_client/models/get_entraineur_response.py +18 -0
- ffbb_data_client/models/get_formation_response.py +28 -0
- ffbb_data_client/models/get_officiel_response.py +18 -0
- ffbb_data_client/models/get_organisme_response.py +476 -0
- ffbb_data_client/models/get_poule_response.py +68 -0
- ffbb_data_client/models/get_pratique_response.py +18 -0
- ffbb_data_client/models/get_rencontre_response.py +93 -0
- ffbb_data_client/models/get_saisons_response.py +56 -0
- ffbb_data_client/models/get_salle_response.py +20 -0
- ffbb_data_client/models/get_terrain_response.py +16 -0
- ffbb_data_client/models/get_tournoi_response.py +16 -0
- ffbb_data_client/models/gradient_color.py +27 -0
- ffbb_data_client/models/hit.py +16 -0
- ffbb_data_client/models/id_engagement_equipe.py +32 -0
- ffbb_data_client/models/id_organisme_equipe.py +51 -0
- ffbb_data_client/models/id_organisme_equipe1_logo.py +28 -0
- ffbb_data_client/models/id_poule.py +27 -0
- ffbb_data_client/models/jour.py +11 -0
- ffbb_data_client/models/label.py +15 -0
- ffbb_data_client/models/labellisation.py +30 -0
- ffbb_data_client/models/live.py +192 -0
- ffbb_data_client/models/lives.py +6 -0
- ffbb_data_client/models/logo.py +28 -0
- ffbb_data_client/models/multi_search_queries.py +24 -0
- ffbb_data_client/models/multi_search_query.py +96 -0
- ffbb_data_client/models/multi_search_result_competitions.py +14 -0
- ffbb_data_client/models/multi_search_result_engagements.py +14 -0
- ffbb_data_client/models/multi_search_result_formations.py +12 -0
- ffbb_data_client/models/multi_search_result_organismes.py +12 -0
- ffbb_data_client/models/multi_search_result_pratiques.py +12 -0
- ffbb_data_client/models/multi_search_result_rencontres.py +12 -0
- ffbb_data_client/models/multi_search_result_salles.py +12 -0
- ffbb_data_client/models/multi_search_result_terrains.py +12 -0
- ffbb_data_client/models/multi_search_result_tournois.py +12 -0
- ffbb_data_client/models/multi_search_results.py +103 -0
- ffbb_data_client/models/multi_search_results_class.py +96 -0
- ffbb_data_client/models/nature_sol.py +57 -0
- ffbb_data_client/models/niveau.py +10 -0
- ffbb_data_client/models/niveau_class.py +27 -0
- ffbb_data_client/models/niveau_extractor.py +214 -0
- ffbb_data_client/models/niveau_info.py +64 -0
- ffbb_data_client/models/niveau_models.py +14 -0
- ffbb_data_client/models/niveau_type.py +10 -0
- ffbb_data_client/models/objectif.py +7 -0
- ffbb_data_client/models/organisateur.py +197 -0
- ffbb_data_client/models/organisateur_type.py +6 -0
- ffbb_data_client/models/organisme_fields.py +327 -0
- ffbb_data_client/models/organisme_id_pere.py +177 -0
- ffbb_data_client/models/organismes_facet_distribution.py +46 -0
- ffbb_data_client/models/organismes_facet_stats.py +14 -0
- ffbb_data_client/models/organismes_hit.py +196 -0
- ffbb_data_client/models/organismes_multi_search_query.py +41 -0
- ffbb_data_client/models/organismes_query.py +8 -0
- ffbb_data_client/models/phase_code.py +23 -0
- ffbb_data_client/models/poule.py +35 -0
- ffbb_data_client/models/poule_fields.py +261 -0
- ffbb_data_client/models/poule_rencontre_item_model.py +69 -0
- ffbb_data_client/models/poules_models.py +6 -0
- ffbb_data_client/models/poules_query.py +9 -0
- ffbb_data_client/models/pratique.py +7 -0
- ffbb_data_client/models/pratiques_facet_distribution.py +29 -0
- ffbb_data_client/models/pratiques_facet_stats.py +14 -0
- ffbb_data_client/models/pratiques_hit.py +310 -0
- ffbb_data_client/models/pratiques_hit_type.py +9 -0
- ffbb_data_client/models/pratiques_multi_search_query.py +41 -0
- ffbb_data_client/models/pratiques_type_class.py +45 -0
- ffbb_data_client/models/publication_internet.py +6 -0
- ffbb_data_client/models/purple_logo.py +24 -0
- ffbb_data_client/models/query_fields_manager.py +75 -0
- ffbb_data_client/models/ranking_engagement.py +41 -0
- ffbb_data_client/models/rankings_models.py +6 -0
- ffbb_data_client/models/rencontres_engagement.py +23 -0
- ffbb_data_client/models/rencontres_facet_distribution.py +65 -0
- ffbb_data_client/models/rencontres_facet_stats.py +14 -0
- ffbb_data_client/models/rencontres_hit.py +271 -0
- ffbb_data_client/models/rencontres_multi_search_query.py +41 -0
- ffbb_data_client/models/saison.py +23 -0
- ffbb_data_client/models/saison_fields.py +36 -0
- ffbb_data_client/models/saisons_models.py +6 -0
- ffbb_data_client/models/saisons_query.py +9 -0
- ffbb_data_client/models/salle.py +56 -0
- ffbb_data_client/models/salles_facet_distribution.py +14 -0
- ffbb_data_client/models/salles_facet_stats.py +14 -0
- ffbb_data_client/models/salles_hit.py +153 -0
- ffbb_data_client/models/salles_multi_search_query.py +40 -0
- ffbb_data_client/models/sexe.py +9 -0
- ffbb_data_client/models/sexe_class.py +31 -0
- ffbb_data_client/models/source.py +5 -0
- ffbb_data_client/models/status.py +5 -0
- ffbb_data_client/models/team_engagement.py +56 -0
- ffbb_data_client/models/team_ranking.py +108 -0
- ffbb_data_client/models/terrains_categorie_championnat_3x3_libelle.py +5 -0
- ffbb_data_client/models/terrains_facet_distribution.py +41 -0
- ffbb_data_client/models/terrains_facet_stats.py +14 -0
- ffbb_data_client/models/terrains_hit.py +223 -0
- ffbb_data_client/models/terrains_multi_search_query.py +42 -0
- ffbb_data_client/models/terrains_name.py +5 -0
- ffbb_data_client/models/terrains_sexe_enum.py +7 -0
- ffbb_data_client/models/terrains_storage.py +5 -0
- ffbb_data_client/models/tournoi_type_class.py +35 -0
- ffbb_data_client/models/tournoi_type_enum.py +7 -0
- ffbb_data_client/models/tournoi_types_3x3.py +43 -0
- ffbb_data_client/models/tournoi_types_3x3_libelle.py +60 -0
- ffbb_data_client/models/tournoi_types_3x3_libelle_enum.py +10 -0
- ffbb_data_client/models/tournois_facet_distribution.py +41 -0
- ffbb_data_client/models/tournois_facet_stats.py +14 -0
- ffbb_data_client/models/tournois_hit.py +132 -0
- ffbb_data_client/models/tournois_hit_type.py +5 -0
- ffbb_data_client/models/tournois_libelle.py +7 -0
- ffbb_data_client/models/tournois_multi_search_query.py +40 -0
- ffbb_data_client/models/type_association.py +23 -0
- ffbb_data_client/models/type_association_libelle.py +30 -0
- ffbb_data_client/models/type_class.py +23 -0
- ffbb_data_client/models/type_competition.py +8 -0
- ffbb_data_client/models/type_competition_generique.py +31 -0
- ffbb_data_client/models/type_enum.py +7 -0
- ffbb_data_client/models/type_league.py +6 -0
- ffbb_data_client/py.typed +0 -0
- ffbb_data_client/utils/__init__.py +27 -0
- ffbb_data_client/utils/cache_manager.py +393 -0
- ffbb_data_client/utils/converter_utils.py +329 -0
- ffbb_data_client/utils/input_validation.py +360 -0
- ffbb_data_client/utils/retry_utils.py +478 -0
- ffbb_data_client/utils/secure_logging.py +153 -0
- ffbb_data_client/utils/token_manager.py +115 -0
- ffbb_data_client-2.0.0.dist-info/METADATA +339 -0
- ffbb_data_client-2.0.0.dist-info/RECORD +207 -0
- ffbb_data_client-2.0.0.dist-info/WHEEL +5 -0
- ffbb_data_client-2.0.0.dist-info/licenses/LICENSE.txt +201 -0
- ffbb_data_client-2.0.0.dist-info/top_level.txt +2 -0
|
@@ -0,0 +1,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,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,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,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
|