From 54671ca6809ed925873c03eda8eb3adb5866ccd1 Mon Sep 17 00:00:00 2001 From: bashmak Date: Fri, 9 Feb 2018 16:49:10 +0300 Subject: [PATCH] Refactoring function views to ClassBasedViews --- dialing_app/models.py | 6 +- dialing_app/templates/index.html | 2 +- dialing_app/templates/vmail.html | 2 +- dialing_app/urls.py | 10 +- dialing_app/views.py | 142 +++++++++--------- taskapp/templates/taskapp/tasklist_all.html | 2 +- .../templates/taskapp/tasklist_finish.html | 19 ++- taskapp/templates/taskapp/tasklist_own.html | 21 ++- taskapp/urls.py | 8 +- taskapp/views.py | 71 +++++---- 10 files changed, 155 insertions(+), 128 deletions(-) diff --git a/dialing_app/models.py b/dialing_app/models.py index 15575da..e191eb2 100644 --- a/dialing_app/models.py +++ b/dialing_app/models.py @@ -62,11 +62,14 @@ class AsteriskCDR(models.Model): def url(self): if type(self.calldate) is datetime: - return "%s/%s-%s-%s.wav" % (self.path_to_media(), self.calldate.strftime('%Y/%m/%d/%H_%M'), self.src, self.dst) + return "%s/%s-%s-%s.wav" % ( + self.path_to_media(), self.calldate.strftime('%Y/%m/%d/%H_%M'), self.src, self.dst + ) class Meta: db_table = 'cdr' managed = False + ordering = ['-calldate'] class SMSModel(models.Model): @@ -82,6 +85,7 @@ class SMSModel(models.Model): ) verbose_name = _('SMS') verbose_name_plural = _('SMS') + ordering = ['-when'] def __str__(self): return self.text diff --git a/dialing_app/templates/index.html b/dialing_app/templates/index.html index 5505504..7f76034 100644 --- a/dialing_app/templates/index.html +++ b/dialing_app/templates/index.html @@ -85,6 +85,6 @@ - {% include 'toolbar_page.html' with pag=logs %} + {% include 'pagination.html' %} {% endblock %} diff --git a/dialing_app/templates/vmail.html b/dialing_app/templates/vmail.html index f995ca0..94981ba 100644 --- a/dialing_app/templates/vmail.html +++ b/dialing_app/templates/vmail.html @@ -46,6 +46,6 @@ - {% include 'toolbar_page.html' with pag=vmessages %} + {% include 'pagination.html' %} {% endblock %} diff --git a/dialing_app/urls.py b/dialing_app/urls.py index 1e58276..9b18adf 100644 --- a/dialing_app/urls.py +++ b/dialing_app/urls.py @@ -6,11 +6,11 @@ app_name = 'dialing_app' urlpatterns = [ - url(r'^$', views.home, name='home'), - url(r'^filter$', views.vfilter, name='vfilter'), + url(r'^$', views.LastCallsListView.as_view(), name='home'), + url(r'^filter$', views.DialsFilterListView.as_view(), name='vfilter'), url(r'^to_abon(?P\+?\d+)$', views.to_abon, name='to_abon'), - url(r'^requests$', views.vmail_request, name='vmail_request'), - url(r'^reports$', views.vmail_report, name='vmail_report'), - url(r'^sms/in$', views.inbox_sms, name='inbox_sms'), + url(r'^requests$', views.VoiceMailRequestsListView.as_view(), name='vmail_request'), + url(r'^reports$', views.VoiceMailReportsListView.as_view(), name='vmail_report'), + url(r'^sms/in$', views.InboxSMSListView.as_view(), name='inbox_sms'), url(r'^sms/send$', views.send_sms, name='send_sms') ] diff --git a/dialing_app/views.py b/dialing_app/views.py index 700336f..04c7a23 100644 --- a/dialing_app/views.py +++ b/dialing_app/views.py @@ -5,8 +5,11 @@ from django.contrib import messages from django.contrib.gis.shortcuts import render_to_text from django.shortcuts import render, redirect from django.utils.translation import gettext_lazy as _ +from django.utils.decorators import method_decorator +from django.views.generic import ListView from guardian.decorators import permission_required_or_403 as permission_required from django.db.models import Q +from django.conf import settings from abonapp.models import Abon from mydefs import only_admins, pag_mn @@ -14,16 +17,21 @@ from .models import AsteriskCDR, SMSModel from .forms import SMSOutForm -@login_required -@permission_required('dialing_app.change_asteriskcdr') -def home(request): - logs = AsteriskCDR.objects.exclude(userfield='request').order_by('-calldate') - logs = pag_mn(request, logs) - title = _('Last calls') - return render(request, 'index.html', { - 'logs': logs, - 'title': title - }) +class BaseListView(ListView): + http_method_names = ['get'] + paginate_by = getattr(settings, 'PAGINATION_ITEMS_PER_PAGE', 10) + + +@method_decorator([login_required, permission_required('dialing_app.change_asteriskcdr')], name='dispatch') +class LastCallsListView(BaseListView): + template_name = 'index.html' + context_object_name = 'logs' + queryset = AsteriskCDR.objects.exclude(userfield='request') + + def get_context_data(self, **kwargs): + context = super(LastCallsListView, self).get_context_data(**kwargs) + context['title'] = _('Last calls') + return context @login_required @@ -43,69 +51,67 @@ def to_abon(request, tel): return redirect('abonapp:group_list') -@login_required -@only_admins -def vmail_request(request): - title = _('Voice mail request') - cdr = AsteriskCDR.objects.filter(userfield='request').order_by('-calldate') - cdr = pag_mn(request, cdr) - return render(request, 'vmail.html', { - 'title': title, - 'vmessages': cdr - }) +@method_decorator([login_required, only_admins], name='dispatch') +class VoiceMailRequestsListView(BaseListView): + template_name = 'vmail.html' + context_object_name = 'vmessages' + queryset = AsteriskCDR.objects.filter(userfield='request') -@login_required -@only_admins -def vmail_report(request): - title = _('Voice mail report') - cdr = AsteriskCDR.objects.filter(userfield='report').order_by('-calldate') - cdr = pag_mn(request, cdr) - return render(request, 'vmail.html', { - 'title': title, - 'vmessages': cdr - }) + def get_context_data(self, **kwargs): + context = super(VoiceMailRequestsListView, self).get_context_data(**kwargs) + context['title'] = _('Voice mail request') + return context -@login_required -@only_admins -def vfilter(request): - cdr_q = None - sd = request.GET.get('sd') - s = request.GET.get('s') - if s: - cdr_q = Q(src__icontains=s) | Q(dst__icontains=s) - - try: - if sd: - sd_date = datetime.strptime(sd, '%Y-%m-%d') - if cdr_q: - cdr_q |= Q(calldate__date=sd_date) - else: - cdr_q = Q(calldate__date=sd_date) - except ValueError: - messages.error(request, _('Make sure that your date format is correct')) +class VoiceMailReportsListView(VoiceMailRequestsListView): + queryset = AsteriskCDR.objects.filter(userfield='report') - if cdr_q is None: - cdr = AsteriskCDR.objects.all() - else: - cdr = AsteriskCDR.objects.filter(cdr_q) - cdr = pag_mn(request, cdr) - return render(request, 'index.html', { - 'logs': cdr, - 'title': _('Find dials'), - 's': s, - 'sd': sd - }) + def get_context_data(self, **kwargs): + context = super(VoiceMailRequestsListView, self).get_context_data(**kwargs) + context['title'] = _('Voice mail report') + return context -@login_required -@permission_required('dialing_app.can_view_sms') -def inbox_sms(request): - msgs = SMSModel.objects.all().order_by('-when') - msgs = pag_mn(request, msgs) - return render(request, 'inbox_sms.html', { - 'sms_messages': msgs - }) +@method_decorator([login_required, only_admins], name='dispatch') +class DialsFilterListView(BaseListView): + context_object_name = 'logs' + template_name = 'index.html' + + def get_context_data(self, **kwargs): + context = super(DialsFilterListView, self).get_context_data(**kwargs) + context['title'] = _('Find dials') + context['s'] = self.request.GET.get('s') + context['sd'] = self.request.GET.get('sd') + return context + + def get_queryset(self): + s = self.request.GET.get('s') + sd = self.request.GET.get('sd') + if isinstance(s, str) and s != '': + cdr_q = Q(src__icontains=s) | Q(dst__icontains=s) + else: + cdr_q = None + try: + if isinstance(sd, str) and sd != '': + sd_date = datetime.strptime(sd, '%Y-%m-%d') + if cdr_q: + cdr_q |= Q(calldate__date=sd_date) + else: + cdr_q = Q(calldate__date=sd_date) + except ValueError: + messages.add_message(self.request, messages.ERROR, _('Make sure that your date format is correct')) + if cdr_q is None: + cdr = AsteriskCDR.objects.all() + else: + cdr = AsteriskCDR.objects.filter(cdr_q) + return cdr + + +@method_decorator([login_required, permission_required('dialing_app.can_view_sms')], name='dispatch') +class InboxSMSListView(BaseListView): + template_name = 'inbox_sms.html' + context_object_name = 'sms_messages' + model = SMSModel @login_required @@ -118,8 +124,8 @@ def send_sms(request): if frm.is_valid(): frm.save() messages.success(request, _('Message was enqueued for sending')) + pidfile_name = '/run/dialing.py.pid' try: - pidfile_name = '/run/dialing.py.pid' with open(pidfile_name, 'r') as f: pid = int(f.read()) run(['/usr/bin/kill', '-SIGUSR1', str(pid)]) diff --git a/taskapp/templates/taskapp/tasklist_all.html b/taskapp/templates/taskapp/tasklist_all.html index 82d5a84..2cc601e 100644 --- a/taskapp/templates/taskapp/tasklist_all.html +++ b/taskapp/templates/taskapp/tasklist_all.html @@ -102,6 +102,6 @@ - {% include 'toolbar_page.html' with pag=tasks %} + {% include 'pagination.html' %} {% endblock %} diff --git a/taskapp/templates/taskapp/tasklist_finish.html b/taskapp/templates/taskapp/tasklist_finish.html index d7b97f8..0656975 100644 --- a/taskapp/templates/taskapp/tasklist_finish.html +++ b/taskapp/templates/taskapp/tasklist_finish.html @@ -36,8 +36,15 @@ {{ task.pk }} {% if task.abon and task.abon.group %} - {{ task.abon.get_full_name }} - {{ task.abon.group.title }}, {{ task.abon.street|default:_('Not assigned') }} {{ task.abon.house|default:_('Not assigned') }} + + + {{ task.abon.get_full_name }} + + + + {{ task.abon.group.title }}, {{ task.abon.street|default:_('Not assigned') }} + {{ task.abon.house|default:_('Not assigned') }} + {% else %} {% trans 'User does not exist' %} --- @@ -45,7 +52,11 @@ {{ task.get_mode_display }} {{ task.descr }} - {{ task.author.username }} + + + {{ task.author.username }} + + {{ task.time_of_create|date:'d E H:i' }} @@ -72,6 +83,6 @@ - {% include 'toolbar_page.html' with pag=tasks %} + {% include 'pagination.html' %} {% endblock %} diff --git a/taskapp/templates/taskapp/tasklist_own.html b/taskapp/templates/taskapp/tasklist_own.html index 91901cd..15f4120 100644 --- a/taskapp/templates/taskapp/tasklist_own.html +++ b/taskapp/templates/taskapp/tasklist_own.html @@ -17,6 +17,7 @@ + {% with can_change_task=perms.taskapp.change_task can_remind=perms.taskapp.can_remind can_del_task=perms.taskapp.delete_task %} {% for task in tasks %} {% if task.is_relevant %} @@ -36,8 +37,15 @@ {{ task.id }} {% if task.abon and task.abon.group %} - {{ task.abon.get_full_name }} - {{ task.abon.group.title }}, {{ task.abon.street|default:_('Not assigned') }} {{ task.abon.house|default:_('Not assigned') }} + + + {{ task.abon.get_full_name }} + + + + {{ task.abon.group.title }}, {{ task.abon.street|default:_('Not assigned') }} + {{ task.abon.house|default:_('Not assigned') }} + {% else %} {% trans 'User does not exist' %} --- @@ -49,17 +57,17 @@ {{ task.time_of_create|date:'d E H:i' }} - {% if perms.taskapp.change_task %} + {% if can_change_task %} {% endif %} - {% if perms.taskapp.can_remind %} + {% if can_remind %} {% endif %} - {% if perms.taskapp.delete_task %} + {% if can_del_task %} @@ -71,6 +79,7 @@ {% trans 'All your tasks has been performed' %} {% endfor %} + {% endwith %} @@ -82,6 +91,6 @@ - {% include 'toolbar_page.html' with pag=tasks %} + {% include 'pagination.html' %} {% endblock %} diff --git a/taskapp/urls.py b/taskapp/urls.py index 802a4fe..2c6ca34 100644 --- a/taskapp/urls.py +++ b/taskapp/urls.py @@ -16,9 +16,9 @@ urlpatterns = [ url(r'^(?P\d+)/remind', views.remind, name='remind'), url(r'^add$', views.task_add_edit, name='add'), url(r'^failed$', views.FailedTasksView.as_view(), name='failed_tasks'), - url(r'^finished$', views.finished_tasks, name='finished_tasks'), - url(r'^own$', views.own_tasks, name='own_tasks'), - url(r'^my$', views.my_tasks, name='my_tasks'), - url(r'^all$', views.all_tasks, name='all_tasks'), + url(r'^finished$', views.FinishedTaskListView.as_view(), name='finished_tasks'), + url(r'^own$', views.OwnTaskListView.as_view(), name='own_tasks'), + url(r'^my$', views.MyTaskListView.as_view(), name='my_tasks'), + url(r'^all$', views.AllTasksListView.as_view(), name='all_tasks'), url(r'^check_news$', views.check_news, name='check_news') ] diff --git a/taskapp/views.py b/taskapp/views.py index bef4f0e..9f30f20 100644 --- a/taskapp/views.py +++ b/taskapp/views.py @@ -16,7 +16,7 @@ from chatbot.models import MessageQueue from abonapp.models import Abon from .handle import TaskException from .models import Task -from mydefs import pag_mn, only_admins, safe_int, MultipleException, RuTimedelta +from mydefs import only_admins, safe_int, MultipleException, RuTimedelta from .forms import TaskFrm @@ -34,11 +34,11 @@ class NewTasksView(BaseTaskListView): context_object_name = 'tasks' def get_queryset(self): - return Task.objects.filter(recipients=self.request.user, state='S') + return Task.objects.filter(recipients=self.request.user, state='S') \ + .select_related('abon', 'abon__street', 'abon__group', 'author') -@method_decorator([login_required, only_admins], name='dispatch') -class FailedTasksView(BaseTaskListView): +class FailedTasksView(NewTasksView): """ Show crashed tasks """ @@ -46,47 +46,44 @@ class FailedTasksView(BaseTaskListView): context_object_name = 'tasks' def get_queryset(self): - return Task.objects.filter(recipients=self.request.user, state='C') + return Task.objects.filter(recipients=self.request.user, state='C') \ + .select_related('abon', 'abon__street', 'abon__group', 'author') -@login_required -@only_admins -def finished_tasks(request): - tasks = Task.objects.filter(recipients=request.user, state='F') # Выполненные - tasks = pag_mn(request, tasks) - return render(request, 'taskapp/tasklist_finish.html', { - 'tasks': tasks - }) +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') -@login_required -@only_admins -def own_tasks(request): - tasks = Task.objects.filter(author=request.user).exclude(state='F') # Назначенные мной и не законченная - tasks = pag_mn(request, tasks) - return render(request, 'taskapp/tasklist_own.html', { - 'tasks': tasks - }) +class OwnTaskListView(NewTasksView): + template_name = 'taskapp/tasklist_own.html' -@login_required -@only_admins -def my_tasks(request): - tasks = Task.objects.filter(recipients=request.user) # Задачи где я учавствовал - tasks = pag_mn(request, tasks) - return render(request, 'taskapp/tasklist.html', { - 'tasks': tasks - }) + 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') -@login_required -@permission_required('taskapp.can_viewall') -def all_tasks(request): - tasks = Task.objects.all() - tasks = pag_mn(request, tasks) - return render(request, 'taskapp/tasklist_all.html', { - 'tasks': tasks - }) +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