Coverage for src/couchers/models/uploads.py: 100%
31 statements
« prev ^ index » next coverage.py v7.11.0, created at 2025-11-08 00:20 +0000
« prev ^ index » next coverage.py v7.11.0, created at 2025-11-08 00:20 +0000
1from sqlalchemy import Column, DateTime, ForeignKey, String, func
2from sqlalchemy.ext.hybrid import hybrid_property
3from sqlalchemy.orm import relationship
5from couchers import urls
6from couchers.models.base import Base
9class InitiatedUpload(Base):
10 """
11 Started downloads, not necessarily complete yet.
12 """
14 __tablename__ = "initiated_uploads"
16 key = Column(String, primary_key=True)
18 # timezones should always be UTC
19 created = Column(DateTime(timezone=True), nullable=False, server_default=func.now())
20 expiry = Column(DateTime(timezone=True), nullable=False)
22 initiator_user_id = Column(ForeignKey("users.id"), nullable=False, index=True)
24 initiator_user = relationship("User")
26 @hybrid_property
27 def is_valid(self):
28 return (self.created <= func.now()) & (self.expiry >= func.now())
31class Upload(Base):
32 """
33 Completed uploads.
34 """
36 __tablename__ = "uploads"
37 key = Column(String, primary_key=True)
39 filename = Column(String, nullable=False)
40 created = Column(DateTime(timezone=True), nullable=False, server_default=func.now())
41 creator_user_id = Column(ForeignKey("users.id"), nullable=False, index=True)
43 # photo credit, etc
44 credit = Column(String, nullable=True)
46 creator_user = relationship("User", backref="uploads", foreign_keys="Upload.creator_user_id")
48 def _url(self, size):
49 return urls.media_url(filename=self.filename, size=size)
51 @property
52 def thumbnail_url(self):
53 return self._url("thumbnail")
55 @property
56 def full_url(self):
57 return self._url("full")