diff --git a/files/classes/user.py b/files/classes/user.py index 0d40fb32b..c8355cbbc 100644 --- a/files/classes/user.py +++ b/files/classes/user.py @@ -107,7 +107,7 @@ class User(Base): friends_html = deferred(Column(String)) enemies = deferred(Column(String)) enemies_html = deferred(Column(String)) - is_banned = Column(Integer, default=0) + is_banned = Column(Integer, ForeignKey("users.id")) unban_utc = Column(Integer, default=0) ban_reason = deferred(Column(String)) is_muted = Column(Boolean, default=False, nullable=False) diff --git a/files/helpers/awards.py b/files/helpers/awards.py index ab51e446a..3ac85065e 100644 --- a/files/helpers/awards.py +++ b/files/helpers/awards.py @@ -18,7 +18,7 @@ def award_timers(v, bot=False): v.patron_utc = 0 notify_if_not_bot(f"Your {patron} status has expired!") if v.unban_utc and v.unban_utc < now: - v.is_banned = 0 + v.is_banned = None v.unban_utc = 0 v.ban_reason = None notify_if_not_bot("You have been unbanned!") diff --git a/files/helpers/stats.py b/files/helpers/stats.py index 166ddba92..23cee5ca8 100644 --- a/files/helpers/stats.py +++ b/files/helpers/stats.py @@ -104,7 +104,7 @@ def stats(site=None): "marseys": "{:,}".format(g.db.query(Marsey).filter(Marsey.submitter_id==None).count()), "users": "{:,}".format(g.db.query(User).count()), "private users": "{:,}".format(g.db.query(User).filter_by(is_private=True).count()), - "banned users": "{:,}".format(g.db.query(User).filter(User.is_banned > 0).count()), + "banned users": "{:,}".format(g.db.query(User).filter(User.is_banned != None).count()), "verified email users": "{:,}".format(g.db.query(User).filter_by(is_activated=True).count()), "coins in circulation": "{:,}".format(g.db.query(func.sum(User.coins)).scalar()), "total shop sales": "{:,}".format(g.db.query(func.sum(User.coins_spent)).scalar()), diff --git a/files/routes/admin.py b/files/routes/admin.py index a2a45c8e7..a7ce6cfb3 100644 --- a/files/routes/admin.py +++ b/files/routes/admin.py @@ -319,7 +319,7 @@ def revert_actions(v:User, username): user.unban_utc = 0 user.ban_reason = None if user.is_banned: - user.is_banned = 0 + user.is_banned = None send_repeatable_notification(user.id, f"@{v.username} (a site admin) has unbanned you!") g.db.add(user) @@ -328,7 +328,7 @@ def revert_actions(v:User, username): u.unban_utc = 0 u.ban_reason = None if u.is_banned: - u.is_banned = 0 + u.is_banned = None send_repeatable_notification(u.id, f"@{v.username} (a site admin) has unbanned you!") g.db.add(u) @@ -1135,7 +1135,7 @@ def unban_user(user_id, v): if FEATURES['AWARDS'] and user.ban_reason and user.ban_reason.startswith('1-Day ban award'): abort(403, "You can't undo a ban award!") - user.is_banned = 0 + user.is_banned = None user.unban_utc = 0 user.ban_reason = None send_repeatable_notification(user.id, f"@{v.username} (a site admin) has unbanned you!") @@ -1143,7 +1143,7 @@ def unban_user(user_id, v): for x in user.alts: if x.is_banned: send_repeatable_notification(x.id, f"@{v.username} (a site admin) has unbanned you!") - x.is_banned = 0 + x.is_banned = None x.unban_utc = 0 x.ban_reason = None g.db.add(x) diff --git a/files/routes/awards.py b/files/routes/awards.py index fdc66e062..2b5d54235 100644 --- a/files/routes/awards.py +++ b/files/routes/awards.py @@ -228,7 +228,7 @@ def award_thing(v, thing_type, id): send_repeatable_notification(author.id, "Your ban duration has been reduced by 1 day!") else: author.unban_utc = 0 - author.is_banned = 0 + author.is_banned = None author.ban_reason = None send_repeatable_notification(author.id, "You have been unbanned!") elif kind == "grass": diff --git a/files/routes/users.py b/files/routes/users.py index 0445c6ff2..c2d64ff8d 100644 --- a/files/routes/users.py +++ b/files/routes/users.py @@ -172,7 +172,7 @@ def user_voted_comments(v:User, username): @auth_required def banned(v:User): users = g.db.query(User).filter( - User.is_banned > 0, + User.is_banned != None, User.truescore > 0, or_(User.unban_utc == 0, User.unban_utc > time.time()), not_(and_( diff --git a/migrations/20221213-is_banned_fkey.sql b/migrations/20221213-is_banned_fkey.sql new file mode 100644 index 000000000..90fd0a2c2 --- /dev/null +++ b/migrations/20221213-is_banned_fkey.sql @@ -0,0 +1,4 @@ +alter table users alter column is_banned drop default; +alter table users alter column is_banned drop not null; +update users set is_banned=null where is_banned=0; +create index fki_user_is_banned_fkey on public.users using btree (is_banned); diff --git a/schema.sql b/schema.sql index e7622c8c6..f26f09ad6 100644 --- a/schema.sql +++ b/schema.sql @@ -944,7 +944,7 @@ CREATE TABLE public.users ( bio character varying(1500), bio_html character varying(10000), referred_by integer, - is_banned integer DEFAULT 0 NOT NULL, + is_banned integer, ban_reason character varying(256), login_nonce integer DEFAULT 0 NOT NULL, reserved character varying(256), @@ -2752,4 +2752,3 @@ ALTER TABLE ONLY public.comments -- -- PostgreSQL database dump complete -- -