import web import models.project from views.utils import get_nav_bar, csrf_protected from views.forms import project_form import os from time import sleep # Get html templates render = web.template.render('templates/') class Project: def GET(self): """ Show info about a single project :return: Project info page """ # Get session session = web.ctx.session # Get navbar nav = get_nav_bar(session) data = web.input(projectid=0) try: permissions = models.project.get_user_permissions(str(session.userid), data.projectid) except: permissions = [0, 0, 0] categories = models.project.get_categories() if data.projectid: project = models.project.get_project_by_id(data.projectid) tasks = models.project.get_tasks_by_project_id(data.projectid) else: project = [[]] tasks = [[]] render = web.template.render('templates/', globals={'get_task_files':models.project.get_task_files, 'session':session}) return render.project(nav, project_form, project, tasks,permissions, categories) @csrf_protected def POST(self): # Get session session = web.ctx.session data = web.input(myfile={}, deliver=None, accepted=None, declined=None, projectid=0) fileitem = data['myfile'] read_permission, write_permission, modify_permission = models.project.get_user_permissions(str(session.userid), data.projectid) categories = models.project.get_categories() tasks = models.project.get_tasks_by_project_id(data.projectid) is_owner = models.project.is_owner(session.userid, data.projectid) # Upload file (if present) try: if fileitem.filename: # Check if user has write permission if not write_permission: raise web.seeother(('/project?projectid=' + data.projectid)) fn = fileitem.filename # Create the project directory if it doesnt exist path = 'static/project' + data.projectid if not os.path.isdir(path): command = 'mkdir ' + path os.popen(command) sleep(0.2) path = path + '/task' + data.taskid if not os.path.isdir(path): command = 'mkdir ' + path os.popen(command) sleep(0.2) open(path + '/' + fn, 'wb').write(fileitem.file.read()) models.project.set_task_file(data.taskid, (path + "/" + fn)) except: # Throws exception if no file present pass # Determine status of the targeted task all_tasks_accepted = True task_waiting = False task_delivered = False for task in tasks: if task[0] == int(data.taskid): if(task[5] == "waiting for delivery" or task[5] == "declined"): task_waiting = True if(task[5] == 'accepted'): task_delivered = True # Deliver task if data.deliver and not task_delivered and modify_permission: models.project.update_task_status(data.taskid, "delivered") # Accept task delivery elif data.accepted and is_owner: models.project.update_task_status(data.taskid, "accepted") # If all tasks are accepted then update project status to finished all_tasks_accepted = True tasks = models.project.get_tasks_by_project_id(data.projectid) for task in tasks: if task[5] != "accepted": all_tasks_accepted = False if all_tasks_accepted: models.project.update_project_status(str(data.projectid), "finished") # Decline task delivery elif data.declined and is_owner: models.project.update_task_status(data.taskid, "declined") raise web.seeother(('/project?projectid=' + data.projectid))