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

1from sqlalchemy import Column, DateTime, ForeignKey, String, func 

2from sqlalchemy.ext.hybrid import hybrid_property 

3from sqlalchemy.orm import relationship 

4 

5from couchers import urls 

6from couchers.models.base import Base 

7 

8 

9class InitiatedUpload(Base): 

10 """ 

11 Started downloads, not necessarily complete yet. 

12 """ 

13 

14 __tablename__ = "initiated_uploads" 

15 

16 key = Column(String, primary_key=True) 

17 

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) 

21 

22 initiator_user_id = Column(ForeignKey("users.id"), nullable=False, index=True) 

23 

24 initiator_user = relationship("User") 

25 

26 @hybrid_property 

27 def is_valid(self): 

28 return (self.created <= func.now()) & (self.expiry >= func.now()) 

29 

30 

31class Upload(Base): 

32 """ 

33 Completed uploads. 

34 """ 

35 

36 __tablename__ = "uploads" 

37 key = Column(String, primary_key=True) 

38 

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) 

42 

43 # photo credit, etc 

44 credit = Column(String, nullable=True) 

45 

46 creator_user = relationship("User", backref="uploads", foreign_keys="Upload.creator_user_id") 

47 

48 def _url(self, size): 

49 return urls.media_url(filename=self.filename, size=size) 

50 

51 @property 

52 def thumbnail_url(self): 

53 return self._url("thumbnail") 

54 

55 @property 

56 def full_url(self): 

57 return self._url("full")