import web from views.forms import get_task_form_elements, get_new_project_form, get_project_form_elements, get_user_form_elements, project_buttons import models.project import models.login from views.utils import get_nav_bar # Get html templates render = web.template.render('templates/') class New_project: def GET(self): """ Get the project registration form :return: New project page """ session = web.ctx.session nav = get_nav_bar(session) project_form_elements = get_project_form_elements() task_form_elements = get_task_form_elements() user_form_elements = get_user_form_elements() project_form = get_new_project_form((project_form_elements + task_form_elements + user_form_elements)) return render.new_project(nav, project_form, project_buttons, "") def POST(self): """ Create a new project :return: Redirect to main page """ session = web.ctx.session nav = get_nav_bar(session) # Try the different URL input parameters to determine how to generate the form data = web.input(add_user=None, remove_user=None, add_task=None, remove_task = None, create_project=None) # Add a set of task fields to the form if data.add_task: project_form = self.compose_form(data, "add_task") return render.new_project(nav, project_form, project_buttons, "") # Remove a set of task fields from the form if data.remove_task: project_form = self.compose_form(data, "remove_task") return render.new_project(nav, project_form, project_buttons, "") if data.add_user: project_form = self.compose_form(data, "add_user") return render.new_project(nav, project_form, project_buttons, "") if data.remove_user: project_form = self.compose_form(data, "remove_user") return render.new_project(nav, project_form, project_buttons, "") # Post the form data and save the project in the database if data.create_project: project_form = self.compose_form(data, None) if not project_form.validates(): return render.new_project(nav, project_form, project_buttons, "") task_count = get_task_count(data) user_count = get_user_count(data) # If there already are users assignet to the project the status will be set to in progress status = "open" if len(data.user_name_0): status = "in progress" # Validate the input user names for i in range(0, user_count): if len(data["user_name_"+str(i)]) and not models.login.get_user_id_by_name(data["user_name_"+str(i)]): return render.register(nav, project_form, project_buttons, "Invalid user: " + data["user_name_"+str(i)]) # Save the project to the database projectid = models.project.set_project(data.category_name, str(session.userid), data.project_title, data.project_description, status) # Save the tasks in the database for i in range(0, task_count): models.project.set_task(str(projectid), (data["task_title_" + str(i)]), (data["task_description_" + str(i)]), (data["budget_" + str(i)])) # Save the users in the database for i in range(0, user_count): if len(data["user_name_"+str(i)]): userid = models.login.get_user_id_by_name(data["user_name_"+str(i)]) 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: # This error will be raised if no permission is set modify = "FALSE" raise e models.project.set_projects_user(str(projectid), str(userid), read, write, modify) raise web.seeother('/?projects=my') def compose_form(self, data, operation): """ Compose a new project form by adding or removing a task :param data: The data object from web.input :param add: True or False :type add: boolean :return: A complete project form object """ task_count = get_task_count(data) user_count = get_user_count(data) print(user_count) if operation == "remove_task" and task_count > 1: task_count -= 1 if operation == "remove_user" and user_count >=1: user_count -= 1 project_form_elements = get_project_form_elements(data.project_title, data.project_description, data.category_name) task_form_elements = () user_form_elements = () for i in range(0, task_count): old_task_form_element = get_task_form_elements(i, data["task_title_"+str(i)], data["task_description_"+str(i)], data["budget_"+str(i)]) task_form_elements = (task_form_elements + old_task_form_element) for i in range(0, user_count): try: old_user_form_element = get_user_form_elements(i, data["user_name_"+str(i)], data["read_permission_"+str(i)], data["write_permission_"+str(i)], data["modify_permission_"+str(i)]) user_form_elements = (user_form_elements + old_user_form_element) except Exception as e: try: old_user_form_element = get_user_form_elements(i, data["user_name_"+str(i)], data["read_permission_"+str(i)], data["write_permission_"+str(i)]) user_form_elements = (user_form_elements + old_user_form_element) pass except Exception as e: try: old_user_form_element = get_user_form_elements(i, data["user_name_"+str(i)], data["read_permission_"+str(i)]) user_form_elements = (user_form_elements + old_user_form_element) pass except Exception as e: try: old_user_form_element = get_user_form_elements(i, data["user_name_"+str(i)]) user_form_elements = (user_form_elements + old_user_form_element) pass except Exception as e: raise e if operation == "add_task": new_task_form_elements = get_task_form_elements(task_count) project_form = get_new_project_form((project_form_elements + task_form_elements + new_task_form_elements + user_form_elements)) return project_form if operation == "add_user": new_user_form_elements = get_user_form_elements(user_count) project_form = get_new_project_form((project_form_elements + task_form_elements + user_form_elements + new_user_form_elements)) return project_form project_form = get_new_project_form((project_form_elements + task_form_elements + user_form_elements)) return project_form def get_task_count(data): """ Determine the number of tasks created by removing the four other elements from count and divide by the number of variables in one task. :param data: The data object from web.input :return: The number of tasks opened by the client """ task_count = 0 while True: try: data["task_title_"+str(task_count)] task_count += 1 except: break return task_count def get_user_count(data): user_count = 0 while True: try: data["user_name_"+str(user_count)] user_count += 1 except: break return user_count