python-gallery/gallery/db.py

135 lines
4.1 KiB
Python
Raw Normal View History

2023-03-04 13:45:26 +00:00
"""
OnlyLegs - Database
Database models and functions for SQLAlchemy
"""
import os
from datetime import datetime
2023-03-04 13:45:26 +00:00
import platformdirs
from sqlalchemy import create_engine, Column, Integer, String, Boolean, DateTime, ForeignKey, PickleType
from sqlalchemy.orm import declarative_base, relationship, backref, mapped_column
path_to_db = os.path.join(platformdirs.user_config_dir('onlylegs'), 'gallery.sqlite')
engine = create_engine(f'sqlite:///{path_to_db}', echo=False)
# engine = create_engine(f'postgresql://username:password@host:port/database_name', echo=False)
# engine = create_engine(f'mysql://username:password@host:port/database_name', echo=False)
base = declarative_base()
class Users (base): # pylint: disable=too-few-public-methods, C0103
2023-03-04 13:45:26 +00:00
"""
User table
Joins with post, groups, session and log
"""
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
username = Column(String, unique=True, nullable=False)
email = Column(String, unique=True, nullable=False)
password = Column(String, nullable=False)
created_at = Column(DateTime, nullable=False)
2023-03-04 13:45:26 +00:00
posts = relationship('Posts', backref='users')
groups = relationship('Groups', backref='users')
session = relationship('Sessions', backref='users')
log = relationship('Logs', backref='users')
2023-03-04 13:45:26 +00:00
class Posts (base): # pylint: disable=too-few-public-methods, C0103
2023-03-04 13:45:26 +00:00
"""
Post table
Joins with group_junction
"""
__tablename__ = 'posts'
2023-03-04 13:45:26 +00:00
id = Column(Integer, primary_key=True)
author_id = Column(Integer, ForeignKey('users.id'))
created_at = Column(DateTime, nullable=False)
file_name = Column(String, unique=True, nullable=False)
file_type = Column(String, nullable=False)
image_exif = Column(PickleType, nullable=False)
image_colours = Column(PickleType, nullable=False)
post_description = Column(String, nullable=False)
post_alt = Column(String, nullable=False)
2023-03-04 13:45:26 +00:00
junction = relationship('GroupJunction', backref='posts')
2023-03-04 13:45:26 +00:00
class Groups (base): # pylint: disable=too-few-public-methods, C0103
2023-03-04 13:45:26 +00:00
"""
Group table
Joins with group_junction
"""
__tablename__ = 'groups'
2023-03-04 13:45:26 +00:00
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)
description = Column(String, nullable=False)
author_id = Column(Integer, ForeignKey('users.id'))
created_at = Column(DateTime, nullable=False)
2023-03-04 13:45:26 +00:00
junction = relationship('GroupJunction', backref='groups')
2023-03-04 13:45:26 +00:00
class GroupJunction (base): # pylint: disable=too-few-public-methods, C0103
2023-03-04 13:45:26 +00:00
"""
Junction table for posts and groups
Joins with posts and groups
"""
__tablename__ = 'group_junction'
2023-03-04 13:45:26 +00:00
id = Column(Integer, primary_key=True)
group_id = Column(Integer, ForeignKey('groups.id'))
post_id = Column(Integer, ForeignKey('posts.id'))
2023-03-04 13:45:26 +00:00
class Sessions (base): # pylint: disable=too-few-public-methods, C0103
2023-03-04 13:45:26 +00:00
"""
Session table
Joins with user
"""
__tablename__ = 'sessions'
2023-03-04 13:45:26 +00:00
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users.id'))
session_uuid = Column(String, nullable=False)
2023-03-04 13:45:26 +00:00
ip_address = Column(String, nullable=False)
user_agent = Column(String, nullable=False)
active = Column(Boolean, nullable=False)
created_at = Column(DateTime, nullable=False)
2023-03-04 13:45:26 +00:00
class Logs (base): # pylint: disable=too-few-public-methods, C0103
2023-03-04 13:45:26 +00:00
"""
Log table
Joins with user
"""
__tablename__ = 'logs'
2023-03-04 13:45:26 +00:00
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users.id'))
2023-03-04 13:45:26 +00:00
ip_address = Column(String, nullable=False)
code = Column(Integer, nullable=False)
msg = Column(String, nullable=False)
created_at = Column(DateTime, nullable=False)
2023-03-04 13:45:26 +00:00
class Bans (base): # pylint: disable=too-few-public-methods, C0103
2023-03-04 13:45:26 +00:00
"""
Bans table
"""
__tablename__ = 'bans'
2023-03-04 13:45:26 +00:00
id = Column(Integer, primary_key=True)
2023-03-04 13:45:26 +00:00
ip_address = Column(String, nullable=False)
code = Column(Integer, nullable=False)
msg = Column(String, nullable=False)
created_at = Column(DateTime, nullable=False)
2023-03-04 13:45:26 +00:00
2023-03-04 13:45:26 +00:00
base.metadata.create_all(engine)