""" Attribution Models Models for license and attribution tracking """ from typing import Optional from pydantic import BaseModel, Field class AttributionSource(BaseModel): """ Attribution information for a data source. All geographic data requires proper attribution per their licenses. """ name: str = Field(..., description="Source name") license: str = Field(..., description="License name") url: str = Field(..., description="License or source URL") attribution: str = Field(..., description="Required attribution text") required: bool = Field(True, description="Whether attribution is legally required") logo_url: Optional[str] = Field(None, description="Optional logo URL") class Attribution(BaseModel): """ Complete attribution information for an AOI bundle. Ensures DSGVO/GDPR compliance and proper data source attribution. """ sources: list[AttributionSource] = Field( ..., description="List of data sources requiring attribution", ) generated_at: str = Field(..., description="Timestamp when attribution was generated") notice: str = Field( "This data must be attributed according to the licenses above when used publicly.", description="General attribution notice", ) class Config: json_schema_extra = { "example": { "sources": [ { "name": "OpenStreetMap", "license": "Open Database License (ODbL) v1.0", "url": "https://www.openstreetmap.org/copyright", "attribution": "© OpenStreetMap contributors", "required": True, }, { "name": "Copernicus DEM", "license": "Copernicus Data License", "url": "https://spacedata.copernicus.eu/", "attribution": "© Copernicus Service Information 2024", "required": True, }, ], "generated_at": "2024-01-15T12:00:00Z", "notice": "This data must be attributed according to the licenses above when used publicly.", } } # Predefined attribution sources OSM_ATTRIBUTION = AttributionSource( name="OpenStreetMap", license="Open Database License (ODbL) v1.0", url="https://www.openstreetmap.org/copyright", attribution="© OpenStreetMap contributors", required=True, ) COPERNICUS_ATTRIBUTION = AttributionSource( name="Copernicus DEM", license="Copernicus Data License", url="https://spacedata.copernicus.eu/", attribution="© Copernicus Service Information 2024", required=True, ) OPENAERIAL_ATTRIBUTION = AttributionSource( name="OpenAerialMap", license="CC-BY 4.0", url="https://openaerialmap.org/", attribution="© OpenAerialMap contributors", required=True, ) def get_default_attribution() -> Attribution: """Get default attribution with standard sources.""" from datetime import datetime return Attribution( sources=[OSM_ATTRIBUTION, COPERNICUS_ATTRIBUTION], generated_at=datetime.utcnow().isoformat(), )