Services: Admin-Lehrer, Backend-Lehrer, Studio v2, Website, Klausur-Service, School-Service, Voice-Service, Geo-Service, BreakPilot Drive, Agent-Core Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
98 lines
3.2 KiB
Python
98 lines
3.2 KiB
Python
"""
|
|
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(),
|
|
)
|