views.py 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  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
  10. from django.shortcuts import render, get_object_or_404, redirect
  11. from main.forms import StoryForm, EpicForm, RegisterForm, ProfileForm, \
  12. CommentForm
  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. @login_required
  62. def story_index(request):
  63. sprints = Sprint.objects.all()
  64. users = User.objects.all()
  65. stories = Story.objects
  66. filters = request.GET
  67. if 'state' in filters and filters['state']:
  68. stories = stories.filter(closed=(filters['state'] == 'closed'))
  69. if 'sprint' in filters and filters['sprint']:
  70. if filters['sprint'] == "None":
  71. stories = stories.filter(sprints=None)
  72. else:
  73. stories = stories.filter(sprints__id=filters['sprint'])
  74. if 'author' in filters and filters['author']:
  75. stories = stories.filter(author_id=filters['author'])
  76. if 'assignee' in filters and filters['assignee']:
  77. stories = stories.filter(assignees__id=filters['assignee'])
  78. paginator = Paginator(stories.all(), 20)
  79. page = request.GET.get('page')
  80. stories = paginator.get_page(page)
  81. return render(request, 'story_index.html', {'stories': stories, 'sprints': sprints, 'users': users, 'pages': range(1, paginator.num_pages + 1)})
  82. @login_required
  83. def story_details(request, story_id):
  84. story = get_object_or_404(Story, id=story_id)
  85. return render(request, 'story_details.html', {'story': story, 'comment_form': CommentForm()})
  86. @login_required
  87. def story_create(request, epic_id=None):
  88. if request.method == 'POST':
  89. form = StoryForm(request.POST)
  90. if form.is_valid():
  91. story = form.save()
  92. return redirect("story_details", story.id)
  93. else:
  94. story = Story()
  95. if epic_id is not None:
  96. story.epic = get_object_or_404(Epic, id=epic_id)
  97. story.author = User.objects.get(username=request.user)
  98. form = StoryForm(instance=story)
  99. return render(request, 'story_form.html', {'form': form, 'current_sprint_id': Sprint.current().id})
  100. @login_required
  101. def story_edit(request, story_id):
  102. if request.method == 'POST':
  103. story = get_object_or_404(Story, id=story_id)
  104. form = StoryForm(request.POST, instance=story)
  105. if form.is_valid():
  106. form.save()
  107. return redirect("story_details", story.id)
  108. else:
  109. story = get_object_or_404(Story, id=story_id)
  110. form = StoryForm(instance=story)
  111. return render(request, 'story_form.html', {'form': form, 'current_sprint_id': Sprint.current().id})
  112. @login_required
  113. def story_delete(request, story_id):
  114. if request.method == 'POST':
  115. story = get_object_or_404(Story, id=story_id)
  116. story.delete()
  117. return redirect("index")
  118. else:
  119. story = get_object_or_404(Story, id=story_id)
  120. return render(request, 'deletion.html', {'object': story})
  121. @login_required
  122. def story_close(request, story_id):
  123. story = get_object_or_404(Story, id=story_id)
  124. story.closed = True
  125. story.save()
  126. return render(request, 'epic_details.html', {'epic': story.epic})
  127. @login_required
  128. def story_reopen(request, story_id):
  129. story = get_object_or_404(Story, id=story_id)
  130. story.closed = False
  131. story.save()
  132. return render(request, 'story_details.html', {'story': story})
  133. @login_required
  134. def epic_details(request, epic_id):
  135. epic = get_object_or_404(Epic, id=epic_id)
  136. return render(request, 'epic_details.html', {'epic': epic, 'comment_form': CommentForm()})
  137. @login_required
  138. def epic_create(request):
  139. if request.method == 'POST':
  140. form = EpicForm(request.POST)
  141. if form.is_valid():
  142. epic = form.save(commit=False)
  143. epic.author = User.objects.get(username=request.user)
  144. epic.save()
  145. return redirect("backlog_editor")
  146. else:
  147. form = EpicForm()
  148. return render(request, 'epic_form.html', {'form': form})
  149. @login_required
  150. def epic_edit(request, epic_id, from_=""):
  151. if request.method == 'POST':
  152. epic = get_object_or_404(Epic, id=epic_id)
  153. form = EpicForm(request.POST, instance=epic)
  154. if form.is_valid():
  155. form.save()
  156. if from_:
  157. return redirect(from_)
  158. else:
  159. return redirect("epic_details", epic.id)
  160. else:
  161. epic = get_object_or_404(Epic, id=epic_id)
  162. form = EpicForm(instance=epic)
  163. return render(request, 'epic_form.html', {'form': form})
  164. @login_required
  165. def epic_delete(request, epic_id):
  166. if request.method == 'POST':
  167. epic = get_object_or_404(Epic, id=epic_id)
  168. epic.delete()
  169. return redirect("index")
  170. else:
  171. epic = get_object_or_404(Epic, id=epic_id)
  172. return render(request, 'deletion.html', {'object': epic})
  173. @login_required
  174. def epic_value_update(request, epic_id):
  175. if request.method == 'POST':
  176. epic = get_object_or_404(Epic, id=epic_id)
  177. epic.value = request.POST["value"]
  178. epic.save()
  179. return redirect("backlog_edition")
  180. @login_required
  181. def epic_close(_, epic_id):
  182. epic = get_object_or_404(Epic, id=epic_id)
  183. epic.closed = True
  184. epic.save()
  185. return redirect("backlog_edition")
  186. @login_required
  187. def epic_reopen(_, epic_id):
  188. epic = get_object_or_404(Epic, id=epic_id)
  189. epic.closed = False
  190. epic.save()
  191. return redirect("backlog_edition")
  192. @login_required
  193. def reports(request):
  194. return render(request, 'reports/report_index.html')
  195. @login_required
  196. def report_sprints(request):
  197. sprints = Sprint.objects.all()
  198. return render(request, 'reports/report_sprints.html', {'sprints': sprints})
  199. @login_required
  200. def report_projects(request):
  201. epics = Epic.objects.all()
  202. return render(request, 'reports/report_projects.html', {'epics': epics})
  203. @login_required
  204. def comment_post(request, obj_uuid):
  205. comment = Comment()
  206. comment.obj_uuid = obj_uuid
  207. comment.author = get_object_or_404(User, username=request.user)
  208. comment.content = request.POST["content"]
  209. comment.save()
  210. return redirect(request.META['HTTP_REFERER'])
  211. @login_required
  212. def comment_del(request, comment_id):
  213. comment = get_object_or_404(Comment, id=comment_id)
  214. comment.delete()
  215. return redirect(request.META['HTTP_REFERER'])
  216. @login_required
  217. def search(request):
  218. qstr = request.GET["q"]
  219. results = []
  220. results += Epic.objects.filter(name__icontains=qstr)
  221. results += Story.objects.filter(name__icontains=qstr)
  222. results += Epic.objects.filter(description__icontains=qstr)
  223. results += Story.objects.filter(description__icontains=qstr)
  224. if len(results) == 1:
  225. r = results[0]
  226. if isinstance(r, Epic):
  227. return redirect("epic_details", r.id)
  228. else:
  229. return redirect("story_details", r.id)
  230. else:
  231. paginator = Paginator(results, 10)
  232. page = request.GET.get('page')
  233. results = paginator.get_page(page)
  234. return render(request, 'search_results.html', {'results': results, 'pages': range(1, paginator.num_pages + 1)})