summaryrefslogtreecommitdiffstats
path: root/database.py
diff options
context:
space:
mode:
Diffstat (limited to 'database.py')
-rw-r--r--database.py101
1 files changed, 101 insertions, 0 deletions
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)