diff --git a/abonapp/templates/abonapp/abon_confirm_delete.html b/abonapp/templates/abonapp/abon_confirm_delete.html
index 664bc1b..5b21997 100644
--- a/abonapp/templates/abonapp/abon_confirm_delete.html
+++ b/abonapp/templates/abonapp/abon_confirm_delete.html
@@ -1,18 +1,10 @@
+{% extends 'base_delete_modal.html' %}
{% load i18n %}
-
+{% block modal_form_title %}
+ {% trans 'Remove subscriber' %}
+{% endblock %}
diff --git a/abonapp/views.py b/abonapp/views.py
index 5a36b85..bd3215a 100644
--- a/abonapp/views.py
+++ b/abonapp/views.py
@@ -40,7 +40,7 @@ class BaseAbonListView(OrderingMixin, BaseListWithFiltering):
http_method_names = ('get',)
-@method_decorator((login_required, lib.only_admins), name='dispatch')
+@method_decorator((login_required, lib.decorators.only_admins), name='dispatch')
class PeoplesListView(BaseAbonListView):
context_object_name = 'peoples'
template_name = 'abonapp/peoples.html'
@@ -85,7 +85,7 @@ class PeoplesListView(BaseAbonListView):
return context
-@method_decorator((login_required, lib.only_admins), name='dispatch')
+@method_decorator((login_required, lib.decorators.only_admins), name='dispatch')
class GroupListView(BaseAbonListView):
context_object_name = 'groups'
template_name = 'abonapp/group_list.html'
@@ -98,7 +98,7 @@ class GroupListView(BaseAbonListView):
return queryset
-@method_decorator((login_required, lib.only_admins), name='dispatch')
+@method_decorator((login_required, lib.decorators.only_admins), name='dispatch')
@method_decorator(permission_required('abonapp.add_abon'), name='dispatch')
class AbonCreateView(CreateView):
group = None
@@ -154,7 +154,7 @@ class AbonCreateView(CreateView):
return super(AbonCreateView, self).form_invalid(form)
-@method_decorator((login_required, lib.only_admins), name='dispatch')
+@method_decorator((login_required, lib.decorators.only_admins), name='dispatch')
@method_decorator(permission_required('abonapp.delete_abon'), name='dispatch')
class DelAbonDeleteView(DeleteView):
model = models.Abon
@@ -214,7 +214,7 @@ def abonamount(request, gid, uname):
}, request=request)
-@method_decorator((login_required, lib.only_admins), name='dispatch')
+@method_decorator((login_required, lib.decorators.only_admins), name='dispatch')
@method_decorator(permission_required('group_app.can_view_group', (Group, 'pk', 'gid')), name='dispatch')
class DebtsListView(BaseAbonListView):
context_object_name = 'invoices'
@@ -232,7 +232,7 @@ class DebtsListView(BaseAbonListView):
return context
-@method_decorator((login_required, lib.only_admins), name='dispatch')
+@method_decorator((login_required, lib.decorators.only_admins), name='dispatch')
@method_decorator(permission_required('group_app.can_view_group', (Group, 'pk', 'gid')), name='dispatch')
class PayHistoryListView(BaseAbonListView):
context_object_name = 'pay_history'
@@ -252,7 +252,7 @@ class PayHistoryListView(BaseAbonListView):
@login_required
-@lib.only_admins
+@lib.decorators.only_admins
def abon_services(request, gid, uname):
grp = get_object_or_404(Group, pk=gid)
if not request.user.has_perm('group_app.can_view_group', grp):
@@ -277,7 +277,7 @@ def abon_services(request, gid, uname):
})
-@method_decorator((login_required, lib.only_admins), name='dispatch')
+@method_decorator((login_required, lib.decorators.only_admins), name='dispatch')
@method_decorator(permission_required('abonapp.change_abon'), name='post')
class AbonHomeUpdateView(UpdateView):
model = models.Abon
@@ -406,7 +406,7 @@ def add_invoice(request, gid, uname):
@login_required
-@lib.only_admins
+@lib.decorators.only_admins
@permission_required('abonapp.can_buy_tariff')
@transaction.atomic
def pick_tariff(request, gid, uname):
@@ -550,7 +550,7 @@ class PassportUpdateView(UpdateView):
@login_required
-@lib.only_admins
+@lib.decorators.only_admins
def chgroup_tariff(request, gid):
grp = get_object_or_404(Group, pk=gid)
if not request.user.has_perm('group_app.change_group', grp):
@@ -766,7 +766,7 @@ def abon_ping(request):
}
-@method_decorator((login_required, lib.only_admins,), name='dispatch')
+@method_decorator((login_required, lib.decorators.only_admins,), name='dispatch')
class DialsListView(BaseAbonListView):
context_object_name = 'logs'
template_name = 'abonapp/dial_log.html'
@@ -1028,7 +1028,7 @@ def reset_ip(request, gid, uname):
@login_required
-@lib.only_admins
+@lib.decorators.only_admins
def fin_report(request):
q = models.AllTimePayLog.objects.by_days()
res_format = request.GET.get('f')
@@ -1088,7 +1088,7 @@ def del_periodic_pay(request, gid, uname, periodic_pay_id):
return redirect('abonapp:abon_services', gid, uname)
-@method_decorator((login_required, lib.only_admins,), name='dispatch')
+@method_decorator((login_required, lib.decorators.only_admins,), name='dispatch')
class EditSibscriberMarkers(UpdateView):
http_method_names = ('get', 'post')
template_name = 'abonapp/modal_user_markers.html'
@@ -1119,7 +1119,7 @@ class EditSibscriberMarkers(UpdateView):
# API's
@login_required
-@lib.only_admins
+@lib.decorators.only_admins
@json_view
def abons(request):
ablist = ({
@@ -1144,7 +1144,7 @@ def abons(request):
@login_required
-@lib.only_admins
+@lib.decorators.only_admins
@json_view
def search_abon(request):
word = request.GET.get('s')
diff --git a/accounts_app/views.py b/accounts_app/views.py
index 6cdd24e..9f3bbbd 100644
--- a/accounts_app/views.py
+++ b/accounts_app/views.py
@@ -15,6 +15,7 @@ from group_app.models import Group
from .models import UserProfile
from .forms import AvatarChangeForm
from djing import lib
+from djing.lib.decorators import only_admins
from guardian.decorators import permission_required_or_403 as permission_required
from guardian.shortcuts import get_objects_for_user, assign_perm, remove_perm
@@ -61,7 +62,7 @@ class SignOut(RedirectView):
@login_required
-@lib.only_admins
+@only_admins
def profile_show(request, uid=0):
uid = lib.safe_int(uid)
@@ -86,7 +87,7 @@ def profile_show(request, uid=0):
})
-@method_decorator((login_required, lib.only_admins), name='dispatch')
+@method_decorator((login_required, only_admins), name='dispatch')
class AvatarUpdateView(UpdateView):
form_class = AvatarChangeForm
template_name = 'accounts/settings/ch_info.html'
@@ -99,7 +100,7 @@ class AvatarUpdateView(UpdateView):
@login_required
-@lib.only_admins
+@only_admins
def ch_info(request):
if request.method == 'POST':
user = request.user
@@ -168,7 +169,7 @@ def create_profile(request):
@login_required
-@lib.only_admins
+@only_admins
def delete_profile(request, uid):
prf = get_object_or_404(UserProfile, id=uid)
if uid != request.user.id:
@@ -179,7 +180,7 @@ def delete_profile(request, uid):
return redirect('acc_app:accounts_list')
-@method_decorator((login_required, lib.only_admins), name='dispatch')
+@method_decorator((login_required, only_admins), name='dispatch')
class AccountsListView(BaseAccListView):
template_name = 'accounts/acc_list.html'
context_object_name = 'users'
@@ -287,7 +288,7 @@ def set_abon_groups_permission(request, uid):
})
-@method_decorator((login_required, lib.only_admins), name='dispatch')
+@method_decorator((login_required, only_admins), name='dispatch')
class ManageResponsibilityGroups(ListView):
http_method_names = ('get', 'post')
template_name = 'accounts/manage_responsibility_groups.html'
diff --git a/devapp/locale/ru/LC_MESSAGES/django.po b/devapp/locale/ru/LC_MESSAGES/django.po
index b9f1eef..c9c3976 100644
--- a/devapp/locale/ru/LC_MESSAGES/django.po
+++ b/devapp/locale/ru/LC_MESSAGES/django.po
@@ -535,3 +535,12 @@ msgstr "Устройство %(device_name)s получило не опреде
msgid "Ip address or parent device with ip address required for ONU device"
msgstr "Необходим ip адрес. Или родительское устройство с назначенным ip адресом необходимо."
+
+msgid "Are you sure you want to delete device?"
+msgstr "Вы уверены что хотите удалить устройство?"
+
+msgid "Remove device"
+msgstr "Удалить устройство"
+
+msgid "Device successfully deleted"
+msgstr "Устройство успешно удалено"
diff --git a/devapp/templates/devapp/dev.html b/devapp/templates/devapp/dev.html
index 31f2f9d..0b4e77a 100644
--- a/devapp/templates/devapp/dev.html
+++ b/devapp/templates/devapp/dev.html
@@ -61,7 +61,7 @@
{% trans 'Save' %}
{% if perms.devapp.delete_device %}
-
+
{% trans 'Delete' %}
{% else %}
diff --git a/devapp/templates/devapp/device_confirm_delete.html b/devapp/templates/devapp/device_confirm_delete.html
new file mode 100644
index 0000000..961d650
--- /dev/null
+++ b/devapp/templates/devapp/device_confirm_delete.html
@@ -0,0 +1,14 @@
+{% extends 'base_delete_modal.html' %}
+{% load i18n %}
+
+{% block modal_form_url %}
+ {% url 'devapp:del' object.group.pk object.pk %}
+{% endblock %}
+
+{% block modal_form_title %}
+ {% trans 'Remove device' %}
+{% endblock %}
+
+{% block modal_form_text %}
+ {% trans 'Are you sure you want to delete device?' %}
+{% endblock %}
diff --git a/devapp/templates/devapp/devices.html b/devapp/templates/devapp/devices.html
index 4636d8b..248ae43 100644
--- a/devapp/templates/devapp/devices.html
+++ b/devapp/templates/devapp/devices.html
@@ -65,7 +65,7 @@
{{ dev.get_devtype_display }} |
{% if can_del_dev %}
-
+
{% endif %}
diff --git a/devapp/templates/devapp/devices_null_group.html b/devapp/templates/devapp/devices_null_group.html
index cea6acb..3eeaaf0 100644
--- a/devapp/templates/devapp/devices_null_group.html
+++ b/devapp/templates/devapp/devices_null_group.html
@@ -46,12 +46,12 @@
| {{ dev.get_devtype_display }} |
{% if can_del_dev %}
-
+
{% endif %}
{% if can_change_dev %}
-
+
{% endif %}
diff --git a/devapp/urls.py b/devapp/urls.py
index 9731624..fdbf696 100644
--- a/devapp/urls.py
+++ b/devapp/urls.py
@@ -10,7 +10,7 @@ urlpatterns = [
url(r'^(?P\d+)$', views.DevicesListView.as_view(), name='devs'),
url(r'^(?P\d+)/add$', views.dev, name='add'),
url(r'^(\d+)/(?P\d+)$', views.devview, name='view'),
- url(r'^(\d+)/(?P\d+)/del$', views.devdel, name='del'),
+ url(r'^(\d+)/(?P\d+)/del$', views.DeviceVeleteView.as_view(), name='del'),
url(r'^(?P\d+)/(?P\d+)/add$', views.add_single_port, name='add_port'),
url(r'^(?P\d+)/(?P\d+)/edit$', views.dev, name='edit'),
url(r'^(\d+)/(?P\d+)/ports$', views.manage_ports, name='manage_ports'),
diff --git a/devapp/views.py b/devapp/views.py
index 5417e75..13caf28 100644
--- a/devapp/views.py
+++ b/devapp/views.py
@@ -11,10 +11,11 @@ from django.contrib import messages
from django.utils.decorators import method_decorator
from django.utils.translation import gettext_lazy as _, gettext
from easysnmp import EasySNMPTimeoutError, EasySNMPError
-from django.views.generic import DetailView
+from django.views.generic import DetailView, DeleteView
from devapp.base_intr import DeviceImplementationError
-from djing.lib import res_success, res_error, only_admins, safe_int
+from djing.lib.decorators import only_admins
+from djing.lib import safe_int
from abonapp.models import Abon
from group_app.models import Group
from accounts_app.models import UserProfile
@@ -68,19 +69,23 @@ class DevicesWithoutGroupsListView(global_base_views.OrderingMixin, BaseDeviceLi
queryset = Device.objects.filter(group=None).only('comment', 'devtype', 'pk', 'ip_address')
-@login_required
-@permission_required('devapp.delete_device')
-def devdel(request, device_id):
- try:
- device_instance = Device.objects.get(pk=device_id)
- back_url = resolve_url('devapp:devs', group_id=device_instance.group.pk if device_instance.group else 0)
- device_instance.update_dhcp(remove=True)
- device_instance.delete()
- return res_success(request, back_url)
- except Device.DoesNotExist:
- return res_error(request, _('Delete failed'))
- except DeviceDBException as e:
- return res_error(request, e)
+@method_decorator(login_required, name='dispatch')
+@method_decorator(permission_required('devapp.delete_device'), name='dispatch')
+class DeviceVeleteView(DeleteView):
+ model = Device
+ pk_url_kwarg = 'device_id'
+
+ def get_success_url(self):
+ return resolve_url('devapp:devs', group_id=self.object.group.pk if self.object.group else 0)
+
+ def delete(self, request, *args, **kwargs):
+ res = super().delete(request, *args, **kwargs)
+ try:
+ self.object.update_dhcp(remove=True)
+ except DeviceDBException as e:
+ messages.error(request, e)
+ messages.success(request, _('Device successfully deleted'))
+ return res
@login_required
diff --git a/dialing.py b/dialing.py
index ab636f7..e8b5a4c 100755
--- a/dialing.py
+++ b/dialing.py
@@ -9,7 +9,7 @@ from urllib.error import HTTPError
from hashlib import sha256
from pid.decorator import pidfile
-from messaging.sms import SmsSubmit, SmsDeliver
+from djing.lib.messaging.sms import SmsSubmit, SmsDeliver
from asterisk import manager as ast_mngr
diff --git a/dialing_app/views.py b/dialing_app/views.py
index 0108d26..9c221bd 100644
--- a/dialing_app/views.py
+++ b/dialing_app/views.py
@@ -16,7 +16,8 @@ from jsonview.decorators import json_view
from abonapp.models import Abon
from djing.global_base_views import SecureApiView
from djing import JSONType
-from djing.lib import only_admins, safe_int
+from djing.lib import safe_int
+from djing.lib.decorators import only_admins
from .models import AsteriskCDR, SMSModel, SMSOut
from .forms import SMSOutForm
diff --git a/djing/lib/__init__.py b/djing/lib/__init__.py
index 948f5d5..fc0e76d 100644
--- a/djing/lib/__init__.py
+++ b/djing/lib/__init__.py
@@ -2,14 +2,7 @@ import socket
import struct
from datetime import timedelta
from collections import Iterator
-from functools import wraps
-from json import dumps
-from django.http import HttpResponse, Http404, HttpResponseRedirect
-from django.shortcuts import redirect
from django.db import models
-from django.conf import settings
-
-DEBUG = getattr(settings, 'DEBUG', False)
def ip2int(addr):
@@ -40,20 +33,6 @@ def safe_int(i):
return 0
-def res_success(request, redirect_to='/'):
- if request.is_ajax():
- return HttpResponse(dumps({'errnum': 0}))
- else:
- return redirect(redirect_to)
-
-
-def res_error(request, text):
- if request.is_ajax():
- return HttpResponse(dumps({'errnum': 1, 'errtext': text}))
- else:
- raise Http404(text)
-
-
class MyGenericIPAddressField(models.GenericIPAddressField):
description = "Int32 notation ip address"
@@ -104,18 +83,6 @@ class MyChoicesAdapter(Iterator):
return res
-# Allow to view only admins
-def only_admins(fn):
- @wraps(fn)
- def wrapped(request, *args, **kwargs):
- if request.user.is_admin:
- return fn(request, *args, **kwargs)
- else:
- return redirect('client_side:home')
-
- return wrapped
-
-
# Russian localized timedelta
class RuTimedelta(timedelta):
def __new__(cls, tm):
@@ -147,23 +114,6 @@ class RuTimedelta(timedelta):
return text_date
-def require_ssl(view):
- """
- Decorator that requires an SSL connection. If the current connection is not SSL, we redirect to the SSL version of
- the page.
- from: https://gist.github.com/ckinsey/9709984
- """
-
- @wraps(view)
- def wrapper(request, *args, **kwargs):
- if not DEBUG and not request.is_secure():
- target_url = "https://" + request.META['HTTP_HOST'] + request.path_info
- return HttpResponseRedirect(target_url)
- return view(request, *args, **kwargs)
-
- return wrapper
-
-
class MultipleException(Exception):
def __init__(self, err_list):
if not isinstance(err_list, (list, tuple)):
diff --git a/djing/lib/decorators.py b/djing/lib/decorators.py
new file mode 100644
index 0000000..9be54a5
--- /dev/null
+++ b/djing/lib/decorators.py
@@ -0,0 +1,35 @@
+from functools import wraps
+from django.conf import settings
+from django.http import HttpResponseRedirect
+from django.shortcuts import redirect
+
+
+DEBUG = getattr(settings, 'DEBUG', False)
+
+
+def require_ssl(view):
+ """
+ Decorator that requires an SSL connection. If the current connection is not SSL, we redirect to the SSL version of
+ the page.
+ from: https://gist.github.com/ckinsey/9709984
+ """
+
+ @wraps(view)
+ def wrapper(request, *args, **kwargs):
+ if not DEBUG and not request.is_secure():
+ target_url = "https://" + request.META['HTTP_HOST'] + request.path_info
+ return HttpResponseRedirect(target_url)
+ return view(request, *args, **kwargs)
+
+ return wrapper
+
+
+# Allow to view only admins
+def only_admins(fn):
+ @wraps(fn)
+ def wrapped(request, *args, **kwargs):
+ if request.user.is_admin:
+ return fn(request, *args, **kwargs)
+ else:
+ return redirect('client_side:home')
+ return wrapped
diff --git a/messaging/__init__.py b/djing/lib/messaging/__init__.py
similarity index 100%
rename from messaging/__init__.py
rename to djing/lib/messaging/__init__.py
diff --git a/djing/lib/messaging/sms/__init__.py b/djing/lib/messaging/sms/__init__.py
new file mode 100644
index 0000000..0e78d70
--- /dev/null
+++ b/djing/lib/messaging/sms/__init__.py
@@ -0,0 +1,7 @@
+# See LICENSE
+
+from djing.lib.messaging.sms.deliver import SmsDeliver
+from djing.lib.messaging.sms.submit import SmsSubmit
+from djing.lib.messaging.sms.gsm0338 import is_gsm_text
+
+__all__ = ("SmsSubmit", "SmsDeliver", "is_gsm_text")
diff --git a/messaging/sms/base.py b/djing/lib/messaging/sms/base.py
similarity index 100%
rename from messaging/sms/base.py
rename to djing/lib/messaging/sms/base.py
diff --git a/messaging/sms/consts.py b/djing/lib/messaging/sms/consts.py
similarity index 100%
rename from messaging/sms/consts.py
rename to djing/lib/messaging/sms/consts.py
diff --git a/messaging/sms/deliver.py b/djing/lib/messaging/sms/deliver.py
similarity index 96%
rename from messaging/sms/deliver.py
rename to djing/lib/messaging/sms/deliver.py
index 5036e46..1efa925 100644
--- a/messaging/sms/deliver.py
+++ b/djing/lib/messaging/sms/deliver.py
@@ -3,11 +3,11 @@
from datetime import datetime, timedelta
-from messaging.utils import (swap, swap_number, encode_bytes, debug,
- unpack_msg, unpack_msg2, to_array)
-from messaging.sms import consts
-from messaging.sms.base import SmsBase
-from messaging.sms.udh import UserDataHeader
+from djing.lib.messaging.utils import (swap, swap_number, encode_bytes, debug,
+ unpack_msg, unpack_msg2, to_array)
+from djing.lib.messaging.sms import consts
+from djing.lib.messaging.sms.submit import SmsBase
+from djing.lib.messaging.sms.udh import UserDataHeader
class SmsDeliver(SmsBase):
diff --git a/messaging/sms/gsm0338.py b/djing/lib/messaging/sms/gsm0338.py
similarity index 100%
rename from messaging/sms/gsm0338.py
rename to djing/lib/messaging/sms/gsm0338.py
diff --git a/messaging/sms/pdu.py b/djing/lib/messaging/sms/pdu.py
similarity index 100%
rename from messaging/sms/pdu.py
rename to djing/lib/messaging/sms/pdu.py
diff --git a/messaging/sms/submit.py b/djing/lib/messaging/sms/submit.py
similarity index 94%
rename from messaging/sms/submit.py
rename to djing/lib/messaging/sms/submit.py
index f0e9941..1bdb3cd 100644
--- a/messaging/sms/submit.py
+++ b/djing/lib/messaging/sms/submit.py
@@ -4,15 +4,15 @@
from datetime import datetime, timedelta
import re
-from messaging.sms import consts
-from messaging.utils import (debug, encode_str, clean_number,
- pack_8bits_to_ucs2, pack_8bits_to_7bits,
- pack_8bits_to_8bit,
- timedelta_to_relative_validity,
- datetime_to_absolute_validity)
-from messaging.sms.base import SmsBase
-from messaging.sms.gsm0338 import is_gsm_text
-from messaging.sms.pdu import Pdu
+from djing.lib.messaging.sms import consts
+from djing.lib.messaging.utils import (debug, encode_str, clean_number,
+ pack_8bits_to_ucs2, pack_8bits_to_7bits,
+ pack_8bits_to_8bit,
+ timedelta_to_relative_validity,
+ datetime_to_absolute_validity)
+from djing.lib.messaging.sms.base import SmsBase
+from djing.lib.messaging.sms.gsm0338 import is_gsm_text
+from djing.lib.messaging.sms.pdu import Pdu
VALID_NUMBER = re.compile("^\+?\d{3,20}$")
diff --git a/messaging/sms/udh.py b/djing/lib/messaging/sms/udh.py
similarity index 100%
rename from messaging/sms/udh.py
rename to djing/lib/messaging/sms/udh.py
diff --git a/messaging/sms/wap.py b/djing/lib/messaging/sms/wap.py
similarity index 95%
rename from messaging/sms/wap.py
rename to djing/lib/messaging/sms/wap.py
index 46611ab..859c952 100644
--- a/messaging/sms/wap.py
+++ b/djing/lib/messaging/sms/wap.py
@@ -2,7 +2,7 @@
from array import array
-from messaging.mms.mms_pdu import MMSDecoder
+from djing.lib.messaging import MMSDecoder
def is_a_wap_push_notification(s):
diff --git a/messaging/utils.py b/djing/lib/messaging/utils.py
similarity index 100%
rename from messaging/utils.py
rename to djing/lib/messaging/utils.py
diff --git a/group_app/templates/group_app/group_confirm_delete.html b/group_app/templates/group_app/group_confirm_delete.html
index cfa1590..27f9fc9 100644
--- a/group_app/templates/group_app/group_confirm_delete.html
+++ b/group_app/templates/group_app/group_confirm_delete.html
@@ -1,13 +1,14 @@
+{% extends 'base_delete_modal.html' %}
{% load i18n %}
-
+
+{% block modal_form_url %}
+ {% url 'group_app:del' object.pk %}
+{% endblock %}
+
+{% block modal_form_title %}
+ {% trans 'Remove group' %}
+{% endblock %}
+
+{% block modal_form_text %}
+ {% blocktrans %}Are you sure you want to delete group {{ object }}?{% endblocktrans %}
+{% endblock %}
diff --git a/messaging/sms/__init__.py b/messaging/sms/__init__.py
deleted file mode 100644
index f00ad10..0000000
--- a/messaging/sms/__init__.py
+++ /dev/null
@@ -1,7 +0,0 @@
-# See LICENSE
-
-from messaging.sms.submit import SmsSubmit
-from messaging.sms.deliver import SmsDeliver
-from messaging.sms.gsm0338 import is_gsm_text
-
-__all__ = ["SmsSubmit", "SmsDeliver", "is_gsm_text"]
diff --git a/tariff_app/locale/ru/LC_MESSAGES/django.po b/tariff_app/locale/ru/LC_MESSAGES/django.po
index 08b181f..79aa109 100644
--- a/tariff_app/locale/ru/LC_MESSAGES/django.po
+++ b/tariff_app/locale/ru/LC_MESSAGES/django.po
@@ -209,3 +209,6 @@ msgstr "Новый периодический платёж создан"
#: tariff_app/views.py:102
msgid "Periodic pay has been changed"
msgstr "Периодический платёж изменён"
+
+msgid "Are you sure you want to delete tariff?"
+msgstr "Вы уверены что хотите удалить тариф?"
diff --git a/tariff_app/templates/tariff_app/modal_del_warning.html b/tariff_app/templates/tariff_app/modal_del_warning.html
deleted file mode 100644
index fbe951d..0000000
--- a/tariff_app/templates/tariff_app/modal_del_warning.html
+++ /dev/null
@@ -1,30 +0,0 @@
-{% load i18n %}
-
-
diff --git a/tariff_app/templates/tariff_app/tariff_confirm_delete.html b/tariff_app/templates/tariff_app/tariff_confirm_delete.html
new file mode 100644
index 0000000..60070e6
--- /dev/null
+++ b/tariff_app/templates/tariff_app/tariff_confirm_delete.html
@@ -0,0 +1,15 @@
+{% extends 'base_delete_modal.html' %}
+{% load i18n %}
+
+{% block modal_form_url %}
+ {% url 'tarifs:del' tid %}
+{% endblock %}
+
+{% block modal_form_title %}
+ {% trans 'Delete service' %}
+{% endblock %}
+
+{% block modal_form_text %}
+
+ {% blocktrans %}after delete the tariff, subscribers who use that tariff will be disconnected from it.{% endblocktrans %}
+{% endblock %}
diff --git a/tariff_app/urls.py b/tariff_app/urls.py
index 1548b9e..727996a 100644
--- a/tariff_app/urls.py
+++ b/tariff_app/urls.py
@@ -8,7 +8,7 @@ urlpatterns = [
url(r'^$', views.TariffsListView.as_view(), name='home'),
url(r'^(?P\d+)$', views.edit_tarif, name='edit'),
url(r'^add$', views.edit_tarif, name='add'),
- url(r'^del(?P\d+)$', views.del_tarif, name='del'),
+ url(r'^del(?P\d+)$', views.TariffDeleteView.as_view(), name='del'),
url(r'^periodic_pays$', views.PeriodicPaysListView.as_view(), name='periodic_pays'),
url(r'^periodic_pays/add$', views.periodic_pay, name='periodic_pay_add'),
diff --git a/tariff_app/views.py b/tariff_app/views.py
index 1f0d7d9..13e5aaa 100644
--- a/tariff_app/views.py
+++ b/tariff_app/views.py
@@ -1,12 +1,12 @@
-# -*- coding: utf-8 -*-
from django.contrib.auth.decorators import login_required
from django.contrib.gis.shortcuts import render_to_text
+from django.urls import reverse_lazy
from django.utils.decorators import method_decorator
from django.utils.translation import ugettext as _
from django.shortcuts import render, get_object_or_404, redirect
from django.contrib import messages
from django.core.exceptions import PermissionDenied
-from django.views.generic import ListView
+from django.views.generic import ListView, DeleteView
from django.conf import settings
from guardian.decorators import permission_required_or_403 as permission_required
@@ -21,7 +21,7 @@ class BaseServiceListView(ListView):
paginate_by = getattr(settings, 'PAGINATION_ITEMS_PER_PAGE', 10)
-@method_decorator((login_required, lib.only_admins), name='dispatch')
+@method_decorator((login_required, lib.decorators.only_admins), name='dispatch')
class TariffsListView(BaseServiceListView, OrderingMixin):
"""
Show Services(Tariffs) list
@@ -61,21 +61,25 @@ def edit_tarif(request, tarif_id=0):
})
-@login_required
-@permission_required('tariff_app.delete_tariff')
-def del_tarif(request, tid):
- if request.method == 'POST':
- if request.POST.get('confirm') == 'yes':
- get_object_or_404(Tariff, id=tid).delete()
- messages.success(request, _('Service has been deleted'))
- else:
- messages.error(request, _('Not have a confirmations of delete'))
- return lib.res_success(request, 'tarifs:home')
- return render_to_text('tariff_app/modal_del_warning.html', {'tid': tid}, request=request)
+@method_decorator(login_required, name='dispatch')
+@method_decorator(permission_required('tariff_app.delete_tariff'), name='dispatch')
+class TariffDeleteView(DeleteView):
+ model = Tariff
+ pk_url_kwarg = 'tid'
+ success_url = reverse_lazy('tarifs:home')
+
+ def delete(self, request, *args, **kwargs):
+ res = super().delete(request, *args, **kwargs)
+ messages.success(request, _('Service has been deleted'))
+ return res
+
+ def get_context_data(self, **kwargs):
+ kwargs['tid'] = self.kwargs.get('tid')
+ return super().get_context_data(**kwargs)
@method_decorator(login_required, name='dispatch')
-@method_decorator(permission_required('tariff_app.can_view_periodic_pay'), name='dispatch')
+@method_decorator(permission_required('tariff_app.delete_tariff'), name='dispatch')
class PeriodicPaysListView(BaseServiceListView):
context_object_name = 'pays'
model = PeriodicPay
diff --git a/taskapp/views.py b/taskapp/views.py
index b0624a8..2e53022 100644
--- a/taskapp/views.py
+++ b/taskapp/views.py
@@ -18,7 +18,8 @@ from jsonview.decorators import json_view
from chatbot.models import MessageQueue
from abonapp.models import Abon
from djing import httpresponse_to_referrer
-from djing.lib import only_admins, safe_int, MultipleException, RuTimedelta
+from djing.lib import safe_int, MultipleException, RuTimedelta
+from djing.lib.decorators import only_admins
from .handle import TaskException
from .models import Task, ExtraComment
from .forms import TaskFrm, ExtraCommentForm
diff --git a/templates/base_delete_modal.html b/templates/base_delete_modal.html
new file mode 100644
index 0000000..39c9cdd
--- /dev/null
+++ b/templates/base_delete_modal.html
@@ -0,0 +1,19 @@
+{% load i18n %}
+
|