added descriptions
This commit is contained in:
		
							
								
								
									
										10062
									
								
								backend/landmarks.json
									
									
									
									
									
								
							
							
						
						
									
										10062
									
								
								backend/landmarks.json
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @@ -97,10 +97,14 @@ def new_trip(preferences: Preferences, | |||||||
|     if len(landmarks) == 0 : |     if len(landmarks) == 0 : | ||||||
|         raise HTTPException(status_code=500, detail="No landmarks were found.") |         raise HTTPException(status_code=500, detail="No landmarks were found.") | ||||||
|  |  | ||||||
|     # store landmarks in json file for debug |  | ||||||
|  |  | ||||||
|  |     ###################### store landmarks in json file for debug ###################### | ||||||
|     landmarks_list = [jsonable_encoder(item) for item in landmarks]         |     landmarks_list = [jsonable_encoder(item) for item in landmarks]         | ||||||
|     with open('landmarks.json', 'w+') as file: |     with open('landmarks.json', 'w+') as file: | ||||||
|         json.dump(landmarks_list, file, indent=4) |         json.dump(landmarks_list, file, indent=4) | ||||||
|  |     #################################################################################### | ||||||
|  |  | ||||||
|  |  | ||||||
|     # insert start and finish to the landmarks list |     # insert start and finish to the landmarks list | ||||||
|     landmarks_short.insert(0, start_landmark) |     landmarks_short.insert(0, start_landmark) | ||||||
|   | |||||||
| @@ -50,6 +50,7 @@ class Landmark(BaseModel) : | |||||||
|     image_url : Optional[str] = None |     image_url : Optional[str] = None | ||||||
|     website_url : Optional[str] = None |     website_url : Optional[str] = None | ||||||
|     wiki_url : Optional[str] = None |     wiki_url : Optional[str] = None | ||||||
|  |     keywords: Optional[dict] = {} | ||||||
|     description : Optional[str] = None |     description : Optional[str] = None | ||||||
|     duration : Optional[int] = 5 |     duration : Optional[int] = 5 | ||||||
|     name_en : Optional[str] = None |     name_en : Optional[str] = None | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ def client(): | |||||||
|     """Client used to call the app.""" |     """Client used to call the app.""" | ||||||
|     return TestClient(app) |     return TestClient(app) | ||||||
|  |  | ||||||
| ''' |  | ||||||
| def test_turckheim(client, request):    # pylint: disable=redefined-outer-name | def test_turckheim(client, request):    # pylint: disable=redefined-outer-name | ||||||
|     """ |     """ | ||||||
|     Test n°1 : Custom test in Turckheim to ensure small villages are also supported. |     Test n°1 : Custom test in Turckheim to ensure small villages are also supported. | ||||||
| @@ -219,7 +219,7 @@ def test_zurich(client, request) :   # pylint: disable=redefined-outer-name | |||||||
|     assert duration_minutes*0.8 < result['total_time'], f"Trip too short: {result['total_time']} instead of {duration_minutes}" |     assert duration_minutes*0.8 < result['total_time'], f"Trip too short: {result['total_time']} instead of {duration_minutes}" | ||||||
|     assert duration_minutes*1.2 > result['total_time'], f"Trip too long: {result['total_time']} instead of {duration_minutes}" |     assert duration_minutes*1.2 > result['total_time'], f"Trip too long: {result['total_time']} instead of {duration_minutes}" | ||||||
|  |  | ||||||
| ''' |  | ||||||
| def test_paris(client, request) :   # pylint: disable=redefined-outer-name | def test_paris(client, request) :   # pylint: disable=redefined-outer-name | ||||||
|     """ |     """ | ||||||
|     Test n°6 : Custom test in Paris (les Halles) centre to ensure proper decision making in crowded area. |     Test n°6 : Custom test in Paris (les Halles) centre to ensure proper decision making in crowded area. | ||||||
| @@ -259,7 +259,7 @@ def test_paris(client, request) :   # pylint: disable=redefined-outer-name | |||||||
|     assert comp_time < 30, f"Computation time exceeded 30 seconds: {comp_time:.2f} seconds" |     assert comp_time < 30, f"Computation time exceeded 30 seconds: {comp_time:.2f} seconds" | ||||||
|     assert duration_minutes*0.8 < result['total_time'], f"Trip too short: {result['total_time']} instead of {duration_minutes}" |     assert duration_minutes*0.8 < result['total_time'], f"Trip too short: {result['total_time']} instead of {duration_minutes}" | ||||||
|     assert duration_minutes*1.2 > result['total_time'], f"Trip too long: {result['total_time']} instead of {duration_minutes}" |     assert duration_minutes*1.2 > result['total_time'], f"Trip too long: {result['total_time']} instead of {duration_minutes}" | ||||||
| ''' |  | ||||||
|  |  | ||||||
| def test_new_york(client, request) :   # pylint: disable=redefined-outer-name | def test_new_york(client, request) :   # pylint: disable=redefined-outer-name | ||||||
|     """ |     """ | ||||||
| @@ -342,4 +342,4 @@ def test_shopping(client, request) :   # pylint: disable=redefined-outer-name | |||||||
|     assert duration_minutes*0.8 < result['total_time'], f"Trip too short: {result['total_time']} instead of {duration_minutes}" |     assert duration_minutes*0.8 < result['total_time'], f"Trip too short: {result['total_time']} instead of {duration_minutes}" | ||||||
|     assert duration_minutes*1.2 > result['total_time'], f"Trip too long: {result['total_time']} instead of {duration_minutes}" |     assert duration_minutes*1.2 > result['total_time'], f"Trip too long: {result['total_time']} instead of {duration_minutes}" | ||||||
|      |      | ||||||
|     ''' |      | ||||||
| @@ -246,8 +246,6 @@ class LandmarkManager: | |||||||
|                                 attractiveness=0, |                                 attractiveness=0, | ||||||
|                                 n_tags=len(tags)) |                                 n_tags=len(tags)) | ||||||
|  |  | ||||||
|             # self.logger.debug('added landmark.') |  | ||||||
|  |  | ||||||
|             # Browse through tags to add information to landmark. |             # Browse through tags to add information to landmark. | ||||||
|             for key, value in tags.items(): |             for key, value in tags.items(): | ||||||
|  |  | ||||||
| @@ -277,6 +275,7 @@ class LandmarkManager: | |||||||
|                 if 'building:' in key or 'pay' in key : |                 if 'building:' in key or 'pay' in key : | ||||||
|                     landmark.n_tags -= 1 |                     landmark.n_tags -= 1 | ||||||
|  |  | ||||||
|  |  | ||||||
|                 # Set the duration. |                 # Set the duration. | ||||||
|                 if value in ['museum', 'aquarium', 'planetarium'] : |                 if value in ['museum', 'aquarium', 'planetarium'] : | ||||||
|                     landmark.duration = 60 |                     landmark.duration = 60 | ||||||
| @@ -287,14 +286,104 @@ class LandmarkManager: | |||||||
|                     landmark.is_place_of_worship = False |                     landmark.is_place_of_worship = False | ||||||
|                     landmark.duration = 10 |                     landmark.duration = 10 | ||||||
|  |  | ||||||
|             else: |             landmark.description, landmark.keywords = self.description_and_keywords(tags) | ||||||
|             self.set_landmark_score(landmark, landmarktype, preference_level) |             self.set_landmark_score(landmark, landmarktype, preference_level) | ||||||
|             landmarks.append(landmark) |             landmarks.append(landmark) | ||||||
|  |  | ||||||
|             continue |             continue | ||||||
|  |  | ||||||
|  |  | ||||||
|         return landmarks |         return landmarks | ||||||
|      |      | ||||||
|  |      | ||||||
|  |     def description_and_keywords(self, tags: dict): | ||||||
|  |         # Extract relevant fields | ||||||
|  |         name = tags.get('name') | ||||||
|  |         importance = tags.get('importance', None) | ||||||
|  |         n_visitors = tags.get('tourism:visitors', None) | ||||||
|  |         height = tags.get('height') | ||||||
|  |         place_type = self.get_place_type(tags) | ||||||
|  |         date = self.get_date(tags) | ||||||
|  |  | ||||||
|  |         if place_type is None : | ||||||
|  |             return None, None | ||||||
|  |  | ||||||
|  |         # Start the description. | ||||||
|  |         if importance is None : | ||||||
|  |             if len(tags.keys()) < 5 : | ||||||
|  |                 return None, None | ||||||
|  |             if len(tags.keys()) < 10 : | ||||||
|  |                 description = f"{name} is a well known {place_type}." | ||||||
|  |                  | ||||||
|  |             if len(tags.keys()) < 17 : | ||||||
|  |                 importance = 'national' | ||||||
|  |                 description = f"{name} is a {place_type} of national importance." | ||||||
|  |             else : | ||||||
|  |                 importance = 'international' | ||||||
|  |                 description = f"{name} is an internationally famous {place_type}." | ||||||
|  |         else : | ||||||
|  |             description = f"{name} is a {place_type} of {importance} importance." | ||||||
|  |  | ||||||
|  |         if height is not None and date is not None : | ||||||
|  |             description += f" This {place_type} was constructed in {date} and is ca. {height} meters high." | ||||||
|  |         elif height is not None : | ||||||
|  |             description += f" This {place_type} stands ca. {height} meters tall." | ||||||
|  |         elif date is not None:  | ||||||
|  |             description += f" It was constructed in {date}." | ||||||
|  |          | ||||||
|  |         # Format the visitor number | ||||||
|  |         if n_visitors is not None : | ||||||
|  |             n_visitors = int(n_visitors) | ||||||
|  |             if n_visitors > 1000 : | ||||||
|  |                 description += f" {name} welcomes {int(n_visitors/1000)} thousand visitors every year." | ||||||
|  |             if n_visitors > 1000000 : | ||||||
|  |                 description += f" {name} welcomes {round(n_visitors/1000000, 1)} millionvisitors every year." | ||||||
|  |  | ||||||
|  |         # Set the keywords. | ||||||
|  |         keywords = {"importance": importance, | ||||||
|  |                     "height": height, | ||||||
|  |                     "place_type": place_type, | ||||||
|  |                     "date": date} | ||||||
|  |  | ||||||
|  |         return description, keywords | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     def get_place_type(self, data): | ||||||
|  |         amenity = data.get('amenity', None) | ||||||
|  |         building = data.get('building', None) | ||||||
|  |         historic = data.get('historic', None) | ||||||
|  |  | ||||||
|  |         if historic and historic != "yes": | ||||||
|  |             return historic | ||||||
|  |         if building and building not in ["yes", "civic", "government", "apartments", "residential", "commericial", "industrial", "retail", "religious", "public", "service"]: | ||||||
|  |             return building | ||||||
|  |         if amenity: | ||||||
|  |             return amenity | ||||||
|  |  | ||||||
|  |         return None | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     def get_date(self, data): | ||||||
|  |         construction_date = data.get('construction_date', None) | ||||||
|  |         opening_date = data.get('opening_date', None) | ||||||
|  |         start_date = data.get('start_date', None) | ||||||
|  |         year_of_construction = data.get('year_of_construction', None) | ||||||
|  |  | ||||||
|  |         # Prioritize based on availability | ||||||
|  |         if construction_date: | ||||||
|  |             return construction_date | ||||||
|  |         if start_date: | ||||||
|  |             return start_date | ||||||
|  |         if year_of_construction: | ||||||
|  |             return year_of_construction | ||||||
|  |         if opening_date: | ||||||
|  |             return opening_date | ||||||
|  |  | ||||||
|  |         return None | ||||||
|  |  | ||||||
|  |      | ||||||
|  |  | ||||||
|  |  | ||||||
| def dict_to_selector_list(d: dict) -> list: | def dict_to_selector_list(d: dict) -> list: | ||||||
|     """ |     """ | ||||||
|     Convert a dictionary of key-value pairs to a list of Overpass query strings. |     Convert a dictionary of key-value pairs to a list of Overpass query strings. | ||||||
| @@ -315,3 +404,5 @@ def dict_to_selector_list(d: dict) -> list: | |||||||
|         else: |         else: | ||||||
|             return_list.append(f'{key}={value}') |             return_list.append(f'{key}={value}') | ||||||
|     return return_list |     return return_list | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user