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 %} -
{% csrf_token %} - - - -
+{% 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 %} -
{% csrf_token %} - - -
+ +{% 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 %} - -
{% csrf_token %} - - - {% include 'message_block.html' %} - - - -
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 %} +
{% csrf_token %} + + +