from datetime import datetime import json 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 import serializers from django.core.paginator import Paginator from django.http.response import HttpResponse from django.shortcuts import render, get_object_or_404, redirect from main.forms import StoryForm, EpicForm, RegisterForm, ProfileForm, \ CommentForm from main.models import Story, Epic, Sprint, Comment @login_required def index(request): epics = Epic.objects.filter(closed=False) return render(request, 'index.html', {'current_sprint': Sprint.current(), 'epics': epics}) def register(request): if request.method == 'POST': form = RegisterForm(request.POST) if form.is_valid(): user = form.save() login(request, user) return redirect("index") else: 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) form = ProfileForm(request.POST, instance=user) if form.is_valid(): user = form.save() login(request, user) return redirect("index") else: user = get_object_or_404(User, username=request.user) 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) if form.is_valid(): user = form.save() update_session_auth_hash(request, user) # Important! return redirect('index') else: 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): sprints = Sprint.objects.all() users = User.objects.all() stories = Story.objects filters = request.GET if 'state' in filters and filters['state']: stories = stories.filter(closed=(filters['state'] == 'closed')) if 'sprint' in filters and filters['sprint']: if filters['sprint'] == "None": stories = stories.filter(sprints=None) else: stories = stories.filter(sprints__id=filters['sprint']) if 'author' in filters and filters['author']: stories = stories.filter(author_id=filters['author']) if 'assignee' in filters and filters['assignee']: stories = stories.filter(assignees__id=filters['assignee']) paginator = Paginator(stories.all(), 20) 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) comment_form = CommentForm() return render(request, 'story_details.html', {'story': story, 'comment_form': comment_form}) @login_required def story_create(request, epic_id=None): if request.method == 'POST': form = StoryForm(request.POST) if form.is_valid(): story = form.save() return redirect("story_details", story.id) else: story = Story() 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, 'current_sprint_id': Sprint.current().id}) @login_required def story_edit(request, story_id): if request.method == 'POST': story = get_object_or_404(Story, id=story_id) form = StoryForm(request.POST, instance=story) if form.is_valid(): form.save() return redirect("story_details", story.id) else: story = get_object_or_404(Story, id=story_id) form = StoryForm(instance=story) return render(request, 'story_form.html', {'form': form, 'current_sprint_id': Sprint.current().id}) @login_required def story_delete(request, story_id): if request.method == 'POST': story = get_object_or_404(Story, id=story_id) story.delete() return redirect("index") 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 epic_details(request, epic_id): epic = get_object_or_404(Epic, id=epic_id) 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': form = EpicForm(request.POST) if form.is_valid(): epic = form.save(commit=False) epic.author = User.objects.get(username=request.user) epic.save() return redirect("backlog_editor") else: form = EpicForm() return render(request, 'epic_form.html', {'form': form}) @login_required 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() 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 = get_object_or_404(Epic, id=epic_id) epic.delete() return redirect("index") else: 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 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 comment_post(request, obj_uuid): comment = Comment() comment.obj_uuid = obj_uuid comment.author = get_object_or_404(User, username=request.user) comment.content = request.POST["content"] comment.save() return redirect(request.META['HTTP_REFERER']) # @login_required # def comment_post(request, obj_uuid): # data = json.loads(request.body.decode('utf-8')) # comment = Comment() # comment.obj_uuid = obj_uuid # comment.author = get_object_or_404(User, username=request.user) # comment.content = data["content"] # comment.save() # return HttpResponse(comment.to_json(),content_type="application/json") # # def comment_edit(request, comment_id): # data = json.loads(request.body.decode('utf-8')) # comment = get_object_or_404(Comment, id=comment_id) # comment.content= data["content"] # comment.save() # return HttpResponse(comment.to_json(),content_type="application/json") # # def comment_del(_, comment_id): # comment = get_object_or_404(Comment, id=comment_id) # comment.delete() # return HttpResponse("{}",content_type="application/json") @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 isinstance(r, 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)})