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

109 рядки
3.7KB

  1. import web
  2. import models.project
  3. from views.utils import get_nav_bar
  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. def POST(self):
  34. # Get session
  35. session = web.ctx.session
  36. data = web.input(myfile={}, deliver=None, accepted=None, declined=None, projectid=0)
  37. fileitem = data['myfile']
  38. permissions = models.project.get_user_permissions(str(session.userid), data.projectid)
  39. categories = models.project.get_categories()
  40. tasks = models.project.get_tasks_by_project_id(data.projectid)
  41. # Determine status of the targeted task
  42. all_tasks_accepted = True
  43. task_waiting = False
  44. task_delivered = False
  45. for task in tasks:
  46. if task[0] == int(data.taskid):
  47. if(task[5] == "waiting for delivery" or task[5] == "declined"):
  48. task_waiting = True
  49. if(task[5] == 'accepted'):
  50. task_delivered = True
  51. # Deliver task
  52. if data.deliver and not task_delivered:
  53. models.project.update_task_status(data.taskid, "delivered")
  54. # Accept task delivery
  55. elif data.accepted:
  56. models.project.update_task_status(data.taskid, "accepted")
  57. # If all tasks are accepted then update project status to finished
  58. all_tasks_accepted = True
  59. tasks = models.project.get_tasks_by_project_id(data.projectid)
  60. for task in tasks:
  61. if task[5] != "accepted":
  62. all_tasks_accepted = False
  63. if all_tasks_accepted:
  64. models.project.update_project_status(str(data.projectid), "finished")
  65. # Decline task delivery
  66. elif data.declined:
  67. models.project.update_task_status(data.taskid, "declined")
  68. # Upload file
  69. elif fileitem.filename:
  70. # Check if user has write permission
  71. if not permissions[1] or not task_waiting:
  72. raise web.seeother(('/project?projectid=' + data.projectid))
  73. fn = fileitem.filename
  74. # Create the project directory if it doesnt exist
  75. path = 'static/project' + data.projectid
  76. if not os.path.isdir(path):
  77. command = 'mkdir ' + path
  78. os.popen(command)
  79. sleep(0.2)
  80. path = path + '/task' + data.taskid
  81. if not os.path.isdir(path):
  82. command = 'mkdir ' + path
  83. os.popen(command)
  84. sleep(0.2)
  85. open(path + '/' + fn, 'wb').write(fileitem.file.read())
  86. models.project.set_task_file(data.taskid, (path + "/" + fn))
  87. raise web.seeother(('/project?projectid=' + data.projectid))