def register(): if request.method == 'POST': # Validate kwargs = dict() followMod = request.form.get('follow-mod') email = request.form.get('email') username = request.form.get('username') password = request.form.get('password') confirmPassword = request.form.get('repeatPassword') if not email: kwargs['emailError'] = 'Email is required.' else: if not re.match(r"^[^@]+@[^@]+\.[^@]+$", email): kwargs['emailError'] = 'Please specify a valid email address.' elif db.query(User).filter(User.email == email).first(): kwargs['emailError'] = 'A user with this email already exists.' if not username: kwargs['usernameError'] = 'Username is required.' else: if not re.match(r"^[A-Za-z0-9_]+$", username): kwargs[ 'usernameError'] = 'Please only use letters, numbers, and underscores.' if len(username) < 3 or len(username) > 24: kwargs[ 'usernameError'] = 'Usernames must be between 3 and 24 characters.' if db.query(User).filter(User.username.ilike(username)).first(): kwargs['usernameError'] = 'A user by this name already exists.' if not password: kwargs['passwordError'] = 'Password is required.' else: if password != confirmPassword: kwargs['repeatPasswordError'] = 'Passwords do not match.' if len(password) < 5: kwargs[ 'passwordError'] = 'Your password must be greater than 5 characters.' if len(password) > 256: kwargs[ 'passwordError'] = 'We admire your dedication to security, but please use a shorter password.' if not kwargs == dict(): if email is not None: kwargs['email'] = email if username is not None: kwargs['username'] = username return render_template("register.html", **kwargs) # All valid, let's make them an account user = User(username, email, password) user.confirmation = binascii.b2a_hex(os.urandom(20)).decode("utf-8") db.add(user) db.commit( ) # We do this manually so that we're sure everything's hunky dory before the email leaves if followMod: send_confirmation(user, followMod) else: send_confirmation(user) return redirect("/account-pending") else: return render_template("register.html")
def register(): if request.method == 'POST': # Validate kwargs = dict() followMod = request.form.get('follow-mod') email = request.form.get('email') username = request.form.get('username') password = request.form.get('password') confirmPassword = request.form.get('repeatPassword') if not email: kwargs['emailError'] = 'Email is required.' else: if not re.match(r"^[^@]+@[^@]+\.[^@]+$", email): kwargs['emailError'] = 'Please specify a valid email address.' elif db.query(User).filter(User.email == email).first(): kwargs['emailError'] = 'A user with this email already exists.' elif _mailbans.isMailBanned(email): kwargs['emailError'] = 'This email host is banned, please use an alternative, this is to prevent botting, sorry.' if not username: kwargs['usernameError'] = 'Username is required.' else: if not re.match(r"^[A-Za-z0-9_]+$", username): kwargs['usernameError'] = 'Please only use letters, numbers, and underscores.' if len(username) < 3 or len(username) > 24: kwargs['usernameError'] = 'Usernames must be between 3 and 24 characters.' if db.query(User).filter(User.username.ilike(username)).first(): kwargs['usernameError'] = 'A user by this name already exists.' if not password: kwargs['passwordError'] = 'Password is required.' else: if password != confirmPassword: kwargs['repeatPasswordError'] = 'Passwords do not match.' if len(password) < 5: kwargs['passwordError'] = 'Your password must be greater than 5 characters.' if len(password) > 256: kwargs['passwordError'] = 'We admire your dedication to security, but please use a shorter password.' if not kwargs == dict(): if email is not None: kwargs['email'] = email if username is not None: kwargs['username'] = username return render_template("register.html", **kwargs) # All valid, let's make them an account user = User(username, email, password) user.confirmation = binascii.b2a_hex(os.urandom(20)).decode("utf-8") db.add(user) db.commit() # We do this manually so that we're sure everything's hunky dory before the email leaves if followMod: send_confirmation(user, followMod) else: send_confirmation(user) return redirect("/account-pending") else: return render_template("register.html")
def register(): if request.method == 'POST': # Validate kwargs = dict() email = request.form.get('email') username = request.form.get('username') password = request.form.get('password') confirmPassword = request.form.get('repeatPassword') if not email: kwargs['emailError'] = 'Email is required.' else: if not re.match(r"[^@]+@[^@]+\.[^@]+", email): kwargs['emailError'] = 'Please specify a valid email address.' elif db.query(User).filter(User.email == email).first(): kwargs['emailError'] = 'A user with this email already exists.' if not username: kwargs['usernameError'] = 'Username is required.' else: if not re.match(r"[A-Za-z0-9_]+", username): kwargs['usernameError'] = 'Please only use letters, numbers, and underscores.' if len(username) < 3 or len(username) > 12: kwargs['usernameError'] = 'Usernames must be between 3 and 12 characters.' if db.query(User).filter(User.username == username).first(): kwargs['usernameError'] = 'A user by this name already exists.' if not password: kwargs['passwordError'] = 'Password is required.' else: if password != confirmPassword: kwargs['repeatPasswordError'] = 'Passwords do not match.' if len(password) < 5: kwargs['passwordError'] = 'Your password must be greater than 5 characters.' if len(password) > 256: kwargs['passwordError'] = 'We admire your dedication to security, but please use a shorter password.' if not kwargs == dict(): if email is not None: kwargs['email'] = email if username is not None: kwargs['username'] = username return render_template("register.html", **kwargs) # All valid, let's make them an account user = User(username, email, password) user.confirmation = binascii.b2a_hex(os.urandom(20)).decode("utf-8") db.add(user) db.commit() send_confirmation(user) return redirect("/account-pending") else: return render_template("register.html")
def search_mods(text, page, limit): terms = text.split(' ') query = db.query(Mod).join(Mod.user).join(Mod.versions) filters = list() for term in terms: if term.startswith("ksp:"): filters.append(Mod.versions.any(ModVersion.ksp_version == term[4:])) elif term.startswith("user:"******"downloads:>"): filters.append(Mod.download_count > int(term[11:])) elif term.startswith("downloads:<"): filters.append(Mod.download_count < int(term[11:])) elif term.startswith("followers:>"): filters.append(Mod.follower_count > int(term[11:])) elif term.startswith("followers:<"): filters.append(Mod.follower_count < int(term[11:])) else: filters.append(Mod.name.ilike('%' + term + '%')) filters.append(User.username.ilike('%' + term + '%')) filters.append(Mod.short_description.ilike('%' + term + '%')) query = query.filter(or_(*filters)) query = query.filter(Mod.published == True) query = query.order_by(desc(Mod.follower_count)) # We'll do a more sophisticated narrowing down of this in a moment total = math.ceil(query.count() / limit) if page > total: page = total if page < 1: page = 1 results = sorted(query.all(), key=lambda r: weigh_result(r, terms), reverse=True) return results[(page - 1) * limit:page * limit], total
def check_email_for_registration(email): if not email: return 'Email is required.' if not re.match(r"^[^@]+@[^@]+\.[^@]+$", email): return 'Please specify a valid email address.' elif db.query(User).filter(User.email == email).first(): return 'A user with this email already exists.' return None
def typeahead_mods(text): query = db.query(Mod) filters = list() filters.append(Mod.name.ilike('%' + text + '%')) query = query.filter(or_(*filters)) query = query.filter(Mod.published == True) query = query.order_by(desc(Mod.follower_count)) # We'll do a more sophisticated narrowing down of this in a moment results = sorted(query.all(), key=lambda r: weigh_result(r, text.split(' ')), reverse=True) return results
def check_username_for_registration(username): if not username: return 'Username is required.' if not re.match(r"^[A-Za-z0-9_]+$", username): return 'Please only use letters, numbers, and underscores.' if len(username) < 3 or len(username) > 24: return 'Usernames must be between 3 and 24 characters.' if db.query(User).filter(User.username.ilike(username)).first(): return 'A user by this name already exists.' return None
def search_mods(text, page): terms = text.split(' ') query = db.query(Mod).join(Mod.user) filters = list() for term in terms: filters.append(Mod.name.ilike('%' + term + '%')) filters.append(User.username.ilike('%' + term + '%')) filters.append(Mod.description.ilike('%' + term + '%')) filters.append(Mod.short_description.ilike('%' + term + '%')) query = query.filter(or_(*filters)) query = query.filter(Mod.published == True) query = query.order_by(desc(Mod.follower_count)) # We'll do a more sophisticated narrowing down of this in a moment query = query.limit(100) results = sorted(query.all(), key=weigh_result, reverse=True) return results[page * 10:page * 10 + 10]
def search_users(text, page): terms = text.split(' ') query = db.query(User) filters = list() for term in terms: filters.append(User.username.ilike('%' + term + '%')) filters.append(User.description.ilike('%' + term + '%')) filters.append(User.forumUsername.ilike('%' + term + '%')) filters.append(User.ircNick.ilike('%' + term + '%')) filters.append(User.twitterUsername.ilike('%' + term + '%')) filters.append(User.redditUsername.ilike('%' + term + '%')) query = query.filter(or_(*filters)) query = query.filter(User.public == True) query = query.order_by(User.username) query = query.limit(100) results = query.all() return results[page * 10:page * 10 + 10]
def search_mods(text, page, limit): terms = text.split(' ') query = db.query(Mod).join(Mod.user) filters = list() for term in terms: filters.append(Mod.name.ilike('%' + term + '%')) filters.append(User.username.ilike('%' + term + '%')) filters.append(Mod.short_description.ilike('%' + term + '%')) query = query.filter(or_(*filters)) query = query.filter(Mod.published == True) query = query.order_by(desc(Mod.follower_count)) # We'll do a more sophisticated narrowing down of this in a moment total = math.ceil(query.count() / limit) if page > total: page = total if page < 1: page = 1 results = sorted(query.all(), key=lambda r: weigh_result(r, terms), reverse=True) return results[(page - 1) * limit:page * limit], total
def search_mods(ga, text, page, limit): terms = text.split(' ') query = db.query(Mod).join(Mod.user).join(Mod.versions).join(Mod.game) filters = list() for term in terms: if term.startswith("ver:"): filters.append( Mod.versions.any( ModVersion.gameversion.has( GameVersion.friendly_version == term[4:]))) elif term.startswith("user:"******"game:"): filters.append(Mod.game_id == int(term[5:])) elif term.startswith("downloads:>"): filters.append(Mod.download_count > int(term[11:])) elif term.startswith("downloads:<"): filters.append(Mod.download_count < int(term[11:])) elif term.startswith("followers:>"): filters.append(Mod.follower_count > int(term[11:])) elif term.startswith("followers:<"): filters.append(Mod.follower_count < int(term[11:])) else: filters.append(Mod.name.ilike('%' + term + '%')) filters.append(User.username.ilike('%' + term + '%')) filters.append(Mod.short_description.ilike('%' + term + '%')) if ga: query = query.filter(Mod.game_id == ga.id) query = query.filter(or_(*filters)) query = query.filter(Mod.published == True) query = query.order_by( desc(Mod.follower_count) ) # We'll do a more sophisticated narrowing down of this in a moment total = math.ceil(query.count() / limit) if page > total: page = total if page < 1: page = 1 results = sorted(query.all(), key=lambda r: weigh_result(r, terms), reverse=True) return results[(page - 1) * limit:page * limit], total
def search_mods(text, page, limit, category=None, nsfw="only", game = "all"): terms = text.split(' ') query = db.query(Mod).join(Mod.user).join(Mod.versions).join(Mod.category) if nsfw == "" or nsfw == "no" or nsfw == None: query = query.filter(Mod.nsfw == False) filters = list() filtering_by_game = False filtering_by_category = False category_filtering_by = "" game_filtering_by = "" for term in terms: if term.startswith("game:"): filtering_by_game = True game_filtering_by = term[5:] elif term.startswith("user:"******"downloads:>"): filters.append(Mod.download_count > int(term[11:])) elif term.startswith("downloads:<"): filters.append(Mod.download_count < int(term[11:])) elif term.startswith("followers:>"): filters.append(Mod.follower_count > int(term[11:])) elif term.startswith("followers:<"): filters.append(Mod.follower_count < int(term[11:])) elif term.startswith("tag:"): filters.append(Mod.tags.ilike('% ' + term[4:] + ' %')) filters.append(Mod.tags.ilike(term[4:] + ' %')) filters.append(Mod.tags.ilike(term[4:])) filters.append(Mod.tags.ilike('% ' + term[4:])) else: filters.append(Mod.name.ilike('%' + term + '%')) filters.append(User.username.ilike('%' + term + '%')) filters.append(Mod.short_description.ilike('%' + term + '%')) if nsfw == "yes": filters.append(Mod.nsfw == True) print("YESH") query = query.filter(or_(*filters)) if category != None and category != "" and category != "all": if isinstance(category, str): query = query.filter(Mod.category.has(Category.name == category)) else: query = query.filter(Mod.category.has(Category.id == category)) if(game != "all"): #Modulous games are stored as strings inside KspVersions, ¿Why? I don't know. game_version = GameVersion.query.filter(GameVersion.id == game).first() if(game_version != None): game_name = game_version.friendly_version print(game_name) query = query.filter(Mod.versions.any(ModVersion.ksp_version == game_name)) if filtering_by_game == True: query = query.filter(Mod.versions.any(ModVersion.ksp_version == game_filtering_by)) print("NSFW: " + nsfw) if nsfw == "only": query = query.filter(Mod.nsfw == True) query = query.filter(Mod.published == True) query = query.order_by(desc(Mod.follower_count)) # We'll do a more sophisticated narrowing down of this in a moment total = math.ceil(query.count() / limit) if page > total: page = total if page < 1: page = 1 results = sorted(query.all(), key=lambda r: weigh_result(r, terms), reverse=True) return results[(page - 1) * limit:page * limit], total