import web import models.project from models.user import get_user_name_by_id from views.utils import get_nav_bar, get_element_count, csrf_protected from views.forms import get_apply_form, get_apply_permissions_form # Get html templates render = web.template.render('templates/') class Apply: def GET(self): """ Get the apply view where users can sign up for a project """ # Get session session = web.ctx.session # Get navbar nav = get_nav_bar(session) data = web.input(projectid=0) if data.projectid: project = models.project.get_project_by_id(data.projectid) else: project = [[]] tasks = [[]] # Assemble form and set the user in context as an applicant with all permissions apply_form = get_apply_form() apply_permissions_form = get_apply_permissions_form() applicants = [[session.userid, session.username]] permissions = [["TRUE", "TRUE", "TRUE"]] render = web.template.render('templates/', globals={"get_apply_permissions_form":get_apply_permissions_form, 'session':session}) return render.apply(nav, apply_form, get_apply_permissions_form, project, applicants, permissions) @csrf_protected def POST(self): """ Post an application to the view, adding selected users to a project """ data = web.input(projectid=0, add_user=None, remove_user=None, apply=None) session = web.ctx.session nav = get_nav_bar(session) # Assemble form applicants = [session.username] apply_form = get_apply_form() apply_permission_form = get_apply_permissions_form() # Prepare globals render = web.template.render('templates/', globals={"get_apply_permissions_form":get_apply_permissions_form, 'session':session}) if data.projectid: project = models.project.get_project_by_id(data.projectid) if data.add_user: applicants, permissions = self.get_applicants(data, "add_user") return render.apply(nav, apply_form, get_apply_permissions_form, project, applicants,permissions) elif data.remove_user: applicants, permissions = self.get_applicants(data, "remove_user") return render.apply(nav, apply_form, get_apply_permissions_form, project, applicants, permissions) # Set users as working on project and set project status in progress elif data.apply: applicants, permissions = self.get_applicants(data, "") for applicant, permission in zip(applicants, permissions): models.project.set_projects_user(data.projectid, str(applicant[0]), permission[0], permission[1], permission[2]) models.project.update_project_status(data.projectid, "in progress") raise web.seeother(('/project?projectid=' + str(data.projectid))) def get_applicants(self, data, operation): """ Get applicants and corresponding permissions from the input data with and operation :param data: Input data :param operation: Either empty, add_user or remove_user :type data: Storage :type operation: str """ user_count = get_element_count(data, "user_") applicants = [] permissions = [] # Create the lists of current applying users and their permissions for i in range (0, user_count): applicant = data["user_"+str(i)][1:][:-1].split(",") applicants.append([ int(applicant[0]), applicant[1][2:][:-1] ]) read, write, modify = "FALSE", "FALSE", "FALSE" try: data["read_permission_"+str(i)] read = "TRUE" except Exception as e: read = "FALSE" pass try: data["write_permission_"+str(i)] write = "TRUE" except Exception as e: write = "FALSE" pass try: data["modify_permission_"+str(i)] modify = "TRUE" except Exception as e: modify = "FALSE" pass permissions.append([read, write, modify]) if operation == "remove_user": user_to_remove = data.remove_user[1:][:-1].split(",") user_to_remove = [int(user_to_remove[0]), user_to_remove[1][2:][:-1]] for i in range (0, user_count): if user_to_remove == applicants[i]: applicants.pop(i) permissions.pop(i) break elif operation == "add_user": user_id_to_add = data.user_to_add user_name_to_add = get_user_name_by_id(user_id_to_add) new_applicant = [ int(user_id_to_add), user_name_to_add ] if new_applicant not in applicants: applicants.append(new_applicant) permissions.append(["TRUE", "FALSE", "FALSE"]) return applicants, permissions