Move from JSON file storage to SQLite database using SQLAlchemy with Mapped type hints. Deduplicate URL utility functions into shared flickr_mail package. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
93 lines
2.8 KiB
Python
93 lines
2.8 KiB
Python
"""SQLAlchemy models for flickr-mail."""
|
|
|
|
from sqlalchemy import ForeignKey, Index, Text
|
|
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship
|
|
|
|
|
|
class Base(DeclarativeBase):
|
|
pass
|
|
|
|
|
|
class Contribution(Base):
|
|
__tablename__ = "contributions"
|
|
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
userid: Mapped[int | None]
|
|
user: Mapped[str | None]
|
|
pageid: Mapped[int | None]
|
|
revid: Mapped[int | None] = mapped_column(unique=True)
|
|
parentid: Mapped[int | None]
|
|
ns: Mapped[int | None]
|
|
title: Mapped[str | None]
|
|
timestamp: Mapped[str | None]
|
|
minor: Mapped[str | None]
|
|
top: Mapped[str | None]
|
|
comment: Mapped[str | None] = mapped_column(Text)
|
|
size: Mapped[int | None]
|
|
sizediff: Mapped[int | None]
|
|
tags: Mapped[str | None] = mapped_column(Text) # JSON array stored as text
|
|
|
|
__table_args__ = (
|
|
Index("ix_contributions_timestamp", "timestamp"),
|
|
Index("ix_contributions_pageid", "pageid"),
|
|
)
|
|
|
|
|
|
class SentMessage(Base):
|
|
__tablename__ = "sent_messages"
|
|
|
|
message_id: Mapped[str] = mapped_column(primary_key=True)
|
|
subject: Mapped[str | None]
|
|
url: Mapped[str | None]
|
|
recipient: Mapped[str | None]
|
|
date: Mapped[str | None]
|
|
body: Mapped[str | None] = mapped_column(Text)
|
|
body_html: Mapped[str | None] = mapped_column(Text)
|
|
flickr_url: Mapped[str | None]
|
|
normalized_flickr_url: Mapped[str | None]
|
|
wikipedia_url: Mapped[str | None]
|
|
creator_profile_url: Mapped[str | None]
|
|
|
|
flickr_uploads: Mapped[list["FlickrUpload"]] = relationship(
|
|
back_populates="sent_message"
|
|
)
|
|
|
|
__table_args__ = (
|
|
Index("ix_sent_messages_recipient", "recipient"),
|
|
Index("ix_sent_messages_normalized_flickr_url", "normalized_flickr_url"),
|
|
)
|
|
|
|
|
|
class FlickrUpload(Base):
|
|
__tablename__ = "flickr_uploads"
|
|
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
pageid: Mapped[int | None]
|
|
revid: Mapped[int | None]
|
|
title: Mapped[str | None]
|
|
timestamp: Mapped[str | None]
|
|
flickr_url: Mapped[str | None]
|
|
normalized_flickr_url: Mapped[str | None]
|
|
creator: Mapped[str | None]
|
|
wikipedia_url: Mapped[str | None]
|
|
creator_profile_url: Mapped[str | None]
|
|
sent_message_id: Mapped[str | None] = mapped_column(
|
|
ForeignKey("sent_messages.message_id")
|
|
)
|
|
|
|
sent_message: Mapped[SentMessage | None] = relationship(
|
|
back_populates="flickr_uploads"
|
|
)
|
|
|
|
__table_args__ = (
|
|
Index("ix_flickr_uploads_normalized_flickr_url", "normalized_flickr_url"),
|
|
Index("ix_flickr_uploads_timestamp", "timestamp"),
|
|
)
|
|
|
|
|
|
class ThumbnailCache(Base):
|
|
__tablename__ = "thumbnail_cache"
|
|
|
|
title: Mapped[str] = mapped_column(primary_key=True)
|
|
thumb_url: Mapped[str | None]
|
|
fetched_at: Mapped[int | None] # Unix timestamp
|