Browse Source

djing.lib refactoring

devel
bashmak 8 years ago
parent
commit
00ff747521
  1. 22
      abonapp/templates/abonapp/abon_confirm_delete.html
  2. 30
      abonapp/views.py
  3. 13
      accounts_app/views.py
  4. 9
      devapp/locale/ru/LC_MESSAGES/django.po
  5. 2
      devapp/templates/devapp/dev.html
  6. 14
      devapp/templates/devapp/device_confirm_delete.html
  7. 2
      devapp/templates/devapp/devices.html
  8. 4
      devapp/templates/devapp/devices_null_group.html
  9. 2
      devapp/urls.py
  10. 35
      devapp/views.py
  11. 2
      dialing.py
  12. 3
      dialing_app/views.py
  13. 50
      djing/lib/__init__.py
  14. 35
      djing/lib/decorators.py
  15. 0
      djing/lib/messaging/__init__.py
  16. 7
      djing/lib/messaging/sms/__init__.py
  17. 0
      djing/lib/messaging/sms/base.py
  18. 0
      djing/lib/messaging/sms/consts.py
  19. 10
      djing/lib/messaging/sms/deliver.py
  20. 0
      djing/lib/messaging/sms/gsm0338.py
  21. 0
      djing/lib/messaging/sms/pdu.py
  22. 18
      djing/lib/messaging/sms/submit.py
  23. 0
      djing/lib/messaging/sms/udh.py
  24. 2
      djing/lib/messaging/sms/wap.py
  25. 0
      djing/lib/messaging/utils.py
  26. 25
      group_app/templates/group_app/group_confirm_delete.html
  27. 7
      messaging/sms/__init__.py
  28. 3
      tariff_app/locale/ru/LC_MESSAGES/django.po
  29. 30
      tariff_app/templates/tariff_app/modal_del_warning.html
  30. 15
      tariff_app/templates/tariff_app/tariff_confirm_delete.html
  31. 2
      tariff_app/urls.py
  32. 34
      tariff_app/views.py
  33. 3
      taskapp/views.py
  34. 19
      templates/base_delete_modal.html

22
abonapp/templates/abonapp/abon_confirm_delete.html

@ -1,18 +1,10 @@
{% extends 'base_delete_modal.html' %}
{% load i18n %}
<form role="form" action="{% url 'abonapp:del_abon' abon.group.pk abon.username %}" method="post">{% csrf_token %}
<div class="modal-header warning">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title"><span class="glyphicon glyphicon-earphone"></span>{% trans 'Remove subscriber' %}</h4>
</div>
<div class="modal-body">
{% block modal_form_url %}
{% url 'abonapp:del_abon' abon.group.pk abon.username %}
{% endblock %}
<h4>{% trans 'Are you sure about them?' %}</h4>
<button type="submit" class="btn btn-danger" value="DELETE">
<span class="glyphicon glyphicon-remove"></span> {% trans 'Delete' %}
</button>
</div>
</form>
{% block modal_form_title %}
{% trans 'Remove subscriber' %}
{% endblock %}

30
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')

13
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'

9
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 "Устройство успешно удалено"

2
devapp/templates/devapp/dev.html

@ -61,7 +61,7 @@
<span class="glyphicon glyphicon-save"></span> {% trans 'Save' %}
</button>
{% if perms.devapp.delete_device %}
<a href="{% url 'devapp:del' group.pk|default:0 dev.pk %}" class="btn btn-danger">
<a href="{% url 'devapp:del' group.pk|default:0 dev.pk %}" class="btn btn-danger btn-modal">
<span class="glyphicon glyphicon-remove"></span> {% trans 'Delete' %}
</a>
{% else %}

14
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 %}
<h4>{% trans 'Are you sure you want to delete device?' %}</h4>
{% endblock %}

2
devapp/templates/devapp/devices.html

@ -65,7 +65,7 @@
<td>{{ dev.get_devtype_display }}</td>
<td class="btn-group btn-group-xs btn-group-justified">
{% if can_del_dev %}
<a href="{% url 'devapp:del' grpid dev.pk %}" class="btn btn-danger">
<a href="{% url 'devapp:del' grpid dev.pk %}" class="btn btn-danger btn-modal">
<span class="glyphicon glyphicon-remove"></span>
</a>
{% endif %}

4
devapp/templates/devapp/devices_null_group.html

@ -46,12 +46,12 @@
<td>{{ dev.get_devtype_display }}</td>
<td class="btn-group btn-group-sm">
{% if can_del_dev %}
<a href="{% url 'devapp:del' 0 dev.pk %}" class="btn btn-danger btn-sm">
<a href="{% url 'devapp:del' 0 dev.pk %}" class="btn btn-danger btn-modal">
<span class="glyphicon glyphicon-remove"></span>
</a>
{% endif %}
{% if can_change_dev %}
<a href="{% url 'devapp:edit' 0 dev.pk %}" class="btn btn-default btn-sm">
<a href="{% url 'devapp:edit' 0 dev.pk %}" class="btn btn-default">
<span class="glyphicon glyphicon-edit"></span>
</a>
{% endif %}

2
devapp/urls.py

@ -10,7 +10,7 @@ urlpatterns = [
url(r'^(?P<group_id>\d+)$', views.DevicesListView.as_view(), name='devs'),
url(r'^(?P<group_id>\d+)/add$', views.dev, name='add'),
url(r'^(\d+)/(?P<device_id>\d+)$', views.devview, name='view'),
url(r'^(\d+)/(?P<device_id>\d+)/del$', views.devdel, name='del'),
url(r'^(\d+)/(?P<device_id>\d+)/del$', views.DeviceVeleteView.as_view(), name='del'),
url(r'^(?P<group_id>\d+)/(?P<device_id>\d+)/add$', views.add_single_port, name='add_port'),
url(r'^(?P<group_id>\d+)/(?P<device_id>\d+)/edit$', views.dev, name='edit'),
url(r'^(\d+)/(?P<device_id>\d+)/ports$', views.manage_ports, name='manage_ports'),

35
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

2
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

3
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

50
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)):

35
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

0
messaging/__init__.py → djing/lib/messaging/__init__.py

7
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")

0
messaging/sms/base.py → djing/lib/messaging/sms/base.py

0
messaging/sms/consts.py → djing/lib/messaging/sms/consts.py

10
messaging/sms/deliver.py → 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):

0
messaging/sms/gsm0338.py → djing/lib/messaging/sms/gsm0338.py

0
messaging/sms/pdu.py → djing/lib/messaging/sms/pdu.py

18
messaging/sms/submit.py → 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}$")

0
messaging/sms/udh.py → djing/lib/messaging/sms/udh.py

2
messaging/sms/wap.py → 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):

0
messaging/utils.py → djing/lib/messaging/utils.py

25
group_app/templates/group_app/group_confirm_delete.html

@ -1,13 +1,14 @@
{% extends 'base_delete_modal.html' %}
{% load i18n %}
<form role="form" action="{% url 'group_app:del' object.pk %}" method="post">{% csrf_token %}
<div class="modal-header warning">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title"><span class="glyphicon glyphicon-list-alt"></span>{% trans 'Remove group' %}</h4>
</div>
<div class="modal-body">
<h4>{% blocktrans %}Are you sure you want to delete group {{ object }}?{% endblocktrans %}</h4>
<button type="submit" class="btn btn-danger" value="DELETE">
<span class="glyphicon glyphicon-remove"></span> {% trans 'Delete' %}
</button>
</div>
</form>
{% block modal_form_url %}
{% url 'group_app:del' object.pk %}
{% endblock %}
{% block modal_form_title %}
{% trans 'Remove group' %}
{% endblock %}
{% block modal_form_text %}
<h4>{% blocktrans %}Are you sure you want to delete group {{ object }}?{% endblocktrans %}</h4>
{% endblock %}

7
messaging/sms/__init__.py

@ -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"]

3
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 "Вы уверены что хотите удалить тариф?"

30
tariff_app/templates/tariff_app/modal_del_warning.html

@ -1,30 +0,0 @@
{% load i18n %}
<form role="form" action="{% url 'tarifs:del' tid %}" method="post"> {% csrf_token %}
<div class="modal-header warning">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title"><span class="glyphicon glyphicon-exclamation-sign"></span>{% trans 'Delete service' %}</h4>
</div>
{% include 'message_block.html' %}
<div class="modal-body">
<div class="form-group-sm">
<label for="id_dev">{% trans 'Attention' %}</label>
<p>{% blocktrans %}after delete the tariff, subscribers who use that tariff will be disconnected from it.{% endblocktrans %}</p>
<input type="hidden" name="confirm" value="yes">
</div>
<div class="btn-group">
<button type="submit" class="btn btn-sm btn-danger">
<span class="glyphicon glyphicon-remove"></span> {% trans 'Delete' %}
</button>
<button type="reset" class="btn btn-sm btn-default">
<span class="glyphicon glyphicon-retweet"></span> {% trans 'Reset' %}
</button>
</div>
</div>
</form>

15
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 %}
<label>{% trans 'Are you sure you want to delete tariff?' %}</label>
<p>{% blocktrans %}after delete the tariff, subscribers who use that tariff will be disconnected from it.{% endblocktrans %}</p>
{% endblock %}

2
tariff_app/urls.py

@ -8,7 +8,7 @@ urlpatterns = [
url(r'^$', views.TariffsListView.as_view(), name='home'),
url(r'^(?P<tarif_id>\d+)$', views.edit_tarif, name='edit'),
url(r'^add$', views.edit_tarif, name='add'),
url(r'^del(?P<tid>\d+)$', views.del_tarif, name='del'),
url(r'^del(?P<tid>\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'),

34
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

3
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

19
templates/base_delete_modal.html

@ -0,0 +1,19 @@
{% load i18n %}
<form role="form" action="{% block modal_form_url %}#modal_url{% endblock %}" method="post">{% csrf_token %}
<div class="modal-header warning">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title">
<span class="glyphicon glyphicon-earphone"></span>
{% block modal_form_title %}Form title{% endblock %}
</h4>
</div>
<div class="modal-body">
{% block modal_form_text %}
<h4>{% trans 'Are you sure about them?' %}</h4>
{% endblock %}
<button type="submit" class="btn btn-danger" value="DELETE">
<span class="glyphicon glyphicon-remove"></span>
{% block modal_btn_delete_text %}{% trans 'Delete' %}{% endblock %}
</button>
</div>
</form>
Loading…
Cancel
Save