Merge branch 'master' of https://github.com/sagidayan/SE-Hub into QA
This commit is contained in:
commit
ddfbbc04fe
42 changed files with 2569 additions and 972 deletions
|
@ -30,6 +30,7 @@ from SE_API.CampusRoutes import campus_routes
|
||||||
from SE_API.CourseRoutes import course_routes
|
from SE_API.CourseRoutes import course_routes
|
||||||
from SE_API.ProjectRoutes import project_routes
|
from SE_API.ProjectRoutes import project_routes
|
||||||
from SE_API.TaskRoutes import task_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(course_routes)
|
||||||
app.register_blueprint(project_routes)
|
app.register_blueprint(project_routes)
|
||||||
app.register_blueprint(task_routes)
|
app.register_blueprint(task_routes)
|
||||||
|
app.register_blueprint(message_routes)
|
||||||
|
|
||||||
auto = Autodoc(app)
|
auto = Autodoc(app)
|
||||||
|
|
||||||
|
@ -137,12 +139,12 @@ def send_activation(token):
|
||||||
return Response(status=200)
|
return Response(status=200)
|
||||||
|
|
||||||
@app.route('/api/help')
|
@app.route('/api/help')
|
||||||
def documentation():
|
def documentation_index():
|
||||||
return app.send_static_file('API_Doc/api_doc_index.html')
|
return app.send_static_file('API_Doc/api_doc_index.html')
|
||||||
|
|
||||||
# @app.route('/api/help/campuses')
|
@app.route('/api/help/misc')
|
||||||
# def documentation():
|
def documentation_misc():
|
||||||
# return auto.html()
|
return auto.html()
|
||||||
|
|
||||||
@app.route('/home')
|
@app.route('/home')
|
||||||
def returnHome():
|
def returnHome():
|
||||||
|
|
|
@ -76,9 +76,10 @@ def create_campus(token):
|
||||||
print e
|
print e
|
||||||
|
|
||||||
user = get_user_by_token(token)
|
user = get_user_by_token(token)
|
||||||
|
arr = []
|
||||||
|
arr.append(str(user.key().id()))
|
||||||
try:
|
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:
|
except Exception:
|
||||||
return bad_request()
|
return bad_request()
|
||||||
|
|
||||||
|
@ -94,6 +95,53 @@ def create_campus(token):
|
||||||
# PUT
|
# 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
|
# GET
|
||||||
#----------------------------------------------------------
|
#----------------------------------------------------------
|
||||||
|
@ -153,20 +201,130 @@ def get_campuses(token):
|
||||||
return forbidden("Invalid 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
|
# 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()
|
@auto.doc()
|
||||||
def deleteCampus(token,campusid):
|
def deleteCampus(token,campusId):
|
||||||
"""
|
"""
|
||||||
<span class="card-title">This Call will delete a specific campus</span>
|
<span class="card-title">This Call will delete a specific campus</span>
|
||||||
<br>
|
<br>
|
||||||
<b>Route Parameters</b><br>
|
<b>Route Parameters</b><br>
|
||||||
- seToken: 'seToken'
|
- seToken: 'seToken'
|
||||||
- campusid: 'campusid'
|
- campusId: 1234567890
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
<b>Payload</b><br>
|
<b>Payload</b><br>
|
||||||
|
@ -192,7 +350,7 @@ def deleteCampus(token,campusid):
|
||||||
return forbidden("Invalid token or not a lecturer!")
|
return forbidden("Invalid token or not a lecturer!")
|
||||||
|
|
||||||
user = get_user_by_token(token)
|
user = get_user_by_token(token)
|
||||||
camp = Campus.get_by_id(int(campusid))
|
camp = Campus.get_by_id(int(campusId))
|
||||||
|
|
||||||
if camp is None:
|
if camp is None:
|
||||||
return bad_request("no such campus")
|
return bad_request("no such campus")
|
||||||
|
|
|
@ -49,10 +49,9 @@ def create_course(token):
|
||||||
- JSON Object, Example: <br>
|
- JSON Object, Example: <br>
|
||||||
{<br>
|
{<br>
|
||||||
'courseName': 'Advance Math',<br>
|
'courseName': 'Advance Math',<br>
|
||||||
'campusName': 'JCE',<br>
|
'campusId': 1234567890,<br>
|
||||||
'startDate': {'year': 2015, 'month' : 4, 'day' : 3}<br>
|
'startDate': {'year': 2015, 'month' : 4, 'day' : 3},<br>
|
||||||
'endDate': {'year': 2016, 'month' : 5, 'day' : 14}<br>
|
'endDate': {'year': 2016, 'month' : 5, 'day' : 14}<br>
|
||||||
'taskFlag': false<br>
|
|
||||||
}<br>
|
}<br>
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
|
@ -75,7 +74,7 @@ def create_course(token):
|
||||||
try:
|
try:
|
||||||
payload = json.loads(request.data)
|
payload = json.loads(request.data)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return bad_request()
|
return bad_request("incorrect JSON format")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
start_date = datetime.date(payload['startDate']['year'],payload['startDate']['month'],payload['startDate']['day'])
|
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:
|
if end_date <= start_date:
|
||||||
return bad_request("end date cant be before (or same day) 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)
|
startDate=start_date, endDate=end_date)
|
||||||
#check if name already exists
|
#check if name already exists
|
||||||
try:
|
try:
|
||||||
query = Course.all()
|
query = Course.all()
|
||||||
|
query.filter('campusId = ', payload['campusId'])
|
||||||
query.filter("courseName = ", payload['courseName'])
|
query.filter("courseName = ", payload['courseName'])
|
||||||
for c in query.run(limit=1):
|
for c in query.run(limit=1):
|
||||||
return forbidden("Course with same name already exists")
|
return forbidden("Course with same name already exists")
|
||||||
|
@ -98,66 +98,70 @@ def create_course(token):
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print 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)
|
db.put(course)
|
||||||
|
|
||||||
|
#add course to user course list
|
||||||
|
user.courses_id_list.append(str(course.key().id()))
|
||||||
|
db.put(user)
|
||||||
|
|
||||||
db.save
|
db.save
|
||||||
return Response(response=course.to_JSON(),
|
return Response(response=course.to_JSON(),
|
||||||
status=201,
|
status=201,
|
||||||
mimetype="application/json")
|
mimetype="application/json")
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------
|
||||||
|
# PUT
|
||||||
|
#----------------------------------------------------------
|
||||||
|
|
||||||
|
@course_routes.route('/api/courses/joinCourse/<string:token>/<string:courseId>', methods=["PUT"])
|
||||||
@course_routes.route('/api/courses/createMessage/<string:token>', methods=['POST'])
|
|
||||||
@auto.doc()
|
@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>
|
<br>
|
||||||
<b>Route Parameters</b><br>
|
<b>Route Parameters</b><br>
|
||||||
- seToken: 'seToken'
|
- seToken: 'seToken'<br>
|
||||||
|
- courseId: 123456789
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
<b>Payload</b><br>
|
<b>Payload</b><br>
|
||||||
- JSON Object, Example: <br>
|
- None <br>
|
||||||
{<br>
|
|
||||||
'courseName': 'Advance Math',<br>
|
|
||||||
'message': 'The lecture today is canceled'<br>
|
|
||||||
}<br>
|
|
||||||
<br>
|
|
||||||
<br>
|
<br>
|
||||||
<b>Response</b>
|
<b>Response</b>
|
||||||
<br>
|
<br>
|
||||||
201 - Created
|
202 - Accepted
|
||||||
<br>
|
<br>
|
||||||
400 - Bad Request
|
400 - Bad Request
|
||||||
<br>
|
<br>
|
||||||
403 - Invalid token or not a lecturer
|
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)
|
user = get_user_by_token(token)
|
||||||
|
if user is None:
|
||||||
|
return bad_request("Wrong user Token")
|
||||||
|
|
||||||
#try to parse payload
|
course = Course.get_by_id(int(courseId))
|
||||||
try:
|
if course is None:
|
||||||
payload = json.loads(request.data)
|
return bad_request("No such course")
|
||||||
except Exception as e:
|
|
||||||
return bad_request("here")
|
|
||||||
|
|
||||||
try:
|
if str(user.key().id()) in course.membersId:
|
||||||
msg = Message(courseName=payload['courseName'], message=payload['message'], msgDate=datetime.datetime.now())
|
return bad_request("User is already member in Course")
|
||||||
except Exception as e:
|
|
||||||
print e
|
|
||||||
return bad_request("there")
|
|
||||||
|
|
||||||
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
|
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()
|
@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>
|
<span class="card-title">>This Call will return an array of all courses in a given campus</span>
|
||||||
<br>
|
<br>
|
||||||
<b>Route Parameters</b><br>
|
<b>Route Parameters</b><br>
|
||||||
- name: 'campus name'
|
- campusId: 1234567890
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
<b>Payload</b><br>
|
<b>Payload</b><br>
|
||||||
|
@ -185,7 +189,7 @@ def getCourseByCampusName(name):
|
||||||
<code>
|
<code>
|
||||||
{<br>
|
{<br>
|
||||||
'courseName': 'Advance Math',<br>
|
'courseName': 'Advance Math',<br>
|
||||||
'campusName': 'JCE',<br>
|
'campusId': 1234567890,<br>
|
||||||
'startDate': '2015-14-3'<br>
|
'startDate': '2015-14-3'<br>
|
||||||
'endDate': '2015-29-6'<br>
|
'endDate': '2015-29-6'<br>
|
||||||
'taskFlag': 'False'<br>
|
'taskFlag': 'False'<br>
|
||||||
|
@ -195,9 +199,13 @@ def getCourseByCampusName(name):
|
||||||
</code>
|
</code>
|
||||||
<br>
|
<br>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
if get_user_by_token(token) is None:
|
||||||
|
return bad_request("Bad User Token")
|
||||||
|
|
||||||
arr = []
|
arr = []
|
||||||
query = Course.all()
|
query = Course.all()
|
||||||
query.filter("campusName=", name)
|
query.filter("campusId = ", int(campusId))
|
||||||
|
|
||||||
for c in query.run():
|
for c in query.run():
|
||||||
arr.append(dict(json.loads(c.to_JSON())))
|
arr.append(dict(json.loads(c.to_JSON())))
|
||||||
|
@ -211,61 +219,123 @@ def getCourseByCampusName(name):
|
||||||
status=200,
|
status=200,
|
||||||
mimetype="application/json")
|
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()
|
@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>
|
<br>
|
||||||
<b>Route Parameters</b><br>
|
<b>Route Parameters</b><br>
|
||||||
- name: 'campus name'
|
- seToken: 'seToken'<br>
|
||||||
|
- campusId: 1234354543<br>
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
<b>Payload</b><br>
|
<b>Payload</b><br>
|
||||||
- NONE
|
- NONE <br>
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
<b>Response</b>
|
<b>Response</b>
|
||||||
<br>
|
<br>
|
||||||
200 - JSON Example:<br>
|
200 - JSON Array, Example:<br>
|
||||||
<code>
|
[<br>
|
||||||
{<br>
|
{
|
||||||
'courseName': 'Advance Math',<br>
|
'title': 'JCE',<br>
|
||||||
'campusName': 'JCE',<br>
|
'email_ending': '@post.jce.ac.il',<br>
|
||||||
'startDate': '2015-14-3'<br>
|
'master_user_id': 123453433341, (User that created the campus)<br>
|
||||||
'endDate': '2015-29-6'<br>
|
'avatar_url': 'http://some.domain.com/imagefile.jpg',<br>
|
||||||
'taskFlag': false,<br>
|
|
||||||
'id' : 1234567890<br>
|
'id' : 1234567890<br>
|
||||||
|
},<br>
|
||||||
}
|
....<br>
|
||||||
</code>
|
{<br>
|
||||||
|
...<br>
|
||||||
|
}req<br>
|
||||||
|
]<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 = []
|
arr = []
|
||||||
query = Message.all()
|
for i in user.courses_id_list:
|
||||||
query.filter("courseName = ", name)
|
course = Course.get_by_id(int(i))
|
||||||
|
if course.campusId == campus.key().id():
|
||||||
for m in query.run():
|
arr.append(dict(json.loads(course.to_JSON())))
|
||||||
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
|
|
||||||
|
|
||||||
if len(arr) != 0:
|
if len(arr) != 0:
|
||||||
return Response(response=json.dumps(arr),
|
return Response(response=json.dumps(arr),
|
||||||
status=200,
|
status=200,
|
||||||
mimetype="application/json")
|
mimetype="application/json")
|
||||||
else:
|
else:
|
||||||
return Response(response=[],
|
return Response(response='[]',
|
||||||
status=200,
|
status=200,
|
||||||
mimetype="application/json")
|
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
|
# PUT
|
||||||
#----------------------------------------------------------
|
#----------------------------------------------------------
|
||||||
|
@ -286,7 +356,7 @@ def deleteCourse(token,courseid):
|
||||||
<span class="card-title">This Call will delete a specific Course</span>
|
<span class="card-title">This Call will delete a specific Course</span>
|
||||||
<br>
|
<br>
|
||||||
<b>Route Parameters</b><br>
|
<b>Route Parameters</b><br>
|
||||||
- seToken: 'seToken'
|
- seToken: 'seToken'<br>
|
||||||
- courseid: 'courseid'
|
- courseid: 'courseid'
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
|
@ -327,64 +397,64 @@ def deleteCourse(token,courseid):
|
||||||
return forbidden("lecturer is not owner of course")
|
return forbidden("lecturer is not owner of course")
|
||||||
|
|
||||||
|
|
||||||
@course_routes.route('/api/courses/deleteCoursesByCampus/<string:token>/<string:campusName>', methods=['DELETE'])
|
# @course_routes.route('/api/courses/deleteCoursesByCampus/<string:token>/<string:campusid>', methods=['DELETE'])
|
||||||
@auto.doc()
|
# @auto.doc()
|
||||||
def deleteCoursesByCampus(token,campusName):
|
# def deleteCoursesByCampus(token,campusName):
|
||||||
"""
|
# """
|
||||||
<span class="card-title">This Call will delete a specific campus's courses</span>
|
# <span class="card-title">This Call will delete a specific campus's courses</span>
|
||||||
<br>
|
# <br>
|
||||||
<b>Route Parameters</b><br>
|
# <b>Route Parameters</b><br>
|
||||||
- seToken: 'seToken'
|
# - seToken: 'seToken'
|
||||||
- title: 'campusName'
|
# - title: 'campusName'
|
||||||
<br>
|
# <br>
|
||||||
<br>
|
# <br>
|
||||||
<b>Payload</b><br>
|
# <b>Payload</b><br>
|
||||||
- NONE <br>
|
# - NONE <br>
|
||||||
<br>
|
# <br>
|
||||||
<br>
|
# <br>
|
||||||
<b>Response</b>
|
# <b>Response</b>
|
||||||
<br>
|
# <br>
|
||||||
202 - Deleted campus
|
# 202 - Deleted campus
|
||||||
<br>
|
# <br>
|
||||||
204 - No Matching Campus Found
|
# 204 - No Matching Campus Found
|
||||||
<br>
|
# <br>
|
||||||
....<br>
|
# ....<br>
|
||||||
{<br>
|
# {<br>
|
||||||
...<br>
|
# ...<br>
|
||||||
}req<br>
|
# }req<br>
|
||||||
|
#
|
||||||
]<br>
|
# ]<br>
|
||||||
400 - Bad Request
|
# 400 - Bad Request
|
||||||
<br>
|
# <br>
|
||||||
403 - Invalid token or not a lecturer!<br>
|
# 403 - Invalid token or not a lecturer!<br>
|
||||||
"""
|
# """
|
||||||
|
#
|
||||||
if not is_lecturer(token): #todo: change to lecturer id
|
# if not is_lecturer(token): #todo: change to lecturer id
|
||||||
return forbidden("Invalid token or not a lecturer!")
|
# return forbidden("Invalid token or not a lecturer!")
|
||||||
|
#
|
||||||
|
#
|
||||||
user = get_user_by_token(token)
|
# user = get_user_by_token(token)
|
||||||
campus = get_campus_by_campusName(campusName)
|
# campus = get_campus_by_campusName(campusName)
|
||||||
if campus is None:
|
# if campus is None:
|
||||||
return bad_request("Not a campus!")
|
# return bad_request("Not a campus!")
|
||||||
|
#
|
||||||
#check user is owner of campus
|
# #check user is owner of campus
|
||||||
if campus.master_user_id != user.key().id():
|
# if campus.master_user_id != user.key().id():
|
||||||
return forbidden("lecturer is not owner of campus!")
|
# return forbidden("lecturer is not owner of campus!")
|
||||||
|
#
|
||||||
query = Course.all()
|
# query = Course.all()
|
||||||
|
#
|
||||||
try:
|
# try:
|
||||||
query.filter('campusName =', campusName)
|
# query.filter('campusName =', campusName)
|
||||||
except Exception as e:
|
# except Exception as e:
|
||||||
print e
|
# print e
|
||||||
return bad_request("invalid course title attribute")
|
# return bad_request("invalid course title attribute")
|
||||||
|
#
|
||||||
for c in query.run():
|
# for c in query.run():
|
||||||
db.delete(c)
|
# db.delete(c)
|
||||||
db.save
|
# db.save
|
||||||
|
#
|
||||||
return no_content()
|
# return no_content()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
61
SE_API/GitHub_API_Connector.py
Normal file
61
SE_API/GitHub_API_Connector.py
Normal 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
246
SE_API/MessageRoutes.py
Normal 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()
|
|
@ -21,6 +21,8 @@ from models.Project import Project
|
||||||
from SE_API.Validation_Utils import *
|
from SE_API.Validation_Utils import *
|
||||||
from SE_API.Respones_Utils import *
|
from SE_API.Respones_Utils import *
|
||||||
|
|
||||||
|
from GitHub_API_Connector import get_github_data
|
||||||
|
|
||||||
project_routes = Blueprint("project_routes", __name__)
|
project_routes = Blueprint("project_routes", __name__)
|
||||||
auto = Autodoc()
|
auto = Autodoc()
|
||||||
|
|
||||||
|
@ -42,7 +44,7 @@ def create_project(token):
|
||||||
- JSON Object, Example: <br>
|
- JSON Object, Example: <br>
|
||||||
{<br>
|
{<br>
|
||||||
'projectName': 'Advance Math',<br>
|
'projectName': 'Advance Math',<br>
|
||||||
'courseName': 'JCE',<br>
|
'courseId': 1234567890,<br>
|
||||||
'logo_url': 'http://location.domain.com/image.jpg',<br>
|
'logo_url': 'http://location.domain.com/image.jpg',<br>
|
||||||
'gitRepository': 'http://location.git.com/somthing'<br>
|
'gitRepository': 'http://location.git.com/somthing'<br>
|
||||||
}<br>
|
}<br>
|
||||||
|
@ -58,23 +60,28 @@ def create_project(token):
|
||||||
"""
|
"""
|
||||||
if not request.data:
|
if not request.data:
|
||||||
return bad_request()
|
return bad_request()
|
||||||
|
try:
|
||||||
payload = json.loads(request.data)
|
payload = json.loads(request.data)
|
||||||
#if not is_lecturer(token): #todo: change to lecturer id
|
except Exception as e:
|
||||||
# return forbidden("Invalid token or not a lecturer!")
|
return bad_request("invalid JSON format")
|
||||||
|
|
||||||
user = get_user_by_token(token)
|
user = get_user_by_token(token)
|
||||||
if user is None:
|
if user is None:
|
||||||
return bad_request("Wrong user Token")
|
return bad_request("Wrong user Token")
|
||||||
|
|
||||||
#todo: check legality
|
|
||||||
|
|
||||||
try:
|
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:
|
except Exception as e:
|
||||||
print e
|
print e
|
||||||
return bad_request()
|
return bad_request()
|
||||||
|
|
||||||
db.put(project)
|
db.put(project)
|
||||||
|
|
||||||
|
#update user projects list
|
||||||
|
user.projects_id_list.append(str(project.key().id()))
|
||||||
|
|
||||||
|
db.put(user)
|
||||||
db.save
|
db.save
|
||||||
return Response(response=project.to_JSON(),
|
return Response(response=project.to_JSON(),
|
||||||
status=200,
|
status=200,
|
||||||
|
@ -84,19 +91,118 @@ def create_project(token):
|
||||||
# PUT
|
# 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
|
# 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()
|
@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>
|
<span class="card-title">>This Call will return an array of all projects in a given course</span>
|
||||||
<br>
|
<br>
|
||||||
<b>Route Parameters</b><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>
|
||||||
<br>
|
<br>
|
||||||
<b>Payload</b><br>
|
<b>Payload</b><br>
|
||||||
|
@ -120,13 +226,18 @@ def getProjectsByCourseName(name):
|
||||||
<br>
|
<br>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
arr = []
|
user = get_user_by_token(token)
|
||||||
query = Project.all()
|
if user is None:
|
||||||
query.filter("courseName = ", name)
|
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:
|
if len(arr) != 0:
|
||||||
return Response(response=json.dumps(arr),
|
return Response(response=json.dumps(arr),
|
||||||
status=200,
|
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()
|
@auto.doc()
|
||||||
def deleteProject(token,projectid):
|
def deleteProject(token,projectId):
|
||||||
"""
|
"""
|
||||||
<span class="card-title">This Call will delete a specific Project</span>
|
<span class="card-title">This Call will delete a specific Project</span>
|
||||||
<br>
|
<br>
|
||||||
<b>Route Parameters</b><br>
|
<b>Route Parameters</b><br>
|
||||||
- seToken: 'seToken'
|
- seToken: 'seToken'
|
||||||
- courseid: 'projectid'
|
- projectId: 'projectid'
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
<b>Payload</b><br>
|
<b>Payload</b><br>
|
||||||
|
@ -178,7 +289,9 @@ def deleteProject(token,projectid):
|
||||||
# return forbidden("Invalid token or not a lecturer!")
|
# return forbidden("Invalid token or not a lecturer!")
|
||||||
|
|
||||||
user = get_user_by_token(token)
|
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:
|
if p is None:
|
||||||
return bad_request("no such Project")
|
return bad_request("no such Project")
|
||||||
|
|
|
@ -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()
|
@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>
|
<br>
|
||||||
<b>Route Parameters</b><br>
|
<b>Route Parameters</b><br>
|
||||||
- name: 'course name'
|
- SeToken: token<br>
|
||||||
|
- courseId: 1234567890
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
<b>Payload</b><br>
|
<b>Payload</b><br>
|
||||||
|
@ -173,7 +174,7 @@ def getAllTasks(courseName):
|
||||||
<code>
|
<code>
|
||||||
{<br>
|
{<br>
|
||||||
'title' : 'Task1',<br>
|
'title' : 'Task1',<br>
|
||||||
'courseName' : 'advance Math',<br>
|
'courseId' : 12345678,<br>
|
||||||
'description' : 'prepare by sunday',<br>
|
'description' : 'prepare by sunday',<br>
|
||||||
'dueDate' : {
|
'dueDate' : {
|
||||||
'year' : 2015,
|
'year' : 2015,
|
||||||
|
@ -186,10 +187,12 @@ def getAllTasks(courseName):
|
||||||
</code>
|
</code>
|
||||||
<br>
|
<br>
|
||||||
"""
|
"""
|
||||||
|
if get_user_by_token(token) is None:
|
||||||
|
return bad_request("Bad User Token")
|
||||||
|
|
||||||
arr = []
|
arr = []
|
||||||
query = Task.all()
|
query = Task.all()
|
||||||
query.filter("courseName = ", courseName)
|
query.filter("courseId = ", courseId)
|
||||||
|
|
||||||
for t in query.run():
|
for t in query.run():
|
||||||
taskDic =dict(json.loads(t.to_JSON()))
|
taskDic =dict(json.loads(t.to_JSON()))
|
||||||
|
@ -211,14 +214,15 @@ def getAllTasks(courseName):
|
||||||
return no_content()
|
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()
|
@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>
|
<span class="card-title">>This Call will return an array of all Future Tasks in a course, ordered by date</span>
|
||||||
<br>
|
<br>
|
||||||
<b>Route Parameters</b><br>
|
<b>Route Parameters</b><br>
|
||||||
- name: 'course name'
|
- SeToken: token<br>
|
||||||
|
- courseId: 1234567890
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
<b>Payload</b><br>
|
<b>Payload</b><br>
|
||||||
|
@ -245,9 +249,12 @@ def getAllFutureTasks(courseName):
|
||||||
<br>
|
<br>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
if get_user_by_token(token) is None:
|
||||||
|
return bad_request("Bad User Token")
|
||||||
|
|
||||||
arr = []
|
arr = []
|
||||||
query = Task.all()
|
query = Task.all()
|
||||||
query.filter("courseName = ", courseName)
|
query.filter("courseId = ", courseId)
|
||||||
|
|
||||||
for t in query.run():
|
for t in query.run():
|
||||||
taskDic =dict(json.loads(t.to_JSON()))
|
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()
|
@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>
|
<span class="card-title">>This Call will return an array of all components for a given task</span>
|
||||||
<br>
|
<br>
|
||||||
<b>Route Parameters</b><br>
|
<b>Route Parameters</b><br>
|
||||||
- taskId: integer
|
- SeToken: token<br>
|
||||||
|
- taskId: 1234567890
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
<b>Payload</b><br>
|
<b>Payload</b><br>
|
||||||
|
@ -311,6 +319,9 @@ def getTaskComponents(taskId):
|
||||||
<br>
|
<br>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
if get_user_by_token(token) is None:
|
||||||
|
return bad_request("Bad User Token")
|
||||||
|
|
||||||
arr = []
|
arr = []
|
||||||
query = TaskComponent.all()
|
query = TaskComponent.all()
|
||||||
query.filter("taskId = ", taskId)
|
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()
|
@auto.doc()
|
||||||
def deleteTask(token,taskid):
|
def deleteTask(token, taskId):
|
||||||
"""
|
"""
|
||||||
<span class="card-title">This Call will delete a specific Task</span>
|
<span class="card-title">This Call will delete a specific Task</span>
|
||||||
<br>
|
<br>
|
||||||
<b>Route Parameters</b><br>
|
<b>Route Parameters</b><br>
|
||||||
- seToken: 'seToken'
|
- seToken: 'seToken'
|
||||||
- taskid: 'taskid'
|
- taskId: 'taskid'
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
<b>Payload</b><br>
|
<b>Payload</b><br>
|
||||||
|
@ -373,7 +384,7 @@ def deleteTask(token,taskid):
|
||||||
#return forbidden("lecturer is not owner of course")
|
#return forbidden("lecturer is not owner of course")
|
||||||
|
|
||||||
user = get_user_by_token(token)
|
user = get_user_by_token(token)
|
||||||
c = Task.get_by_id(int(taskid))
|
c = Task.get_by_id(int(taskId))
|
||||||
|
|
||||||
if c is None:
|
if c is None:
|
||||||
return bad_request("no such Task")
|
return bad_request("no such Task")
|
||||||
|
@ -384,15 +395,15 @@ def deleteTask(token,taskid):
|
||||||
return accepted("Task deleted")
|
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()
|
@auto.doc()
|
||||||
def deleteTaskComponents(token,taskid):
|
def deleteTaskComponents(token,taskId):
|
||||||
"""
|
"""
|
||||||
<span class="card-title">This Call will delete a specific Task's components</span>
|
<span class="card-title">This Call will delete a specific Task's components</span>
|
||||||
<br>
|
<br>
|
||||||
<b>Route Parameters</b><br>
|
<b>Route Parameters</b><br>
|
||||||
- seToken: 'seToken'
|
- seToken: 'seToken'
|
||||||
- taskid: 'taskid'
|
- taskId: 'taskid'
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
<b>Payload</b><br>
|
<b>Payload</b><br>
|
||||||
|
@ -421,7 +432,7 @@ def deleteTaskComponents(token,taskid):
|
||||||
#return forbidden("lecturer is not owner of course")
|
#return forbidden("lecturer is not owner of course")
|
||||||
|
|
||||||
user = get_user_by_token(token)
|
user = get_user_by_token(token)
|
||||||
t = Task.get_by_id(int(taskid))
|
t = Task.get_by_id(int(taskId))
|
||||||
|
|
||||||
if t is None:
|
if t is None:
|
||||||
return bad_request("no such Task")
|
return bad_request("no such Task")
|
||||||
|
|
|
@ -17,6 +17,7 @@ from flask.ext.autodoc import Autodoc
|
||||||
# DB Models
|
# DB Models
|
||||||
from models.User import User
|
from models.User import User
|
||||||
from models.Course import Course
|
from models.Course import Course
|
||||||
|
from models.Project import Project
|
||||||
|
|
||||||
#Validation Utils Libs
|
#Validation Utils Libs
|
||||||
from SE_API.Validation_Utils import *
|
from SE_API.Validation_Utils import *
|
||||||
|
@ -52,7 +53,6 @@ def updateUser(token):
|
||||||
{<br>
|
{<br>
|
||||||
'name': 'new name',<br>
|
'name': 'new name',<br>
|
||||||
'isLecturer': true,<br>
|
'isLecturer': true,<br>
|
||||||
'campusName': 'JCE'<br>
|
|
||||||
}<br>
|
}<br>
|
||||||
<br>
|
<br>
|
||||||
<b>Response</b>
|
<b>Response</b>
|
||||||
|
@ -79,10 +79,6 @@ def updateUser(token):
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
try:
|
|
||||||
user.campusName = payload['campusName']
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
user.isLecturer = payload['isLecturer']
|
user.isLecturer = payload['isLecturer']
|
||||||
|
@ -268,26 +264,267 @@ def getUserByToken(token):
|
||||||
status=200,
|
status=200,
|
||||||
mimetype="application/json") # Real response!
|
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")
|
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
|
# 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()
|
@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>
|
<br>
|
||||||
<b>Route Parameters</b><br>
|
<b>Route Parameters</b><br>
|
||||||
- seToken: 'seToken'
|
- seToken: 'seToken'<br>
|
||||||
|
- userId: 0987654321,<br>
|
||||||
- 'campusId': 1234567890<br>
|
- 'campusId': 1234567890<br>
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
|
@ -303,18 +540,13 @@ def removeUserFromCampus(token, campusId):
|
||||||
400 - Bad Request
|
400 - Bad Request
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if not request.data:
|
requestingUser = get_user_by_token(token)
|
||||||
return bad_request()
|
if requestingUser is None:
|
||||||
|
return bad_request("Bad User Token")
|
||||||
|
|
||||||
try:
|
userToRemove = User.get_by_id(int(userId))
|
||||||
payload = json.loads(request.data)
|
if userToRemove is None:
|
||||||
except Exception as e:
|
return bad_request("No such user to remove")
|
||||||
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)
|
|
||||||
|
|
||||||
#check Campus Exists
|
#check Campus Exists
|
||||||
campus = Campus.get_by_id(int(campusId))
|
campus = Campus.get_by_id(int(campusId))
|
||||||
|
@ -322,18 +554,20 @@ def removeUserFromCampus(token, campusId):
|
||||||
return bad_request("No such Campus!")
|
return bad_request("No such Campus!")
|
||||||
|
|
||||||
#check if user is owner of Campus
|
#check if user is owner of Campus
|
||||||
if user.key().id() != campus.master_user_id:
|
if requestingUser.key().id() != campus.master_user_id:
|
||||||
return forbidden("Lecturer is not owner of course")
|
# check if user want to delete itself
|
||||||
|
if requestingUser.key().id() != userToRemove.key().id():
|
||||||
|
return forbidden("No permission to delete user")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
user.campuses_id_list.remove(campusId)
|
userToRemove.campuses_id_list.remove(campusId)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print e
|
|
||||||
return bad_request("user is not listed to this campus")
|
return bad_request("user is not listed to this campus")
|
||||||
|
|
||||||
db.put(user)
|
|
||||||
|
db.put(userToRemove)
|
||||||
db.save
|
db.save
|
||||||
return Response(response=user.to_JSON(),
|
return Response(response=userToRemove.to_JSON(),
|
||||||
status=200,
|
status=200,
|
||||||
mimetype="application/json") # Real response!
|
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()
|
@user_routes.route('/api/users/removeUserFromCourse/<string:token>/<string:userId>/<string:courseId>', methods=["PUT"])
|
||||||
# def removeUserFromCourse(token, courseId):
|
@auto.doc()
|
||||||
# """
|
def removeUserFromCourse(token, userId, courseId):
|
||||||
# <span class="card-title">>This Call will remove a Course from a user Campus list</span>
|
"""
|
||||||
# <br>
|
<span class="card-title">>This Call will remove a user from a course</span>
|
||||||
# <b>Route Parameters</b><br>
|
<br>
|
||||||
# - seToken: 'seToken'
|
<b>Route Parameters</b><br>
|
||||||
# - 'courseId': 1234567890<br>
|
- seToken: 'seToken'<br>
|
||||||
# <br>
|
- userId: 0987654321,<br>
|
||||||
# <br>
|
- 'courseId': 1234567890<br>
|
||||||
# <b>Payload</b><br>
|
<br>
|
||||||
# - NONE
|
<br>
|
||||||
# {<br>
|
<b>Payload</b><br>
|
||||||
# }<br>
|
- NONE
|
||||||
# <br>
|
{<br>
|
||||||
# <b>Response</b>
|
}<br>
|
||||||
# <br>
|
<br>
|
||||||
# 200 - User updated
|
<b>Response</b>
|
||||||
# <br>
|
<br>
|
||||||
# 400 - Bad Request
|
200 - User updated
|
||||||
# """
|
<br>
|
||||||
#
|
400 - Bad Request
|
||||||
# if not request.data:
|
"""
|
||||||
# return bad_request()
|
|
||||||
#
|
requestingUser = get_user_by_token(token)
|
||||||
# try:
|
if requestingUser is None:
|
||||||
# payload = json.loads(request.data)
|
return bad_request("Bad User Token")
|
||||||
# except Exception as e:
|
|
||||||
# return bad_request()
|
userToRemove = User.get_by_id(int(userId))
|
||||||
#
|
if userToRemove is None:
|
||||||
# user = get_user_by_token(token)
|
return bad_request("No such user to remove")
|
||||||
# if user is None:
|
|
||||||
# return bad_request("No such user!")
|
#check Course Exists
|
||||||
#
|
course = Course.get_by_id(int(courseId))
|
||||||
#
|
if course is None:
|
||||||
# #check Course Exists
|
return bad_request("No such Course!")
|
||||||
# course = Course.get_by_id(int(courseId))
|
|
||||||
# if course is None:
|
#check if user is owner of Course
|
||||||
# return bad_request("No such Course!")
|
if requestingUser.key().id() != course.master_id:
|
||||||
#
|
# check if user want to delete itself
|
||||||
# #check if user is owner of Campus
|
if requestingUser.key().id() != userToRemove.key().id():
|
||||||
# if user.key().id() != course.master_id:
|
return forbidden("No permission to delete user")
|
||||||
# return forbidden("Lecturer is not owner of course")
|
|
||||||
#
|
try:
|
||||||
# try:
|
userToRemove.courses_id_list.remove(courseId)
|
||||||
# user.campuses_id_list.remove(campusId)
|
course.membersId.remove(userToRemove.key().id())
|
||||||
# except Exception as e:
|
except Exception as e:
|
||||||
# print e
|
return bad_request("user is not listed to this course")
|
||||||
# return bad_request("user is not listed to this campus")
|
|
||||||
#
|
|
||||||
# db.put(user)
|
|
||||||
# db.save
|
db.put(userToRemove)
|
||||||
# return Response(response=user.to_JSON(),
|
db.put(course)
|
||||||
# status=200,
|
db.save
|
||||||
# mimetype="application/json") # Real response!
|
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!
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,10 @@ def get_user_by_token(token):
|
||||||
return u
|
return u
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def get_user_by_id(id):
|
||||||
|
u = User.get_by_id(id)
|
||||||
|
return u
|
||||||
|
|
||||||
def get_campus_by_campusName(campusName):
|
def get_campus_by_campusName(campusName):
|
||||||
query = Campus.all()
|
query = Campus.all()
|
||||||
query.filter("title = ", campusName)
|
query.filter("title = ", campusName)
|
||||||
|
|
|
@ -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()
|
|
|
@ -9,12 +9,15 @@ class Campus(db.Model):
|
||||||
avatar_url = db.StringProperty(required=True)
|
avatar_url = db.StringProperty(required=True)
|
||||||
email_ending = db.StringProperty(required=True)
|
email_ending = db.StringProperty(required=True)
|
||||||
master_user_id = db.IntegerProperty(required=True)
|
master_user_id = db.IntegerProperty(required=True)
|
||||||
|
membersId = db.StringListProperty(required=True, default=[])
|
||||||
|
|
||||||
|
|
||||||
def to_JSON(self):
|
def to_JSON(self):
|
||||||
data = {'title': self.title,
|
data = {'title': self.title,
|
||||||
'email_ending': self.email_ending,
|
'email_ending': self.email_ending,
|
||||||
'master_user_id': self.master_user_id,
|
'master_user_id': self.master_user_id,
|
||||||
'avatar_url': self.avatar_url,
|
'avatar_url': self.avatar_url,
|
||||||
|
'membersId': self.membersId,
|
||||||
'id' : self.key().id()
|
'id' : self.key().id()
|
||||||
}
|
}
|
||||||
return json.dumps(data)
|
return json.dumps(data)
|
||||||
|
|
|
@ -5,15 +5,16 @@ from google.appengine.ext import db
|
||||||
|
|
||||||
class Course(db.Model):
|
class Course(db.Model):
|
||||||
courseName = db.StringProperty(required=True)
|
courseName = db.StringProperty(required=True)
|
||||||
campusName = db.StringProperty(required=True)
|
campusId = db.IntegerProperty(required=True)
|
||||||
master_id = db.IntegerProperty(required=True)
|
master_id = db.IntegerProperty(required=True)
|
||||||
# projects = db.StringListProperty(required=True,default=[])
|
# projects = db.StringListProperty(required=True,default=[])
|
||||||
startDate = db.DateProperty(required=True)
|
startDate = db.DateProperty(required=True)
|
||||||
endDate = db.DateProperty(required=True)
|
endDate = db.DateProperty(required=True)
|
||||||
|
membersId = db.StringListProperty(required=True)
|
||||||
|
|
||||||
def to_JSON(self):
|
def to_JSON(self):
|
||||||
data = {'courseName' : self.courseName,
|
data = {'courseName' : self.courseName,
|
||||||
'campusName' : self.campusName,
|
'campusId' : self.campusId,
|
||||||
'master_id' : self.master_id,
|
'master_id' : self.master_id,
|
||||||
# 'projects' : self.projects,
|
# 'projects' : self.projects,
|
||||||
'startDate' : {
|
'startDate' : {
|
||||||
|
@ -26,6 +27,7 @@ class Course(db.Model):
|
||||||
'month': self.endDate.month,
|
'month': self.endDate.month,
|
||||||
'day': self.endDate.day,
|
'day': self.endDate.day,
|
||||||
},
|
},
|
||||||
|
'membersId' : self.membersId,
|
||||||
'id' : self.key().id()
|
'id' : self.key().id()
|
||||||
}
|
}
|
||||||
return json.dumps(data)
|
return json.dumps(data)
|
||||||
|
|
|
@ -4,13 +4,15 @@ __author__ = 'Aran'
|
||||||
from google.appengine.ext import db
|
from google.appengine.ext import db
|
||||||
|
|
||||||
class Message(db.Model):
|
class Message(db.Model):
|
||||||
courseName = db.StringProperty(required=True)
|
groupId = db.IntegerProperty(required=True)
|
||||||
message = db.StringProperty(required=True)
|
message = db.StringProperty(required=True)
|
||||||
msgDate = db.DateTimeProperty(required=True)
|
msgDate = db.DateTimeProperty(required=True)
|
||||||
|
master_id = db.IntegerProperty(required=True)
|
||||||
|
isProject = db.BooleanProperty(default=False)
|
||||||
|
|
||||||
def to_JSON(self):
|
def to_JSON(self):
|
||||||
data = {
|
data = {
|
||||||
'courseName' : self.courseName,
|
'groupId' : self.groupId,
|
||||||
'message' : self.message,
|
'message' : self.message,
|
||||||
'date' : {
|
'date' : {
|
||||||
'year': self.msgDate.year,
|
'year': self.msgDate.year,
|
||||||
|
@ -19,6 +21,8 @@ class Message(db.Model):
|
||||||
'hour': self.msgDate.hour,
|
'hour': self.msgDate.hour,
|
||||||
'minute': self.msgDate.minute
|
'minute': self.msgDate.minute
|
||||||
},
|
},
|
||||||
'id' : self.key().id()
|
'id' : self.key().id(),
|
||||||
|
'master_id' : self.master_id,
|
||||||
|
'isProject' : self.isProject
|
||||||
}
|
}
|
||||||
return json.dumps(data)
|
return json.dumps(data)
|
||||||
|
|
|
@ -5,7 +5,7 @@ from google.appengine.ext import db
|
||||||
|
|
||||||
class Project(db.Model):
|
class Project(db.Model):
|
||||||
projectName = db.StringProperty(required=True)
|
projectName = db.StringProperty(required=True)
|
||||||
courseName = db.StringProperty(required=True)
|
courseId = db.IntegerProperty(required=True)
|
||||||
master_id = db.IntegerProperty(required=True)
|
master_id = db.IntegerProperty(required=True)
|
||||||
grade = db.IntegerProperty(required=True, default=0)
|
grade = db.IntegerProperty(required=True, default=0)
|
||||||
logo_url = db.StringProperty(required=False)
|
logo_url = db.StringProperty(required=False)
|
||||||
|
@ -14,7 +14,7 @@ class Project(db.Model):
|
||||||
|
|
||||||
def to_JSON(self):
|
def to_JSON(self):
|
||||||
data = {'projectName' : self.projectName,
|
data = {'projectName' : self.projectName,
|
||||||
'courseName' : self.courseName,
|
'courseId' : self.courseId,
|
||||||
'master_id' : self.master_id,
|
'master_id' : self.master_id,
|
||||||
'grade' : self.grade,
|
'grade' : self.grade,
|
||||||
'logo_url' : self.logo_url,
|
'logo_url' : self.logo_url,
|
||||||
|
|
|
@ -6,14 +6,14 @@ from google.appengine.ext import db
|
||||||
|
|
||||||
class Task(db.Model):
|
class Task(db.Model):
|
||||||
title = db.StringProperty(required=True)
|
title = db.StringProperty(required=True)
|
||||||
courseName = db.StringProperty(required=True)
|
courseId = db.IntegerProperty(required=True)
|
||||||
description = db.StringProperty(required=True,default=" ")
|
description = db.StringProperty(required=True,default=" ")
|
||||||
dueDate = db.DateProperty(required=True)
|
dueDate = db.DateProperty(required=True)
|
||||||
isPersonal = db.BooleanProperty(required=True, default=True)
|
isPersonal = db.BooleanProperty(required=True, default=True)
|
||||||
|
|
||||||
def to_JSON(self):
|
def to_JSON(self):
|
||||||
data = {'title' : self.title,
|
data = {'title' : self.title,
|
||||||
'courseName' : self.courseName,
|
'courseId' : self.courseId,
|
||||||
'description' : self.description,
|
'description' : self.description,
|
||||||
'dueDate' : {
|
'dueDate' : {
|
||||||
'year': self.dueDate.year,
|
'year': self.dueDate.year,
|
||||||
|
|
|
@ -12,9 +12,9 @@ class User(db.Model):
|
||||||
seToken = db.StringProperty(required=True)
|
seToken = db.StringProperty(required=True)
|
||||||
avatar_url = db.StringProperty(required=True)
|
avatar_url = db.StringProperty(required=True)
|
||||||
isFirstLogin = db.BooleanProperty(default=True)
|
isFirstLogin = db.BooleanProperty(default=True)
|
||||||
campusName = db.StringProperty(required=True, default=" ")
|
|
||||||
campuses_id_list = db.StringListProperty(default=[])
|
campuses_id_list = db.StringListProperty(default=[])
|
||||||
courses_id_list = db.StringListProperty(default=[])
|
courses_id_list = db.StringListProperty(default=[])
|
||||||
|
projects_id_list = db.StringListProperty(default=[])
|
||||||
|
|
||||||
def to_JSON(self):
|
def to_JSON(self):
|
||||||
data = {'username' : self.username,
|
data = {'username' : self.username,
|
||||||
|
@ -23,8 +23,9 @@ class User(db.Model):
|
||||||
'isLecturer' : self.isLecturer,
|
'isLecturer' : self.isLecturer,
|
||||||
'avatar_url' : self.avatar_url,
|
'avatar_url' : self.avatar_url,
|
||||||
'isFirstLogin' : self.isFirstLogin,
|
'isFirstLogin' : self.isFirstLogin,
|
||||||
'campusName': self.campusName,
|
|
||||||
'campuses_id_list': self.campuses_id_list,
|
'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)
|
return json.dumps(data)
|
||||||
|
|
|
@ -54,18 +54,20 @@
|
||||||
SE-Hub Docs Index
|
SE-Hub Docs Index
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
|
<center>
|
||||||
<div>
|
<div style="width: 40%">
|
||||||
<ul class="collection">
|
<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>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>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>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>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>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>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>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
</center>
|
||||||
<footer class="page-footer">
|
<footer class="page-footer">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
|
|
@ -151,6 +151,38 @@ body.noscroll
|
||||||
/*width: 100%;*/
|
/*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
|
/*.feedMessages
|
||||||
{
|
{
|
||||||
overflow: scroll;
|
overflow: scroll;
|
||||||
|
@ -197,6 +229,18 @@ body.noscroll
|
||||||
border-radius: 1px black solid;
|
border-radius: 1px black solid;
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
|
.allCampusesShow
|
||||||
|
{
|
||||||
|
overflow:hidden;
|
||||||
|
background-size: auto;
|
||||||
|
|
||||||
|
}
|
||||||
|
.campusCard
|
||||||
|
{
|
||||||
|
/*height:80%;*/
|
||||||
|
/*width:80%;*/
|
||||||
|
}
|
||||||
|
|
||||||
.gray-font
|
.gray-font
|
||||||
{
|
{
|
||||||
color: #7f7f7f;
|
color: #7f7f7f;
|
||||||
|
@ -397,6 +441,11 @@ body.noscroll
|
||||||
border-color: solid red;
|
border-color: solid red;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.cardAllCampuses
|
||||||
|
{
|
||||||
|
word-break: break-word;
|
||||||
|
}
|
||||||
|
|
||||||
.addMessage
|
.addMessage
|
||||||
{
|
{
|
||||||
font-size: 2em;
|
font-size: 2em;
|
||||||
|
|
|
@ -38,15 +38,15 @@ app.config(['$routeProvider', '$locationProvider',
|
||||||
templateUrl: 'templates/views/home.html',
|
templateUrl: 'templates/views/home.html',
|
||||||
controller: 'homeController'
|
controller: 'homeController'
|
||||||
})
|
})
|
||||||
.when('/Settings', {
|
.when('/profile/:id', {
|
||||||
templateUrl: 'templates/views/settings.html',
|
templateUrl: 'templates/views/profile.html',
|
||||||
controller: 'settingsController'
|
controller: 'profileController'
|
||||||
})
|
})
|
||||||
.when('/tasks', {
|
.when('/tasks', {
|
||||||
templateUrl: 'templates/views/tasks.html',
|
templateUrl: 'templates/views/tasks.html',
|
||||||
controller: 'tasksController'
|
controller: 'tasksController'
|
||||||
})
|
})
|
||||||
.when('/myClasses', {
|
.when('/myClasses/:campusId', {
|
||||||
templateUrl: 'templates/views/myClasses.html',
|
templateUrl: 'templates/views/myClasses.html',
|
||||||
controller: 'myClassesController'
|
controller: 'myClassesController'
|
||||||
})
|
})
|
||||||
|
@ -54,13 +54,21 @@ app.config(['$routeProvider', '$locationProvider',
|
||||||
templateUrl: 'templates/views/newTask.html',
|
templateUrl: 'templates/views/newTask.html',
|
||||||
controller: 'newTasksController'
|
controller: 'newTasksController'
|
||||||
})
|
})
|
||||||
.when('/projects', {
|
.when('/projects/:classId', {
|
||||||
templateUrl: 'templates/views/projects.html',
|
templateUrl: 'templates/views/projects.html',
|
||||||
controller: 'projectsController'
|
controller: 'projectsController'
|
||||||
})
|
})
|
||||||
.when('/newCourse', {
|
.when('/newCourse', {
|
||||||
templateUrl: 'templates/views/newCourse.html',
|
templateUrl: 'templates/views/newCourse.html',
|
||||||
controller: 'newCourseController'
|
controller: 'newCourseController'
|
||||||
|
})
|
||||||
|
.when('/campuses', {
|
||||||
|
templateUrl: 'templates/views/campuses.html',
|
||||||
|
controller: 'campusesController'
|
||||||
|
})
|
||||||
|
.when('/myProjects', {
|
||||||
|
templateUrl: 'templates/views/myProjects.html',
|
||||||
|
controller: 'myProjectsController'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
]);
|
]);
|
||||||
|
|
57
templates/js/controllers/campusesController.js
Normal file
57
templates/js/controllers/campusesController.js
Normal 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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}]);
|
|
@ -13,7 +13,6 @@ angular.module('SeHub')
|
||||||
|
|
||||||
var imagePath = $scope.user.avatar_url;
|
var imagePath = $scope.user.avatar_url;
|
||||||
//var campusName = '';
|
//var campusName = '';
|
||||||
$scope.course = '';
|
|
||||||
// $scope.campusName = '';
|
// $scope.campusName = '';
|
||||||
|
|
||||||
$scope.phones = [
|
$scope.phones = [
|
||||||
|
@ -35,13 +34,13 @@ angular.module('SeHub')
|
||||||
console.log("Student Mode!");
|
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;
|
// $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
|
$scope.postMessageClicked = function() // Posting the message itself
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
if($scope.msg.msgToAdd != null)
|
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);
|
console.log($scope.msg.msgToAdd);
|
||||||
$scope.messages.push({"text": $scope.msg.msgToAdd});
|
$scope.messages.push({"text": $scope.msg.msgToAdd});
|
||||||
}
|
}
|
||||||
|
@ -74,8 +95,6 @@ angular.module('SeHub')
|
||||||
console.log("choose project Clicked!!");
|
console.log("choose project Clicked!!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// animation
|
// animation
|
||||||
$scope.isEnterd = top.setIsEnterd;
|
$scope.isEnterd = top.setIsEnterd;
|
||||||
}]);
|
}]);
|
|
@ -1,5 +1,7 @@
|
||||||
angular.module('SeHub')
|
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) {
|
function($scope, $rootScope, dataService, apiService, $cookies, $cookieStore, $location, $window) {
|
||||||
top.setIsEnterd = true;
|
top.setIsEnterd = true;
|
||||||
|
@ -14,6 +16,39 @@ angular.module('SeHub')
|
||||||
}
|
}
|
||||||
$scope.loadingData = false;
|
$scope.loadingData = false;
|
||||||
$scope.user = data;
|
$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)
|
dataService.initService($scope); //Start Data Sync Service (For User)
|
||||||
console.log(data);
|
console.log(data);
|
||||||
if ($scope.user.isFirstLogin) {
|
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) {
|
$scope.menuClicked = function(item) {
|
||||||
var route = ""
|
var route = ""
|
||||||
if (item.title == "Log Out") {
|
if (item.title == "Log Out") {
|
||||||
|
|
|
@ -1,13 +1,141 @@
|
||||||
angular.module('SeHub')
|
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.isStudent = false;
|
||||||
$scope.isCourse = false;
|
$scope.isCourse = false;
|
||||||
$scope.isNewCourse = false;
|
$scope.isNewCourse = false;
|
||||||
$scope.newClassName = false;
|
$scope.newClassName = false;
|
||||||
$scope.user.createNewCourse = '';
|
$scope.course = {};
|
||||||
|
var token = $cookies['com.sehub.www'];
|
||||||
$scope.user.finalDate = '';
|
$scope.user.finalDate = '';
|
||||||
|
$scope.user.startDate = '';
|
||||||
$scope.showMyClass = false;
|
$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)
|
if($scope.user.isLecturer)
|
||||||
{
|
{
|
||||||
|
@ -20,42 +148,7 @@ angular.module('SeHub')
|
||||||
console.log("Student Mode!");
|
console.log("Student Mode!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
displayCourses(); // Will display the courses that the user related to // TODO!!
|
||||||
$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());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
66
templates/js/controllers/myProjectsController.js
Normal file
66
templates/js/controllers/myProjectsController.js
Normal 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
|
||||||
|
|
||||||
|
}]);
|
|
@ -1,10 +1,9 @@
|
||||||
angular.module('SeHub')
|
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()
|
$scope.goBack = function()
|
||||||
{
|
{
|
||||||
$window.location.href = 'templates/views/myClasses.html';
|
$location.path('/myClasses');
|
||||||
}
|
}
|
||||||
|
|
||||||
}]);
|
}]);
|
|
@ -1,6 +1,8 @@
|
||||||
angular.module('SeHub').controller('newTasksController', ['$scope',
|
angular.module('SeHub').controller('newTasksController', ['$scope',
|
||||||
function($scope) {
|
function($scope) {
|
||||||
|
|
||||||
|
$scope.newComp = {};
|
||||||
|
$scope.newComp.isMandatory = false;
|
||||||
|
|
||||||
|
|
||||||
$scope.componentTypes = [{
|
$scope.componentTypes = [{
|
||||||
|
@ -9,6 +11,10 @@ angular.module('SeHub').controller('newTasksController', ['$scope',
|
||||||
"type": "textarea"
|
"type": "textarea"
|
||||||
}, {
|
}, {
|
||||||
"type": "checkbox"
|
"type": "checkbox"
|
||||||
|
}, {
|
||||||
|
"type": "link"
|
||||||
|
}, {
|
||||||
|
"type": "radiobuttons"
|
||||||
}];
|
}];
|
||||||
|
|
||||||
$scope.task = {};
|
$scope.task = {};
|
||||||
|
@ -19,8 +25,58 @@ angular.module('SeHub').controller('newTasksController', ['$scope',
|
||||||
// $scope.task = [];
|
// $scope.task = [];
|
||||||
|
|
||||||
$scope.addComponent = function() {
|
$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 = {};
|
||||||
|
$scope.newComp.isMandatory = false;
|
||||||
|
$scope.compDetails = [];
|
||||||
|
$scope.isRadioButton = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$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() {
|
$scope.dueTime = function() {
|
||||||
|
@ -29,5 +85,31 @@ angular.module('SeHub').controller('newTasksController', ['$scope',
|
||||||
var d = new Date($scope.task.date);
|
var d = new Date($scope.task.date);
|
||||||
$scope.dueTimeFromNow = moment(d).fromNow();
|
$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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
]);
|
]);
|
102
templates/js/controllers/profileController.js
Normal file
102
templates/js/controllers/profileController.js
Normal 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*/;
|
||||||
|
|
||||||
|
}
|
||||||
|
]);
|
|
@ -1,15 +1,120 @@
|
||||||
angular.module('SeHub')
|
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()
|
$scope.createProjectClicked = function()
|
||||||
{
|
{
|
||||||
console.log("project created! not rly!! ");
|
console.log("project created! not rly!! " + classId);
|
||||||
// $window.location.href = 'http://localhost:8080/home#/tasks/new'; // Reference to 'newTask' page
|
|
||||||
|
|
||||||
|
// $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
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,10 @@
|
||||||
angular.module('SeHub')
|
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.userHasNoName = false;
|
||||||
$scope.campusChecked = false;
|
$scope.campusChecked = false;
|
||||||
$scope.createCampusClicked = false;
|
$scope.createCampusClicked = false;
|
||||||
$scope.isEmpty = true; // if the academic email line is empty
|
$scope.isEmpty = true; // if the academic email line is empty
|
||||||
$scope.jsonCreateCampus =
|
$scope.jsonCreateCampus = {
|
||||||
{
|
|
||||||
"title": "Create Campus",
|
"title": "Create Campus",
|
||||||
"email": "email_ending",
|
"email": "email_ending",
|
||||||
"avatar": "self.avatar.url"
|
"avatar": "self.avatar.url"
|
||||||
|
@ -23,24 +21,21 @@ angular.module('SeHub')
|
||||||
console.error("No User Found!");
|
console.error("No User Found!");
|
||||||
console.log(data);
|
console.log(data);
|
||||||
|
|
||||||
if($scope.user.name === ";")
|
if ($scope.user.name === ";") {
|
||||||
{
|
|
||||||
$scope.user.name = "";
|
$scope.user.name = "";
|
||||||
$scope.user.name = $scope.user.username;
|
$scope.user.name = $scope.user.username;
|
||||||
$scope.userHasNoName = true;
|
$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;
|
$scope.campuses = data;
|
||||||
}).error(function()
|
}).error(function() {
|
||||||
{
|
|
||||||
// TODO
|
// TODO
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
$scope.dropdownClicked = function()
|
$scope.dropdownClicked = function() {
|
||||||
{
|
|
||||||
if ($scope.campus) {
|
if ($scope.campus) {
|
||||||
$scope.campusChecked = true;
|
$scope.campusChecked = true;
|
||||||
$scope.campusObj = null;
|
$scope.campusObj = null;
|
||||||
|
@ -54,66 +49,58 @@ angular.module('SeHub')
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.submitClicked = function(ev)
|
$scope.submitClicked = function(ev) {
|
||||||
{
|
|
||||||
var emailValid = false;
|
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
|
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
|
// TODO Error
|
||||||
console.log("Error occured on updateUser");
|
console.log("Error occured on updateUser");
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log("Mail: " + fullMail);
|
console.log("Mail: " + fullMail);
|
||||||
|
|
||||||
apiService.sendValidationMail($scope.user.seToken, fullMail).success(function(data)
|
apiService.sendValidationMail(token, fullMail).success(function(data) {
|
||||||
{
|
|
||||||
console.log("DONE - 200");
|
console.log("DONE - 200");
|
||||||
$mdDialog.show($mdDialog.alert().title('E-mail Verification').content('A verification e-mail has been sent to your email address.')
|
$mdDialog
|
||||||
.ariaLabel('Email verification alert dialog').ok('Got it!').targetEvent(ev)); // Pop-up alert for e-mail verification
|
.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'
|
// TODO ADD- delete cookies and redirect only after pressed 'Got it'
|
||||||
$cookieStore.remove("com.sehub.www"); // Removing the cookies
|
$cookieStore.remove("com.sehub.www"); // Removing the cookies
|
||||||
$window.location.href = 'http://se-hub.appspot.com'; // Reference to 'welcome' page
|
$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.')
|
$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));
|
.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.')
|
$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));
|
.ariaLabel('Email verification error alert dialog').ok('Got it!').targetEvent(ev));
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.createCampus = function(ev)
|
$scope.createCampus = function(ev) {
|
||||||
{
|
$scope.createCampusClicked = !$scope.createCampusClicked;
|
||||||
$scope.createCampusClicked = true;
|
|
||||||
|
|
||||||
if (!$scope.isLecturer) // "!isLecturer" Means => I Am Lecturer; if i am a lecturer (when pressing -> getting last data value before pressing)
|
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.user.campusMail != null) {
|
||||||
{
|
|
||||||
validateEmail($scope.user.campusMail); // Verify the email according to "xxx@name.suffix"
|
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;
|
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
|
if (!result.test(email)) // TODO Fix when success to show mdDialog until 'Got it' clicked
|
||||||
{
|
{
|
||||||
|
@ -123,16 +110,14 @@ angular.module('SeHub')
|
||||||
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");
|
console.log("Im good");
|
||||||
apiService.sendValidationMail($scope.user.seToken, email).success(function(data)
|
apiService.sendValidationMail(token, email).success(function(data) {
|
||||||
{
|
|
||||||
console.log("DONE - 200");
|
console.log("DONE - 200");
|
||||||
$mdDialog.show($mdDialog.alert().title('E-mail Verification').content('A verification e-mail has been sent to your email address.')
|
$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
|
.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'
|
// TODO ADD delete cookies and redirect only after pressed 'Got it'
|
||||||
$cookieStore.remove("com.sehub.www"); // Removing the cookies
|
$cookieStore.remove("com.sehub.www"); // Removing the cookies
|
||||||
$window.location.href = 'http://se-hub.appspot.com'; // Reference to 'welcome' page
|
$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.')
|
$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));
|
.ariaLabel('Email verification error alert dialog').ok('Got it!').targetEvent(email));
|
||||||
});
|
});
|
||||||
|
|
|
@ -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]
|
|
||||||
];
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
]);
|
|
|
@ -7,8 +7,7 @@ angular.module('SeHub')
|
||||||
{
|
{
|
||||||
var taskName = name;
|
var taskName = name;
|
||||||
console.log("task created! " + taskName);
|
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
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
var url = (DEBUG ? "http://localhost:8080" : "http://se-hub.appspot.com") + "/api/users/updateUser/" + token;
|
||||||
|
|
||||||
req = {
|
req = {
|
||||||
method: "POST",
|
method: "PUT",
|
||||||
url: url,
|
url: url,
|
||||||
data: payLoad
|
data: payLoad
|
||||||
};
|
};
|
||||||
return $http(req);
|
return $http(req);
|
||||||
},
|
},
|
||||||
getCourseByCampusName: function(token){
|
getAllCoursesByCampus: function(token, campusId){
|
||||||
var url = (DEBUG ? "http://localhost:8080" : "http://se-hub.appspot.com") + "/api/courses/getAll/" + token;
|
var url = (DEBUG ? "http://localhost:8080" : "http://se-hub.appspot.com") + "/api/courses/getAllCoursesByCampus/" + token + '/' + campusId;
|
||||||
req = {
|
req = {
|
||||||
method : "GET",
|
method : "GET",
|
||||||
url : url,
|
url : url
|
||||||
data: token
|
|
||||||
|
|
||||||
};
|
};
|
||||||
return $http(req);
|
return $http(req);
|
||||||
|
@ -71,14 +70,121 @@ service.factory('apiService', ['$http', function($http) {
|
||||||
};
|
};
|
||||||
return $http(req);
|
return $http(req);
|
||||||
},
|
},
|
||||||
getCourseMessages: function(token, courseName){
|
createMessage: function(token, payLoad){
|
||||||
var url = (DEBUG ? "http://localhost:8080" : "http://se-hub.appspot.com") + "/api/courses/getCourseMessages/" + token + '/' + courseName;
|
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 = {
|
req = {
|
||||||
method : "GET",
|
method : "GET",
|
||||||
url : url
|
url : url
|
||||||
|
|
||||||
};
|
};
|
||||||
return $http(req);
|
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);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}]);
|
}]);
|
41
templates/views/campuses.html
Normal file
41
templates/views/campuses.html
Normal 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>
|
|
@ -99,71 +99,16 @@
|
||||||
<md-button ng-click="clearAllClicked()" ng class="md-raised md-primary">Clear All</md-button>
|
<md-button ng-click="clearAllClicked()" ng class="md-raised md-primary">Clear All</md-button>
|
||||||
</div>
|
</div>
|
||||||
<div class="port_spacer"></div>
|
<div class="port_spacer"></div>
|
||||||
|
<div layout-padding layout = "row">
|
||||||
|
<div flex = "60">
|
||||||
<md-input-container>
|
<md-input-container>
|
||||||
<label> Write Your Desired Message Here And Press Post</label>
|
<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>
|
</md-input-container>
|
||||||
</div>
|
</div>
|
||||||
</md-content>
|
<div flex = "30">
|
||||||
|
<md-select placeholder="Choose Course" ng-model="course" ng-click="chooseCourseClicked()" style="z-index: 300" class="courseDropDown"></md-select>
|
||||||
<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>
|
</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>
|
||||||
</div>
|
</div>
|
||||||
</md-content>
|
</md-content>
|
||||||
|
|
|
@ -109,13 +109,15 @@
|
||||||
<!-- Controllers -->
|
<!-- Controllers -->
|
||||||
<script src="templates/js/controllers/mainController.js"></script>
|
<script src="templates/js/controllers/mainController.js"></script>
|
||||||
<script src="templates/js/controllers/homeController.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/registerController.js"></script>
|
||||||
<script src="templates/js/controllers/tasksController.js"></script>
|
<script src="templates/js/controllers/tasksController.js"></script>
|
||||||
<script src="templates/js/controllers/myClassesController.js"></script>
|
<script src="templates/js/controllers/myClassesController.js"></script>
|
||||||
<script src="templates/js/controllers/newTasksController.js"></script>
|
<script src="templates/js/controllers/newTasksController.js"></script>
|
||||||
<script src="templates/js/controllers/projectsController.js"></script>
|
<script src="templates/js/controllers/projectsController.js"></script>
|
||||||
<script src="templates/js/controllers/newCourseController.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>
|
</body>
|
||||||
</html>
|
</html>
|
|
@ -2,150 +2,92 @@
|
||||||
<md-content layout-padding layout-margin>
|
<md-content layout-padding layout-margin>
|
||||||
<h1 layout-margin style="margin-left:15px"><i class="fa fa-graduation-cap"></i> My Classes</h1>
|
<h1 layout-margin style="margin-left:15px"><i class="fa fa-graduation-cap"></i> My Classes</h1>
|
||||||
</md-content>
|
</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 ng-if="user.isLecturer"> <!-- Lecturer Mode -->
|
||||||
<div layout="row">
|
<div layout="row">
|
||||||
<div layout-margin layout-padding>
|
<div layout-margin layout-padding>
|
||||||
<md-button ng-click="createCourseClicked()" ng class="md-raised md-primary">Create Class</md-button>
|
<md-button ng-click="createCourseClicked()" ng class="md-raised md-primary">Create Class</md-button>
|
||||||
</div>
|
</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>
|
||||||
<div ng-if="isNewCourse">
|
<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>
|
<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">
|
<div layout layout-sm="column">
|
||||||
<md-input-container style="width:80%">
|
<md-input-container style="width:80%">
|
||||||
<label>Class Name</label>
|
<label flex = "50">Class Name</label>
|
||||||
<input ng-model="user.createNewCourse" min-length="1" required>
|
<input ng-model="course.courseName" min-length="1" required>
|
||||||
</md-input-container>
|
</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>
|
<label>Course Finish Date</label>
|
||||||
<input type="date" ng-model="user.finalDate" required>
|
<input type="date" ng-model="course.endDate" required>
|
||||||
</md-input-container>
|
</md-input-container>
|
||||||
</div>
|
</div>
|
||||||
<div layout layout-sm="column">
|
</md-card>
|
||||||
<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>
|
|
||||||
<div layout-padding layout-margin>
|
<div layout-padding layout-margin>
|
||||||
<md-button ng-click="submitNewClassClicked()" class="md-raised md-primary">Submit New Class</md-button>
|
<md-button ng-click="submitNewClassClicked()" class="md-raised md-primary">Submit New Class</md-button>
|
||||||
</div>
|
</div>
|
||||||
</md-content>
|
</md-content>
|
||||||
</div>
|
</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-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-option ng-repeat="c in courses" value="{{c.course}}">{{c.course}}</md-option>
|
||||||
</md-select>
|
</md-select>
|
||||||
</div>
|
</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 -->
|
<div ng-if="isStudent"> <!-- Student Mode -->
|
||||||
|
|
117
templates/views/myProjects.html
Normal file
117
templates/views/myProjects.html
Normal 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> -->
|
|
@ -1,6 +1,6 @@
|
||||||
<div class = "newCourse">
|
<div class = "newCourse">
|
||||||
<md-content layout-padding layout-margin>
|
<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-button ng-click="goBack()" class="md-raised md-primary">Go Back</md-button>
|
||||||
</md-content>
|
</md-content>
|
||||||
</div>
|
</div>
|
|
@ -1,6 +1,7 @@
|
||||||
<div layout-padding>
|
<div layout-padding>
|
||||||
<div layout="row">
|
<div layout="row">
|
||||||
<div flex="20" layout-padding>
|
<div flex="40" layout-padding>
|
||||||
|
<md-card layout-padding>
|
||||||
<h2>
|
<h2>
|
||||||
<i class="fa fa-info-circle"></i> Task Info:
|
<i class="fa fa-info-circle"></i> Task Info:
|
||||||
</h2>
|
</h2>
|
||||||
|
@ -15,6 +16,7 @@
|
||||||
<md-input-container>
|
<md-input-container>
|
||||||
<label>Description</label>
|
<label>Description</label>
|
||||||
<textarea ng-model="task.task.description" required></textarea>
|
<textarea ng-model="task.task.description" required></textarea>
|
||||||
|
</md-input-container>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<md-switch ng-model="task.isPersonal" aria-label="Switch 1">
|
<md-switch ng-model="task.isPersonal" aria-label="Switch 1">
|
||||||
|
@ -34,10 +36,9 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</md-card>
|
||||||
|
<div layout="column">
|
||||||
<div layout="column" flex="30" layout-padding>
|
<md-card layout-padding>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<h2>
|
<h2>
|
||||||
<i class="fa fa-cubes"></i> Add A component:
|
<i class="fa fa-cubes"></i> Add A component:
|
||||||
|
@ -45,16 +46,21 @@
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
Select Type:
|
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-option ng-repeat="component in componentTypes" value="{{component.type}}">{{component.type}}</md-option>
|
||||||
</md-select>
|
</md-select>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<md-input-container>
|
<md-input-container ng-repeat="detail in compDetails">
|
||||||
<label>Label</label>
|
<label>{{detail.detail}}</label>
|
||||||
<input ng-model="newComp.label" required>
|
<input ng-model="newComp.label[$index]" required>
|
||||||
</md-input-container>
|
</md-input-container>
|
||||||
</div>
|
</div>
|
||||||
|
<div ng-if="isRadioButton">
|
||||||
|
<md-button ng-click="addMoreOptions()" >
|
||||||
|
Add An Option
|
||||||
|
</md-button>
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<md-switch ng-model="newComp.isMandatory" aria-label="Switch 1">
|
<md-switch ng-model="newComp.isMandatory" aria-label="Switch 1">
|
||||||
Mandatory?: {{ newComp.isMandatory}}
|
Mandatory?: {{ newComp.isMandatory}}
|
||||||
|
@ -64,9 +70,12 @@
|
||||||
<div flex="65"></div>
|
<div flex="65"></div>
|
||||||
<md-button class="md-raised" ng-click="addComponent()"><i class="fa fa-plus"></i> Add To Task</md-button>
|
<md-button class="md-raised" ng-click="addComponent()"><i class="fa fa-plus"></i> Add To Task</md-button>
|
||||||
</div>
|
</div>
|
||||||
|
</md-card>
|
||||||
|
</div>
|
||||||
</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 style="background-image: url('http://www.stationeryhq.com/content/images/thumbs/0000324_clipboard_500.png')">
|
||||||
|
|
||||||
</md-card> -->
|
</md-card> -->
|
||||||
|
@ -80,6 +89,9 @@
|
||||||
<p>{{ dueTimeFromNow }}</p>
|
<p>{{ dueTimeFromNow }}</p>
|
||||||
<p>{{task.task.description}}</p>
|
<p>{{task.task.description}}</p>
|
||||||
<p>{{(task.isPersonal) ? "Personal" : "Project"}} Task</p>
|
<p>{{(task.isPersonal) ? "Personal" : "Project"}} Task</p>
|
||||||
|
|
||||||
|
<md-divider ng-if="!$last"></md-divider>
|
||||||
|
|
||||||
<div ng-repeat="component in task.components">
|
<div ng-repeat="component in task.components">
|
||||||
<!-- if text box -->
|
<!-- if text box -->
|
||||||
<div ng-if="component.type == 'textbox'">
|
<div ng-if="component.type == 'textbox'">
|
||||||
|
@ -101,6 +113,20 @@
|
||||||
{{ component.label}}
|
{{ component.label}}
|
||||||
</md-checkbox>
|
</md-checkbox>
|
||||||
</div>
|
</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>
|
</div>
|
||||||
</md-card>
|
</md-card>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
<div>
|
<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>
|
<md-progress-circular md-mode="indeterminate"></md-progress-circular>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<md-content layout-padding>
|
<md-content layout-padding>
|
||||||
<md-card layout-padding>
|
<md-card layout-padding>
|
||||||
|
@ -15,7 +17,7 @@
|
||||||
<img ng-src="{{user.avatar_url}}" alt="" style="width:20%">
|
<img ng-src="{{user.avatar_url}}" alt="" style="width:20%">
|
||||||
</div>
|
</div>
|
||||||
<div flex="70%">
|
<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}}
|
<i ng-class="profileModeIcon"></i> {{profileMode}}
|
||||||
</md-button>
|
</md-button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -78,7 +80,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="spacer"></div>
|
<div class="spacer"></div>
|
||||||
<div>
|
<div>
|
||||||
<md-button class="">
|
<md-button class="" ng-if="isUser">
|
||||||
X
|
X
|
||||||
</md-button>
|
</md-button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -96,11 +98,11 @@
|
||||||
<img alt="{{ person.name }}" ng-src="{{ campus.avatar_url }}" class="md-avatar" />
|
<img alt="{{ person.name }}" ng-src="{{ campus.avatar_url }}" class="md-avatar" />
|
||||||
</div>
|
</div>
|
||||||
<div class="port_spacer">
|
<div class="port_spacer">
|
||||||
{{ campus.title }} -
|
<strong>{{ campus.title }}</strong> {{campus.email_ending}}
|
||||||
</div>
|
</div>
|
||||||
<div class="spacer"></div>
|
<div class="spacer"></div>
|
||||||
<div>
|
<div>
|
||||||
<md-button class="">
|
<md-button class="" ng-if="isUser">
|
||||||
X
|
X
|
||||||
</md-button>
|
</md-button>
|
||||||
</div>
|
</div>
|
|
@ -1,6 +1,23 @@
|
||||||
<div class = "projects">
|
<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>
|
<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-button ng-click="createProjectClicked()" ng class="md-raised md-primary">Create Project</md-button>
|
||||||
</md-content>
|
</md-content>
|
||||||
</div>
|
</div>
|
|
@ -1,6 +1,52 @@
|
||||||
<div class = "tasks">
|
<div class = "tasks">
|
||||||
<md-content layout-padding layout-margin>
|
<md-content layout-padding layout-margin>
|
||||||
<h1 style="margin-left:15px"><i class="fa fa-file-text-o"></i> Tasks</h1>
|
<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>
|
<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>
|
</md-content>
|
||||||
</div>
|
</div>
|
Loading…
Reference in a new issue