Optimize cache -> smaller number of requests by collecting more information
This commit is contained in:
parent
17d203575c
commit
66abe151b0
@ -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
|
||||||
|
@ -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):
|
||||||
|
Loading…
Reference in New Issue
Block a user