Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
141 commits
Select commit Hold shift + click to select a range
4f44a93
TEST
MichalKandybowicz Mar 25, 2019
09eb49a
Add project file and folder structure
daniel-sicinski Mar 25, 2019
1af35f8
Remove static folder from templates to root
daniel-sicinski Mar 25, 2019
c68a162
data_manager
Xareth Mar 26, 2019
bdd60af
list and add
Xareth Mar 26, 2019
724c330
data manager updated
Xareth Mar 26, 2019
64a1859
form updated
Xareth Mar 26, 2019
91bbd38
answers added
Xareth Mar 26, 2019
b3536a8
answers updated
Xareth Mar 26, 2019
2ace017
Added settings.json to .gitignore
daniel-sicinski Mar 26, 2019
2af7cac
Refactored some of the code and added minor new features
daniel-sicinski Mar 27, 2019
924efac
views counter
Xareth Mar 27, 2019
a0a8f75
Refactored rest of the code
daniel-sicinski Mar 27, 2019
67a9144
Minor change
daniel-sicinski Mar 27, 2019
93ad94c
Refactored some of the code and added minor new features
MichalKandybowicz Mar 27, 2019
cf1ee4e
Add changes
daniel-sicinski Mar 27, 2019
fce9787
question update
Xareth Mar 27, 2019
e70c50f
master merge
Xareth Mar 27, 2019
cf3bddf
.
daniel-sicinski Mar 27, 2019
b01b24a
Refactored some of the code and added minor new features
MichalKandybowicz Mar 27, 2019
34ae57f
Merged origin/dev branch
daniel-sicinski Mar 27, 2019
e71c50c
Merge branch 'master' of https://github.com/MichalKandybowicz/ask-mat…
daniel-sicinski Mar 27, 2019
b913713
Add deleting functionality
daniel-sicinski Mar 27, 2019
6a73750
Add changes to overal design
daniel-sicinski Mar 27, 2019
9a9f1c2
Add view count function to server.py
daniel-sicinski Mar 27, 2019
5636225
add sorting functionality by parameters
Xareth Mar 28, 2019
65a4738
Refactored some of the code and added minor new features
MichalKandybowicz Mar 28, 2019
145fd78
connection header update
Xareth Mar 28, 2019
a1a6aa0
connection header update
Xareth Mar 28, 2019
133d2b6
Add image add functionality + new design
daniel-sicinski Mar 28, 2019
e8cc39d
Add voting functionality
daniel-sicinski Mar 28, 2019
ab95c0f
Add minor bug fix to upload function
daniel-sicinski Mar 28, 2019
de54551
Minor bug fixes
daniel-sicinski Mar 29, 2019
a89efec
SQL database connected. Add new question implemented. Submission_time…
Xareth Mar 31, 2019
25972f1
folder structure reorganised. Had to change template path in app config.
Xareth Apr 1, 2019
2eac614
convert query function added for showing SELECT statements in questions
Xareth Apr 1, 2019
e110aa9
get question by id converted to SQL
Xareth Apr 1, 2019
74a41d4
update question with SQL
Xareth Apr 1, 2019
28e2def
all questions from sprint 1 updated to SQL
Xareth Apr 1, 2019
f4c1e56
answers added
Xareth Apr 1, 2019
5b220e8
new function
Xareth Apr 1, 2019
4560f14
added new function show 5 questions on /index.html
Xareth Apr 1, 2019
e93749b
Merging master to Developer
daniel-sicinski Apr 2, 2019
3558dee
Remove old server.py file
daniel-sicinski Apr 2, 2019
4a1d7da
Moved server to root directory so that imports work properly
daniel-sicinski Apr 2, 2019
2f3d17f
add sql sample data
lterray Aug 28, 2017
86bec6e
Make changes to integration of SQL plus fix other things
daniel-sicinski Apr 2, 2019
e177e66
Fix displaying images
daniel-sicinski Apr 4, 2019
bd512f8
Add q/a deletion plus other minor changes
daniel-sicinski Apr 4, 2019
ff18d2b
edit question function repaired. pull request test
Xareth Apr 5, 2019
96403f3
comments html created
Xareth Apr 5, 2019
bde41ef
comments add and display features
Xareth Apr 5, 2019
1df92f4
add comments to answer works
Xareth Apr 6, 2019
5ebcd42
ughmmm
Xareth Apr 6, 2019
85c3661
edit comment works. redirect needs to be improved
Xareth Apr 6, 2019
cae0748
3 comment functions implemented 100% ui requiers some improvements
Xareth Apr 6, 2019
1705ff2
Delete comment works
Xareth Apr 6, 2019
beea962
merge between comments and dev
Xareth Apr 6, 2019
92b5843
small fix
Xareth Apr 6, 2019
5431924
tag section started
Xareth Apr 6, 2019
47a46c4
add tag page
Xareth Apr 7, 2019
4970de1
tags add and remove functions implemented. lack of add new tag
Xareth Apr 7, 2019
b22b425
tags add and remove functions implemented. lack of add new tag
Xareth Apr 7, 2019
ea6d16a
comments add fixed
Xareth Apr 7, 2019
18fd616
Refactored route_add_comment_to_answer function
daniel-sicinski Apr 7, 2019
ffbc0f3
Refactor question add feature
daniel-sicinski Apr 8, 2019
a940ece
Add edit answer feature
daniel-sicinski Apr 8, 2019
8b2bc90
add tags modification
Xareth Apr 9, 2019
a412175
Add search functionality
daniel-sicinski Apr 9, 2019
f22840d
Add color searched text functionality
daniel-sicinski Apr 9, 2019
91c736a
tags add new / assign works properly w/o validation
Xareth Apr 9, 2019
704bb1e
Add css file
daniel-sicinski Apr 9, 2019
880a63d
Add style to answer list
daniel-sicinski Apr 9, 2019
75405a5
Fix bug in serch query
daniel-sicinski Apr 9, 2019
353414c
Merge remote-tracking branch 'origin/Developer' into my_feature
daniel-sicinski Apr 9, 2019
8bac8e1
Add JS file
daniel-sicinski Apr 9, 2019
8fda570
Add voting functionality using JS
daniel-sicinski Apr 9, 2019
49c3d39
new bootstrap! MD
Xareth Apr 10, 2019
7f307ac
Fixed deleting pictures on deleting answer/question
daniel-sicinski Apr 10, 2019
9c7f5f3
refactor dm_answer
daniel-sicinski Apr 10, 2019
17cd6c1
Delete dm_archive
daniel-sicinski Apr 10, 2019
5e1e052
Refactor comments functionality
daniel-sicinski Apr 10, 2019
50b95f7
Merge branch 'Developer' into my_feature
daniel-sicinski Apr 10, 2019
c08708a
new bootstrap md head updated
Xareth Apr 10, 2019
2e8c196
Modify styles for file upload
daniel-sicinski Apr 10, 2019
5d78f93
Fix and refactor tagging functionality
daniel-sicinski Apr 11, 2019
a671eda
Add restiction to question view count increase
daniel-sicinski Apr 11, 2019
bf2b978
Redesign question detail display
daniel-sicinski Apr 11, 2019
7926c6c
Redesign lists of questions
daniel-sicinski Apr 11, 2019
6762b74
Add truncating functionality for question display
daniel-sicinski Apr 11, 2019
e1fb3d4
Redesign home page
daniel-sicinski Apr 11, 2019
342f6d2
Add top margin to all templates
daniel-sicinski Apr 11, 2019
5e8e99e
Redesign answer section
daniel-sicinski Apr 11, 2019
d3b7874
Minor redisign of search results
daniel-sicinski Apr 11, 2019
9668bf5
Fix minor bug with deleting images
daniel-sicinski Apr 11, 2019
080a5d5
Minor change in answer display
daniel-sicinski Apr 11, 2019
41dd144
Minor bug fix of question display
daniel-sicinski Apr 11, 2019
d882c63
Fix bug with editing question
daniel-sicinski Apr 12, 2019
fe13a5a
Remove unnecessary commets
daniel-sicinski Apr 23, 2019
a8c33c3
sql database users
Xareth Apr 23, 2019
a3285a5
sql
Xareth Apr 23, 2019
9f1a0d3
sql user examples
Xareth Apr 23, 2019
83507b3
Modified sql sample data file
daniel-sicinski Apr 23, 2019
172a927
credentials and layout login / logout
Xareth Apr 23, 2019
323bf71
Add registration and login form file
daniel-sicinski Apr 23, 2019
6a7f6cf
Add sv_credentials to server
daniel-sicinski Apr 23, 2019
21c7e1e
Add secret key
daniel-sicinski Apr 23, 2019
72a0813
Add registration form in html
daniel-sicinski Apr 23, 2019
dae287a
Add registration route
daniel-sicinski Apr 23, 2019
280f2c5
Add handling of flash messages
daniel-sicinski Apr 23, 2019
b21631f
Merge branch 'Developer' into Registration_feature
daniel-sicinski Apr 23, 2019
177473f
users binding to questions for index.html and list.html
mwagrodzki Apr 24, 2019
ac6ae82
users binding to questions for qd.html
mwagrodzki Apr 24, 2019
7137835
removed always logged on user 1 cheat
mwagrodzki Apr 24, 2019
3820278
list users added
piotrfaderewski Apr 24, 2019
705117d
fixing commits
mwagrodzki Apr 24, 2019
1f22c2c
Update layout.html
Xareth Apr 24, 2019
f5ad041
Merge pull request #1 from Xareth/list_users
Xareth Apr 24, 2019
274f2f5
remove remember me field
daniel-sicinski Apr 24, 2019
004c941
Add user oriented sql functions
daniel-sicinski Apr 24, 2019
ad216f4
Add session and loggin feature
daniel-sicinski Apr 24, 2019
eb892ff
Merge branch 'Developer' into Registration_feature
daniel-sicinski Apr 24, 2019
de696fc
Merge pull request #2 from Xareth/user-question-bind
Xareth Apr 24, 2019
eaa41bf
Revert "Update layout.html"
Xareth Apr 24, 2019
af504dc
Merge pull request #3 from Xareth/Registration_feature
Xareth Apr 24, 2019
0765516
comment binding done
piotrfaderewski Apr 24, 2019
27a6498
Merge pull request #4 from Xareth/bind_comment
Xareth Apr 25, 2019
3502657
user-answer bind for qd.html
mwagrodzki Apr 25, 2019
b81ba1e
Merge branch 'Developer' into user-answer-bind
mwagrodzki Apr 25, 2019
88e6c28
Merge pull request #5 from Xareth/user-answer-bind
Xareth Apr 25, 2019
548981e
tags page
piotrfaderewski Apr 25, 2019
1446a23
Merge branch 'tags' into Developer
piotrfaderewski Apr 25, 2019
576dc68
tags updated / layout links css updated
Xareth Apr 25, 2019
5135a33
Merge pull request #6 from Xareth/tags
Xareth Apr 25, 2019
159a756
Merge pull request #7 from Xareth/tags2
piotrfaderewski Apr 25, 2019
f815579
accept answer functionality
mwagrodzki Apr 25, 2019
27ead18
Merge branch 'Developer' into accept-answer
mwagrodzki Apr 25, 2019
8dc1926
verification of acceptation
mwagrodzki Apr 25, 2019
a6f1c6e
Merge pull request #8 from Xareth/accept-answer
Xareth Apr 25, 2019
f50518b
reputation working properly
piotrfaderewski Apr 25, 2019
dc8e4d7
minor bugs fixed sql reload
Xareth Apr 25, 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
11 changes: 10 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -101,4 +101,13 @@ ENV/
.mypy_cache/

# pycharm files
.idea/
.idea/

# vscode files
settings.json

# database files
data/

# static files
static/images/
18 changes: 18 additions & 0 deletions Forms/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField, BooleanField
from wtforms.validators import DataRequired, Email, Length, EqualTo

class RegistrationForm(FlaskForm):
username = StringField('Username', validators=[DataRequired(), Length(min=2, max=30)])
name = StringField('Name', validators=[DataRequired(), Length(min=2, max=50)])
email = StringField('Email', validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired()])
confirmed_password = PasswordField('Confirm password', validators=[DataRequired(), EqualTo('password')])
submit = SubmitField('Register')


class LoginForm(FlaskForm):
email = StringField('Email', validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired()])
# remember_me = BooleanField('Remember me')
submit = SubmitField('Login')
49 changes: 49 additions & 0 deletions connection.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
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
91 changes: 91 additions & 0 deletions data_manager/dm_answers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
from connection import connection_handler
import datetime
from data_manager import dm_general


@connection_handler
def get_all_sql_answers_by_question_id(cursor, question_id):
cursor.execute("""
SELECT answer.*, users.username FROM answer
LEFT JOIN users ON answer.users_id = users.id
WHERE question_id=%(question_id)s
ORDER BY is_accepted DESC, vote_number DESC, submission_time ASC
""",
{"question_id": question_id})
answers = cursor.fetchall()
return answers


@connection_handler
def qet_answer_by_id(cursor, answer_id):
cursor.execute("""
SELECT * FROM answer WHERE id=%(answer_id)s
""",
{"answer_id": answer_id})
answer = cursor.fetchone()
return answer


@connection_handler
def qet_users_id_by_answer_id(cursor, answer_id):
cursor.execute("""
SELECT users_id FROM answer WHERE id=%(answer_id)s
""",
{"answer_id": answer_id})
answer = cursor.fetchone()
return answer['users_id']


@connection_handler
def add_sql_answer(cursor, form_data, question_id, user_id):
time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
cursor.execute("""
INSERT INTO answer (users_id, submission_time, vote_number, question_id, is_accepted, message)
VALUES (%(users_id)s, %(time)s, 0, %(question_id)s, 0, %(answer)s)
""", {'time': time, 'question_id': question_id, 'answer': form_data['answer'], 'users_id': user_id})


@connection_handler
def delete_answer(cursor, answer_id):
# delete answer image if exists
dm_general.remove_image('answer', answer_id)

# delete answer and all related comments
cursor.execute(
"""
DELETE FROM comment WHERE answer_id=%(answer_id)s;
DELETE FROM answer WHERE id=%(answer_id)s;
""", {'answer_id': answer_id}
)


@connection_handler
def update_answer(cursor, answer_id, form_data):
cursor.execute(
"""
UPDATE answer SET message=%(answer)s WHERE id=%(answer_id)s
""", {"answer": form_data['answer'], "answer_id": answer_id}
)


@connection_handler
def change_answer_vote(cursor, answer_id, value_to_change_vote):
cursor.execute("""
UPDATE answer
SET vote_number = vote_number + %(value_to_change_vote)s
WHERE id = %(answer_id)s
""", {'value_to_change_vote': value_to_change_vote, 'answer_id': answer_id})
cursor.execute("""
SELECT vote_number FROM answer WHERE id=%(answer_id)s
""", {'answer_id': answer_id})
new_vote_number = cursor.fetchone()
return new_vote_number


@connection_handler
def accept_answer(cursor, answer_id, is_accepted):
cursor.execute(
"""
UPDATE answer SET is_accepted=%(is_accepted)s WHERE id=%(answer_id)s
""", {"is_accepted": is_accepted, "answer_id": answer_id}
)
86 changes: 86 additions & 0 deletions data_manager/dm_comments.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
from connection import connection_handler
import datetime


@connection_handler
def add_comment_to_question(cursor, form_data, question_id, users_id):
time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
cursor.execute("""
INSERT INTO comment
(edited_count, message, question_id, submission_time, users_id)
VALUES (0, %(message)s, %(question_id)s, %(time)s, %(users_id)s)
""",
{'message': form_data['message'], 'question_id': question_id, 'time': time,
'users_id': users_id})


@connection_handler
def add_comment_to_answer(cursor, form_data, answer_id, question_id, users_id):
time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
cursor.execute("""
INSERT INTO comment
(edited_count, message, answer_id, submission_time, question_id, users_id)
VALUES (0, %(message)s, %(answer_id)s, %(time)s, %(question_id)s, %(users_id)s)
""",
{'message': form_data['message'], 'answer_id': answer_id,
'time': time, 'question_id': question_id, 'users_id': users_id})


@connection_handler
def show_question_comments_by_id(cursor, question_id):
cursor.execute("""
SELECT c.*, u.username FROM comment as c
LEFT JOIN users as u ON c.users_id = u.id
WHERE question_id = %(question_id)s AND answer_id IS NULL
""",
{'question_id': question_id})
comments = cursor.fetchall()
return comments


@connection_handler
def show_answer_comments_by_id(cursor, question_id):
cursor.execute("""
SELECT c.*, u.username FROM comment as c
LEFT JOIN users as u ON c.users_id = u.id
WHERE question_id = %(question_id)s;
""",
{'question_id': question_id})
comments = cursor.fetchall()
return comments


@connection_handler
def get_comment_by_id(cursor, comment_id):
cursor.execute("""
SELECT c.*, u.username FROM comment as c
LEFT JOIN users as u ON c.users_id = u.id
WHERE c.id = %(comment_id)s;
""",
{'comment_id': comment_id})
comment = cursor.fetchone()
return comment


@connection_handler
def update_comment_by_id(cursor, form_data, comment_id):
time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
cursor.execute("""
UPDATE comment
SET message = %(message)s, edited_count = edited_count + 1, submission_time = %(time)s
WHERE id = %(comment_id)s;
SELECT question_id FROM comment
WHERE id = %(comment_id)s;
""",
{'message': form_data['message'], 'time': time, 'comment_id': comment_id})
question_id = cursor.fetchone()
return question_id


@connection_handler
def delete_comment_by_id(cursor, comment_id):
cursor.execute("""
DELETE FROM comment
WHERE id = %(comment_id)s;
""",
{'comment_id': comment_id})
24 changes: 24 additions & 0 deletions data_manager/dm_credentials.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from connection import connection_handler


@connection_handler
def register_user(cursor, form_data, hashed_password):
# form_data.username.data, form_data.email.data etc...
cursor.execute("""
INSERT INTO users (username, name, email, password)
VALUES (%(username)s, %(name)s, %(email)s, %(password)s)
""", {'username': form_data.username.data,
'name': form_data.name.data,
'email': form_data.email.data,
'password': hashed_password})


@connection_handler
def get_user_data(cursor, email):
cursor.execute("""
SELECT * FROM users
WHERE email = %(email)s
""",
{'email': email})
user_data = cursor.fetchone()
return user_data
38 changes: 38 additions & 0 deletions data_manager/dm_general.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
from connection import connection_handler
import os
from psycopg2 import sql


@connection_handler
def update_image_path(cursor, table, filename, id):
cursor.execute(f"""
UPDATE {table}
SET image = 'images/{filename}' WHERE id={id}
""")


@connection_handler
def remove_image(cursor, table_name, resource_id):
cursor.execute(
sql.SQL('select image from {} WHERE id=%s').format(sql.Identifier(table_name)), [resource_id]
)
file_path = cursor.fetchone()
if file_path and file_path['image'] != None:
os.remove(f"./static/{file_path['image']}")


@connection_handler
def search_results(cursor, search_term):

cursor.execute("""
SELECT DISTINCT q.* FROM question q JOIN answer a ON q.id=a.question_id WHERE
UPPER(q.title) LIKE UPPER(%(search_term)s)
OR UPPER(q.message) LIKE UPPER(%(search_term)s)
OR UPPER(a.message) LIKE UPPER(%(search_term)s);
""", {'search_term': '%'+search_term+'%'})
questions = cursor.fetchall()
cursor.execute("""
SELECT * FROM answer WHERE UPPER(message) LIKE UPPER(%(search_term)s)
""", {'search_term': '%'+search_term+'%'})
answers = cursor.fetchall()
return questions, answers
Loading