You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

208 line
8.7KB

  1. import web
  2. from views.forms import get_task_form_elements, get_new_project_form, get_project_form_elements, get_user_form_elements, project_buttons
  3. import models.project
  4. import models.login
  5. from views.utils import get_nav_bar
  6. # Get html templates
  7. render = web.template.render('templates/')
  8. class New_project:
  9. def GET(self):
  10. """
  11. Get the project registration form
  12. :return: New project page
  13. """
  14. session = web.ctx.session
  15. nav = get_nav_bar(session)
  16. project_form_elements = get_project_form_elements()
  17. task_form_elements = get_task_form_elements()
  18. user_form_elements = get_user_form_elements()
  19. project_form = get_new_project_form((project_form_elements + task_form_elements + user_form_elements))
  20. return render.new_project(nav, project_form, project_buttons, "")
  21. def POST(self):
  22. """
  23. Create a new project
  24. :return: Redirect to main page
  25. """
  26. session = web.ctx.session
  27. nav = get_nav_bar(session)
  28. # Try the different URL input parameters to determine how to generate the form
  29. data = web.input(add_user=None, remove_user=None,
  30. add_task=None, remove_task = None, create_project=None)
  31. # Add a set of task fields to the form
  32. if data.add_task:
  33. project_form = self.compose_form(data, "add_task")
  34. return render.new_project(nav, project_form, project_buttons, "")
  35. # Remove a set of task fields from the form
  36. if data.remove_task:
  37. project_form = self.compose_form(data, "remove_task")
  38. return render.new_project(nav, project_form, project_buttons, "")
  39. if data.add_user:
  40. project_form = self.compose_form(data, "add_user")
  41. return render.new_project(nav, project_form, project_buttons, "")
  42. if data.remove_user:
  43. project_form = self.compose_form(data, "remove_user")
  44. return render.new_project(nav, project_form, project_buttons, "")
  45. # Post the form data and save the project in the database
  46. if data.create_project:
  47. project_form = self.compose_form(data, None)
  48. if not project_form.validates():
  49. return render.new_project(nav, project_form, project_buttons, "")
  50. task_count = get_task_count(data)
  51. user_count = get_user_count(data)
  52. # If there already are users assignet to the project the status will be set to in progress
  53. status = "open"
  54. if len(data.user_name_0):
  55. status = "in progress"
  56. # Validate the input user names
  57. for i in range(0, user_count):
  58. if len(data["user_name_"+str(i)]) and not models.login.get_user_id_by_name(data["user_name_"+str(i)]):
  59. return render.register(nav, project_form, project_buttons, "Invalid user: " + data["user_name_"+str(i)])
  60. # Save the project to the database
  61. projectid = models.project.set_project(data.category_name, str(session.userid),
  62. data.project_title, data.project_description, status)
  63. # Save the tasks in the database
  64. for i in range(0, task_count):
  65. models.project.set_task(str(projectid), (data["task_title_" + str(i)]),
  66. (data["task_description_" + str(i)]), (data["budget_" + str(i)]))
  67. # Save the users in the database
  68. for i in range(0, user_count):
  69. if len(data["user_name_"+str(i)]):
  70. userid = models.login.get_user_id_by_name(data["user_name_"+str(i)])
  71. read, write, modify = "FALSE", "FALSE", "FALSE"
  72. try:
  73. data["read_permission_"+str(i)]
  74. read = "TRUE"
  75. except Exception as e:
  76. read = "FALSE"
  77. pass
  78. try:
  79. data["write_permission_"+str(i)]
  80. write = "TRUE"
  81. except Exception as e:
  82. write = "FALSE"
  83. pass
  84. try:
  85. data["modify_permission_"+str(i)]
  86. modify = "TRUE"
  87. except Exception as e:
  88. # This error will be raised if no permission is set
  89. modify = "FALSE"
  90. raise e
  91. models.project.set_projects_user(str(projectid), str(userid), read, write, modify)
  92. raise web.seeother('/?projects=my')
  93. def compose_form(self, data, operation):
  94. """
  95. Compose a new project form by adding or removing a task
  96. :param data: The data object from web.input
  97. :param add: True or False
  98. :type add: boolean
  99. :return: A complete project form object
  100. """
  101. task_count = get_task_count(data)
  102. user_count = get_user_count(data)
  103. print(user_count)
  104. if operation == "remove_task" and task_count > 1:
  105. task_count -= 1
  106. if operation == "remove_user" and user_count >=1:
  107. user_count -= 1
  108. project_form_elements = get_project_form_elements(data.project_title, data.project_description, data.category_name)
  109. task_form_elements = ()
  110. user_form_elements = ()
  111. for i in range(0, task_count):
  112. old_task_form_element = get_task_form_elements(i, data["task_title_"+str(i)],
  113. data["task_description_"+str(i)], data["budget_"+str(i)])
  114. task_form_elements = (task_form_elements + old_task_form_element)
  115. for i in range(0, user_count):
  116. try:
  117. old_user_form_element = get_user_form_elements(i, data["user_name_"+str(i)],
  118. data["read_permission_"+str(i)], data["write_permission_"+str(i)], data["modify_permission_"+str(i)])
  119. user_form_elements = (user_form_elements + old_user_form_element)
  120. except Exception as e:
  121. try:
  122. old_user_form_element = get_user_form_elements(i, data["user_name_"+str(i)],
  123. data["read_permission_"+str(i)], data["write_permission_"+str(i)])
  124. user_form_elements = (user_form_elements + old_user_form_element)
  125. pass
  126. except Exception as e:
  127. try:
  128. old_user_form_element = get_user_form_elements(i, data["user_name_"+str(i)],
  129. data["read_permission_"+str(i)])
  130. user_form_elements = (user_form_elements + old_user_form_element)
  131. pass
  132. except Exception as e:
  133. try:
  134. old_user_form_element = get_user_form_elements(i, data["user_name_"+str(i)])
  135. user_form_elements = (user_form_elements + old_user_form_element)
  136. pass
  137. except Exception as e:
  138. raise e
  139. if operation == "add_task":
  140. new_task_form_elements = get_task_form_elements(task_count)
  141. project_form = get_new_project_form((project_form_elements + task_form_elements + new_task_form_elements + user_form_elements))
  142. return project_form
  143. if operation == "add_user":
  144. new_user_form_elements = get_user_form_elements(user_count)
  145. project_form = get_new_project_form((project_form_elements + task_form_elements + user_form_elements + new_user_form_elements))
  146. return project_form
  147. project_form = get_new_project_form((project_form_elements + task_form_elements + user_form_elements))
  148. return project_form
  149. def get_task_count(data):
  150. """
  151. Determine the number of tasks created by removing
  152. the four other elements from count and divide by the
  153. number of variables in one task.
  154. :param data: The data object from web.input
  155. :return: The number of tasks opened by the client
  156. """
  157. task_count = 0
  158. while True:
  159. try:
  160. data["task_title_"+str(task_count)]
  161. task_count += 1
  162. except:
  163. break
  164. return task_count
  165. def get_user_count(data):
  166. user_count = 0
  167. while True:
  168. try:
  169. data["user_name_"+str(user_count)]
  170. user_count += 1
  171. except:
  172. break
  173. return user_count