|
|
@@ -4,22 +4,19 @@ from django.contrib.auth import logout, login, update_session_auth_hash
|
|
|
from django.contrib.auth.decorators import login_required
|
|
|
from django.contrib.auth.forms import PasswordChangeForm
|
|
|
from django.contrib.auth.models import User
|
|
|
+from django.core.paginator import Paginator
|
|
|
from django.shortcuts import render, get_object_or_404, redirect
|
|
|
|
|
|
-from main.forms import StoryForm, EpicForm, RegisterForm, ProfileForm
|
|
|
-from main.models import Story, Epic, Sprint
|
|
|
+from main.forms import StoryForm, EpicForm, RegisterForm, ProfileForm, \
|
|
|
+ CommentForm
|
|
|
+from main.models import Story, Epic, Sprint, Comment
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
def index(request):
|
|
|
- today = datetime.today()
|
|
|
- try:
|
|
|
- current_sprint = Sprint.objects.filter(date_start__lte = today).filter(date_end__gt=today)[0]
|
|
|
- except IndexError:
|
|
|
- current_sprint = None
|
|
|
-
|
|
|
+
|
|
|
epics = Epic.objects.filter(closed=False)
|
|
|
- return render(request, 'index.html', {'current_sprint': current_sprint, 'epics': epics})
|
|
|
+ return render(request, 'index.html', {'current_sprint': Sprint.current(), 'epics': epics})
|
|
|
|
|
|
def register(request):
|
|
|
if request.method == 'POST':
|
|
|
@@ -32,6 +29,7 @@ def register(request):
|
|
|
form = RegisterForm()
|
|
|
return render(request, 'registration/register.html', {'form': form})
|
|
|
|
|
|
+@login_required
|
|
|
def profile_update(request):
|
|
|
if request.method == 'POST':
|
|
|
user = get_object_or_404(User, username=request.user)
|
|
|
@@ -45,6 +43,7 @@ def profile_update(request):
|
|
|
form = ProfileForm(instance=user)
|
|
|
return render(request, 'registration/register.html', {'form': form})
|
|
|
|
|
|
+@login_required
|
|
|
def change_password(request):
|
|
|
if request.method == 'POST':
|
|
|
form = PasswordChangeForm(request.user, request.POST)
|
|
|
@@ -56,12 +55,18 @@ def change_password(request):
|
|
|
form = PasswordChangeForm(request.user)
|
|
|
return render(request, 'registration/change_password.html', {'form': form})
|
|
|
|
|
|
-
|
|
|
@login_required
|
|
|
def logout(request):
|
|
|
logout(request)
|
|
|
return redirect("index")
|
|
|
|
|
|
+@login_required
|
|
|
+def backlog_editor(request):
|
|
|
+
|
|
|
+ epics = Epic.objects.filter(closed=False)
|
|
|
+ closed = Epic.objects.filter(closed=True)
|
|
|
+
|
|
|
+ return render(request, 'backlog_editor.html', {'epics': epics, 'closed': closed})
|
|
|
|
|
|
@login_required
|
|
|
def story_index(request):
|
|
|
@@ -84,30 +89,35 @@ def story_index(request):
|
|
|
if 'assignee' in filters and filters['assignee']:
|
|
|
stories = stories.filter(assignees__id=filters['assignee'])
|
|
|
|
|
|
- return render(request, 'story_index.html', {'stories': stories.all(), 'sprints': sprints, 'users': users})
|
|
|
+ paginator = Paginator(stories.all(), 10)
|
|
|
+ page = request.GET.get('page')
|
|
|
+ stories = paginator.get_page(page)
|
|
|
+
|
|
|
+ return render(request, 'story_index.html', {'stories': stories, 'sprints': sprints, 'users': users, 'pages': range(1, paginator.num_pages + 1)})
|
|
|
|
|
|
@login_required
|
|
|
def story_details(request, story_id):
|
|
|
story = get_object_or_404(Story, id=story_id)
|
|
|
- return render(request, 'story_details.html', {'story': story})
|
|
|
+ comment_form = CommentForm()
|
|
|
+ return render(request, 'story_details.html', {'story': story, 'comment_form': comment_form})
|
|
|
|
|
|
@login_required
|
|
|
-def story_create(request, epic_id):
|
|
|
+def story_create(request, epic_id=None):
|
|
|
if request.method == 'POST':
|
|
|
|
|
|
form = StoryForm(request.POST)
|
|
|
if form.is_valid():
|
|
|
- story = form.save(commit=False)
|
|
|
- story.author = User.objects.get(username=request.user)
|
|
|
- story.save()
|
|
|
+ story = form.save()
|
|
|
return redirect("story_details", story.id)
|
|
|
|
|
|
else:
|
|
|
story = Story()
|
|
|
- story.epic = get_object_or_404(Epic, id=epic_id)
|
|
|
+ if epic_id is not None:
|
|
|
+ story.epic = get_object_or_404(Epic, id=epic_id)
|
|
|
+ story.author = User.objects.get(username=request.user)
|
|
|
form = StoryForm(instance=story)
|
|
|
-
|
|
|
- return render(request, 'story_form.html', {'form': form})
|
|
|
+
|
|
|
+ return render(request, 'story_form.html', {'form': form, 'current_sprint_id': Sprint.current().id})
|
|
|
|
|
|
@login_required
|
|
|
def story_edit(request, story_id):
|
|
|
@@ -122,7 +132,7 @@ def story_edit(request, story_id):
|
|
|
story = get_object_or_404(Story, id=story_id)
|
|
|
form = StoryForm(instance=story)
|
|
|
|
|
|
- return render(request, 'story_form.html', {'form': form})
|
|
|
+ return render(request, 'story_form.html', {'form': form, 'current_sprint_id': Sprint.current().id})
|
|
|
|
|
|
@login_required
|
|
|
def story_delete(request, story_id):
|
|
|
@@ -133,23 +143,38 @@ def story_delete(request, story_id):
|
|
|
else:
|
|
|
story = get_object_or_404(Story, id=story_id)
|
|
|
return render(request, 'deletion.html', {'object': story})
|
|
|
-
|
|
|
+
|
|
|
+@login_required
|
|
|
def story_close(request, story_id):
|
|
|
story = get_object_or_404(Story, id=story_id)
|
|
|
story.closed = True
|
|
|
story.save()
|
|
|
return render(request, 'epic_details.html', {'epic': story.epic})
|
|
|
|
|
|
+@login_required
|
|
|
def story_reopen(request, story_id):
|
|
|
story = get_object_or_404(Story, id=story_id)
|
|
|
story.closed = False
|
|
|
story.save()
|
|
|
return render(request, 'story_details.html', {'story': story})
|
|
|
|
|
|
+@login_required
|
|
|
+def story_comment(request, story_id):
|
|
|
+ story = get_object_or_404(Story, id=story_id)
|
|
|
+ comment = Comment()
|
|
|
+ comment.obj_uuid = story.uuid
|
|
|
+ comment.author = get_object_or_404(User, username=request.user)
|
|
|
+ comment.content = request.POST["content"]
|
|
|
+ comment.save()
|
|
|
+ return redirect('story_details', story_id)
|
|
|
+
|
|
|
+@login_required
|
|
|
def epic_details(request, epic_id):
|
|
|
epic = get_object_or_404(Epic, id=epic_id)
|
|
|
- return render(request, 'epic_details.html', {'epic': epic})
|
|
|
+ comment_form = CommentForm()
|
|
|
+ return render(request, 'epic_details.html', {'epic': epic, 'comment_form': comment_form})
|
|
|
|
|
|
+@login_required
|
|
|
def epic_create(request):
|
|
|
if request.method == 'POST':
|
|
|
|
|
|
@@ -158,7 +183,7 @@ def epic_create(request):
|
|
|
epic = form.save(commit=False)
|
|
|
epic.author = User.objects.get(username=request.user)
|
|
|
epic.save()
|
|
|
- return redirect("epic_details", epic.id)
|
|
|
+ return redirect("backlog_editor")
|
|
|
|
|
|
else:
|
|
|
form = EpicForm()
|
|
|
@@ -166,27 +191,103 @@ def epic_create(request):
|
|
|
return render(request, 'epic_form.html', {'form': form})
|
|
|
|
|
|
@login_required
|
|
|
-def epic_edit(request, epic_id):
|
|
|
+def epic_edit(request, epic_id, from_=""):
|
|
|
if request.method == 'POST':
|
|
|
epic = get_object_or_404(Epic, id=epic_id)
|
|
|
form = EpicForm(request.POST, instance=epic)
|
|
|
if form.is_valid():
|
|
|
form.save()
|
|
|
- return redirect("epic_details", epic.id)
|
|
|
-
|
|
|
+ if from_:
|
|
|
+ return redirect(from_)
|
|
|
+ else:
|
|
|
+ return redirect("epic_details", epic.id)
|
|
|
else:
|
|
|
+
|
|
|
epic = get_object_or_404(Epic, id=epic_id)
|
|
|
form = EpicForm(instance=epic)
|
|
|
-
|
|
|
+
|
|
|
return render(request, 'epic_form.html', {'form': form})
|
|
|
|
|
|
@login_required
|
|
|
def epic_delete(request, epic_id):
|
|
|
if request.method == 'POST':
|
|
|
- epic = Epic.objects.get(id=epic_id)
|
|
|
+ epic = get_object_or_404(Epic, id=epic_id)
|
|
|
epic.delete()
|
|
|
return redirect("index")
|
|
|
else:
|
|
|
- epic = Epic.objects.get(id=epic_id)
|
|
|
+ epic = get_object_or_404(Epic, id=epic_id)
|
|
|
return render(request, 'deletion.html', {'object': epic})
|
|
|
+
|
|
|
+@login_required
|
|
|
+def epic_value_update(request, epic_id):
|
|
|
+ if request.method == 'POST':
|
|
|
+ epic = get_object_or_404(Epic, id=epic_id)
|
|
|
+ epic.value = request.POST["value"]
|
|
|
+ epic.save()
|
|
|
+ return redirect("backlog_edition")
|
|
|
+
|
|
|
+@login_required
|
|
|
+def epic_close(_, epic_id):
|
|
|
+ epic = get_object_or_404(Epic, id=epic_id)
|
|
|
+ epic.closed = True
|
|
|
+ epic.save()
|
|
|
+ return redirect("backlog_edition")
|
|
|
+
|
|
|
+@login_required
|
|
|
+def epic_reopen(_, epic_id):
|
|
|
+ epic = get_object_or_404(Epic, id=epic_id)
|
|
|
+ epic.closed = False
|
|
|
+ epic.save()
|
|
|
+ return redirect("backlog_edition")
|
|
|
+
|
|
|
+@login_required
|
|
|
+def epic_comment(request, epic_id):
|
|
|
+ epic = get_object_or_404(Epic, id=epic_id)
|
|
|
+ comment = Comment()
|
|
|
+ comment.obj_uuid = epic.uuid
|
|
|
+ comment.author = get_object_or_404(User, username=request.user)
|
|
|
+ comment.content = request.POST["content"]
|
|
|
+ comment.save()
|
|
|
+ return redirect('epic_details', epic_id)
|
|
|
+
|
|
|
+@login_required
|
|
|
+def reports(request):
|
|
|
+ return render(request, 'reports/report_index.html')
|
|
|
+
|
|
|
+@login_required
|
|
|
+def report_sprints(request):
|
|
|
+ sprints = Sprint.objects.all()
|
|
|
+ return render(request, 'reports/report_sprints.html', {'sprints': sprints})
|
|
|
+
|
|
|
+@login_required
|
|
|
+def report_projects(request):
|
|
|
+ epics = Epic.objects.all()
|
|
|
+ return render(request, 'reports/report_projects.html', {'epics': epics})
|
|
|
+
|
|
|
+@login_required
|
|
|
+def search(request):
|
|
|
+ qstr = request.GET["q"]
|
|
|
+
|
|
|
+ results = []
|
|
|
+ results += Epic.objects.filter(name__icontains=qstr)
|
|
|
+ results += Story.objects.filter(name__icontains=qstr)
|
|
|
+
|
|
|
+ results += Epic.objects.filter(description__icontains=qstr)
|
|
|
+ results += Story.objects.filter(description__icontains=qstr)
|
|
|
+
|
|
|
+ if len(results) == 1:
|
|
|
+ r = results[0]
|
|
|
+ if r is Epic:
|
|
|
+ return redirect("epic_details", r.id)
|
|
|
+ else:
|
|
|
+ return redirect("story_details", r.id)
|
|
|
+ else:
|
|
|
+
|
|
|
+ paginator = Paginator(results, 10)
|
|
|
+ page = request.GET.get('page')
|
|
|
+ results = paginator.get_page(page)
|
|
|
+
|
|
|
+ return render(request, 'search_results.html', {'results': results, 'pages': range(1, paginator.num_pages + 1)})
|
|
|
+
|
|
|
+
|
|
|
|