views.py 10 KB

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