Optimize cache -> smaller number of requests by collecting more information

This commit is contained in:
Lea 2024-09-20 17:57:49 +02:00
parent 17d203575c
commit 66abe151b0
2 changed files with 45 additions and 3 deletions

View File

@ -63,6 +63,15 @@ class APIHandler:
def get_list_of_doctors(self, lat, lon, req_val_base64, therapy_types, therapy_age, therapy_setting, def get_list_of_doctors(self, lat, lon, req_val_base64, therapy_types, therapy_age, therapy_setting,
amount_of_weeks) -> ArztPraxisDatas: amount_of_weeks) -> ArztPraxisDatas:
# Use the selected therapy types in case of "Verhaltenstherapie" -> most data used for it, might overload the
# request, so other therapy types are missing
if "V" in therapy_types:
selected_codes = therapy_types
# Collect all three other therapy types in case of missing V
else:
selected_codes = ["A", "S", "T"]
# Data object as built by the original website, some fields might not be plausible or known (since there is no # Data object as built by the original website, some fields might not be plausible or known (since there is no
# API documentation itself available # API documentation itself available
self.json_data = { self.json_data = {
@ -81,7 +90,7 @@ class APIHandler:
{ {
"title": "Psychotherapie: Verfahren", "title": "Psychotherapie: Verfahren",
"fieldName": "ptv", "fieldName": "ptv",
"selectedCodes": therapy_types, "selectedCodes": selected_codes
}, },
{ {
"title": "Psychotherapie: Altersgruppe", "title": "Psychotherapie: Altersgruppe",
@ -115,6 +124,9 @@ class APIHandler:
self.get_list_of_doctors_from_api(lat, lon, req_val_base64, therapy_types, therapy_age, therapy_setting) self.get_list_of_doctors_from_api(lat, lon, req_val_base64, therapy_types, therapy_age, therapy_setting)
self.set_current_doctor_information_data_in_cache() self.set_current_doctor_information_data_in_cache()
# Filter for the relevant therapy times before processing
self.filter_for_therapy_types(therapy_types)
def get_list_of_doctors_from_api(self, lat, lon, req_val_base64, therapy_types, therapy_age, def get_list_of_doctors_from_api(self, lat, lon, req_val_base64, therapy_types, therapy_age,
therapy_setting) -> ArztPraxisDatas: therapy_setting) -> ArztPraxisDatas:
""" """
@ -140,8 +152,6 @@ class APIHandler:
"req-val": req_val_base64, "req-val": req_val_base64,
} }
response = requests.post(api_path, headers=headers, json=self.json_data) response = requests.post(api_path, headers=headers, json=self.json_data)
# Check for HTTP errors # Check for HTTP errors
response.raise_for_status() response.raise_for_status()
@ -163,6 +173,37 @@ class APIHandler:
current_date = datetime.now() current_date = datetime.now()
self._cache[str(self.json_data)] = {"timestamp": current_date, "data": self.phone_times} self._cache[str(self.json_data)] = {"timestamp": current_date, "data": self.phone_times}
def filter_for_therapy_types(self, therapy_types):
"""
The idea is to get as much data as possible from the API at once to minimize the number of API calls.
For some cases, more data than actually necessary is cached and this is a filter for it.
:param therapy_types: Desired therapy types
:return:
"""
# Mapping of the selected codes to the actual therapy type
mapping = {
"V": "Verhaltenstherapie",
"T": "Tiefenpsychologisch fundierte Psychotherapie",
"A": "Analytische Psychotherapie",
"S": "Systemische Therapie"
}
# Store relevant phone times
relevant_phone_times = []
for data in self.phone_times.arztPraxisDatas:
# Relevant therapy type stored in psy
settings = data.psy
# Multiple therapy types might be available
for setting in settings:
# Check if the therapy type which is desired is available
if any(mapping[code] in setting for code in therapy_types):
relevant_phone_times.append(data)
# Update with relevant phone times
self.phone_times.arztPraxisDatas = relevant_phone_times
def get_general_doctor_information(self) -> List[DoctorInformation]: def get_general_doctor_information(self) -> List[DoctorInformation]:
""" """
Transform and filter data to more usable format: Check for phone times and collect general doctor information Transform and filter data to more usable format: Check for phone times and collect general doctor information

View File

@ -45,6 +45,7 @@ class ArztPraxisData(BaseModel):
keineSprechzeiten: bool keineSprechzeiten: bool
ag: List[Ag] ag: List[Ag]
tsz: List[Tsz] tsz: List[Tsz]
psy: List[str]
class ArztPraxisDatas(BaseModel): class ArztPraxisDatas(BaseModel):