Merge branch 'master' of https://github.com/sagidayan/SE-Hub into QA

This commit is contained in:
etyemyer 2015-06-29 17:50:31 +03:00
commit ddfbbc04fe
42 changed files with 2569 additions and 972 deletions

View file

@ -30,6 +30,7 @@ from SE_API.CampusRoutes import campus_routes
from SE_API.CourseRoutes import course_routes
from SE_API.ProjectRoutes import project_routes
from SE_API.TaskRoutes import task_routes
from SE_API.MessageRoutes import message_routes
@ -51,6 +52,7 @@ app.register_blueprint(campus_routes)
app.register_blueprint(course_routes)
app.register_blueprint(project_routes)
app.register_blueprint(task_routes)
app.register_blueprint(message_routes)
auto = Autodoc(app)
@ -137,12 +139,12 @@ def send_activation(token):
return Response(status=200)
@app.route('/api/help')
def documentation():
def documentation_index():
return app.send_static_file('API_Doc/api_doc_index.html')
# @app.route('/api/help/campuses')
# def documentation():
# return auto.html()
@app.route('/api/help/misc')
def documentation_misc():
return auto.html()
@app.route('/home')
def returnHome():

View file

@ -76,9 +76,10 @@ def create_campus(token):
print e
user = get_user_by_token(token)
arr = []
arr.append(str(user.key().id()))
try:
campus = Campus(title=payload['title'], email_ending=payload['email_ending'], master_user_id=user.key().id(), avatar_url=payload['avatar_url'])
campus = Campus(title=payload['title'], email_ending=payload['email_ending'], master_user_id=user.key().id(), avatar_url=payload['avatar_url'], membersId=arr)
except Exception:
return bad_request()
@ -94,6 +95,53 @@ def create_campus(token):
# PUT
#----------------------------------------------------------
@campus_routes.route('/api/campuses/joinCampus/<string:token>/<string:campusId>', methods=["PUT"])
@auto.doc()
def joinCampus(token, campusId):
"""
<span class="card-title">This call will add the user (by token) to a specific campus</span>
<br>
<b>Route Parameters</b><br>
- seToken: 'seToken'<br>
- campusId: 123456789
<br>
<br>
<b>Payload</b><br>
- None <br>
<br>
<b>Response</b>
<br>
202 - Accepted
<br>
400 - Bad Request
<br>
403 - Invalid token or not a lecturer
"""
user = get_user_by_token(token)
if user is None:
return bad_request("Wrong user Token")
campus = Campus.get_by_id(int(campusId))
if campus is None:
return bad_request("No such course")
if str(user.key().id()) in campus.membersId:
return bad_request("User is already member in Project")
campus.membersId.append(str(user.key().id()))
user.courses_id_list.append(str(campus.key().id()))
db.put(campus)
db.put(user)
db.save
return Response(response=campus.to_JSON(),
status=202,
mimetype="application/json")
#----------------------------------------------------------
# GET
#----------------------------------------------------------
@ -153,20 +201,130 @@ def get_campuses(token):
return forbidden("Invalid Token")
@campus_routes.route('/api/campuses/getCampusesByUser/<string:token>', methods=['GET'])
@auto.doc()
def getCampusesByUser(token):
"""
<span class="card-title">This Call will return an array of all Campuses of a certain User</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>
'id' : 1234567890<br>
},<br>
....<br>
{<br>
...<br>
}req<br>
]<br>
<br>
403 - Invalid Token<br>
"""
user = get_user_by_token(token)
if user is None:
return bad_request("Bad user Token")
arr = []
for i in user.campuses_id_list:
campus = Campus.get_by_id(int(i))
arr.append(dict(json.loads(campus.to_JSON())))
if len(arr) != 0:
return Response(response=json.dumps(arr),
status=200,
mimetype="application/json")
else:
return Response(response=[],
status=200,
mimetype="application/json")
@campus_routes.route('/api/campuses/getCampusesByUserID/', defaults={'token': None, 'id': None})
@campus_routes.route('/api/campuses/getCampusesByUserID/<string:token>/<string:id>', methods=['GET'])
@auto.doc()
def getCampusesByUserID(token, id):
"""
<span class="card-title">This Call will return an array of all Campuses of a certain User By ID</span>
<br>
<b>Route Parameters</b><br>
- token: 'seToken' of requesting user
- The ID of <b>Wanted</b> User Campuses
<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>
'id' : 1234567890<br>
},<br>
....<br>
{<br>
...<br>
}req<br>
]<br>
<br>
403 - Invalid Token<br>
"""
user = get_user_by_token(token)
if user is None:
return forbidden("Invalid Token")
user = get_user_by_id(int(id))
if user is None:
return no_content("No User")
arr = []
for i in user.campuses_id_list:
campus = Campus.get_by_id(int(i))
arr.append(dict(json.loads(campus.to_JSON())))
if len(arr) != 0:
return Response(response=json.dumps(arr),
status=200,
mimetype="application/json")
else:
return Response(response=[],
status=200,
mimetype="application/json")
#----------------------------------------------------------
# DELETE
#----------------------------------------------------------
@campus_routes.route('/api/campuses/deleteCampus/<string:token>/<string:campusid>', methods=['DELETE'])
@campus_routes.route('/api/campuses/deleteCampus/<string:token>/<string:campusId>', methods=['DELETE'])
@auto.doc()
def deleteCampus(token,campusid):
def deleteCampus(token,campusId):
"""
<span class="card-title">This Call will delete a specific campus</span>
<br>
<b>Route Parameters</b><br>
- seToken: 'seToken'
- campusid: 'campusid'
- campusId: 1234567890
<br>
<br>
<b>Payload</b><br>
@ -192,7 +350,7 @@ def deleteCampus(token,campusid):
return forbidden("Invalid token or not a lecturer!")
user = get_user_by_token(token)
camp = Campus.get_by_id(int(campusid))
camp = Campus.get_by_id(int(campusId))
if camp is None:
return bad_request("no such campus")

View file

@ -49,10 +49,9 @@ def create_course(token):
- JSON Object, Example: <br>
{<br>
'courseName': 'Advance Math',<br>
'campusName': 'JCE',<br>
'startDate': {'year': 2015, 'month' : 4, 'day' : 3}<br>
'campusId': 1234567890,<br>
'startDate': {'year': 2015, 'month' : 4, 'day' : 3},<br>
'endDate': {'year': 2016, 'month' : 5, 'day' : 14}<br>
'taskFlag': false<br>
}<br>
<br>
<br>
@ -75,7 +74,7 @@ def create_course(token):
try:
payload = json.loads(request.data)
except Exception as e:
return bad_request()
return bad_request("incorrect JSON format")
try:
start_date = datetime.date(payload['startDate']['year'],payload['startDate']['month'],payload['startDate']['day'])
@ -84,11 +83,12 @@ def create_course(token):
if end_date <= start_date:
return bad_request("end date cant be before (or same day) start date")
course = Course(courseName=payload['courseName'], campusName=payload['campusName'], master_id=user.key().id(),
course = Course(courseName=payload['courseName'], campusId=payload['campusId'], master_id=user.key().id(),
startDate=start_date, endDate=end_date)
#check if name already exists
try:
query = Course.all()
query.filter('campusId = ', payload['campusId'])
query.filter("courseName = ", payload['courseName'])
for c in query.run(limit=1):
return forbidden("Course with same name already exists")
@ -98,66 +98,70 @@ def create_course(token):
except Exception as e:
print e
return bad_request()
return bad_request(2)
#add user to course membersId list
course.membersId.append(str(user.key().id()))
db.put(course)
#add course to user course list
user.courses_id_list.append(str(course.key().id()))
db.put(user)
db.save
return Response(response=course.to_JSON(),
status=201,
mimetype="application/json")
#----------------------------------------------------------
# PUT
#----------------------------------------------------------
@course_routes.route('/api/courses/createMessage/<string:token>', methods=['POST'])
@course_routes.route('/api/courses/joinCourse/<string:token>/<string:courseId>', methods=["PUT"])
@auto.doc()
def createMessage(token):
def joinCourse(token, courseId):
"""
<span class="card-title">This call will create a new Message in the DB</span>
<span class="card-title">This call will add the user (by token) to a specific course</span>
<br>
<b>Route Parameters</b><br>
- seToken: 'seToken'
- seToken: 'seToken'<br>
- courseId: 123456789
<br>
<br>
<b>Payload</b><br>
- JSON Object, Example: <br>
{<br>
'courseName': 'Advance Math',<br>
'message': 'The lecture today is canceled'<br>
}<br>
<br>
- None <br>
<br>
<b>Response</b>
<br>
201 - Created
202 - Accepted
<br>
400 - Bad Request
<br>
403 - Invalid token or not a lecturer
"""
if not request.data:
return bad_request("no 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)
if user is None:
return bad_request("Wrong user Token")
#try to parse payload
try:
payload = json.loads(request.data)
except Exception as e:
return bad_request("here")
course = Course.get_by_id(int(courseId))
if course is None:
return bad_request("No such course")
try:
msg = Message(courseName=payload['courseName'], message=payload['message'], msgDate=datetime.datetime.now())
except Exception as e:
print e
return bad_request("there")
if str(user.key().id()) in course.membersId:
return bad_request("User is already member in Course")
db.save(msg)
course.membersId.append(str(user.key().id()))
user.courses_id_list.append(str(course.key().id()))
db.put(course)
db.put(user)
db.save
return created()
return Response(response=course.to_JSON(),
status=202,
mimetype="application/json")
#----------------------------------------------------------
@ -165,14 +169,14 @@ def createMessage(token):
#----------------------------------------------------------
@course_routes.route('/api/courses/getCourseByCampusName/<string:name>', methods=["GET"])
@course_routes.route('/api/courses/getAllCoursesByCampus/<string:token>/<string:campusId>', methods=["GET"])
@auto.doc()
def getCourseByCampusName(name):
def getAllCoursesByCampus(token, campusId):
"""
<span class="card-title">>This Call will return an array of all courses in a given campus</span>
<br>
<b>Route Parameters</b><br>
- name: 'campus name'
- campusId: 1234567890
<br>
<br>
<b>Payload</b><br>
@ -185,7 +189,7 @@ def getCourseByCampusName(name):
<code>
{<br>
'courseName': 'Advance Math',<br>
'campusName': 'JCE',<br>
'campusId': 1234567890,<br>
'startDate': '2015-14-3'<br>
'endDate': '2015-29-6'<br>
'taskFlag': 'False'<br>
@ -195,9 +199,13 @@ def getCourseByCampusName(name):
</code>
<br>
"""
if get_user_by_token(token) is None:
return bad_request("Bad User Token")
arr = []
query = Course.all()
query.filter("campusName=", name)
query.filter("campusId = ", int(campusId))
for c in query.run():
arr.append(dict(json.loads(c.to_JSON())))
@ -211,61 +219,123 @@ def getCourseByCampusName(name):
status=200,
mimetype="application/json")
@course_routes.route('/api/courses/getMessagesByCourseName/<string:name>', methods=["GET"])
@course_routes.route('/api/courses/getUserCoursesByCampus/<string:token>/<string:campusId>', methods=['GET'])
@auto.doc()
def getMessagesByCourseName(name):
def getUserCoursesByCampus(token, campusId):
"""
<span class="card-title">>This Call will return an array of all courses in a given campus</span>
<span class="card-title">This Call will return an array of all Courses of a certain User in a specific Campus</span>
<br>
<b>Route Parameters</b><br>
- name: 'campus name'
- seToken: 'seToken'<br>
- campusId: 1234354543<br>
<br>
<br>
<b>Payload</b><br>
- NONE
- NONE <br>
<br>
<br>
<b>Response</b>
<br>
200 - JSON Example:<br>
<code>
{<br>
'courseName': 'Advance Math',<br>
'campusName': 'JCE',<br>
'startDate': '2015-14-3'<br>
'endDate': '2015-29-6'<br>
'taskFlag': false,<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>
'id' : 1234567890<br>
}
</code>
},<br>
....<br>
{<br>
...<br>
}req<br>
]<br>
<br>
403 - Invalid Token<br>
"""
user = get_user_by_token(token)
if user is None:
return bad_request("Bad user Token")
campus = Campus.get_by_id(int(campusId))
if campus is None:
return bad_request("No such Campus")
arr = []
query = Message.all()
query.filter("courseName = ", name)
for m in query.run():
msgDic = dict(json.loads(m.to_JSON()))
#add a key 'forSortDate' for sorting dates
msgTime = datetime.datetime(msgDic['date']['year'], msgDic['date']['month'], msgDic['date']['day'], msgDic['date']['hour'], msgDic['date']['minute'])
msgDic['forSortDate'] = msgTime
arr.append(msgDic)
arr = sorted(arr, key=itemgetter('forSortDate'), reverse=False)
for i in arr:
del i['forSortDate']
print arr
for i in user.courses_id_list:
course = Course.get_by_id(int(i))
if course.campusId == campus.key().id():
arr.append(dict(json.loads(course.to_JSON())))
if len(arr) != 0:
return Response(response=json.dumps(arr),
status=200,
mimetype="application/json")
else:
return Response(response=[],
return Response(response='[]',
status=200,
mimetype="application/json")
@course_routes.route('/api/courses/getCoursesByUser/<string:token>/<string:userId>', methods=['GET'])
@auto.doc()
def getCoursesByUser(token, userId):
"""
<span class="card-title">This Call will return an array of all Courses of a certain User</span>
<br>
<b>Route Parameters</b><br>
- seToken: 'seToken'<br>
- userId: 1234354543<br>
<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>
'id' : 1234567890<br>
},<br>
....<br>
{<br>
...<br>
}req<br>
]<br>
<br>
403 - Invalid Token<br>
"""
user = get_user_by_token(token)
if user is None:
return bad_request("Bad user Token")
otherUser = User.get_by_id(int(userId))
if otherUser is None:
return bad_request("Bad user Id")
arr = []
for i in otherUser.courses_id_list:
print i
course = Course.get_by_id(int(i))
arr.append(dict(json.loads(course.to_JSON())))
if len(arr) != 0:
return Response(response=json.dumps(arr),
status=200,
mimetype="application/json")
else:
return Response(response='[]',
status=200,
mimetype="application/json")
#----------------------------------------------------------
# PUT
#----------------------------------------------------------
@ -281,12 +351,12 @@ def getMessagesByCourseName(name):
@course_routes.route('/api/courses/deleteCourse/<string:token>/<string:courseid>', methods=['DELETE'])
@auto.doc()
def deleteCourse(token,courseid):
def deleteCourse(token, courseid):
"""
<span class="card-title">This Call will delete a specific Course</span>
<br>
<b>Route Parameters</b><br>
- seToken: 'seToken'
- seToken: 'seToken'<br>
- courseid: 'courseid'
<br>
<br>
@ -327,64 +397,64 @@ def deleteCourse(token,courseid):
return forbidden("lecturer is not owner of course")
@course_routes.route('/api/courses/deleteCoursesByCampus/<string:token>/<string:campusName>', methods=['DELETE'])
@auto.doc()
def deleteCoursesByCampus(token,campusName):
"""
<span class="card-title">This Call will delete a specific campus's courses</span>
<br>
<b>Route Parameters</b><br>
- seToken: 'seToken'
- title: 'campusName'
<br>
<br>
<b>Payload</b><br>
- NONE <br>
<br>
<br>
<b>Response</b>
<br>
202 - Deleted campus
<br>
204 - No Matching Campus Found
<br>
....<br>
{<br>
...<br>
}req<br>
]<br>
400 - Bad Request
<br>
403 - Invalid token or not a lecturer!<br>
"""
if not is_lecturer(token): #todo: change to lecturer id
return forbidden("Invalid token or not a lecturer!")
user = get_user_by_token(token)
campus = get_campus_by_campusName(campusName)
if campus is None:
return bad_request("Not a campus!")
#check user is owner of campus
if campus.master_user_id != user.key().id():
return forbidden("lecturer is not owner of campus!")
query = Course.all()
try:
query.filter('campusName =', campusName)
except Exception as e:
print e
return bad_request("invalid course title attribute")
for c in query.run():
db.delete(c)
db.save
return no_content()
# @course_routes.route('/api/courses/deleteCoursesByCampus/<string:token>/<string:campusid>', methods=['DELETE'])
# @auto.doc()
# def deleteCoursesByCampus(token,campusName):
# """
# <span class="card-title">This Call will delete a specific campus's courses</span>
# <br>
# <b>Route Parameters</b><br>
# - seToken: 'seToken'
# - title: 'campusName'
# <br>
# <br>
# <b>Payload</b><br>
# - NONE <br>
# <br>
# <br>
# <b>Response</b>
# <br>
# 202 - Deleted campus
# <br>
# 204 - No Matching Campus Found
# <br>
# ....<br>
# {<br>
# ...<br>
# }req<br>
#
# ]<br>
# 400 - Bad Request
# <br>
# 403 - Invalid token or not a lecturer!<br>
# """
#
# if not is_lecturer(token): #todo: change to lecturer id
# return forbidden("Invalid token or not a lecturer!")
#
#
# user = get_user_by_token(token)
# campus = get_campus_by_campusName(campusName)
# if campus is None:
# return bad_request("Not a campus!")
#
# #check user is owner of campus
# if campus.master_user_id != user.key().id():
# return forbidden("lecturer is not owner of campus!")
#
# query = Course.all()
#
# try:
# query.filter('campusName =', campusName)
# except Exception as e:
# print e
# return bad_request("invalid course title attribute")
#
# for c in query.run():
# db.delete(c)
# db.save
#
# return no_content()

View file

@ -0,0 +1,61 @@
__author__ = 'sagi'
import requests
from GithubAPI.GithubAPI import GitHubAPI_Keys
githubKeys = GitHubAPI_Keys()
def get_repo_general_info(repo_url):
url = 'https://api.github.com/repos/' + repo_url + '?client_id='+githubKeys.getId()+'&client_secret=' + githubKeys.getSecret()
req = requests.get(url)
return req.json()
def get_repo_stats(repo_url):
url = 'https://api.github.com/repos/' + repo_url + '/stats/contributors' + '?client_id='+githubKeys.getId()+'&client_secret=' + githubKeys.getSecret()
req = requests.get(url)
return req.json()
def get_repo_issues(repo_url):
url = 'https://api.github.com/repos/' + repo_url + '/issues' + '?client_id=' + githubKeys.getId() + '&client_secret=' + githubKeys.getSecret()
req = requests.get(url)
return req.json()
def get_repo_weekly_commits(repo_url):
url = 'https://api.github.com/repos/' + repo_url + '/stats/participation' + '?client_id=' + githubKeys.getId() + '&client_secret=' + githubKeys.getSecret()
req = requests.get(url)
return req.json()['all']
def make_macro(stats, info):
macro = {'labels': [], 'data': [[0]]}
macro['labels'].append('Commits')
macro['labels'].append('Open Issues')
for stat in stats:
macro['data'][0][0] += stat['total']
macro['data'][0].append(info['open_issues'])
return macro
# def make_micro(stats, info):
# micro = {'labels': [], 'data': [[]], 'series': []}
# micro['labels'].append('Commits')
# micro['labels'].append('Open Issues')
# for stat in stats:
# micro['data'][0][0] += stat['total']
# micro['data'].append(info['open_issues'])
#
# return micro
def get_github_data(repo_url):
project_info = {'stats': {}}
github_stats = get_repo_stats(repo_url) #first Call
project_info['info'] = get_repo_general_info(repo_url)
issues = get_repo_issues(repo_url)
weekly_commits = get_repo_weekly_commits(repo_url)
github_stats = get_repo_stats(repo_url) #Second Call
project_info['stats']['macro'] = make_macro(github_stats, project_info['info'])
project_info['stats']['weekly_commits'] = weekly_commits
project_info['issues'] = issues
return project_info

246
SE_API/MessageRoutes.py Normal file
View file

@ -0,0 +1,246 @@
__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.Course import Course
from models.Project import Project
from models.Message import Message
#Validation Utils Libs
from SE_API.Validation_Utils import *
from SE_API.Respones_Utils import *
message_routes = Blueprint("message_routes", __name__)
auto = Autodoc()
#----------------------------------------------------------
# POST
#----------------------------------------------------------
@message_routes.route('/api/messages/create/<string:token>', methods=['POST'])
@auto.doc()
def createMessage(token):
"""
<span class="card-title">This call will create a new Message in the DB</span>
<br>
<b>Route Parameters</b><br>
- seToken: 'seToken'
<br>
<br>
<b>Payload</b><br>
- JSON Object, Example: <br>
{<br>
'groupId' : 123456789,<br>
'message' : 'Class is canceled',<br>
'date' : {<br>
'year': 2015,<br>
'month': 3,<br>
'day': 14,<br>
'hour': 16,<br>
'minute': 53<br>
},<br>
'isProject' : true<br>
}<br>
<br>
<br>
<b>Response</b>
<br>
201 - Created
<br>
400 - Bad Request
<br>
403 - Invalid token or not a lecturer
"""
if not request.data:
return bad_request("no 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)
#try to parse payload
try:
payload = json.loads(request.data)
except Exception as e:
return bad_request("here")
try:
msg = Message(groupId=payload['groupId'], message=payload['message'], msgDate=datetime.datetime.now(), master_id=user.key().id())
except Exception as e:
print e
return bad_request("there")
try:
msg['isProject'] = payload['isProject']
except Exception as e:
pass
db.put(msg)
db.save
return created()
#----------------------------------------------------------
# PUT
#----------------------------------------------------------
#----------------------------------------------------------
# GET
#----------------------------------------------------------
@message_routes.route('/api/messages/getMessagesByGroup/<string:token>/<string:groupId>', methods=["GET"])
@auto.doc()
def getMessagesByGroup(token, groupId):
"""
<span class="card-title">>This Call will return an array of all messages (sorted by date),<br>
for a given group (course or project)</span>
<br>
<b>Route Parameters</b><br>
- SeToken: token <br>
- groupId: 1234567890
<br>
<br>
<b>Payload</b><br>
- NONE
<br>
<br>
<b>Response</b>
<br>
200 - JSON Example:<br>
<code>
{<br>
'groupId' : 1234567890,<br>
'message' : 'hello all',<br>
'date' : {<br>
'year': 2015,<br>
'month': 5,<br>
'day': 5,<br>
'hour': 5,<br>
'minute': 5<br>
},<br>
'id' : 1234567890,<br>
'master_id' : 1234567890,<br>
'isProject' : false<br>
}<br>
</code>
<br>
"""
if get_user_by_token(token) is None:
return bad_request("No such User")
arr = []
query = Message.all()
query.filter("groupId = ", int(groupId))
for m in query.run():
msgDic = dict(json.loads(m.to_JSON()))
#add a key 'forSortDate' for sorting dates
msgTime = datetime.datetime(msgDic['date']['year'], msgDic['date']['month'], msgDic['date']['day'], msgDic['date']['hour'], msgDic['date']['minute'])
msgDic['forSortDate'] = msgTime
arr.append(msgDic)
print arr
arr = sorted(arr, key=itemgetter('forSortDate'), reverse=True)
for i in arr:
del i['forSortDate']
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")
#----------------------------------------------------------
# DELETE
#----------------------------------------------------------
@message_routes.route('/api/messages/deleteMessage/<string:token>/<string:msgId>', methods=["DELETE"])
@auto.doc()
def deleteMessage(token, msgId):
"""
<span class="card-title">>This Call will delete a message by owner token</span>
<br>
<b>Route Parameters</b><br>
- SeToken: token
- msgId: 1234567890
<br>
<br>
<b>Payload</b><br>
- NONE
<br>
<br>
<b>Response</b>
<br>
200 - JSON Example:<br>
<code>
{<br>
'groupId' : 1234567890,<br>
'message' : 'hello all',<br>
'date' : {<br>
'year': 2015,<br>
'month': 5,<br>
'day': 5,<br>
'hour': 5,<br>
'minute': 5<br>
},<br>
'id' : 1234567890,<br>
'master_id' : 1234567890,<br>
'isProject' : false<br>
}<br>
</code>
<br>
"""
user = get_user_by_token(token)
if user is None:
return bad_request("No such User")
msg = Message.get_by_id(int(msgId))
if msg is None:
return bad_request("No such Message")
if msg.master_id != user.key().id():
return forbidden("User is not the Creator of the message")
db.delete(msg)
db.save
return no_content()
#----------------------------------------------------------
# DOCUMENTATION
#----------------------------------------------------------
@message_routes.route('/api/messages/help')
def documentation():
return auto.html()

View file

@ -21,6 +21,8 @@ from models.Project import Project
from SE_API.Validation_Utils import *
from SE_API.Respones_Utils import *
from GitHub_API_Connector import get_github_data
project_routes = Blueprint("project_routes", __name__)
auto = Autodoc()
@ -42,7 +44,7 @@ def create_project(token):
- JSON Object, Example: <br>
{<br>
'projectName': 'Advance Math',<br>
'courseName': 'JCE',<br>
'courseId': 1234567890,<br>
'logo_url': 'http://location.domain.com/image.jpg',<br>
'gitRepository': 'http://location.git.com/somthing'<br>
}<br>
@ -58,23 +60,28 @@ def create_project(token):
"""
if not request.data:
return bad_request()
try:
payload = json.loads(request.data)
#if not is_lecturer(token): #todo: change to lecturer id
# return forbidden("Invalid token or not a lecturer!")
except Exception as e:
return bad_request("invalid JSON format")
user = get_user_by_token(token)
if user is None:
return bad_request("Wrong user Token")
#todo: check legality
try:
project = Project(projectName=payload['projectName'], courseName=payload['courseName'], master_id=user.key().id(), gitRepository=payload['gitRepository'], membersId=[token])
project = Project(projectName=payload['projectName'], courseId=payload['courseId'], master_id=user.key().id(), gitRepository=payload['gitRepository'], membersId=[token])
except Exception as e:
print e
return bad_request()
db.put(project)
#update user projects list
user.projects_id_list.append(str(project.key().id()))
db.put(user)
db.save
return Response(response=project.to_JSON(),
status=200,
@ -84,19 +91,118 @@ def create_project(token):
# PUT
#----------------------------------------------------------
@project_routes.route('/api/projects/joinProject/<string:token>/<string:projectId>', methods=["PUT"])
@auto.doc()
def joinProject(token, projectId):
"""
<span class="card-title">This call will add the user (by token) to a specific project</span>
<br>
<b>Route Parameters</b><br>
- seToken: 'seToken'<br>
- projectId: 123456789
<br>
<br>
<b>Payload</b><br>
- None <br>
<br>
<b>Response</b>
<br>
202 - Accepted
<br>
400 - Bad Request
<br>
403 - Invalid token or not a lecturer
"""
user = get_user_by_token(token)
if user is None:
return bad_request("Wrong user Token")
project = Project.get_by_id(int(projectId))
if project is None:
return bad_request("No such Project")
if str(user.key().id()) in project.membersId:
return bad_request("User is already member in Project")
project.membersId.append(str(user.key().id()))
db.put(project)
db.save
return Response(response=project.to_JSON(),
status=202,
mimetype="application/json")
#----------------------------------------------------------
# GET
#----------------------------------------------------------
@project_routes.route('/api/projects/getProjectsByCourseName/<string:name>', methods=["GET"])
@project_routes.route('/api/projects/getProjectsByCourse/<string:token>/<string:courseId>', methods=["GET"])
@auto.doc()
def getProjectsByCourseName(name):
def getProjectsByCourse(token, courseId):
"""
<span class="card-title">>This Call will return an array of all projects in a given course</span>
<br>
<b>Route Parameters</b><br>
- name: 'course name'
- seToken: token<br>
- courseId: 1234567890
<br>
<br>
<b>Payload</b><br>
- NONE
<br>
<br>
<b>Response</b>
<br>
200 - JSON Example:<br>
<code>
{<br>
'projectName': 'Advance Math',<br>
'courseId': 123456789,<br>
'grade': 98,<br>
'logo_url': 'http://location.domain.com/image.jpg',<br>
'gitRepository': 'repoOwner/repoName',<br>
'membersId': ['bob', 'dylan', 'quentin', 'terentino'],<br>
'id' : 1234567890<br>
}
</code>
<br>
"""
if get_user_by_token(token) is None:
return bad_request("Bad User Token")
arr = []
query = Project.all()
query.filter("courseId = ", int(courseId))
for p in query.run():
proj = dict(json.loads(p.to_JSON()))
proj['info'] = get_github_data(p.gitRepository)
arr.append(proj)
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")
@project_routes.route('/api/projects/getProjectsByUser/<string:token>', methods=["GET"])
@auto.doc()
def getProjectsByUser(token):
"""
<span class="card-title">>This Call will return an array of all projects in a given course</span>
<br>
<b>Route Parameters</b><br>
- token: 'SEToken'
<br>
<br>
<b>Payload</b><br>
@ -120,13 +226,18 @@ def getProjectsByCourseName(name):
<br>
"""
arr = []
query = Project.all()
query.filter("courseName = ", name)
user = get_user_by_token(token)
if user is None:
return bad_request("Bad Token")
arr = []
for p in user.projects_id_list:
project = Project.get_by_id(int(p))
projDict = dict(json.loads(project.to_JSON()))
projDict['info'] = get_github_data(project.gitRepository)
arr.append(projDict)
for p in query.run():
arr.append(dict(json.loads(p.to_JSON())))
print arr
if len(arr) != 0:
return Response(response=json.dumps(arr),
status=200,
@ -144,15 +255,15 @@ def getProjectsByCourseName(name):
@project_routes.route('/api/projects/deleteProject/<string:token>/<string:projectid>', methods=['DELETE'])
@project_routes.route('/api/projects/deleteProject/<string:token>/<string:projectId>', methods=['DELETE'])
@auto.doc()
def deleteProject(token,projectid):
def deleteProject(token,projectId):
"""
<span class="card-title">This Call will delete a specific Project</span>
<br>
<b>Route Parameters</b><br>
- seToken: 'seToken'
- courseid: 'projectid'
- projectId: 'projectid'
<br>
<br>
<b>Payload</b><br>
@ -178,7 +289,9 @@ def deleteProject(token,projectid):
# return forbidden("Invalid token or not a lecturer!")
user = get_user_by_token(token)
p = Project.get_by_id(int(projectid))
if user is None:
return bad_request("Bad user Token")
p = Project.get_by_id(int(projectId))
if p is None:
return bad_request("no such Project")

View file

@ -153,14 +153,15 @@ def create_task(token):
#----------------------------------------------------------
@task_routes.route('/api/tasks/getAllTasks/<string:courseName>', methods=["GET"])
@task_routes.route('/api/tasks/getAllTasksByCourse/<string:token>/<string:courseId>', methods=["GET"])
@auto.doc()
def getAllTasks(courseName):
def getAllTasksByCourse(token, courseId):
"""
<span class="card-title">>This Call will return an array of all Tasks in a course by date</span>
<span class="card-title">>This Call will return an array of all Tasks in a course ordered by date</span>
<br>
<b>Route Parameters</b><br>
- name: 'course name'
- SeToken: token<br>
- courseId: 1234567890
<br>
<br>
<b>Payload</b><br>
@ -173,7 +174,7 @@ def getAllTasks(courseName):
<code>
{<br>
'title' : 'Task1',<br>
'courseName' : 'advance Math',<br>
'courseId' : 12345678,<br>
'description' : 'prepare by sunday',<br>
'dueDate' : {
'year' : 2015,
@ -186,10 +187,12 @@ def getAllTasks(courseName):
</code>
<br>
"""
if get_user_by_token(token) is None:
return bad_request("Bad User Token")
arr = []
query = Task.all()
query.filter("courseName = ", courseName)
query.filter("courseId = ", courseId)
for t in query.run():
taskDic =dict(json.loads(t.to_JSON()))
@ -211,14 +214,15 @@ def getAllTasks(courseName):
return no_content()
@task_routes.route('/api/tasks/getAllFutureTasks/<string:courseName>', methods=["GET"])
@task_routes.route('/api/tasks/getAllFutureTasks/<string:token>/<string:courseId>', methods=["GET"])
@auto.doc()
def getAllFutureTasks(courseName):
def getAllFutureTasks(token, courseId):
"""
<span class="card-title">>This Call will return an array of all Future Tasks in a course, ordered by date</span>
<br>
<b>Route Parameters</b><br>
- name: 'course name'
- SeToken: token<br>
- courseId: 1234567890
<br>
<br>
<b>Payload</b><br>
@ -245,9 +249,12 @@ def getAllFutureTasks(courseName):
<br>
"""
if get_user_by_token(token) is None:
return bad_request("Bad User Token")
arr = []
query = Task.all()
query.filter("courseName = ", courseName)
query.filter("courseId = ", courseId)
for t in query.run():
taskDic =dict(json.loads(t.to_JSON()))
@ -271,14 +278,15 @@ def getAllFutureTasks(courseName):
@task_routes.route('/api/tasks/getTaskComponents/<string:taskId>', methods=["GET"])
@task_routes.route('/api/tasks/getTaskComponents/<string:token>/<string:taskId>', methods=["GET"])
@auto.doc()
def getTaskComponents(taskId):
def getTaskComponents(token, taskId):
"""
<span class="card-title">>This Call will return an array of all components for a given task</span>
<br>
<b>Route Parameters</b><br>
- taskId: integer
- SeToken: token<br>
- taskId: 1234567890
<br>
<br>
<b>Payload</b><br>
@ -311,6 +319,9 @@ def getTaskComponents(taskId):
<br>
"""
if get_user_by_token(token) is None:
return bad_request("Bad User Token")
arr = []
query = TaskComponent.all()
query.filter("taskId = ", taskId)
@ -336,15 +347,15 @@ def getTaskComponents(taskId):
@task_routes.route('/api/tasks/deleteTask/<string:token>/<string:taskid>', methods=['DELETE'])
@task_routes.route('/api/tasks/deleteTask/<string:token>/<string:taskId>', methods=['DELETE'])
@auto.doc()
def deleteTask(token,taskid):
def deleteTask(token, taskId):
"""
<span class="card-title">This Call will delete a specific Task</span>
<br>
<b>Route Parameters</b><br>
- seToken: 'seToken'
- taskid: 'taskid'
- taskId: 'taskid'
<br>
<br>
<b>Payload</b><br>
@ -373,7 +384,7 @@ def deleteTask(token,taskid):
#return forbidden("lecturer is not owner of course")
user = get_user_by_token(token)
c = Task.get_by_id(int(taskid))
c = Task.get_by_id(int(taskId))
if c is None:
return bad_request("no such Task")
@ -384,15 +395,15 @@ def deleteTask(token,taskid):
return accepted("Task deleted")
@task_routes.route('/api/tasks/deleteTaskComponents/<string:token>/<string:taskid>', methods=['DELETE'])
@task_routes.route('/api/tasks/deleteTaskComponents/<string:token>/<string:taskId>', methods=['DELETE'])
@auto.doc()
def deleteTaskComponents(token,taskid):
def deleteTaskComponents(token,taskId):
"""
<span class="card-title">This Call will delete a specific Task's components</span>
<br>
<b>Route Parameters</b><br>
- seToken: 'seToken'
- taskid: 'taskid'
- taskId: 'taskid'
<br>
<br>
<b>Payload</b><br>
@ -421,7 +432,7 @@ def deleteTaskComponents(token,taskid):
#return forbidden("lecturer is not owner of course")
user = get_user_by_token(token)
t = Task.get_by_id(int(taskid))
t = Task.get_by_id(int(taskId))
if t is None:
return bad_request("no such Task")

View file

@ -17,6 +17,7 @@ from flask.ext.autodoc import Autodoc
# DB Models
from models.User import User
from models.Course import Course
from models.Project import Project
#Validation Utils Libs
from SE_API.Validation_Utils import *
@ -52,7 +53,6 @@ def updateUser(token):
{<br>
'name': 'new name',<br>
'isLecturer': true,<br>
'campusName': 'JCE'<br>
}<br>
<br>
<b>Response</b>
@ -79,10 +79,6 @@ def updateUser(token):
except Exception:
pass
try:
user.campusName = payload['campusName']
except Exception:
pass
try:
user.isLecturer = payload['isLecturer']
@ -268,26 +264,267 @@ def getUserByToken(token):
status=200,
mimetype="application/json") # Real response!
return no_content("No User Found")
@user_routes.route('/api/users/getUserById/', defaults={'token': None, 'id': None})
@user_routes.route('/api/users/getUserById/<string:token>/<string:id>', methods=["GET"])
@auto.doc()
def getUserById(token, id):
"""
<span class="card-title">>This Call will return a user by a given UserId</span>
<br>
<b>Route Parameters</b><br>
- seToken: 'seToken'
<br>
<br>
<b>Payload</b><br>
- NONE
<br>
<br>
<b>Response</b>
<br>
200 - JSON Example:<br>
<code>
{<br>
'username': 'DarkLord',<br>
'name': 'Darth Vader',<br>
'email': 'darkLord@death.planet,<br>
'isLecturer': 'True',<br>
'seToken': 'xxxxxx-xxxxx-xxxxx-xxxxxx',<br>
'avatar_url': 'http://location.git.com/somthing'<br>
'isFirstLogin': False,<br>
'campuses_id_list': [{<br>
'master_user_id': 111,<br>
'id': 5629499534213120,<br>
'email_ending': "@post.jce.ac.il",<br>
'avatar_url': "https://yt3.ggpht.com/--ZkWxybWGOM/AAAAAAAAAAI/AAAAAAAAAAA/_nAICC_kzzI/s88-c-k-no/photo.jpg",<br>
'title': "JCE"
}],<br>
'courses_id_list': ['a','b','c'],<br>
'id': 234253523<br>
}<br>
</code>
<br>
403 - No User Found
"""
if token is None or id is None:
return no_content("No Token/ID, No User Found")
if get_user_by_token(token) is None:
return forbidden('Invalid Token')
u = get_user_by_id(int(id))
if u is None:
return no_content('No user Found')
for index, c in enumerate(u.campuses_id_list):
c = json.loads(Campus.get_by_id(int(c)).to_JSON())
u.campuses_id_list[index] = c
return Response(response=u.to_JSON(),
status=200,
mimetype="application/json") # Real response!
return no_content("No User Found")
@user_routes.route('/api/users/getUsersByCampus/<string:token>/<string:campusId>', methods=["GET"])
@auto.doc()
def getUsersByCampus(token, campusId):
"""
<span class="card-title">>This Call will return all users in Campus</span>
<br>
<b>Route Parameters</b><br>
- seToken: 'seToken'<br>
- campusId: 123456789
<br>
<br>
<b>Payload</b><br>
- NONE
<br>
<br>
<b>Response</b>
<br>
200 - JSON Example:<br>
<code>
{<br>
'username': 'DarkLord',<br>
'name': 'Darth Vader',<br>
'email': 'darkLord@death.planet,<br>
'isLecturer': 'True',<br>
'seToken': 'xxxxxx-xxxxx-xxxxx-xxxxxx',<br>
'avatar_url': 'http://location.git.com/somthing'<br>
'isFirstLogin': False,<br>
'campuses_id_list': [75894378,5893482,894032],<br>
'courses_id_list': [4324,432432,4324324]<br>
}
</code>
<br>
403 - No User Found
"""
if token is None:
return no_content("Token Is Empty, No User Found")
user = get_user_by_token(token)
if user is None:
return bad_request("Bad User Token")
campus = Campus.get_by_id(int(campusId))
if campus is None:
return bad_request("No such Campus")
arr = []
for u in enumerate(campus.membersId):
u = json.loads(User.get_by_id(int(u)).to_JSON())
arr.append(dict(u))
if len(arr) != 0:
return Response(response=json.dumps(arr),
status=200,
mimetype="application/json")
else:
return Response(response=[],
status=200,
mimetype="application/json")
@user_routes.route('/api/users/getUsersByCourse/<string:token>/<string:courseId>', methods=["GET"])
@auto.doc()
def getUsersByCourse(token, courseId):
"""
<span class="card-title">>This Call will return all users in Course</span>
<br>
<b>Route Parameters</b><br>
- seToken: 'seToken'<br>
- courseId: 123456789
<br>
<br>
<b>Payload</b><br>
- NONE
<br>
<br>
<b>Response</b>
<br>
200 - JSON Example:<br>
<code>
{<br>
'username': 'DarkLord',<br>
'name': 'Darth Vader',<br>
'email': 'darkLord@death.planet,<br>
'isLecturer': 'True',<br>
'seToken': 'xxxxxx-xxxxx-xxxxx-xxxxxx',<br>
'avatar_url': 'http://location.git.com/somthing'<br>
'isFirstLogin': False,<br>
'campuses_id_list': [1243567,7583584904],<br>
'courses_id_list': [543543,54353453,543543534]<br>
}
</code>
<br>
403 - No User Found
"""
if token is None:
return no_content("Token Is Empty, No User Found")
user = get_user_by_token(token)
if user is None:
return bad_request("Bad User Token")
course = Course.get_by_id(int(courseId))
if course is None:
return bad_request("No such Course")
arr = []
for u in enumerate(course.membersId):
u = json.loads(User.get_by_id(int(u)).to_JSON())
arr.append(dict(u))
if len(arr) != 0:
return Response(response=json.dumps(arr),
status=200,
mimetype="application/json")
else:
return Response(response=[],
status=200,
mimetype="application/json")
@user_routes.route('/api/users/getUsersByProject/<string:token>/<string:projectId>', methods=["GET"])
@auto.doc()
def getUsersByProject(token, projectId):
"""
<span class="card-title">>This Call will return all users in Project</span>
<br>
<b>Route Parameters</b><br>
- seToken: 'seToken'<br>
- projectId: 123456789
<br>
<br>
<b>Payload</b><br>
- NONE
<br>
<br>
<b>Response</b>
<br>
200 - JSON Example:<br>
<code>
{<br>
'username': 'DarkLord',<br>
'name': 'Darth Vader',<br>
'email': 'darkLord@death.planet,<br>
'isLecturer': 'True',<br>
'seToken': 'xxxxxx-xxxxx-xxxxx-xxxxxx',<br>
'avatar_url': 'http://location.git.com/somthing'<br>
'isFirstLogin': False,<br>
'campuses_id_list': [43243532532,5325325325,532532342],<br>
'courses_id_list': [53523,43432423,432432432432]<br>
}
</code>
<br>
403 - No User Found
"""
if token is None:
return no_content("Token Is Empty, No User Found")
user = get_user_by_token(token)
if user is None:
return bad_request("Bad User Token")
project = Project.get_by_id(int(projectId))
if project is None:
return bad_request("No such Project")
arr = []
for u in enumerate(project.membersId):
u = json.loads(User.get_by_id(int(u)).to_JSON())
arr.append(dict(u))
if len(arr) != 0:
return Response(response=json.dumps(arr),
status=200,
mimetype="application/json")
else:
return Response(response=[],
status=200,
mimetype="application/json")
#----------------------------------------------------------
# DELETE
#----------------------------------------------------------
@user_routes.route('/api/users/removeUserFromCampus/<string:token>/<string:campusId>', methods=["PUT"])
@user_routes.route('/api/users/removeUserFromCampus/<string:token>/<string:userId>/<string:campusId>', methods=["PUT"])
@auto.doc()
def removeUserFromCampus(token, campusId):
def removeUserFromCampus(token, userId, campusId):
"""
<span class="card-title">>This Call will remove a Campus from a user Campus list</span>
<span class="card-title">>This Call will remove a user from a campus</span>
<br>
<b>Route Parameters</b><br>
- seToken: 'seToken'
- seToken: 'seToken'<br>
- userId: 0987654321,<br>
- 'campusId': 1234567890<br>
<br>
<br>
@ -303,18 +540,13 @@ def removeUserFromCampus(token, campusId):
400 - Bad Request
"""
if not request.data:
return bad_request()
requestingUser = get_user_by_token(token)
if requestingUser is None:
return bad_request("Bad User Token")
try:
payload = json.loads(request.data)
except Exception as e:
return bad_request()
if not is_lecturer(token): #todo: change to lecturer id
return forbidden("Invalid token or not a lecturer!")
user = get_user_by_token(token)
userToRemove = User.get_by_id(int(userId))
if userToRemove is None:
return bad_request("No such user to remove")
#check Campus Exists
campus = Campus.get_by_id(int(campusId))
@ -322,18 +554,20 @@ def removeUserFromCampus(token, campusId):
return bad_request("No such Campus!")
#check if user is owner of Campus
if user.key().id() != campus.master_user_id:
return forbidden("Lecturer is not owner of course")
if requestingUser.key().id() != campus.master_user_id:
# check if user want to delete itself
if requestingUser.key().id() != userToRemove.key().id():
return forbidden("No permission to delete user")
try:
user.campuses_id_list.remove(campusId)
userToRemove.campuses_id_list.remove(campusId)
except Exception as e:
print e
return bad_request("user is not listed to this campus")
db.put(user)
db.put(userToRemove)
db.save
return Response(response=user.to_JSON(),
return Response(response=userToRemove.to_JSON(),
status=200,
mimetype="application/json") # Real response!
@ -341,64 +575,128 @@ def removeUserFromCampus(token, campusId):
# @user_routes.route('/api/users/removeUserFromCourse/<string:token>/<string:courseId>', methods=["PUT"])
# @auto.doc()
# def removeUserFromCourse(token, courseId):
# """
# <span class="card-title">>This Call will remove a Course from a user Campus list</span>
# <br>
# <b>Route Parameters</b><br>
# - seToken: 'seToken'
# - 'courseId': 1234567890<br>
# <br>
# <br>
# <b>Payload</b><br>
# - NONE
# {<br>
# }<br>
# <br>
# <b>Response</b>
# <br>
# 200 - User updated
# <br>
# 400 - Bad Request
# """
#
# if not request.data:
# return bad_request()
#
# try:
# payload = json.loads(request.data)
# except Exception as e:
# return bad_request()
#
# user = get_user_by_token(token)
# if user is None:
# return bad_request("No such user!")
#
#
# #check Course Exists
# course = Course.get_by_id(int(courseId))
# if course is None:
# return bad_request("No such Course!")
#
# #check if user is owner of Campus
# if user.key().id() != course.master_id:
# return forbidden("Lecturer is not owner of course")
#
# try:
# user.campuses_id_list.remove(campusId)
# except Exception as e:
# print e
# return bad_request("user is not listed to this campus")
#
# db.put(user)
# db.save
# return Response(response=user.to_JSON(),
# status=200,
# mimetype="application/json") # Real response!
#
#
@user_routes.route('/api/users/removeUserFromCourse/<string:token>/<string:userId>/<string:courseId>', methods=["PUT"])
@auto.doc()
def removeUserFromCourse(token, userId, courseId):
"""
<span class="card-title">>This Call will remove a user from a course</span>
<br>
<b>Route Parameters</b><br>
- seToken: 'seToken'<br>
- userId: 0987654321,<br>
- 'courseId': 1234567890<br>
<br>
<br>
<b>Payload</b><br>
- NONE
{<br>
}<br>
<br>
<b>Response</b>
<br>
200 - User updated
<br>
400 - Bad Request
"""
requestingUser = get_user_by_token(token)
if requestingUser is None:
return bad_request("Bad User Token")
userToRemove = User.get_by_id(int(userId))
if userToRemove is None:
return bad_request("No such user to remove")
#check Course Exists
course = Course.get_by_id(int(courseId))
if course is None:
return bad_request("No such Course!")
#check if user is owner of Course
if requestingUser.key().id() != course.master_id:
# check if user want to delete itself
if requestingUser.key().id() != userToRemove.key().id():
return forbidden("No permission to delete user")
try:
userToRemove.courses_id_list.remove(courseId)
course.membersId.remove(userToRemove.key().id())
except Exception as e:
return bad_request("user is not listed to this course")
db.put(userToRemove)
db.put(course)
db.save
return Response(response=userToRemove.to_JSON(),
status=200,
mimetype="application/json") # Real response!
@user_routes.route('/api/users/removeUserFromProject/<string:token>/<string:userId>/<string:projectId>', methods=["PUT"])
@auto.doc()
def removeUserFromProject(token, userId, projectId):
"""
<span class="card-title">>This Call will remove a user from a project</span>
<br>
<b>Route Parameters</b><br>
- seToken: 'seToken'<br>
- userId: 0987654321,<br>
- 'projectId': 1234567890<br>
<br>
<br>
<b>Payload</b><br>
- NONE
{<br>
}<br>
<br>
<b>Response</b>
<br>
200 - User updated
<br>
400 - Bad Request
"""
requestingUser = get_user_by_token(token)
if requestingUser is None:
return bad_request("Bad User Token")
userToRemove = User.get_by_id(int(userId))
if userToRemove is None:
return bad_request("No such user to remove")
#check project Exists
project = Project.get_by_id(int(projectId))
if project is None:
return bad_request("No such Project!")
#check if user is owner of project
if requestingUser.key().id() != project.master_id:
# check if user want to delete itself
if requestingUser.key().id() != userToRemove.key().id():
return forbidden("No permission to delete user")
try:
userToRemove.projects_id_list.remove(projectId)
project.membersId.remove(userToRemove.key().id())
except Exception as e:
return bad_request("user is not listed to this project")
db.put(userToRemove)
db.put(project)
db.save
return Response(response=userToRemove.to_JSON(),
status=200,
mimetype="application/json") # Real response!

View file

@ -13,6 +13,10 @@ def get_user_by_token(token):
return u
return None
def get_user_by_id(id):
u = User.get_by_id(id)
return u
def get_campus_by_campusName(campusName):
query = Campus.all()
query.filter("title = ", campusName)

View file

@ -1,91 +0,0 @@
__author__ = 'etye'
import unittest
import requests
import json
from Testing.config import __CONFIG__
class CoursesTestPlan(unittest.TestCase):
@classmethod
def setUpClass(cls):
debug = __CONFIG__['DEBUG']
if debug:
url = __CONFIG__['PATHS']['DEBUG']
else:
url = __CONFIG__['PATHS']['PRODUCTION']
cls.url_ = url
request = requests.get(url+'api/qa/init')
if 200 <= request.status_code <= 299:
print 'Initialized'
def test_coursesCreate_Lecturer(self):
headers = {'content-type': 'application/json'}
url = 'http://se-hub.appspot.com/api/courses/create/_QA_TOKEN_TEST_LECTURER'
params = {'seToken': 'seToken' }
data = {
'courseName': 'QA COURSE',
'campusName': 'https://yt3.ggpht.com/--ZkWxybWGOM/AAAAAAAAAAI/AAAAAAAAAAA/_nAICC_kzzI/s88-c-k-no/photo.jpg',
'projects': '@gay.lord.ultima.multi.omega',
'startDate': {'year': 2015, 'month' : 4, 'day' : 3},
'endDate': {'year': 2016,'month' : 6,'day' : 6}
}
#r = requests.post(self.__class__.url_+'api/courses/create/'+__CONFIG__['TOKENS']['STUDENT'],data=payload)
r = requests.post(url, params=params, data=json.dumps(data), headers=headers)
'''
payload = {
'courseName': 'QA COURSE',
'campusName': 'https://yt3.ggpht.com/--ZkWxybWGOM/AAAAAAAAAAI/AAAAAAAAAAA/_nAICC_kzzI/s88-c-k-no/photo.jpg',
'projects': '@gay.lord.ultima.multi.omega',
'startDate': {'year': 2015, 'month' : 4, 'day' : 3},
'endDate': {'year': 2016,'month' : 6,'day' : 6}
}
'''
# r = requests.post(self.__class__.url_+'api/courses/create/'+__CONFIG__['TOKENS']['LECTURER'],data=payload)
#r = requests.post('http://localhost:8080/api/courses/create/_QA_TOKEN_TEST_LECTURER',data=payload)
#self.assertEquals(r.status_code, 201)
def test_coursesCreate_InvalidToken(self):
headers = {'content-type': 'application/json'}
url = self.__class__.url_+'api/courses/create/invalidToken'
data = {
'courseName': 'QA COURSE',
'campusName': 'https://yt3.ggpht.com/--ZkWxybWGOM/AAAAAAAAAAI/AAAAAAAAAAA/_nAICC_kzzI/s88-c-k-no/photo.jpg',
'projects': '@gay.lord.ultima.multi.omega',
'startDate': {'year': 2015, 'month' : 4, 'day' : 3},
'endDate': {'year': 2016,'month' : 6,'day' : 6}
}
params = {'seToken': 'seToken' }
r = requests.post(url, params=params, data=json.dumps(data), headers=headers)
self.assertEquals(r.status_code, 403)
'''
payload = {'courseName': 'Advance Math', 'campusName': 'JCE', 'startDate':'2015-14-3','endDate': '2015-29-6','taskFlag': 'False'}
payload = {
'courseName': 'QA COURSE',
'campusName': 'https://yt3.ggpht.com/--ZkWxybWGOM/AAAAAAAAAAI/AAAAAAAAAAA/_nAICC_kzzI/s88-c-k-no/photo.jpg',
'projects': '@gay.lord.ultima.multi.omega',
'startDate': {'year': 2015, 'month' : 4, 'day' : 3},
'endDate': {'year': 2016,'month' : 6,'day' : 6}
}
r = requests.post(self.__class__.url_+'api/courses/create/invalidToken',data=payload)
'''
def test_coursesCreate_Student(self):
headers = {'content-type': 'application/json'}
url = self.__class__.url_+'api/courses/create/_QA_TOKEN_TEST_STUDENT'
params = {'seToken': 'seToken' }
data = {
'courseName': 'QA COURSE',
'campusName': 'https://yt3.ggpht.com/--ZkWxybWGOM/AAAAAAAAAAI/AAAAAAAAAAA/_nAICC_kzzI/s88-c-k-no/photo.jpg',
'projects': '@gay.lord.ultima.multi.omega',
'startDate': {'year': 2015, 'month' : 4, 'day' : 3},
'endDate': {'year': 2016,'month' : 6,'day' : 6}
}
#r = requests.post(self.__class__.url_+'api/courses/create/'+__CONFIG__['TOKENS']['STUDENT'],data=payload)
r = requests.post(url, params=params, data=json.dumps(data), headers=headers)
self.assertEquals(r.status_code, 403, 'message: ' + r.json()['message'])
def test_getCourseByCampusName(self):
r = requests.get(self.__class__.url_+'api/courses/getCourseByCampusName/'+__CONFIG__['TOKENS']['CAMPUS_NAME'])
self.assertEquals(r.status_code, 200)
if __name__ == '__main__':
unittest.main()

View file

@ -9,12 +9,15 @@ class Campus(db.Model):
avatar_url = db.StringProperty(required=True)
email_ending = db.StringProperty(required=True)
master_user_id = db.IntegerProperty(required=True)
membersId = db.StringListProperty(required=True, default=[])
def to_JSON(self):
data = {'title': self.title,
'email_ending': self.email_ending,
'master_user_id': self.master_user_id,
'avatar_url': self.avatar_url,
'membersId': self.membersId,
'id' : self.key().id()
}
return json.dumps(data)

View file

@ -5,15 +5,16 @@ from google.appengine.ext import db
class Course(db.Model):
courseName = db.StringProperty(required=True)
campusName = db.StringProperty(required=True)
campusId = db.IntegerProperty(required=True)
master_id = db.IntegerProperty(required=True)
# projects = db.StringListProperty(required=True,default=[])
startDate = db.DateProperty(required=True)
endDate = db.DateProperty(required=True)
membersId = db.StringListProperty(required=True)
def to_JSON(self):
data = {'courseName' : self.courseName,
'campusName' : self.campusName,
'campusId' : self.campusId,
'master_id' : self.master_id,
# 'projects' : self.projects,
'startDate' : {
@ -26,6 +27,7 @@ class Course(db.Model):
'month': self.endDate.month,
'day': self.endDate.day,
},
'membersId' : self.membersId,
'id' : self.key().id()
}
return json.dumps(data)

View file

@ -4,13 +4,15 @@ __author__ = 'Aran'
from google.appengine.ext import db
class Message(db.Model):
courseName = db.StringProperty(required=True)
groupId = db.IntegerProperty(required=True)
message = db.StringProperty(required=True)
msgDate = db.DateTimeProperty(required=True)
master_id = db.IntegerProperty(required=True)
isProject = db.BooleanProperty(default=False)
def to_JSON(self):
data = {
'courseName' : self.courseName,
'groupId' : self.groupId,
'message' : self.message,
'date' : {
'year': self.msgDate.year,
@ -19,6 +21,8 @@ class Message(db.Model):
'hour': self.msgDate.hour,
'minute': self.msgDate.minute
},
'id' : self.key().id()
'id' : self.key().id(),
'master_id' : self.master_id,
'isProject' : self.isProject
}
return json.dumps(data)

View file

@ -5,7 +5,7 @@ from google.appengine.ext import db
class Project(db.Model):
projectName = db.StringProperty(required=True)
courseName = db.StringProperty(required=True)
courseId = db.IntegerProperty(required=True)
master_id = db.IntegerProperty(required=True)
grade = db.IntegerProperty(required=True, default=0)
logo_url = db.StringProperty(required=False)
@ -14,7 +14,7 @@ class Project(db.Model):
def to_JSON(self):
data = {'projectName' : self.projectName,
'courseName' : self.courseName,
'courseId' : self.courseId,
'master_id' : self.master_id,
'grade' : self.grade,
'logo_url' : self.logo_url,

View file

@ -6,14 +6,14 @@ from google.appengine.ext import db
class Task(db.Model):
title = db.StringProperty(required=True)
courseName = db.StringProperty(required=True)
courseId = db.IntegerProperty(required=True)
description = db.StringProperty(required=True,default=" ")
dueDate = db.DateProperty(required=True)
isPersonal = db.BooleanProperty(required=True, default=True)
def to_JSON(self):
data = {'title' : self.title,
'courseName' : self.courseName,
'courseId' : self.courseId,
'description' : self.description,
'dueDate' : {
'year': self.dueDate.year,

View file

@ -12,9 +12,9 @@ class User(db.Model):
seToken = db.StringProperty(required=True)
avatar_url = db.StringProperty(required=True)
isFirstLogin = db.BooleanProperty(default=True)
campusName = db.StringProperty(required=True, default=" ")
campuses_id_list = db.StringListProperty(default=[])
courses_id_list = db.StringListProperty(default=[])
projects_id_list = db.StringListProperty(default=[])
def to_JSON(self):
data = {'username' : self.username,
@ -23,8 +23,9 @@ class User(db.Model):
'isLecturer' : self.isLecturer,
'avatar_url' : self.avatar_url,
'isFirstLogin' : self.isFirstLogin,
'campusName': self.campusName,
'campuses_id_list': self.campuses_id_list,
'courses_id_list': self.courses_id_list
'courses_id_list': self.courses_id_list,
'projects_id_list': self.projects_id_list,
'id' : self.key().id()
}
return json.dumps(data)

View file

@ -54,18 +54,20 @@
SE-Hub Docs Index
</h1>
<div>
<center>
<div style="width: 40%">
<ul class="collection">
<li class="collection-item dismissable"><div>Users Related API<a href="/api/users/help" class="secondary-content"><i class="mdi-content-send"></i></a></div></li>
<li class="collection-item dismissable"><div>Campuses Related API<a href="/api/campuses/help" class="secondary-content"><i class="mdi-content-send"></i></a></div></li>
<li class="collection-item dismissable"><div>Courses Related API<a href="/api/courses/help" class="secondary-content"><i class="mdi-content-send"></i></a></div></li>
<li class="collection-item dismissable"><div>Projects Related API<a href="/api/projects/help" class="secondary-content"><i class="mdi-content-send"></i></a></div></li>
<li class="collection-item dismissable"><div>Tasks Related API<a href="/api/tasks/help" class="secondary-content"><i class="mdi-content-send"></i></a></div></li>
<li class="collection-item dismissable"><div>Messages Related API<a href="/api/messages/help" class="secondary-content"><i class="mdi-content-send"></i></a></div></li>
<li class="collection-item dismissable"><div>Validation Related API<a href="#!" class="secondary-content"><i class="mdi-content-send"></i></a></div></li>
<li class="collection-item dismissable"><div>Miscellaneous Methods<a href="/api/help/misc" class="secondary-content"><i class="mdi-content-send"></i></a></div></li>
</ul>
</div>
</center>
<footer class="page-footer">
<div class="container">
<div class="row">

View file

@ -151,6 +151,38 @@ body.noscroll
/*width: 100%;*/
}
/*.hvr-curl-top-left {
display: inline-block;
vertical-align: middle;
-webkit-transform: translateZ(0);
transform: translateZ(0);
box-shadow: 0 0 1px rgba(0, 0, 0, 0);
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
-moz-osx-font-smoothing: grayscale;
position: relative;
}*/
/* Grow Rotate */
/*.campusCard {
display: inline-block;
vertical-align: middle;
-webkit-transform: translateZ(0);
transform: translateZ(0);
box-shadow: 0 0 1px rgba(0, 0, 0, 0);
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
-moz-osx-font-smoothing: grayscale;
-webkit-transition-duration: 0.3s;
transition-duration: 0.3s;
-webkit-transition-property: transform;
transition-property: transform;
}*/
.campusCard:hover, .campusCard:focus, .campusCard:active {
-webkit-transform: rotate(4deg);
transform: rotate(4deg);
}
/*.feedMessages
{
overflow: scroll;
@ -197,6 +229,18 @@ body.noscroll
border-radius: 1px black solid;
}*/
.allCampusesShow
{
overflow:hidden;
background-size: auto;
}
.campusCard
{
/*height:80%;*/
/*width:80%;*/
}
.gray-font
{
color: #7f7f7f;
@ -397,6 +441,11 @@ body.noscroll
border-color: solid red;
}
.cardAllCampuses
{
word-break: break-word;
}
.addMessage
{
font-size: 2em;

View file

@ -38,15 +38,15 @@ app.config(['$routeProvider', '$locationProvider',
templateUrl: 'templates/views/home.html',
controller: 'homeController'
})
.when('/Settings', {
templateUrl: 'templates/views/settings.html',
controller: 'settingsController'
.when('/profile/:id', {
templateUrl: 'templates/views/profile.html',
controller: 'profileController'
})
.when('/tasks', {
templateUrl: 'templates/views/tasks.html',
controller: 'tasksController'
})
.when('/myClasses', {
.when('/myClasses/:campusId', {
templateUrl: 'templates/views/myClasses.html',
controller: 'myClassesController'
})
@ -54,13 +54,21 @@ app.config(['$routeProvider', '$locationProvider',
templateUrl: 'templates/views/newTask.html',
controller: 'newTasksController'
})
.when('/projects', {
.when('/projects/:classId', {
templateUrl: 'templates/views/projects.html',
controller: 'projectsController'
})
.when('/newCourse', {
templateUrl: 'templates/views/newCourse.html',
controller: 'newCourseController'
})
.when('/campuses', {
templateUrl: 'templates/views/campuses.html',
controller: 'campusesController'
})
.when('/myProjects', {
templateUrl: 'templates/views/myProjects.html',
controller: 'myProjectsController'
});
}
]);

View file

@ -0,0 +1,57 @@
angular.module('SeHub')
.controller('campusesController', ['$scope', '$cookies', '$cookieStore', '$window', '$location', '$mdToast', '$mdDialog', 'apiService', '$rootScope', function($scope, $cookies, $cookieStore, $window, $location, $mdToast, $mdDialog, apiService, $rootScope)
{
$scope.campusesEmpty = false;
var token = $cookies['com.sehub.www'];
var init = function()
{
$scope.threeSizedArray = [];
var tempArr = [];
var sizeOfSmallArrays = 3;
for (var i = 0 ; i < $scope.campuses.length ; i++) {
if(i % sizeOfSmallArrays !== 0){
tempArr.push($scope.campuses[i]);
}else{
if(i !== 0){
$scope.threeSizedArray.push(tempArr);
tempArr = [];
tempArr.push($scope.campuses[i]);
}else{
tempArr.push($scope.campuses[i]);
}
}
};
$scope.threeSizedArray.push(tempArr);
}
$scope.goToCampus = function(campusId) // Will pass you to courses by specific campus
{
$location.path('/myClasses/' + campusId.toString());
}
$scope.displayCampuses = function()
{
apiService.getCampusesByUser(token).success(function(data) // Get all the campuses
{
$scope.campuses = data;
console.log("INSIDE " + $scope.campuses);
init(); // Executing the function to initialize campuses display
}).error(function()
{
// TODO
});
// console.log($scope.campuses.length.toString());
if(!$scope.campuses) // If campuses is empty
{
$scope.campusesEmpty = true;
}
}
$scope.displayCampuses(); // Displaying all campuses by user
}]);

View file

@ -13,7 +13,6 @@ angular.module('SeHub')
var imagePath = $scope.user.avatar_url;
//var campusName = '';
$scope.course = '';
// $scope.campusName = '';
$scope.phones = [
@ -35,13 +34,13 @@ angular.module('SeHub')
console.log("Student Mode!");
}
// apiService.getCourseByCampusName($scope.user.classes_id_list[0]).success(function(data)
// apiService.getCourseByCampusName(token).success(function(data)
// {
// console.log("Campus Name is ON! " + $scope.user.classes_id_list[0])
// console.log("Campus Name is ON! " + token)
// $scope.course = data;
// }).error(function()
// }).error(function(err)
// {
// console.log("Error on ===> getCourseByCampusName")
// console.log("Error ===> " + err + " ===> getCourseByCampusName")
// });
@ -51,8 +50,30 @@ angular.module('SeHub')
}
$scope.postMessageClicked = function() // Posting the message itself
{
if($scope.msg.msgToAdd != null)
{
jsonNewMsg = {
'courseName': 'A', // TODO Should be ===> $scope.course.courseName
'message': $scope.msg.msgToAdd
};
// console.log("J: " + jsonNewMsg.toString() + "msg: " + $scope.msg.msgToAdd);
// apiService.createMessage(token, jsonNewMsg).success(function(data)
// {
// console.log("create Msg!");
// }).error(function(err)
// {
// console.log("Error: " + err);
// });
/*
'courseName': 'Advance Math',
'message': 'The lecture today is canceled'
*/
console.log($scope.msg.msgToAdd);
$scope.messages.push({"text": $scope.msg.msgToAdd});
}
@ -74,8 +95,6 @@ angular.module('SeHub')
console.log("choose project Clicked!!");
}
// animation
$scope.isEnterd = top.setIsEnterd;
}]);

View file

@ -1,5 +1,7 @@
angular.module('SeHub')
.controller('mainController', ['$scope', '$rootScope', 'dataService','apiService', '$cookies', '$cookieStore', '$location', '$window',
.controller('mainController',
['$scope', '$rootScope', 'dataService', 'apiService', '$cookies',
'$cookieStore', '$location', '$window',
function($scope, $rootScope, dataService, apiService, $cookies, $cookieStore, $location, $window) {
top.setIsEnterd = true;
@ -14,6 +16,39 @@ angular.module('SeHub')
}
$scope.loadingData = false;
$scope.user = data;
$scope.menuItems = [{
"title": "Dash Board",
"icon": "fa fa-tachometer",
"style": "selected",
"route": "/home"
}, {
"title": "Explore",
"icon": "fa fa-compass",
"style": "",
"route": "/campuses"
}, {
"title": "My Projects",
"icon": "fa fa-cube",
"style": "",
"route": "/myProjects"
}, {
"title": "Tasks",
"icon": "fa fa-clipboard",
"style": "",
"route": "/tasks"
}, {
"title": "Profile",
"icon": "fa fa-cogs",
"style": "",
"route": "/profile/" + $scope.user.id.toString()
}, {
"title": "Log Out",
"icon": "fa fa-power-off",
"style": "",
"route": "/logout"
}];
dataService.initService($scope); //Start Data Sync Service (For User)
console.log(data);
if ($scope.user.isFirstLogin) {
@ -29,43 +64,6 @@ angular.module('SeHub')
$scope.menuItems = [{
"title": "Dash Board",
"icon": "fa fa-tachometer",
"style": "selected",
"route": "/home"
}, {
"title": "My Campuses",
"icon": "fa fa-university",
"style": "",
"route": "/campuses"
}, {
"title": "My Classes",
"icon": "fa fa-graduation-cap",
"style": "",
"route": "/myClasses"
}, {
"title": "My Projects",
"icon": "fa fa-cube",
"style": "",
"route": "/projects"
}, {
"title": "Tasks",
"icon": "fa fa-clipboard",
"style": "",
"route": "/tasks"
}, {
"title": "Settings",
"icon": "fa fa-cogs",
"style": "",
"route": "/Settings"
}, {
"title": "Log Out",
"icon": "fa fa-power-off",
"style": "",
"route": "/logout"
}];
$scope.menuClicked = function(item) {
var route = ""
if (item.title == "Log Out") {

View file

@ -1,13 +1,141 @@
angular.module('SeHub')
.controller('myClassesController', ['$scope', '$cookies', '$cookieStore', '$window', '$location', '$mdToast', '$mdDialog', 'apiService', '$rootScope', function ($scope, $cookies, $cookieStore, $window, $location, $mdToast, $mdDialog, apiService ,$rootScope)
.controller('myClassesController', ['$scope', '$location', '$routeParams', '$cookies', '$cookieStore', '$window', '$location', '$mdToast', '$mdDialog', 'apiService', '$rootScope',
function ($scope, $location, $routeParams, $cookies, $cookieStore, $window, $location, $mdToast, $mdDialog, apiService ,$rootScope)
{
$scope.isStudent = false;
$scope.isCourse = false;
$scope.isNewCourse = false;
$scope.newClassName = false;
$scope.user.createNewCourse = '';
$scope.course = {};
var token = $cookies['com.sehub.www'];
$scope.user.finalDate = '';
$scope.user.startDate = '';
$scope.showMyClass = false;
$scope.coursesEmpty = false;
$scope.campusId;
var campusId = $routeParams.campusId;
$scope.goToClass = function(classId)
{
console.log("Done! " + $scope.courses);
$location.path('/projects/' + classId.toString()); // Will display all the projects in this course
}
$scope.chooseCampusClicked = function()
{
$scope.isCourse = true;
console.log("Choose campus Clicked!!");
apiService.getAllCampuses(token).success(function(data)
{
$scope.campuses = data;
console.log("Campuses: ");
console.log($scope.campuses);
}).error(function(err)
{
console.log("Error: " + err);
});
}
$scope.createCourseClicked = function()
{
$scope.isNewCourse = !$scope.isNewCourse;
}
$scope.submitNewClassClicked = function()
{
var i;
if($scope.course.courseName != null && $scope.course.endDate != null && $scope.course.startDate != null)
{
for(i = 0; i < $scope.campuses.length; i++)
{
if($scope.course.campusName === $scope.campuses[i].title)
{
$scope.campusId = $scope.campuses[i].id;
}
}
console.log("NOW: ");
console.log($scope.campusId);
var jsonNewCourse =
{
'courseName': $scope.course.courseName,
'campusId': $scope.campusId,
'startDate': {
'year' : $scope.course.startDate.getFullYear(),
'day' : $scope.course.startDate.getDate(),
'month': $scope.course.startDate.getMonth() + 1
},
'endDate': {
'year' : $scope.course.endDate.getFullYear(),
'day' : $scope.course.endDate.getDate(),
'month': $scope.course.endDate.getMonth() + 1
}
};
console.log("Json here: " + $scope.chosenCampus);
console.log(jsonNewCourse);
apiService.createCourse(token, jsonNewCourse).success(function(data)
{
console.log("createCourse API done");
$mdDialog.show($mdDialog.alert().title('Course Created').content('You have created course successfully.')
.ariaLabel('Email verification alert dialog').ok('Lets Start!').targetEvent())
.then(function() {
$location.path('/newCourse'); // TODO TODO TODO
}); // Pop-up alert
}).error(function(err)
{
console.log(err);
});
}
else
{
$mdDialog.show($mdDialog.alert().title('Error - Creating Course').content('Some fields are missing.')
.ariaLabel('Email verification alert dialog').ok('Try Again!').targetEvent());
}
}
var init = function()
{
$scope.holdArrays = [];
var tempArr = [];
var sizeOfSmallArrays = 3;
for (var i = 0 ; i < $scope.courses.length ; i++) {
if(i % sizeOfSmallArrays !== 0){
tempArr.push($scope.courses[i]);
}else{
if(i !== 0){
$scope.holdArrays.push(tempArr);
tempArr = [];
tempArr.push($scope.courses[i]);
}else{
tempArr.push($scope.courses[i]);
}
}
};
$scope.holdArrays.push(tempArr);
}
//$scope.courses = ["lala", "aaa", "bbb", "ccc", "rrr"];
var displayCourses = function()
{
apiService.getAllCoursesByCampus(token, campusId).success(function(data) // Shows all classes from this campus
{
$scope.courses = data;
console.log("success " + $scope.courses);
init(); // Executing the function to initialize course display
if(!$scope.courses)
{
$scope.coursesEmpty = true;
}
}).error(function(err)
{
console.log("error: " + err);
});
}
if($scope.user.isLecturer)
{
@ -20,42 +148,7 @@ angular.module('SeHub')
console.log("Student Mode!");
}
$scope.chooseCourseClicked = function()
{
$scope.isCourse = true;
console.log("choose course Clicked!!");
}
$scope.createCourseClicked = function()
{
$scope.isNewCourse = true;
$scope.showMyClass = false;
console.log("create course Clicked!!");
}
$scope.showMyCourses = function()
{
$scope.showMyClass = true;
$scope.isNewCourse = false;
}
$scope.submitNewClassClicked = function()
{
if($scope.user.createNewCourse != '' && $scope.user.finalDate != '')
{
console.log("finalDate " + $scope.user.finalDate);
console.log($scope.user.createNewCourse);
$mdDialog.show($mdDialog.alert().title('Course Created').content('You have created course successfully.')
.ariaLabel('Email verification alert dialog').ok('Lets Start!').targetEvent());
// $window.location.href = 'templates/views/newCourse.html'; // TODO TODO TODO
}
else
{
$mdDialog.show($mdDialog.alert().title('Error - Creating Course').content('You have encountered and error in creating the course.')
.ariaLabel('Email verification alert dialog').ok('Try Again!').targetEvent());
}
}
displayCourses(); // Will display the courses that the user related to // TODO!!

View file

@ -0,0 +1,66 @@
angular.module('SeHub')
.controller('myProjectsController', ['$scope', '$cookies', '$cookieStore', '$window', '$location', '$mdToast', '$mdDialog', 'apiService', '$rootScope', function ($scope, $cookies, $cookieStore, $window, $location, $mdToast, $mdDialog, apiService ,$rootScope)
{
$scope.isEditPressed = false;
$scope.myProjectsEmpty = false;
var token = $cookies['com.sehub.www'];
$scope.user = $scope.$parent.user;
$scope.displayMyProjects = function()
{
apiService.getProjectsByUser(token).success(function(data)
{
console.log("Success " + data);
$scope.myProjects = data;
}).error(function(err)
{
console.log("Error: " + err);
});
if($scope.myProjects === null)
{
$scope.myProjectsEmpty = true;
}
}
$scope.goToMyProject = function()
{
console.log("projects only from classID: " + classId)
$location.path('/thisProject' + classId);
}
var init = function()
{
$scope.arrayHolder = [];
var tempArr = [];
var sizeOfSmallArrays = 3;
for (var i = 0 ; i < $scope.projects.length ; i++) {
if(i % sizeOfSmallArrays !== 0){
tempArr.push($scope.projects[i]);
}else{
if(i !== 0){
$scope.arrayHolder.push(tempArr);
tempArr = [];
tempArr.push($scope.projects[i]);
}else{
tempArr.push($scope.projects[i]);
}
}
};
$scope.arrayHolder.push(tempArr);
}
$scope.editPressed = function()
{
$scope.isEditPressed = true;
console.log("EditPressed " + $scope.isEditPressed);
}
$scope.removeProject = function()
{
console.log("Project has been removed!");
}
$scope.displayMyProjects(); // Will display all my projects
}]);

View file

@ -1,10 +1,9 @@
angular.module('SeHub')
.controller('newCourseController', ['$scope', '$cookies', '$cookieStore', '$window', '$location', '$mdToast', '$mdDialog', 'apiService', '$rootScope', function ($scope, $cookies, $cookieStore, $window, $location, $mdToast, $mdDialog, apiService ,$rootScope)
.controller('newCourseController', ['$scope', '$cookies', '$cookieStore', '$window', '$location', '$mdToast', '$mdDialog', 'apiService', '$rootScope',
function ($scope, $cookies, $cookieStore, $window, $location, $mdToast, $mdDialog, apiService ,$rootScope)
{
$scope.goBack = function()
{
$window.location.href = 'templates/views/myClasses.html';
$location.path('/myClasses');
}
}]);

View file

@ -1,6 +1,8 @@
angular.module('SeHub').controller('newTasksController', ['$scope',
function($scope) {
$scope.newComp = {};
$scope.newComp.isMandatory = false;
$scope.componentTypes = [{
@ -9,25 +11,105 @@ angular.module('SeHub').controller('newTasksController', ['$scope',
"type": "textarea"
}, {
"type": "checkbox"
}, {
"type": "link"
}, {
"type": "radiobuttons"
}];
$scope.task = {};
$scope.task.task = {};
$scope.task.components= [];
$scope.task.components = [];
$scope.task.isPersonal = false;
// $scope.task = [];
$scope.addComponent = function() {
$scope.task.components.push($scope.newComp);
var comp = {};
var type = $scope.newComp.type;
comp.type = type;
comp.isMandatory = $scope.newComp.isMandatory;
comp.label = "";
var i = 0
if (!(type === 'textbox' || type === 'textarea' || type === 'checkbox'))
while ($scope.newComp.label[i]) {
comp.label += $scope.newComp.label[i] + "|";
i++;
} else
comp.label = $scope.newComp.label[i];
console.log(comp);
$scope.task.components.push(comp);
// console.log($scope.newComp);
$scope.newComp = {};
$scope.newComp.isMandatory = false;
$scope.compDetails = [];
$scope.isRadioButton = false;
}
$scope.dueTime = function(){
if(!$scope.task.date || $scope.task.date === '')
$scope.ComponentType = function(type) {
if (type === 'textbox' || type === 'textarea' || type === 'checkbox')
$scope.compDetails = [{
detail: "Label"
}];
else if (type === 'radiobuttons') {
$scope.compDetails = [{
detail: "Label"
}];
$scope.compDetails.push({
detail: "Option" + $scope.compDetails.length + ": "
});
} else if (type === 'link')
$scope.compDetails = [{
detail: "Label"
}, {
detail: "URL Path"
}];
if (type === 'radiobuttons')
$scope.isRadioButton = true;
else
$scope.isRadioButton = false;
}
$scope.addMoreOptions = function() {
$scope.compDetails.push({
detail: "Option" + $scope.compDetails.length + ": "
});
}
$scope.dueTime = function() {
if (!$scope.task.date || $scope.task.date === '')
$scope.dueTimeFromNow = "";
var d = new Date($scope.task.date);
$scope.dueTimeFromNow = moment(d).fromNow();
}
$scope.initLinkComp = function(component){
var arr = component.label.split("|");
for (var i = 0; i < arr.length - 1; i++) {
if(i == 0)
component.title = arr[i];
else
component.href = arr[i];
};
}
$scope.initRadioButtonsComp = function(component){
var arr = component.label.split("|");
component.values = [];
for (var i = 0; i < arr.length - 1; i++) {
if(i == 0)
component.title = arr[i];
else
component.values.push({text: arr[i], id: i});
};
}
$scope.RB = function(comp){
console.info(comp);
}
}
]);

View file

@ -0,0 +1,102 @@
angular.module('SeHub')
.controller('profileController', ['$scope', '$rootScope', 'dataService', 'apiService',
'$cookies', '$location', '$routeParams',
function($scope, $rootScope, dataService, apiService, $cookies, $location, $routeParams) {
var token = $cookies['com.sehub.www'];
var id = $routeParams.id;
$scope.loadingData = true;
$scope.isInRegisterMode = false;
$scope.title = "Profile";
apiService.getUserById(token, id).success(function(data) {
if (data.message == 'No User Found') {
console.error("No User Found!");
}
$scope.user = data;
apiService.getCampusesByUserId(token, id).success(function(data) {
$scope.campuses = data;
console.log(data);
apiService.getCoursesByUserID(token, id).success(function(data){
$scope.courses = data;
}).error(function(err){
console.error('In apiService.getCoursesByUserID', err);
})
$scope.loadingData = false;
}).error(function(err) {
console.error(err);
});
});
$scope.isEditMode = false;
$scope.profileMode = "Edit Profile";
$scope.profileModeIcon = "fa fa-pencil";
$scope.changeProfileMode = function() {
$scope.isEditMode = !$scope.isEditMode;
if ($scope.isEditMode) {
$scope.profileMode = "Save Profile";
$scope.profileModeIcon = "fa fa-floppy-o";
} else {
apiService.updateUser(token, $scope.user).success(function(data) {
console.info('User Saved');
dataService.userBrodcast($scope.user);
}).error(function(e) {
console.error('Fail To Save User');
});
$scope.profileMode = "Edit Profile";
$scope.profileModeIcon = "fa fa-pencil";
}
}
/**
* DEBUG DATA
*/
// $scope.courses = [{
// "courseName": "Advance Math",
// "campusName": "JCE",
// "startDate": {
// "year": 2015,
// "month": 4,
// "day": 3
// },
// "endDate": {
// "year": 2016,
// "month": 5,
// "day": 14
// },
// "taskFlag": false,
// "campus_avatar": "https://yt3.ggpht.com/--ZkWxybWGOM/AAAAAAAAAAI/AAAAAAAAAAA/_nAICC_kzzI/s88-c-k-no/photo.jpg"
// }];
// $scope.campuses = [{
// 'title': 'JCE',
// 'email_ending': '@post.jce.ac.il',
// 'master_user_id': 123453433341,
// 'avatar_url': 'https://yt3.ggpht.com/--ZkWxybWGOM/AAAAAAAAAAI/AAAAAAAAAAA/_nAICC_kzzI/s88-c-k-no/photo.jpg'
// }, {
// 'title': 'Stanford',
// 'email_ending': '@post.jce.ac.il',
// 'master_user_id': 123453433341,
// 'avatar_url': 'https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcR9M4uQgaJP1zyiCGw-dK31hU8buWqeuOi9vTXBd4Y8hQcFTZqA'
// }];
$scope.labels = ['Commits', 'Issues Assigned', 'Messages', 'Open Tasks'];
//$scope.series = ['Project A', 'Project B'];
$scope.data = [
[54, 3, 15, 3]//,
//[28, 48, 40, 3]
];
$scope.isUser = $scope.$parent.user.id.toString() /*The Actual User*/ === $routeParams.id /*The Profile User*/;
}
]);

View file

@ -1,15 +1,120 @@
angular.module('SeHub')
.controller('projectsController', ['$scope', '$cookies', '$cookieStore', '$window', '$location', '$mdToast', '$mdDialog', 'apiService', '$rootScope', function ($scope, $cookies, $cookieStore, $window, $location, $mdToast, $mdDialog, apiService ,$rootScope)
.controller('projectsController', ['$scope', '$routeParams', '$cookies', '$cookieStore', '$window', '$location', '$mdToast', '$mdDialog', 'apiService', '$rootScope', function ($scope, $routeParams, $cookies, $cookieStore, $window, $location, $mdToast, $mdDialog, apiService ,$rootScope)
{
console.log("in projects controller");
var token = $cookies['com.sehub.www'];
var classId = $routeParams.classId;
$scope.projectEmpty = false;
$scope.displayProjects = function()
{
console.log("in displayProjecs!!! ");
apiService.getProjectsByCourse(token, classId).success(function(data) // Get all the campuses
{
$scope.projects = data;
init(); // Executing the function to initialize projects display
console.log("project created! not rly!! " + classId);
}).error(function(err)
{
console.log("Error: " + err);
});
if($scope.projects = null)
{
$scope.projectEmpty = true;
}
}
$scope.joinCourse = function()
{
apiService.joinCourse(token, classId).success(function(data)
{
console.log("Success!!");
$mdDialog.show($mdDialog.alert().title('Joined Course').content('You have successfully joined course.')
.ariaLabel('Join course alert dialog').ok('Lets Start!').targetEvent())
.then(function() {
$location.path('/projects/' + classId); // TODO TODO TODO
}); // Pop-up alert
}).error(function(err)
{
$mdDialog.show($mdDialog.alert().title('Error Joining Course').content('You have failed joined the course.')
.ariaLabel('Join course alert dialog').ok('Try Again!').targetEvent()); // Pop-up alert
// .then(function() {
// // $location.path('/newCourse'); // TODO TODO TODO
// });
});
}
$scope.createProjectClicked = function()
{
console.log("project created! not rly!! ");
// $window.location.href = 'http://localhost:8080/home#/tasks/new'; // Reference to 'newTask' page
console.log("project created! not rly!! " + classId);
// $window.location.href = 'http://localhost:8080/home#/tasks/new'; // Reference to 'newTask' page
}
// $scope.projects = ['AMI', 'LULU', 'XIN Zhau', 'LUMI lu', 'Shimi', 'Azligi zligi', 'Drugs'];
$scope.goToProject = function()
{
console.log("projects only from classID: " + classId)
$location.path('/thisProject' + classId);
}
var init = function()
{
$scope.arrayHolder = [];
var tempArr = [];
var sizeOfSmallArrays = 3;
for (var i = 0 ; i < $scope.courses.length ; i++) {
if(i % sizeOfSmallArrays !== 0){
tempArr.push($scope.courses[i]);
}else{
if(i !== 0){
$scope.arrayHolder.push(tempArr);
tempArr = [];
tempArr.push($scope.courses[i]);
}else{
tempArr.push($scope.courses[i]);
}
}
};
$scope.arrayHolder.push(tempArr);
}
// Running...
$scope.displayProjects(); // Displaying all projects related to user
/*
var jsonNewCourse =
{
'projectName': $scope.course.courseName,
'courseId': classId,
'startDate': {
'year' : $scope.course.startDate.getFullYear(),
'day' : $scope.course.startDate.getDate(),
'month': $scope.course.startDate.getMonth() + 1
},
'endDate': {
'year' : $scope.course.endDate.getFullYear(),
'day' : $scope.course.endDate.getDate(),
'month': $scope.course.endDate.getMonth() + 1
}
};*/
/*
{
'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'],
'id' : 1234567890
}
*/

View file

@ -1,12 +1,10 @@
angular.module('SeHub')
.controller('registerController', ['$scope', '$cookies', '$cookieStore', '$window', '$location', '$mdToast', '$mdDialog', 'apiService', '$rootScope', function ($scope, $cookies, $cookieStore, $window, $location, $mdToast, $mdDialog, apiService ,$rootScope)
{
.controller('registerController', ['$scope', '$cookies', '$cookieStore', '$window', '$location', '$mdToast', '$mdDialog', 'apiService', '$rootScope', function($scope, $cookies, $cookieStore, $window, $location, $mdToast, $mdDialog, apiService, $rootScope) {
$scope.userHasNoName = false;
$scope.campusChecked = false;
$scope.createCampusClicked = false;
$scope.isEmpty = true; // if the academic email line is empty
$scope.jsonCreateCampus =
{
$scope.jsonCreateCampus = {
"title": "Create Campus",
"email": "email_ending",
"avatar": "self.avatar.url"
@ -19,33 +17,30 @@ angular.module('SeHub')
{
$scope.user = data;
if(data.message == 'No User Found')
if (data.message == 'No User Found')
console.error("No User Found!");
console.log(data);
if($scope.user.name === ";")
{
if ($scope.user.name === ";") {
$scope.user.name = "";
$scope.user.name = $scope.user.username;
$scope.userHasNoName = true;
}
apiService.getAllCampuses($scope.user.seToken).success(function(data) // Get all the campuses
apiService.getAllCampuses(token).success(function(data) // Get all the campuses
{
$scope.campuses = data;
}).error(function()
{
}).error(function() {
// TODO
});
});
$scope.dropdownClicked = function()
{
if($scope.campus){
$scope.dropdownClicked = function() {
if ($scope.campus) {
$scope.campusChecked = true;
$scope.campusObj = null;
for (var i = $scope.campuses.length - 1; i >= 0; i--) {
if($scope.campuses[i].title == $scope.campus){
if ($scope.campuses[i].title == $scope.campus) {
$scope.campusObj = $scope.campuses[i];
console.log($scope.campusObj); // TODO REMOVE!!
}
@ -54,88 +49,78 @@ angular.module('SeHub')
};
$scope.submitClicked = function(ev)
{
$scope.submitClicked = function(ev) {
var emailValid = false;
var jsonUpdateUser =
{
"lecturerStat": "$scope.user.isLecturer",
"campName": "$scope.campusName"
}
if($scope.user.AcMail != null)
{
if ($scope.user.AcMail != null) {
var fullMail = $scope.user.AcMail + $scope.campusObj.email_ending; // Holds the full academic email of the user
apiService.updateUser($scope.user.seToken, jsonUpdateUser).success(function(data)
{
apiService.updateUser(token, $scope.user).success(function(data) {
}).error(function()
{
}).error(function() {
// TODO Error
console.log("Error occured on updateUser");
});
console.log("Mail: " + fullMail);
apiService.sendValidationMail($scope.user.seToken, fullMail).success(function(data)
{
apiService.sendValidationMail(token, fullMail).success(function(data) {
console.log("DONE - 200");
$mdDialog.show($mdDialog.alert().title('E-mail Verification').content('A verification e-mail has been sent to your email address.')
.ariaLabel('Email verification alert dialog').ok('Got it!').targetEvent(ev)); // Pop-up alert for e-mail verification
$mdDialog
.show($mdDialog.alert().title('E-mail Verification')
.content('A verification e-mail has been sent to your email address.')
.ariaLabel('Email verification alert dialog')
.ok('Got it!')
.targetEvent(ev))
.then(function() {
// TODO ADD- delete cookies and redirect only after pressed 'Got it'
$cookieStore.remove("com.sehub.www"); // Removing the cookies
$window.location.href = 'http://se-hub.appspot.com'; // Reference to 'welcome' page
}).error(function()
{
}); // Pop-up alert for e-mail verification
}).error(function() {
$mdDialog.show($mdDialog.alert().title('Error - E-mail Verification').content('An error has occured in your e-mail address.')
.ariaLabel('Email verification error alert dialog').ok('Got it!').targetEvent(ev));
});
}
else // TODO Fix when success to show mdDialog until 'Got it' clicked
} else // TODO Fix when success to show mdDialog until 'Got it' clicked
{
$mdDialog.show($mdDialog.alert().title('Error - E-mail Verification').content('An error has occured in your e-mail address.')
.ariaLabel('Email verification error alert dialog').ok('Got it!').targetEvent(ev));
};
};
$scope.createCampus = function(ev)
{
$scope.createCampusClicked = true;
$scope.createCampus = function(ev) {
$scope.createCampusClicked = !$scope.createCampusClicked;
if(!$scope.isLecturer) // "!isLecturer" Means => I Am Lecturer; if i am a lecturer (when pressing -> getting last data value before pressing)
{
if($scope.user.campusMail != null)
if (!$scope.isLecturer) // "!isLecturer" Means => I Am Lecturer; if i am a lecturer (when pressing -> getting last data value before pressing)
{
if ($scope.user.campusMail != null) {
validateEmail($scope.user.campusMail); // Verify the email according to "xxx@name.suffix"
}
}
}
validateEmail = function(email)
{
validateEmail = function(email) {
var result = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
if (!result.test(email)) // TODO Fix when success to show mdDialog until 'Got it' clicked
{
$mdDialog.show($mdDialog.alert().title('Error - E-mail Verification').content('An error has occured in your e-mail address.')
.ariaLabel('Email verification error alert dialog').ok('Got it!').targetEvent(email));
}
if(result.test(email)) // TODO Fix when success to show mdDialog until 'Got it' clicked
if (result.test(email)) // TODO Fix when success to show mdDialog until 'Got it' clicked
{
console.log("Im good");
apiService.sendValidationMail($scope.user.seToken, email).success(function(data)
{
apiService.sendValidationMail(token, email).success(function(data) {
console.log("DONE - 200");
$mdDialog.show($mdDialog.alert().title('E-mail Verification').content('A verification e-mail has been sent to your email address.')
.ariaLabel('Email verification alert dialog').ok('Got it!').targetEvent(email)); // Pop-up alert for e-mail verification
// TODO ADD delete cookies and redirect only after pressed 'Got it'
$cookieStore.remove("com.sehub.www"); // Removing the cookies
$window.location.href = 'http://se-hub.appspot.com'; // Reference to 'welcome' page
}).error(function()
{
}).error(function() {
$mdDialog.show($mdDialog.alert().title('Error - E-mail Verification').content('An error has occured in your e-mail address or in the campus name.')
.ariaLabel('Email verification error alert dialog').ok('Got it!').targetEvent(email));
});
}
}
}]);
}]);

View file

@ -1,93 +0,0 @@
angular.module('SeHub')
.controller('settingsController', ['$scope', '$rootScope', 'dataService', 'apiService', '$cookies', '$location',
function($scope, $rootScope, dataService, apiService, $cookies, $location) {
var token = $cookies['com.sehub.www'];
$scope.loadingData = true;
$scope.isInRegisterMode = false;
$scope.title = "Settings"
apiService.getUserByToken(token).success(function(data) {
if (data.message == 'No User Found') {
console.error("No User Found!");
}
$scope.loadingData = false;
$scope.user = data;
console.log(data);
if ($scope.user.isFirstLogin) {
$scope.menuObj = {};
$scope.isInRegisterMode = true;
$scope.loadingData = false;
$location.path('/register')
}
});
$scope.isEditMode = false;
$scope.profileMode = "Edit Profile";
$scope.profileModeIcon = "fa fa-pencil";
$scope.changeProfileMode = function() {
$scope.isEditMode = !$scope.isEditMode;
if ($scope.isEditMode) {
$scope.profileMode = "Save Profile";
$scope.profileModeIcon = "fa fa-floppy-o";
} else {
apiService.updateUser(token, $scope.user).success(function(data) {
console.info('User Saved');
dataService.userBrodcast($scope.user);
}).error(function(e) {
console.error('Fail To Save User');
});
$scope.profileMode = "Edit Profile";
$scope.profileModeIcon = "fa fa-pencil";
}
}
/**
* DEBUG DATA
*/
$scope.courses = [{
"courseName": "Advance Math",
"campusName": "JCE",
"startDate": {
"year": 2015,
"month": 4,
"day": 3
},
"endDate": {
"year": 2016,
"month": 5,
"day": 14
},
"taskFlag": false,
"campus_avatar": "https://yt3.ggpht.com/--ZkWxybWGOM/AAAAAAAAAAI/AAAAAAAAAAA/_nAICC_kzzI/s88-c-k-no/photo.jpg"
}];
$scope.campuses = [{
'title': 'JCE',
'email_ending': '@post.jce.ac.il',
'master_user_id': 123453433341,
'avatar_url': 'https://yt3.ggpht.com/--ZkWxybWGOM/AAAAAAAAAAI/AAAAAAAAAAA/_nAICC_kzzI/s88-c-k-no/photo.jpg'
}, {
'title': 'Stanford',
'email_ending': '@post.jce.ac.il',
'master_user_id': 123453433341,
'avatar_url': 'https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcR9M4uQgaJP1zyiCGw-dK31hU8buWqeuOi9vTXBd4Y8hQcFTZqA'
}];
$scope.labels = ['Commits', 'Issues Assigned', 'Messages', 'Open Tasks'];
$scope.series = ['Project A', 'Project B'];
$scope.data = [
[54, 3, 15, 3],
[28, 48, 40, 3]
];
}
]);

View file

@ -7,8 +7,7 @@ angular.module('SeHub')
{
var taskName = name;
console.log("task created! " + taskName);
$window.location.href = 'http://localhost:8080/home#/tasks/new'; // Reference to 'newTask' page
$location.path("/tasks/new"); // Reference to 'newTask' page
}

View file

@ -37,18 +37,17 @@ service.factory('apiService', ['$http', function($http) {
var url = (DEBUG ? "http://localhost:8080" : "http://se-hub.appspot.com") + "/api/users/updateUser/" + token;
req = {
method: "POST",
method: "PUT",
url: url,
data: payLoad
};
return $http(req);
},
getCourseByCampusName: function(token){
var url = (DEBUG ? "http://localhost:8080" : "http://se-hub.appspot.com") + "/api/courses/getAll/" + token;
getAllCoursesByCampus: function(token, campusId){
var url = (DEBUG ? "http://localhost:8080" : "http://se-hub.appspot.com") + "/api/courses/getAllCoursesByCampus/" + token + '/' + campusId;
req = {
method : "GET",
url : url,
data: token
url : url
};
return $http(req);
@ -71,14 +70,121 @@ service.factory('apiService', ['$http', function($http) {
};
return $http(req);
},
getCourseMessages: function(token, courseName){
var url = (DEBUG ? "http://localhost:8080" : "http://se-hub.appspot.com") + "/api/courses/getCourseMessages/" + token + '/' + courseName;
createMessage: function(token, payLoad){
var url = (DEBUG ? "http://localhost:8080" : "http://se-hub.appspot.com") + "/api/courses/createMessage/" + token;
req = {
method : "POST",
url : url,
data: payLoad
};
return $http(req);
},
getMessagesByCourseName: function(token, courseName){
var url = (DEBUG ? "http://localhost:8080" : "http://se-hub.appspot.com") + "/api/courses/getMessagesByCourseName/" + token + '/' + courseName;
req = {
method : "GET",
url : url
};
return $http(req);
},
createCourse: function(token, payLoad){
var url = (DEBUG ? "http://localhost:8080" : "http://se-hub.appspot.com") + "/api/courses/create/" + token;
req = {
method : "POST",
url : url,
data: payLoad
};
return $http(req);
},
getCampusesByUser: function(token){
var url = (DEBUG ? "http://localhost:8080" : "http://se-hub.appspot.com") + "/api/campuses/getCampusesByUser/" + token;
req = {
method : "GET",
url : url
};
return $http(req);
},
getCoursesByUser: function(token, campusId){
var url = (DEBUG ? "http://localhost:8080" : "http://se-hub.appspot.com") + "/api/courses/getCoursesByUser/" + token + "/" + campusId;
req = {
method : "GET",
url : url
};
return $http(req);
},
getProjectsByCourse: function(token, classId){
var url = (DEBUG ? "http://localhost:8080" : "http://se-hub.appspot.com") + "/api/courses/getProjectsByCourse/" + token + "/" + classId;
req = {
method : "GET",
url : url
};
return $http(req);
},
getProjectsByUser: function(token){
var url = (DEBUG ? "http://localhost:8080" : "http://se-hub.appspot.com") + "/api/projects/getProjectsByUser/" + token;
req = {
method : "GET",
url : url
};
return $http(req);
},
getUserById: function(token, id){
var url = (DEBUG ? "http://localhost:8080" : "http://se-hub.appspot.com") + "/api/users/getUserById/" + token + "/" + id;
req = {
method : "GET",
url : url
};
return $http(req);
},
getCampusesByUserId: function(token, id){
var url = (DEBUG ? "http://localhost:8080" : "http://se-hub.appspot.com") + "/api/campuses/getCampusesByUserID/" + token + "/" + id;
req = {
method : "GET",
url : url
};
return $http(req);
},
joinCourse: function(token, courseId){
var url = (DEBUG ? "http://localhost:8080" : "http://se-hub.appspot.com") + "/api/courses/joinCourse/" + token + "/" + courseId;
req = {
method : "PUT",
url : url
};
return $http(req);
},
createMessage: function(token, payLoad){
var url = (DEBUG ? "http://localhost:8080" : "http://se-hub.appspot.com") + "/api/courses/create/" + token;
req = {
method : "POST",
url : url,
data: payLoad
};
return $http(req);
},
createProject: function(token, payLoad){
var url = (DEBUG ? "http://localhost:8080" : "http://se-hub.appspot.com") + "/api/projects/create/" + token;
req = {
method : "POST",
url : url,
data: payLoad
};
return $http(req);
},
getCoursesByUserID: function(token, userId){
var url = (DEBUG ? "http://localhost:8080" : "http://se-hub.appspot.com") + "/api/courses/getCoursesByUser/" + token + "/" + userId;
req = {
method : "GET",
url : url
};
return $http(req);
}
};
}]);

View file

@ -0,0 +1,41 @@
<div class = "myCampuses">
<md-content layout-padding layout-margin>
<h1 layout-margin style="margin-left:15px"><i class="fa fa-university"></i> Pick A Campus</h1>
</md-content>
<md-card class="cardAllCampuses">
<div ng-if = "!scope.campusesEmpty">
<div flex = "99" layout = "row" ng-repeat = "t in threeSizedArray" value = "{{t}}" layout-padding>
<div flex = "32" layout = "column" ng-repeat = "campus in t" value = "{{campus}}" >
<div ng-if="t.length != 1">
<md-button ng-click = "goToCampus(campus.id)" style="width:100%; height:32%;" layout-padding class = "md-raised" >
<!-- <img src="{{campus.avatar_url}}" style = "width:14%; height:auto;"> -->
<md-card style="width:97%;height:97%">
<img ng-src="{{campus.avatar_url}}" class="md-card-image" alt="Washed Out">
<md-card-content>
<h2 class="md-title">{{campus.title}}</h2>
</md-card-content>
</md-card>
</md-button>
</div>
<div ng-if="t.length == 1">
<md-button ng-click = "goToCampus(campus.id)" style="width:32%; height:32%;" layout-padding class = "md-raised" >
<!-- <img src="{{campus.avatar_url}}" style = "width:14%; height:auto;"> -->
<md-card style="width:97%;height:97%">
<img ng-src="{{campus.avatar_url}}" class="md-card-image" alt="Washed Out">
<md-card-content>
<h2 class="md-title">{{campus.title}}</h2>
</md-card-content>
</md-card>
</md-button>
</div>
<div class="spacer"></div>
</div>
</div>
</div>
<div ng-if = "scope.campusesEmpty">
<md-card layout-padding>
You Are Not Related To Any Campus, You May Join A Campus.
</md-card>
</div>
</md-card>
</div>

View file

@ -99,71 +99,16 @@
<md-button ng-click="clearAllClicked()" ng class="md-raised md-primary">Clear All</md-button>
</div>
<div class="port_spacer"></div>
<div layout-padding layout = "row">
<div flex = "60">
<md-input-container>
<label> Write Your Desired Message Here And Press Post</label>
<input type="text" minlength="1" ng-model="msg.msgToAdd" required>
<input type="text" minlength="1" ng-model="msg.msgToAdd" required></input>
</md-input-container>
</div>
</md-content>
<md-content layout-padding layout-margin>
<h1>
<em><i class="fa fa-folder-open"></i> Project Evaluation</em>
</h1>
<md-select placeholder="Choose Project" ng-model="project" ng-click="chooseProjectClicked()" style="z-index: 300" class="projectDropDown">
</md-select>
<div layout = "column" layout-margin layout-padding>
<div layout="row">
<a href="http://localhost:8080/home#/projects">
<md-card flex class = "projectExhibit" >
Press On Me
</md-card>
</a>
<a href="http://localhost:8080/home#/projects">
<md-card flex class = "projectExhibit">
Press On Me
</md-card>
</a>
<a href="http://localhost:8080/home#/projects">
<md-card flex class = "projectExhibit">
Press On Me
</md-card>
</a>
<div flex = "30">
<md-select placeholder="Choose Course" ng-model="course" ng-click="chooseCourseClicked()" style="z-index: 300" class="courseDropDown"></md-select>
</div>
<div layout="row">
<a href="http://localhost:8080/home#/projects">
<md-card flex class = "projectExhibit">
Press On Me
</md-card>
</a>
<a href="http://localhost:8080/home#/projects">
<md-card flex class = "projectExhibit">
Press On Me
</md-card>
</a>
<a href="http://localhost:8080/home#/projects">
<md-card flex class = "projectExhibit">
Press On Me
</md-card>
</a>
</div>
<div layout="row">
<a href="http://localhost:8080/home#/projects">
<md-card flex class = "projectExhibit">
Press On Me
</md-card>
</a>
<a href="http://localhost:8080/home#/projects">
<md-card flex class = "projectExhibit">
Press On Me
</md-card>
</a>
<a href="http://localhost:8080/home#/projects">
<md-card flex class = "projectExhibit">
Press On Me
</md-card>
</a>
</div>
</div>
</md-content>

View file

@ -109,13 +109,15 @@
<!-- Controllers -->
<script src="templates/js/controllers/mainController.js"></script>
<script src="templates/js/controllers/homeController.js"></script>
<script src="templates/js/controllers/settingsController.js"></script>
<script src="templates/js/controllers/profileController.js"></script>
<script src="templates/js/controllers/registerController.js"></script>
<script src="templates/js/controllers/tasksController.js"></script>
<script src="templates/js/controllers/myClassesController.js"></script>
<script src="templates/js/controllers/newTasksController.js"></script>
<script src="templates/js/controllers/projectsController.js"></script>
<script src="templates/js/controllers/newCourseController.js"></script>
<script src="templates/js/controllers/campusesController.js"></script>
<script src="templates/js/controllers/myProjectsController.js"></script>
</body>
</html>

View file

@ -2,150 +2,92 @@
<md-content layout-padding layout-margin>
<h1 layout-margin style="margin-left:15px"><i class="fa fa-graduation-cap"></i> My Classes</h1>
</md-content>
<md-card class="cardAllcourses">
<div flex = "99" layout = "row" ng-repeat = "t in holdArrays" value = "{{t}}" layout-padding>
<div flex = "32" layout = "column" ng-repeat = "course in t" value = "{{course}}" >
<div ng-if = "!scope.coursesEmpty">
<div ng-if="t.length != 1">
<md-button ng-click = "goToClass(course.id)" style="width:100%; height:32%;" layout-padding class = "md-raised" >
<md-card style="width:97%;height:97%">
<md-card-content>
<h2 class="md-title">{{course.courseName}}</h2> <!-- Should Be "course.title" -->
</md-card-content>
</md-card>
</md-button>
</div>
<div ng-if="t.length == 1">
<md-button ng-click = "goToClass(course.id)" style="width:32%; height:32%;" layout-padding class = "md-raised" >
<md-card style="width:97%;height:97%">
<md-card-content>
<h2 class="md-title">{{course.courseName}}</h2> <!-- Should Be "course.title" -->
</md-card-content>
</md-card>
</md-button>
</div>
</div>
<div class="spacer"></div>
<div ng-if = "scope.coursesEmpty">
You Are Not Related To Any Course, You May Join Any Course You Wish.
</div>
</div>
</div>
<!-- <div flex = "99" class = "allcoursesShow" layout = "row" ng-repeat = "t in holdArrays" value = "{{t}}">
<div flex ="32" layout = "column" ng-repeat = "course in t" value = "{{course}}" layout-padding>
<div ng-if = "!scope.coursesEmpty">
<md-card ng-click = "goToClass(course.id)" style="width:32%; height:32%;" layout-padding class = "campusCard">
{{course.id}}
</md-card>
</div>
<div ng-if = "scope.coursesEmpty">
You Are Not Related To Any Course, You May Join Any Course You Wish.
</div>
</div>
</div> -->
</md-card>
<div ng-if="user.isLecturer"> <!-- Lecturer Mode -->
<div layout="row">
<div layout-margin layout-padding>
<md-button ng-click="createCourseClicked()" ng class="md-raised md-primary">Create Class</md-button>
</div>
<div layout-margin layout-padding>
<md-button ng-click="showMyCourses()" ng class="md-raised md-primary">Show My Classes</md-button>
</div>
</div>
<div ng-if="isNewCourse">
<md-content>
<md-content layout-padding layout="row" layout-sm="column">
<md-input-container>
<label>User Name</label>
<input ng-model="user.name">
</md-input-container>
<md-input-container>
<label>Email</label>
<input ng-model="user.email" type="email">
</md-input-container>
</md-content>
<md-content layout-padding>
<form name="createNewCourseForm">
<md-card layout-padding>
<div layout layout-sm="column">
<!-- <input ng-model="course.campusName" required> -->
<md-select placeholder = "Campus name" ng-model="course.campusName" ng-click = "chooseCampusClicked()" required>
<md-option ng-repeat="c in campuses" value="{{c.title}}">
{{c.title}}
</md-option>
</md-select>
</div>
<div layout layout-sm="column">
<md-input-container style="width:80%">
<label>Class Name</label>
<input ng-model="user.createNewCourse" min-length="1" required>
<label flex = "50">Class Name</label>
<input ng-model="course.courseName" min-length="1" required>
</md-input-container>
<md-input-container flex>
<md-input-container flex = "20">
<label>Course Start Date</label>
<input type="date" ng-model="course.startDate" required>
</md-input-container>
<md-input-container flex = "20">
<label>Course Finish Date</label>
<input type="date" ng-model="user.finalDate" required>
<input type="date" ng-model="course.endDate" required>
</md-input-container>
</div>
<div layout layout-sm="column">
<md-input-container flex>
<label>First name</label>
<input ng-model="user.firstName">
</md-input-container>
<md-input-container flex>
<label>Last Name</label>
<input ng-model="theMax">
</md-input-container>
</div>
<md-input-container flex>
<label>General Info (optional)</label>
<textarea ng-model="user.courseInfo" columns="1" md-maxlength="150"></textarea>
</md-input-container>
</form>
</md-content>
</md-card>
<div layout-padding layout-margin>
<md-button ng-click="submitNewClassClicked()" class="md-raised md-primary">Submit New Class</md-button>
</div>
</md-content>
</div>
<div layout-margin layout-padding ng-if="showMyClass">
<!-- <div layout-margin layout-padding ng-if="showMyClass">
<md-select placeholder="Choose Existing Course" ng-model="course" ng-click="chooseCourseClicked()" class="courseDropDown">
<md-option ng-repeat="c in courses" value="{{c.course}}">{{c.course}}</md-option>
</md-select>
</div>
<!-- <md-content>
<div layout="row">
<div flex="65">
<md-card>
<p class = "messagesFeed">Messages</p>
</md-card>
</div>
<div flex="34">
<md-card>
<p class = "tasksFeed">Tasks</p>
</md-card>
</div>
</div>
<div layout="row">
<div flex="65">
<md-card>
<div class = "messagesContent">
<md-card ng-repeat = "msg in messages">
<div layout="column">
<div layout="row" layout-margin layout-padding>
<div flex="10" class="md-avatar">
<img ng-src="{{user.avatar_url}}" style="width:100%">
</div>
<div flex>
<div layout = "column">
<div>
<b>{{user.name}}</b>
</div>
<div>
class_name
</div>
</div>
</div>
</div>
<div>
<div flex="69" class="msgSent" layout-margin layout-padding>
{{msg.text}}
</div>
</div>
</div>
</md-card>
</div>
</md-card>
</div>
<div flex="34">
<md-card>
<p class = "tasksContent">
For Task 3 Press: <a href="http://localhost:8080/home#/tasks">Task #3</a>
<br></br>
For Task 4 Press: <a href="http://localhost:8080/home#/home">Task #4</a>
<br></br>
For Task 5 Press: <a href="http://localhost:8080/home#/home">Task #5</a>
<br></br>
For Task 6 Press: <a href="http://localhost:8080/home#/home">Task #6</a>
<br></br>
For Task 7 Press: <a href="http://localhost:8080/home#/home">Task #7</a>
<br></br>
For Task 8 Press: <a href="http://localhost:8080/home#/home">Task #8</a>
</p>
</md-card>
</div>
</div>
<div class ="addMessage" layout="row" layout-margin layout padding>
<div>
<md-button ng-click="addMessageClicked()" ng class="md-raised md-primary"><i class="fa fa-comments"></i></md-button>
</div>
<div ng-if="addMsg">
<md-select placeholder="Choose Course" ng-model="course" ng-click="chooseCourseClicked()" class="courseDropDown">
<md-option ng-repeat="c in courses" value="{{c.course}}">{{c.course}}</md-option>
</md-select>
</div>
</div>
<div ng-if="addMsg">
<div layout = "row" layout-margin layout padding layout-align = "left center">
<md-button ng-click="postMessageClicked()" ng class="md-raised md-primary">Post</md-button>
<md-button ng-click="clearAllClicked()" ng class="md-raised md-primary">Clear All</md-button>
</div>
<div class="port_spacer"></div>
<md-input-container>
<label> Write Your Desired Message Here And Press Post</label>
<input type="text" minlength="1" ng-model="msg.msgToAdd" required>
</md-input-container>
</div>
</md-content> -->
</div> -->
</div>
<div ng-if="isStudent"> <!-- Student Mode -->

View file

@ -0,0 +1,117 @@
<div class = "myProjects">
<md-content layout-padding layout-margin>
<h1 layout-margin style="margin-left:15px"><i class="fa fa-cube"></i> {{user.name}}'s projects</h1>
<md-card class="cardAllProjects">
<div flex = "99" layout = "row" ng-repeat = "t in holdArrays" value = "{{t}}" layout-padding>
<div flex = "32" layout = "column" ng-repeat = "project in t" value = "{{project}}" >
<div ng-if = "!scope.myProjectsEmpty">
<div ng-if="t.length != 1">
<md-button ng-click = "goToMyProjects(project.id)" style="width:100%; height:32%;" layout-padding class = "md-raised" >
<md-card style="width:97%;height:97%">
<md-card-content>
<h2 class="md-title">{{project.id}}</h2>
</md-card-content>
</md-card>
</md-button>
</div>
<div ng-if="t.length == 1">
<md-button ng-click = "goToMyProjects(project.id)" style="width:32%; height:32%;" layout-padding class = "md-raised" >
<md-card style="width:97%;height:97%">
<md-card-content>
<h2 class="md-title">{{project.id}}</h2>
</md-card-content>
</md-card>
</md-button>
</div>
</div>
<div class="spacer"></div>
<div ng-if = "scope.myProjectsEmpty">
You Do Not Have Any Project, You May Create One.
</div>
</div>
</div>
<!-- <div flex ="99" class = "allProjectsShow" layout = "row" ng-repeat = "t in arrayHolder" value = "{{t}}">
<div flex = "32" layout = "column" ng-repeat = "project in t" value = "{{project}}" layout-padding>
<div ng-if = "!scope.myProjectsEmpty">
<md-card layout-padding ng-click = "goToMyProject(project.id)" style="width:32%; height:32%;" class = "projectCard">
{{project.id}}
</md-card>
</div>
</div>
<div ng-if = "scope.myProjectsEmpty">
You Do Not Have Any Project, You May Create One.
</div>
</div> -->
</md-card>
</md-content>
</div>
<!-- div layout-padding layout-margin>
<div layout = "row" layout-padding layout-margin>
<div flex = "49">
Project Creator: {{user.name}} Should Be Project creator
</div>
<div flex = "49" >
<div ng-if="user.isLecturer">
<div layout = "row" layout-padding>
<div>
<md-button ng-click="editPressed()" class="md-raised md-primary">Edit</md-button>
</div>
<div ng-if="isEditPressed">
<md-button ng-click="removeProject()" class="md-raised md-primary">Remove</md-button>
</div>
</div>
</div>
</div>
</div>
<div layout = "row" layout-padding layout-margin>
<div flex = "49">
<md-card>
Here Will Be Graph - Commits Over Period Of Time
</md-card>
</div>
<div flex = "49">
<md-card>
Here Will Be Graph (by columns) - Commits, Issues, Open Tasks
</md-card>
</div>
</div>
<div flex>
<md-card>
<md-content class="md-padding">
<md-tabs md-dynamic-height md-border-bottom>
<md-tab label="Commits">
<md-content class="md-padding">
<h1 class="md-display-2">Commits</h1>
<p>Commits...</p>
</md-content>
</md-tab>
<md-tab label="Issues">
<md-content class="md-padding">
<h1 class="md-display-2">Issues</h1>
<p>Issues...</p>
</md-content>
</md-tab>
<md-tab label="Bugs">
<md-content class="md-padding">
<h1 class="md-display-2">Bugs</h1>
<p> Bugs Bugs Bugs..</p>
</md-content>
</md-tab>
<md-tab label="WhatEver">
<md-content class="md-padding">
<h1 class="md-display-2">WhatEver</h1>
<p>Bla Bla Bla..</p>
</md-content>
</md-tab>
</md-tabs>
</md-content>
</md-card>
</div>
</div> -->

View file

@ -1,6 +1,6 @@
<div class = "newCourse">
<md-content layout-padding layout-margin>
<h1 layout-margin style="margin-left:15px"><i class="fa fa-graduation-cap"></i> My New Course</h1>
<h1 layout-margin style="margin-left:15px"><i class="fa fa-graduation-cap"></i> {{user.name}}'s' New Course</h1>
<md-button ng-click="goBack()" class="md-raised md-primary">Go Back</md-button>
</md-content>
</div>

View file

@ -1,6 +1,7 @@
<div layout-padding>
<div layout="row">
<div flex="20" layout-padding>
<div flex="40" layout-padding>
<md-card layout-padding>
<h2>
<i class="fa fa-info-circle"></i> Task Info:
</h2>
@ -15,6 +16,7 @@
<md-input-container>
<label>Description</label>
<textarea ng-model="task.task.description" required></textarea>
</md-input-container>
</div>
<div>
<md-switch ng-model="task.isPersonal" aria-label="Switch 1">
@ -34,10 +36,9 @@
</div>
</div>
</div>
</div>
<div layout="column" flex="30" layout-padding>
</md-card>
<div layout="column">
<md-card layout-padding>
<div>
<h2>
<i class="fa fa-cubes"></i> Add A component:
@ -45,16 +46,21 @@
</div>
<div>
Select Type:
<md-select placeholder="Component Type" ng-model="newComp.type">
<md-select placeholder="Component Type" ng-model="newComp.type" ng-change="ComponentType(newComp.type)">
<md-option ng-repeat="component in componentTypes" value="{{component.type}}">{{component.type}}</md-option>
</md-select>
</div>
<div>
<md-input-container>
<label>Label</label>
<input ng-model="newComp.label" required>
<md-input-container ng-repeat="detail in compDetails">
<label>{{detail.detail}}</label>
<input ng-model="newComp.label[$index]" required>
</md-input-container>
</div>
<div ng-if="isRadioButton">
<md-button ng-click="addMoreOptions()" >
Add An Option
</md-button>
</div>
<div>
<md-switch ng-model="newComp.isMandatory" aria-label="Switch 1">
Mandatory?: {{ newComp.isMandatory}}
@ -64,9 +70,12 @@
<div flex="65"></div>
<md-button class="md-raised" ng-click="addComponent()"><i class="fa fa-plus"></i> Add To Task</md-button>
</div>
</md-card>
</div>
</div>
<div flex="50" layout-padding>
<div flex="60" layout-padding>
<!-- <md-card style="background-image: url('http://www.stationeryhq.com/content/images/thumbs/0000324_clipboard_500.png')">
</md-card> -->
@ -80,6 +89,9 @@
<p>{{ dueTimeFromNow }}</p>
<p>{{task.task.description}}</p>
<p>{{(task.isPersonal) ? "Personal" : "Project"}} Task</p>
<md-divider ng-if="!$last"></md-divider>
<div ng-repeat="component in task.components">
<!-- if text box -->
<div ng-if="component.type == 'textbox'">
@ -101,6 +113,20 @@
{{ component.label}}
</md-checkbox>
</div>
<!-- if Link -->
<div ng-if="component.type == 'link'" layout="column" ng-init="initLinkComp(component)" style="width: 100%" layout-align="center">
<md-button ng-href="{{component.href}}" style="width: 100%" target="_blank">
<i class="fa fa-link"></i> {{component.title}}
</md-button>
</div>
<!-- if RadioButtons -->
<div ng-if="component.type == 'radiobuttons'" ng-init="initRadioButtonsComp(component)">
{{component.title}}
<md-radio-group ng-model="component.value" ng-change="RB(component)">
<md-radio-button ng-repeat="option in component.values" value="{{option.text}}" class="md-primary">{{option.text}}</md-radio-button>
</md-radio-group>
</div>
<md-divider ng-if="!$last"></md-divider>
</div>
</md-card>
</div>

View file

@ -1,6 +1,8 @@
<div>
<div class="loader" ng-if="loadingData">
<div class="loader" ng-if="loadingData" layout="row" layout-align="center">
<md-progress-circular md-mode="indeterminate"></md-progress-circular>
</div>
<md-content layout-padding>
<md-card layout-padding>
@ -15,7 +17,7 @@
<img ng-src="{{user.avatar_url}}" alt="" style="width:20%">
</div>
<div flex="70%">
<md-button class="md-raised" ng-click="changeProfileMode()">
<md-button class="md-raised" ng-click="changeProfileMode()" ng-if="isUser">
<i ng-class="profileModeIcon"></i> {{profileMode}}
</md-button>
</div>
@ -78,7 +80,7 @@
</div>
<div class="spacer"></div>
<div>
<md-button class="">
<md-button class="" ng-if="isUser">
X
</md-button>
</div>
@ -96,11 +98,11 @@
<img alt="{{ person.name }}" ng-src="{{ campus.avatar_url }}" class="md-avatar" />
</div>
<div class="port_spacer">
{{ campus.title }} -
<strong>{{ campus.title }}</strong> {{campus.email_ending}}
</div>
<div class="spacer"></div>
<div>
<md-button class="">
<md-button class="" ng-if="isUser">
X
</md-button>
</div>

View file

@ -1,6 +1,23 @@
<div class = "projects">
<h1 style="margin-left:15px"><i class="fa fa-graduation-cap"></i> Class {{course.courseName}}</h1>
<div layout-padding layout-margin>
<md-button ng-click = "joinCourse()" ng class = "md-raised"> Join Course</md-button>
</div>
<md-card class="cardAllProjects">
<div flex ="99" class = "allProjectsShow" layout = "row" ng-repeat = "t in arrayHolder" value = "{{t}}">
<div flex = "32" layout = "column" ng-repeat = "project in t" value = "{{project}}" layout-padding>
<div ng-if = "!scope.projectEmpty">
<md-card layout-padding ng-click = "goToProject(project.id)" style="width:32%; height:32%;" class = "projectCard">
{{project.id}}
</md-card>
</div>
</div>
<div ng-if = "scope.projectEmpty">
You Are Not Related To Any Course, You May Join Any Course You Wish.
</div>
</div>
</md-card>
<md-content layout-padding layout-margin>
<h1 style="margin-left:15px"><i class="fa fa-file-cube-o"></i> Projects</h1>
<md-button ng-click="createProjectClicked()" ng class="md-raised md-primary">Create Project</md-button>
</md-content>
</div>

View file

@ -1,6 +1,52 @@
<div class = "tasks">
<md-content layout-padding layout-margin>
<h1 style="margin-left:15px"><i class="fa fa-file-text-o"></i> Tasks</h1>
<div ng-if="user.isLecturer">
<md-button ng-click="createTaskClicked(taskName)" ng class="md-raised md-primary">Create Task</md-button>
<div flex>
<md-card>
<md-content class="md-padding">
<md-tabs md-dynamic-height md-border-bottom>
<md-tab label="Submitted">
<md-content class="md-padding">
<h1 class="md-display-2">Submitted</h1>
<p>Submitted...</p>
</md-content>
</md-tab>
<md-tab label="Delayed">
<md-content class="md-padding">
<h1 class="md-display-2">Delayed</h1>
<p>Delayed...</p>
</md-content>
</md-tab>
<md-tab label="Not Submitted">
<md-content class="md-padding">
<h1 class="md-display-2">Not Submitted</h1>
<p> Not Submitted ..</p>
</md-content>
</md-tab>
<md-tab label="WhatEver">
<md-content class="md-padding">
<h1 class="md-display-2">WhatEver</h1>
<p>Bla Bla Bla..</p>
</md-content>
</md-tab>
</md-tabs>
</md-content>
</md-card>
</div>
<!-- Should Be In Table List -->
<div class = "allProjectsShow" flex = "99" layout = "row" ng-repeat = "t in threeSizedArray" value = "{{t}}" layout-padding>
<div flex = "32" layout = "column" ng-repeat = "project in t" value = "{{project}}">
<md-button ng-click = "goToProject(project.id)" style="width:32%; height:32%;" flex="32" layout-padding class = "md-raised">
<!-- <img src="{{campus.avatar_url}}" style = "width:14%; height:auto;"> -->
{{project.title}}
</md-button>
</div>
</div>
<!-- Should Be In Table List -->
</div>
</md-content>
</div>