diff --git a/files/classes/group.py b/files/classes/group.py index d2d2fb6e5..a02a7eef9 100644 --- a/files/classes/group.py +++ b/files/classes/group.py @@ -14,8 +14,10 @@ class Group(Base): __tablename__ = "groups" name = Column(String, primary_key=True) created_utc = Column(Integer) + owner_id = Column(Integer, ForeignKey("users.id")) memberships = relationship("GroupMembership", primaryjoin="GroupMembership.group_name==Group.name", order_by="GroupMembership.approved_utc") + owner = relationship("User", primaryjoin="Group.owner_id==User.id") def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) @@ -24,11 +26,6 @@ class Group(Base): def __repr__(self): return self.name - @property - @lazy - def owner(self): - return self.memberships[0].user - @property @lazy def membership_user_ids(self): diff --git a/files/classes/user.py b/files/classes/user.py index f043a1336..b6d8ea240 100644 --- a/files/classes/user.py +++ b/files/classes/user.py @@ -438,7 +438,7 @@ class User(Base): @lazy def mods_group(self, group): if self.is_permabanned or self.shadowbanned: return False - if self.id == group.owner.id: return True + if self.id == group.owner_id: return True if self.admin_level >= PERMS['MODS_EVERY_GROUP']: return True return bool(g.db.query(GroupMembership.user_id).filter_by(user_id=self.id, group_name=group.name, is_mod=True).one_or_none()) diff --git a/files/routes/groups.py b/files/routes/groups.py index 9419dfffc..0b39764c9 100644 --- a/files/routes/groups.py +++ b/files/routes/groups.py @@ -87,7 +87,7 @@ def join_group(v, group_name): if not existing: join = GroupMembership(user_id=v.id, group_name=group_name) g.db.add(join) - send_notification(group.owner.id, f"@{v.username} has applied to join !{group}. You can approve or reject the application [here](/!{group}).") + send_notification(group.owner_id, f"@{v.username} has applied to join !{group}. You can approve or reject the application [here](/!{group}).") return {"message": f"Application submitted to !{group}'s owner (@{group.owner.username}) successfully!"} @@ -111,7 +111,7 @@ def leave_group(v, group_name): text = f"@{v.username} has cancelled their application to !{group}" msg = f"You have cancelled your application to !{group} successfully!" - send_notification(group.owner.id, text) + send_notification(group.owner_id, text) g.db.delete(existing) return {"message": msg} @@ -188,10 +188,10 @@ def group_reject(v, group_name, user_id): abort(404, "There is no membership to reject!") if v.id != membership.user_id: #implies kicking and not leaving - if membership.user_id == group.owner.id: + if membership.user_id == group.owner_id: abort(403, "You can't kick the group owner!") - if v.id != group.owner.id and membership.is_mod: + if v.id != group.owner_id and membership.is_mod: abort(403, "Only the group owner can kick mods!") if v.id == membership.user_id: @@ -227,7 +227,7 @@ def group_add_mod(v, group_name, user_id): group = g.db.get(Group, group_name) if not group: abort(404) - if v.id != group.owner.id: + if v.id != group.owner_id: abort(403, f"Only the group owner (@{group.owner.username}) can add mods!") membership = g.db.query(GroupMembership).filter_by(user_id=user_id, group_name=group.name).one_or_none() @@ -253,7 +253,7 @@ def group_remove_mod(v, group_name, user_id): group = g.db.get(Group, group_name) if not group: abort(404) - if v.id != group.owner.id: + if v.id != group.owner_id: abort(403, f"Only the group owner (@{group.owner.username}) can remove mods!") membership = g.db.query(GroupMembership).filter_by(user_id=user_id, group_name=group.name).one_or_none() diff --git a/files/templates/group_memberships.html b/files/templates/group_memberships.html index 716978430..f299e95b9 100644 --- a/files/templates/group_memberships.html +++ b/files/templates/group_memberships.html @@ -1,7 +1,7 @@ {% extends "default.html" %} {% block pagetitle %}!{{group}}{% endblock %} {% block content %} - {% if v.id != group.owner.id %} + {% if v.id != group.owner_id %} {% endif %} - {% if v.id == membership.user_id or v.id == group.owner.id or not membership.user.mods_group(group) %} + {% if v.id == membership.user_id or v.id == group.owner_id or not membership.user.mods_group(group) %}
diff --git a/files/templates/groups.html b/files/templates/groups.html index 5dccfb6c8..c3207b277 100644 --- a/files/templates/groups.html +++ b/files/templates/groups.html @@ -43,7 +43,7 @@ {{group.name}} {{group.member_ids | length}} - {% if v.id != group.owner.id %} + {% if v.id != group.owner_id %}