Browse Source

Refactoring. Fix line length by PEP8

devel
Dmitry Novikov 7 years ago
parent
commit
ece12fbace
  1. 20
      abonapp/admin.py
  2. 129
      abonapp/forms.py
  3. 0
      abonapp/models/__init__.py
  4. 1
      abonapp/models/generic.py
  5. 0
      abonapp/models/payment.py
  6. 2
      abonapp/tests.py
  7. 316
      abonapp/views.py
  8. 7
      accounts_app/templatetags/acc_tags.py
  9. 13
      agent/commands/dhcp.py
  10. 39
      clientsideapp/views.py
  11. 73
      devapp/views.py
  12. 16
      dialing_app/views.py
  13. 7
      djing/lib/auth_backends.py
  14. 76
      gw_app/tests.py
  15. 3
      periodic.py
  16. 12
      searchapp/views.py
  17. 69
      taskapp/models.py
  18. 65
      taskapp/views.py

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

129
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',

0
abonapp/models/__init__.py

1
abonapp/models.py → 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

0
abonapp/models/payment.py

2
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

316
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 = '<span class="glyphicon glyphicon-exclamation-sign"></span> %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, _(
"<a href='%(user_url)s'>%(user_name)s</a> 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, _("<a href='%(user_url)s'>%(user_name)s</a> 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,

7
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

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

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

73
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 = '<span class="glyphicon glyphicon-ok"></span> <span class="hidden-xs">%s</span>' % \
(_('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 = '<span class="glyphicon glyphicon-ok"></span> <span class="hidden-xs">%s</span>' % _(
'Fixed')
text = '<span class="glyphicon glyphicon-ok"></span> <span class="hidden-xs">%s</span>' % _('Fixed')
break
else:
text += '\n%s' % _('Parent device not found')

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

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

76
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())

3
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

12
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 = ()

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

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

Loading…
Cancel
Save