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)
|
|
} |