From ece12fbace3b9a222153ced1ee444cd9d5cf7a9d Mon Sep 17 00:00:00 2001 From: Dmitry Novikov Date: Tue, 20 Nov 2018 17:22:44 +0300 Subject: [PATCH] Refactoring. Fix line length by PEP8 --- abonapp/admin.py | 20 +- abonapp/forms.py | 129 ++++++--- abonapp/models/__init__.py | 0 abonapp/{models.py => models/generic.py} | 1 - abonapp/models/payment.py | 0 abonapp/tests.py | 2 +- abonapp/views.py | 316 +++++++++++++---------- accounts_app/templatetags/acc_tags.py | 7 +- agent/commands/dhcp.py | 13 +- clientsideapp/views.py | 39 ++- devapp/views.py | 73 ++++-- dialing_app/views.py | 16 +- djing/lib/auth_backends.py | 7 +- gw_app/tests.py | 76 ++++-- periodic.py | 3 +- searchapp/views.py | 12 +- taskapp/models.py | 69 +++-- taskapp/views.py | 65 +++-- 18 files changed, 550 insertions(+), 298 deletions(-) create mode 100644 abonapp/models/__init__.py rename abonapp/{models.py => models/generic.py} (99%) create mode 100644 abonapp/models/payment.py diff --git a/abonapp/admin.py b/abonapp/admin.py index cda6f48..f98011b 100644 --- a/abonapp/admin.py +++ b/abonapp/admin.py @@ -1,13 +1,13 @@ from django.contrib import admin -from . import models +from abonapp.models import generic -admin.site.register(models.Abon) -admin.site.register(models.InvoiceForPayment) -admin.site.register(models.AbonLog) -admin.site.register(models.AbonTariff) -admin.site.register(models.AbonStreet) -admin.site.register(models.AllTimePayLog) -admin.site.register(models.AbonRawPassword) -admin.site.register(models.PassportInfo) -admin.site.register(models.AdditionalTelephone) +admin.site.register(generic.Abon) +admin.site.register(generic.InvoiceForPayment) +admin.site.register(generic.AbonLog) +admin.site.register(generic.AbonTariff) +admin.site.register(generic.AbonStreet) +admin.site.register(generic.AllTimePayLog) +admin.site.register(generic.AbonRawPassword) +admin.site.register(generic.PassportInfo) +admin.site.register(generic.AdditionalTelephone) diff --git a/abonapp/forms.py b/abonapp/forms.py index 34f6096..3a32dda 100644 --- a/abonapp/forms.py +++ b/abonapp/forms.py @@ -7,7 +7,7 @@ from string import digits, ascii_lowercase from djing.lib import LogicError from ip_pool.models import NetworkModel from gw_app.models import NASModel -from . import models +from abonapp.models import generic from django.conf import settings @@ -15,12 +15,18 @@ def _generate_random_chars(length=6, chars=digits, split=2, delimiter=''): username = ''.join(choice(chars) for i in range(length)) if split: - username = delimiter.join(username[start:start + split] for start in range(0, len(username), split)) + username = delimiter.join( + username[start:start + split] + for start in range(0, len(username), split) + ) try: - models.Abon.objects.get(username=username) - return _generate_random_chars(length=length, chars=chars, split=split, delimiter=delimiter) - except models.Abon.DoesNotExist: + generic.Abon.objects.get(username=username) + return _generate_random_chars( + length=length, chars=chars, + split=split, delimiter=delimiter + ) + except generic.Abon.DoesNotExist: return username @@ -38,9 +44,13 @@ class AbonForm(forms.ModelForm): super(AbonForm, self).__init__(*args, **kwargs) instance = getattr(self, 'instance') if instance is not None and instance.group is not None: - abon_group_queryset = models.AbonStreet.objects.filter(group=instance.group) + abon_group_queryset = generic.AbonStreet.objects.filter( + group=instance.group + ) elif 'group' in self.initial.keys() and self.initial['group'] is not None: - abon_group_queryset = models.AbonStreet.objects.filter(group=self.initial['group']) + abon_group_queryset = generic.AbonStreet.objects.filter( + group=self.initial['group'] + ) else: abon_group_queryset = None if abon_group_queryset is not None: @@ -48,20 +58,26 @@ class AbonForm(forms.ModelForm): if instance.pk is None: self.initial['nas'] = NASModel.objects.filter(default=True).first() - username = forms.CharField(max_length=127, required=False, initial=_generate_random_username, + username = forms.CharField(max_length=127, required=False, + initial=_generate_random_username, widget=forms.TextInput(attrs={ 'placeholder': _('login'), 'required': '', 'pattern': r'^\w{1,127}$' }), label=_('login')) - password = forms.CharField(max_length=64, initial=_generate_random_password, widget=forms.TextInput(attrs={ - 'type': 'password', 'autocomplete': 'new-password' - }), label=_('Password')) + password = forms.CharField( + max_length=64, initial=_generate_random_password, + widget=forms.TextInput(attrs={ + 'type': 'password', 'autocomplete': 'new-password' + }), + label=_('Password') + ) class Meta: - model = models.Abon - fields = ('username', 'telephone', 'fio', 'group', 'description', 'street', 'house', 'is_active', 'nas') + model = generic.Abon + fields = ('username', 'telephone', 'fio', 'group', + 'description', 'street', 'house', 'is_active', 'nas') widgets = { 'fio': forms.TextInput(attrs={ 'placeholder': _('fio'), @@ -69,7 +85,10 @@ class AbonForm(forms.ModelForm): }), 'telephone': forms.TextInput(attrs={ 'placeholder': _('telephone placeholder'), - 'pattern': getattr(settings, 'TELEPHONE_REGEXP', r'^(\+[7,8,9,3]\d{10,11})?$') + 'pattern': getattr( + settings, 'TELEPHONE_REGEXP', + r'^(\+[7,8,9,3]\d{10,11})?$' + ) }), 'description': forms.Textarea(attrs={'rows': '4'}) } @@ -81,11 +100,11 @@ class AbonForm(forms.ModelForm): if commit: acc.save() try: - abon_raw_passw = models.AbonRawPassword.objects.get(account=acc) + abon_raw_passw = generic.AbonRawPassword.objects.get(account=acc) abon_raw_passw.passw_text = raw_password abon_raw_passw.save(update_fields=('passw_text',)) - except models.AbonRawPassword.DoesNotExist: - models.AbonRawPassword.objects.create( + except generic.AbonRawPassword.DoesNotExist: + generic.AbonRawPassword.objects.create( account=acc, passw_text=raw_password ) @@ -94,44 +113,59 @@ class AbonForm(forms.ModelForm): class PassportForm(forms.ModelForm): class Meta: - model = models.PassportInfo + model = generic.PassportInfo exclude = ('abon',) widgets = { - 'series': forms.TextInput(attrs={'required': '', 'pattern': '^\d{4}$'}), - 'number': forms.TextInput(attrs={'required': '', 'pattern': '^\d{6}$'}), + 'series': forms.TextInput(attrs={ + 'required': '', + 'pattern': '^\d{4}$'} + ), + 'number': forms.TextInput( + attrs={'required': '', 'pattern': '^\d{6}$'} + ), 'distributor': forms.TextInput(attrs={'required': ''}), - 'date_of_acceptance': forms.DateInput(attrs={'class': 'form-control', 'required': ''}, format='%Y-%m-%d') + 'date_of_acceptance': forms.DateInput(attrs={ + 'class': 'form-control', 'required': '' + }, format='%Y-%m-%d') } class AbonStreetForm(forms.ModelForm): class Meta: - model = models.AbonStreet + model = generic.AbonStreet fields = '__all__' widgets = { - 'name': forms.TextInput(attrs={'class': 'form-control', 'required': '', 'autofocus': ''}), + 'name': forms.TextInput(attrs={ + 'class': 'form-control', + 'required': '', 'autofocus': '' + }), 'group': forms.Select(attrs={'class': 'form-control'}) } class AdditionalTelephoneForm(forms.ModelForm): class Meta: - model = models.AdditionalTelephone + model = generic.AdditionalTelephone exclude = ('abon',) widgets = { 'telephone': forms.TextInput(attrs={ 'placeholder': _('telephone placeholder'), - 'pattern': getattr(settings, 'TELEPHONE_REGEXP', r'^(\+[7,8,9,3]\d{10,11})?$'), + 'pattern': getattr( + settings, 'TELEPHONE_REGEXP', + r'^(\+[7,8,9,3]\d{10,11})?$' + ), 'required': '', 'class': 'form-control' }), - 'owner_name': forms.TextInput(attrs={'class': 'form-control', 'required': ''}) + 'owner_name': forms.TextInput(attrs={ + 'class': 'form-control', 'required': '' + }) } class PeriodicPayForIdForm(forms.ModelForm): class Meta: - model = models.PeriodicPayForId + model = generic.PeriodicPayForId exclude = ('account',) @@ -151,14 +185,16 @@ class ExportUsersForm(forms.Form): ('dev_port__descr', _('Device port')), ('is_dynamic_ip', _('Is dynamic ip')) ) - fields = forms.MultipleChoiceField(choices=FIELDS_CHOICES, - widget=forms.CheckboxSelectMultiple(attrs={"checked": ""}), - label=_('Fields')) + fields = forms.MultipleChoiceField( + choices=FIELDS_CHOICES, + widget=forms.CheckboxSelectMultiple(attrs={"checked": ""}), + label=_('Fields') + ) class MarkersForm(forms.ModelForm): class Meta: - model = models.Abon + model = generic.Abon fields = 'markers', def save(self, commit=True): @@ -169,7 +205,10 @@ class MarkersForm(forms.ModelForm): class AmountMoneyForm(forms.Form): amount = forms.FloatField(max_value=5000, label=_('Amount of money')) - comment = forms.CharField(max_length=128, label=_('Comment'), required=False) + comment = forms.CharField( + max_length=128, label=_('Comment'), + required=False + ) class AddIpForm(forms.ModelForm): @@ -178,21 +217,33 @@ class AddIpForm(forms.ModelForm): instance = getattr(self, 'instance') if instance: if instance.group: - self.fields['networks'].queryset = NetworkModel.objects.filter(groups=instance.group) + self.fields['networks'].queryset = NetworkModel.objects.filter( + groups=instance.group + ) if not self.initial['ip_address']: if instance: - net = NetworkModel.objects.filter(groups=instance.group).first() + net = NetworkModel.objects.filter( + groups=instance.group + ).first() if net is not None: - ips = (ip.ip_address for ip in - models.Abon.objects.filter(group__in=net.groups.all()).order_by('ip_address').only( - 'ip_address').iterator()) + ips = ( + ip.ip_address for ip in generic.Abon.objects.filter( + group__in=net.groups.all() + ).order_by('ip_address').only( + 'ip_address' + ).iterator() + ) free_ip = net.get_free_ip(ips) self.initial['ip_address'] = free_ip else: raise LogicError(_('Subnet has not attached to current group')) - networks = forms.ModelChoiceField(label=_('Networks'), queryset=NetworkModel.objects.none(), empty_label=None) + networks = forms.ModelChoiceField( + label=_('Networks'), + queryset=NetworkModel.objects.none(), + empty_label=None + ) class Meta: - model = models.Abon + model = generic.Abon fields = 'ip_address', diff --git a/abonapp/models/__init__.py b/abonapp/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/abonapp/models.py b/abonapp/models/generic.py similarity index 99% rename from abonapp/models.py rename to abonapp/models/generic.py index 7878895..2598abd 100644 --- a/abonapp/models.py +++ b/abonapp/models/generic.py @@ -16,7 +16,6 @@ from django.utils.translation import ugettext_lazy as _, gettext from djing.lib import LogicError from group_app.models import Group from gw_app.nas_managers import SubnetQueue, NasFailedResult, NasNetworkError -from ip_pool.models import NetworkModel from tariff_app.models import Tariff, PeriodicPay diff --git a/abonapp/models/payment.py b/abonapp/models/payment.py new file mode 100644 index 0000000..e69de29 diff --git a/abonapp/tests.py b/abonapp/tests.py index 131b00c..5a7d896 100644 --- a/abonapp/tests.py +++ b/abonapp/tests.py @@ -11,7 +11,7 @@ from django.utils.html import escape from django.utils.translation import gettext_lazy as _ from xmltodict import parse -from abonapp.models import Abon, AbonStreet, PassportInfo +from abonapp.models.generic import Abon, AbonStreet, PassportInfo from abonapp.pay_systems import allpay from group_app.models import Group from tariff_app.models import Tariff diff --git a/abonapp/views.py b/abonapp/views.py index de135df..4c444a9 100644 --- a/abonapp/views.py +++ b/abonapp/views.py @@ -8,7 +8,8 @@ from django.conf import settings from django.contrib import messages from django.contrib.auth.decorators import login_required from django.contrib.auth.mixins import LoginRequiredMixin, \ - PermissionRequiredMixin as PermissionRequiredMixin_django, PermissionRequiredMixin + PermissionRequiredMixin as PermissionRequiredMixin_django, \ + PermissionRequiredMixin from django.core.exceptions import PermissionDenied, ValidationError from django.db import IntegrityError, ProgrammingError, transaction, \ DatabaseError @@ -25,7 +26,8 @@ from djing import lib from djing import ping from djing.global_base_views import OrderedFilteredList, SecureApiView from djing.lib.decorators import json_view, only_admins -from djing.lib.mixins import OnlyAdminsMixin, LoginAdminPermissionMixin, LoginAdminMixin +from djing.lib.mixins import OnlyAdminsMixin, LoginAdminPermissionMixin, \ + LoginAdminMixin from group_app.models import Group from guardian.decorators import \ permission_required_or_403 as permission_required @@ -36,8 +38,8 @@ from ip_pool.models import NetworkModel from tariff_app.models import Tariff from taskapp.models import Task from xmlview.decorators import xml_view -from . import forms -from . import models +from abonapp import forms +from abonapp.models import generic class PeoplesListView(LoginRequiredMixin, OnlyAdminsMixin, @@ -47,7 +49,7 @@ class PeoplesListView(LoginRequiredMixin, OnlyAdminsMixin, def get_queryset(self): street_id = lib.safe_int(self.request.GET.get('street')) gid = lib.safe_int(self.kwargs.get('gid')) - peoples_list = models.Abon.objects.filter(group__pk=gid) + peoples_list = generic.Abon.objects.filter(group__pk=gid) if street_id > 0: peoples_list = peoples_list.filter(street=street_id) peoples_list = peoples_list.select_related( @@ -73,8 +75,9 @@ class PeoplesListView(LoginRequiredMixin, OnlyAdminsMixin, context = super(PeoplesListView, self).get_context_data(**kwargs) - context['streets'] = models.AbonStreet.objects.filter(group=gid).only( - 'name') + context['streets'] = generic.AbonStreet.objects.filter( + group=gid + ).only('name') context['street_id'] = lib.safe_int(self.request.GET.get('street')) context['group'] = group return context @@ -87,9 +90,11 @@ class GroupListView(LoginRequiredMixin, OnlyAdminsMixin, OrderedFilteredList): def get_queryset(self): queryset = super(GroupListView, self).get_queryset() - queryset = get_objects_for_user(self.request.user, - 'group_app.view_group', klass=queryset, - accept_global_perms=False) + queryset = get_objects_for_user( + self.request.user, + 'group_app.view_group', klass=queryset, + accept_global_perms=False + ) return queryset @@ -99,7 +104,7 @@ class AbonCreateView(LoginRequiredMixin, OnlyAdminsMixin, group = None abon = None form_class = forms.AbonForm - model = models.Abon + model = generic.Abon template_name = 'abonapp/addAbon.html' context_object_name = 'group' @@ -156,7 +161,7 @@ class AbonCreateView(LoginRequiredMixin, OnlyAdminsMixin, class DelAbonDeleteView(LoginAdminMixin, PermissionRequiredMixin, DeleteView): permission_required = 'abonapp.delete_abon' - model = models.Abon + model = generic.Abon slug_url_kwarg = 'uname' slug_field = 'username' success_url = reverse_lazy('abonapp:group_list') @@ -198,7 +203,7 @@ class DelAbonDeleteView(LoginAdminMixin, PermissionRequiredMixin, DeleteView): @permission_required('abonapp.can_add_ballance') @transaction.atomic def abonamount(request, gid: int, uname): - abon = get_object_or_404(models.Abon, username=uname) + abon = get_object_or_404(generic.Abon, username=uname) frm = None try: if request.method == 'POST': @@ -211,7 +216,8 @@ def abonamount(request, gid: int, uname): abon.add_ballance(request.user, amnt, comment=comment) abon.save(update_fields=('ballance',)) messages.success( - request, _('Account filled successfully on %.2f') % amnt) + request, _('Account filled successfully on %.2f') % amnt + ) return redirect('abonapp:abon_phistory', gid=gid, uname=uname) else: messages.error(request, _('I not know the account id')) @@ -238,10 +244,10 @@ class DebtsListView(LoginAdminPermissionMixin, OrderedFilteredList): return self.abon.group def get_queryset(self): - abon = get_object_or_404(models.Abon, + abon = get_object_or_404(generic.Abon, username=self.kwargs.get('uname')) self.abon = abon - return models.InvoiceForPayment.objects.filter(abon=abon) + return generic.InvoiceForPayment.objects.filter(abon=abon) def get_context_data(self, **kwargs): context = super(DebtsListView, self).get_context_data(**kwargs) @@ -258,14 +264,15 @@ class PayHistoryListView(LoginAdminPermissionMixin, OrderedFilteredList): def get_permission_object(self): if hasattr(self, 'abon'): return self.abon.group - return models.Group.objects.filter(pk=self.kwargs.get('gid')).first() + return generic.Group.objects.filter(pk=self.kwargs.get('gid')).first() def get_queryset(self): - abon = get_object_or_404(models.Abon, + abon = get_object_or_404(generic.Abon, username=self.kwargs.get('uname')) self.abon = abon - pay_history = models.AbonLog.objects.filter(abon=abon).order_by( - '-date') + pay_history = generic.AbonLog.objects.filter( + abon=abon + ).order_by('-date') return pay_history def get_context_data(self, **kwargs): @@ -281,17 +288,20 @@ 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): raise PermissionDenied - abon = get_object_or_404(models.Abon, username=uname) + abon = get_object_or_404(generic.Abon, username=uname) if abon.group != grp: - messages.warning(request, - _("User group id is not matches with group in url")) + messages.warning( + request, + _("User group id is not matches with group in url") + ) return redirect('abonapp:abon_services', abon.group.id, abon.username) try: - periodic_pay = models.PeriodicPayForId.objects.filter( - account=abon).first() - except models.PeriodicPayForId.DoesNotExist: + periodic_pay = generic.PeriodicPayForId.objects.filter( + account=abon + ).first() + except generic.PeriodicPayForId.DoesNotExist: periodic_pay = None return render(request, 'abonapp/service.html', { @@ -305,7 +315,7 @@ def abon_services(request, gid: int, uname): class AbonHomeUpdateView(LoginAdminMixin, PermissionRequiredMixin, UpdateView): permission_required = 'abonapp.view_abon' - model = models.Abon + model = generic.Abon form_class = forms.AbonForm slug_field = 'username' slug_url_kwarg = 'uname' @@ -315,8 +325,10 @@ class AbonHomeUpdateView(LoginAdminMixin, PermissionRequiredMixin, UpdateView): def dispatch(self, request, *args, **kwargs): try: - return super(AbonHomeUpdateView, self).dispatch(request, *args, - **kwargs) + return super(AbonHomeUpdateView, self).dispatch( + request, *args, + **kwargs + ) except lib.LogicError as e: messages.error(request, e) except (NasFailedResult, NasNetworkError) as e: @@ -358,13 +370,17 @@ class AbonHomeUpdateView(LoginAdminMixin, PermissionRequiredMixin, UpdateView): if self.initial: return self.initial try: - passw = models.AbonRawPassword.objects.get(account=abon).passw_text + passw = generic.AbonRawPassword.objects.get( + account=abon + ).passw_text return { 'password': passw } - except models.AbonRawPassword.DoesNotExist: - messages.warning(self.request, - _('User has not have password, and cannot login')) + except generic.AbonRawPassword.DoesNotExist: + messages.warning( + self.request, + _('User has not have password, and cannot login') + ) return {'password': ''} def get_context_data(self, **kwargs): @@ -394,7 +410,7 @@ def terminal_pay(request): @only_admins @permission_required('abonapp.add_invoiceforpayment') def add_invoice(request, gid: int, uname: str): - abon = get_object_or_404(models.Abon, username=uname) + abon = get_object_or_404(generic.Abon, username=uname) grp = get_object_or_404(Group, pk=gid) try: @@ -402,7 +418,7 @@ def add_invoice(request, gid: int, uname: str): curr_amount = lib.safe_int(request.POST.get('curr_amount')) comment = request.POST.get('comment') - newinv = models.InvoiceForPayment() + newinv = generic.InvoiceForPayment() newinv.abon = abon newinv.amount = curr_amount newinv.comment = comment @@ -422,7 +438,7 @@ def add_invoice(request, gid: int, uname: str): messages.error(request, err) return render(request, 'abonapp/addInvoice.html', { 'abon': abon, - 'invcount': models.InvoiceForPayment.objects.filter(abon=abon).count(), + 'invcount': generic.InvoiceForPayment.objects.filter(abon=abon).count(), 'group': grp }) @@ -432,7 +448,7 @@ def add_invoice(request, gid: int, uname: str): @permission_required('abonapp.can_buy_tariff') def pick_tariff(request, gid: int, uname): grp = get_object_or_404(Group, pk=gid) - abon = get_object_or_404(models.Abon, username=uname) + abon = get_object_or_404(generic.Abon, username=uname) tariffs = Tariff.objects.get_tariffs_by_group(grp.pk) try: if request.method == 'POST': @@ -487,7 +503,7 @@ def pick_tariff(request, gid: int, uname): @permission_required('abonapp.can_complete_service') def unsubscribe_service(request, gid: int, uname, abon_tariff_id: int): try: - abon_tariff = get_object_or_404(models.AbonTariff, + abon_tariff = get_object_or_404(generic.AbonTariff, pk=int(abon_tariff_id)) abon_tariff.delete() messages.success(request, _('User has been detached from service')) @@ -507,7 +523,7 @@ class LogListView(LoginAdminPermissionMixin, ListView): http_method_names = ('get',) context_object_name = 'logs' template_name = 'abonapp/log.html' - model = models.AbonLog + model = generic.AbonLog class DebtorsListView(LoginAdminPermissionMixin, ListView): @@ -516,7 +532,7 @@ class DebtorsListView(LoginAdminPermissionMixin, ListView): http_method_names = ('get',) context_object_name = 'invoices' template_name = 'abonapp/debtors.html' - queryset = models.InvoiceForPayment.objects.filter(status=True) + queryset = generic.InvoiceForPayment.objects.filter(status=True) class TaskLogListView(LoginAdminPermissionMixin, ListView): @@ -530,10 +546,10 @@ class TaskLogListView(LoginAdminPermissionMixin, ListView): if hasattr(self, 'abon'): return self.abon.group else: - return get_object_or_404(models.Group, pk=self.kwargs.get('gid')) + return get_object_or_404(generic.Group, pk=self.kwargs.get('gid')) def get_queryset(self): - abon = get_object_or_404(models.Abon, + abon = get_object_or_404(generic.Abon, username=self.kwargs.get('uname')) self.abon = abon return Task.objects.filter(abon=abon) @@ -548,15 +564,17 @@ class TaskLogListView(LoginAdminPermissionMixin, ListView): class PassportUpdateView(LoginAdminPermissionMixin, UpdateView): permission_required = 'abonapp.view_passportinfo' form_class = forms.PassportForm - model = models.PassportInfo + model = generic.PassportInfo template_name = 'abonapp/modal_passport_view.html' def get_object(self, queryset=None): - self.abon = get_object_or_404(models.Abon, + self.abon = get_object_or_404(generic.Abon, username=self.kwargs.get('uname')) try: - passport_instance = models.PassportInfo.objects.get(abon=self.abon) - except models.PassportInfo.DoesNotExist: + passport_instance = generic.PassportInfo.objects.get( + abon=self.abon + ) + except generic.PassportInfo.DoesNotExist: passport_instance = None return passport_instance @@ -564,14 +582,18 @@ class PassportUpdateView(LoginAdminPermissionMixin, UpdateView): pi = form.save(commit=False) pi.abon = self.abon pi.save() - messages.success(self.request, - _('Passport information has been saved')) + messages.success( + self.request, + _('Passport information has been saved') + ) return super(PassportUpdateView, self).form_valid(form) def get_success_url(self): - return resolve_url('abonapp:abon_home', - gid=self.kwargs.get('gid'), - uname=self.kwargs.get('uname')) + return resolve_url( + 'abonapp:abon_home', + gid=self.kwargs.get('gid'), + uname=self.kwargs.get('uname') + ) def form_invalid(self, form): messages.error(self.request, _('fix form errors')) @@ -589,7 +611,7 @@ class PassportUpdateView(LoginAdminPermissionMixin, UpdateView): class IpUpdateView(LoginAdminPermissionMixin, UpdateView): permission_required = 'abonapp.change_abon' form_class = forms.AddIpForm - model = models.Abon + model = generic.Abon slug_url_kwarg = 'uname' slug_field = 'username' template_name = 'abonapp/modal_ip_form.html' @@ -637,7 +659,8 @@ def chgroup_tariff(request, gid): return redirect('abonapp:ch_group_tariff', gid) tariffs = Tariff.objects.all() seleted_tariffs_id = tuple( - pk[0] for pk in grp.tariff_set.only('pk').values_list('pk')) + pk[0] for pk in grp.tariff_set.only('pk').values_list('pk') + ) return render(request, 'abonapp/group_tariffs.html', { 'group': grp, 'seleted_tariffs': seleted_tariffs_id, @@ -651,7 +674,7 @@ def chgroup_tariff(request, gid): def dev(request, gid: int, uname): abon_dev = None try: - abon = models.Abon.objects.get(username=uname) + abon = generic.Abon.objects.get(username=uname) if request.method == 'POST': abon.device = Device.objects.get(pk=request.POST.get('dev')) abon.save(update_fields=('device',)) @@ -660,9 +683,11 @@ def dev(request, gid: int, uname): else: abon_dev = abon.device except Device.DoesNotExist: - messages.warning(request, - _('Device your selected already does not exist')) - except models.Abon.DoesNotExist: + messages.warning( + request, + _('Device your selected already does not exist') + ) + except generic.Abon.DoesNotExist: messages.error(request, _('Abon does not exist')) return redirect('abonapp:people_list', gid=gid) return render(request, 'abonapp/modal_dev.html', { @@ -678,13 +703,13 @@ def dev(request, gid: int, uname): @permission_required('group_app.view_group', (Group, 'pk', 'gid')) def clear_dev(request, gid: int, uname): try: - abon = models.Abon.objects.get(username=uname) + abon = generic.Abon.objects.get(username=uname) abon.device = None abon.dev_port = None abon.is_dynamic_ip = False abon.save(update_fields=('device', 'dev_port', 'is_dynamic_ip')) messages.success(request, _('Device has successfully unattached')) - except models.Abon.DoesNotExist: + except generic.Abon.DoesNotExist: messages.error(request, _('Abon does not exist')) return redirect('abonapp:people_list', gid=gid) return redirect('abonapp:abon_home', gid=gid, uname=uname) @@ -699,7 +724,7 @@ def abon_ping(request, gid: int, uname): status = False text = ' %s' % _( 'no ping') - abon = get_object_or_404(models.Abon, username=uname) + abon = get_object_or_404(generic.Abon, username=uname) try: if ip is None: raise lib.LogicError(_('Ip not passed')) @@ -755,7 +780,7 @@ def abon_ping(request, gid: int, uname): def set_auto_continue_service(request, gid: int, uname): checked = request.GET.get('checked') checked = True if checked == 'true' else False - abon = get_object_or_404(models.Abon, username=uname) + abon = get_object_or_404(generic.Abon, username=uname) abon.autoconnect_service = checked abon.save(update_fields=('autoconnect_service',)) return { @@ -766,14 +791,14 @@ def set_auto_continue_service(request, gid: int, uname): @login_required @only_admins def vcards(r): - users = models.Abon.objects.exclude(group=None).select_related( + users = generic.Abon.objects.exclude(group=None).select_related( 'group', 'street' ).only( 'username', 'fio', 'group__title', 'telephone', 'street__name', 'house' ) - additional_tels = models.AdditionalTelephone.objects.select_related( + additional_tels = generic.AdditionalTelephone.objects.select_related( 'abon', 'abon__group', 'abon__street' @@ -819,16 +844,19 @@ class DialsListView(LoginRequiredMixin, OnlyAdminsMixin, OrderedFilteredList): template_name = 'abonapp/dial_log.html' def get_queryset(self): - abon = get_object_or_404(models.Abon, + abon = get_object_or_404(generic.Abon, username=self.kwargs.get('uname')) if not self.request.user.has_perm('group_app.view_group', abon.group): raise PermissionDenied self.abon = abon if abon.telephone is not None and abon.telephone != '': tel = abon.telephone.replace('+', '') - additional_tels = tuple(t.telephone for t in - models.AdditionalTelephone.objects.filter( - abon=abon).iterator()) + additional_tels = tuple( + t.telephone for t in + generic.AdditionalTelephone.objects.filter( + abon=abon + ).iterator() + ) logs = AsteriskCDR.objects.filter( Q(src__contains=tel) | Q(dst__contains=tel) | Q(src__in=additional_tels) | Q(dst__in=additional_tels) @@ -846,10 +874,14 @@ class DialsListView(LoginRequiredMixin, OnlyAdminsMixin, OrderedFilteredList): def render_to_response(self, context, **response_kwargs): if hasattr(self.abon.group, 'pk') and self.abon.group.pk != int( self.kwargs.get('gid')): - return redirect('abonapp:dials', self.abon.group.pk, - self.abon.username) - return super(DialsListView, self).render_to_response(context, - **response_kwargs) + return redirect( + 'abonapp:dials', self.abon.group.pk, + self.abon.username + ) + return super(DialsListView, self).render_to_response( + context, + **response_kwargs + ) def get(self, request, *args, **kwargs): try: @@ -872,28 +904,33 @@ def save_user_dev_port(request, gid: int, uname): is_dynamic_ip = request.POST.get('is_dynamic_ip') is_dynamic_ip = True if is_dynamic_ip == 'on' else False try: - abon = models.Abon.objects.get(username=uname) + abon = generic.Abon.objects.get(username=uname) if user_port == 0: port = None else: port = DevPort.objects.get(pk=user_port) if abon.device is not None: try: - other_abon = models.Abon.objects.get(device=abon.device, - dev_port=port) + other_abon = generic.Abon.objects.get( + device=abon.device, + dev_port=port + ) if other_abon != abon: - user_url = resolve_url('abonapp:abon_home', - other_abon.group.id, - other_abon.username) - messages.error(request, _( - "%(user_name)s already pinned to this port on this device") % { - 'user_url': user_url, - 'user_name': other_abon.get_full_name() - }) + user_url = resolve_url( + 'abonapp:abon_home', + other_abon.group.id, + other_abon.username + ) + messages.error( + request, _("%(user_name)s already pinned to this port on this device") % { + 'user_url': user_url, + 'user_name': other_abon.get_full_name() + } + ) return redirect('abonapp:abon_home', gid, uname) - except models.Abon.DoesNotExist: + except generic.Abon.DoesNotExist: pass - except models.Abon.MultipleObjectsReturned: + except generic.Abon.MultipleObjectsReturned: messages.error(request, _('Multiple users on the same device port')) return redirect('devapp:view', abon.device.group.pk, @@ -908,7 +945,7 @@ def save_user_dev_port(request, gid: int, uname): messages.success(request, _('User port has been saved')) except DevPort.DoesNotExist: messages.error(request, _('Selected port does not exist')) - except models.Abon.DoesNotExist: + except generic.Abon.DoesNotExist: messages.error(request, _('User does not exist')) return redirect('abonapp:abon_home', gid, uname) @@ -943,17 +980,17 @@ def street_edit(request, gid): if request.method == 'POST': for sid, sname in zip(request.POST.getlist('sid'), request.POST.getlist('sname')): - street = models.AbonStreet.objects.get(pk=sid) + street = generic.AbonStreet.objects.get(pk=sid) street.name = sname street.save() messages.success(request, _('Streets has been saved')) else: return render(request, 'abonapp/modal_editstreet.html', { 'gid': gid, - 'streets': models.AbonStreet.objects.filter(group=gid) + 'streets': generic.AbonStreet.objects.filter(group=gid) }) - except models.AbonStreet.DoesNotExist: + except generic.AbonStreet.DoesNotExist: messages.error(request, _('One of these streets has not been found')) return redirect('abonapp:people_list', gid) @@ -965,9 +1002,9 @@ def street_edit(request, gid): @permission_required('group_app.view_group', (Group, 'pk', 'gid')) def street_del(request, gid: int, sid: int): try: - models.AbonStreet.objects.get(pk=sid, group=gid).delete() + generic.AbonStreet.objects.get(pk=sid, group=gid).delete() messages.success(request, _('The street successfully deleted')) - except models.AbonStreet.DoesNotExist: + except generic.AbonStreet.DoesNotExist: messages.error(request, _('The street has not been found')) return redirect('abonapp:people_list', gid) @@ -987,7 +1024,7 @@ def active_nets(request, gid): @permission_required('abonapp.view_additionaltelephones') @permission_required('group_app.view_group', (Group, 'pk', 'gid')) def tels(request, gid: int, uname): - abon = get_object_or_404(models.Abon, username=uname) + abon = get_object_or_404(generic.Abon, username=uname) telephones = abon.additional_telephones.all() return render(request, 'abonapp/modal_additional_telephones.html', { 'telephones': telephones, @@ -1004,7 +1041,7 @@ def tel_add(request, gid: int, uname): frm = forms.AdditionalTelephoneForm(request.POST) if frm.is_valid(): new_tel = frm.save(commit=False) - abon = get_object_or_404(models.Abon, username=uname) + abon = get_object_or_404(generic.Abon, username=uname) new_tel.abon = abon new_tel.save() messages.success(request, _('New telephone has been saved')) @@ -1026,11 +1063,11 @@ def tel_add(request, gid: int, uname): def tel_del(request, gid: int, uname): try: tid = lib.safe_int(request.GET.get('tid')) - tel = models.AdditionalTelephone.objects.get(pk=tid) + tel = generic.AdditionalTelephone.objects.get(pk=tid) tel.delete() messages.success(request, _('Additional telephone successfully deleted')) - except models.AdditionalTelephone.DoesNotExist: + except generic.AdditionalTelephone.DoesNotExist: messages.error(request, _('Telephone not found')) return redirect('abonapp:abon_home', gid, uname) @@ -1040,12 +1077,12 @@ def tel_del(request, gid: int, uname): @permission_required('group_app.view_group', (Group, 'pk', 'gid')) def phonebook(request, gid): res_format = request.GET.get('f') - t1 = models.Abon.objects.filter( + t1 = generic.Abon.objects.filter( group__id=int(gid) ).only('telephone', 'fio').values_list( 'telephone', 'fio' ) - t2 = models.AdditionalTelephone.objects.filter( + t2 = generic.AdditionalTelephone.objects.filter( abon__group__id=gid ).only( 'telephone', 'owner_name' @@ -1078,24 +1115,30 @@ def abon_export(request, gid): if frm.is_valid(): cleaned_data = frm.clean() fields = cleaned_data.get('fields') - subscribers = models.Abon.objects.filter(group__id=gid).only( + subscribers = generic.Abon.objects.filter(group__id=gid).only( *fields).values_list(*fields) if res_format == 'csv': import csv response = HttpResponse(content_type='text/csv') response[ - 'Content-Disposition'] = 'attachment; filename="users.csv"' + 'Content-Disposition' + ] = 'attachment; filename="users.csv"' writer = csv.writer(response, quoting=csv.QUOTE_NONNUMERIC) - display_values = (f[1] for f in frm.fields['fields'].choices if - f[0] in fields) + display_values = ( + f[1] for f in frm.fields['fields'].choices if + f[0] in fields + ) writer.writerow(display_values) for row in subscribers: writer.writerow(row) return response else: - messages.info(request, - _('Unexpected format %(export_format)s') % { - 'export_format': res_format}) + messages.info( + request, + _('Unexpected format %(export_format)s') % { + 'export_format': res_format + } + ) return redirect('abonapp:group_list') else: messages.error(request, _('fix form errors')) @@ -1111,7 +1154,7 @@ def abon_export(request, gid): @login_required @only_admins def fin_report(request): - q = models.AllTimePayLog.objects.by_days() + q = generic.AllTimePayLog.objects.by_days() res_format = request.GET.get('f') if res_format == 'csv': import csv @@ -1120,7 +1163,8 @@ def fin_report(request): writer = csv.writer(response, quoting=csv.QUOTE_NONNUMERIC) for row in q: writer.writerow( - (row['summ'], row['pay_date'].strftime('%Y-%m-%d'))) + (row['summ'], row['pay_date'].strftime('%Y-%m-%d')) + ) return response return render(request, 'abonapp/fin_report.html', { 'logs': q @@ -1134,17 +1178,21 @@ def add_edit_periodic_pay(request, gid: int, uname, periodic_pay_id=0): if periodic_pay_id == 0: if not request.user.has_perm('abonapp.add_periodicpayforid'): raise PermissionDenied - periodic_pay_instance = models.PeriodicPayForId() + periodic_pay_instance = generic.PeriodicPayForId() else: if not request.user.has_perm('abonapp.change_periodicpayforid'): raise PermissionDenied - periodic_pay_instance = get_object_or_404(models.PeriodicPayForId, - pk=periodic_pay_id) + periodic_pay_instance = get_object_or_404( + generic.PeriodicPayForId, + pk=periodic_pay_id + ) if request.method == 'POST': - frm = forms.PeriodicPayForIdForm(request.POST, - instance=periodic_pay_instance) + frm = forms.PeriodicPayForIdForm( + request.POST, + instance=periodic_pay_instance + ) if frm.is_valid(): - abon = get_object_or_404(models.Abon, username=uname) + abon = get_object_or_404(generic.Abon, username=uname) inst = frm.save(commit=False) inst.account = abon inst.save() @@ -1166,8 +1214,10 @@ def add_edit_periodic_pay(request, gid: int, uname, periodic_pay_id=0): @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): - periodic_pay_instance = get_object_or_404(models.PeriodicPayForId, - pk=periodic_pay_id) + periodic_pay_instance = get_object_or_404( + generic.PeriodicPayForId, + pk=periodic_pay_id + ) if periodic_pay_instance.account.username != uname: uname = periodic_pay_instance.account.username periodic_pay_instance.delete() @@ -1180,14 +1230,15 @@ class EditSibscriberMarkers(LoginAdminPermissionMixin, UpdateView): http_method_names = ('get', 'post') template_name = 'abonapp/modal_user_markers.html' form_class = forms.MarkersForm - model = models.Abon + model = generic.Abon slug_url_kwarg = 'uname' slug_field = 'username' def dispatch(self, request, *args, **kwargs): try: - return super(EditSibscriberMarkers, self).dispatch(request, *args, - **kwargs) + return super(EditSibscriberMarkers, self).dispatch( + request, *args, **kwargs + ) except ValidationError as e: messages.error(request, e) return self.render_to_response(self.get_context_data()) @@ -1204,8 +1255,10 @@ class EditSibscriberMarkers(LoginAdminPermissionMixin, UpdateView): def form_valid(self, form): v = super(EditSibscriberMarkers, self).form_valid(form) - messages.success(self.request, - _('User flags has changed successfully')) + messages.success( + self.request, + _('User flags has changed successfully') + ) return v @@ -1213,7 +1266,7 @@ class EditSibscriberMarkers(LoginAdminPermissionMixin, UpdateView): @only_admins @permission_required('abonapp.change_abon') def user_session_free(request, gid: int, uname): - abon = get_object_or_404(models.Abon, username=uname) + abon = get_object_or_404(generic.Abon, username=uname) if abon.nas is None: messages.error(request, _('gateway required')) return redirect('abonapp:abon_home', gid, uname) @@ -1233,7 +1286,7 @@ def attach_nas(request, gid): gateway_id = lib.safe_int(request.POST.get('gateway')) if gateway_id: nas = get_object_or_404(NASModel, pk=gateway_id) - abons = models.Abon.objects.filter(group__id=gid) + abons = generic.Abon.objects.filter(group__id=gid) if abons.exists(): abons.update(nas=nas) messages.success( @@ -1262,7 +1315,7 @@ def abons(request): 'tarif_id': abn.active_tariff().tariff.pk if abn.active_tariff() is not None else 0, 'ip': abn.ip_address - } for abn in models.Abon.objects.iterator()) + } for abn in generic.Abon.objects.iterator()) tarlist = ({ 'id': trf.pk, @@ -1285,10 +1338,11 @@ def search_abon(request): word = request.GET.get('s') if not word: return None - results = models.Abon.objects.filter(fio__icontains=word)[:8] + results = generic.Abon.objects.filter(fio__icontains=word)[:8] return list( - {'id': usr.pk, 'text': "%s: %s" % (usr.username, usr.fio)} for usr in - results) + {'id': usr.pk, 'text': "%s: %s" % (usr.username, usr.fio)} + for usr in results + ) class DhcpLever(SecureApiView): @@ -1375,18 +1429,18 @@ class DublicatePay(SecureApiView): return self._check_pay(request.GET) else: return self._bad_ret(-101, 'ACT is not passed') - except models.Abon.DoesNotExist: + except generic.Abon.DoesNotExist: return self._bad_ret(-40) except DatabaseError: return self._bad_ret(-90) - except models.AllTimePayLog.DoesNotExist: + except generic.AllTimePayLog.DoesNotExist: return self._bad_ret(-10) except AttributeError: return self._bad_ret(-101) def _fetch_user_info(self, data: dict): pay_account = data.get('PAY_ACCOUNT') - abon = models.Abon.objects.get(pk=pay_account) + abon = generic.Abon.objects.get(pk=pay_account) fio = abon.fio ballance = float(abon.ballance) return { @@ -1406,8 +1460,8 @@ class DublicatePay(SecureApiView): pay_account = data.get('PAY_ACCOUNT') pay_id = data.get('PAY_ID') pay_amount = lib.safe_float(data.get('PAY_AMOUNT')) - abon = models.Abon.objects.get(pk=pay_account) - pays = models.AllTimePayLog.objects.filter(pay_id=pay_id) + abon = generic.Abon.objects.get(pk=pay_account) + pays = generic.AllTimePayLog.objects.filter(pay_id=pay_id) if pays.count() > 0: return self._bad_ret(-100) @@ -1415,7 +1469,7 @@ class DublicatePay(SecureApiView): comment='KonikaForward %.2f' % pay_amount) abon.save(update_fields=('ballance',)) - models.AllTimePayLog.objects.create( + generic.AllTimePayLog.objects.create( pay_id=pay_id, summ=pay_amount, abon=abon, @@ -1432,7 +1486,7 @@ class DublicatePay(SecureApiView): def _check_pay(self, data: dict): pay_id = data.get('PAY_ID') - pay = models.AllTimePayLog.objects.get(pay_id=pay_id) + pay = generic.AllTimePayLog.objects.get(pay_id=pay_id) return { 'status_code': 11, 'time_stamp': self.current_date, diff --git a/accounts_app/templatetags/acc_tags.py b/accounts_app/templatetags/acc_tags.py index 043c685..e4891fa 100644 --- a/accounts_app/templatetags/acc_tags.py +++ b/accounts_app/templatetags/acc_tags.py @@ -3,7 +3,7 @@ from ipaddress import ip_address, AddressValueError from django import template from django.db.models import Model from django.apps import apps -from abonapp.models import Abon +from abonapp.models.generic import Abon from six import string_types, class_types register = template.Library() @@ -26,7 +26,10 @@ def can_login_by_location(request): try: remote_ip = ip_address(request.META.get('REMOTE_ADDR')) if remote_ip.version == 4: - has_exist = Abon.objects.filter(ip_address=str(remote_ip), is_active=True).exists() + has_exist = Abon.objects.filter( + ip_address=str(remote_ip), + is_active=True + ).exists() return has_exist except AddressValueError: pass diff --git a/agent/commands/dhcp.py b/agent/commands/dhcp.py index 48d669a..6e1d0b6 100644 --- a/agent/commands/dhcp.py +++ b/agent/commands/dhcp.py @@ -1,10 +1,11 @@ from typing import Optional from django.core.exceptions import MultipleObjectsReturned -from abonapp.models import Abon +from abonapp.models.generic import Abon from devapp.models import Device, Port -def dhcp_commit(client_ip: str, client_mac: str, switch_mac: str, switch_port: int) -> Optional[str]: +def dhcp_commit(client_ip: str, client_mac: str, + switch_mac: str, switch_port: int) -> Optional[str]: try: dev = Device.objects.get(mac_addr=switch_mac) mngr_class = dev.get_manager_klass() @@ -35,11 +36,15 @@ def dhcp_commit(client_ip: str, client_mac: str, switch_mac: str, switch_port: i 'switch_mac': switch_mac } except MultipleObjectsReturned as e: - return 'MultipleObjectsReturned:' + ' '.join((type(e), e, str(switch_port))) + return 'MultipleObjectsReturned:' + ' '.join( + (type(e), e, str(switch_port)) + ) def dhcp_expiry(client_ip: str) -> Optional[str]: - abon = Abon.objects.filter(ip_address=client_ip, is_active=True).exclude(current_tariff=None).first() + abon = Abon.objects.filter( + ip_address=client_ip, is_active=True + ).exclude(current_tariff=None).first() if abon is None: return "Subscriber with ip %s does not exist" % client_ip else: diff --git a/clientsideapp/views.py b/clientsideapp/views.py index 0a5c166..add68c9 100644 --- a/clientsideapp/views.py +++ b/clientsideapp/views.py @@ -4,7 +4,7 @@ from django.contrib import messages from django.db import transaction from django.utils.translation import gettext_lazy as _, gettext -from abonapp.models import AbonLog, InvoiceForPayment, Abon +from abonapp.models.generic import AbonLog, InvoiceForPayment, Abon from djing.lib.decorators import json_view from tariff_app.models import Tariff from taskapp.models import Task @@ -14,7 +14,9 @@ from gw_app.nas_managers import NasFailedResult, NasNetworkError @login_required def home(request): - num_active_tasks = Task.objects.filter(abon=request.user, state='S').count() + num_active_tasks = Task.objects.filter( + abon=request.user, state='S' + ).count() return render(request, 'clientsideapp/index.html', { 'num_active_tasks': num_active_tasks }) @@ -32,7 +34,9 @@ def pays(request): def services(request): try: abon = request.user - all_tarifs = Tariff.objects.get_tariffs_by_group(abon.group.pk).filter(is_admin=False) + all_tarifs = Tariff.objects.get_tariffs_by_group( + abon.group.pk + ).filter(is_admin=False) current_service = abon.active_tariff() except Abon.DoesNotExist: all_tarifs = None @@ -50,14 +54,20 @@ def buy_service(request, srv_id): try: current_service = abon.active_tariff() if request.method == 'POST': - abon.pick_tariff(service, None, _("Buy the service via user side, service '%s'") - % service) + abon.pick_tariff( + service, None, + _("Buy the service via user side, service '%s'") % service + ) abon.nas_sync_self() - messages.success(request, _("The service '%s' wan successfully activated") % service.title) + messages.success( + request, + _("The service '%s' wan successfully activated") % service.title + ) else: return render(request, 'clientsideapp/modal_service_buy.html', { 'service': service, - 'current_service': current_service.tariff if current_service is not None else None + 'current_service': current_service.tariff + if current_service is not None else None }) except LogicError as e: messages.error(request, e) @@ -83,15 +93,20 @@ def debt_buy(request, d_id): try: sure = request.POST.get('sure') if sure != 'on': - raise LogicError(_("Are you not sure that you want buy the service?")) + raise LogicError( + _("Are you not sure that you want buy the service?") + ) if abon.ballance < debt.amount: raise LogicError(_('Your account have not enough money')) amount = -debt.amount - abon.add_ballance(None, amount, comment=gettext('%(username)s paid the debt %(amount).2f') % { - 'username': abon.get_full_name(), - 'amount': amount - }) + abon.add_ballance( + None, amount, + comment=gettext('%(username)s paid the debt %(amount).2f') % { + 'username': abon.get_full_name(), + 'amount': amount + } + ) abon.save(update_fields=('ballance',)) debt.set_ok() debt.save(update_fields=('status', 'date_pay')) diff --git a/devapp/views.py b/devapp/views.py index 8b6a71c..d01a19c 100644 --- a/devapp/views.py +++ b/devapp/views.py @@ -1,7 +1,7 @@ import re from ipaddress import ip_address -from abonapp.models import Abon +from abonapp.models.generic import Abon from accounts_app.models import UserProfile from chatbot.models import ChatException from devapp.base_intr import DeviceImplementationError @@ -131,13 +131,19 @@ class DeviceUpdate(LoginAdminPermissionMixin, UpdateView): mac_addr=self.request.POST.get('mac_addr')) self.already_dev = already_dev if already_dev.group: - messages.warning(self.request, - _('You have redirected to existing device')) - return redirect('devapp:view', already_dev.group.pk, - already_dev.pk) + messages.warning( + self.request, + _('You have redirected to existing device') + ) + return redirect( + 'devapp:view', already_dev.group.pk, + already_dev.pk + ) else: - messages.warning(self.request, - _('Please attach group for device')) + messages.warning( + self.request, + _('Please attach group for device') + ) return redirect('devapp:fix_device_group', already_dev.pk) except Device.DoesNotExist: pass @@ -161,8 +167,10 @@ class DeviceUpdate(LoginAdminPermissionMixin, UpdateView): return super().dispatch(request, *args, **kwargs) def form_invalid(self, form): - messages.error(self.request, - _('Form is invalid, check fields and try again')) + messages.error( + self.request, + _('Form is invalid, check fields and try again') + ) return super().form_invalid(form) def get_context_data(self, **kwargs): @@ -186,16 +194,23 @@ class DeviceCreateView(LoginAdminMixin, PermissionRequiredMixin, CreateView): # check if that device is exist try: already_dev = self.model.objects.get( - mac_addr=self.request.POST.get('mac_addr')) + mac_addr=self.request.POST.get('mac_addr') + ) self.already_dev = already_dev if already_dev.group: - messages.warning(self.request, - _('You have redirected to existing device')) - return redirect('devapp:view', already_dev.group.pk, - already_dev.pk) + messages.warning( + self.request, + _('You have redirected to existing device') + ) + return redirect( + 'devapp:view', already_dev.group.pk, + already_dev.pk + ) else: - messages.warning(self.request, - _('Please attach group for device')) + messages.warning( + self.request, + _('Please attach group for device') + ) return redirect('devapp:fix_device_group', already_dev.pk) except Device.DoesNotExist: pass @@ -575,10 +590,11 @@ def search_dev(request): results = Device.objects.filter(qs).only('pk', 'ip_address', 'comment')[:16] results = tuple({ - 'id': device.pk, - 'text': "%s: %s" % ( - device.ip_address or '', device.comment) - } for device in results) + 'id': device.pk, + 'text': "%s: %s" % ( + device.ip_address or '', device.comment + ) + } for device in results) return results @@ -595,11 +611,14 @@ def fix_device_group(request, device_id): messages.success(request, _('Device fixed')) return redirect('devapp:devs', ch_dev.group.pk) else: - messages.error(request, - _('Please attach group for device')) + messages.error( + request, + _('Please attach group for device') + ) else: - messages.error(request, _( - 'Form is invalid, check fields and try again')) + messages.error( + request, _('Form is invalid, check fields and try again') + ) else: frm = DeviceForm(instance=device) except ValueError: @@ -626,7 +645,8 @@ def fix_onu(request): ports = manobj.get_list_keyval('.1.3.6.1.4.1.3320.101.10.1.1.3') text = ' ' % \ (_('Device with mac address %(mac)s does not exist') % { - 'mac': mac}) + 'mac': mac + }) for srcmac, snmpnum in ports: # convert bytes mac address to str presentation mac address real_mac = ':'.join('%x' % ord(i) for i in srcmac) @@ -634,8 +654,7 @@ def fix_onu(request): onu.snmp_extra = str(snmpnum) onu.save(update_fields=('snmp_extra',)) status = 0 - text = ' ' % _( - 'Fixed') + text = ' ' % _('Fixed') break else: text += '\n%s' % _('Parent device not found') diff --git a/dialing_app/views.py b/dialing_app/views.py index 6fa6e08..0cacffd 100644 --- a/dialing_app/views.py +++ b/dialing_app/views.py @@ -12,7 +12,7 @@ from guardian.decorators import permission_required_or_403 as permission_require from django.db.models import Q from django.conf import settings -from abonapp.models import Abon +from abonapp.models.generic import Abon from djing.global_base_views import SecureApiView from djing import JSONType from djing.lib import safe_int @@ -52,16 +52,24 @@ class LastCallsListView(BaseListView): @login_required @only_admins def to_abon(request, tel): - abon = Abon.objects.filter(Q(telephone__icontains=tel) | Q(additional_telephones__telephone__icontains=tel)) + abon = Abon.objects.filter( + Q(telephone__icontains=tel) | + Q(additional_telephones__telephone__icontains=tel) + ) abon_count = abon.count() if abon_count > 1: - messages.warning(request, _('Multiple users with the telephone number')) + messages.warning( + request, _('Multiple users with the telephone number') + ) elif abon_count == 0: messages.error(request, _('User with the telephone number not found')) return redirect('dialapp:home') abon = abon[0] if abon.group: - return redirect('abonapp:abon_home', gid=abon.group.pk, uname=abon.username) + return redirect( + 'abonapp:abon_home', gid=abon.group.pk, + uname=abon.username + ) else: return redirect('abonapp:group_list') diff --git a/djing/lib/auth_backends.py b/djing/lib/auth_backends.py index dbc160e..7ed5c8d 100644 --- a/djing/lib/auth_backends.py +++ b/djing/lib/auth_backends.py @@ -2,7 +2,7 @@ from ipaddress import ip_address, AddressValueError from django.contrib.auth.backends import ModelBackend from accounts_app.models import BaseAccount, UserProfile -from abonapp.models import Abon +from abonapp.models.generic import Abon class CustomAuthBackend(ModelBackend): @@ -39,7 +39,10 @@ class LocationAuthBackend(ModelBackend): def authenticate(self, request, byip, **kwargs): try: remote_ip = ip_address(request.META.get('REMOTE_ADDR')) - user = Abon.objects.filter(ip_address=str(remote_ip), is_active=True).first() + user = Abon.objects.filter( + ip_address=str(remote_ip), + is_active=True + ).first() if user is None: return if self.user_can_authenticate(user): diff --git a/gw_app/tests.py b/gw_app/tests.py index 4f2045c..344e820 100644 --- a/gw_app/tests.py +++ b/gw_app/tests.py @@ -1,6 +1,6 @@ from abc import ABCMeta -from abonapp.models import Abon +from abonapp.models.generic import Abon from accounts_app.models import UserProfile from django.conf import settings from django.shortcuts import resolve_url @@ -18,7 +18,11 @@ class MyBaseTestCase(metaclass=ABCMeta): :return: authorized response """ r = self.client.get(url) - self.assertRedirects(r, "%s?next=%s" % (getattr(settings, 'LOGIN_URL'), url)) + self.assertRedirects( + r, "%s?next=%s" % ( + getattr(settings, 'LOGIN_URL'), url + ) + ) self.client.force_login(self.adminuser) r = self.client.get(url) self.assertEqual(r.status_code, 200) @@ -33,7 +37,10 @@ class MyBaseTestCase(metaclass=ABCMeta): ) a1.group = grp a1.save(update_fields=('group',)) - my_admin = UserProfile.objects.create_superuser('+79781234567', 'local_superuser', 'ps') + my_admin = UserProfile.objects.create_superuser( + '+79781234567', + 'local_superuser', 'ps' + ) self.adminuser = my_admin self.abon = a1 self.group = grp @@ -70,8 +77,12 @@ class NASModelTestCase(MyBaseTestCase, TestCase): self.assertEqual(r.status_code, 302) msg = r.cookies.get('messages') self.assertIn('New NAS has been created', msg.output()) - NASModel.objects.get(title='Test success nas', ip_address='192.168.8.10', ip_port=1254, - auth_login='_', auth_passw='_') + NASModel.objects.get( + title='Test success nas', + ip_address='192.168.8.10', + ip_port=1254, auth_login='_', + auth_passw='_' + ) # test error ip_port big range r = self.client.post(url, data={ @@ -82,10 +93,11 @@ class NASModelTestCase(MyBaseTestCase, TestCase): 'auth_passw': '_' }) self.assertEqual(r.status_code, 200) - self.assertFormError(response=r, form='form', field='ip_port', - errors='Ensure this value is less than or equal to %(limit_value)s.' % { - 'limit_value': 65535 - }) + self.assertFormError( + response=r, form='form', field='ip_port', + errors='Ensure this value is less than or equal to %(limit_value)s.' % { + 'limit_value': 65535 + }) # test get request r = self.client.get(url) @@ -100,11 +112,13 @@ class NASModelTestCase(MyBaseTestCase, TestCase): 'auth_passw': '_v' }) self.assertEqual(r.status_code, 200) - self.assertFormError(response=r, form='form', field='title', - errors='%(model_name)s with this %(field_label)s already exists.' % { - 'model_name': NASModel._meta.verbose_name, - 'field_label': NASModel._meta.get_field('title').verbose_name - }) + self.assertFormError( + response=r, form='form', field='title', + errors='%(model_name)s with this %(field_label)s already exists.' % { + 'model_name': NASModel._meta.verbose_name, + 'field_label': NASModel._meta.get_field('title').verbose_name + } + ) # test error duplicates default r = self.client.post(url, data={ @@ -116,7 +130,10 @@ class NASModelTestCase(MyBaseTestCase, TestCase): 'default': True }) self.assertEqual(r.status_code, 200) - self.assertFormError(response=r, form='form', field='default', errors='Can be only one default gateway') + self.assertFormError( + response=r, form='form', field='default', + errors='Can be only one default gateway' + ) # test error duplicates ip_address r = self.client.post(url, data={ @@ -127,11 +144,14 @@ class NASModelTestCase(MyBaseTestCase, TestCase): 'auth_passw': '_v' }) self.assertEqual(r.status_code, 200) - self.assertFormError(response=r, form='form', field='ip_address', - errors='%(model_name)s with this %(field_label)s already exists.' % { - 'model_name': NASModel._meta.verbose_name, - 'field_label': NASModel._meta.get_field('ip_address').verbose_name - }) + self.assertFormError( + response=r, form='form', field='ip_address', + errors='%(model_name)s with this %(field_label)s already exists.' % { + 'model_name': NASModel._meta.verbose_name, + 'field_label': NASModel._meta.get_field( + 'ip_address' + ).verbose_name + }) @override_settings(LANGUAGE_CODE='en', LANGUAGES=(('en', 'English'),)) def test_change(self): @@ -153,8 +173,10 @@ class NASModelTestCase(MyBaseTestCase, TestCase): self.assertRedirects(r, resolve_url('gw_app:edit', self.nas.pk)) msg = r.cookies.get('messages') self.assertIn('Update successfully', msg.output()) - NASModel.objects.get(title='New again nas2 changed', ip_address='192.168.8.12', - ip_port=7865, auth_login='_w_c', auth_passw='_v_c') + NASModel.objects.get( + title='New again nas2 changed', ip_address='192.168.8.12', + ip_port=7865, auth_login='_w_c', auth_passw='_v_c' + ) @override_settings(LANGUAGE_CODE='en', LANGUAGES=(('en', 'English'),)) def test_delete(self): @@ -169,8 +191,10 @@ class NASModelTestCase(MyBaseTestCase, TestCase): 'nas_type': 'mktk' }) self.assertEqual(r.status_code, 302) - o = NASModel.objects.get(title='Test success nas_2', ip_address='192.168.8.11', ip_port=1254, - auth_login='_', auth_passw='_') + o = NASModel.objects.get( + title='Test success nas_2', ip_address='192.168.8.11', + ip_port=1254, auth_login='_', auth_passw='_' + ) url = resolve_url('gw_app:del', o.pk) # test get request @@ -191,7 +215,9 @@ class NASModelTestCase(MyBaseTestCase, TestCase): # try to remove default nas nas_id = self.nas.pk r = self.client.post(resolve_url('gw_app:del', nas_id)) - self.assertRedirects(r, expected_url=resolve_url('gw_app:edit', nas_id)) + self.assertRedirects( + r, expected_url=resolve_url('gw_app:edit', nas_id) + ) msg = r.cookies.get('messages') self.assertIn('You cannot remove default server', msg.output()) diff --git a/periodic.py b/periodic.py index 2fd3806..5063140 100755 --- a/periodic.py +++ b/periodic.py @@ -8,7 +8,8 @@ django.setup() from django.utils import timezone from django.db import transaction from django.db.models import signals, Count -from abonapp.models import Abon, AbonTariff, abontariff_pre_delete, PeriodicPayForId, AbonLog +from abonapp.models.generic import Abon, AbonTariff, abontariff_pre_delete, \ + PeriodicPayForId, AbonLog from gw_app.nas_managers import NasNetworkError, NasFailedResult from gw_app.models import NASModel from djing.lib import LogicError diff --git a/searchapp/views.py b/searchapp/views.py index 138d602..5f7ccdc 100644 --- a/searchapp/views.py +++ b/searchapp/views.py @@ -2,7 +2,7 @@ import re from django.db.models import Q from django.shortcuts import render from django.utils.html import escape -from abonapp.models import Abon +from abonapp.models.generic import Abon from devapp.models import Device from djing import MAC_ADDR_REGEX from django.contrib.auth.decorators import login_required @@ -21,14 +21,18 @@ def home(request): if s: abons = Abon.objects.filter( - Q(fio__icontains=s) | Q(username__icontains=s) | Q(telephone__icontains=s) | - Q(additional_telephones__telephone__icontains=s) | Q(ip_address__icontains=s) + Q(fio__icontains=s) | Q(username__icontains=s) | + Q(telephone__icontains=s) | + Q(additional_telephones__telephone__icontains=s) | + Q(ip_address__icontains=s) ) if re.match(MAC_ADDR_REGEX, s): devices = Device.objects.filter(mac_addr=s) else: - devices = Device.objects.filter(Q(comment__icontains=s) | Q(ip_address__icontains=s)) + devices = Device.objects.filter( + Q(comment__icontains=s) | Q(ip_address__icontains=s) + ) else: abons = () diff --git a/taskapp/models.py b/taskapp/models.py index 09c6633..a413fcf 100644 --- a/taskapp/models.py +++ b/taskapp/models.py @@ -6,7 +6,7 @@ from django.conf import settings from django.shortcuts import resolve_url from django.utils import timezone from django.utils.translation import ugettext as _ -from abonapp.models import Abon +from abonapp.models.generic import Abon from .handle import handle as task_handle TASK_PRIORITIES = ( @@ -49,7 +49,10 @@ class ChangeLog(models.Model): ) act_type = models.CharField(max_length=1, choices=ACT_CHOICES) when = models.DateTimeField(auto_now_add=True) - who = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='+') + who = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, related_name='+' + ) def __str__(self): return self.get_act_type_display() @@ -60,18 +63,46 @@ def delta_add_days(): class Task(models.Model): - descr = models.CharField(_('Description'), max_length=128, null=True, blank=True) - recipients = models.ManyToManyField(settings.AUTH_USER_MODEL, verbose_name=_('Recipients'), - related_name='them_task') - author = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='+', on_delete=models.SET_NULL, null=True, - blank=True, verbose_name=_('Task author')) - priority = models.CharField(_('A priority'), max_length=1, choices=TASK_PRIORITIES, default=TASK_PRIORITIES[2][0]) - out_date = models.DateField(_('Reality'), null=True, blank=True, default=delta_add_days) - time_of_create = models.DateTimeField(_('Date of create'), auto_now_add=True) - state = models.CharField(_('Condition'), max_length=1, choices=TASK_STATES, default=TASK_STATES[0][0]) - attachment = models.ImageField(_('Attached image'), upload_to='task_attachments/%Y.%m.%d', blank=True, null=True) - mode = models.CharField(_('The nature of the damage'), max_length=2, choices=TASK_TYPES, default=TASK_TYPES[0][0]) - abon = models.ForeignKey(Abon, on_delete=models.CASCADE, null=True, blank=True, verbose_name=_('Subscriber')) + descr = models.CharField( + _('Description'), max_length=128, + null=True, blank=True + ) + recipients = models.ManyToManyField( + settings.AUTH_USER_MODEL, verbose_name=_('Recipients'), + related_name='them_task' + ) + author = models.ForeignKey( + settings.AUTH_USER_MODEL, related_name='+', + on_delete=models.SET_NULL, null=True, + blank=True, verbose_name=_('Task author') + ) + priority = models.CharField( + _('A priority'), max_length=1, + choices=TASK_PRIORITIES, default=TASK_PRIORITIES[2][0] + ) + out_date = models.DateField( + _('Reality'), null=True, + blank=True, default=delta_add_days + ) + time_of_create = models.DateTimeField( + _('Date of create'), auto_now_add=True + ) + state = models.CharField( + _('Condition'), max_length=1, choices=TASK_STATES, + default=TASK_STATES[0][0] + ) + attachment = models.ImageField( + _('Attached image'), upload_to='task_attachments/%Y.%m.%d', + blank=True, null=True + ) + mode = models.CharField( + _('The nature of the damage'), max_length=2, + choices=TASK_TYPES, default=TASK_TYPES[0][0] + ) + abon = models.ForeignKey( + Abon, on_delete=models.CASCADE, null=True, + blank=True, verbose_name=_('Subscriber') + ) class Meta: db_table = 'task' @@ -115,8 +146,14 @@ class Task(models.Model): class ExtraComment(models.Model): text = models.TextField(_('Text of comment')) - task = models.ForeignKey(Task, verbose_name=_('Owner task'), on_delete=models.CASCADE) - author = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_('Author'), on_delete=models.CASCADE) + task = models.ForeignKey( + Task, verbose_name=_('Owner task'), + on_delete=models.CASCADE + ) + author = models.ForeignKey( + settings.AUTH_USER_MODEL, verbose_name=_('Author'), + on_delete=models.CASCADE + ) date_create = models.DateTimeField(_('Time of create'), auto_now_add=True) def __str__(self): diff --git a/taskapp/views.py b/taskapp/views.py index bbf821e..26f9d16 100644 --- a/taskapp/views.py +++ b/taskapp/views.py @@ -14,7 +14,7 @@ from django.views.generic.edit import FormMixin, DeleteView, UpdateView from guardian.decorators import permission_required_or_403 as permission_required from chatbot.models import MessageQueue -from abonapp.models import Abon +from abonapp.models.generic import Abon from djing import httpresponse_to_referrer from djing.lib import safe_int, MultipleException, RuTimedelta from djing.lib.decorators import only_admins, json_view @@ -38,9 +38,13 @@ class NewTasksView(ListView): context_object_name = 'tasks' def get_queryset(self): - return Task.objects.filter(recipients=self.request.user, state='S') \ - .annotate(comment_count=Count('extracomment')) \ - .select_related('abon', 'abon__street', 'abon__group', 'author') + return Task.objects.filter( + recipients=self.request.user, state='S' + ).annotate( + comment_count=Count('extracomment') + ).select_related( + 'abon', 'abon__street', 'abon__group', 'author' + ) @method_decorator(login_decs, name='dispatch') @@ -53,8 +57,11 @@ class FailedTasksView(NewTasksView): context_object_name = 'tasks' def get_queryset(self): - return Task.objects.filter(recipients=self.request.user, state='C') \ - .select_related('abon', 'abon__street', 'abon__group', 'author') + return Task.objects.filter( + recipients=self.request.user, state='C' + ).select_related( + 'abon', 'abon__street', 'abon__group', 'author' + ) @method_decorator(login_decs, name='dispatch') @@ -63,8 +70,11 @@ class FinishedTaskListView(NewTasksView): template_name = 'taskapp/tasklist_finish.html' def get_queryset(self): - return Task.objects.filter(recipients=self.request.user, state='F') \ - .select_related('abon', 'abon__street', 'abon__group', 'author') + return Task.objects.filter( + recipients=self.request.user, state='F' + ).select_related( + 'abon', 'abon__street', 'abon__group', 'author' + ) @method_decorator(login_decs, name='dispatch') @@ -74,9 +84,11 @@ class OwnTaskListView(NewTasksView): def get_queryset(self): # Attached and not finished tasks - return Task.objects.filter(author=self.request.user) \ - .exclude(state='F') \ - .select_related('abon', 'abon__street', 'abon__group') + return Task.objects.filter( + author=self.request.user + ).exclude(state='F').select_related( + 'abon', 'abon__street', 'abon__group' + ) @method_decorator(login_decs, name='dispatch') @@ -86,8 +98,11 @@ class MyTaskListView(NewTasksView): def get_queryset(self): # Tasks in which I participated - return Task.objects.filter(recipients=self.request.user) \ - .select_related('abon', 'abon__street', 'abon__group', 'author') + return Task.objects.filter( + recipients=self.request.user + ).select_related( + 'abon', 'abon__street', 'abon__group', 'author' + ) @method_decorator(login_decs, name='dispatch') @@ -99,8 +114,11 @@ class AllTasksListView(ListView): context_object_name = 'tasks' def get_queryset(self): - return Task.objects.annotate(comment_count=Count('extracomment')) \ - .select_related('abon', 'abon__street', 'abon__group', 'author') + return Task.objects.annotate( + comment_count=Count('extracomment') + ).select_related( + 'abon', 'abon__street', 'abon__group', 'author' + ) @method_decorator(login_decs, name='dispatch') @@ -109,7 +127,9 @@ class EmptyTasksListView(NewTasksView): template_name = 'taskapp/tasklist_empty.html' def get_queryset(self): - return Task.objects.annotate(reccount=Count('recipients')).filter(reccount__lt=1) + return Task.objects.annotate( + reccount=Count('recipients') + ).filter(reccount__lt=1) @login_required @@ -121,7 +141,9 @@ def task_delete(request, task_id): if request.user.is_superuser or request.user not in task.recipients.all(): task.delete() else: - messages.warning(request, _('You cannot delete task that assigned to you')) + messages.warning( + request, _('You cannot delete task that assigned to you') + ) return redirect('taskapp:home') @@ -196,7 +218,9 @@ class TaskUpdateView(UpdateView): if task.out_date > now_date: time_diff = "%s: %s" % (_('time left'), RuTimedelta(task.out_date - now_date)) else: - time_diff = _("Expired timeout -%(time_left)s") % {'time_left': RuTimedelta(now_date - task.out_date)} + time_diff = _("Expired timeout -%(time_left)s") % { + 'time_left': RuTimedelta(now_date - task.out_date) + } else: time_diff = None @@ -217,7 +241,10 @@ class TaskUpdateView(UpdateView): return resolve_url('taskapp:edit', task_id) def form_invalid(self, form): - messages.add_message(self.request, messages.ERROR, _('fix form errors')) + messages.add_message( + self.request, messages.ERROR, + _('fix form errors') + ) return super(TaskUpdateView, self).form_invalid(form)