diff --git a/abonapp/locale/ru/LC_MESSAGES/django.po b/abonapp/locale/ru/LC_MESSAGES/django.po index aba5fa3..8368e28 100644 --- a/abonapp/locale/ru/LC_MESSAGES/django.po +++ b/abonapp/locale/ru/LC_MESSAGES/django.po @@ -403,46 +403,6 @@ msgstr "Автор" msgid "Debts not found" msgstr "Нет должников" -#: templates/abonapp/dial_log.html:8 -msgid "Play" -msgstr "Слушать" - -#: templates/abonapp/dial_log.html:9 -msgid "calldate" -msgstr "дата звонка" - -#: templates/abonapp/dial_log.html:10 -msgid "src" -msgstr "кто" - -#: templates/abonapp/dial_log.html:11 -msgid "dst" -msgstr "куда" - -#: templates/abonapp/dial_log.html:12 -msgid "duration" -msgstr "прод." - -#: templates/abonapp/dial_log.html:13 -msgid "start" -msgstr "начало" - -#: templates/abonapp/dial_log.html:14 -msgid "answer" -msgstr "ответ" - -#: templates/abonapp/dial_log.html:15 -msgid "end" -msgstr "конец" - -#: templates/abonapp/dial_log.html:16 -msgid "disposition" -msgstr "состояние" - -#: templates/abonapp/dial_log.html:38 -msgid "Calls was not found" -msgstr "Звонки не найдены" - #: templates/abonapp/editAbon.html:10 msgid "Change subscriber" msgstr "Изменение абонента" diff --git a/abonapp/templates/abonapp/dial_log.html b/abonapp/templates/abonapp/dial_log.html deleted file mode 100644 index 55ecdca..0000000 --- a/abonapp/templates/abonapp/dial_log.html +++ /dev/null @@ -1,45 +0,0 @@ -{% extends request.is_ajax|yesno:'nullcont.htm,abonapp/ext.htm' %} -{% load i18n %} -{% block content %} - - - - - - - - - - - - - - - - - {% for log in logs %} - - - - - - - - - - - - {% empty %} - - - - {% endfor %} - - -
{% trans 'Play' %}{% trans 'calldate' %}{% trans 'src' %}{% trans 'dst' %}{% trans 'duration' %}{% trans 'start' %}{% trans 'answer' %}{% trans 'end' %}{% trans 'disposition' %}
- - {{ log.calldate|date:'d E Y, H:i:s' }}{{ log.src }}{{ log.dst }}{{ log.duration }}{{ log.start|date:'d E Y, H:i:s' }}{{ log.answer|date:'d E Y, H:i:s' }}{{ log.end|date:'d E Y, H:i:s' }}{{ log.locate_disposition }}
{% trans 'Calls was not found' %}
- -{% endblock %} diff --git a/abonapp/templates/abonapp/editAbon.html b/abonapp/templates/abonapp/editAbon.html index 899d842..3e6ea60 100644 --- a/abonapp/templates/abonapp/editAbon.html +++ b/abonapp/templates/abonapp/editAbon.html @@ -83,16 +83,6 @@ {% endif %} - {% if perms.dialing_app.add_smsout %} - - {% trans 'Send sms' %} - - {% else %} - - {% trans 'Send sms' %} - - {% endif %} - {% if perms.abonapp.view_passportinfo %} {% trans 'Passport information' %} diff --git a/abonapp/templates/abonapp/ext.htm b/abonapp/templates/abonapp/ext.htm index 6d45196..b3cfdae 100644 --- a/abonapp/templates/abonapp/ext.htm +++ b/abonapp/templates/abonapp/ext.htm @@ -39,11 +39,6 @@ {% trans 'History of tasks' %} - {% url 'abonapp:dials' group.pk abon.username as abdials %} - - {% trans 'Dialing' %} - -
diff --git a/abonapp/urls.py b/abonapp/urls.py index ac1c048..559115f 100644 --- a/abonapp/urls.py +++ b/abonapp/urls.py @@ -13,7 +13,6 @@ subscriber_patterns = [ path('addinvoice/', views.add_invoice, name='add_invoice'), path('pick/', views.pick_tariff, name='pick_tariff'), path('passport_view/', views.PassportUpdateView.as_view(), name='passport_view'), - path('dials/', views.DialsListView.as_view(), name='dials'), # path('reset_ip/', views.reset_ip, name='reset_ip'), path('unsubscribe_service//', views.unsubscribe_service, name='unsubscribe_service'), path('dev/', views.dev, name='dev'), diff --git a/abonapp/views.py b/abonapp/views.py index 2b58da4..55b3b26 100644 --- a/abonapp/views.py +++ b/abonapp/views.py @@ -4,7 +4,6 @@ from typing import Dict, Optional from abonapp.tasks import customer_nas_command, customer_nas_remove from agent.commands.dhcp import dhcp_commit, dhcp_expiry, dhcp_release from devapp.models import Device, Port as DevPort -from dialing_app.models import AsteriskCDR from django.conf import settings from django.contrib import messages from django.contrib.auth.decorators import login_required @@ -818,60 +817,6 @@ def vcards(r): return response -class DialsListView(LoginRequiredMixin, OnlyAdminsMixin, OrderedFilteredList): - context_object_name = 'logs' - template_name = 'abonapp/dial_log.html' - - def get_queryset(self): - abon = get_object_or_404(models.Abon, - username=self.kwargs.get('uname')) - if not self.request.user.has_perm('group_app.view_group', abon.group): - raise PermissionDenied - self.abon = abon - if abon.telephone is not None and abon.telephone != '': - tel = abon.telephone.replace('+', '') - additional_tels = tuple( - t.telephone for t in - models.AdditionalTelephone.objects.filter( - abon=abon - ).iterator() - ) - logs = AsteriskCDR.objects.filter( - Q(src__contains=tel) | Q(dst__contains=tel) | - Q(src__in=additional_tels) | Q(dst__in=additional_tels) - ) - return logs - else: - return AsteriskCDR.objects.none() - - def get_context_data(self, **kwargs): - context = super(DialsListView, self).get_context_data(**kwargs) - context['group'] = get_object_or_404(Group, pk=self.kwargs.get('gid')) - context['abon'] = self.abon - return context - - def render_to_response(self, context, **response_kwargs): - if hasattr(self.abon.group, 'pk') and self.abon.group.pk != int( - self.kwargs.get('gid')): - return redirect( - 'abonapp:dials', self.abon.group.pk, - self.abon.username - ) - return super(DialsListView, self).render_to_response( - context, - **response_kwargs - ) - - def get(self, request, *args, **kwargs): - try: - return super(DialsListView, self).get(request, *args, **kwargs) - except ProgrammingError as e: - messages.error(request, e) - return redirect('abonapp:abon_home', - self.kwargs.get('gid'), - self.kwargs.get('uname')) - - @login_required @only_admins @permission_required('abonapp.change_abon') diff --git a/dialing_app/__init__.py b/dialing_app/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/dialing_app/admin.py b/dialing_app/admin.py deleted file mode 100644 index 8c38f3f..0000000 --- a/dialing_app/admin.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.contrib import admin - -# Register your models here. diff --git a/dialing_app/apps.py b/dialing_app/apps.py deleted file mode 100644 index 42a981b..0000000 --- a/dialing_app/apps.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.apps import AppConfig - - -class DialingAppConfig(AppConfig): - name = 'dialing_app' diff --git a/dialing_app/forms.py b/dialing_app/forms.py deleted file mode 100644 index a863bc7..0000000 --- a/dialing_app/forms.py +++ /dev/null @@ -1,8 +0,0 @@ -from django import forms -from .models import SMSOut - - -class SMSOutForm(forms.ModelForm): - class Meta: - model = SMSOut - fields = ('dst', 'text') diff --git a/dialing_app/locale/ru/LC_MESSAGES/django.po b/dialing_app/locale/ru/LC_MESSAGES/django.po deleted file mode 100644 index e76d39e..0000000 --- a/dialing_app/locale/ru/LC_MESSAGES/django.po +++ /dev/null @@ -1,172 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Dmitry Novikov nerosketch@gmail.com, 2017. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-08-09 14:59+0300\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Dmitry Novikov nerosketch@gmail.com\n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" -"%100>=11 && n%100<=14)? 2 : 3);\n" - -#: models.py:9 models.py:44 -msgid "No answer" -msgstr "Не отвечен" - -#: models.py:10 models.py:46 models.py:101 -msgid "Failed" -msgstr "С ошибкой" - -#: models.py:11 models.py:48 -msgid "Busy" -msgstr "Занято" - -#: models.py:12 models.py:50 -msgid "Answered" -msgstr "Отвечен" - -#: models.py:13 models.py:52 -msgid "Unknown" -msgstr "Не определён" - -#: models.py:86 models.py:87 -msgid "SMS" -msgstr "СМС" - -#: models.py:95 -msgid "When" -msgstr "Когда" - -#: models.py:96 templates/index.html:25 -msgid "Telephone" -msgstr "Телефон" - -#: models.py:97 -msgid "Text" -msgstr "Текст" - -#: models.py:99 -msgid "New" -msgstr "Новое" - -#: models.py:100 -msgid "Sent" -msgstr "Отправленное" - -#: models.py:103 -msgid "Status" -msgstr "Статус" - -#: models.py:111 models.py:112 -msgid "Out SMS" -msgstr "Исходящие СМС" - -#: templates/ext.html:8 templates/ext.html:25 views.py:45 -msgid "Last calls" -msgstr "Последние звонки" - -#: templates/ext.html:32 views.py:74 -msgid "Voice mail request" -msgstr "Заявки на подключение" - -#: templates/ext.html:39 views.py:83 -msgid "Voice mail report" -msgstr "Заявки на поломки" - -#: templates/ext.html:46 templates/inbox_sms.html:7 -msgid "Inbox sms" -msgstr "Входящие смс" - -#: templates/inbox_sms.html:23 -msgid "Message history is empty" -msgstr "История сообщений пуста" - -#: templates/inbox_sms.html:31 templates/modal_send_sms.html:5 -msgid "Send sms" -msgstr "Отправить смс" - -#: templates/index.html:9 templates/vmail.html:10 -msgid "Play" -msgstr "Слушать" - -#: templates/index.html:10 templates/index.html:36 templates/vmail.html:11 -msgid "calldate" -msgstr "дата звонка" - -#: templates/index.html:11 templates/vmail.html:12 -msgid "src" -msgstr "кто" - -#: templates/index.html:12 -msgid "dst" -msgstr "куда" - -#: templates/index.html:13 templates/vmail.html:13 -msgid "duration" -msgstr "продолжительность" - -#: templates/index.html:14 templates/vmail.html:14 -msgid "start" -msgstr "начало" - -#: templates/index.html:15 templates/vmail.html:15 -msgid "answer" -msgstr "ответ" - -#: templates/index.html:16 templates/vmail.html:16 -msgid "end" -msgstr "конец" - -#: templates/index.html:17 templates/vmail.html:17 -msgid "disposition" -msgstr "состояние" - -#: templates/index.html:23 views.py:94 -msgid "Find dials" -msgstr "Найти звонки" - -#: templates/index.html:34 -msgid "Find by dates" -msgstr "Найти по дате" - -#: templates/index.html:64 -msgid "Download" -msgstr "Скачать" - -#: templates/index.html:80 templates/vmail.html:42 -msgid "Calls was not found" -msgstr "Звонки не найдены" - -#: templates/modal_send_sms.html:19 -msgid "Send" -msgstr "Отправить" - -#: views.py:55 -msgid "Multiple users with the telephone number" -msgstr "Несколько абонентов с указанным номером телефона" - -#: views.py:57 -msgid "User with the telephone number not found" -msgstr "Абонент с таким номером телефона не найден" - -#: views.py:114 -msgid "Make sure that your date format is correct" -msgstr "Убедитесь что формат времени корректен" - -#: views.py:138 -msgid "Message was enqueued for sending" -msgstr "Сообщение было поставлено в очередь для отправки" - -#: views.py:151 -msgid "fix form errors" -msgstr "Некоторые поля заполнены не правильно, проверте ещё раз" diff --git a/dialing_app/migrations/0001_initial.py b/dialing_app/migrations/0001_initial.py deleted file mode 100644 index a5c814a..0000000 --- a/dialing_app/migrations/0001_initial.py +++ /dev/null @@ -1,81 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-26 00:20 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='AsteriskCDR', - fields=[ - ('calldate', models.DateTimeField(default='0000-00-00 00:00:00', primary_key=True, serialize=False)), - ('clid', models.CharField(default='', max_length=80)), - ('src', models.CharField(default='', max_length=80)), - ('dst', models.CharField(default='', max_length=80)), - ('dcontext', models.CharField(default='', max_length=80)), - ('channel', models.CharField(default='', max_length=80)), - ('dstchannel', models.CharField(default='', max_length=80)), - ('lastapp', models.CharField(default='', max_length=80)), - ('lastdata', models.CharField(default='', max_length=80)), - ('duration', models.IntegerField(default=0)), - ('billsec', models.IntegerField(default=0)), - ('start', models.DateTimeField(blank=True, default=None, null=True)), - ('answer', models.DateTimeField(blank=True, default=None, null=True)), - ('end', models.DateTimeField(blank=True, default=None, null=True)), - ('disposition', models.CharField( - choices=[('NO ANSWER', 'No answer'), ('FAILED', 'Failed'), ('BUSY', 'Busy'), - ('ANSWERED', 'Answered'), ('UNKNOWN', 'Unknown')], default='', max_length=45)), - ('amaflags', models.IntegerField(default=0)), - ('accountcode', models.CharField(default='', max_length=20)), - ('userfield', models.CharField(default='', max_length=255)), - ('uniqueid', models.CharField(default='', max_length=32)), - ], - options={ - 'db_table': 'cdr', - 'ordering': ['-calldate'], - 'managed': False, - }, - ), - migrations.CreateModel( - name='SMSModel', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('when', models.DateTimeField(auto_now_add=True)), - ('who', models.CharField(max_length=32)), - ('dev', models.CharField(max_length=20)), - ('text', models.CharField(max_length=255)), - ], - options={ - 'verbose_name': 'SMS', - 'verbose_name_plural': 'SMS', - 'db_table': 'sms', - 'ordering': ['-when'], - 'permissions': (('can_view_sms', 'Can view sms'),), - }, - ), - migrations.CreateModel( - name='SMSOut', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('when', models.DateTimeField(auto_now_add=True, verbose_name='When')), - ('dst', models.CharField(max_length=16, verbose_name='Telephone')), - ('text', models.CharField(max_length=255, verbose_name='Text')), - ('status', - models.CharField(choices=[('nw', 'New'), ('st', 'Sent'), ('fd', 'Failed')], default='nw', max_length=2, - verbose_name='Status')), - ], - options={ - 'verbose_name': 'Out SMS', - 'verbose_name_plural': 'Out SMS', - 'db_table': 'out_sms', - 'permissions': (('can_view_sms', 'Can view sms'), ('can_send_sms', 'Can send sms')), - }, - ), - ] diff --git a/dialing_app/migrations/0002_auto_20180808_1236.py b/dialing_app/migrations/0002_auto_20180808_1236.py deleted file mode 100644 index 3de30c6..0000000 --- a/dialing_app/migrations/0002_auto_20180808_1236.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-08-08 12:36 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('dialing_app', '0001_initial'), - ] - - operations = [ - migrations.AlterModelOptions( - name='asteriskcdr', - options={'managed': False, 'ordering': ('-calldate',)}, - ), - migrations.AlterModelOptions( - name='smsmodel', - options={'ordering': ('-when',), 'permissions': (('can_view_sms', 'Can view sms'),), 'verbose_name': 'SMS', 'verbose_name_plural': 'SMS'}, - ), - migrations.AlterModelOptions( - name='smsout', - options={'ordering': ('-when',), 'permissions': (('can_view_sms', 'Can view sms'), ('can_send_sms', 'Can send sms')), 'verbose_name': 'Out SMS', 'verbose_name_plural': 'Out SMS'}, - ), - ] diff --git a/dialing_app/migrations/__init__.py b/dialing_app/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/dialing_app/models.py b/dialing_app/models.py deleted file mode 100644 index 2ece5e5..0000000 --- a/dialing_app/models.py +++ /dev/null @@ -1,109 +0,0 @@ -from django.db import models -from datetime import datetime -from django.utils.translation import gettext_lazy as _ -from django.conf import settings - - -class AsteriskCDR(models.Model): - DISPOSITION_CHOICES = ( - ('NO ANSWER', _('No answer')), - ('FAILED', _('Failed')), - ('BUSY', _('Busy')), - ('ANSWERED', _('Answered')), - ('UNKNOWN', _('Unknown')) - ) - calldate = models.DateTimeField(default='0000-00-00 00:00:00', primary_key=True) - clid = models.CharField(max_length=80, default='') - src = models.CharField(max_length=80, default='') - dst = models.CharField(max_length=80, default='') - dcontext = models.CharField(max_length=80, default='') - channel = models.CharField(max_length=80, default='') - dstchannel = models.CharField(max_length=80, default='') - lastapp = models.CharField(max_length=80, default='') - lastdata = models.CharField(max_length=80, default='') - duration = models.IntegerField(default=0) - billsec = models.IntegerField(default=0) - start = models.DateTimeField(null=True, blank=True, default=None) - answer = models.DateTimeField(null=True, blank=True, default=None) - end = models.DateTimeField(null=True, blank=True, default=None) - disposition = models.CharField(max_length=45, choices=DISPOSITION_CHOICES, default='') - amaflags = models.IntegerField(default=0) - accountcode = models.CharField(max_length=20, default='') - userfield = models.CharField(max_length=255, default='') - uniqueid = models.CharField(max_length=32, default='') - - def save(self, *args, **kwargs): - return - - def delete(self, *args, **kwargs): - return - - def locate_disposition(self): - dsp = self.disposition - if dsp == 'NO ANSWER': - return _('No answer') - elif dsp == 'FAILED': - return _('Failed') - elif dsp == 'BUSY': - return _('Busy') - elif dsp == 'ANSWERED': - return _('Answered') - elif dsp == 'UNKNOWN': - return _('Unknown') - return '' - - def path_to_media(self): - path = getattr(settings, 'DIALING_MEDIA', '/media') - if self.userfield == 'request': - return "%s/recording/request" % path - elif self.userfield == 'report': - return "%s/recording/bug" % path - return "%s/monitor" % path - - 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 - ) - - class Meta: - db_table = 'cdr' - managed = False - ordering = ('-calldate',) - - -class SMSModel(models.Model): - when = models.DateTimeField(auto_now_add=True) - who = models.CharField(max_length=32) - dev = models.CharField(max_length=20) - text = models.CharField(max_length=255) - - class Meta: - db_table = 'sms' - verbose_name = _('SMS') - verbose_name_plural = _('SMS') - ordering = ('-when',) - - def __str__(self): - return self.text - - -class SMSOut(models.Model): - when = models.DateTimeField(_('When'), auto_now_add=True) - dst = models.CharField(_('Telephone'), max_length=16) - text = models.CharField(_('Text'), max_length=255) - SMS_OUT_STATUS = ( - ('nw', _('New')), - ('st', _('Sent')), - ('fd', _('Failed')) - ) - status = models.CharField(_('Status'), max_length=2, choices=SMS_OUT_STATUS, default='nw') - - class Meta: - db_table = 'out_sms' - verbose_name = _('Out SMS') - verbose_name_plural = _('Out SMS') - ordering = ('-when',) - - def __str__(self): - return self.text diff --git a/dialing_app/templates/ext.html b/dialing_app/templates/ext.html deleted file mode 100644 index e635502..0000000 --- a/dialing_app/templates/ext.html +++ /dev/null @@ -1,58 +0,0 @@ -{% extends request.is_ajax|yesno:'bajax.html,base.html' %} -{% load i18n %} - - -{% block breadcrumb %} - -{% endblock %} - - -{% block page-header %} - {{ title }} -{% endblock %} - - -{% block main %} - - - -
-
- {% block content %}{% endblock %} -
-
- -{% endblock %} diff --git a/dialing_app/templates/inbox_sms.html b/dialing_app/templates/inbox_sms.html deleted file mode 100644 index 0b18e67..0000000 --- a/dialing_app/templates/inbox_sms.html +++ /dev/null @@ -1,37 +0,0 @@ -{% extends request.is_ajax|yesno:'nullcont.htm,ext.html' %} -{% load i18n %} -{% block content %} - -
-
-

{% trans 'Inbox sms' %}

-
-
- - {% for msg in sms_messages %} - -
-
From {{ msg.who }} - {{ msg.when|date:'d M, H:i:s' }} via {{ msg.dev }} -
- -
{{ msg.text }}
-
- - {% empty %} -
-

{% trans 'Message history is empty' %}

-
- {% endfor %} - -
- -
- -{% endblock %} diff --git a/dialing_app/templates/index.html b/dialing_app/templates/index.html deleted file mode 100644 index 81ec508..0000000 --- a/dialing_app/templates/index.html +++ /dev/null @@ -1,78 +0,0 @@ -{% extends request.is_ajax|yesno:'nullcont.htm,ext.html' %} -{% load i18n telephone_filters %} -{% block content %} -
- - - - - - - - - - - - - - - - - - - {% for log in logs %} - - {% with lurl=log.url %} - - - - - - - - - - {% endwith %} - - {% empty %} - - - - {% endfor %} - -
{% trans 'Play' %}{% trans 'calldate' %}{% trans 'src' %}{% trans 'dst' %}{% trans 'duration' %}{% trans 'start' %}{% trans 'answer' %}{% trans 'end' %}{% trans 'disposition' %}
-
-
- -
- -
- -
-
-
-
- -
- -
- -
-
-
-
-
- - - - - {{ log.calldate|date:'d M, H:i:s' }}{{ log.src|abon_if_telephone|safe }}{{ log.dst|abon_if_telephone|safe }}{{ log.duration }}{{ log.start|date:'d M, H:i:s' }}{{ log.answer|date:'d M, H:i:s' }}{{ log.end|date:'d M, H:i:s' }}{{ log.locate_disposition }}
{% trans 'Calls was not found' %}
-
-{% endblock %} diff --git a/dialing_app/templates/modal_send_sms.html b/dialing_app/templates/modal_send_sms.html deleted file mode 100644 index 0a87dc9..0000000 --- a/dialing_app/templates/modal_send_sms.html +++ /dev/null @@ -1,23 +0,0 @@ -{% load i18n bootstrap3 %} -
{% csrf_token %} - - - {% include '_messages.html' %} - - - -
diff --git a/dialing_app/templates/vmail.html b/dialing_app/templates/vmail.html deleted file mode 100644 index e1c3636..0000000 --- a/dialing_app/templates/vmail.html +++ /dev/null @@ -1,48 +0,0 @@ -{% extends request.is_ajax|yesno:'nullcont.htm,ext.html' %} -{% load i18n telephone_filters %} -{% block content %} - -
- - - - - - - - - - - - - - - {% for vmail in vmessages %} - - - - - - - - - - - {% empty %} - - - - {% endfor %} - -
{% trans 'Play' %}{% trans 'calldate' %}{% trans 'src' %}{% trans 'duration' %}{% trans 'start' %}{% trans 'answer' %}{% trans 'end' %}{% trans 'disposition' %}
- - - - - {{ vmail.calldate|date:'d E Y, H:i:s' }}{{ vmail.src|abon_if_telephone|safe }}{{ vmail.duration }}{{ vmail.start|date:'d E Y, H:i:s' }}{{ vmail.answer|date:'d E Y, H:i:s' }}{{ vmail.end|date:'d E Y, H:i:s' }}{{ vmail.locate_disposition }}
{% trans 'Calls was not found' %}
-
- -{% endblock %} diff --git a/dialing_app/templatetags/__init__.py b/dialing_app/templatetags/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/dialing_app/templatetags/telephone_filters.py b/dialing_app/templatetags/telephone_filters.py deleted file mode 100644 index 64a6fa6..0000000 --- a/dialing_app/templatetags/telephone_filters.py +++ /dev/null @@ -1,20 +0,0 @@ -import re -from django import template -from django.shortcuts import resolve_url -from django.template.defaultfilters import stringfilter - -register = template.Library() - - -@register.filter -@stringfilter -def abon_if_telephone(value): - """Возвращаем ссыль на абонента если передали номер телефона""" - if re.match(r'^\+?\d+$', value): - if value[0] != '+': - value = '+' + value - url = resolve_url('dialapp:to_abon', tel=value) - a = '%s' % (url, value) - return a - else: - return value diff --git a/dialing_app/tests.py b/dialing_app/tests.py deleted file mode 100644 index 7ce503c..0000000 --- a/dialing_app/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/dialing_app/urls.py b/dialing_app/urls.py deleted file mode 100644 index ba8efa5..0000000 --- a/dialing_app/urls.py +++ /dev/null @@ -1,15 +0,0 @@ -from django.urls import path, re_path -from . import views - -app_name = 'dialing_app' - -urlpatterns = [ - path('', views.LastCallsListView.as_view(), name='home'), - path('filter/', views.DialsFilterListView.as_view(), name='vfilter'), - re_path('^to_abon(?P\+?\d+)/$', views.to_abon, name='to_abon'), - path('requests/', views.VoiceMailRequestsListView.as_view(), name='vmail_request'), - path('reports/', views.VoiceMailReportsListView.as_view(), name='vmail_report'), - path('sms/in/', views.InboxSMSListView.as_view(), name='inbox_sms'), - path('sms/send/', views.send_sms, name='send_sms'), - path('api/sms/', views.SmsManager.as_view()) -] diff --git a/dialing_app/views.py b/dialing_app/views.py deleted file mode 100644 index 3c06c5f..0000000 --- a/dialing_app/views.py +++ /dev/null @@ -1,221 +0,0 @@ -from datetime import datetime -from subprocess import run -from django.contrib.auth.decorators import login_required -from django.contrib import messages - -from django.db import ProgrammingError -from django.shortcuts import redirect, render -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 djing.global_base_views import SecureApiView -from djing import JSONType -from djing.lib import safe_int -from djing.lib.decorators import only_admins, json_view -from .models import AsteriskCDR, SMSModel, SMSOut -from .forms import SMSOutForm - - -login_decs = login_required, only_admins - - -class BaseListView(ListView): - http_method_names = 'get', - paginate_by = getattr(settings, 'PAGINATION_ITEMS_PER_PAGE', 10) - - -@method_decorator(login_decs, name='dispatch') -@method_decorator(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(self, request, *args, **kwargs): - try: - return super(LastCallsListView, self).get(request, *args, **kwargs) - except ProgrammingError as e: - messages.error(self.request, e) - return redirect('abonapp:group_list') - - def get_context_data(self, **kwargs): - context = super(LastCallsListView, self).get_context_data(**kwargs) - context['title'] = _('Last calls') - return context - - -@login_required -@only_admins -def to_abon(request, tel): - abon = Abon.objects.filter( - Q(telephone__icontains=tel) | - Q(additional_telephones__telephone__icontains=tel) - ) - abon_count = abon.count() - if abon_count > 1: - messages.warning( - request, _('Multiple users with the telephone number') - ) - elif abon_count == 0: - messages.error(request, _('User with the telephone number not found')) - return redirect('dialapp:home') - abon = abon[0] - if abon.group: - return redirect( - 'abonapp:abon_home', gid=abon.group.pk, - uname=abon.username - ) - else: - return redirect('abonapp:group_list') - - -@method_decorator(login_decs, name='dispatch') -class VoiceMailRequestsListView(BaseListView): - template_name = 'vmail.html' - context_object_name = 'vmessages' - queryset = AsteriskCDR.objects.filter(userfield='request') - - def get_context_data(self, **kwargs): - context = super(VoiceMailRequestsListView, self).get_context_data(**kwargs) - context['title'] = _('Voice mail request') - return context - - -class VoiceMailReportsListView(VoiceMailRequestsListView): - queryset = AsteriskCDR.objects.filter(userfield='report') - - def get_context_data(self, **kwargs): - context = super(VoiceMailRequestsListView, self).get_context_data(**kwargs) - context['title'] = _('Voice mail report') - return context - - -@method_decorator(login_decs, 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_decs, name='dispatch') -@method_decorator(permission_required('dialing_app.view_smsmodel'), name='dispatch') -class InboxSMSListView(BaseListView): - template_name = 'inbox_sms.html' - context_object_name = 'sms_messages' - model = SMSModel - - -@login_required -@only_admins -@permission_required('dialing_app.add_smsout') -def send_sms(request): - path = request.GET.get('path') - initial_dst = request.GET.get('dst') - if request.method == 'POST': - frm = SMSOutForm(request.POST) - if frm.is_valid(): - frm.save() - messages.success(request, _('Message was enqueued for sending')) - pidfile_name = '/run/dialing.py.pid' - try: - with open(pidfile_name, 'r') as f: - pid = int(f.read()) - run(['/usr/bin/kill', '-SIGUSR1', str(pid)]) - except FileNotFoundError: - print('Failed sending, %s not found' % pidfile_name) - if path: - return redirect(path) - else: - return redirect('dialapp:inbox_sms') - else: - messages.error(request, _('fix form errors')) - else: - frm = SMSOutForm(initial={'dst': initial_dst}) - return render(request, 'modal_send_sms.html', { - 'form': frm, - 'path': path - }) - - -class SmsManager(SecureApiView): - # - # Api view for management sms from dongle - # - http_method_names = ('get',) - - @staticmethod - def bad_cmd() -> JSONType: - return {'text': 'Command is not allowed'} - - @method_decorator(json_view) - def get(self, request, *args, **kwargs): - cmd = request.GET.get('cmd') - data = request.GET.dict() - handler = getattr(self, cmd.lower(), self.bad_cmd) - del data['cmd'] - del data['sign'] - return handler(**data) - - @staticmethod - def save_sms(**kwargs) -> JSONType: - sms = SMSModel.objects.create( - who=kwargs.get('who'), - dev=kwargs.get('dev'), - text=kwargs.get('text') - ) - return {'status': 'ok', 'sms_id': sms.pk} - - @staticmethod - def update_status(**kwargs) -> JSONType: - msg_id = safe_int(kwargs.get('mid')) - if msg_id != 0: - status = kwargs.get('status') - update_count = SMSOut.objects.filter(pk=msg_id).update(status=status) - return { - 'text': 'Status updated', - 'update_count': update_count - } - return {'text': 'Bad mid parameter'} - - @staticmethod - def get_new() -> JSONType: - msgs = SMSOut.objects.filter(status='nw').defer('status') - res = [{ - 'when': round(m.timestamp), - 'dst': m.dst, - 'text': m.text - } for m in msgs] - return res diff --git a/djing/settings.py b/djing/settings.py index 3e008d2..3b354db 100644 --- a/djing/settings.py +++ b/djing/settings.py @@ -57,7 +57,6 @@ INSTALLED_APPS = [ 'clientsideapp', 'messenger', 'msg_app', - 'dialing_app', 'group_app', 'guardian', 'pinax_theme_bootstrap', diff --git a/djing/urls.py b/djing/urls.py index 31f7dfa..fb8a3f7 100644 --- a/djing/urls.py +++ b/djing/urls.py @@ -15,7 +15,6 @@ urlpatterns = [ path('tasks/', include('taskapp.urls', namespace='taskapp')), path('client/', include('clientsideapp.urls', namespace='client_side')), path('msg/', include('msg_app.urls', namespace='msg_app')), - path('dialing/', include('dialing_app.urls', namespace='dialapp')), path('groups/', include('group_app.urls', namespace='group_app')), path('ip_pool/', include('ip_pool.urls', namespace='ip_pool')), path('messenger/', include('messenger.urls', namespace='messenger')), diff --git a/docs/install.md b/docs/install.md index e642ff7..5f54a33 100644 --- a/docs/install.md +++ b/docs/install.md @@ -241,7 +241,7 @@ __sha256__. то секретное слово должен знать билл ``` $ ./manage.py migrate Operations to perform: - Apply all migrations: mapapp, contenttypes, dialing_app, msg_app, taskapp, accounts_app, devapp, statistics, tariff_app, admin, sessions, chatbot, auth, abonapp + Apply all migrations: mapapp, contenttypes, msg_app, taskapp, accounts_app, devapp, statistics, tariff_app, admin, sessions, chatbot, auth, abonapp Running migrations: Rendering model states... DONE Applying mapapp.0001_initial... OK diff --git a/templates/base.html b/templates/base.html index 1c7b619..c215bdf 100644 --- a/templates/base.html +++ b/templates/base.html @@ -88,15 +88,6 @@ - {% if perms.dialing_app.change_asteriskcdr %} - {% url 'dialapp:home' as dialhome %} - - - {% trans 'Dialing' %} - - - {% endif %} - {% if perms.traf_stat.statcache_view %} {% url 'traf_stat:home' as stathome %}