diff --git a/SE_API/API.py b/SE_API/API.py index 91cfb16..4779525 100644 --- a/SE_API/API.py +++ b/SE_API/API.py @@ -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 @@ -23,11 +24,18 @@ from models.Campus import Campus from SE_API.Validation_Utils import * from SE_API.Respones_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() @@ -35,6 +43,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) @@ -108,23 +122,18 @@ def send_activation(token): 403 - Invalid Token
""" 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) @@ -132,6 +141,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: @@ -141,51 +154,6 @@ def returnHome(): -@app.route('/api/getUserByToken/', methods=["GET"]) -@auto.doc() -def getUserByToken(token): - ''' - This Function is will Activate a user and add tha campus to it -
- Route Parameters
- - validation_token: 'seToken|email_suffix' -
-
- Payload
- - NONE -
-
- Response -
- 200 - JSON Example:
- - {
- 'username' : 'github_username',
- 'name' : 'Bob Dylan',
- 'email' : 'email@domain.com',
- 'isLecturer' : true,
- 'seToken' : 'dds2d-sfvvsf-qqq-fdf33-sfaa',
- 'avatar_url' : 'http://location.domain.com/image.jpg',
- 'isFirstLogin' : false,
- 'campuses_id_list': ['22314','243512',...,'356'],
- 'classes_id_list': ['22314','243512',...,'356']
- } -
-
- 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') @@ -229,162 +197,6 @@ def oauth(oauth_token): return cookieMonster(user.seToken) -@app.route('/api/Campuses/create/', methods=['POST']) -@auto.doc() -def create_campus(token): - """ - This call will create a new campus in the DB -
- Route Parameters
- - seToken: 'seToken' -
-
- Payload
- - JSON Object, Example:
- {
- 'title': 'Campus name',
- 'email_ending': '@campus.ac.com',
- 'avatar_url': 'http://location.domain.com/image.jpg'
- }
-
-
- Response -
- 201 - Created -
- 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/', 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/', methods=['GET']) -@auto.doc() -def get_campuses(token): - """ - This Call will return an array of all Campuses available -
- Route Parameters
- - seToken: 'seToken' -
-
- Payload
- - NONE
-
-
- Response -
- 200 - JSON Array, Example:
- [
- { - 'title': 'JCE',
- 'email_ending': '@post.jce.ac.il',
- 'master_user_id': 123453433341, (User that created the campus)
- 'avatar_url': 'http://some.domain.com/imagefile.jpg'
- },
- ....
- {
- ...
- }req
- ]
-
- 403 - Invalid Token
- 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') @@ -433,3 +245,5 @@ def cookieMonster(uid): response = app.make_response(redirect_to_home ) response.set_cookie('com.sehub.www',value=uid) return response + + diff --git a/SE_API/CampusRoutes.py b/SE_API/CampusRoutes.py new file mode 100644 index 0000000..8a5d5d9 --- /dev/null +++ b/SE_API/CampusRoutes.py @@ -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/', methods=['POST']) +@auto.doc() +def create_campus(token): + """ + This call will create a new campus in the DB +
+ Route Parameters
+ - seToken: 'seToken' +
+
+ Payload
+ - JSON Object, Example:
+ {
+ 'title': 'Campus name',
+ 'email_ending': '@campus.ac.com',
+ 'avatar_url': 'http://location.domain.com/image.jpg'
+ }
+
+
+ Response +
+ 201 - Created +
+ 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/', methods=['GET']) +@auto.doc() +def get_campuses(token): + """ + This Call will return an array of all Campuses available +
+ Route Parameters
+ - seToken: 'seToken' +
+
+ Payload
+ - NONE
+
+
+ Response +
+ 200 - JSON Array, Example:
+ [
+ { + 'title': 'JCE',
+ 'email_ending': '@post.jce.ac.il',
+ 'master_user_id': 123453433341, (User that created the campus)
+ 'avatar_url': 'http://some.domain.com/imagefile.jpg'
+ },
+ ....
+ {
+ ...
+ }req
+ ]
+
+ 403 - Invalid Token
+ 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() \ No newline at end of file diff --git a/SE_API/CourseRoutes.py b/SE_API/CourseRoutes.py new file mode 100644 index 0000000..28cb857 --- /dev/null +++ b/SE_API/CourseRoutes.py @@ -0,0 +1,85 @@ +__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/', 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") + + + diff --git a/SE_API/ProjectRoutes.py b/SE_API/ProjectRoutes.py new file mode 100644 index 0000000..9b279fd --- /dev/null +++ b/SE_API/ProjectRoutes.py @@ -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.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//', methods=['POST']) +@auto.doc() +def create_project(token,id): + """ + This call will create a new project in the DB +
+ Route Parameters
+ - seToken: 'seToken' +
+
+ Payload
+ - JSON Object, Example:
+ {
+ 'title': 'Campus name',
+ 'email_ending': '@campus.ac.com',
+ 'avatar_url': 'http://location.domain.com/image.jpg'
+ }
+
+
+ Response +
+ 201 - Created +
+ 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/', methods=['GET']) +@auto.doc() +def get_projects(token): + """ + This Call will return an array of all projects available +
+ Route Parameters
+ - seToken: 'seToken' +
+
+ Payload
+ - NONE
+
+
+ Response +
+ 200 - JSON Array, Example:
+ [
+ { + 'title': 'JCE',
+ 'email_ending': '@post.jce.ac.il',
+ 'master_user_id': 123453433341, (User that created the campus)
+ 'avatar_url': 'http://some.domain.com/imagefile.jpg'
+ },
+ ....
+ {
+ ...
+ }req
+ ]
+
+ 403 - Invalid Token
+ 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/', methods=['GET']) +@auto.doc() +def get_campuses(token): + pass \ No newline at end of file