You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
237 lines
8.2 KiB
237 lines
8.2 KiB
# coding=utf-8
|
|
from json import dumps
|
|
from django.contrib.auth.decorators import login_required
|
|
from django.core.exceptions import PermissionDenied
|
|
from django.http import HttpResponse
|
|
from django.shortcuts import render, redirect, get_object_or_404
|
|
from django.contrib import messages
|
|
from django.utils.decorators import method_decorator
|
|
from django.views.generic import ListView
|
|
from django.utils.translation import ugettext as _
|
|
from django.conf import settings
|
|
|
|
from datetime import datetime
|
|
from guardian.decorators import permission_required_or_403 as permission_required
|
|
from chatbot.models import MessageQueue
|
|
from abonapp.models import Abon
|
|
from .handle import TaskException
|
|
from .models import Task
|
|
from mydefs import only_admins, safe_int, MultipleException, RuTimedelta
|
|
from .forms import TaskFrm
|
|
|
|
|
|
class BaseTaskListView(ListView):
|
|
http_method_names = ['get']
|
|
paginate_by = getattr(settings, 'PAGINATION_ITEMS_PER_PAGE', 10)
|
|
|
|
|
|
@method_decorator([login_required, only_admins], name='dispatch')
|
|
class NewTasksView(BaseTaskListView):
|
|
"""
|
|
Show new tasks
|
|
"""
|
|
template_name = 'taskapp/tasklist.html'
|
|
context_object_name = 'tasks'
|
|
|
|
def get_queryset(self):
|
|
return Task.objects.filter(recipients=self.request.user, state='S') \
|
|
.select_related('abon', 'abon__street', 'abon__group', 'author')
|
|
|
|
|
|
class FailedTasksView(NewTasksView):
|
|
"""
|
|
Show crashed tasks
|
|
"""
|
|
template_name = 'taskapp/tasklist_failed.html'
|
|
context_object_name = 'tasks'
|
|
|
|
def get_queryset(self):
|
|
return Task.objects.filter(recipients=self.request.user, state='C') \
|
|
.select_related('abon', 'abon__street', 'abon__group', 'author')
|
|
|
|
|
|
class FinishedTaskListView(NewTasksView):
|
|
template_name = 'taskapp/tasklist_finish.html'
|
|
|
|
def get_queryset(self):
|
|
return Task.objects.filter(recipients=self.request.user, state='F') \
|
|
.select_related('abon', 'abon__street', 'abon__group', 'author')
|
|
|
|
|
|
class OwnTaskListView(NewTasksView):
|
|
template_name = 'taskapp/tasklist_own.html'
|
|
|
|
def get_queryset(self):
|
|
# Attached and not finished tasks
|
|
return Task.objects.filter(author=self.request.user)\
|
|
.exclude(state='F')\
|
|
.select_related('abon', 'abon__street', 'abon__group')
|
|
|
|
|
|
class MyTaskListView(NewTasksView):
|
|
template_name = 'taskapp/tasklist.html'
|
|
|
|
def get_queryset(self):
|
|
# Tasks in which I participated
|
|
return Task.objects.filter(recipients=self.request.user) \
|
|
.select_related('abon', 'abon__street', 'abon__group', 'author')
|
|
|
|
|
|
@method_decorator([login_required, permission_required('taskapp.can_viewall')], name='dispatch')
|
|
class AllTasksListView(BaseTaskListView):
|
|
template_name = 'taskapp/tasklist_all.html'
|
|
context_object_name = 'tasks'
|
|
|
|
def get_queryset(self):
|
|
return Task.objects.select_related('abon', 'abon__street', 'abon__group', 'author')
|
|
|
|
|
|
@login_required
|
|
@permission_required('taskapp.delete_task')
|
|
def task_delete(request, task_id):
|
|
task = get_object_or_404(Task, id=task_id)
|
|
# нельзя удалить назначенную мне задачу
|
|
if request.user.is_superuser or request.user not in task.recipients.all():
|
|
task.delete()
|
|
else:
|
|
messages.warning(request, _('You cannot delete task that assigned to you'))
|
|
return redirect('taskapp:home')
|
|
|
|
|
|
@login_required
|
|
@only_admins
|
|
def view(request, task_id):
|
|
tsk = get_object_or_404(Task, id=task_id)
|
|
#toc = date(tsk.time_of_create.year, tsk.time_of_create.month, tsk.time_of_create.day)
|
|
now_date = datetime.now().date()
|
|
if tsk.out_date > now_date:
|
|
time_diff = "%s: %s" % (_('time left'), RuTimedelta(tsk.out_date - now_date))
|
|
else:
|
|
time_diff = _("Expired timeout -%(time_left)s") % {'time_left': RuTimedelta(now_date - tsk.out_date)}
|
|
return render(request, 'taskapp/view.html', {
|
|
'task': tsk,
|
|
'time_diff': time_diff
|
|
})
|
|
|
|
|
|
@login_required
|
|
@only_admins
|
|
def task_add_edit(request, task_id=0):
|
|
task_id = safe_int(task_id)
|
|
uid = request.GET.get('uid', 0)
|
|
selected_abon = None
|
|
frm = TaskFrm()
|
|
|
|
# чтоб при добавлении сразу был выбран исполнитель
|
|
#frm_recipient_id = safe_int(request.GET.get('rp'))
|
|
|
|
if task_id == 0:
|
|
if not request.user.has_perm('taskapp.add_task'):
|
|
raise PermissionDenied
|
|
tsk = Task()
|
|
else:
|
|
if not request.user.has_perm('taskapp.change_task'):
|
|
raise PermissionDenied
|
|
tsk = get_object_or_404(Task, id=task_id)
|
|
frm = TaskFrm(instance=tsk)
|
|
selected_abon = tsk.abon
|
|
|
|
try:
|
|
if request.method == 'POST':
|
|
tsk.author = request.user
|
|
frm = TaskFrm(request.POST, request.FILES, instance=tsk)
|
|
|
|
if frm.is_valid():
|
|
task_instance = frm.save()
|
|
# получим абонента, выбранного в форме
|
|
selected_abon = task_instance.abon
|
|
if selected_abon:
|
|
# получаем аккаунты назначенные на группу выбранного абонента
|
|
profiles = selected_abon.group.profiles.filter(is_active=True).filter(is_admin=True)
|
|
|
|
# если нашли кого-нибудь
|
|
if profiles.count() > 0:
|
|
# выбираем их id в базе
|
|
profile_ids = [prof.id for prof in profiles]
|
|
# добавляем найденных работников в задачу
|
|
task_instance.recipients.add(*profile_ids)
|
|
# окончательно сохраняемся
|
|
task_instance.save()
|
|
return redirect('taskapp:home')
|
|
else:
|
|
messages.error(request, _('No responsible employee for the users group'))
|
|
else:
|
|
messages.error(request, _('You must select the subscriber'))
|
|
else:
|
|
messages.error(request, _('Error in the form fields'))
|
|
elif uid:
|
|
selected_abon = Abon.objects.get(username=str(uid))
|
|
except Abon.DoesNotExist:
|
|
messages.warning(request, _("User does not exist"))
|
|
except MultipleException as errs:
|
|
for err in errs.err_list:
|
|
messages.add_message(request, messages.constants.ERROR, err)
|
|
except TaskException as e:
|
|
messages.error(request, e)
|
|
|
|
return render(request, 'taskapp/add_edit_task.html', {
|
|
'form': frm,
|
|
'task_id': tsk.id,
|
|
'selected_abon': selected_abon
|
|
})
|
|
|
|
|
|
@login_required
|
|
@only_admins
|
|
def task_finish(request, task_id):
|
|
try:
|
|
task = get_object_or_404(Task, id=task_id)
|
|
task.finish(request.user)
|
|
except MultipleException as errs:
|
|
for err in errs.err_list:
|
|
messages.add_message(request, messages.constants.ERROR, err)
|
|
except TaskException as e:
|
|
messages.error(request, e)
|
|
return redirect('taskapp:home')
|
|
|
|
|
|
@login_required
|
|
@only_admins
|
|
def task_failed(request, task_id):
|
|
try:
|
|
task = get_object_or_404(Task, id=task_id)
|
|
task.do_fail(request.user)
|
|
except TaskException as e:
|
|
messages.error(request, e)
|
|
return redirect('taskapp:home')
|
|
|
|
|
|
@login_required
|
|
@permission_required('taskapp.can_remind')
|
|
def remind(request, task_id):
|
|
try:
|
|
task = get_object_or_404(Task, id=task_id)
|
|
task.save(update_fields=['state'])
|
|
except MultipleException as errs:
|
|
for err in errs.err_list:
|
|
messages.add_message(request, messages.constants.ERROR, err)
|
|
except TaskException as e:
|
|
messages.error(request, e)
|
|
return redirect('taskapp:home')
|
|
|
|
|
|
def check_news(request):
|
|
if request.user.is_authenticated and request.user.is_admin:
|
|
msg = MessageQueue.objects.pop(user=request.user, tag='taskap')
|
|
if msg is not None:
|
|
r = {
|
|
'auth': True,
|
|
'exist': True,
|
|
'content': msg,
|
|
'title': _('Task')
|
|
}
|
|
else:
|
|
r = {'auth': True, 'exist': False}
|
|
else:
|
|
r = {'auth': False}
|
|
return HttpResponse(dumps(r))
|