photolib/photoapp/types.py

103 lines
3.0 KiB
Python
Raw Normal View History

2018-09-15 16:48:47 -07:00
from sqlalchemy import Column, Integer, String, DateTime, Unicode, DECIMAL, ForeignKey, Boolean, Enum
2018-09-08 15:49:16 -07:00
from sqlalchemy.orm import relationship
2018-09-09 16:47:21 -07:00
from sqlalchemy.schema import UniqueConstraint
2019-06-17 22:43:57 -07:00
from photoapp.dbutils import Base
2018-09-09 16:47:21 -07:00
from datetime import datetime
2018-09-08 15:49:16 -07:00
import uuid
2018-09-15 16:48:47 -07:00
import enum
2018-09-08 15:49:16 -07:00
2018-09-15 16:48:47 -07:00
class PhotoStatus(enum.Enum):
private = 0
public = 1
hidden = 2
2018-09-08 15:49:16 -07:00
class PhotoSet(Base):
__tablename__ = 'photos'
id = Column(Integer, primary_key=True)
2018-09-09 16:47:21 -07:00
uuid = Column(Unicode, unique=True, default=lambda: str(uuid.uuid4()))
2018-09-08 15:49:16 -07:00
date = Column(DateTime)
2018-09-15 16:48:47 -07:00
date_real = Column(DateTime)
date_offset = Column(Integer, default=0) # minutes
2018-09-08 15:49:16 -07:00
lat = Column(DECIMAL(precision=11))
lon = Column(DECIMAL(precision=11))
files = relationship("Photo", back_populates="set")
2018-09-09 16:47:21 -07:00
tags = relationship("TagItem", back_populates="set")
2018-09-08 15:49:16 -07:00
2018-09-09 14:10:42 -07:00
title = Column(String)
description = Column(String)
2018-09-23 15:00:54 -07:00
slug = Column(String)
2018-09-09 14:10:42 -07:00
2018-09-15 16:48:47 -07:00
status = Column(Enum(PhotoStatus), default=PhotoStatus.private)
2018-09-08 15:49:16 -07:00
class Photo(Base):
__tablename__ = 'files'
id = Column(Integer, primary_key=True)
set_id = Column(Integer, ForeignKey("photos.id"))
2018-09-09 16:47:21 -07:00
uuid = Column(Unicode, unique=True, default=lambda: str(uuid.uuid4()))
2018-09-08 15:49:16 -07:00
set = relationship("PhotoSet", back_populates="files", foreign_keys=[set_id])
2018-09-09 12:05:13 -07:00
size = Column(Integer)
width = Column(Integer)
height = Column(Integer)
2018-09-09 13:45:26 -07:00
orientation = Column(Integer, default=0)
2018-09-08 15:49:16 -07:00
hash = Column(String(length=64), unique=True)
path = Column(Unicode)
format = Column(String(length=64)) # TODO how long can a mime string be
2018-09-09 14:10:42 -07:00
class Tag(Base):
__tablename__ = 'tags'
id = Column(Integer, primary_key=True)
2018-09-09 16:47:21 -07:00
uuid = Column(Unicode, unique=True, default=lambda: str(uuid.uuid4()))
created = Column(DateTime, default=lambda: datetime.now())
modified = Column(DateTime, default=lambda: datetime.now())
2018-09-23 13:04:50 -07:00
is_album = Column(Boolean, default=False)
2018-09-23 15:00:54 -07:00
# slug-like short name such as "iomtrip"
name = Column(String, unique=True)
# longer human-format title like "Isle of Man trip"
title = Column(String)
# url slug like "isle-of-man-trip"
2018-09-09 16:47:21 -07:00
slug = Column(String, unique=True)
2018-09-23 15:00:54 -07:00
# fulltext description
2018-09-09 14:10:42 -07:00
description = Column(String)
entries = relationship("TagItem", back_populates="tag")
class TagItem(Base):
__tablename__ = 'tag_items'
id = Column(Integer, primary_key=True)
tag_id = Column(Integer, ForeignKey("tags.id"))
2018-09-09 16:47:21 -07:00
set_id = Column(Integer, ForeignKey("photos.id"))
order = Column(Integer, default=0)
2018-09-09 14:10:42 -07:00
tag = relationship("Tag", back_populates="entries", foreign_keys=[tag_id])
2018-09-09 16:47:21 -07:00
set = relationship("PhotoSet", back_populates="tags", foreign_keys=[set_id])
2018-09-09 14:10:42 -07:00
2018-09-09 16:47:21 -07:00
UniqueConstraint(tag_id, set_id)
2018-09-23 16:39:46 -07:00
class UserStatus(enum.Enum):
banned = -1
guest = 0
normal = 1
admin = 2
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(length=64), unique=True)
password = Column(String(length=64)) # sha256
status = Column(Enum(UserStatus), default=UserStatus.normal)