From 305383c4b85dd6c826cb41faa42fd97015f33067 Mon Sep 17 00:00:00 2001 From: Fulgen301 Date: Sun, 26 Aug 2018 20:08:54 +0200 Subject: Rewrite database system with sqlalchemy, add /api/auth, add /api/uploads/comments --- database.py | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 database.py (limited to 'database.py') diff --git a/database.py b/database.py new file mode 100644 index 0000000..f5eea45 --- /dev/null +++ b/database.py @@ -0,0 +1,101 @@ +import os +import sys +from bson.objectid import ObjectId +from datetime import datetime +import sqlalchemy as db +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import relationship, sessionmaker + +class Types(object): + class ObjectId(db.TypeDecorator): + impl = db.UnicodeText + + def process_bind_param(self, value : ObjectId, dialect) -> str: + return str(value) + + def process_result_value(self, value : str, dialect) -> ObjectId: + if value in [None, "None"]: + return ObjectId("0" * 24) + return ObjectId(value) + + class List(db.TypeDecorator): + impl = db.UnicodeText + + def process_bind_param(self, value : list, dialect) -> str: + return ";".join(i.replace(";", ",") for i in value) + + def process_result_value(self, value : str, dialect) -> list: + return value.split(";") + +Base = declarative_base() + +class User(Base): + __tablename__ = "users" + id = db.Column(Types.ObjectId, primary_key=True, default=ObjectId) + name = db.Column(db.UnicodeText, nullable=False) + email = db.Column(db.UnicodeText) + hash = db.Column(db.String(512), nullable=False) + +class Upload(Base): + __tablename__ = "uploads" + id = db.Column(Types.ObjectId, primary_key=True, default=ObjectId) + title = db.Column(db.UnicodeText, nullable=False) + author_id = db.Column(Types.ObjectId, db.ForeignKey("users.id"), default=lambda: ObjectId("0"*24)) + description = db.Column(db.UnicodeText, default="") + slug = db.Column(db.Text, nullable=False) + tags = db.Column(Types.List, default=list) + created_at = db.Column(db.DateTime, nullable=False, default=datetime.now) + updated_at = db.Column(db.DateTime, nullable=False, default=datetime.now, onupdate=datetime.now) + _v = db.Column(db.Integer, default=0) + + author = relationship("User") + #dependency = relationship("Dependency") + +class File(Base): + __tablename__ = "files" + id = db.Column(Types.ObjectId, primary_key=True, default=ObjectId) + name = db.Column(db.Unicode(255), nullable=False) + hash = db.Column(db.String(40), nullable=False) + content_type = db.Column(db.String(255), default="application/octet-stream") + length = db.Column(db.BigInteger, default=0) + date = db.Column(db.DateTime, nullable=False, default=datetime.now) + upload_id = db.Column(Types.ObjectId, db.ForeignKey("uploads.id")) + download_url = db.Column(db.Text) + + upload = relationship("Upload") + +class Comment(Base): + __tablename__ = "comments" + id = db.Column(Types.ObjectId, primary_key=True, default=ObjectId) + author_id = db.Column(Types.ObjectId, db.ForeignKey("users.id")) + upload_id = db.Column(Types.ObjectId, db.ForeignKey("uploads.id")) + created_at = db.Column(db.DateTime, nullable=False, default=datetime.now) + updated_at = db.Column(db.DateTime, nullable=False, default=datetime.now, onupdate=datetime.now) + body = db.Column(db.UnicodeText, nullable=False) + + author = relationship("User") + upload = relationship("Upload") + +class Voting(Base): + __tablename__ = "votings" + id = db.Column(Types.ObjectId, primary_key=True, default=ObjectId) + author_id = db.Column(Types.ObjectId, db.ForeignKey("users.id")) + target_id = db.Column(Types.ObjectId, db.ForeignKey("uploads.id")) + + author = relationship("User") + target = relationship("Upload") + pass + +#class Dependency(Base): + #__tablename__ = "dependencies" + #id = db.Column(db.Integer, primary_key=True, default=ObjectId) + #target_id = db.Column(Types.ObjectId, db.ForeignKey("uploads.id")) + ##dependency_id = db.Column(Types.ObjectId, db.ForeignKey("uploads.id")) + + #target = relationship("Upload", foreign_keys=[target_id]) + ##dependency = relationship("Upload", foreign_keys=[dependency_id]) + +engine = db.create_engine("sqlite:///parry.db") +Base.metadata.bind = engine +Base.metadata.create_all(engine) +DBSession = sessionmaker(bind=engine) -- cgit v1.2.3-54-g00ecf