Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

114 рядки
4.1KB

  1. import web
  2. import models.project
  3. from views.utils import get_nav_bar, csrf_protected
  4. from views.forms import project_form
  5. import os
  6. from time import sleep
  7. # Get html templates
  8. render = web.template.render('templates/')
  9. class Project:
  10. def GET(self):
  11. """
  12. Show info about a single project
  13. :return: Project info page
  14. """
  15. # Get session
  16. session = web.ctx.session
  17. # Get navbar
  18. nav = get_nav_bar(session)
  19. data = web.input(projectid=0)
  20. try:
  21. permissions = models.project.get_user_permissions(str(session.userid), data.projectid)
  22. except:
  23. permissions = [0, 0, 0]
  24. categories = models.project.get_categories()
  25. if data.projectid:
  26. project = models.project.get_project_by_id(data.projectid)
  27. tasks = models.project.get_tasks_by_project_id(data.projectid)
  28. else:
  29. project = [[]]
  30. tasks = [[]]
  31. render = web.template.render('templates/', globals={'get_task_files':models.project.get_task_files, 'session':session})
  32. return render.project(nav, project_form, project, tasks,permissions, categories)
  33. @csrf_protected
  34. def POST(self):
  35. # Get session
  36. session = web.ctx.session
  37. data = web.input(myfile={}, deliver=None, accepted=None, declined=None, projectid=0)
  38. fileitem = data['myfile']
  39. read_permission, write_permission, modify_permission = models.project.get_user_permissions(str(session.userid), data.projectid)
  40. categories = models.project.get_categories()
  41. tasks = models.project.get_tasks_by_project_id(data.projectid)
  42. is_owner = models.project.is_owner(session.userid, data.projectid)
  43. # Upload file (if present)
  44. try:
  45. if fileitem.filename:
  46. # Check if user has write permission
  47. if not write_permission:
  48. raise web.seeother(('/project?projectid=' + data.projectid))
  49. fn = fileitem.filename
  50. # Create the project directory if it doesnt exist
  51. path = 'static/project' + data.projectid
  52. if not os.path.isdir(path):
  53. command = 'mkdir ' + path
  54. os.popen(command)
  55. sleep(0.2)
  56. path = path + '/task' + data.taskid
  57. if not os.path.isdir(path):
  58. command = 'mkdir ' + path
  59. os.popen(command)
  60. sleep(0.2)
  61. open(path + '/' + fn, 'wb').write(fileitem.file.read())
  62. models.project.set_task_file(data.taskid, (path + "/" + fn))
  63. except:
  64. # Throws exception if no file present
  65. pass
  66. # Determine status of the targeted task
  67. all_tasks_accepted = True
  68. task_waiting = False
  69. task_delivered = False
  70. for task in tasks:
  71. if task[0] == int(data.taskid):
  72. if(task[5] == "waiting for delivery" or task[5] == "declined"):
  73. task_waiting = True
  74. if(task[5] == 'accepted'):
  75. task_delivered = True
  76. # Deliver task
  77. if data.deliver and not task_delivered and modify_permission:
  78. models.project.update_task_status(data.taskid, "delivered")
  79. # Accept task delivery
  80. elif data.accepted and is_owner:
  81. models.project.update_task_status(data.taskid, "accepted")
  82. # If all tasks are accepted then update project status to finished
  83. all_tasks_accepted = True
  84. tasks = models.project.get_tasks_by_project_id(data.projectid)
  85. for task in tasks:
  86. if task[5] != "accepted":
  87. all_tasks_accepted = False
  88. if all_tasks_accepted:
  89. models.project.update_project_status(str(data.projectid), "finished")
  90. # Decline task delivery
  91. elif data.declined and is_owner:
  92. models.project.update_task_status(data.taskid, "declined")
  93. raise web.seeother(('/project?projectid=' + data.projectid))