
* #39 Add Flask-Migrate dep * #39 Make it such that flask db init can run https://github.com/miguelgrinberg/Flask-Migrate/issues/196#issuecomment-381343393 * Run flask db init, update migrations.env, commit artifacts * Set up a script such that you can `docker-compose exec files bash -c 'cd /service; FLASK_APP="files/cli:app" flask '` and have it do whatever flask thing you want * Fix circular dependency * import * is evil * Initial alembic migration, has issues with constraints and nullable columns * Bring alts table up to date with alembic autogenerate * Rerun flask db revision autogenerate * Bring award_relationships table up to date with alembic autogenerate * [#39/alembic] files/classes/__init__.py is evil but is at least explicitly evil now * #39 fix model in files/classes/badges.py * #39 fix model in files/classes/domains.py and files/classes/clients.py * #39 fix models: comment saves, comment flags * #39 fix models: comments * Few more imports * #39 columns that are not nullable should be flagged as not nullable * #39 Add missing indexes to model defs * [#39] add missing unique constraints to model defs * [#39] Temporarily undo any model changes which cause the sqlalchemy model to be out of sync with the actual dump * #39 Deforeignkeyify the correct column to make alembic happy * #39 flask db revision --autogenerate now creates an empty migration * #39 Migration format such that files are listed in creation order * #39 Better first revision * #39 Revert the model changes that were required to get to zero differences between db revision --autogenerate and the existing schema * #39 The first real migration * #39 Ensure that foreign key constraints are named in migration * #39 Alembic migrations for FK constraints, column defs * [#39] Run DB migrations before starting tests * [#39] New test to ensure migrations are up to date * [#39] More descriptive test failure message * Add -T flag to docker-compose exec * [#39] Run alembic migrations when starting the container
93 lines
2.4 KiB
Python
93 lines
2.4 KiB
Python
from flask import *
|
|
from sqlalchemy import *
|
|
from sqlalchemy.orm import relationship
|
|
from files.__main__ import Base
|
|
from files.helpers.lazy import lazy
|
|
import time
|
|
|
|
class Vote(Base):
|
|
|
|
__tablename__ = "votes"
|
|
|
|
submission_id = Column(Integer, ForeignKey("submissions.id"), primary_key=True)
|
|
user_id = Column(Integer, ForeignKey("users.id"), primary_key=True)
|
|
vote_type = Column(Integer, nullable=False)
|
|
app_id = Column(Integer, ForeignKey("oauth_apps.id"))
|
|
real = Column(Boolean, default=True, nullable=False)
|
|
created_utc = Column(Integer, nullable=False)
|
|
|
|
Index('votes_type_index', vote_type)
|
|
Index('vote_user_index', user_id)
|
|
|
|
user = relationship("User", lazy="subquery", viewonly=True)
|
|
post = relationship("Submission", lazy="subquery", viewonly=True)
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
|
|
super().__init__(*args, **kwargs)
|
|
|
|
def __repr__(self):
|
|
return f"<Vote(id={self.id})>"
|
|
|
|
@property
|
|
@lazy
|
|
def json_core(self):
|
|
data={
|
|
"user_id": self.user_id,
|
|
"submission_id":self.submission_id,
|
|
"vote_type":self.vote_type
|
|
}
|
|
return data
|
|
|
|
@property
|
|
@lazy
|
|
def json(self):
|
|
data=self.json_core
|
|
data["user"]=self.user.json_core
|
|
data["post"]=self.post.json_core
|
|
|
|
return data
|
|
|
|
|
|
class CommentVote(Base):
|
|
|
|
__tablename__ = "commentvotes"
|
|
|
|
comment_id = Column(Integer, ForeignKey("comments.id"), primary_key=True)
|
|
user_id = Column(Integer, ForeignKey("users.id"), primary_key=True)
|
|
vote_type = Column(Integer, nullable=False)
|
|
app_id = Column(Integer, ForeignKey("oauth_apps.id"))
|
|
real = Column(Boolean, default=True, nullable=False)
|
|
created_utc = Column(Integer, nullable=False)
|
|
|
|
Index('cvote_user_index', user_id)
|
|
Index('commentvotes_comments_type_index', vote_type)
|
|
|
|
user = relationship("User", lazy="subquery")
|
|
comment = relationship("Comment", lazy="subquery", viewonly=True)
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
|
|
super().__init__(*args, **kwargs)
|
|
|
|
def __repr__(self):
|
|
return f"<CommentVote(id={self.id})>"
|
|
|
|
@property
|
|
@lazy
|
|
def json_core(self):
|
|
data={
|
|
"user_id": self.user_id,
|
|
"comment_id":self.comment_id,
|
|
"vote_type":self.vote_type
|
|
}
|
|
return data
|
|
|
|
@property
|
|
@lazy
|
|
def json(self):
|
|
data=self.json_core
|
|
data["user"]=self.user.json_core
|
|
data["comment"]=self.comment.json_core
|
|
|
|
return data
|