Browse Source

refactoring

devel
Dmitry Novikov 8 years ago
parent
commit
cd5abe1136
  1. 10
      abonapp/models.py
  2. 65
      abonapp/views.py
  3. 7
      devapp/views.py
  4. 3
      dialing_app/views.py
  5. 13
      djing/lib/decorators.py
  6. 3
      mapapp/views.py
  7. 36
      nas_app/nas_managers/core.py
  8. 14
      periodic.py
  9. 1
      requirements.txt
  10. 3
      taskapp/views.py

10
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

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

7
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

3
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

13
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

3
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

36
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:

14
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:

1
requirements.txt

@ -22,7 +22,6 @@ django-jsonfield
requests
webdavclient
pyst2
django-jsonview
django-bitfield
transliterate
asterisk

3
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

Loading…
Cancel
Save