From 1816ce09f722ba7aa6216b185cee1faad63ede73 Mon Sep 17 00:00:00 2001 From: Aevann1 Date: Mon, 5 Sep 2022 05:44:24 +0200 Subject: [PATCH] make it possible to equip multiple hats --- files/classes/hats.py | 13 +++++++- files/classes/user.py | 66 ++++++++++++++++++++++----------------- files/routes/hats.py | 24 +++++++++----- files/templates/hats.html | 17 ++++------ 4 files changed, 71 insertions(+), 49 deletions(-) diff --git a/files/classes/hats.py b/files/classes/hats.py index d1b7bd084..86da59d0a 100644 --- a/files/classes/hats.py +++ b/files/classes/hats.py @@ -30,5 +30,16 @@ class Hat(Base): user_id = Column(Integer, ForeignKey('users.id'), primary_key=True) hat_id = Column(Integer, ForeignKey('hat_defs.id'), primary_key=True) + equipped = Column(Boolean, default=False) - owners = relationship("User", back_populates="owned_hats") \ No newline at end of file + hat_def = relationship("HatDef") + owners = relationship("User", back_populates="owned_hats") + + @property + @lazy + def name(self): + return self.hat_def.name + + @lazy + def censored_description(self, v): + return self.hat_def.censored_description(v) \ No newline at end of file diff --git a/files/classes/user.py b/files/classes/user.py index 2b5cfeffb..791232b1d 100644 --- a/files/classes/user.py +++ b/files/classes/user.py @@ -139,7 +139,6 @@ class User(Base): earlylife = Column(Integer) owoify = Column(Integer) marsify = Column(Integer) - equipped_hat_id = Column(Integer, ForeignKey("hat_defs.id")) badges = relationship("Badge", order_by="Badge.created_utc", back_populates="user") subscriptions = relationship("Subscription", back_populates="user") @@ -152,7 +151,6 @@ class User(Base): apps = relationship("OauthApp", back_populates="author") awards = relationship("AwardRelationship", primaryjoin="User.id==AwardRelationship.user_id", back_populates="user") referrals = relationship("User") - equipped_hat = relationship("HatDef", primaryjoin="User.equipped_hat_id==HatDef.id") designed_hats = relationship("HatDef", primaryjoin="User.id==HatDef.author_id", back_populates="author") owned_hats = relationship("Hat", back_populates="owners") @@ -184,6 +182,43 @@ class User(Base): def num_of_designed_hats(self): return len(self.designed_hats) + @property + @lazy + def equipped_hats(self): + return g.db.query(Hat).filter_by(user_id=self.id, equipped=True).all() + + @property + @lazy + def equipped_hat_ids(self): + return [x.hat_id for x in self.equipped_hats] + + @property + @lazy + def hat_active(self): + if not FEATURES['HATS']: + return '' + + if self.is_cakeday: + return 'Cakeday.webp' + + if self.equipped_hats: + return random.choice(self.equipped_hats).name + '.webp' + + return '' + + @lazy + def hat_tooltip(self, v): + if not FEATURES['HATS']: + return '' + + if self.is_cakeday: + return "I've spent another year rotting my brain with dramaposting, please ridicule me 🤓" + + if self.equipped_hats: + return random.choice(self.equipped_hats).censored_description(v) + + return '' + @property @lazy def name_color(self): @@ -652,33 +687,6 @@ class User(Base): return self.profileurl return f"{SITE_FULL}/assets/images/default-profile-pic.webp?v=1008" - @property - @lazy - def hat_active(self): - if not FEATURES['HATS']: - return '' - - if self.is_cakeday: - return 'Cakeday.webp' - - if self.equipped_hat_id: - return self.equipped_hat.name + '.webp' - - return '' - - @lazy - def hat_tooltip(self, v): - if not FEATURES['HATS']: - return '' - - if self.is_cakeday: - return "I've spent another year rotting my brain with dramaposting, please ridicule me 🤓" - - if self.equipped_hat_id: - return self.equipped_hat.censored_description(v) - - return '' - @lazy def json_popover(self, v): data = {'username': self.username, diff --git a/files/routes/hats.py b/files/routes/hats.py index f52cf8aed..7bdfe8969 100644 --- a/files/routes/hats.py +++ b/files/routes/hats.py @@ -13,8 +13,10 @@ def hats(v): owned_hat_ids = [x.hat_id for x in v.owned_hats] - if v.equipped_hat_id: - owned = [(v.equipped_hat, v.equipped_hat.author)] + g.db.query(HatDef, User).join(HatDef.author).filter(HatDef.id.in_(owned_hat_ids), HatDef.id != v.equipped_hat_id).order_by(HatDef.price, HatDef.name).all() + if v.equipped_hat_ids: + equipped = g.db.query(HatDef, User).join(HatDef.author).filter(HatDef.id.in_(owned_hat_ids), HatDef.id.in_(v.equipped_hat_ids)).order_by(HatDef.price, HatDef.name).all() + not_equipped = g.db.query(HatDef, User).join(HatDef.author).filter(HatDef.id.in_(owned_hat_ids), HatDef.id.notin_(v.equipped_hat_ids)).order_by(HatDef.price, HatDef.name).all() + owned = equipped + not_equipped else: owned = g.db.query(HatDef, User).join(HatDef.author).filter(HatDef.id.in_(owned_hat_ids)).order_by(HatDef.price, HatDef.name).all() @@ -83,18 +85,24 @@ def equip_hat(v, hat_id): hat = g.db.query(Hat).filter_by(hat_id=hat_id, user_id=v.id).one_or_none() if not hat: return {"error": "You don't own this hat!"} - v.equipped_hat_id = hat_id - g.db.add(v) + hat.equipped = True + g.db.add(hat) return {"message": "Hat equipped!"} -@app.post("/unequip_hat") +@app.post("/unequip_hat/") @auth_required -def unequip_hat(v): +def unequip_hat(v, hat_id): if not FEATURES['HATS']: abort(404) - v.equipped_hat_id = None - g.db.add(v) + try: hat_id = int(hat_id) + except: return {"error": "Hat not found!"} + + hat = g.db.query(Hat).filter_by(hat_id=hat_id, user_id=v.id).one_or_none() + if not hat: return {"error": "You don't own this hat!"} + + hat.equipped = False + g.db.add(hat) return {"message": "Hat unequipped!"} diff --git a/files/templates/hats.html b/files/templates/hats.html index 3fbab7f16..0465879bb 100644 --- a/files/templates/hats.html +++ b/files/templates/hats.html @@ -19,17 +19,12 @@ {% block content %}