|
@@ -27,30 +27,33 @@ logger = logging.getLogger(__name__)
|
|
|
|
|
|
moderators = db.Table(
|
|
moderators = db.Table(
|
|
'moderators',
|
|
'moderators',
|
|
- db.Column('user_id', db.Integer(), db.ForeignKey('users.id'),
|
|
|
|
|
|
+ db.Column('user_id', db.Integer(),
|
|
|
|
+ db.ForeignKey('users.id', ondelete="CASCADE"),
|
|
nullable=False),
|
|
nullable=False),
|
|
db.Column('forum_id', db.Integer(),
|
|
db.Column('forum_id', db.Integer(),
|
|
- db.ForeignKey('forums.id', use_alter=True,
|
|
|
|
|
|
+ db.ForeignKey('forums.id', use_alter=True, ondelete="CASCADE",
|
|
name="fk_mods_forum_id"),
|
|
name="fk_mods_forum_id"),
|
|
nullable=False))
|
|
nullable=False))
|
|
|
|
|
|
|
|
|
|
topictracker = db.Table(
|
|
topictracker = db.Table(
|
|
'topictracker',
|
|
'topictracker',
|
|
- db.Column('user_id', db.Integer(), db.ForeignKey('users.id'),
|
|
|
|
|
|
+ db.Column('user_id', db.Integer(),
|
|
|
|
+ db.ForeignKey('users.id', ondelete="CASCADE"),
|
|
nullable=False),
|
|
nullable=False),
|
|
db.Column('topic_id', db.Integer(),
|
|
db.Column('topic_id', db.Integer(),
|
|
- db.ForeignKey('topics.id', use_alter=True,
|
|
|
|
|
|
+ db.ForeignKey('topics.id', use_alter=True, ondelete="CASCADE",
|
|
name="fk_tracker_topic_id"),
|
|
name="fk_tracker_topic_id"),
|
|
nullable=False))
|
|
nullable=False))
|
|
|
|
|
|
|
|
|
|
forumgroups = db.Table(
|
|
forumgroups = db.Table(
|
|
'forumgroups',
|
|
'forumgroups',
|
|
- db.Column('group_id', db.Integer(), db.ForeignKey('groups.id'),
|
|
|
|
|
|
+ db.Column('group_id', db.Integer(),
|
|
|
|
+ db.ForeignKey('groups.id', ondelete="CASCADE"),
|
|
nullable=False),
|
|
nullable=False),
|
|
db.Column('forum_id', db.Integer(),
|
|
db.Column('forum_id', db.Integer(),
|
|
- db.ForeignKey('forums.id', use_alter=True,
|
|
|
|
|
|
+ db.ForeignKey('forums.id', use_alter=True, ondelete="CASCADE",
|
|
name="fk_fg_forum_id"),
|
|
name="fk_fg_forum_id"),
|
|
nullable=False))
|
|
nullable=False))
|
|
|
|
|
|
@@ -58,17 +61,20 @@ forumgroups = db.Table(
|
|
class TopicsRead(db.Model, CRUDMixin):
|
|
class TopicsRead(db.Model, CRUDMixin):
|
|
__tablename__ = "topicsread"
|
|
__tablename__ = "topicsread"
|
|
|
|
|
|
- user_id = db.Column(db.Integer, db.ForeignKey("users.id"),
|
|
|
|
|
|
+ user_id = db.Column(db.Integer,
|
|
|
|
+ db.ForeignKey("users.id", ondelete="CASCADE"),
|
|
primary_key=True)
|
|
primary_key=True)
|
|
user = db.relationship('User', uselist=False, foreign_keys=[user_id])
|
|
user = db.relationship('User', uselist=False, foreign_keys=[user_id])
|
|
topic_id = db.Column(db.Integer,
|
|
topic_id = db.Column(db.Integer,
|
|
db.ForeignKey("topics.id", use_alter=True,
|
|
db.ForeignKey("topics.id", use_alter=True,
|
|
- name="fk_tr_topic_id"),
|
|
|
|
|
|
+ name="fk_tr_topic_id",
|
|
|
|
+ ondelete="CASCADE"),
|
|
primary_key=True)
|
|
primary_key=True)
|
|
topic = db.relationship('Topic', uselist=False, foreign_keys=[topic_id])
|
|
topic = db.relationship('Topic', uselist=False, foreign_keys=[topic_id])
|
|
forum_id = db.Column(db.Integer,
|
|
forum_id = db.Column(db.Integer,
|
|
db.ForeignKey("forums.id", use_alter=True,
|
|
db.ForeignKey("forums.id", use_alter=True,
|
|
- name="fk_tr_forum_id"),
|
|
|
|
|
|
+ name="fk_tr_forum_id",
|
|
|
|
+ ondelete="CASCADE"),
|
|
primary_key=True)
|
|
primary_key=True)
|
|
forum = db.relationship('Forum', uselist=False, foreign_keys=[forum_id])
|
|
forum = db.relationship('Forum', uselist=False, foreign_keys=[forum_id])
|
|
last_read = db.Column(UTCDateTime(timezone=True), default=time_utcnow,
|
|
last_read = db.Column(UTCDateTime(timezone=True), default=time_utcnow,
|
|
@@ -78,12 +84,14 @@ class TopicsRead(db.Model, CRUDMixin):
|
|
class ForumsRead(db.Model, CRUDMixin):
|
|
class ForumsRead(db.Model, CRUDMixin):
|
|
__tablename__ = "forumsread"
|
|
__tablename__ = "forumsread"
|
|
|
|
|
|
- user_id = db.Column(db.Integer, db.ForeignKey("users.id"),
|
|
|
|
|
|
+ user_id = db.Column(db.Integer,
|
|
|
|
+ db.ForeignKey("users.id", ondelete="CASCADE"),
|
|
primary_key=True)
|
|
primary_key=True)
|
|
user = db.relationship('User', uselist=False, foreign_keys=[user_id])
|
|
user = db.relationship('User', uselist=False, foreign_keys=[user_id])
|
|
forum_id = db.Column(db.Integer,
|
|
forum_id = db.Column(db.Integer,
|
|
db.ForeignKey("forums.id", use_alter=True,
|
|
db.ForeignKey("forums.id", use_alter=True,
|
|
- name="fk_fr_forum_id"),
|
|
|
|
|
|
+ name="fk_fr_forum_id",
|
|
|
|
+ ondelete="CASCADE"),
|
|
primary_key=True)
|
|
primary_key=True)
|
|
forum = db.relationship('Forum', uselist=False, foreign_keys=[forum_id])
|
|
forum = db.relationship('Forum', uselist=False, foreign_keys=[forum_id])
|
|
last_read = db.Column(UTCDateTime(timezone=True), default=time_utcnow,
|
|
last_read = db.Column(UTCDateTime(timezone=True), default=time_utcnow,
|
|
@@ -390,7 +398,7 @@ class Topic(HideableCRUDMixin, db.Model):
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
forum_id = db.Column(db.Integer,
|
|
forum_id = db.Column(db.Integer,
|
|
db.ForeignKey("forums.id",
|
|
db.ForeignKey("forums.id",
|
|
- use_alter=True,
|
|
|
|
|
|
+ use_alter=True, ondelete="CASCADE",
|
|
name="fk_topic_forum_id"),
|
|
name="fk_topic_forum_id"),
|
|
nullable=False)
|
|
nullable=False)
|
|
title = db.Column(db.String(255), nullable=False)
|
|
title = db.Column(db.String(255), nullable=False)
|
|
@@ -667,6 +675,12 @@ class Topic(HideableCRUDMixin, db.Model):
|
|
db.session.delete(self)
|
|
db.session.delete(self)
|
|
self._fix_user_post_counts(users or self.involved_users().all())
|
|
self._fix_user_post_counts(users or self.involved_users().all())
|
|
self._fix_post_counts(forum)
|
|
self._fix_post_counts(forum)
|
|
|
|
+
|
|
|
|
+ # forum.last_post_id shouldn't usually be none
|
|
|
|
+ if forum.last_post_id is None or \
|
|
|
|
+ self.last_post_id == forum.last_post_id:
|
|
|
|
+ forum.update_last_post(commit=False)
|
|
|
|
+
|
|
db.session.commit()
|
|
db.session.commit()
|
|
return self
|
|
return self
|
|
|
|
|
|
@@ -723,8 +737,6 @@ class Topic(HideableCRUDMixin, db.Model):
|
|
self.forum.last_post_username = None
|
|
self.forum.last_post_username = None
|
|
self.forum.last_post_created = None
|
|
self.forum.last_post_created = None
|
|
|
|
|
|
- TopicsRead.query.filter_by(topic_id=self.id).delete()
|
|
|
|
-
|
|
|
|
def _fix_user_post_counts(self, users=None):
|
|
def _fix_user_post_counts(self, users=None):
|
|
# Update the post counts
|
|
# Update the post counts
|
|
if users:
|
|
if users:
|
|
@@ -789,7 +801,8 @@ class Forum(db.Model, CRUDMixin):
|
|
__tablename__ = "forums"
|
|
__tablename__ = "forums"
|
|
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
- category_id = db.Column(db.Integer, db.ForeignKey("categories.id"),
|
|
|
|
|
|
+ category_id = db.Column(db.Integer,
|
|
|
|
+ db.ForeignKey("categories.id", ondelete="CASCADE"),
|
|
nullable=False)
|
|
nullable=False)
|
|
title = db.Column(db.String(255), nullable=False)
|
|
title = db.Column(db.String(255), nullable=False)
|
|
description = db.Column(db.Text, nullable=True)
|
|
description = db.Column(db.Text, nullable=True)
|
|
@@ -803,11 +816,14 @@ class Forum(db.Model, CRUDMixin):
|
|
|
|
|
|
# One-to-one
|
|
# One-to-one
|
|
last_post_id = db.Column(db.Integer, db.ForeignKey("posts.id"),
|
|
last_post_id = db.Column(db.Integer, db.ForeignKey("posts.id"),
|
|
- nullable=True)
|
|
|
|
|
|
+ nullable=True) # we handle this case ourselfs
|
|
last_post = db.relationship("Post", backref="last_post_forum",
|
|
last_post = db.relationship("Post", backref="last_post_forum",
|
|
uselist=False, foreign_keys=[last_post_id])
|
|
uselist=False, foreign_keys=[last_post_id])
|
|
|
|
|
|
- last_post_user_id = db.Column(db.Integer, db.ForeignKey("users.id"),
|
|
|
|
|
|
+ # set to null if the user got deleted
|
|
|
|
+ last_post_user_id = db.Column(db.Integer,
|
|
|
|
+ db.ForeignKey("users.id",
|
|
|
|
+ ondelete="SET NULL"),
|
|
nullable=True)
|
|
nullable=True)
|
|
|
|
|
|
last_post_user = db.relationship(
|
|
last_post_user = db.relationship(
|
|
@@ -827,8 +843,7 @@ class Forum(db.Model, CRUDMixin):
|
|
topics = db.relationship(
|
|
topics = db.relationship(
|
|
"Topic",
|
|
"Topic",
|
|
backref="forum",
|
|
backref="forum",
|
|
- lazy="dynamic",
|
|
|
|
- cascade="all, delete-orphan"
|
|
|
|
|
|
+ lazy="dynamic"
|
|
)
|
|
)
|
|
|
|
|
|
# Many-to-many
|
|
# Many-to-many
|
|
@@ -872,7 +887,7 @@ class Forum(db.Model, CRUDMixin):
|
|
"""
|
|
"""
|
|
return "<{} {}>".format(self.__class__.__name__, self.id)
|
|
return "<{} {}>".format(self.__class__.__name__, self.id)
|
|
|
|
|
|
- def update_last_post(self):
|
|
|
|
|
|
+ def update_last_post(self, commit=True):
|
|
"""Updates the last post in the forum."""
|
|
"""Updates the last post in the forum."""
|
|
last_post = Post.query.\
|
|
last_post = Post.query.\
|
|
filter(Post.topic_id == Topic.id,
|
|
filter(Post.topic_id == Topic.id,
|
|
@@ -900,7 +915,8 @@ class Forum(db.Model, CRUDMixin):
|
|
self.last_post_username = None
|
|
self.last_post_username = None
|
|
self.last_post_created = None
|
|
self.last_post_created = None
|
|
|
|
|
|
- db.session.commit()
|
|
|
|
|
|
+ if commit:
|
|
|
|
+ db.session.commit()
|
|
|
|
|
|
def update_read(self, user, forumsread, topicsread):
|
|
def update_read(self, user, forumsread, topicsread):
|
|
"""Updates the ForumsRead status for the user. In order to work
|
|
"""Updates the ForumsRead status for the user. In order to work
|
|
@@ -1021,11 +1037,6 @@ class Forum(db.Model, CRUDMixin):
|
|
db.session.delete(self)
|
|
db.session.delete(self)
|
|
db.session.commit()
|
|
db.session.commit()
|
|
|
|
|
|
- # Delete the entries for the forum in the ForumsRead and TopicsRead
|
|
|
|
- # relation
|
|
|
|
- ForumsRead.query.filter_by(forum_id=self.id).delete()
|
|
|
|
- TopicsRead.query.filter_by(forum_id=self.id).delete()
|
|
|
|
-
|
|
|
|
# Update the users post count
|
|
# Update the users post count
|
|
if users:
|
|
if users:
|
|
users_list = []
|
|
users_list = []
|
|
@@ -1113,8 +1124,7 @@ class Category(db.Model, CRUDMixin):
|
|
# One-to-many
|
|
# One-to-many
|
|
forums = db.relationship("Forum", backref="category", lazy="dynamic",
|
|
forums = db.relationship("Forum", backref="category", lazy="dynamic",
|
|
primaryjoin='Forum.category_id == Category.id',
|
|
primaryjoin='Forum.category_id == Category.id',
|
|
- order_by='asc(Forum.position)',
|
|
|
|
- cascade="all, delete-orphan")
|
|
|
|
|
|
+ order_by='asc(Forum.position)')
|
|
|
|
|
|
# Properties
|
|
# Properties
|
|
@property
|
|
@property
|