25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
3.9KB

  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. os.mkdir(path)
  54. path = path + '/task' + data.taskid
  55. if not os.path.isdir(path):
  56. os.mkdir(path)
  57. open(path + '/' + fn, 'wb').write(fileitem.file.read())
  58. models.project.set_task_file(data.taskid, (path + "/" + fn))
  59. except:
  60. # Throws exception if no file present
  61. pass
  62. # Determine status of the targeted task
  63. all_tasks_accepted = True
  64. task_waiting = False
  65. task_delivered = False
  66. for task in tasks:
  67. if task[0] == int(data.taskid):
  68. if(task[5] == "waiting for delivery" or task[5] == "declined"):
  69. task_waiting = True
  70. if(task[5] == 'accepted'):
  71. task_delivered = True
  72. # Deliver task
  73. if data.deliver and not task_delivered and modify_permission:
  74. models.project.update_task_status(data.taskid, "delivered")
  75. # Accept task delivery
  76. elif data.accepted and is_owner:
  77. models.project.update_task_status(data.taskid, "accepted")
  78. # If all tasks are accepted then update project status to finished
  79. all_tasks_accepted = True
  80. tasks = models.project.get_tasks_by_project_id(data.projectid)
  81. for task in tasks:
  82. if task[5] != "accepted":
  83. all_tasks_accepted = False
  84. if all_tasks_accepted:
  85. models.project.update_project_status(str(data.projectid), "finished")
  86. # Decline task delivery
  87. elif data.declined and is_owner:
  88. models.project.update_task_status(data.taskid, "declined")
  89. raise web.seeother(('/project?projectid=' + data.projectid))