version, added sort of users with matching languages for learnd and interests

This commit is contained in:
ProgramSnail 2021-05-09 13:25:01 +03:00
parent 68a3b3ca1e
commit aa829a984e
5 changed files with 191 additions and 95 deletions

BIN
app.db Normal file

Binary file not shown.

102
app.py
View file

@ -9,13 +9,45 @@ app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
app.secret_key = "SAFmdsdDkSukyuDd" app.secret_key = "SAFmdsdDkSukyuDd"
db = SQLAlchemy(app) db = SQLAlchemy(app)
MAX_NAME_LENGTH = 30
MAX_PASSWORD_LENGTH = 30
MAX_PARAM_LENGTH = 30
NONE_VALUE = "None"
class UserData(db.Model):
id = db.Column(db.Integer, primary_key = True)
name = db.Column(db.String(MAX_NAME_LENGTH), unique=True, nullable=False)
password = db.Column(db.String(MAX_PASSWORD_LENGTH), nullable=False)
interest1 = db.Column(db.String(MAX_PARAM_LENGTH), nullable=False)
interest2 = db.Column(db.String(MAX_PARAM_LENGTH), nullable=False)
interest3 = db.Column(db.String(MAX_PARAM_LENGTH), nullable=False)
usr_lang = db.Column(db.String(MAX_PARAM_LENGTH), nullable=False)
foreign_lang = db.Column(db.String(MAX_PARAM_LENGTH), nullable=False)
# add password hash instead of password
db.create_all()
@app.route("/", methods=["POST", "GET"]) @app.route("/", methods=["POST", "GET"])
def login(): def login():
if request.method == "POST": if request.method == "POST":
name = request.form["name"] name = request.form["name"]
password = request.form["password"] password = request.form["password"]
if UserData.query.filter_by(name=name).count() == 0:
db.session.add(UserData(name=name, password=password,
interest1=NONE_VALUE, interest2=NONE_VALUE, interest3=NONE_VALUE,
usr_lang=NONE_VALUE, foreign_lang=NONE_VALUE))
db.session.commit()
print("Added user " + name)
elif UserData.query.filter_by(name=name).first().password != password:
print("Wrong password") # later - popup
return render_template("login.html", form_msg="Wrong password")
session["user_name"] = name session["user_name"] = name
session["user_password"] = password session["user_password"] = password
if len(name) >= MAX_NAME_LENGTH and len(password) >= MAX_PASSWORD_LENGTH:
print("Too long name / password") # later - popup
return render_template("login.html", form_msg="Too long name / password")
return redirect(url_for("user_page", user_name=name)) return redirect(url_for("user_page", user_name=name))
else: else:
if "user_name" in session: if "user_name" in session:
@ -23,8 +55,74 @@ def login():
return render_template("login.html") return render_template("login.html")
@app.route("/<user_name>") def create_interests_list(usr):
a = []
if usr.interest1 != NONE_VALUE:
a.append(usr.interest1)
if usr.interest2 != NONE_VALUE:
a.append(usr.interest2)
if usr.interest3 != NONE_VALUE:
a.append(usr.interest3)
return a
def get_matching_users(usr):
users = []
if usr.usr_lang != NONE_VALUE and usr.foreign_lang != NONE_VALUE:
users = UserData.query.filter_by(usr_lang=usr.foreign_lang) \
.filter_by(foreign_lang=usr.usr_lang).all()
else:
users = UserData.query.all()
matching_list = []
a = create_interests_list(usr)
for user in users:
if user == usr:
continue
b = create_interests_list(user)
match = False
same_interest = ""
for x in a:
for y in b:
if x == y:
match = True
same_interest = x
break
if match:
break
if match:
matching_list.append([user.name, same_interest])
return matching_list
@app.route("/<user_name>", methods=["GET", "POST"])
def user_page(user_name): def user_page(user_name):
if not "user_name" in session: if not "user_name" in session:
return redirect(url_for("login")) return redirect(url_for("login"))
return render_template("user_page.html") usr = UserData.query.filter_by(name=user_name).first()
form_msg = ""
if request.method == "POST":
param_str = request.form["param-str"]
if len(param_str) >= MAX_PARAM_LENGTH:
print("Too long text")
form_msg = "Too long text"
elif len(param_str) == 0:
print("No text")
form_msg = "No text"
else:
param_id = request.form["param-id"]
if param_id == "i1":
usr.interest1 = param_str
elif param_id == "i2":
usr.interest2 = param_str
elif param_id == "i3":
usr.interest3 = param_str
elif param_id == "usr-lang":
usr.usr_lang = param_str
elif param_id == "foreign-lang":
usr.foreign_lang = param_str
db.session.commit()
return redirect(url_for("user_page", user_name=user_name))
return render_template("user_page.html", user_name=user_name,
interest1=usr.interest1, interest2=usr.interest2,
interest3=usr.interest3, form_msg=form_msg,
user_language=usr.usr_lang, foreign_language=usr.foreign_lang,
matching_users=get_matching_users(usr)) # not efficient

20
templates/base.html Normal file
View file

@ -0,0 +1,20 @@
<!DOCTYPE html>
<html>
<head>
<title>Language Learner</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/static/w3.css">
<link rel="stylesheet" href="/static/fontawesome/css/all.css">
</head>
<body>
<header class="w3-container w3-dark-gray">
<h1><i class="fas fa-dice-d20"></i> Language Learner</h1>
</header>
<div class="w3-container w3-margin">
{% block content %}{% endblock %}
</div>
<footer class="w3-container w3-light-gray w3-center">
<label>my app (2021)</label>
</footer>
</body>
</html>

View file

@ -1,19 +1,9 @@
<!DOCTYPE html> {% extends "base.html" %}
<html> {% block content %}
<head>
<title>Language Learner</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/static/w3.css">
<link rel="stylesheet" href="/static/fontawesome/css/all.css">
</head>
<body>
<header class="w3-container w3-dark-gray">
<h1><i class="fas fa-dice-d20"></i> Language Learner</h1>
</header>
<div class="w3-container w3-margin">
<div class="w3-container w3-third"></div> <div class="w3-container w3-third"></div>
<div class="w3-panel w3-card w3-third"> <div class="w3-panel w3-card w3-third w3-center">
<form method="POST" action="" class="w3-container w3-margin w3-center"> <label class="w3-text-red w3-container">{{ form_msg }}</label>
<form method="POST" action="" class="w3-container w3-margin">
<h2>Log in / Sign up</h2> <h2>Log in / Sign up</h2>
<label>Name</label> <label>Name</label>
<input class="w3-input w3-section" type="text" <input class="w3-input w3-section" type="text"
@ -25,9 +15,4 @@
</form> </form>
</div> </div>
<div class="w3-container w3-third"></div> <div class="w3-container w3-third"></div>
</div> {% endblock %}
<footer class="w3-container w3-light-gray">
<label class="w3-center">My app.</label>
</footer>
</body>
</html>

View file

@ -1,60 +1,53 @@
<!DOCTYPE html> {% extends "base.html" %}
<html> {% block content %}
<head>
<title>Language Learner</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/static/w3.css">
<link rel="stylesheet" href="/static/fontawesome/css/all.css">
</head>
<body>
<header class="w3-container w3-dark-gray">
<h1><i class="fas fa-dice-d20"></i> Language Learner</h1>
</header>
<div class="w3-container w3-margin">
<div class="w3-panel w3-card w3-third w3-margin"> <div class="w3-panel w3-card w3-third w3-margin">
<img src="/static/images/default_avatar.png" class="w3-circle w3-margin" style="width: 60%" alt="avatar"> <img src="/static/images/default_avatar.png" class="w3-circle w3-margin" style="width: 60%" alt="avatar">
<h1>User Name</h1> <h1>{{ user_name }}</h1>
<b>Languages:</b>
<p> {{ user_language }} -> {{ foreign_language }}</p>
<b>Interests:</b> <b>Interests:</b>
<ul class="w3-ul"> <ul class="w3-ul">
<li>Football</li> <li>{{ interest1 }}</li>
<li>Programming</li> <li>{{ interest2 }}</li>
<li>Something</li> <li>{{ interest3 }}</li>
</ul> </ul>
</div>
<div class="w3-card w3-panel w3-margin w3-third w3-padding-large">
<form method="POST" action="" style="width: 100%" <form method="POST" action="" style="width: 100%"
class="w3-card w3-section w3-padding-small w3-center"> class="w3-card w3-section w3-padding-small w3-center">
<input type="text" name="interest" plaseholder="Your interest"> <input type="text" name="param-str" placeholder="Type here" required>
<input class="w3-button w3-ripple w3-green" type="submit" value="Submit"> <input class="w3-button w3-ripple w3-green" type="submit" value="Submit">
<p>
<input class="w3-radio" type="radio" name="param-id" value="i1" checked>
<label>Change First Interest</label>
</p>
<p>
<input class="w3-radio" type="radio" name="param-id" value="i2">
<label>Change Second Interest</label>
</p>
<p>
<input class="w3-radio" type="radio" name="param-id" value="i3">
<label>Change Third Interest</label>
</p>
<p>
<input class="w3-radio" type="radio" name="param-id" value="usr-lang">
<label>Change Your Language</label>
</p>
<p>
<input class="w3-radio" type="radio" name="param-id" value="foreign-lang">
<label>Change Foreign Language</label>
</p>
</form> </form>
<ul class="w3-ul w3-border" style="width: 100%"> <label class="w3-text-red w3-container w3-center">{{ form_msg }}</label>
<li>
<label>Interest 1</label>
</li>
<li>
<label>Interest 2</label>
</li>
<li>
<label>Interest 3</label>
</li>
</ul>
</div> </div>
<div class="w3-panel w3-margin w3-third"> <div class="w3-panel w3-margin w3-third">
<ul class="w3-ul w3-card" style="width: 100%"> <ul class="w3-ul w3-card" style="width: 100%">
{% for usr in matching_users %}
<li> <li>
<label>User 1</label> <h2><b><i class="fas fa-user"></i> {{ usr[0] }}</b></h2>
</li> <p>
<li> Same interest - {{ usr[1] }}
<label>User 2</label> </p>
</li>
<li>
<label>User 3</label>
</li> </li>
{% endfor %}
</ul> </ul>
</div> </div>
</div> {% endblock %}
<footer class="w3-container w3-light-gray">
<label class="w3-center">My app.</label>
</footer>
</body>
</html>