views.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  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. comment_form = CommentForm()
  86. return render(request, 'story_details.html', {'story': story, 'comment_form': comment_form})
  87. @login_required
  88. def story_create(request, epic_id=None):
  89. if request.method == 'POST':
  90. form = StoryForm(request.POST)
  91. if form.is_valid():
  92. story = form.save()
  93. return redirect("story_details", story.id)
  94. else:
  95. story = Story()
  96. if epic_id is not None:
  97. story.epic = get_object_or_404(Epic, id=epic_id)
  98. story.author = User.objects.get(username=request.user)
  99. form = StoryForm(instance=story)
  100. return render(request, 'story_form.html', {'form': form, 'current_sprint_id': Sprint.current().id})
  101. @login_required
  102. def story_edit(request, story_id):
  103. if request.method == 'POST':
  104. story = get_object_or_404(Story, id=story_id)
  105. form = StoryForm(request.POST, instance=story)
  106. if form.is_valid():
  107. form.save()
  108. return redirect("story_details", story.id)
  109. else:
  110. story = get_object_or_404(Story, id=story_id)
  111. form = StoryForm(instance=story)
  112. return render(request, 'story_form.html', {'form': form, 'current_sprint_id': Sprint.current().id})
  113. @login_required
  114. def story_delete(request, story_id):
  115. if request.method == 'POST':
  116. story = get_object_or_404(Story, id=story_id)
  117. story.delete()
  118. return redirect("index")
  119. else:
  120. story = get_object_or_404(Story, id=story_id)
  121. return render(request, 'deletion.html', {'object': story})
  122. @login_required
  123. def story_close(request, story_id):
  124. story = get_object_or_404(Story, id=story_id)
  125. story.closed = True
  126. story.save()
  127. return render(request, 'epic_details.html', {'epic': story.epic})
  128. @login_required
  129. def story_reopen(request, story_id):
  130. story = get_object_or_404(Story, id=story_id)
  131. story.closed = False
  132. story.save()
  133. return render(request, 'story_details.html', {'story': story})
  134. @login_required
  135. def epic_details(request, epic_id):
  136. epic = get_object_or_404(Epic, id=epic_id)
  137. comment_form = CommentForm()
  138. return render(request, 'epic_details.html', {'epic': epic, 'comment_form': comment_form})
  139. @login_required
  140. def epic_create(request):
  141. if request.method == 'POST':
  142. form = EpicForm(request.POST)
  143. if form.is_valid():
  144. epic = form.save(commit=False)
  145. epic.author = User.objects.get(username=request.user)
  146. epic.save()
  147. return redirect("backlog_editor")
  148. else:
  149. form = EpicForm()
  150. return render(request, 'epic_form.html', {'form': form})
  151. @login_required
  152. def epic_edit(request, epic_id, from_=""):
  153. if request.method == 'POST':
  154. epic = get_object_or_404(Epic, id=epic_id)
  155. form = EpicForm(request.POST, instance=epic)
  156. if form.is_valid():
  157. form.save()
  158. if from_:
  159. return redirect(from_)
  160. else:
  161. return redirect("epic_details", epic.id)
  162. else:
  163. epic = get_object_or_404(Epic, id=epic_id)
  164. form = EpicForm(instance=epic)
  165. return render(request, 'epic_form.html', {'form': form})
  166. @login_required
  167. def epic_delete(request, epic_id):
  168. if request.method == 'POST':
  169. epic = get_object_or_404(Epic, id=epic_id)
  170. epic.delete()
  171. return redirect("index")
  172. else:
  173. epic = get_object_or_404(Epic, id=epic_id)
  174. return render(request, 'deletion.html', {'object': epic})
  175. @login_required
  176. def epic_value_update(request, epic_id):
  177. if request.method == 'POST':
  178. epic = get_object_or_404(Epic, id=epic_id)
  179. epic.value = request.POST["value"]
  180. epic.save()
  181. return redirect("backlog_edition")
  182. @login_required
  183. def epic_close(_, epic_id):
  184. epic = get_object_or_404(Epic, id=epic_id)
  185. epic.closed = True
  186. epic.save()
  187. return redirect("backlog_edition")
  188. @login_required
  189. def epic_reopen(_, epic_id):
  190. epic = get_object_or_404(Epic, id=epic_id)
  191. epic.closed = False
  192. epic.save()
  193. return redirect("backlog_edition")
  194. @login_required
  195. def reports(request):
  196. return render(request, 'reports/report_index.html')
  197. @login_required
  198. def report_sprints(request):
  199. sprints = Sprint.objects.all()
  200. return render(request, 'reports/report_sprints.html', {'sprints': sprints})
  201. @login_required
  202. def report_projects(request):
  203. epics = Epic.objects.all()
  204. return render(request, 'reports/report_projects.html', {'epics': epics})
  205. @login_required
  206. def comment_post(request, obj_uuid):
  207. comment = Comment()
  208. comment.obj_uuid = obj_uuid
  209. comment.author = get_object_or_404(User, username=request.user)
  210. comment.content = request.POST["content"]
  211. comment.save()
  212. return redirect(request.META['HTTP_REFERER'])
  213. # @login_required
  214. # def comment_post(request, obj_uuid):
  215. # data = json.loads(request.body.decode('utf-8'))
  216. # comment = Comment()
  217. # comment.obj_uuid = obj_uuid
  218. # comment.author = get_object_or_404(User, username=request.user)
  219. # comment.content = data["content"]
  220. # comment.save()
  221. # return HttpResponse(comment.to_json(),content_type="application/json")
  222. #
  223. # def comment_edit(request, comment_id):
  224. # data = json.loads(request.body.decode('utf-8'))
  225. # comment = get_object_or_404(Comment, id=comment_id)
  226. # comment.content= data["content"]
  227. # comment.save()
  228. # return HttpResponse(comment.to_json(),content_type="application/json")
  229. #
  230. # def comment_del(_, comment_id):
  231. # comment = get_object_or_404(Comment, id=comment_id)
  232. # comment.delete()
  233. # return HttpResponse("{}",content_type="application/json")
  234. @login_required
  235. def search(request):
  236. qstr = request.GET["q"]
  237. results = []
  238. results += Epic.objects.filter(name__icontains=qstr)
  239. results += Story.objects.filter(name__icontains=qstr)
  240. results += Epic.objects.filter(description__icontains=qstr)
  241. results += Story.objects.filter(description__icontains=qstr)
  242. if len(results) == 1:
  243. r = results[0]
  244. if isinstance(r, Epic):
  245. return redirect("epic_details", r.id)
  246. else:
  247. return redirect("story_details", r.id)
  248. else:
  249. paginator = Paginator(results, 10)
  250. page = request.GET.get('page')
  251. results = paginator.get_page(page)
  252. return render(request, 'search_results.html', {'results': results, 'pages': range(1, paginator.num_pages + 1)})