Files
fet2020/fet2020/tasks/views.py

201 lines
5.7 KiB
Python

import logging
from collections import deque
from django.contrib.admin.models import ADDITION, CHANGE, LogEntry
from django.contrib.admin.utils import construct_change_message
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
from django.shortcuts import render
from django.views.generic.detail import DetailView
from django.views.generic.edit import CreateView, UpdateView
from django.urls import reverse_lazy, reverse
from django.utils import timezone
from authentications.decorators import authenticated_user
from documents.api import get_pad_link
from documents.etherpadlib import add_ep_cookie
from intern.models import Topic
from .forms import DocumentCreateForm, TaskCreateForm, TaskUpdateForm
from .models import Document, Task, TaskList
logger = logging.getLogger(__name__)
@authenticated_user
def index(request):
current_action = False
tasklist = None
show_tasklist = None
show_all_tasks = True
if request.method == "POST":
if "btn_checkbox" in request.POST:
for task_id in request.POST.getlist("checkbox"):
task = Task.objects.get(id=task_id)
if not task.completed:
task.completed = True
task.completed_date = timezone.now().date()
task.save()
if "btn_user" in request.POST:
if request.POST["action"] == "show_incompleted":
current_action = False
else:
current_action = True
if request.POST["tasklist"] != "all":
tasklist = TaskList.objects.filter(id=request.POST["tasklist"]).first()
show_tasklist = tasklist.id
if request.POST["tasks"] == "all":
show_all_tasks = True
else:
show_all_tasks = False
tasks = Task.taskmanager.get_tasks(
user=request.user.id,
completed=current_action,
task_list=tasklist,
all_tasks=show_all_tasks,
)
tasklists = TaskList.objects.all()
context = {
"tasks": tasks,
"tasklists": tasklists,
"current_user": request.user.id,
"current_action": current_action,
"show_tasklist": show_tasklist,
"show_all_tasks": show_all_tasks,
}
return render(request, "tasks/index.html", context)
def add_log_action(request, form, add=True):
obj = form.save()
content_type = ContentType.objects.get(app_label="tasks", model="task")
change_message = construct_change_message(form, None, add)
if add:
action_flag = ADDITION
else:
action_flag = CHANGE
LogEntry.objects.log_action(
user_id=request.user.pk,
content_type_id=content_type.pk,
object_id=obj.pk,
object_repr=str(obj),
action_flag=action_flag,
change_message=change_message,
)
class TaskCreate(LoginRequiredMixin, CreateView):
model = Task
success_url = reverse_lazy("tasks:index")
template_name = "tasks/task_create.html"
form_class = TaskCreateForm
user = None
def form_valid(self, form):
form.instance.created_by = self.request.user
add_log_action(self.request, form, True)
return super().form_valid(form)
def get_initial(self):
self.user = self.request.user
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs["user"] = self.request.user
return kwargs
class TaskUpdate(LoginRequiredMixin, UpdateView):
model = Task
template_name = "tasks/task_update.html"
form_class = TaskUpdateForm
pk = None
def form_valid(self, form):
add_log_action(self.request, form, False)
return super().form_valid(form)
def get_success_url(self):
kwargs = {
"pk": self.kwargs.get("pk"),
}
return reverse("tasks:task-detail", kwargs=kwargs)
class TaskDetail(LoginRequiredMixin, DetailView):
model = Task
success_url = reverse_lazy("tasks:index")
template_name = "tasks/task_detail.html"
def get(self, request, *args, **kwargs):
response = super().get(request, *args, **kwargs)
try:
response = add_ep_cookie(self.request, response)
except Exception as e:
logger.info("Etherpad Server doesn't work. Error: %s", e)
return response
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
docus = Document.objects.filter(task__id=self.object.id).order_by("-date")
documents = deque([])
# list of etherpad url-link of any documents
for elem in docus:
documents.append(
{
"title": elem.title,
"date": elem.date,
"etherpad_key": get_pad_link(elem.etherpad_key),
}
)
context["documents"] = documents
context["topic"] = Topic.objects.filter(task_list=self.object.task_list).first()
return context
class DocumentCreate(LoginRequiredMixin, CreateView):
model = Document
template_name = "tasks/docu_create.html"
form_class = DocumentCreateForm
task_id = None
def get_initial(self):
self.task_id = self.kwargs.get("pk")
task = Task.objects.get(pk=self.task_id)
context = {
"task": task,
}
return context
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["task_id"] = self.task_id
return context
def get_success_url(self):
kwargs = {
"pk": self.task_id,
}
return reverse("tasks:task-detail", kwargs=kwargs)