__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 operator import itemgetter 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.Task import Task from models.Course import Course from models.TaskComponent import TaskComponent #Validation Utils Libs from SE_API.Validation_Utils import * from SE_API.Respones_Utils import * task_routes = Blueprint("task_routes", __name__) auto = Autodoc() @task_routes.route('/api/tasks/create/', methods=['POST']) @auto.doc() def create_task(token): """ This call will create a new Task in the DB
Route Parameters
- seToken: 'seToken'

Payload
- JSON Object, Example:
{
"title":"task1",
"courseName":"aran",
"description":"pls fddfsdfdsk",
"dueDate":{"year":2010,
"month":2,
"day":4
}, "isPersonal":true,
"components":[
{
"type" : "should be type1",
"label" : "should be label1",
"isMandatory" : true,
"order" : 1
},
{
"type" : "should be type2",
"label" : "should be label2",
"isMandatory" : true,
"order" : 2
},
{
"type" : "should be type3",
"label" : "should be label3",
"isMandatory" : false,
"order" : 3
}
]
}

Response
201 - Created
400 - Bad Request
403 - Invalid token or not a lecturer """ 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: add seconds and minutes #check the user(lecturer) is owner of the course # try: # arr = [] # query = Course.all() # query.filter('courseName =',payload['courseName']) # for t in query.run(): # arr.append(dict(json.loads(t.to_JSON()))) # if len(arr) == 0: # return bad_request("No such course") # except Exception as e: # print e # return bad_request("Missing courseName") #todo: check legality #create Task object try: #parse dueDate try: date = datetime.date(payload['dueDate']['year'],payload['dueDate']['month'],payload['dueDate']['day']) except Exception: return bad_request("invalid dueDate format") task = Task(title=payload['title'], courseName=payload['courseName'], description=payload['description'], dueDate=date) # print "id: ",task.key().id() #parse isPersonal try: task.isPersonal = payload['isPersonal'] except Exception: pass except Exception as e: print e return bad_request() db.put(task) db.save #create components for c in payload['components']: try: component = TaskComponent(taskId=task.key().id(), userId=-1, type=c['type'], label=c['label'], isMandatory=c['isMandatory'], order=c['order']) except Exception as e: print e return bad_request("Bad component") db.put(component) db.save return created() @task_routes.route('/api/tasks/getAllTasks/', methods=["GET"]) @auto.doc() def getAllTasks(courseName): """ >This Call will return an array of all Tasks in a course by date
Route Parameters
- name: 'course name'

Payload
- NONE

Response
200 - JSON Example:
{
'title' : 'Task1',
'courseName' : 'advance Math',
'description' : 'prepare by sunday',
'dueDate' : { 'year' : 2015, 'month' : 12, 'day' : 23 }
'isPersonal' : true,
'task_id' : 589689456894
}

""" arr = [] query = Task.all() query.filter("courseName = ", courseName) for t in query.run(): taskDic =dict(json.loads(t.to_JSON())) #add a key 'forSortDate' for sorting dates taskTime = datetime.datetime(taskDic['dueDate']['year'], taskDic['dueDate']['month'], taskDic['dueDate']['day']) taskDic['forSortDate'] = taskTime arr.append(taskDic) #sort array by date, and remove added key arr = sorted(arr, key=itemgetter('forSortDate'), reverse=False) for i in arr: del i['forSortDate'] if len(arr) != 0: return Response(response=json.dumps(arr), status=200, mimetype="application/json") else: return no_content() @task_routes.route('/api/tasks/getAllFutureTasks/', methods=["GET"]) @auto.doc() def getAllFutureTasks(courseName): """ >This Call will return an array of all Future Tasks in a course, ordered by date
Route Parameters
- name: 'course name'

Payload
- NONE

Response
200 - JSON Example:
{
'title' : 'Task1',
'courseName' : 'advance Math',
'description' : 'prepare by sunday',
'dueDate' : { 'year' : 2015, 'month' : 12, 'day' : 23 }
'isPersonal' : true,
'task_id' : 589689456894
}

""" arr = [] query = Task.all() query.filter("courseName = ", courseName) for t in query.run(): taskDic =dict(json.loads(t.to_JSON())) #add a key 'forSortDate' for sorting dates taskTime = datetime.datetime(taskDic['dueDate']['year'], taskDic['dueDate']['month'], taskDic['dueDate']['day']) if taskTime >= datetime.date.today(): taskDic['forSortDate'] = taskTime arr.append(taskDic) #sort array by date, and remove added key arr = sorted(arr, key=itemgetter('forSortDate'), reverse=False) for i in arr: del i['forSortDate'] if len(arr) != 0: return Response(response=json.dumps(arr), status=200, mimetype="application/json") else: return no_content() @task_routes.route('/api/tasks/getTaskComponents/', methods=["GET"]) @auto.doc() def getTaskComponents(taskId): """ >This Call will return an array of all components for a given task
Route Parameters
- taskId: integer

Payload
- NONE

Response
200 - JSON Example:
[ {
'taskId' : 7589454894, 'userId' : -1, 'type' : 'kindOfType', 'label' : 'kindOfLabel', 'isMandatory' : true, 'order' : 2 }
{
'taskId' : 7589454894, 'userId' : yossi, 'type' : 'otherKindOfType', 'label' : 'otherKindOfLabel', 'isMandatory' : false, 'order' : 4 }
]

""" arr = [] query = TaskComponent.all() query.filter("taskId = ", taskId) for tc in query.run(): arr.append(dict(json.loads(tc.to_JSON()))) #sort array by order, and remove added key arr = sorted(arr, key=itemgetter('order'), reverse=False) if len(arr) != 0: return Response(response=json.dumps(arr), status=200, mimetype="application/json") else: return no_content() @task_routes.route('/api/tasks/deleteTask//', methods=['DELETE']) @auto.doc() def deleteTask(token,taskid): """ This Call will delete a specific Task
Route Parameters
- seToken: 'seToken' - taskid: 'taskid'

Payload
- NONE


Response
202 - Deleted Course
....
{
...
}req
]
400 - no such Course
403 - Invalid token or not a lecturer or lecturer is not owner of Course!
""" if not is_lecturer(token): return forbidden("Invalid token or not a lecturer!") #todo: check if lecturer is owner of course #return forbidden("lecturer is not owner of course") user = get_user_by_token(token) c = Task.get_by_id(int(taskid)) if c is None: return bad_request("no such Task") db.delete(c) db.save return accepted("Task deleted") @task_routes.route('/api/tasks/deleteTaskComponents//', methods=['DELETE']) @auto.doc() def deleteTaskComponents(token,taskid): """ This Call will delete a specific Task's components
Route Parameters
- seToken: 'seToken' - taskid: 'taskid'

Payload
- NONE


Response
202 - Deleted Course
....
{
...
}req
]
400 - no such Task
403 - Invalid token or not a lecturer or lecturer is not owner of Task!
""" if not is_lecturer(token): return forbidden("Invalid token or not a lecturer!") #todo: check if lecturer is owner of course #return forbidden("lecturer is not owner of course") user = get_user_by_token(token) t = Task.get_by_id(int(taskid)) if t is None: return bad_request("no such Task") query = TaskComponent.all() query.filter('taskId = ', t.key().id()) for tc in query.run(): db.delete(tc) db.save return accepted("Task deleted") @task_routes.route('/api/tasks/help') def documentation(): return auto.html() # @task_routes.route('/api/tasks/getClosestTask/', methods=["GET"]) # @auto.doc() # def getClosestTask(courseName): # """ # >This Call will return an array of all projects in a given course #
# Route Parameters
# - name: 'course name' #
#
# Payload
# - NONE #
#
# Response #
# 200 - JSON Example:
# # {
# 'projectName': 'Advance Math',
# 'courseName': 'JCE',
# 'grade': 98,
# 'logo_url': 'http://location.domain.com/image.jpg',
# 'gitRepository': 'http://location.git.com/somthing',
# 'membersId': ['bob', 'dylan', 'quentin', 'terentino']
# } #
#
# """ # #get all tasks for a specific course # arr = [] # query = Task.all() # query.filter("courseName =", courseName) # for t in query.run(): # count+=1 # if t.dueDate < closestDate: # closestDate = t.dueDate # index = count # arr.append(dict(json.loads(t.to_JSON()))) # # print arr # if len(arr) != 0: # return Response(response=json.dumps(arr[index]), # status=200, # mimetype="application/json") # else: # return no_content("no Tasks") #