diff --git a/abonapp/models.py b/abonapp/models.py index d2b2408..00cfb73 100644 --- a/abonapp/models.py +++ b/abonapp/models.py @@ -97,7 +97,8 @@ class Abon(BaseAccount): device = models.ForeignKey('devapp.Device', null=True, blank=True, on_delete=models.SET_NULL) dev_port = models.ForeignKey('devapp.Port', null=True, blank=True, on_delete=models.SET_NULL) is_dynamic_ip = models.BooleanField(default=False) - nas = models.ForeignKey('nas_app.NASModel', null=True, blank=True, on_delete=models.SET_NULL, verbose_name=_('Network access server'), default=None) + nas = models.ForeignKey('nas_app.NASModel', null=True, blank=True, on_delete=models.SET_NULL, + verbose_name=_('Network access server'), default=None) MARKER_FLAGS = ( ('icon_donkey', _('Donkey')), @@ -337,12 +338,13 @@ class AllTimePayLogManager(models.Manager): def by_days(): cur = connection.cursor() cur.execute( - 'SELECT SUM(summ) as alsum, DATE_FORMAT(date_add, "%Y-%m-%d") AS pay_date FROM all_time_pay_log ' + 'SELECT SUM(summ) AS alsum, DATE_FORMAT(date_add, "%Y-%m-%d") AS pay_date FROM all_time_pay_log ' 'GROUP BY DATE_FORMAT(date_add, "%Y-%m-%d")' ) while True: r = cur.fetchone() - if r is None: break + if r is None: + break summ, dat = r yield {'summ': summ, 'pay_date': datetime.strptime(dat, '%Y-%m-%d')} @@ -420,7 +422,7 @@ class PeriodicPayForId(models.Model): next_pay = models.DateTimeField(_('Next time to pay')) account = models.ForeignKey(Abon, on_delete=models.CASCADE, verbose_name=_('Account')) - def payment_for_service(self, author: UserProfile=None, now=None): + def payment_for_service(self, author: UserProfile = None, now=None): """ Charge for the service and leave a log about it :param now: Current date, if now is None than it calculates in here diff --git a/abonapp/views.py b/abonapp/views.py index 89b244d..0a10700 100644 --- a/abonapp/views.py +++ b/abonapp/views.py @@ -13,8 +13,6 @@ from django.utils.translation import gettext_lazy as _ from django.utils.decorators import method_decorator from django.views.generic import ListView, UpdateView, CreateView, DeleteView from django.conf import settings -from djing.lib import DuplicateEntry -from jsonview.decorators import json_view from agent.commands.dhcp import dhcp_commit, dhcp_expiry, dhcp_release from nas_app.models import NASModel @@ -33,10 +31,11 @@ from guardian.shortcuts import get_objects_for_user, assign_perm from guardian.decorators import permission_required_or_403 as permission_required from djing import ping from djing import lib +from djing.lib.decorators import json_view, only_admins from djing.global_base_views import OrderedFilteredList, SecureApiView -login_decs = login_required, lib.decorators.only_admins +login_decs = login_required, only_admins @method_decorator(login_decs, name='dispatch') @@ -188,7 +187,7 @@ class DelAbonDeleteView(DeleteView): @login_required -@lib.decorators.only_admins +@only_admins @permission_required('abonapp.can_add_ballance') @transaction.atomic def abonamount(request, gid: int, uname): @@ -260,7 +259,7 @@ class PayHistoryListView(OrderedFilteredList): @login_required -@lib.decorators.only_admins +@only_admins def abon_services(request, gid: int, uname): grp = get_object_or_404(Group, pk=gid) if not request.user.has_perm('group_app.view_group', grp): @@ -371,7 +370,7 @@ def terminal_pay(request): @login_required -@lib.decorators.only_admins +@only_admins @permission_required('abonapp.add_invoiceforpayment') def add_invoice(request, gid: int, uname: str): abon = get_object_or_404(models.Abon, username=uname) @@ -408,7 +407,7 @@ def add_invoice(request, gid: int, uname: str): @login_required -@lib.decorators.only_admins +@only_admins @permission_required('abonapp.can_buy_tariff') @transaction.atomic def pick_tariff(request, gid: int, uname): @@ -455,7 +454,7 @@ def pick_tariff(request, gid: int, uname): @login_required -@lib.decorators.only_admins +@only_admins @permission_required('abonapp.can_complete_service') def unsubscribe_service(request, gid: int, uname, abon_tariff_id: int): try: @@ -553,7 +552,7 @@ class PassportUpdateView(UpdateView): @login_required -@lib.decorators.only_admins +@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): @@ -574,7 +573,7 @@ def chgroup_tariff(request, gid): @login_required -@lib.decorators.only_admins +@only_admins @permission_required('abonapp.change_abon') def dev(request, gid: int, uname): abon_dev = None @@ -600,7 +599,7 @@ def dev(request, gid: int, uname): @login_required -@lib.decorators.only_admins +@only_admins @permission_required('abonapp.change_abon') @permission_required('group_app.view_group', (Group, 'pk', 'gid')) def clear_dev(request, gid: int, uname): @@ -618,7 +617,7 @@ def clear_dev(request, gid: int, uname): @login_required -@lib.decorators.only_admins +@only_admins @permission_required('group_app.view_group', (Group, 'pk', 'gid')) def charts(request, gid: int, uname): high = 100 @@ -669,7 +668,7 @@ def charts(request, gid: int, uname): @login_required -@lib.decorators.only_admins +@only_admins @permission_required('abonapp.can_ping') @json_view def abon_ping(request, gid: int, uname): @@ -722,7 +721,7 @@ def abon_ping(request, gid: int, uname): @login_required -@lib.decorators.only_admins +@only_admins def vcards(r): users = models.Abon.objects.exclude(group=None).select_related('group', 'street').only( 'username', 'fio', 'group__title', 'telephone', @@ -807,7 +806,7 @@ class DialsListView(OrderedFilteredList): @login_required -@lib.decorators.only_admins +@only_admins @permission_required('abonapp.change_abon') def save_user_dev_port(request, gid: int, uname): if request.method != 'POST': @@ -854,7 +853,7 @@ def save_user_dev_port(request, gid: int, uname): @login_required -@lib.decorators.only_admins +@only_admins @permission_required('abonapp.add_abonstreet') @permission_required('group_app.view_group', (Group, 'pk', 'gid')) def street_add(request, gid): @@ -875,7 +874,7 @@ def street_add(request, gid): @login_required -@lib.decorators.only_admins +@only_admins @permission_required('abonapp.change_abonstreet') @permission_required('group_app.view_group', (Group, 'pk', 'gid')) def street_edit(request, gid): @@ -899,7 +898,7 @@ def street_edit(request, gid): @login_required -@lib.decorators.only_admins +@only_admins @permission_required('abonapp.delete_abonstreet') @permission_required('group_app.view_group', (Group, 'pk', 'gid')) def street_del(request, gid: int, sid: int): @@ -912,7 +911,7 @@ def street_del(request, gid: int, sid: int): @login_required -@lib.decorators.only_admins +@only_admins @permission_required('group_app.view_group', (Group, 'pk', 'gid')) def active_nets(request, gid): nets = NetworkModel.objects.filter(groups__id=gid) @@ -922,7 +921,7 @@ def active_nets(request, gid): @login_required -@lib.decorators.only_admins +@only_admins @permission_required('abonapp.view_additionaltelephones') @permission_required('group_app.view_group', (Group, 'pk', 'gid')) def tels(request, gid: int, uname): @@ -936,7 +935,7 @@ def tels(request, gid: int, uname): @login_required -@lib.decorators.only_admins +@only_admins @permission_required('abonapp.add_additionaltelephone') def tel_add(request, gid: int, uname): if request.method == 'POST': @@ -960,7 +959,7 @@ def tel_add(request, gid: int, uname): @login_required -@lib.decorators.only_admins +@only_admins @permission_required('abonapp.delete_additionaltelephone') def tel_del(request, gid: int, uname): try: @@ -974,7 +973,7 @@ def tel_del(request, gid: int, uname): @login_required -@lib.decorators.only_admins +@only_admins @permission_required('group_app.view_group', (Group, 'pk', 'gid')) def phonebook(request, gid): res_format = request.GET.get('f') @@ -997,7 +996,7 @@ def phonebook(request, gid): @login_required -@lib.decorators.only_admins +@only_admins @permission_required('group_app.view_group', (Group, 'pk', 'gid')) def abon_export(request, gid): res_format = request.GET.get('f') @@ -1033,7 +1032,7 @@ def abon_export(request, gid): @login_required -@lib.decorators.only_admins +@only_admins def fin_report(request): q = models.AllTimePayLog.objects.by_days() res_format = request.GET.get('f') @@ -1051,7 +1050,7 @@ def fin_report(request): @login_required -@lib.decorators.only_admins +@only_admins @permission_required('group_app.view_group', (Group, 'pk', 'gid')) def add_edit_periodic_pay(request, gid: int, uname, periodic_pay_id=0): if periodic_pay_id == 0: @@ -1083,7 +1082,7 @@ def add_edit_periodic_pay(request, gid: int, uname, periodic_pay_id=0): @login_required -@lib.decorators.only_admins +@only_admins @permission_required('group_app.view_group', (Group, 'pk', 'gid')) @permission_required('abonapp.delete_periodicpayforid') def del_periodic_pay(request, gid: int, uname, periodic_pay_id): @@ -1129,7 +1128,7 @@ class EditSibscriberMarkers(UpdateView): @login_required -@lib.decorators.only_admins +@only_admins @permission_required('abonapp.change_abon') def user_session_toggle(request, gid: int, uname, lease_id: int, action=None): abon = get_object_or_404(models.Abon, username=uname) @@ -1160,7 +1159,7 @@ def user_session_toggle(request, gid: int, uname, lease_id: int, action=None): @login_required -@lib.decorators.only_admins +@only_admins @permission_required('abonapp.change_abon') def lease_add(request, gid: int, uname): group = get_object_or_404(Group, pk=gid) @@ -1206,7 +1205,7 @@ def lease_add(request, gid: int, uname): @login_required -@lib.decorators.only_admins +@only_admins @permission_required('abonapp.change_abon') def attach_nas(request, gid): if request.method == 'POST': @@ -1230,7 +1229,7 @@ def attach_nas(request, gid): # API's @login_required -@lib.decorators.only_admins +@only_admins @json_view def abons(request): ablist = ({ @@ -1255,7 +1254,7 @@ def abons(request): @login_required -@lib.decorators.only_admins +@only_admins @json_view def search_abon(request): word = request.GET.get('s') @@ -1310,7 +1309,7 @@ class DhcpLever(SecureApiView): except lib.LogicError as e: print('LogicError', e) return str(e) - except DuplicateEntry as e: + except lib.DuplicateEntry as e: print('Duplicate:', e) return str(e) diff --git a/devapp/views.py b/devapp/views.py index f481cc9..314efab 100644 --- a/devapp/views.py +++ b/devapp/views.py @@ -4,7 +4,7 @@ from django.contrib.auth.decorators import login_required from django.core.exceptions import PermissionDenied from django.db import IntegrityError from django.db.models import Q, Count -from django.http import HttpResponse, Http404, JsonResponse +from django.http import HttpResponse, Http404 from django.shortcuts import render, redirect, get_object_or_404, resolve_url from django.contrib import messages from django.utils.decorators import method_decorator @@ -24,7 +24,7 @@ from guardian.decorators import permission_required_or_403 as permission_require from guardian.shortcuts import get_objects_for_user from chatbot.send_func import send_notify from chatbot.models import ChatException -from jsonview.decorators import json_view +from djing.lib.decorators import json_view from djing import global_base_views, MAC_ADDR_REGEX, ping, get_object_or_None from .models import Device, Port, DeviceDBException, DeviceMonitoringException from .forms import DeviceForm, PortForm, DeviceExtraDataForm @@ -516,6 +516,7 @@ class GroupsListView(global_base_views.OrderedFilteredList): @login_required @only_admins +@json_view def search_dev(request): word = request.GET.get('s') if word is None or word == '': @@ -532,7 +533,7 @@ def search_dev(request): 'id': device.pk, 'text': "%s: %s" % (device.ip_address or '', device.comment) } for device in results) - return JsonResponse(results, safe=False) + return results @login_required diff --git a/dialing_app/views.py b/dialing_app/views.py index a7014f4..6fa6e08 100644 --- a/dialing_app/views.py +++ b/dialing_app/views.py @@ -11,13 +11,12 @@ from django.views.generic import ListView from guardian.decorators import permission_required_or_403 as permission_required from django.db.models import Q from django.conf import settings -from 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 safe_int -from djing.lib.decorators import only_admins +from djing.lib.decorators import only_admins, json_view from .models import AsteriskCDR, SMSModel, SMSOut from .forms import SMSOutForm diff --git a/djing/lib/decorators.py b/djing/lib/decorators.py index 0e5221e..cbdf61f 100644 --- a/djing/lib/decorators.py +++ b/djing/lib/decorators.py @@ -1,6 +1,6 @@ from functools import wraps from django.conf import settings -from django.http import HttpResponseRedirect, HttpResponseForbidden +from django.http import HttpResponseRedirect, HttpResponseForbidden, JsonResponse from django.shortcuts import redirect from djing.lib import check_sign @@ -92,3 +92,14 @@ class LazyInitMetaclass(type): setattr(new_class, '_lazy_init', real_init) return new_class + + +# Wraps return data to JSON +def json_view(fn): + @wraps(fn) + def wrapped(request, *args, **kwargs): + r = fn(request, *args, **kwargs) + return JsonResponse(r, safe=False, json_dumps_params={ + 'ensure_ascii': False + }) + return wrapped diff --git a/mapapp/views.py b/mapapp/views.py index 74c0034..11934b3 100644 --- a/mapapp/views.py +++ b/mapapp/views.py @@ -8,13 +8,12 @@ from django.utils.decorators import method_decorator from django.db.models import Count from django.views.generic import ListView from django.conf import settings -from jsonview.decorators import json_view from group_app.models import Group from .models import Dot from .forms import DotForm from djing.lib import safe_int -from djing.lib.decorators import only_admins +from djing.lib.decorators import only_admins, json_view from devapp.models import Device from guardian.decorators import permission_required diff --git a/nas_app/nas_managers/core.py b/nas_app/nas_managers/core.py index 88c1547..457fe70 100644 --- a/nas_app/nas_managers/core.py +++ b/nas_app/nas_managers/core.py @@ -22,7 +22,7 @@ class BaseTransmitter(ABC): :return: Returnd a description of nas implementation """ - def __init__(self, login: str, password: str, ip: str, port: int, *args, **kwargs): + def __init__(self, ip: str, *args, **kwargs): if not ping(ip): raise NasNetworkError('NAS %(ip_addr)s does not pinged' % { 'ip_addr': ip @@ -34,34 +34,48 @@ class BaseTransmitter(ABC): @abstractmethod def add_user_range(self, user_list: VectorAbon): - """add subscribers list to NAS""" + """add subscribers list to NAS + :param user_list: Vector of instances of subscribers + """ @abstractmethod def remove_user_range(self, users: VectorAbon): - """remove subscribers list""" + """remove subscribers list + :param users: Vector of instances of subscribers + """ @abstractmethod def add_user(self, user: AbonStruct, *args): - """add subscriber""" + """add subscriber + :param user: Subscriber instance + """ @abstractmethod def remove_user(self, user: AbonStruct): - """remove subscriber""" + """ + remove subscriber + :param user: Subscriber instance + """ @abstractmethod def update_user(self, user: AbonStruct, *args): """ Update subscriber by uid, you can change everything except its uid. Subscriber will found by UID. + :param user: Subscriber instance """ @abstractmethod def add_tariff_range(self, tariff_list: VectorTariff): - """Add services list to NAS.""" + """Add services list to NAS. + :param tariff_list: Vector of TariffStruct + """ @abstractmethod def remove_tariff_range(self, tariff_list: VectorTariff): - """Remove tariff list by unique id list.""" + """Remove tariff list by unique id list. + :param tariff_list: Vector of TariffStruct + """ @abstractmethod def add_tariff(self, tariff: TariffStruct): @@ -72,6 +86,7 @@ class BaseTransmitter(ABC): """ Update tariff by uid, you can change everything except its uid. Tariff will found by UID. + :param tariff: Service for update """ @abstractmethod @@ -97,6 +112,8 @@ class BaseTransmitter(ABC): def lease_free(self, user: AbonStruct, lease): """ Remove ip lease from allowed to network + :param lease: ip_address for lease + :param user: Subscriber instance :return: """ @@ -104,6 +121,8 @@ class BaseTransmitter(ABC): def lease_start(self, user: AbonStruct, lease): """ Starts ip lease to allowed to network + :param lease: ip_address for lease + :param user: Subscriber instance :return: """ @@ -112,7 +131,8 @@ class BaseTransmitter(ABC): :param users_from_db: QuerySet of all subscribers that can have service :return: Tuple of 2 lists that contain list to add users and list to remove users """ - users_struct_gen = (ab.build_agent_struct(raise_errs=False) for ab in users_from_db if ab is not None and ab.is_access()) + users_struct_gen = (ab.build_agent_struct(raise_errs=False) for ab in users_from_db if + ab is not None and ab.is_access()) users_struct_set = set(ab for ab in users_struct_gen if ab is not None and ab.tariff is not None) users_from_nas = set(self.read_users()) if len(users_from_nas) < 1: diff --git a/periodic.py b/periodic.py index 182841e..ed40fae 100755 --- a/periodic.py +++ b/periodic.py @@ -23,11 +23,11 @@ class NasSyncThread(Thread): def run(self): try: tm = self.nas.get_nas_manager() - users = Abon.objects\ - .annotate(ips_count=Count('ip_addresses'))\ - .filter(is_active=True, ips_count__gt=0, nas=self.nas)\ - .exclude(current_tariff=None)\ - .prefetch_related('ip_addresses')\ + users = Abon.objects \ + .annotate(ips_count=Count('ip_addresses')) \ + .filter(is_active=True, ips_count__gt=0, nas=self.nas) \ + .exclude(current_tariff=None) \ + .prefetch_related('ip_addresses') \ .iterator() tm.sync_nas(users) except NasNetworkError as er: @@ -70,7 +70,9 @@ def main(): old_leases.delete() # sync subscribers on NAS - threads = tuple(NasSyncThread(nas) for nas in NASModel.objects.annotate(usercount=Count('abon')).filter(usercount__gt=0)) + threads = tuple(NasSyncThread(nas) for nas in NASModel.objects. + annotate(usercount=Count('abon')). + filter(usercount__gt=0)) for t in threads: t.start() for t in threads: diff --git a/requirements.txt b/requirements.txt index 03ea6e3..9553b0e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -22,7 +22,6 @@ django-jsonfield requests webdavclient pyst2 -django-jsonview django-bitfield transliterate asterisk diff --git a/taskapp/views.py b/taskapp/views.py index 32e86b8..2e928df 100644 --- a/taskapp/views.py +++ b/taskapp/views.py @@ -12,13 +12,12 @@ from datetime import datetime from django.views.generic.edit import FormMixin, DeleteView, UpdateView from guardian.decorators import permission_required_or_403 as permission_required -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 safe_int, MultipleException, RuTimedelta -from djing.lib.decorators import only_admins +from djing.lib.decorators import only_admins, json_view from .handle import TaskException from .models import Task, ExtraComment from .forms import TaskFrm, ExtraCommentForm