mirror of
https://github.com/ProgramSnail/python_web_proj_2021.git
synced 2025-12-06 02:48:41 +00:00
version, added sort of users with matching languages for learnd and interests
This commit is contained in:
parent
68a3b3ca1e
commit
aa829a984e
5 changed files with 191 additions and 95 deletions
BIN
app.db
Normal file
BIN
app.db
Normal file
Binary file not shown.
102
app.py
102
app.py
|
|
@ -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
20
templates/base.html
Normal 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>
|
||||||
|
|
@ -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>
|
|
||||||
|
|
@ -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>
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue