forked from MarseyWorld/MarseyWorld
parent
ffd9c73566
commit
462e3421b5
|
@ -24,7 +24,7 @@ def settings(v):
|
||||||
@app.get("/settings/personal")
|
@app.get("/settings/personal")
|
||||||
@auth_required
|
@auth_required
|
||||||
def settings_personal(v):
|
def settings_personal(v):
|
||||||
return render_template("settings_personal.html", v=v)
|
return render_template("settings/personal.html", v=v)
|
||||||
|
|
||||||
@app.delete('/settings/background')
|
@app.delete('/settings/background')
|
||||||
@limiter.limit("1/second;30/minute;200/hour;1000/day")
|
@limiter.limit("1/second;30/minute;200/hour;1000/day")
|
||||||
|
@ -64,7 +64,7 @@ def settings_personal_post(v):
|
||||||
request_flag = int(time.time())
|
request_flag = int(time.time())
|
||||||
setattr(v, column_name, request_flag)
|
setattr(v, column_name, request_flag)
|
||||||
if badge_id: badge_grant(v, badge_id)
|
if badge_id: badge_grant(v, badge_id)
|
||||||
return render_template("settings_personal.html", v=v, msg=f"You have set the {friendly_name} permanently! Enjoy your new badge!")
|
return render_template("settings/personal.html", v=v, msg=f"You have set the {friendly_name} permanently! Enjoy your new badge!")
|
||||||
elif current_value != request_flag:
|
elif current_value != request_flag:
|
||||||
setattr(v, column_name, request_flag)
|
setattr(v, column_name, request_flag)
|
||||||
return True
|
return True
|
||||||
|
@ -134,38 +134,38 @@ def settings_personal_post(v):
|
||||||
v.bio = None
|
v.bio = None
|
||||||
v.bio_html = None
|
v.bio_html = None
|
||||||
g.db.add(v)
|
g.db.add(v)
|
||||||
return render_template("settings_personal.html", v=v, msg="Your bio has been updated.")
|
return render_template("settings/personal.html", v=v, msg="Your bio has been updated.")
|
||||||
|
|
||||||
elif not updated and request.values.get("sig") == "":
|
elif not updated and request.values.get("sig") == "":
|
||||||
v.sig = None
|
v.sig = None
|
||||||
v.sig_html = None
|
v.sig_html = None
|
||||||
g.db.add(v)
|
g.db.add(v)
|
||||||
return render_template("settings_personal.html", v=v, msg="Your sig has been updated.")
|
return render_template("settings/personal.html", v=v, msg="Your sig has been updated.")
|
||||||
|
|
||||||
elif not updated and request.values.get("friends") == "":
|
elif not updated and request.values.get("friends") == "":
|
||||||
v.friends = None
|
v.friends = None
|
||||||
v.friends_html = None
|
v.friends_html = None
|
||||||
g.db.add(v)
|
g.db.add(v)
|
||||||
return render_template("settings_personal.html", v=v, msg="Your friends list has been updated.")
|
return render_template("settings/personal.html", v=v, msg="Your friends list has been updated.")
|
||||||
|
|
||||||
elif not updated and request.values.get("enemies") == "":
|
elif not updated and request.values.get("enemies") == "":
|
||||||
v.enemies = None
|
v.enemies = None
|
||||||
v.enemies_html = None
|
v.enemies_html = None
|
||||||
g.db.add(v)
|
g.db.add(v)
|
||||||
return render_template("settings_personal.html", v=v, msg="Your enemies list has been updated.")
|
return render_template("settings/personal.html", v=v, msg="Your enemies list has been updated.")
|
||||||
|
|
||||||
elif not updated and v.patron and request.values.get("sig"):
|
elif not updated and v.patron and request.values.get("sig"):
|
||||||
sig = request.values.get("sig")[:200].replace('\n','').replace('\r','')
|
sig = request.values.get("sig")[:200].replace('\n','').replace('\r','')
|
||||||
sig_html = sanitize(sig)
|
sig_html = sanitize(sig)
|
||||||
if len(sig_html) > 1000:
|
if len(sig_html) > 1000:
|
||||||
return render_template("settings_personal.html",
|
return render_template("settings/personal.html",
|
||||||
v=v,
|
v=v,
|
||||||
error="Your sig is too long")
|
error="Your sig is too long")
|
||||||
|
|
||||||
v.sig = sig[:200]
|
v.sig = sig[:200]
|
||||||
v.sig_html=sig_html
|
v.sig_html=sig_html
|
||||||
g.db.add(v)
|
g.db.add(v)
|
||||||
return render_template("settings_personal.html",
|
return render_template("settings/personal.html",
|
||||||
v=v,
|
v=v,
|
||||||
msg="Your sig has been updated.")
|
msg="Your sig has been updated.")
|
||||||
|
|
||||||
|
@ -175,7 +175,7 @@ def settings_personal_post(v):
|
||||||
friends_html = sanitize(friends)
|
friends_html = sanitize(friends)
|
||||||
|
|
||||||
if len(friends_html) > 2000:
|
if len(friends_html) > 2000:
|
||||||
return render_template("settings_personal.html",
|
return render_template("settings/personal.html",
|
||||||
v=v,
|
v=v,
|
||||||
error="Your friends list is too long")
|
error="Your friends list is too long")
|
||||||
|
|
||||||
|
@ -189,7 +189,7 @@ def settings_personal_post(v):
|
||||||
v.friends = friends[:500]
|
v.friends = friends[:500]
|
||||||
v.friends_html=friends_html
|
v.friends_html=friends_html
|
||||||
g.db.add(v)
|
g.db.add(v)
|
||||||
return render_template("settings_personal.html",
|
return render_template("settings/personal.html",
|
||||||
v=v,
|
v=v,
|
||||||
msg="Your friends list has been updated.")
|
msg="Your friends list has been updated.")
|
||||||
|
|
||||||
|
@ -200,7 +200,7 @@ def settings_personal_post(v):
|
||||||
enemies_html = sanitize(enemies)
|
enemies_html = sanitize(enemies)
|
||||||
|
|
||||||
if len(enemies_html) > 2000:
|
if len(enemies_html) > 2000:
|
||||||
return render_template("settings_personal.html",
|
return render_template("settings/personal.html",
|
||||||
v=v,
|
v=v,
|
||||||
error="Your enemies list is too long")
|
error="Your enemies list is too long")
|
||||||
|
|
||||||
|
@ -213,7 +213,7 @@ def settings_personal_post(v):
|
||||||
v.enemies = enemies[:500]
|
v.enemies = enemies[:500]
|
||||||
v.enemies_html=enemies_html
|
v.enemies_html=enemies_html
|
||||||
g.db.add(v)
|
g.db.add(v)
|
||||||
return render_template("settings_personal.html",
|
return render_template("settings/personal.html",
|
||||||
v=v,
|
v=v,
|
||||||
msg="Your enemies list has been updated.")
|
msg="Your enemies list has been updated.")
|
||||||
|
|
||||||
|
@ -226,7 +226,7 @@ def settings_personal_post(v):
|
||||||
bio_html = sanitize(bio)
|
bio_html = sanitize(bio)
|
||||||
|
|
||||||
if len(bio_html) > 10000:
|
if len(bio_html) > 10000:
|
||||||
return render_template("settings_personal.html",
|
return render_template("settings/personal.html",
|
||||||
v=v,
|
v=v,
|
||||||
error="Your bio is too long")
|
error="Your bio is too long")
|
||||||
|
|
||||||
|
@ -235,7 +235,7 @@ def settings_personal_post(v):
|
||||||
v.bio = bio[:1500]
|
v.bio = bio[:1500]
|
||||||
v.bio_html=bio_html
|
v.bio_html=bio_html
|
||||||
g.db.add(v)
|
g.db.add(v)
|
||||||
return render_template("settings_personal.html",
|
return render_template("settings/personal.html",
|
||||||
v=v,
|
v=v,
|
||||||
msg="Your bio has been updated.")
|
msg="Your bio has been updated.")
|
||||||
|
|
||||||
|
@ -298,11 +298,11 @@ def filters(v):
|
||||||
filters=request.values.get("filters")[:1000].strip()
|
filters=request.values.get("filters")[:1000].strip()
|
||||||
|
|
||||||
if filters == v.custom_filter_list:
|
if filters == v.custom_filter_list:
|
||||||
return render_template("settings_advanced.html", v=v, error="You didn't change anything")
|
return render_template("settings/advanced.html", v=v, error="You didn't change anything")
|
||||||
|
|
||||||
v.custom_filter_list=filters
|
v.custom_filter_list=filters
|
||||||
g.db.add(v)
|
g.db.add(v)
|
||||||
return render_template("settings_advanced.html", v=v, msg="Your custom filters have been updated.")
|
return render_template("settings/advanced.html", v=v, msg="Your custom filters have been updated.")
|
||||||
|
|
||||||
|
|
||||||
def set_color(v:User, attr:str, color:Optional[str]):
|
def set_color(v:User, attr:str, color:Optional[str]):
|
||||||
|
@ -311,7 +311,7 @@ def set_color(v:User, attr:str, color:Optional[str]):
|
||||||
if color:
|
if color:
|
||||||
if color.startswith('#'): color = color[1:]
|
if color.startswith('#'): color = color[1:]
|
||||||
if not color_regex.fullmatch(color):
|
if not color_regex.fullmatch(color):
|
||||||
return render_template("settings_personal.html", v=v, error="Invalid color hex code")
|
return render_template("settings/personal.html", v=v, error="Invalid color hex code")
|
||||||
if color and current != color:
|
if color and current != color:
|
||||||
setattr(v, attr, color)
|
setattr(v, attr, color)
|
||||||
g.db.add(v)
|
g.db.add(v)
|
||||||
|
@ -390,27 +390,27 @@ def verifiedcolor(v):
|
||||||
def settings_security_post(v):
|
def settings_security_post(v):
|
||||||
if request.values.get("new_password"):
|
if request.values.get("new_password"):
|
||||||
if request.values.get("new_password") != request.values.get("cnf_password"):
|
if request.values.get("new_password") != request.values.get("cnf_password"):
|
||||||
return render_template("settings_security.html", v=v, error="Passwords do not match.")
|
return render_template("settings/security.html", v=v, error="Passwords do not match.")
|
||||||
|
|
||||||
if not valid_password_regex.fullmatch(request.values.get("new_password")):
|
if not valid_password_regex.fullmatch(request.values.get("new_password")):
|
||||||
return render_template("settings_security.html", v=v, error="Password must be between 8 and 100 characters.")
|
return render_template("settings/security.html", v=v, error="Password must be between 8 and 100 characters.")
|
||||||
|
|
||||||
if not v.verifyPass(request.values.get("old_password")):
|
if not v.verifyPass(request.values.get("old_password")):
|
||||||
return render_template("settings_security.html", v=v, error="Incorrect password")
|
return render_template("settings/security.html", v=v, error="Incorrect password")
|
||||||
|
|
||||||
v.passhash = hash_password(request.values.get("new_password"))
|
v.passhash = hash_password(request.values.get("new_password"))
|
||||||
|
|
||||||
g.db.add(v)
|
g.db.add(v)
|
||||||
return render_template("settings_security.html", v=v, msg="Your password has been changed.")
|
return render_template("settings/security.html", v=v, msg="Your password has been changed.")
|
||||||
|
|
||||||
if request.values.get("new_email"):
|
if request.values.get("new_email"):
|
||||||
if not v.verifyPass(request.values.get('password')):
|
if not v.verifyPass(request.values.get('password')):
|
||||||
return render_template("settings_security.html", v=v, error="Invalid password.")
|
return render_template("settings/security.html", v=v, error="Invalid password.")
|
||||||
|
|
||||||
new_email = request.values.get("new_email","").strip().lower()
|
new_email = request.values.get("new_email","").strip().lower()
|
||||||
|
|
||||||
if new_email == v.email:
|
if new_email == v.email:
|
||||||
return render_template("settings_security.html", v=v, error="This email is already yours!")
|
return render_template("settings/security.html", v=v, error="This email is already yours!")
|
||||||
|
|
||||||
url = f"{SITE_FULL}/activate"
|
url = f"{SITE_FULL}/activate"
|
||||||
|
|
||||||
|
@ -432,29 +432,29 @@ def settings_security_post(v):
|
||||||
|
|
||||||
if request.values.get("2fa_token"):
|
if request.values.get("2fa_token"):
|
||||||
if not v.verifyPass(request.values.get('password')):
|
if not v.verifyPass(request.values.get('password')):
|
||||||
return render_template("settings_security.html", v=v, error="Invalid password or token.")
|
return render_template("settings/security.html", v=v, error="Invalid password or token.")
|
||||||
|
|
||||||
secret = request.values.get("2fa_secret")
|
secret = request.values.get("2fa_secret")
|
||||||
x = pyotp.TOTP(secret)
|
x = pyotp.TOTP(secret)
|
||||||
if not x.verify(request.values.get("2fa_token"), valid_window=1):
|
if not x.verify(request.values.get("2fa_token"), valid_window=1):
|
||||||
return render_template("settings_security.html", v=v, error="Invalid password or token.")
|
return render_template("settings/security.html", v=v, error="Invalid password or token.")
|
||||||
|
|
||||||
v.mfa_secret = secret
|
v.mfa_secret = secret
|
||||||
g.db.add(v)
|
g.db.add(v)
|
||||||
return render_template("settings_security.html", v=v, msg="Two-factor authentication enabled.")
|
return render_template("settings/security.html", v=v, msg="Two-factor authentication enabled.")
|
||||||
|
|
||||||
if request.values.get("2fa_remove"):
|
if request.values.get("2fa_remove"):
|
||||||
if not v.verifyPass(request.values.get('password')):
|
if not v.verifyPass(request.values.get('password')):
|
||||||
return render_template("settings_security.html", v=v, error="Invalid password or token.")
|
return render_template("settings/security.html", v=v, error="Invalid password or token.")
|
||||||
|
|
||||||
token = request.values.get("2fa_remove")
|
token = request.values.get("2fa_remove")
|
||||||
|
|
||||||
if not v.validate_2fa(token):
|
if not v.validate_2fa(token):
|
||||||
return render_template("settings_security.html", v=v, error="Invalid password or token.")
|
return render_template("settings/security.html", v=v, error="Invalid password or token.")
|
||||||
|
|
||||||
v.mfa_secret = None
|
v.mfa_secret = None
|
||||||
g.db.add(v)
|
g.db.add(v)
|
||||||
return render_template("settings_security.html", v=v, msg="Two-factor authentication disabled.")
|
return render_template("settings/security.html", v=v, msg="Two-factor authentication disabled.")
|
||||||
|
|
||||||
@app.post("/settings/log_out_all_others")
|
@app.post("/settings/log_out_all_others")
|
||||||
@limiter.limit("1/second;30/minute;200/hour;1000/day")
|
@limiter.limit("1/second;30/minute;200/hour;1000/day")
|
||||||
|
@ -463,12 +463,12 @@ def settings_security_post(v):
|
||||||
def settings_log_out_others(v):
|
def settings_log_out_others(v):
|
||||||
submitted_password = request.values.get("password", "").strip()
|
submitted_password = request.values.get("password", "").strip()
|
||||||
if not v.verifyPass(submitted_password):
|
if not v.verifyPass(submitted_password):
|
||||||
return render_template("settings_security.html", v=v, error="Incorrect Password"), 401
|
return render_template("settings/security.html", v=v, error="Incorrect Password"), 401
|
||||||
|
|
||||||
v.login_nonce += 1
|
v.login_nonce += 1
|
||||||
session["login_nonce"] = v.login_nonce
|
session["login_nonce"] = v.login_nonce
|
||||||
g.db.add(v)
|
g.db.add(v)
|
||||||
return render_template("settings_security.html", v=v, msg="All other devices have been logged out")
|
return render_template("settings/security.html", v=v, msg="All other devices have been logged out")
|
||||||
|
|
||||||
|
|
||||||
@app.post("/settings/images/profile")
|
@app.post("/settings/images/profile")
|
||||||
|
@ -503,7 +503,7 @@ def settings_images_profile(v):
|
||||||
g.db.add(v)
|
g.db.add(v)
|
||||||
|
|
||||||
|
|
||||||
return render_template("settings_personal.html", v=v, msg="Profile picture successfully updated.")
|
return render_template("settings/personal.html", v=v, msg="Profile picture successfully updated.")
|
||||||
|
|
||||||
|
|
||||||
@app.post("/settings/images/banner")
|
@app.post("/settings/images/banner")
|
||||||
|
@ -527,12 +527,12 @@ def settings_images_banner(v):
|
||||||
v.bannerurl = bannerurl
|
v.bannerurl = bannerurl
|
||||||
g.db.add(v)
|
g.db.add(v)
|
||||||
|
|
||||||
return render_template("settings_personal.html", v=v, msg="Banner successfully updated.")
|
return render_template("settings/personal.html", v=v, msg="Banner successfully updated.")
|
||||||
|
|
||||||
@app.get("/settings/css")
|
@app.get("/settings/css")
|
||||||
@auth_required
|
@auth_required
|
||||||
def settings_css_get(v):
|
def settings_css_get(v):
|
||||||
return render_template("settings_css.html", v=v)
|
return render_template("settings/css.html", v=v)
|
||||||
|
|
||||||
@app.post("/settings/css")
|
@app.post("/settings/css")
|
||||||
@limiter.limit("1/second;30/minute;200/hour;1000/day")
|
@limiter.limit("1/second;30/minute;200/hour;1000/day")
|
||||||
|
@ -546,7 +546,7 @@ def settings_css(v):
|
||||||
v.css = css
|
v.css = css
|
||||||
g.db.add(v)
|
g.db.add(v)
|
||||||
|
|
||||||
return render_template("settings_css.html", v=v)
|
return render_template("settings/css.html", v=v)
|
||||||
|
|
||||||
@app.post("/settings/profilecss")
|
@app.post("/settings/profilecss")
|
||||||
@limiter.limit("1/second;30/minute;200/hour;1000/day")
|
@limiter.limit("1/second;30/minute;200/hour;1000/day")
|
||||||
|
@ -556,7 +556,7 @@ def settings_profilecss(v):
|
||||||
profilecss = request.values.get("profilecss", v.profilecss).strip().replace('\\', '').strip()[:4000]
|
profilecss = request.values.get("profilecss", v.profilecss).strip().replace('\\', '').strip()[:4000]
|
||||||
valid, error = validate_css(profilecss)
|
valid, error = validate_css(profilecss)
|
||||||
if not valid:
|
if not valid:
|
||||||
return render_template("settings_css.html", error=error, v=v)
|
return render_template("settings/css.html", error=error, v=v)
|
||||||
v.profilecss = profilecss
|
v.profilecss = profilecss
|
||||||
g.db.add(v)
|
g.db.add(v)
|
||||||
return redirect('/settings/css')
|
return redirect('/settings/css')
|
||||||
|
@ -564,7 +564,7 @@ def settings_profilecss(v):
|
||||||
@app.get("/settings/security")
|
@app.get("/settings/security")
|
||||||
@auth_required
|
@auth_required
|
||||||
def settings_security(v):
|
def settings_security(v):
|
||||||
return render_template("settings_security.html",
|
return render_template("settings/security.html",
|
||||||
v=v,
|
v=v,
|
||||||
mfa_secret=pyotp.random_base32() if not v.mfa_secret else None,
|
mfa_secret=pyotp.random_base32() if not v.mfa_secret else None,
|
||||||
now=int(time.time())
|
now=int(time.time())
|
||||||
|
@ -614,12 +614,12 @@ def settings_unblock_user(v):
|
||||||
@app.get("/settings/apps")
|
@app.get("/settings/apps")
|
||||||
@auth_required
|
@auth_required
|
||||||
def settings_apps(v):
|
def settings_apps(v):
|
||||||
return render_template("settings_apps.html", v=v)
|
return render_template("settings/apps.html", v=v)
|
||||||
|
|
||||||
@app.get("/settings/advanced")
|
@app.get("/settings/advanced")
|
||||||
@auth_required
|
@auth_required
|
||||||
def settings_advanced_get(v):
|
def settings_advanced_get(v):
|
||||||
return render_template("settings_advanced.html", v=v)
|
return render_template("settings/advanced.html", v=v)
|
||||||
|
|
||||||
@app.post("/settings/name_change")
|
@app.post("/settings/name_change")
|
||||||
@limiter.limit("1/second;30/minute;200/hour;1000/day")
|
@limiter.limit("1/second;30/minute;200/hour;1000/day")
|
||||||
|
@ -629,12 +629,12 @@ def settings_name_change(v):
|
||||||
new_name=request.values.get("name").strip()
|
new_name=request.values.get("name").strip()
|
||||||
|
|
||||||
if new_name==v.username:
|
if new_name==v.username:
|
||||||
return render_template("settings_personal.html",
|
return render_template("settings/personal.html",
|
||||||
v=v,
|
v=v,
|
||||||
error="You didn't change anything")
|
error="You didn't change anything")
|
||||||
|
|
||||||
if not valid_username_regex.fullmatch(new_name):
|
if not valid_username_regex.fullmatch(new_name):
|
||||||
return render_template("settings_personal.html",
|
return render_template("settings/personal.html",
|
||||||
v=v,
|
v=v,
|
||||||
error="This isn't a valid username.")
|
error="This isn't a valid username.")
|
||||||
|
|
||||||
|
@ -648,7 +648,7 @@ def settings_name_change(v):
|
||||||
).one_or_none()
|
).one_or_none()
|
||||||
|
|
||||||
if x and x.id != v.id:
|
if x and x.id != v.id:
|
||||||
return render_template("settings_personal.html",
|
return render_template("settings/personal.html",
|
||||||
v=v,
|
v=v,
|
||||||
error=f"Username `{new_name}` is already in use.")
|
error=f"Username `{new_name}` is already in use.")
|
||||||
|
|
||||||
|
@ -667,7 +667,7 @@ def settings_name_change(v):
|
||||||
def settings_song_change_mp3(v):
|
def settings_song_change_mp3(v):
|
||||||
file = request.files['file']
|
file = request.files['file']
|
||||||
if file.content_type != 'audio/mpeg':
|
if file.content_type != 'audio/mpeg':
|
||||||
return render_template("settings_personal.html", v=v, error="Not a valid MP3 file")
|
return render_template("settings/personal.html", v=v, error="Not a valid MP3 file")
|
||||||
|
|
||||||
song = str(time.time()).replace('.','')
|
song = str(time.time()).replace('.','')
|
||||||
|
|
||||||
|
@ -677,7 +677,7 @@ def settings_song_change_mp3(v):
|
||||||
size = os.stat(name).st_size
|
size = os.stat(name).st_size
|
||||||
if size > 8 * 1024 * 1024:
|
if size > 8 * 1024 * 1024:
|
||||||
os.remove(name)
|
os.remove(name)
|
||||||
return render_template("settings_personal.html", v=v, error="MP3 file must be smaller than 8MB")
|
return render_template("settings/personal.html", v=v, error="MP3 file must be smaller than 8MB")
|
||||||
|
|
||||||
if path.isfile(f"/songs/{v.song}.mp3") and g.db.query(User).filter_by(song=v.song).count() == 1:
|
if path.isfile(f"/songs/{v.song}.mp3") and g.db.query(User).filter_by(song=v.song).count() == 1:
|
||||||
os.remove(f"/songs/{v.song}.mp3")
|
os.remove(f"/songs/{v.song}.mp3")
|
||||||
|
@ -708,7 +708,7 @@ def settings_song_change(v):
|
||||||
elif song.startswith("https://youtu.be/"):
|
elif song.startswith("https://youtu.be/"):
|
||||||
id = song.split("https://youtu.be/")[1]
|
id = song.split("https://youtu.be/")[1]
|
||||||
else:
|
else:
|
||||||
return render_template("settings_personal.html", v=v, error="Not a youtube link.")
|
return render_template("settings/personal.html", v=v, error="Not a youtube link.")
|
||||||
|
|
||||||
if "?" in id: id = id.split("?")[0]
|
if "?" in id: id = id.split("?")[0]
|
||||||
if "&" in id: id = id.split("&")[0]
|
if "&" in id: id = id.split("&")[0]
|
||||||
|
@ -722,15 +722,15 @@ def settings_song_change(v):
|
||||||
req = requests.get(f"https://www.googleapis.com/youtube/v3/videos?id={id}&key={YOUTUBE_KEY}&part=contentDetails", timeout=5).json()
|
req = requests.get(f"https://www.googleapis.com/youtube/v3/videos?id={id}&key={YOUTUBE_KEY}&part=contentDetails", timeout=5).json()
|
||||||
duration = req['items'][0]['contentDetails']['duration']
|
duration = req['items'][0]['contentDetails']['duration']
|
||||||
if duration == 'P0D':
|
if duration == 'P0D':
|
||||||
return render_template("settings_personal.html", v=v, error="Can't use a live youtube video!")
|
return render_template("settings/personal.html", v=v, error="Can't use a live youtube video!")
|
||||||
|
|
||||||
if "H" in duration:
|
if "H" in duration:
|
||||||
return render_template("settings_personal.html", v=v, error="Duration of the video must not exceed 15 minutes.")
|
return render_template("settings/personal.html", v=v, error="Duration of the video must not exceed 15 minutes.")
|
||||||
|
|
||||||
if "M" in duration:
|
if "M" in duration:
|
||||||
duration = int(duration.split("PT")[1].split("M")[0])
|
duration = int(duration.split("PT")[1].split("M")[0])
|
||||||
if duration > 15:
|
if duration > 15:
|
||||||
return render_template("settings_personal.html", v=v, error="Duration of the video must not exceed 15 minutes.")
|
return render_template("settings/personal.html", v=v, error="Duration of the video must not exceed 15 minutes.")
|
||||||
|
|
||||||
|
|
||||||
if v.song and path.isfile(f"/songs/{v.song}.mp3") and g.db.query(User).filter_by(song=v.song).count() == 1:
|
if v.song and path.isfile(f"/songs/{v.song}.mp3") and g.db.query(User).filter_by(song=v.song).count() == 1:
|
||||||
|
@ -750,7 +750,7 @@ def settings_song_change(v):
|
||||||
try: ydl.download([f"https://youtube.com/watch?v={id}"])
|
try: ydl.download([f"https://youtube.com/watch?v={id}"])
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(e, flush=True)
|
print(e, flush=True)
|
||||||
return render_template("settings_personal.html",
|
return render_template("settings/personal.html",
|
||||||
v=v,
|
v=v,
|
||||||
error="Age-restricted videos aren't allowed.")
|
error="Age-restricted videos aren't allowed.")
|
||||||
|
|
||||||
|
@ -772,13 +772,13 @@ def settings_title_change(v):
|
||||||
|
|
||||||
customtitleplain = sanitize_settings_text(request.values.get("title"), 100)
|
customtitleplain = sanitize_settings_text(request.values.get("title"), 100)
|
||||||
if customtitleplain == v.customtitleplain:
|
if customtitleplain == v.customtitleplain:
|
||||||
return render_template("settings_personal.html", v=v, error="You didn't change anything")
|
return render_template("settings/personal.html", v=v, error="You didn't change anything")
|
||||||
|
|
||||||
customtitle = filter_emojis_only(customtitleplain)
|
customtitle = filter_emojis_only(customtitleplain)
|
||||||
customtitle = censor_slurs(customtitle, None)
|
customtitle = censor_slurs(customtitle, None)
|
||||||
|
|
||||||
if len(customtitle) > 1000:
|
if len(customtitle) > 1000:
|
||||||
return render_template("settings_personal.html", v=v, error="Flair too long!")
|
return render_template("settings/personal.html", v=v, error="Flair too long!")
|
||||||
|
|
||||||
v.customtitleplain = customtitleplain
|
v.customtitleplain = customtitleplain
|
||||||
v.customtitle = customtitle
|
v.customtitle = customtitle
|
||||||
|
@ -796,13 +796,13 @@ def settings_pronouns_change(v):
|
||||||
pronouns = sanitize_settings_text(request.values.get("pronouns"))
|
pronouns = sanitize_settings_text(request.values.get("pronouns"))
|
||||||
|
|
||||||
if len(pronouns) > 11:
|
if len(pronouns) > 11:
|
||||||
return render_template("settings_personal.html", v=v, error="Your pronouns exceed the character limit (11 characters)")
|
return render_template("settings/personal.html", v=v, error="Your pronouns exceed the character limit (11 characters)")
|
||||||
|
|
||||||
if pronouns == v.pronouns:
|
if pronouns == v.pronouns:
|
||||||
return render_template("settings_personal.html", v=v, error="You didn't change anything.")
|
return render_template("settings/personal.html", v=v, error="You didn't change anything.")
|
||||||
|
|
||||||
if not pronouns_regex.fullmatch(pronouns):
|
if not pronouns_regex.fullmatch(pronouns):
|
||||||
return render_template("settings_personal.html", v=v, error="The pronouns you entered don't match the required format.")
|
return render_template("settings/personal.html", v=v, error="The pronouns you entered don't match the required format.")
|
||||||
|
|
||||||
bare_pronouns = pronouns.lower().replace('/', '')
|
bare_pronouns = pronouns.lower().replace('/', '')
|
||||||
if 'nig' in bare_pronouns: pronouns = 'BI/POC'
|
if 'nig' in bare_pronouns: pronouns = 'BI/POC'
|
||||||
|
@ -822,7 +822,7 @@ def settings_checkmark_text(v):
|
||||||
if not v.verified: abort(403)
|
if not v.verified: abort(403)
|
||||||
new_name = sanitize_settings_text(request.values.get("checkmark-text"), 100)
|
new_name = sanitize_settings_text(request.values.get("checkmark-text"), 100)
|
||||||
if not new_name: abort(400)
|
if not new_name: abort(400)
|
||||||
if new_name == v.verified: return render_template("settings_personal.html", v=v, error="You didn't change anything")
|
if new_name == v.verified: return render_template("settings/personal.html", v=v, error="You didn't change anything")
|
||||||
v.verified = new_name
|
v.verified = new_name
|
||||||
g.db.add(v)
|
g.db.add(v)
|
||||||
return redirect("/settings/personal")
|
return redirect("/settings/personal")
|
||||||
|
|
|
@ -55,25 +55,25 @@ def upvoters_downvoters(v, username, uid, cls, vote_cls, vote_dir, template, sta
|
||||||
@app.get("/@<username>/upvoters/<uid>/posts")
|
@app.get("/@<username>/upvoters/<uid>/posts")
|
||||||
@auth_required
|
@auth_required
|
||||||
def upvoters_posts(v, username, uid):
|
def upvoters_posts(v, username, uid):
|
||||||
return upvoters_downvoters(v, username, uid, Submission, Vote, 1, "voted_posts.html", None)
|
return upvoters_downvoters(v, username, uid, Submission, Vote, 1, "userpage/voted_posts.html", None)
|
||||||
|
|
||||||
|
|
||||||
@app.get("/@<username>/upvoters/<uid>/comments")
|
@app.get("/@<username>/upvoters/<uid>/comments")
|
||||||
@auth_required
|
@auth_required
|
||||||
def upvoters_comments(v, username, uid):
|
def upvoters_comments(v, username, uid):
|
||||||
return upvoters_downvoters(v, username, uid, Comment, CommentVote, 1, "voted_comments.html", True)
|
return upvoters_downvoters(v, username, uid, Comment, CommentVote, 1, "userpage/voted_comments.html", True)
|
||||||
|
|
||||||
|
|
||||||
@app.get("/@<username>/downvoters/<uid>/posts")
|
@app.get("/@<username>/downvoters/<uid>/posts")
|
||||||
@auth_required
|
@auth_required
|
||||||
def downvoters_posts(v, username, uid):
|
def downvoters_posts(v, username, uid):
|
||||||
return upvoters_downvoters(v, username, uid, Submission, Vote, -1, "voted_posts.html", None)
|
return upvoters_downvoters(v, username, uid, Submission, Vote, -1, "userpage/voted_posts.html", None)
|
||||||
|
|
||||||
|
|
||||||
@app.get("/@<username>/downvoters/<uid>/comments")
|
@app.get("/@<username>/downvoters/<uid>/comments")
|
||||||
@auth_required
|
@auth_required
|
||||||
def downvoters_comments(v, username, uid):
|
def downvoters_comments(v, username, uid):
|
||||||
return upvoters_downvoters(v, username, uid, Comment, CommentVote, -1, "voted_comments.html", True)
|
return upvoters_downvoters(v, username, uid, Comment, CommentVote, -1, "userpage/voted_comments.html", True)
|
||||||
|
|
||||||
def upvoting_downvoting(v, username, uid, cls, vote_cls, vote_dir, template, standalone):
|
def upvoting_downvoting(v, username, uid, cls, vote_cls, vote_dir, template, standalone):
|
||||||
u = get_user(username, v=v, include_shadowbanned=False)
|
u = get_user(username, v=v, include_shadowbanned=False)
|
||||||
|
@ -106,25 +106,25 @@ def upvoting_downvoting(v, username, uid, cls, vote_cls, vote_dir, template, sta
|
||||||
@app.get("/@<username>/upvoting/<uid>/posts")
|
@app.get("/@<username>/upvoting/<uid>/posts")
|
||||||
@auth_required
|
@auth_required
|
||||||
def upvoting_posts(v, username, uid):
|
def upvoting_posts(v, username, uid):
|
||||||
return upvoting_downvoting(v, username, uid, Submission, Vote, 1, "voted_posts.html", None)
|
return upvoting_downvoting(v, username, uid, Submission, Vote, 1, "userpage/voted_posts.html", None)
|
||||||
|
|
||||||
|
|
||||||
@app.get("/@<username>/upvoting/<uid>/comments")
|
@app.get("/@<username>/upvoting/<uid>/comments")
|
||||||
@auth_required
|
@auth_required
|
||||||
def upvoting_comments(v, username, uid):
|
def upvoting_comments(v, username, uid):
|
||||||
return upvoting_downvoting(v, username, uid, Comment, CommentVote, 1, "voted_comments.html", True)
|
return upvoting_downvoting(v, username, uid, Comment, CommentVote, 1, "userpage/voted_comments.html", True)
|
||||||
|
|
||||||
|
|
||||||
@app.get("/@<username>/downvoting/<uid>/posts")
|
@app.get("/@<username>/downvoting/<uid>/posts")
|
||||||
@auth_required
|
@auth_required
|
||||||
def downvoting_posts(v, username, uid):
|
def downvoting_posts(v, username, uid):
|
||||||
return upvoting_downvoting(v, username, uid, Submission, Vote, -1, "voted_posts.html", None)
|
return upvoting_downvoting(v, username, uid, Submission, Vote, -1, "userpage/voted_posts.html", None)
|
||||||
|
|
||||||
|
|
||||||
@app.get("/@<username>/downvoting/<uid>/comments")
|
@app.get("/@<username>/downvoting/<uid>/comments")
|
||||||
@auth_required
|
@auth_required
|
||||||
def downvoting_comments(v, username, uid):
|
def downvoting_comments(v, username, uid):
|
||||||
return upvoting_downvoting(v, username, uid, Comment, CommentVote, -1, "voted_comments.html", True)
|
return upvoting_downvoting(v, username, uid, Comment, CommentVote, -1, "userpage/voted_comments.html", True)
|
||||||
|
|
||||||
def user_voted(v, username, cls, vote_cls, vote_dir, template, standalone):
|
def user_voted(v, username, cls, vote_cls, vote_dir, template, standalone):
|
||||||
u = get_user(username, v=v, include_shadowbanned=False)
|
u = get_user(username, v=v, include_shadowbanned=False)
|
||||||
|
@ -158,13 +158,13 @@ def user_voted(v, username, cls, vote_cls, vote_dir, template, standalone):
|
||||||
@app.get("/@<username>/upvoted/posts")
|
@app.get("/@<username>/upvoted/posts")
|
||||||
@auth_required
|
@auth_required
|
||||||
def user_upvoted_posts(v, username):
|
def user_upvoted_posts(v, username):
|
||||||
return user_voted(v, username, Submission, Vote, 1, "voted_posts.html", None)
|
return user_voted(v, username, Submission, Vote, 1, "userpage/voted_posts.html", None)
|
||||||
|
|
||||||
|
|
||||||
@app.get("/@<username>/upvoted/comments")
|
@app.get("/@<username>/upvoted/comments")
|
||||||
@auth_required
|
@auth_required
|
||||||
def user_upvoted_comments(v, username):
|
def user_upvoted_comments(v, username):
|
||||||
return user_voted(v, username, Comment, CommentVote, 1, "voted_comments.html", True)
|
return user_voted(v, username, Comment, CommentVote, 1, "userpage/voted_comments.html", True)
|
||||||
|
|
||||||
|
|
||||||
@app.get("/grassed")
|
@app.get("/grassed")
|
||||||
|
@ -228,7 +228,7 @@ def all_upvoters_downvoters(v, username, vote_dir, is_who_simps_hates):
|
||||||
|
|
||||||
name2 = f'Who @{username} {simps_haters}' if is_who_simps_hates else f'@{username} biggest {simps_haters}'
|
name2 = f'Who @{username} {simps_haters}' if is_who_simps_hates else f'@{username} biggest {simps_haters}'
|
||||||
|
|
||||||
return render_template("voters.html", v=v, users=users[:PAGE_SIZE], pos=pos, name=vote_name, name2=name2, total=total)
|
return render_template("userpage/voters.html", v=v, users=users[:PAGE_SIZE], pos=pos, name=vote_name, name2=name2, total=total)
|
||||||
|
|
||||||
@app.get("/@<username>/upvoters")
|
@app.get("/@<username>/upvoters")
|
||||||
@auth_required
|
@auth_required
|
||||||
|
@ -631,7 +631,7 @@ def followers(username, v):
|
||||||
users = g.db.query(Follow, User).join(Follow, Follow.target_id == u.id) \
|
users = g.db.query(Follow, User).join(Follow, Follow.target_id == u.id) \
|
||||||
.filter(Follow.user_id == User.id) \
|
.filter(Follow.user_id == User.id) \
|
||||||
.order_by(Follow.created_utc).all()
|
.order_by(Follow.created_utc).all()
|
||||||
return render_template("followers.html", v=v, u=u, users=users)
|
return render_template("userpage/followers.html", v=v, u=u, users=users)
|
||||||
|
|
||||||
@app.get("/@<username>/blockers")
|
@app.get("/@<username>/blockers")
|
||||||
@auth_required
|
@auth_required
|
||||||
|
@ -641,7 +641,7 @@ def blockers(username, v):
|
||||||
users = g.db.query(UserBlock, User).join(UserBlock, UserBlock.target_id == u.id) \
|
users = g.db.query(UserBlock, User).join(UserBlock, UserBlock.target_id == u.id) \
|
||||||
.filter(UserBlock.user_id == User.id) \
|
.filter(UserBlock.user_id == User.id) \
|
||||||
.order_by(UserBlock.created_utc).all()
|
.order_by(UserBlock.created_utc).all()
|
||||||
return render_template("blockers.html", v=v, u=u, users=users)
|
return render_template("userpage/blockers.html", v=v, u=u, users=users)
|
||||||
|
|
||||||
@app.get("/@<username>/following")
|
@app.get("/@<username>/following")
|
||||||
@auth_required
|
@auth_required
|
||||||
|
@ -653,7 +653,7 @@ def following(username, v):
|
||||||
users = g.db.query(User).join(Follow, Follow.user_id == u.id) \
|
users = g.db.query(User).join(Follow, Follow.user_id == u.id) \
|
||||||
.filter(Follow.target_id == User.id) \
|
.filter(Follow.target_id == User.id) \
|
||||||
.order_by(Follow.created_utc).all()
|
.order_by(Follow.created_utc).all()
|
||||||
return render_template("following.html", v=v, u=u, users=users)
|
return render_template("userpage/following.html", v=v, u=u, users=users)
|
||||||
|
|
||||||
@app.get("/views")
|
@app.get("/views")
|
||||||
@auth_required
|
@auth_required
|
||||||
|
@ -661,7 +661,7 @@ def visitors(v):
|
||||||
if not v.viewers_recorded:
|
if not v.viewers_recorded:
|
||||||
return render_template("errors/patron.html", v=v)
|
return render_template("errors/patron.html", v=v)
|
||||||
viewers=sorted(v.viewers, key = lambda x: x.last_view_utc, reverse=True)
|
viewers=sorted(v.viewers, key = lambda x: x.last_view_utc, reverse=True)
|
||||||
return render_template("viewers.html", v=v, viewers=viewers)
|
return render_template("userpage/viewers.html", v=v, viewers=viewers)
|
||||||
|
|
||||||
|
|
||||||
@app.get("/@<username>")
|
@app.get("/@<username>")
|
||||||
|
@ -687,13 +687,13 @@ def u_username(username, v=None):
|
||||||
if not u.is_visible_to(v):
|
if not u.is_visible_to(v):
|
||||||
if g.is_api_or_xhr or request.path.endswith(".json"):
|
if g.is_api_or_xhr or request.path.endswith(".json"):
|
||||||
abort(403, "This userpage is private")
|
abort(403, "This userpage is private")
|
||||||
return render_template("userpage_private.html", u=u, v=v, is_following=is_following), 403
|
return render_template("userpage/private.html", u=u, v=v, is_following=is_following), 403
|
||||||
|
|
||||||
|
|
||||||
if v and hasattr(u, 'is_blocking') and u.is_blocking:
|
if v and hasattr(u, 'is_blocking') and u.is_blocking:
|
||||||
if g.is_api_or_xhr or request.path.endswith(".json"):
|
if g.is_api_or_xhr or request.path.endswith(".json"):
|
||||||
abort(403, f"You are blocking @{u.username}.")
|
abort(403, f"You are blocking @{u.username}.")
|
||||||
return render_template("userpage_blocking.html", u=u, v=v), 403
|
return render_template("userpage/blocking.html", u=u, v=v), 403
|
||||||
|
|
||||||
|
|
||||||
sort = request.values.get("sort", "new")
|
sort = request.values.get("sort", "new")
|
||||||
|
@ -756,12 +756,12 @@ def u_username_comments(username, v=None):
|
||||||
if not u.is_visible_to(v):
|
if not u.is_visible_to(v):
|
||||||
if g.is_api_or_xhr or request.path.endswith(".json"):
|
if g.is_api_or_xhr or request.path.endswith(".json"):
|
||||||
abort(403, "This userpage is private")
|
abort(403, "This userpage is private")
|
||||||
return render_template("userpage_private.html", u=u, v=v, is_following=is_following), 403
|
return render_template("userpage/private.html", u=u, v=v, is_following=is_following), 403
|
||||||
|
|
||||||
if v and hasattr(u, 'is_blocking') and u.is_blocking:
|
if v and hasattr(u, 'is_blocking') and u.is_blocking:
|
||||||
if g.is_api_or_xhr or request.path.endswith(".json"):
|
if g.is_api_or_xhr or request.path.endswith(".json"):
|
||||||
abort(403, f"You are blocking @{u.username}.")
|
abort(403, f"You are blocking @{u.username}.")
|
||||||
return render_template("userpage_blocking.html", u=u, v=v), 403
|
return render_template("userpage/blocking.html", u=u, v=v), 403
|
||||||
|
|
||||||
try: page = max(int(request.values.get("page", "1")), 1)
|
try: page = max(int(request.values.get("page", "1")), 1)
|
||||||
except: page = 1
|
except: page = 1
|
||||||
|
@ -801,7 +801,7 @@ def u_username_comments(username, v=None):
|
||||||
if (v and v.client) or request.path.endswith(".json"):
|
if (v and v.client) or request.path.endswith(".json"):
|
||||||
return {"data": [c.json for c in listing]}
|
return {"data": [c.json for c in listing]}
|
||||||
|
|
||||||
return render_template("userpage_comments.html", u=u, v=v, listing=listing, page=page, sort=sort, t=t,next_exists=next_exists, is_following=is_following, standalone=True)
|
return render_template("userpage/comments.html", u=u, v=v, listing=listing, page=page, sort=sort, t=t,next_exists=next_exists, is_following=is_following, standalone=True)
|
||||||
|
|
||||||
|
|
||||||
@app.get("/@<username>/info")
|
@app.get("/@<username>/info")
|
||||||
|
@ -969,7 +969,7 @@ def saved_comments(v, username):
|
||||||
try: page = max(1, int(request.values.get("page", 1)))
|
try: page = max(1, int(request.values.get("page", 1)))
|
||||||
except: abort(400, "Invalid page input!")
|
except: abort(400, "Invalid page input!")
|
||||||
|
|
||||||
return get_saves_and_subscribes(v, "userpage_comments.html", CommentSaveRelationship, page, True)
|
return get_saves_and_subscribes(v, "userpage/comments.html", CommentSaveRelationship, page, True)
|
||||||
|
|
||||||
@app.get("/@<username>/subscribed/posts")
|
@app.get("/@<username>/subscribed/posts")
|
||||||
@auth_required
|
@auth_required
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{% extends "settings.html" %}
|
{% extends "settings.html" %}
|
||||||
{% block pagetitle %}Advanced Settings - {{SITE_NAME}}{% endblock %}
|
{% block pagetitle %}Advanced Settings - {{SITE_NAME}}{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% import 'settings_common.html' as common with context %}
|
{% import 'settings/common.html' as common with context %}
|
||||||
<div class="row settings-page" id="settings-page-advanced">
|
<div class="row settings-page" id="settings-page-advanced">
|
||||||
<div class="col col-lg-8">
|
<div class="col col-lg-8">
|
||||||
<div class="settings">
|
<div class="settings">
|
|
@ -1,6 +1,6 @@
|
||||||
{% extends "settings.html" %}
|
{% extends "settings.html" %}
|
||||||
{% block pagetitle %}Personal Settings - {{SITE_NAME}}{% endblock %}
|
{% block pagetitle %}Personal Settings - {{SITE_NAME}}{% endblock %}
|
||||||
{% import 'settings_common.html' as common with context %}
|
{% import 'settings/common.html' as common with context %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<style>
|
<style>
|
||||||
.bg-image {
|
.bg-image {
|
|
@ -29,7 +29,7 @@
|
||||||
<meta name="twitter:url" content="{{u.url}}">
|
<meta name="twitter:url" content="{{u.url}}">
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% import 'userpage_admintools.html' as userpage_admintools with context %}
|
{% import 'userpage/admintools.html' as userpage_admintools with context %}
|
||||||
{% set hats_total = u.hats_owned_proportion_display[1] if u else 0 %}
|
{% set hats_total = u.hats_owned_proportion_display[1] if u else 0 %}
|
||||||
{% set hats_owned_percent = u.hats_owned_proportion_display[0] if u else '' %}
|
{% set hats_owned_percent = u.hats_owned_proportion_display[0] if u else '' %}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue