Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
8 changes: 7 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,7 @@
venv/
venv/
__pycache__/
app/__pycache__/
app/routes/__pycache__
.vscode/
.vscode/settings.json
.pytest_cache/
1 change: 1 addition & 0 deletions Procfile
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
web: gunicorn app:app
6 changes: 6 additions & 0 deletions app/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from flask import Flask
from config import Config

app = Flask(__name__)

app.config.from_object(Config)
15 changes: 15 additions & 0 deletions app/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from flask_wtf import FlaskForm
from wtforms import (StringField, PasswordField, BooleanField,
SubmitField, TextAreaField, IntegerField, TextField)
from wtforms.validators import (DataRequired, ValidationError, Email, Length, Optional)


class QuestionForm(FlaskForm):
topic = StringField('Topic', description='Topic')
body = TextAreaField('Question', description='Enter question here')



class AnswerForm(FlaskForm):
Qn_Id = IntegerField('Question Id/No.', description='Enter question Id')
body = StringField('Answer', description='Enter answer here..')
109 changes: 109 additions & 0 deletions app/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@

ans_List = [

{
'answerId': 1,
'Qn_Id': 1,
'body': '''Lorem ipsum dolor sit amet, consectetur adipiscing
elit.Vivamus nec tortor ac purus luctus lobortis id et magna.
Pellentesque id odio volutpat, fermentum neque non,
vestibulum enim.Vivamus aliquet libero quis orci mattis
tincidunt.'''},
{'answerId': 2,
'Qn_Id': 2,
'body': '''What's programmingLorem ipsum dolor sit amet,
consectetur adipiscing elit.Vivamus nec tortor ac purus
luctus lobortis id et magna.Pellentesque id odio volutpat,
fermentum neque non, vestibulum enim.Vivamus aliquet libero
quis orci mattis tincidunt.'''},
{'answerId': 3,
'Qn_Id': 3,
'body': '''What are data structuresLorem ipsum dolor sit amet,
consectetur adipiscing elit.Vivamus nec tortor ac purus luctus
lobortis id et magna.Pellentesque id odio volutpat, fermentum
neque non, vestibulum enim.Vivamus
aliquet libero quis orci mattis tincidunt.'''},
{'answerId': 4,
'Qn_Id': 4,
'body': '''Lorem ipsum dolor sit amet, consectetur adipiscing
elit.Vivamus nec tortor ac purus luctus lobortis id et magna.
Pellentesque id odio volutpat, fermentum neque non,
vestibulum enim.Vivamus aliquet libero quis orci mattis
tincidunt.'''}
]


class Question:
def __init__(self, questionId=0, topic='', body=''):
self.id = questionId
self.topic = topic
self.body = body
self.answers = []

def __repr__(self):
return {
'questionId': self.id,
'topic': self.topic,
'body': self.body
}


def createQnsList():
'''Generates a List of five questions with different topics
and links answers to them'''

QnsList = []
body = '''Lorem ipsum dolor sit amet, consectetur adipiscing
elit.Vivamus nec tortor ac purus luctus lobortis id et magna.
Pellentesque id odio volutpat, fermentum neque non, vestibulum
enim.Vivamus aliquet libero quis orci mattis tincidunt.'''

topics = [0, 'python', 'comp science', 'AI', 'blockchain', 'ethereum']

for i in range(1, 6):
Qn = Question(i, topics[i], body)

for answer in ans_List:
if answer['Qn_Id'] == Qn.id:
Qn.answers.append(answer)

QnsList.append(Qn.__repr__())
return QnsList


questionsList = createQnsList()


class Answer:
def __init__(self, answerId=0, body='', Qn_Id=0):
self.answerId = answerId
self.body = body
self.Qn_Id = Qn_Id

def __repr__(self):
return {
'answerId': self.answerId,
'Qn_Id': self.Qn_Id,
'body': self.body
}


def createAnsList():
'''Generates list of five answers'''
AnsList = []
body = '''Lorem ipsum dolor sit amet, consectetur adipiscing
elit.Vivamus nec tortor ac purus luctus lobortis id et magna.
Pellentesque id odio volutpat, fermentum neque non, vestibulum
enim.Vivamus aliquet libero quis orci mattis tincidunt.'''

l = [question['questionId'] for question in questionsList]
qnIds = [id for id in l]
qnIds[:0] = [0]

for i in range(1, 6):
Ans = Answer(i, body, qnIds[i])
AnsList.append(Ans.__repr__())
return AnsList

answersList = createAnsList()

121 changes: 121 additions & 0 deletions app/routes/routes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
from flask import (Flask, Response, flash, json, jsonify,
request, session, url_for)

from app import app
from app.models import Answer, Question, answersList, questionsList


@app.route('/api/v1/questions', methods=['GET'])
def get_questions():
return jsonify({'questions': questionsList})

@app.route('/api/v1/questions/<int:questionId>', methods=['GET'])
def get_question(questionId):
for question in questionsList:
if question['questionId'] == questionId:
temp = {
'questionId': question['questionId'],
'topic': question['topic'],
'body': question['body']
}
return jsonify(temp)
return Response(json.dumps(['Question not Found']),
status=404, mimetype='application/json')


@app.route('/api/v1/questions', methods=['POST'])
def add_question():

request_data = request.get_json()
if (valid_question(request_data)):
temp = {
'questionId': request_data['questionId'],
'topic': request_data['topic'],
'body': request_data['body']
}
questionsList.append(temp)
response = Response('', 201, mimetype='application/json')
response.headers['location'] = ('questions/' +
str(request_data['questionId']))

return response
else:
bad_object = {
"error": "Invalid question object",
"hint": '''Request format should be,{'questionId':1, 'topic': 'python',
'body': 'what is python in programming' }'''
}
response = Response(json.dumps([bad_object]),
status=400, mimetype='application/json')
return response

@app.route('/api/v1/questions/<int:questionId>/answers', methods=['POST'])
def add_answer(questionId):
request_data = request.get_json()
if (valid_answer(request_data)):
temp = {
'answerId': request_data['answerId'],
'Qn_Id': request_data['Qn_Id'],
'body': request_data['body']
}
answersList.append(temp)
for question in questionsList:
if question['questionId'] == request_data['Qn_Id']:
question = Question(question['questionId'],
question['topic'], question['body'])
question.answers.append(temp)

response = Response('', status=201, mimetype='application/json')
response.headers['location'] = ('answers/' +
str(request_data['answerId']))
return response

else:
bad_object = {
"error": "Invalid answer object",
"hint": '''Request format should be {'answerId':1,
'body': 'this is the body',
'Qn_Id': 2}'''
}
response = Response(json.dumps([bad_object]),
status=400, mimetype='application/json')
return response


@app.route('/api/v1/questions/<int:questionId>', methods=['PATCH'])
def update_question(questionId):
request_data = request.get_json()
updated_question = dict()
ids = [question['questionId'] for question in questionsList]

if questionId in ids:
if "topic" in request_data:
updated_question["topic"] = request_data["topic"]
if "body" in request_data:
updated_question["body"] = request_data["topic"]

for question in questionsList:
if question["questionId"] == questionId:
question.update(updated_question)

response = Response('', status=204)
response.headers['Location'] = "/questions" + str(questionId)
return response

response = Response(json.dumps(['Question not found']), status=404)
return response



def valid_question(questionObject):
if 'topic' in questionObject and 'body' in questionObject:
return True
else:
return False

def valid_answer(answerObject):
if 'Qn_Id' in answerObject and 'answerId' in answerObject and 'body' in answerObject :
return True
else:
return False

Binary file added app/static/011.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app/static/015.JPG
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app/static/gears.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app/static/img2.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app/static/img3.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app/static/img4.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app/static/kybrd.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading