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 %} {% 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',) 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): class PeoplesListView(BaseAbonListView):
context_object_name = 'peoples' context_object_name = 'peoples'
template_name = 'abonapp/peoples.html' template_name = 'abonapp/peoples.html'
@ -85,7 +85,7 @@ class PeoplesListView(BaseAbonListView):
return context return context
@method_decorator((login_required, lib.only_admins), name='dispatch')
@method_decorator((login_required, lib.decorators.only_admins), name='dispatch')
class GroupListView(BaseAbonListView): class GroupListView(BaseAbonListView):
context_object_name = 'groups' context_object_name = 'groups'
template_name = 'abonapp/group_list.html' template_name = 'abonapp/group_list.html'
@ -98,7 +98,7 @@ class GroupListView(BaseAbonListView):
return queryset 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') @method_decorator(permission_required('abonapp.add_abon'), name='dispatch')
class AbonCreateView(CreateView): class AbonCreateView(CreateView):
group = None group = None
@ -154,7 +154,7 @@ class AbonCreateView(CreateView):
return super(AbonCreateView, self).form_invalid(form) 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') @method_decorator(permission_required('abonapp.delete_abon'), name='dispatch')
class DelAbonDeleteView(DeleteView): class DelAbonDeleteView(DeleteView):
model = models.Abon model = models.Abon
@ -214,7 +214,7 @@ def abonamount(request, gid, uname):
}, request=request) }, 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') @method_decorator(permission_required('group_app.can_view_group', (Group, 'pk', 'gid')), name='dispatch')
class DebtsListView(BaseAbonListView): class DebtsListView(BaseAbonListView):
context_object_name = 'invoices' context_object_name = 'invoices'
@ -232,7 +232,7 @@ class DebtsListView(BaseAbonListView):
return context 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') @method_decorator(permission_required('group_app.can_view_group', (Group, 'pk', 'gid')), name='dispatch')
class PayHistoryListView(BaseAbonListView): class PayHistoryListView(BaseAbonListView):
context_object_name = 'pay_history' context_object_name = 'pay_history'
@ -252,7 +252,7 @@ class PayHistoryListView(BaseAbonListView):
@login_required @login_required
@lib.only_admins
@lib.decorators.only_admins
def abon_services(request, gid, uname): def abon_services(request, gid, uname):
grp = get_object_or_404(Group, pk=gid) grp = get_object_or_404(Group, pk=gid)
if not request.user.has_perm('group_app.can_view_group', grp): 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') @method_decorator(permission_required('abonapp.change_abon'), name='post')
class AbonHomeUpdateView(UpdateView): class AbonHomeUpdateView(UpdateView):
model = models.Abon model = models.Abon
@ -406,7 +406,7 @@ def add_invoice(request, gid, uname):
@login_required @login_required
@lib.only_admins
@lib.decorators.only_admins
@permission_required('abonapp.can_buy_tariff') @permission_required('abonapp.can_buy_tariff')
@transaction.atomic @transaction.atomic
def pick_tariff(request, gid, uname): def pick_tariff(request, gid, uname):
@ -550,7 +550,7 @@ class PassportUpdateView(UpdateView):
@login_required @login_required
@lib.only_admins
@lib.decorators.only_admins
def chgroup_tariff(request, gid): def chgroup_tariff(request, gid):
grp = get_object_or_404(Group, pk=gid) grp = get_object_or_404(Group, pk=gid)
if not request.user.has_perm('group_app.change_group', grp): 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): class DialsListView(BaseAbonListView):
context_object_name = 'logs' context_object_name = 'logs'
template_name = 'abonapp/dial_log.html' template_name = 'abonapp/dial_log.html'
@ -1028,7 +1028,7 @@ def reset_ip(request, gid, uname):
@login_required @login_required
@lib.only_admins
@lib.decorators.only_admins
def fin_report(request): def fin_report(request):
q = models.AllTimePayLog.objects.by_days() q = models.AllTimePayLog.objects.by_days()
res_format = request.GET.get('f') 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) 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): class EditSibscriberMarkers(UpdateView):
http_method_names = ('get', 'post') http_method_names = ('get', 'post')
template_name = 'abonapp/modal_user_markers.html' template_name = 'abonapp/modal_user_markers.html'
@ -1119,7 +1119,7 @@ class EditSibscriberMarkers(UpdateView):
# API's # API's
@login_required @login_required
@lib.only_admins
@lib.decorators.only_admins
@json_view @json_view
def abons(request): def abons(request):
ablist = ({ ablist = ({
@ -1144,7 +1144,7 @@ def abons(request):
@login_required @login_required
@lib.only_admins
@lib.decorators.only_admins
@json_view @json_view
def search_abon(request): def search_abon(request):
word = request.GET.get('s') 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 .models import UserProfile
from .forms import AvatarChangeForm from .forms import AvatarChangeForm
from djing import lib from djing import lib
from djing.lib.decorators import only_admins
from guardian.decorators import permission_required_or_403 as permission_required from guardian.decorators import permission_required_or_403 as permission_required
from guardian.shortcuts import get_objects_for_user, assign_perm, remove_perm from guardian.shortcuts import get_objects_for_user, assign_perm, remove_perm
@ -61,7 +62,7 @@ class SignOut(RedirectView):
@login_required @login_required
@lib.only_admins
@only_admins
def profile_show(request, uid=0): def profile_show(request, uid=0):
uid = lib.safe_int(uid) 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): class AvatarUpdateView(UpdateView):
form_class = AvatarChangeForm form_class = AvatarChangeForm
template_name = 'accounts/settings/ch_info.html' template_name = 'accounts/settings/ch_info.html'
@ -99,7 +100,7 @@ class AvatarUpdateView(UpdateView):
@login_required @login_required
@lib.only_admins
@only_admins
def ch_info(request): def ch_info(request):
if request.method == 'POST': if request.method == 'POST':
user = request.user user = request.user
@ -168,7 +169,7 @@ def create_profile(request):
@login_required @login_required
@lib.only_admins
@only_admins
def delete_profile(request, uid): def delete_profile(request, uid):
prf = get_object_or_404(UserProfile, id=uid) prf = get_object_or_404(UserProfile, id=uid)
if uid != request.user.id: if uid != request.user.id:
@ -179,7 +180,7 @@ def delete_profile(request, uid):
return redirect('acc_app:accounts_list') 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): class AccountsListView(BaseAccListView):
template_name = 'accounts/acc_list.html' template_name = 'accounts/acc_list.html'
context_object_name = 'users' 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): class ManageResponsibilityGroups(ListView):
http_method_names = ('get', 'post') http_method_names = ('get', 'post')
template_name = 'accounts/manage_responsibility_groups.html' 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" msgid "Ip address or parent device with ip address required for ONU device"
msgstr "Необходим ip адрес. Или родительское устройство с назначенным ip адресом необходимо." 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' %} <span class="glyphicon glyphicon-save"></span> {% trans 'Save' %}
</button> </button>
{% if perms.devapp.delete_device %} {% 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' %} <span class="glyphicon glyphicon-remove"></span> {% trans 'Delete' %}
</a> </a>
{% else %} {% 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>{{ dev.get_devtype_display }}</td>
<td class="btn-group btn-group-xs btn-group-justified"> <td class="btn-group btn-group-xs btn-group-justified">
{% if can_del_dev %} {% 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> <span class="glyphicon glyphicon-remove"></span>
</a> </a>
{% endif %} {% endif %}

4
devapp/templates/devapp/devices_null_group.html

@ -46,12 +46,12 @@
<td>{{ dev.get_devtype_display }}</td> <td>{{ dev.get_devtype_display }}</td>
<td class="btn-group btn-group-sm"> <td class="btn-group btn-group-sm">
{% if can_del_dev %} {% 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> <span class="glyphicon glyphicon-remove"></span>
</a> </a>
{% endif %} {% endif %}
{% if can_change_dev %} {% 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> <span class="glyphicon glyphicon-edit"></span>
</a> </a>
{% endif %} {% 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+)$', views.DevicesListView.as_view(), name='devs'),
url(r'^(?P<group_id>\d+)/add$', views.dev, name='add'), 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+)$', 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+)/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'^(?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'), 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.decorators import method_decorator
from django.utils.translation import gettext_lazy as _, gettext from django.utils.translation import gettext_lazy as _, gettext
from easysnmp import EasySNMPTimeoutError, EasySNMPError 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 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 abonapp.models import Abon
from group_app.models import Group from group_app.models import Group
from accounts_app.models import UserProfile 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') 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 @login_required

2
dialing.py

@ -9,7 +9,7 @@ from urllib.error import HTTPError
from hashlib import sha256 from hashlib import sha256
from pid.decorator import pidfile 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 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 abonapp.models import Abon
from djing.global_base_views import SecureApiView from djing.global_base_views import SecureApiView
from djing import JSONType 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 .models import AsteriskCDR, SMSModel, SMSOut
from .forms import SMSOutForm from .forms import SMSOutForm

50
djing/lib/__init__.py

@ -2,14 +2,7 @@ import socket
import struct import struct
from datetime import timedelta from datetime import timedelta
from collections import Iterator 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.db import models
from django.conf import settings
DEBUG = getattr(settings, 'DEBUG', False)
def ip2int(addr): def ip2int(addr):
@ -40,20 +33,6 @@ def safe_int(i):
return 0 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): class MyGenericIPAddressField(models.GenericIPAddressField):
description = "Int32 notation ip address" description = "Int32 notation ip address"
@ -104,18 +83,6 @@ class MyChoicesAdapter(Iterator):
return res 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 # Russian localized timedelta
class RuTimedelta(timedelta): class RuTimedelta(timedelta):
def __new__(cls, tm): def __new__(cls, tm):
@ -147,23 +114,6 @@ class RuTimedelta(timedelta):
return text_date 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): class MultipleException(Exception):
def __init__(self, err_list): def __init__(self, err_list):
if not isinstance(err_list, (list, tuple)): 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 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): 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 from datetime import datetime, timedelta
import re 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}$") 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 array import array
from messaging.mms.mms_pdu import MMSDecoder
from djing.lib.messaging import MMSDecoder
def is_a_wap_push_notification(s): 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 %} {% 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 #: tariff_app/views.py:102
msgid "Periodic pay has been changed" msgid "Periodic pay has been changed"
msgstr "Периодический платёж изменён" 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'^$', views.TariffsListView.as_view(), name='home'),
url(r'^(?P<tarif_id>\d+)$', views.edit_tarif, name='edit'), url(r'^(?P<tarif_id>\d+)$', views.edit_tarif, name='edit'),
url(r'^add$', views.edit_tarif, name='add'), 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$', views.PeriodicPaysListView.as_view(), name='periodic_pays'),
url(r'^periodic_pays/add$', views.periodic_pay, name='periodic_pay_add'), 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.auth.decorators import login_required
from django.contrib.gis.shortcuts import render_to_text 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.decorators import method_decorator
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django.shortcuts import render, get_object_or_404, redirect from django.shortcuts import render, get_object_or_404, redirect
from django.contrib import messages from django.contrib import messages
from django.core.exceptions import PermissionDenied 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 django.conf import settings
from guardian.decorators import permission_required_or_403 as permission_required 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) 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): class TariffsListView(BaseServiceListView, OrderingMixin):
""" """
Show Services(Tariffs) list 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(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): class PeriodicPaysListView(BaseServiceListView):
context_object_name = 'pays' context_object_name = 'pays'
model = PeriodicPay model = PeriodicPay

3
taskapp/views.py

@ -18,7 +18,8 @@ from jsonview.decorators import json_view
from chatbot.models import MessageQueue from chatbot.models import MessageQueue
from abonapp.models import Abon from abonapp.models import Abon
from djing import httpresponse_to_referrer 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 .handle import TaskException
from .models import Task, ExtraComment from .models import Task, ExtraComment
from .forms import TaskFrm, ExtraCommentForm 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