aboutsummaryrefslogtreecommitdiffstats
path: root/database.py
blob: f5eea452dca6c6ac635f0e5aacb6b87033f247c4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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)