backend/feature/add-description #63
							
								
								
									
										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