Browse Source

Refactoring function views to ClassBasedViews

devel
bashmak 8 years ago
parent
commit
54671ca680
  1. 6
      dialing_app/models.py
  2. 2
      dialing_app/templates/index.html
  3. 2
      dialing_app/templates/vmail.html
  4. 10
      dialing_app/urls.py
  5. 142
      dialing_app/views.py
  6. 2
      taskapp/templates/taskapp/tasklist_all.html
  7. 19
      taskapp/templates/taskapp/tasklist_finish.html
  8. 21
      taskapp/templates/taskapp/tasklist_own.html
  9. 8
      taskapp/urls.py
  10. 71
      taskapp/views.py

6
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

2
dialing_app/templates/index.html

@ -85,6 +85,6 @@
</table>
</div>
{% include 'toolbar_page.html' with pag=logs %}
{% include 'pagination.html' %}
{% endblock %}

2
dialing_app/templates/vmail.html

@ -46,6 +46,6 @@
</table>
</div>
{% include 'toolbar_page.html' with pag=vmessages %}
{% include 'pagination.html' %}
{% endblock %}

10
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<tel>\+?\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')
]

142
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)])

2
taskapp/templates/taskapp/tasklist_all.html

@ -102,6 +102,6 @@
</table>
</div>
{% include 'toolbar_page.html' with pag=tasks %}
{% include 'pagination.html' %}
{% endblock %}

19
taskapp/templates/taskapp/tasklist_finish.html

@ -36,8 +36,15 @@
<td class="hidden-xs"><a href="{% url 'taskapp:view' task.pk %}">{{ task.pk }}</a></td>
{% if task.abon and task.abon.group %}
<td><a href="{% url 'abonapp:abon_home' task.abon.group.pk task.abon.pk %}">{{ task.abon.get_full_name }}</a></td>
<td>{{ task.abon.group.title }}, {{ task.abon.street|default:_('Not assigned') }} {{ task.abon.house|default:_('Not assigned') }}</td>
<td>
<a href="{% url 'abonapp:abon_home' task.abon.group.pk task.abon.pk %}">
{{ task.abon.get_full_name }}
</a>
</td>
<td>
{{ task.abon.group.title }}, {{ task.abon.street|default:_('Not assigned') }}
{{ task.abon.house|default:_('Not assigned') }}
</td>
{% else %}
<td>{% trans 'User does not exist' %}</td>
<td>---</td>
@ -45,7 +52,11 @@
<td>{{ task.get_mode_display }}</td>
<td>{{ task.descr }}</td>
<td><a href="{% url 'acc_app:other_profile' task.author.pk %}" data-toggle="tooltip" title="{{ task.author.get_full_name }}">{{ task.author.username }}</a></td>
<td>
<a href="{% url 'acc_app:other_profile' task.author.pk %}" data-toggle="tooltip" title="{{ task.author.get_full_name }}">
{{ task.author.username }}
</a>
</td>
<td class="hidden-xs">{{ task.time_of_create|date:'d E H:i' }}</td>
<td>
@ -72,6 +83,6 @@
</table>
</div>
{% include 'toolbar_page.html' with pag=tasks %}
{% include 'pagination.html' %}
{% endblock %}

21
taskapp/templates/taskapp/tasklist_own.html

@ -17,6 +17,7 @@
</tr>
</thead>
<tbody>
{% 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 @@
<td class="hidden-xs"><a href="{% url 'taskapp:view' task.id %}">{{ task.id }}</a></td>
{% if task.abon and task.abon.group %}
<td><a href="{% url 'abonapp:abon_home' task.abon.group.pk task.abon.pk %}">{{ task.abon.get_full_name }}</a></td>
<td>{{ task.abon.group.title }}, {{ task.abon.street|default:_('Not assigned') }} {{ task.abon.house|default:_('Not assigned') }}</td>
<td>
<a href="{% url 'abonapp:abon_home' task.abon.group.pk task.abon.pk %}">
{{ task.abon.get_full_name }}
</a>
</td>
<td>
{{ task.abon.group.title }}, {{ task.abon.street|default:_('Not assigned') }}
{{ task.abon.house|default:_('Not assigned') }}
</td>
{% else %}
<td>{% trans 'User does not exist' %}</td>
<td>---</td>
@ -49,17 +57,17 @@
<td class="hidden-xs">{{ task.time_of_create|date:'d E H:i' }}</td>
<td class="btn-group btn-group-justified">
{% if perms.taskapp.change_task %}
{% if can_change_task %}
<a href="{% url 'taskapp:edit' task.id %}" class="btn btn-sm btn-default" title="{% trans 'Edit' %}">
<span class="glyphicon glyphicon-edit"></span>
</a>
{% endif %}
{% if perms.taskapp.can_remind %}
{% if can_remind %}
<a href="{% url 'taskapp:remind' task.id %}" class="btn btn-default btn-sm" title="{% trans 'Remind' %}">
<span class="glyphicon glyphicon-bell"></span>
</a>
{% endif %}
{% if perms.taskapp.delete_task %}
{% if can_del_task %}
<a href="{% url 'taskapp:delete' task.id %}" class="btn btn-sm btn-danger" title="{% trans 'Delete' %}">
<span class="glyphicon glyphicon-remove-circle"></span>
</a>
@ -71,6 +79,7 @@
<td colspan="8">{% trans 'All your tasks has been performed' %}</td>
</tr>
{% endfor %}
{% endwith %}
</tbody>
<tfoot>
<tr>
@ -82,6 +91,6 @@
</table>
</div>
{% include 'toolbar_page.html' with pag=tasks %}
{% include 'pagination.html' %}
{% endblock %}

8
taskapp/urls.py

@ -16,9 +16,9 @@ urlpatterns = [
url(r'^(?P<task_id>\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')
]

71
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

Loading…
Cancel
Save