Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
164 commits
Select commit Hold shift + click to select a range
15d543c
Add list.html
andris9016 Feb 5, 2019
70f354d
Add gitignore
andris9016 Feb 6, 2019
9daf269
Add requiremnts.txt
andris9016 Feb 6, 2019
9fb6938
Implement server to run
andris9016 Feb 6, 2019
64fed7d
Add connection.py
andris9016 Feb 6, 2019
84584d2
Add question table to list.html
andris9016 Feb 6, 2019
0068348
Change route_list func
andris9016 Feb 6, 2019
620bcbb
Add data_manager layer
andris9016 Feb 6, 2019
e6a39b0
Add data logic from connection to data_manager
andris9016 Feb 6, 2019
5a6e612
Change formatted func
andris9016 Feb 6, 2019
53ccdb8
add questiondetails
ivanmatiz Feb 6, 2019
c25f9c2
Merge branch 'master' of https://github.com/andris9016/ask-mate-python
ivanmatiz Feb 6, 2019
6a82d2a
Add layout.html
andris9016 Feb 6, 2019
8847be3
Add layout.html and bootstrap
andris9016 Feb 6, 2019
b5664d1
Form in newquestion.html for adding a new question created
Feb 6, 2019
501e31f
add questiondetails a head
ivanmatiz Feb 6, 2019
1c53c1b
Merge branch 'master' of https://github.com/andris9016/ask-mate-python
ivanmatiz Feb 6, 2019
f36d02b
add questiondetails html and route function
ivanmatiz Feb 6, 2019
d5f72ba
Add new functions
andris9016 Feb 6, 2019
33288b4
Merge branch 'master' of github.com:andris9016/ask-mate-python
andris9016 Feb 6, 2019
5be4945
Style html files
andris9016 Feb 7, 2019
35f5ed3
add answers to questiondetails.html
ivanmatiz Feb 7, 2019
480a3ae
ID 103 user story completed, minor changes in connection and data_man…
Feb 7, 2019
4fa9401
Change label
andris9016 Feb 7, 2019
d40177a
Merge conflict
andris9016 Feb 7, 2019
5d12bed
Style the html file
andris9016 Feb 7, 2019
6bc78cf
Fix bugs
andris9016 Feb 7, 2019
6106a0f
Add get_questions func
andris9016 Feb 7, 2019
995f8ce
Change path name in get_question func
andris9016 Feb 7, 2019
08d4c72
delete utc from both utcfromtimestamp in ddata_manager.py
ivanmatiz Feb 8, 2019
2fa7a05
Refactor format_file func
andris9016 Feb 18, 2019
3ab01f7
Add get_answers func
andris9016 Feb 18, 2019
bd80c91
Add an add_answer func to data manager
andris9016 Feb 18, 2019
03018b3
Make add_question func
andris9016 Feb 18, 2019
3183cca
add sql sample data
lterray Aug 28, 2017
d8d9229
Add sql database to sample data
andris9016 Feb 18, 2019
a0fca39
Fix merge conflict
andris9016 Feb 18, 2019
4ce2b97
Add SQL database instead of csv file
andris9016 Feb 18, 2019
4199ee5
play around sample data
ivanmatiz Feb 19, 2019
4ac4c8b
fixed merge conflict
ivanmatiz Feb 19, 2019
5ba966c
Merge branch 'master' of https://github.com/andris9016/ask-mate-python
ivanmatiz Feb 19, 2019
8f895c5
Add navbar.html to templates
andris9016 Feb 19, 2019
3d89253
Fix database id-s
andris9016 Feb 19, 2019
9881f2e
Implement the navbar
andris9016 Feb 19, 2019
a71af79
Change layout
andris9016 Feb 19, 2019
f19e972
route_new_comment, add_comment, newcomment html
ivanmatiz Feb 19, 2019
144fb37
Implementing "Vote" function for questions
Feb 19, 2019
35bab4a
Correcting "Vote" function for questions
Feb 19, 2019
95bc871
Interpreting "Vote" function for answers
Feb 20, 2019
d568152
Reworked "Vote" function display
Feb 20, 2019
8bbb31e
minor correction in questiondetails.html
Feb 20, 2019
f7c9a63
all day's work disappeared, P.s. git .fuckoff
ivanmatiz Feb 20, 2019
f73b2f3
Visual update + data_manager function for reading comment table
Feb 20, 2019
14d2028
Implement search feature
andris9016 Feb 20, 2019
d37151b
Fix merge conflict
andris9016 Feb 20, 2019
c0ef788
Change datetime.now() with no microseconds
andris9016 Feb 20, 2019
c68565c
update an answer function added
jkrisz511 Feb 20, 2019
22322b1
Implement delete answer
andris9016 Feb 20, 2019
78e8dc2
Add footer to webpage
andris9016 Feb 20, 2019
8cbfa7b
Fix merg conflict Krisz
andris9016 Feb 21, 2019
a444fae
Delete footer
andris9016 Feb 21, 2019
e8a208e
ivans version
ivanmatiz Feb 21, 2019
e8c4119
fixed merge conflict, Ivan
ivanmatiz Feb 21, 2019
761fee5
Delete answer feature done
ivanmatiz Feb 21, 2019
94ec892
Change data_manager
andris9016 Feb 21, 2019
adc56d8
Fix merge conflict
andris9016 Feb 21, 2019
6f9c561
merge conflicts solved
Feb 21, 2019
ad10969
Change layout
andris9016 Feb 21, 2019
ca102ca
sort questions function added
jkrisz511 Feb 21, 2019
9a1a82c
Get Krisz changes
andris9016 Feb 21, 2019
7b52ca3
delete question b version
ivanmatiz Feb 21, 2019
03f7095
Implemented adding comment to questions and editing comment functions
Feb 21, 2019
ba3dd5c
fixing merge conflict
Feb 21, 2019
9bc3354
final
ivanmatiz Feb 22, 2019
427abe6
last last final
ivanmatiz Feb 22, 2019
a4d8a7c
Merge branch 'master' of github.com:andris9016/ask-mate-python
andris9016 Feb 22, 2019
12953d5
Merge branch 'master' of github.com:andris9016/ask-mate-python
andris9016 Feb 22, 2019
d0b9af6
Question comment buttons corrected
Feb 22, 2019
1cf3e44
Merge branch 'master' of github.com:andris9016/ask-mate-python
andris9016 Mar 4, 2019
3092b7a
Make basic login func to render login.html
andris9016 Mar 4, 2019
87c6e2a
modified sql for sprint 3 (added users table)
Mar 4, 2019
2d13842
Merge branch 'master' of github.com:andris9016/ask-mate-python
andris9016 Mar 4, 2019
955a1e6
Make register func to render the registe.html
andris9016 Mar 4, 2019
684d4c6
Add register page
andris9016 Mar 4, 2019
0c56b79
Improve register page design(add css)
andris9016 Mar 4, 2019
9b0e238
Add login page and design it aa well
andris9016 Mar 4, 2019
84af312
Chane post comment font
andris9016 Mar 4, 2019
5c053c8
Make simple user_page
andris9016 Mar 4, 2019
457fdb7
Add default user picture to profile page
andris9016 Mar 4, 2019
475cdb0
Edit question added
jkrisz511 Mar 5, 2019
d37d389
Merge branch 'develop' of https://github.com/andris9016/ask-mate-pyth…
jkrisz511 Mar 5, 2019
fb42a55
registration function implemented
Mar 5, 2019
7e3a874
Merge branch 'develop' of https://github.com/andris9016/ask-mate-pyth…
Mar 5, 2019
a3111f4
new route for the the users question
jkrisz511 Mar 5, 2019
49bc0fc
initial changes in server.py and login.html
Mar 5, 2019
60a8b1a
just commit
jkrisz511 Mar 5, 2019
a49cac5
delete question feature is done
ivanmatiz Mar 5, 2019
c7e75c3
Merge branch 'develop' of https://github.com/andris9016/ask-mate-python
ivanmatiz Mar 5, 2019
49ce057
deleted rows in data manager
ivanmatiz Mar 5, 2019
a4e644a
Merge branch 'master' into develop
ivanmatiz Mar 5, 2019
a3d73f5
checkout for correcting develop branch
Mar 5, 2019
6e7e48e
Merge remote-tracking branch 'origin' into develop
Mar 5, 2019
92427e1
users table not null issue fixed
Mar 5, 2019
d3a6708
Merge branch 'develop' of https://github.com/andris9016/ask-mate-pyth…
ivanmatiz Mar 5, 2019
93bed18
Merge branch 'master' into develop
andris9016 Mar 5, 2019
9c79cb6
merge conflict
jkrisz511 Mar 5, 2019
49a7956
Merge branch 'develop' into user_page
jkrisz511 Mar 5, 2019
6179d88
Add users list html
andris9016 Mar 5, 2019
fccf650
login function first try
Mar 5, 2019
2bbfb20
Implement users list page
andris9016 Mar 5, 2019
2588fb7
Fix merge conflict
andris9016 Mar 5, 2019
0307421
Merge conflict
andris9016 Mar 5, 2019
bd46205
acception column added to answer table in sql file
ivanmatiz Mar 5, 2019
052eec3
Fix merge conflict
andris9016 Mar 5, 2019
5daa18c
Merge branch 'develop' into user_page
andris9016 Mar 5, 2019
5032d2d
fix implemented
Mar 6, 2019
1b5fd88
Make the comments design better (not in tables)
andris9016 Mar 6, 2019
39a52c1
Merge branch 'user_page' into UI
andris9016 Mar 6, 2019
0c43920
login and registration database handling corrected
Mar 6, 2019
c4b5ba3
accepted answer feature developed for every user
ivanmatiz Mar 6, 2019
13b32c9
login implemented v1.0
Mar 6, 2019
6019103
Change question details page layout
andris9016 Mar 6, 2019
6f86da8
Make a welcome page
andris9016 Mar 6, 2019
c19d715
Welcome page implemented
andris9016 Mar 6, 2019
98d8485
login session creation and handling added, logout function implemente…
Mar 6, 2019
9c2867d
user page function works
jkrisz511 Mar 6, 2019
506fee8
merge conflict solved with origin develop branch
Mar 6, 2019
b9893b8
after merge problems solved
Mar 6, 2019
90cff1b
merge with user page
jkrisz511 Mar 6, 2019
f3f78cd
user page user check in session added
jkrisz511 Mar 6, 2019
587afc7
list questions hidden problem fixed, question bind completed
jkrisz511 Mar 7, 2019
f9d3624
answer/question button changed
jkrisz511 Mar 7, 2019
716cfe8
Delete lines
andris9016 Mar 7, 2019
cb9bf13
merge conflict solved
ivanmatiz Mar 7, 2019
6b6b274
Merge branch 'develop' of github.com:andris9016/ask-mate-python into …
andris9016 Mar 7, 2019
678340d
only logged user can modify question/answer/comment
jkrisz511 Mar 7, 2019
f4ab28c
Make comment headings look better if there is no comment
andris9016 Mar 7, 2019
22d76be
user list page connected with the profile pages
jkrisz511 Mar 7, 2019
b30ac28
Fixed merge conflict
andris9016 Mar 7, 2019
da0f8e1
new answer connected with user id
jkrisz511 Mar 7, 2019
c8df0da
accepted answer only if logged in, old vote buttons deleted
ivanmatiz Mar 7, 2019
d253e5d
Delete duplication
andris9016 Mar 7, 2019
1af4617
new comment connected with user_id
jkrisz511 Mar 7, 2019
5980a8b
login try with logged in account handled, navbar display updated corr…
Mar 7, 2019
8d086ff
Merge branch 'develop' of https://github.com/andris9016/ask-mate-pyth…
jkrisz511 Mar 7, 2019
042afeb
Merge branch 'develop' of github.com:andris9016/ask-mate-python into …
andris9016 Mar 7, 2019
da2ae02
Merge branch 'develop' of https://github.com/andris9016/ask-mate-pyth…
jkrisz511 Mar 7, 2019
e7c1d9a
Merge branch 'develop' of github.com:andris9016/ask-mate-python into …
andris9016 Mar 7, 2019
ac2c5f7
Accepted butten ui implemented
andris9016 Mar 7, 2019
6dab0fa
change user backdoor fixed
jkrisz511 Mar 7, 2019
f37e525
user cant delete others answer
jkrisz511 Mar 7, 2019
1470baa
Chane the welcome page(add team name)
andris9016 Mar 7, 2019
6de3999
user cant edit others answer
jkrisz511 Mar 7, 2019
990f1aa
registration min chaarcter number set, login error page message updat…
Mar 7, 2019
0226bbf
user cant modify others question
jkrisz511 Mar 7, 2019
a5c37c3
user cant delete others question
jkrisz511 Mar 7, 2019
cf16896
user cant modify others comment
jkrisz511 Mar 7, 2019
d152404
user cant delete others comment
jkrisz511 Mar 7, 2019
fdd5141
question_detail side accept answer button fixed
Mar 7, 2019
fe7bfa1
merge with user_page
jkrisz511 Mar 7, 2019
b56708c
MMerge conflict
andris9016 Mar 7, 2019
5435625
Merge conflict with UI
andris9016 Mar 7, 2019
72a431d
user permission bug fixed
jkrisz511 Mar 7, 2019
d006ab6
minor data_manager modification
Aug 5, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ __pycache__/
*.py[cod]
*$py.class

# VS Code
.vscode

# C extensions
*.so

Expand Down
51 changes: 51 additions & 0 deletions connection.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# Creates a decorator to handle the database connection/cursor opening/closing.
# Creates the cursor with RealDictCursor, thus it returns real dictionaries, where the column names are the keys.
import os
import psycopg2
import psycopg2.extras


def get_connection_string():
# setup connection string
# to do this, please define these environment variables first
user_name = os.environ.get('PSQL_USER_NAME')
password = os.environ.get('PSQL_PASSWORD')
host = os.environ.get('PSQL_HOST')
database_name = os.environ.get('PSQL_DB_NAME')

env_variables_defined = user_name and password and host and database_name

if env_variables_defined:
# this string describes all info for psycopg2 to connect to the database
return 'postgresql://{user_name}:{password}@{host}/{database_name}'.format(
user_name=user_name,
password=password,
host=host,
database_name=database_name
)
else:
raise KeyError('Some necessary environment variable(s) are not defined')


def open_database():
try:
connection_string = get_connection_string()
connection = psycopg2.connect(connection_string)
connection.autocommit = True
except psycopg2.DatabaseError as exception:
print('Database connection problem')
raise exception
return connection


def connection_handler(function):
def wrapper(*args, **kwargs):
connection = open_database()
# we set the cursor_factory parameter to return with a RealDictCursor cursor (cursor which provide dictionaries)
dict_cur = connection.cursor(cursor_factory=psycopg2.extras.RealDictCursor)
ret_value = function(dict_cur, *args, **kwargs)
dict_cur.close()
connection.close()
return ret_value

return wrapper
329 changes: 329 additions & 0 deletions data_manager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,329 @@
import connection
from psycopg2.extensions import AsIs
from datetime import datetime


@connection.connection_handler
def get_questions_fix(cursor):
cursor.execute("""SELECT * FROM question ORDER BY submission_time DESC LIMIT 5;""")
questions = cursor.fetchall()
return questions


@connection.connection_handler
def get_questions(cursor):
cursor.execute("""SELECT * FROM question ORDER BY submission_time DESC;""")
questions = cursor.fetchall()
return questions


@connection.connection_handler
def delete_question(cursor, question_id):
cursor.execute("""DELETE FROM question WHERE id=%(id)s;""", {'id': question_id})


@connection.connection_handler
def get_latest5_questions(cursor, order, direction):

cursor.execute("""SELECT * FROM question ORDER BY %(order)s %(direction)s;""", {"order": AsIs(order), "direction":AsIs(direction.upper())})

questions = cursor.fetchall()
return questions


@connection.connection_handler
def get_answers(cursor):
cursor.execute("""SELECT * FROM answer ORDER BY submission_time DESC;""")
answers = cursor.fetchall()
return answers


@connection.connection_handler
def delete_answer(cursor, answer_id):
cursor.execute("""DELETE FROM comment WHERE answer_id=%(answer_id)s;""", {'answer_id': answer_id})
cursor.execute("""DELETE FROM answer WHERE id=%(answer_id)s;""", {'answer_id': answer_id})


@connection.connection_handler
def get_comments(cursor):
cursor.execute("""SELECT * FROM comment ORDER BY submission_time DESC;""")
comments = cursor.fetchall()
return comments


@connection.connection_handler
def add_question(cursor, title, message,user_id):
user_story = {
'submission_time': datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
'view_number': 0,
'vote_number': 0,
'title': title,
'message': message,
'user_id':user_id,
'image': ""
}

cursor.execute("""INSERT INTO question(submission_time, view_number, vote_number, title, message, image,user_id)
VALUES(%(submission_time)s, %(view_number)s, %(vote_number)s,
%(title)s, %(message)s, %(image)s,%(user_id)s);""",
user_story)

cursor.execute("""SELECT id FROM question
ORDER BY id DESC
LIMIT 1;""")
return cursor.fetchone()['id']


@connection.connection_handler
def add_answer(cursor, question_id, message,user_id):

user_story = {
'submission_time': datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
'vote_number': 0,
'question_id': question_id,
'message': message,
'user_id': user_id,
'image': ""
}

cursor.execute("""INSERT INTO answer(submission_time, vote_number, question_id, message, image,user_id)
VALUES(%(submission_time)s,%(vote_number)s,%(question_id)s, %(message)s,%(image)s,%(user_id)s);""",
user_story)


@connection.connection_handler
def add_comment(cursor, question_id, answer_id, message,user_id):
user_story = {
'submission_time': datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
'message': message,
'answer_id': answer_id,
'question_id': question_id,
'user_id': user_id
}

cursor.execute("""INSERT INTO comment(submission_time, question_id, answer_id, message,user_id)
VALUES(%(submission_time)s,%(question_id)s, %(answer_id)s, %(message)s,%(user_id)s);""", user_story)



@connection.connection_handler
def delete_comments(cursor, comment_id):
cursor.execute("""DELETE FROM comment WHERE id=%(comment_id)s;""", {'comment_id': comment_id})


@connection.connection_handler
def get_update(cursor, answer_id, message):
time = datetime.now()
cursor.execute("""UPDATE answer SET message = %(message)s,submission_time = %(time)s WHERE id=%(answer_id)s;""",
{"message": message, 'answer_id': answer_id, 'time': time})


@connection.connection_handler
def get_update_question(cursor, question_id, message, title):
time = datetime.now()
cursor.execute("""UPDATE question SET message = %(message)s,submission_time = %(time)s,title = %(title)s
WHERE id=%(question_id)s;""",
{"message": message, 'question_id': question_id, 'time': time, 'title': title})


@connection.connection_handler
def get_update_for_comment(cursor, comment_id, message):
time = datetime.now()
cursor.execute("""UPDATE comment SET
message = %(message)s,
submission_time = %(time)s,
edited_count = %(count)s
WHERE id=%(comment_id)s;""",
{"message": message, 'comment_id': comment_id, 'time': time, 'count': 1})


@connection.connection_handler
def get_new_update_for_comment(cursor, comment_id, message):
time = datetime.now()
cursor.execute("""UPDATE comment SET
message = %(message)s,
submission_time = %(time)s,
edited_count = edited_count + 1
WHERE id=%(comment_id)s;""", {"message": message, 'comment_id': comment_id, 'time': time})


@connection.connection_handler
def get_question_id(cursor, answer_id):
cursor.execute("""
SELECT * FROM answer
WHERE id=%(id)s LIMIT 1
""",
{'id': answer_id})
return cursor.fetchone()['question_id']


@connection.connection_handler
def get_question_id_for_comment(cursor, comment_id):
cursor.execute("""
SELECT * FROM comment
WHERE id=%(id)s LIMIT 1
""",
{'id': comment_id})
return cursor.fetchone()['question_id']


@connection.connection_handler
def search_in(cursor, searched_word):
cursor.execute("""SELECT question.* FROM question LEFT JOIN answer ON question.id = answer.question_id
WHERE (LOWER(title) LIKE %(searched_word)s OR LOWER(answer.message) LIKE %(searched_word)s
OR LOWER(question.message) LIKE %(searched_word)s);""",
{'searched_word': '%' + searched_word + '%'})
searched_data = cursor.fetchall()
return searched_data


@connection.connection_handler
def vote_up_question(cursor, question_id):

variables = {
'question_id': question_id
}

cursor.execute("""UPDATE question
SET vote_number = vote_number+1
WHERE id = %(question_id)s;""", variables)


@connection.connection_handler
def vote_down_question(cursor, question_id):

variables = {
'question_id': question_id
}

cursor.execute("""UPDATE question
SET vote_number = vote_number-1
WHERE id = %(question_id)s;""", variables)


@connection.connection_handler
def vote_up_answer(cursor, question_id, answer_id):

variables = {
'question_id': question_id,
'answer_id': answer_id
}

cursor.execute("""UPDATE answer
SET vote_number = vote_number+1
WHERE question_id = %(question_id)s AND id = %(answer_id)s;""", variables)


@connection.connection_handler
def vote_down_answer(cursor, question_id, answer_id):

variables = {
'question_id': question_id,
'answer_id': answer_id
}

cursor.execute("""UPDATE answer
SET vote_number = vote_number-1
WHERE question_id = %(question_id)s AND id = %(answer_id)s;""", variables)


@connection.connection_handler
def registration(cursor, username, hashed_password):
user_details = {
'username': username,
'password': hashed_password
}
cursor.execute("""INSERT INTO users(username, password)
VALUES(%(username)s, %(password)s);""", user_details)


@connection.connection_handler
def accept_answer(cursor, question_id, answer_id):

variables = {
'question_id': question_id,
'answer_id': answer_id
}

cursor.execute("""UPDATE answer
SET acception = TRUE
WHERE question_id = %(question_id)s AND id = %(answer_id)s;""", variables)

@connection.connection_handler
def get_user_name(cursor, user_id):
cursor.execute("""
SELECT * FROM users
WHERE id=%(id)s LIMIT 1
""",
{'id': user_id})
return cursor.fetchone()['username']


@connection.connection_handler
def get_q_and_a_by_user(cursor):
cursor.execute("""SELECT question.title,question.message AS question_message,answer.message AS answer_message,
question.user_id
FROM (question INNER JOIN answer ON question.id=answer.question_id);
""")
datas = cursor.fetchall()
return datas

@connection.connection_handler
def get_answers_for_user(cursor):
cursor.execute("""SELECT submission_time,message AS title,user_id,question_id AS id FROM answer
ORDER BY submission_time DESC;""")
answers = cursor.fetchall()
return answers\

@connection.connection_handler
def get_comment_for_user(cursor):
cursor.execute("""SELECT submission_time,message AS title,user_id,question_id AS id FROM comment
ORDER BY submission_time DESC;""")
answers = cursor.fetchall()
return answers


@connection.connection_handler
def get_password_by_username(cursor, username):

cursor.execute("""SELECT password FROM users
WHERE username = %(username)s;""", {'username': username})
password = cursor.fetchone()
if password is not None:
return password['password']
else:
return None


@connection.connection_handler
def check_username(cursor, username):

cursor.execute("""SELECT username FROM users
WHERE username = %(username)s;""", {'username': username})
user = cursor.fetchone()
if user is not None:
return user['username']
else:
return None


@connection.connection_handler
def get_user_id_by_username(cursor, username):
cursor.execute("""SELECT id FROM users WHERE username = %(username)s;""", {'username': username})

user_id = cursor.fetchone()
return user_id['id']


@connection.connection_handler
def get_users(cursor):
cursor.execute("""SELECT * FROM users ORDER BY registration_date;""")
users = cursor.fetchall()
return users


@connection.connection_handler
def get_user_id_by_question_id(cursor, question_id):
cursor.execute("""SELECT user_id FROM question WHERE id = %(question_id)s;""", {'question_id': question_id})
user_id = cursor.fetchone()
return user_id['user_id']
6 changes: 6 additions & 0 deletions requiremnts.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
Click==7.0
Flask==1.0.2
itsdangerous==1.1.0
Jinja2==2.10
MarkupSafe==1.1.0
Werkzeug==0.14.1
Loading