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): def url(self):
if type(self.calldate) is datetime: 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: class Meta:
db_table = 'cdr' db_table = 'cdr'
managed = False managed = False
ordering = ['-calldate']
class SMSModel(models.Model): class SMSModel(models.Model):
@ -82,6 +85,7 @@ class SMSModel(models.Model):
) )
verbose_name = _('SMS') verbose_name = _('SMS')
verbose_name_plural = _('SMS') verbose_name_plural = _('SMS')
ordering = ['-when']
def __str__(self): def __str__(self):
return self.text return self.text

2
dialing_app/templates/index.html

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

2
dialing_app/templates/vmail.html

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

10
dialing_app/urls.py

@ -6,11 +6,11 @@ app_name = 'dialing_app'
urlpatterns = [ 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'^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') 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.contrib.gis.shortcuts import render_to_text
from django.shortcuts import render, redirect from django.shortcuts import render, redirect
from django.utils.translation import gettext_lazy as _ 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 guardian.decorators import permission_required_or_403 as permission_required
from django.db.models import Q from django.db.models import Q
from django.conf import settings
from abonapp.models import Abon from abonapp.models import Abon
from mydefs import only_admins, pag_mn from mydefs import only_admins, pag_mn
@ -14,16 +17,21 @@ from .models import AsteriskCDR, SMSModel
from .forms import SMSOutForm 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 @login_required
@ -43,69 +51,67 @@ def to_abon(request, tel):
return redirect('abonapp:group_list') 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 @login_required
@ -118,8 +124,8 @@ def send_sms(request):
if frm.is_valid(): if frm.is_valid():
frm.save() frm.save()
messages.success(request, _('Message was enqueued for sending')) messages.success(request, _('Message was enqueued for sending'))
pidfile_name = '/run/dialing.py.pid'
try: try:
pidfile_name = '/run/dialing.py.pid'
with open(pidfile_name, 'r') as f: with open(pidfile_name, 'r') as f:
pid = int(f.read()) pid = int(f.read())
run(['/usr/bin/kill', '-SIGUSR1', str(pid)]) run(['/usr/bin/kill', '-SIGUSR1', str(pid)])

2
taskapp/templates/taskapp/tasklist_all.html

@ -102,6 +102,6 @@
</table> </table>
</div> </div>
{% include 'toolbar_page.html' with pag=tasks %}
{% include 'pagination.html' %}
{% endblock %} {% 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> <td class="hidden-xs"><a href="{% url 'taskapp:view' task.pk %}">{{ task.pk }}</a></td>
{% if task.abon and task.abon.group %} {% 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 %} {% else %}
<td>{% trans 'User does not exist' %}</td> <td>{% trans 'User does not exist' %}</td>
<td>---</td> <td>---</td>
@ -45,7 +52,11 @@
<td>{{ task.get_mode_display }}</td> <td>{{ task.get_mode_display }}</td>
<td>{{ task.descr }}</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 class="hidden-xs">{{ task.time_of_create|date:'d E H:i' }}</td>
<td> <td>
@ -72,6 +83,6 @@
</table> </table>
</div> </div>
{% include 'toolbar_page.html' with pag=tasks %}
{% include 'pagination.html' %}
{% endblock %} {% endblock %}

21
taskapp/templates/taskapp/tasklist_own.html

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

8
taskapp/urls.py

@ -16,9 +16,9 @@ urlpatterns = [
url(r'^(?P<task_id>\d+)/remind', views.remind, name='remind'), url(r'^(?P<task_id>\d+)/remind', views.remind, name='remind'),
url(r'^add$', views.task_add_edit, name='add'), url(r'^add$', views.task_add_edit, name='add'),
url(r'^failed$', views.FailedTasksView.as_view(), name='failed_tasks'), 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') 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 abonapp.models import Abon
from .handle import TaskException from .handle import TaskException
from .models import Task 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 from .forms import TaskFrm
@ -34,11 +34,11 @@ class NewTasksView(BaseTaskListView):
context_object_name = 'tasks' context_object_name = 'tasks'
def get_queryset(self): 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 Show crashed tasks
""" """
@ -46,47 +46,44 @@ class FailedTasksView(BaseTaskListView):
context_object_name = 'tasks' context_object_name = 'tasks'
def get_queryset(self): 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 @login_required

Loading…
Cancel
Save