Merge pull request #26 from sagidayan/API_Dev

Api dev
This commit is contained in:
Sagi Dayan 2015-06-15 03:42:12 +03:00
commit 7bba774a3f
8 changed files with 502 additions and 218 deletions

View file

@ -6,6 +6,7 @@ from GithubAPI.GithubAPI import GitHubAPI_Keys
from google.appengine.ext import db
import requests
import uuid
import datetime
from flask import Flask, request, render_template, redirect, abort, Response
@ -24,11 +25,18 @@ from SE_API.Validation_Utils import *
from SE_API.Respones_Utils import *
from SE_API.Email_Utils import *
from SE_API.UserRoutes import user_routes
from SE_API.CampusRoutes import campus_routes
from SE_API.CourseRoutes import course_routes
from SE_API.ProjectRoutes import project_routes
app = Flask(__name__, static_folder='../templates')
githubKeys = GitHubAPI_Keys()
app.config['GITHUB_CLIENT_ID'] = githubKeys.getId()
@ -36,6 +44,12 @@ app.config['GITHUB_CLIENT_SECRET'] = githubKeys.getSecret()
github = GitHub(app)
cross = CORS(app)
app.register_blueprint(user_routes)
app.register_blueprint(campus_routes)
app.register_blueprint(course_routes)
app.register_blueprint(project_routes)
auto = Autodoc(app)
@app.errorhandler(404)
@ -109,23 +123,18 @@ def send_activation(token):
403 - Invalid Token<br>
"""
if not request.data:
return Response(response=json.dumps({'message': 'Bad Request'}),
status=400,
mimetype="application/json")
return bad_request()
payload = json.loads(request.data)
if not is_user_token_valid(token):
return Response(response=json.dumps({'message': 'Not A Valid Token!'}),
status=403,
mimetype="application/json")
return forbidden("Not A Valid Token!")
query = User.all()
query.filter('seToken =', token)
for u in query.run(limit=1):
try:
send_validation_email(token=token, name=u.username, email=payload["email"])
except Exception:
return Response(response=json.dumps({'message': 'Bad Request'}),
status=400,
mimetype="application/json")
return bad_request()
return Response(status=200)
@ -133,6 +142,10 @@ def send_activation(token):
def documentation():
return auto.html()
# @app.route('/api/help/campuses')
# def documentation():
# return auto.html()
@app.route('/home')
def returnHome():
try:
@ -142,51 +155,6 @@ def returnHome():
@app.route('/api/getUserByToken/<string:token>', methods=["GET"])
@auto.doc()
def getUserByToken(token):
'''
<span class="card-title">This Function is will Activate a user and add tha campus to it</span>
<br>
<b>Route Parameters</b><br>
- validation_token: 'seToken|email_suffix'
<br>
<br>
<b>Payload</b><br>
- NONE
<br>
<br>
<b>Response</b>
<br>
200 - JSON Example:<br>
<code>
{<br>
'username' : 'github_username',<br>
'name' : 'Bob Dylan',<br>
'email' : 'email@domain.com',<br>
'isLecturer' : true,<br>
'seToken' : 'dds2d-sfvvsf-qqq-fdf33-sfaa',<br>
'avatar_url' : 'http://location.domain.com/image.jpg',<br>
'isFirstLogin' : false,<br>
'campuses_id_list': ['22314','243512',...,'356'],<br>
'classes_id_list': ['22314','243512',...,'356']<br>
}
</code>
<br>
403 - Invalid Token
'''
query = User.all()
query.filter("seToken = ", token)
for u in query.run(limit=5):
return Response(response=u.to_JSON(),
status=201,
mimetype="application/json") # Real response!
return Response(response=json.dumps({'message' : 'No User Found'}),
status=400,
mimetype="application/json")
@app.route('/githubOAuth')
@ -230,162 +198,6 @@ def oauth(oauth_token):
return cookieMonster(user.seToken)
@app.route('/api/Campuses/create/<string:token>', methods=['POST'])
@auto.doc()
def create_campus(token):
"""
<span class="card-title">This call will create a new campus in the DB</span>
<br>
<b>Route Parameters</b><br>
- seToken: 'seToken'
<br>
<br>
<b>Payload</b><br>
- JSON Object, Example: <br>
{<br>
'title': 'Campus name',<br>
'email_ending': '@campus.ac.com',<br>
'avatar_url': 'http://location.domain.com/image.jpg'<br>
}<br>
<br>
<br>
<b>Response</b>
<br>
201 - Created
<br>
403 - Invalid Token/Forbidden
"""
if not request.data:
return Response(response=json.dumps({'message': 'Bad Request'}),
status=400,
mimetype="application/json")
payload = json.loads(request.data)
if not is_lecturer(token): #todo: change to lecturer id
return Response(response=json.dumps({'message': 'Invalid token or not a lecturer!'}),
status=403,
mimetype="application/json")
user = get_user_by_token(token)
#todo: check legality
try:
campus = Campus(title=payload['title'], email_ending=payload['email_ending'], master_user_id=user.key().id(), avatar_url=payload['avatar_url'])
except Exception:
return Response(response=json.dumps({'message': 'Bad Request'}),
status=400,
mimetype="application/json")
db.put(campus)
db.save
return Response(response=json.dumps(campus.to_JSON()),
status=201,
mimetype="application/json")
# @app.route('/api/Courses/create/<string:token>', methods=['POST'])
# @auto.doc()
# def create_course(token):
# """
# This call will create a new campus in the DB
# :param token: user seToken
# Payload
# {
# 'courseName': self.courseName,
# 'campusName': self.campusName,
# 'projects': self.projects
# 'startDate': self.startDate
# 'endDate': self.endDate
# 'taskFlag': self.taskFlag
# }
#
# :return:
# code 200
# """
# if not request.data:
# return Response(response=json.dumps({'message': 'Bad Request'}),
# status=400,
# mimetype="application/json")
# payload = json.loads(request.data)
# if not is_lecturer(token): #todo: change to lecturer id
# return Response(response=json.dumps({'message': 'Invalid token or not a lecturer!'}),
# status=403,
# mimetype="application/json")
#
# user = get_user_by_token(token)
#
# #todo: check legality
#
#
# try:
# course = Course(courseName=payload['courseName'], campusName=payload['campusName'], projects=payload['projects'], startDate=payload['startDate'], endDate=payload['endDate'], taskFlag=payload['taskFlag'])
# except Exception:
# return Response(response=json.dumps({'message': 'Bad Request'}),
# status=400,
# mimetype="application/json")
#
# db.put(course)
# db.save
# return Response(response=json.dumps(course.to_JSON()),
# status=200,
# mimetype="application/json")
#
#
#
@app.route('/api/Campuses/<string:token>', methods=['GET'])
@auto.doc()
def get_campuses(token):
"""
<span class="card-title">This Call will return an array of all Campuses available</span>
<br>
<b>Route Parameters</b><br>
- seToken: 'seToken'
<br>
<br>
<b>Payload</b><br>
- NONE <br>
<br>
<br>
<b>Response</b>
<br>
200 - JSON Array, Example:<br>
[<br>
{
'title': 'JCE',<br>
'email_ending': '@post.jce.ac.il',<br>
'master_user_id': 123453433341, (User that created the campus)<br>
'avatar_url': 'http://some.domain.com/imagefile.jpg'<br>
},<br>
....<br>
{<br>
...<br>
}req<br>
]<br>
<br>
403 - Invalid Token<br>
500 - Server Error
"""
if is_user_token_valid(token):
arr = []
query = Campus.all()
for c in query.run():
arr.append(dict(json.loads(c.to_JSON())))
print arr
if len(arr) != 0:
return Response(response=json.dumps(arr),
status=200,
mimetype="application/json")
else:
return Response(response=[],
status=200,
mimetype="application/json")
else:
return Response(response=json.dumps({'message': 'Invalid Token'}),
status=403,
mimetype="application/json")
@app.route('/login')
@ -434,3 +246,5 @@ def cookieMonster(uid):
response = app.make_response(redirect_to_home )
response.set_cookie('com.sehub.www',value=uid)
return response

135
SE_API/CampusRoutes.py Normal file
View file

@ -0,0 +1,135 @@
__author__ = 'Aran'
from flask import Blueprint
import json
from GithubAPI.GithubAPI import GitHubAPI_Keys
from google.appengine.ext import db
import requests
import datetime
from flask import Flask, request, render_template, redirect, abort, Response
from flask.ext.github import GitHub
from flask.ext.cors import CORS, cross_origin
from flask.ext.autodoc import Autodoc
# DB Models
from models.Campus import Campus
#Validation Utils Libs
from SE_API.Validation_Utils import *
from SE_API.Respones_Utils import *
campus_routes = Blueprint("campus_routes", __name__)
auto = Autodoc()
@campus_routes.route('/api/campuses/create/<string:token>', methods=['POST'])
@auto.doc()
def create_campus(token):
"""
<span class="card-title">This call will create a new campus in the DB</span>
<br>
<b>Route Parameters</b><br>
- seToken: 'seToken'
<br>
<br>
<b>Payload</b><br>
- JSON Object, Example: <br>
{<br>
'title': 'Campus name',<br>
'email_ending': '@campus.ac.com',<br>
'avatar_url': 'http://location.domain.com/image.jpg'<br>
}<br>
<br>
<br>
<b>Response</b>
<br>
201 - Created
<br>
403 - Invalid Token/Forbidden
"""
if not request.data:
return bad_request()
payload = json.loads(request.data)
if not is_lecturer(token): #todo: change to lecturer id
return forbidden("Invalid token or not a lecturer!")
user = get_user_by_token(token)
#todo: check legality
try:
campus = Campus(title=payload['title'], email_ending=payload['email_ending'], master_user_id=user.key().id(), avatar_url=payload['avatar_url'])
except Exception:
return bad_request()
db.put(campus)
db.save
return Response(response=campus.to_JSON(),
status=201,
mimetype="application/json")
@campus_routes.route('/api/campuses/<string:token>', methods=['GET'])
@auto.doc()
def get_campuses(token):
"""
<span class="card-title">This Call will return an array of all Campuses available</span>
<br>
<b>Route Parameters</b><br>
- seToken: 'seToken'
<br>
<br>
<b>Payload</b><br>
- NONE <br>
<br>
<br>
<b>Response</b>
<br>
200 - JSON Array, Example:<br>
[<br>
{
'title': 'JCE',<br>
'email_ending': '@post.jce.ac.il',<br>
'master_user_id': 123453433341, (User that created the campus)<br>
'avatar_url': 'http://some.domain.com/imagefile.jpg'<br>
},<br>
....<br>
{<br>
...<br>
}req<br>
]<br>
<br>
403 - Invalid Token<br>
500 - Server Error
"""
if is_user_token_valid(token):
arr = []
query = Campus.all()
for c in query.run():
arr.append(dict(json.loads(c.to_JSON())))
print arr
if len(arr) != 0:
return Response(response=json.dumps(arr),
status=200,
mimetype="application/json")
else:
return Response(response=[],
status=200,
mimetype="application/json")
else:
return forbidden("Invalid Token")
@campus_routes.route('/api/campuses/help')
def documentation():
return auto.html()

88
SE_API/CourseRoutes.py Normal file
View file

@ -0,0 +1,88 @@
__author__ = 'Aran'
from flask import Blueprint
import json
from GithubAPI.GithubAPI import GitHubAPI_Keys
from google.appengine.ext import db
import requests
import datetime
from flask import Flask, request, render_template, redirect, abort, Response
from flask.ext.github import GitHub
from flask.ext.cors import CORS, cross_origin
from flask.ext.autodoc import Autodoc
# DB Models
from models.Course import Course
#Validation Utils Libs
from SE_API.Validation_Utils import *
from SE_API.Respones_Utils import *
course_routes = Blueprint("course_routes", __name__)
auto = Autodoc()
@course_routes.route('/api/courses/create/<string:token>', methods=['POST'])
@auto.doc()
def create_course(token):
"""
This call will create a new campus in the DB
:param token: user seToken
Payload
{
'courseName': self.courseName,
'campusName': self.campusName,
'projects': self.projects
'startDate': self.startDate
'endDate': self.endDate
'taskFlag': self.taskFlag
}
:return:
code 200
"""
if not request.data:
return bad_request()
payload = json.loads(request.data)
if not is_lecturer(token): #todo: change to lecturer id
return forbidden("Invalid token or not a lecturer!")
user = get_user_by_token(token)
#todo: check legality
try:
start_date = datetime.date(payload['startDate']['year'],payload['startDate']['month'],payload['startDate']['day'])
end_date = datetime.date(payload['endDate']['year'],payload['endDate']['month'],payload['endDate']['day'])
course = Course(courseName=payload['courseName'], campusName=payload['campusName'],
startDate=start_date, endDate=end_date)
try:
course.projects=payload['projects']
except Exception:
pass
except Exception:
return bad_request()
db.put(course)
db.save
return Response(response=course.to_JSON(),
status=201,
mimetype="application/json")
@course_routes.route('/api/courses/help')
def documentation():
return auto.html()

141
SE_API/ProjectRoutes.py Normal file
View file

@ -0,0 +1,141 @@
__author__ = 'Aran'
from flask import Blueprint
import json
from GithubAPI.GithubAPI import GitHubAPI_Keys
from google.appengine.ext import db
import requests
import datetime
from flask import Flask, request, render_template, redirect, abort, Response
from flask.ext.github import GitHub
from flask.ext.cors import CORS, cross_origin
from flask.ext.autodoc import Autodoc
# DB Models
from models.Project import Project
#Validation Utils Libs
from SE_API.Validation_Utils import *
from SE_API.Respones_Utils import *
project_routes = Blueprint("project_routes", __name__)
auto = Autodoc()
@project_routes.route('/api/projects/Create/<string:token>/<string:id>', methods=['POST'])
@auto.doc()
def create_project(token,id):
"""
<span class="card-title">This call will create a new project in the DB</span>
<br>
<b>Route Parameters</b><br>
- seToken: 'seToken'
<br>
<br>
<b>Payload</b><br>
- JSON Object, Example: <br>
{<br>
'title': 'Campus name',<br>
'email_ending': '@campus.ac.com',<br>
'avatar_url': 'http://location.domain.com/image.jpg'<br>
}<br>
<br>
<br>
<b>Response</b>
<br>
201 - Created
<br>
403 - Invalid Token/Forbidden
"""
if not request.data:
return bad_request()
payload = json.loads(request.data)
if not is_lecturer(token): #todo: change to lecturer id
return forbidden("Invalid token or not a lecturer!")
user = get_user_by_token(token)
#todo: check legality
try:
project = Project(projectName=payload['projectName'], masterId=user.key().id(), gitRepository=payload['gitRepository'], membersId=[token])
except Exception as e:
print e
return bad_request()
db.put(project)
db.save
return Response(response=project.to_JSON(),
status=201,
mimetype="application/json")
@project_routes.route('/api/projects/get/<string:token>', methods=['GET'])
@auto.doc()
def get_projects(token):
"""
<span class="card-title">This Call will return an array of all projects available</span>
<br>
<b>Route Parameters</b><br>
- seToken: 'seToken'
<br>
<br>
<b>Payload</b><br>
- NONE <br>
<br>
<br>
<b>Response</b>
<br>
200 - JSON Array, Example:<br>
[<br>
{
'title': 'JCE',<br>
'email_ending': '@post.jce.ac.il',<br>
'master_user_id': 123453433341, (User that created the campus)<br>
'avatar_url': 'http://some.domain.com/imagefile.jpg'<br>
},<br>
....<br>
{<br>
...<br>
}req<br>
]<br>
<br>
403 - Invalid Token<br>
500 - Server Error
"""
if is_user_token_valid(token):
arr = []
query = Campus.all()
for c in query.run():
arr.append(dict(json.loads(c.to_JSON())))
print arr
if len(arr) != 0:
return Response(response=json.dumps(arr),
status=200,
mimetype="application/json")
else:
return Response(response=[],
status=200,
mimetype="application/json")
else:
return forbidden("Invalid Token")
@project_routes.route('/api/Projects/<string:token>', methods=['GET'])
@auto.doc()
def get_campuses(token):
pass
@project_routes.route('/api/projects/help')
def documentation():
return auto.html()

View file

@ -3,6 +3,29 @@ __author__ = 'Aran'
from flask import Response
import json
def ok(message='OK'):
return Response(response=json.dumps({'message': message}),
status=200,
mimetype="application/json")
def created(message='Created'):
return Response(response=json.dumps({'message': message}),
status=201,
mimetype="application/json")
def accepted(message='Accepted'):
return Response(response=json.dumps({'message': message}),
status=202,
mimetype="application/json")
def no_content(message='No Content'):
return Response(response=json.dumps({'message': message}),
status=204,
mimetype="application/json")
def bad_request(message='Bad Request'):
return Response(response=json.dumps({'message': message}),
status=400,

75
SE_API/UserRoutes.py Normal file
View file

@ -0,0 +1,75 @@
__author__ = 'Aran'
from flask import Blueprint
import json
from GithubAPI.GithubAPI import GitHubAPI_Keys
from google.appengine.ext import db
import requests
import datetime
from flask import Flask, request, render_template, redirect, abort, Response
from flask.ext.github import GitHub
from flask.ext.cors import CORS, cross_origin
from flask.ext.autodoc import Autodoc
# DB Models
from models.User import User
#Validation Utils Libs
from SE_API.Validation_Utils import *
from SE_API.Respones_Utils import *
user_routes = Blueprint("user_routes", __name__)
auto = Autodoc()
@user_routes.route('/api/users/getUserByToken/<string:token>', methods=["GET"])
@auto.doc()
def getUserByToken(token):
'''
<span class="card-title">This Function is will Activate a user and add tha campus to it</span>
<br>
<b>Route Parameters</b><br>
- validation_token: 'seToken|email_suffix'
<br>
<br>
<b>Payload</b><br>
- NONE
<br>
<br>
<b>Response</b>
<br>
200 - JSON Example:<br>
<code>
{<br>
'username' : 'github_username',<br>
'name' : 'Bob Dylan',<br>
'email' : 'email@domain.com',<br>
'isLecturer' : true,<br>
'seToken' : 'dds2d-sfvvsf-qqq-fdf33-sfaa',<br>
'avatar_url' : 'http://location.domain.com/image.jpg',<br>
'isFirstLogin' : false,<br>
'campuses_id_list': ['22314','243512',...,'356'],<br>
'classes_id_list': ['22314','243512',...,'356']<br>
}
</code>
<br>
403 - Invalid Token
'''
query = User.all()
query.filter("seToken = ", token)
for u in query.run(limit=5):
return Response(response=u.to_JSON(),
status=200,
mimetype="application/json") # Real response!
return bad_request("No User Found")
@user_routes.route('/api/users/help')
def documentation():
return auto.html()

View file

@ -6,17 +6,23 @@ from google.appengine.ext import db
class Course(db.Model):
courseName = db.StringProperty(required=True)
campusName = db.StringProperty(required=True)
projects = db.StringListProperty(required=True)
projects = db.StringListProperty(required=True,default=[])
startDate = db.DateProperty(required=True)
endDate = db.DateProperty(required=False)
taskFlag = db.BooleanProperty(required=True)
endDate = db.DateProperty(required=True)
def to_JSON(self):
data = {'courseName' : self.courseName,
'campusName' : self.campusName,
'projects' : self.projects,
'startDate' : self.startDate,
'endDate' : self.endDate,
'taskFlag' : self.taskFlag,
'startDate' : {
'year': self.startDate.year,
'month': self.startDate.month,
'day': self.startDate.day,
},
'endDate' : {
'year': self.endDate.year,
'month': self.endDate.month,
'day': self.endDate.day,
}
}
return json.dumps(data)

View file

@ -5,13 +5,15 @@ from google.appengine.ext import db
class Project(db.Model):
projectName = db.StringProperty(required=True)
grade = db.IntegerProperty(required=True)
logo_url = db.StringProperty(required=True)
masterId = db.IntegerProperty(required=True)
grade = db.IntegerProperty(required=True, default=0)
logo_url = db.StringProperty(required=False)
gitRepository = db.StringProperty(required=True)
membersId = db.StringListProperty(required=True)
def to_JSON(self):
data = {'projectName' : self.projectName,
'masterId' : self.masterId,
'grade' : self.grade,
'logo_url' : self.logo_url,
'gitRepository' : self.gitRepository,