views.py 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. from datetime import datetime
  2. from django.contrib.auth import logout, login, update_session_auth_hash
  3. from django.contrib.auth.decorators import login_required
  4. from django.contrib.auth.forms import PasswordChangeForm
  5. from django.contrib.auth.models import User
  6. from django.core.paginator import Paginator
  7. from django.shortcuts import render, get_object_or_404, redirect
  8. from main.forms import StoryForm, EpicForm, RegisterForm, ProfileForm, \
  9. CommentForm
  10. from main.models import Story, Epic, Sprint, Comment
  11. @login_required
  12. def index(request):
  13. epics = Epic.objects.filter(closed=False)
  14. return render(request, 'index.html', {'current_sprint': Sprint.current(), 'epics': epics})
  15. def register(request):
  16. if request.method == 'POST':
  17. form = RegisterForm(request.POST)
  18. if form.is_valid():
  19. user = form.save()
  20. login(request, user)
  21. return redirect("index")
  22. else:
  23. form = RegisterForm()
  24. return render(request, 'registration/register.html', {'form': form})
  25. @login_required
  26. def profile_update(request):
  27. if request.method == 'POST':
  28. user = get_object_or_404(User, username=request.user)
  29. form = ProfileForm(request.POST, instance=user)
  30. if form.is_valid():
  31. user = form.save()
  32. login(request, user)
  33. return redirect("index")
  34. else:
  35. user = get_object_or_404(User, username=request.user)
  36. form = ProfileForm(instance=user)
  37. return render(request, 'registration/register.html', {'form': form})
  38. @login_required
  39. def change_password(request):
  40. if request.method == 'POST':
  41. form = PasswordChangeForm(request.user, request.POST)
  42. if form.is_valid():
  43. user = form.save()
  44. update_session_auth_hash(request, user) # Important!
  45. return redirect('index')
  46. else:
  47. form = PasswordChangeForm(request.user)
  48. return render(request, 'registration/change_password.html', {'form': form})
  49. @login_required
  50. def logout(request):
  51. logout(request)
  52. return redirect("index")
  53. @login_required
  54. def backlog_editor(request):
  55. epics = Epic.objects.filter(closed=False)
  56. closed = Epic.objects.filter(closed=True)
  57. return render(request, 'backlog_editor.html', {'epics': epics, 'closed': closed})
  58. @login_required
  59. def story_index(request):
  60. sprints = Sprint.objects.all()
  61. users = User.objects.all()
  62. stories = Story.objects
  63. filters = request.GET
  64. if 'state' in filters and filters['state']:
  65. stories = stories.filter(closed=(filters['state'] == 'closed'))
  66. if 'sprint' in filters and filters['sprint']:
  67. if filters['sprint'] == "None":
  68. stories = stories.filter(sprints=None)
  69. else:
  70. stories = stories.filter(sprints__id=filters['sprint'])
  71. if 'author' in filters and filters['author']:
  72. stories = stories.filter(author_id=filters['author'])
  73. if 'assignee' in filters and filters['assignee']:
  74. stories = stories.filter(assignees__id=filters['assignee'])
  75. paginator = Paginator(stories.all(), 10)
  76. page = request.GET.get('page')
  77. stories = paginator.get_page(page)
  78. return render(request, 'story_index.html', {'stories': stories, 'sprints': sprints, 'users': users, 'pages': range(1, paginator.num_pages + 1)})
  79. @login_required
  80. def story_details(request, story_id):
  81. story = get_object_or_404(Story, id=story_id)
  82. comment_form = CommentForm()
  83. return render(request, 'story_details.html', {'story': story, 'comment_form': comment_form})
  84. @login_required
  85. def story_create(request, epic_id=None):
  86. if request.method == 'POST':
  87. form = StoryForm(request.POST)
  88. if form.is_valid():
  89. story = form.save()
  90. return redirect("story_details", story.id)
  91. else:
  92. story = Story()
  93. if epic_id is not None:
  94. story.epic = get_object_or_404(Epic, id=epic_id)
  95. story.author = User.objects.get(username=request.user)
  96. form = StoryForm(instance=story)
  97. return render(request, 'story_form.html', {'form': form, 'current_sprint_id': Sprint.current().id})
  98. @login_required
  99. def story_edit(request, story_id):
  100. if request.method == 'POST':
  101. story = get_object_or_404(Story, id=story_id)
  102. form = StoryForm(request.POST, instance=story)
  103. if form.is_valid():
  104. form.save()
  105. return redirect("story_details", story.id)
  106. else:
  107. story = get_object_or_404(Story, id=story_id)
  108. form = StoryForm(instance=story)
  109. return render(request, 'story_form.html', {'form': form, 'current_sprint_id': Sprint.current().id})
  110. @login_required
  111. def story_delete(request, story_id):
  112. if request.method == 'POST':
  113. story = get_object_or_404(Story, id=story_id)
  114. story.delete()
  115. return redirect("index")
  116. else:
  117. story = get_object_or_404(Story, id=story_id)
  118. return render(request, 'deletion.html', {'object': story})
  119. @login_required
  120. def story_close(request, story_id):
  121. story = get_object_or_404(Story, id=story_id)
  122. story.closed = True
  123. story.save()
  124. return render(request, 'epic_details.html', {'epic': story.epic})
  125. @login_required
  126. def story_reopen(request, story_id):
  127. story = get_object_or_404(Story, id=story_id)
  128. story.closed = False
  129. story.save()
  130. return render(request, 'story_details.html', {'story': story})
  131. @login_required
  132. def story_comment(request, story_id):
  133. story = get_object_or_404(Story, id=story_id)
  134. comment = Comment()
  135. comment.obj_uuid = story.uuid
  136. comment.author = get_object_or_404(User, username=request.user)
  137. comment.content = request.POST["content"]
  138. comment.save()
  139. return redirect('story_details', story_id)
  140. @login_required
  141. def epic_details(request, epic_id):
  142. epic = get_object_or_404(Epic, id=epic_id)
  143. comment_form = CommentForm()
  144. return render(request, 'epic_details.html', {'epic': epic, 'comment_form': comment_form})
  145. @login_required
  146. def epic_create(request):
  147. if request.method == 'POST':
  148. form = EpicForm(request.POST)
  149. if form.is_valid():
  150. epic = form.save(commit=False)
  151. epic.author = User.objects.get(username=request.user)
  152. epic.save()
  153. return redirect("backlog_editor")
  154. else:
  155. form = EpicForm()
  156. return render(request, 'epic_form.html', {'form': form})
  157. @login_required
  158. def epic_edit(request, epic_id, from_=""):
  159. if request.method == 'POST':
  160. epic = get_object_or_404(Epic, id=epic_id)
  161. form = EpicForm(request.POST, instance=epic)
  162. if form.is_valid():
  163. form.save()
  164. if from_:
  165. return redirect(from_)
  166. else:
  167. return redirect("epic_details", epic.id)
  168. else:
  169. epic = get_object_or_404(Epic, id=epic_id)
  170. form = EpicForm(instance=epic)
  171. return render(request, 'epic_form.html', {'form': form})
  172. @login_required
  173. def epic_delete(request, epic_id):
  174. if request.method == 'POST':
  175. epic = get_object_or_404(Epic, id=epic_id)
  176. epic.delete()
  177. return redirect("index")
  178. else:
  179. epic = get_object_or_404(Epic, id=epic_id)
  180. return render(request, 'deletion.html', {'object': epic})
  181. @login_required
  182. def epic_value_update(request, epic_id):
  183. if request.method == 'POST':
  184. epic = get_object_or_404(Epic, id=epic_id)
  185. epic.value = request.POST["value"]
  186. epic.save()
  187. return redirect("backlog_edition")
  188. @login_required
  189. def epic_close(_, epic_id):
  190. epic = get_object_or_404(Epic, id=epic_id)
  191. epic.closed = True
  192. epic.save()
  193. return redirect("backlog_edition")
  194. @login_required
  195. def epic_reopen(_, epic_id):
  196. epic = get_object_or_404(Epic, id=epic_id)
  197. epic.closed = False
  198. epic.save()
  199. return redirect("backlog_edition")
  200. @login_required
  201. def epic_comment(request, epic_id):
  202. epic = get_object_or_404(Epic, id=epic_id)
  203. comment = Comment()
  204. comment.obj_uuid = epic.uuid
  205. comment.author = get_object_or_404(User, username=request.user)
  206. comment.content = request.POST["content"]
  207. comment.save()
  208. return redirect('epic_details', epic_id)
  209. @login_required
  210. def reports(request):
  211. return render(request, 'reports/report_index.html')
  212. @login_required
  213. def report_sprints(request):
  214. sprints = Sprint.objects.all()
  215. return render(request, 'reports/report_sprints.html', {'sprints': sprints})
  216. @login_required
  217. def report_projects(request):
  218. epics = Epic.objects.all()
  219. return render(request, 'reports/report_projects.html', {'epics': epics})
  220. @login_required
  221. def search(request):
  222. qstr = request.GET["q"]
  223. results = []
  224. results += Epic.objects.filter(name__icontains=qstr)
  225. results += Story.objects.filter(name__icontains=qstr)
  226. results += Epic.objects.filter(description__icontains=qstr)
  227. results += Story.objects.filter(description__icontains=qstr)
  228. if len(results) == 1:
  229. r = results[0]
  230. if r is Epic:
  231. return redirect("epic_details", r.id)
  232. else:
  233. return redirect("story_details", r.id)
  234. else:
  235. paginator = Paginator(results, 10)
  236. page = request.GET.get('page')
  237. results = paginator.get_page(page)
  238. return render(request, 'search_results.html', {'results': results, 'pages': range(1, paginator.num_pages + 1)})