71 lines
		
	
	
		
			No EOL
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			No EOL
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """
 | |
| Event models for the OpenEventDatabase.
 | |
| """
 | |
| 
 | |
| import json
 | |
| from oedb.utils.logging import logger
 | |
| 
 | |
| class BaseEvent:
 | |
|     """
 | |
|     Base class for event resources.
 | |
|     Provides common methods for converting database rows to GeoJSON features.
 | |
|     """
 | |
|     
 | |
|     def row_to_feature(self, row, geom_only=False):
 | |
|         """
 | |
|         Convert a database row to a GeoJSON feature.
 | |
|         
 | |
|         Args:
 | |
|             row: The database row.
 | |
|             geom_only: Whether to return only the geometry and event ID.
 | |
|             
 | |
|         Returns:
 | |
|             dict: A GeoJSON feature.
 | |
|         """
 | |
|         logger.debug(f"Converting row to feature (geom_only={geom_only})")
 | |
|         
 | |
|         # Only return geometry and event id
 | |
|         if geom_only:
 | |
|             return {
 | |
|                 "type": "Feature",
 | |
|                 "geometry": json.loads(row['geometry']),
 | |
|                 "properties": {"id": row['events_id']}
 | |
|             }
 | |
| 
 | |
|         properties = dict(row['events_tags'])
 | |
|         properties.update({
 | |
|             'createdate': row['createdate'],
 | |
|             'lastupdate': row['lastupdate'],
 | |
|             "id": row['events_id']
 | |
|         })
 | |
|         
 | |
|         # Ensure what property is used instead of description
 | |
|         if 'description' in properties and 'what' not in properties:
 | |
|             properties['what'] = properties.pop('description')
 | |
|         if 'secret' in properties:  # hide secret in results
 | |
|             del properties['secret']
 | |
|         if "distance" in row:
 | |
|             properties['distance'] = row['distance']
 | |
|         return {
 | |
|             "type": "Feature",
 | |
|             "geometry": json.loads(row['geometry']),
 | |
|             "properties": properties
 | |
|         }
 | |
| 
 | |
|     def rows_to_collection(self, rows, geom_only=False):
 | |
|         """
 | |
|         Convert multiple database rows to a GeoJSON FeatureCollection.
 | |
|         
 | |
|         Args:
 | |
|             rows: The database rows.
 | |
|             geom_only: Whether to return only the geometry and event ID.
 | |
|             
 | |
|         Returns:
 | |
|             dict: A GeoJSON FeatureCollection.
 | |
|         """
 | |
|         logger.debug(f"Converting {len(rows)} rows to collection")
 | |
|         return {
 | |
|             "type": "FeatureCollection",
 | |
|             "features": [self.row_to_feature(r, geom_only) for r in rows],
 | |
|             "count": len(rows)
 | |
|         } | 
