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 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 djing.lib import LogicError
from ip_pool.models import NetworkModel from ip_pool.models import NetworkModel
from gw_app.models import NASModel from gw_app.models import NASModel
from . import models
from abonapp.models import generic
from django.conf import settings 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)) username = ''.join(choice(chars) for i in range(length))
if split: 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: 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 return username
@ -38,9 +44,13 @@ class AbonForm(forms.ModelForm):
super(AbonForm, self).__init__(*args, **kwargs) super(AbonForm, self).__init__(*args, **kwargs)
instance = getattr(self, 'instance') instance = getattr(self, 'instance')
if instance is not None and instance.group is not None: 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: 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: else:
abon_group_queryset = None abon_group_queryset = None
if abon_group_queryset is not None: if abon_group_queryset is not None:
@ -48,20 +58,26 @@ class AbonForm(forms.ModelForm):
if instance.pk is None: if instance.pk is None:
self.initial['nas'] = NASModel.objects.filter(default=True).first() 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={ widget=forms.TextInput(attrs={
'placeholder': _('login'), 'placeholder': _('login'),
'required': '', 'required': '',
'pattern': r'^\w{1,127}$' 'pattern': r'^\w{1,127}$'
}), label=_('login')) }), 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: 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 = { widgets = {
'fio': forms.TextInput(attrs={ 'fio': forms.TextInput(attrs={
'placeholder': _('fio'), 'placeholder': _('fio'),
@ -69,7 +85,10 @@ class AbonForm(forms.ModelForm):
}), }),
'telephone': forms.TextInput(attrs={ 'telephone': forms.TextInput(attrs={
'placeholder': _('telephone placeholder'), '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'}) 'description': forms.Textarea(attrs={'rows': '4'})
} }
@ -81,11 +100,11 @@ class AbonForm(forms.ModelForm):
if commit: if commit:
acc.save() acc.save()
try: 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.passw_text = raw_password
abon_raw_passw.save(update_fields=('passw_text',)) 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, account=acc,
passw_text=raw_password passw_text=raw_password
) )
@ -94,44 +113,59 @@ class AbonForm(forms.ModelForm):
class PassportForm(forms.ModelForm): class PassportForm(forms.ModelForm):
class Meta: class Meta:
model = models.PassportInfo
model = generic.PassportInfo
exclude = ('abon',) exclude = ('abon',)
widgets = { 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': ''}), '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 AbonStreetForm(forms.ModelForm):
class Meta: class Meta:
model = models.AbonStreet
model = generic.AbonStreet
fields = '__all__' fields = '__all__'
widgets = { 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'}) 'group': forms.Select(attrs={'class': 'form-control'})
} }
class AdditionalTelephoneForm(forms.ModelForm): class AdditionalTelephoneForm(forms.ModelForm):
class Meta: class Meta:
model = models.AdditionalTelephone
model = generic.AdditionalTelephone
exclude = ('abon',) exclude = ('abon',)
widgets = { widgets = {
'telephone': forms.TextInput(attrs={ 'telephone': forms.TextInput(attrs={
'placeholder': _('telephone placeholder'), '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': '', 'required': '',
'class': 'form-control' '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 PeriodicPayForIdForm(forms.ModelForm):
class Meta: class Meta:
model = models.PeriodicPayForId
model = generic.PeriodicPayForId
exclude = ('account',) exclude = ('account',)
@ -151,14 +185,16 @@ class ExportUsersForm(forms.Form):
('dev_port__descr', _('Device port')), ('dev_port__descr', _('Device port')),
('is_dynamic_ip', _('Is dynamic ip')) ('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 MarkersForm(forms.ModelForm):
class Meta: class Meta:
model = models.Abon
model = generic.Abon
fields = 'markers', fields = 'markers',
def save(self, commit=True): def save(self, commit=True):
@ -169,7 +205,10 @@ class MarkersForm(forms.ModelForm):
class AmountMoneyForm(forms.Form): class AmountMoneyForm(forms.Form):
amount = forms.FloatField(max_value=5000, label=_('Amount of money')) 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): class AddIpForm(forms.ModelForm):
@ -178,21 +217,33 @@ class AddIpForm(forms.ModelForm):
instance = getattr(self, 'instance') instance = getattr(self, 'instance')
if instance: if instance:
if instance.group: 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 not self.initial['ip_address']:
if instance: if instance:
net = NetworkModel.objects.filter(groups=instance.group).first()
net = NetworkModel.objects.filter(
groups=instance.group
).first()
if net is not None: 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) free_ip = net.get_free_ip(ips)
self.initial['ip_address'] = free_ip self.initial['ip_address'] = free_ip
else: else:
raise LogicError(_('Subnet has not attached to current group')) 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: class Meta:
model = models.Abon
model = generic.Abon
fields = 'ip_address', 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 djing.lib import LogicError
from group_app.models import Group from group_app.models import Group
from gw_app.nas_managers import SubnetQueue, NasFailedResult, NasNetworkError from gw_app.nas_managers import SubnetQueue, NasFailedResult, NasNetworkError
from ip_pool.models import NetworkModel
from tariff_app.models import Tariff, PeriodicPay 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 django.utils.translation import gettext_lazy as _
from xmltodict import parse 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 abonapp.pay_systems import allpay
from group_app.models import Group from group_app.models import Group
from tariff_app.models import Tariff 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 import messages
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin, \ 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.core.exceptions import PermissionDenied, ValidationError
from django.db import IntegrityError, ProgrammingError, transaction, \ from django.db import IntegrityError, ProgrammingError, transaction, \
DatabaseError DatabaseError
@ -25,7 +26,8 @@ from djing import lib
from djing import ping from djing import ping
from djing.global_base_views import OrderedFilteredList, SecureApiView from djing.global_base_views import OrderedFilteredList, SecureApiView
from djing.lib.decorators import json_view, only_admins 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 group_app.models import Group
from guardian.decorators import \ from guardian.decorators import \
permission_required_or_403 as permission_required permission_required_or_403 as permission_required
@ -36,8 +38,8 @@ from ip_pool.models import NetworkModel
from tariff_app.models import Tariff from tariff_app.models import Tariff
from taskapp.models import Task from taskapp.models import Task
from xmlview.decorators import xml_view 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, class PeoplesListView(LoginRequiredMixin, OnlyAdminsMixin,
@ -47,7 +49,7 @@ class PeoplesListView(LoginRequiredMixin, OnlyAdminsMixin,
def get_queryset(self): def get_queryset(self):
street_id = lib.safe_int(self.request.GET.get('street')) street_id = lib.safe_int(self.request.GET.get('street'))
gid = lib.safe_int(self.kwargs.get('gid')) 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: if street_id > 0:
peoples_list = peoples_list.filter(street=street_id) peoples_list = peoples_list.filter(street=street_id)
peoples_list = peoples_list.select_related( peoples_list = peoples_list.select_related(
@ -73,8 +75,9 @@ class PeoplesListView(LoginRequiredMixin, OnlyAdminsMixin,
context = super(PeoplesListView, self).get_context_data(**kwargs) 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['street_id'] = lib.safe_int(self.request.GET.get('street'))
context['group'] = group context['group'] = group
return context return context
@ -87,9 +90,11 @@ class GroupListView(LoginRequiredMixin, OnlyAdminsMixin, OrderedFilteredList):
def get_queryset(self): def get_queryset(self):
queryset = super(GroupListView, self).get_queryset() 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 return queryset
@ -99,7 +104,7 @@ class AbonCreateView(LoginRequiredMixin, OnlyAdminsMixin,
group = None group = None
abon = None abon = None
form_class = forms.AbonForm form_class = forms.AbonForm
model = models.Abon
model = generic.Abon
template_name = 'abonapp/addAbon.html' template_name = 'abonapp/addAbon.html'
context_object_name = 'group' context_object_name = 'group'
@ -156,7 +161,7 @@ class AbonCreateView(LoginRequiredMixin, OnlyAdminsMixin,
class DelAbonDeleteView(LoginAdminMixin, PermissionRequiredMixin, DeleteView): class DelAbonDeleteView(LoginAdminMixin, PermissionRequiredMixin, DeleteView):
permission_required = 'abonapp.delete_abon' permission_required = 'abonapp.delete_abon'
model = models.Abon
model = generic.Abon
slug_url_kwarg = 'uname' slug_url_kwarg = 'uname'
slug_field = 'username' slug_field = 'username'
success_url = reverse_lazy('abonapp:group_list') success_url = reverse_lazy('abonapp:group_list')
@ -198,7 +203,7 @@ class DelAbonDeleteView(LoginAdminMixin, PermissionRequiredMixin, DeleteView):
@permission_required('abonapp.can_add_ballance') @permission_required('abonapp.can_add_ballance')
@transaction.atomic @transaction.atomic
def abonamount(request, gid: int, uname): 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 frm = None
try: try:
if request.method == 'POST': if request.method == 'POST':
@ -211,7 +216,8 @@ def abonamount(request, gid: int, uname):
abon.add_ballance(request.user, amnt, comment=comment) abon.add_ballance(request.user, amnt, comment=comment)
abon.save(update_fields=('ballance',)) abon.save(update_fields=('ballance',))
messages.success( 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) return redirect('abonapp:abon_phistory', gid=gid, uname=uname)
else: else:
messages.error(request, _('I not know the account id')) messages.error(request, _('I not know the account id'))
@ -238,10 +244,10 @@ class DebtsListView(LoginAdminPermissionMixin, OrderedFilteredList):
return self.abon.group return self.abon.group
def get_queryset(self): def get_queryset(self):
abon = get_object_or_404(models.Abon,
abon = get_object_or_404(generic.Abon,
username=self.kwargs.get('uname')) username=self.kwargs.get('uname'))
self.abon = abon self.abon = abon
return models.InvoiceForPayment.objects.filter(abon=abon)
return generic.InvoiceForPayment.objects.filter(abon=abon)
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(DebtsListView, self).get_context_data(**kwargs) context = super(DebtsListView, self).get_context_data(**kwargs)
@ -258,14 +264,15 @@ class PayHistoryListView(LoginAdminPermissionMixin, OrderedFilteredList):
def get_permission_object(self): def get_permission_object(self):
if hasattr(self, 'abon'): if hasattr(self, 'abon'):
return self.abon.group 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): def get_queryset(self):
abon = get_object_or_404(models.Abon,
abon = get_object_or_404(generic.Abon,
username=self.kwargs.get('uname')) username=self.kwargs.get('uname'))
self.abon = abon 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 return pay_history
def get_context_data(self, **kwargs): 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) grp = get_object_or_404(Group, pk=gid)
if not request.user.has_perm('group_app.view_group', grp): if not request.user.has_perm('group_app.view_group', grp):
raise PermissionDenied raise PermissionDenied
abon = get_object_or_404(models.Abon, username=uname)
abon = get_object_or_404(generic.Abon, username=uname)
if abon.group != grp: 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) return redirect('abonapp:abon_services', abon.group.id, abon.username)
try: 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 periodic_pay = None
return render(request, 'abonapp/service.html', { return render(request, 'abonapp/service.html', {
@ -305,7 +315,7 @@ def abon_services(request, gid: int, uname):
class AbonHomeUpdateView(LoginAdminMixin, PermissionRequiredMixin, UpdateView): class AbonHomeUpdateView(LoginAdminMixin, PermissionRequiredMixin, UpdateView):
permission_required = 'abonapp.view_abon' permission_required = 'abonapp.view_abon'
model = models.Abon
model = generic.Abon
form_class = forms.AbonForm form_class = forms.AbonForm
slug_field = 'username' slug_field = 'username'
slug_url_kwarg = 'uname' slug_url_kwarg = 'uname'
@ -315,8 +325,10 @@ class AbonHomeUpdateView(LoginAdminMixin, PermissionRequiredMixin, UpdateView):
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
try: try:
return super(AbonHomeUpdateView, self).dispatch(request, *args,
**kwargs)
return super(AbonHomeUpdateView, self).dispatch(
request, *args,
**kwargs
)
except lib.LogicError as e: except lib.LogicError as e:
messages.error(request, e) messages.error(request, e)
except (NasFailedResult, NasNetworkError) as e: except (NasFailedResult, NasNetworkError) as e:
@ -358,13 +370,17 @@ class AbonHomeUpdateView(LoginAdminMixin, PermissionRequiredMixin, UpdateView):
if self.initial: if self.initial:
return self.initial return self.initial
try: try:
passw = models.AbonRawPassword.objects.get(account=abon).passw_text
passw = generic.AbonRawPassword.objects.get(
account=abon
).passw_text
return { return {
'password': passw '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': ''} return {'password': ''}
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
@ -394,7 +410,7 @@ def terminal_pay(request):
@only_admins @only_admins
@permission_required('abonapp.add_invoiceforpayment') @permission_required('abonapp.add_invoiceforpayment')
def add_invoice(request, gid: int, uname: str): 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) grp = get_object_or_404(Group, pk=gid)
try: try:
@ -402,7 +418,7 @@ def add_invoice(request, gid: int, uname: str):
curr_amount = lib.safe_int(request.POST.get('curr_amount')) curr_amount = lib.safe_int(request.POST.get('curr_amount'))
comment = request.POST.get('comment') comment = request.POST.get('comment')
newinv = models.InvoiceForPayment()
newinv = generic.InvoiceForPayment()
newinv.abon = abon newinv.abon = abon
newinv.amount = curr_amount newinv.amount = curr_amount
newinv.comment = comment newinv.comment = comment
@ -422,7 +438,7 @@ def add_invoice(request, gid: int, uname: str):
messages.error(request, err) messages.error(request, err)
return render(request, 'abonapp/addInvoice.html', { return render(request, 'abonapp/addInvoice.html', {
'abon': abon, 'abon': abon,
'invcount': models.InvoiceForPayment.objects.filter(abon=abon).count(),
'invcount': generic.InvoiceForPayment.objects.filter(abon=abon).count(),
'group': grp 'group': grp
}) })
@ -432,7 +448,7 @@ def add_invoice(request, gid: int, uname: str):
@permission_required('abonapp.can_buy_tariff') @permission_required('abonapp.can_buy_tariff')
def pick_tariff(request, gid: int, uname): def pick_tariff(request, gid: int, uname):
grp = get_object_or_404(Group, pk=gid) 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) tariffs = Tariff.objects.get_tariffs_by_group(grp.pk)
try: try:
if request.method == 'POST': if request.method == 'POST':
@ -487,7 +503,7 @@ def pick_tariff(request, gid: int, uname):
@permission_required('abonapp.can_complete_service') @permission_required('abonapp.can_complete_service')
def unsubscribe_service(request, gid: int, uname, abon_tariff_id: int): def unsubscribe_service(request, gid: int, uname, abon_tariff_id: int):
try: try:
abon_tariff = get_object_or_404(models.AbonTariff,
abon_tariff = get_object_or_404(generic.AbonTariff,
pk=int(abon_tariff_id)) pk=int(abon_tariff_id))
abon_tariff.delete() abon_tariff.delete()
messages.success(request, _('User has been detached from service')) messages.success(request, _('User has been detached from service'))
@ -507,7 +523,7 @@ class LogListView(LoginAdminPermissionMixin, ListView):
http_method_names = ('get',) http_method_names = ('get',)
context_object_name = 'logs' context_object_name = 'logs'
template_name = 'abonapp/log.html' template_name = 'abonapp/log.html'
model = models.AbonLog
model = generic.AbonLog
class DebtorsListView(LoginAdminPermissionMixin, ListView): class DebtorsListView(LoginAdminPermissionMixin, ListView):
@ -516,7 +532,7 @@ class DebtorsListView(LoginAdminPermissionMixin, ListView):
http_method_names = ('get',) http_method_names = ('get',)
context_object_name = 'invoices' context_object_name = 'invoices'
template_name = 'abonapp/debtors.html' template_name = 'abonapp/debtors.html'
queryset = models.InvoiceForPayment.objects.filter(status=True)
queryset = generic.InvoiceForPayment.objects.filter(status=True)
class TaskLogListView(LoginAdminPermissionMixin, ListView): class TaskLogListView(LoginAdminPermissionMixin, ListView):
@ -530,10 +546,10 @@ class TaskLogListView(LoginAdminPermissionMixin, ListView):
if hasattr(self, 'abon'): if hasattr(self, 'abon'):
return self.abon.group return self.abon.group
else: 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): def get_queryset(self):
abon = get_object_or_404(models.Abon,
abon = get_object_or_404(generic.Abon,
username=self.kwargs.get('uname')) username=self.kwargs.get('uname'))
self.abon = abon self.abon = abon
return Task.objects.filter(abon=abon) return Task.objects.filter(abon=abon)
@ -548,15 +564,17 @@ class TaskLogListView(LoginAdminPermissionMixin, ListView):
class PassportUpdateView(LoginAdminPermissionMixin, UpdateView): class PassportUpdateView(LoginAdminPermissionMixin, UpdateView):
permission_required = 'abonapp.view_passportinfo' permission_required = 'abonapp.view_passportinfo'
form_class = forms.PassportForm form_class = forms.PassportForm
model = models.PassportInfo
model = generic.PassportInfo
template_name = 'abonapp/modal_passport_view.html' template_name = 'abonapp/modal_passport_view.html'
def get_object(self, queryset=None): 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')) username=self.kwargs.get('uname'))
try: 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 passport_instance = None
return passport_instance return passport_instance
@ -564,14 +582,18 @@ class PassportUpdateView(LoginAdminPermissionMixin, UpdateView):
pi = form.save(commit=False) pi = form.save(commit=False)
pi.abon = self.abon pi.abon = self.abon
pi.save() 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) return super(PassportUpdateView, self).form_valid(form)
def get_success_url(self): 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): def form_invalid(self, form):
messages.error(self.request, _('fix form errors')) messages.error(self.request, _('fix form errors'))
@ -589,7 +611,7 @@ class PassportUpdateView(LoginAdminPermissionMixin, UpdateView):
class IpUpdateView(LoginAdminPermissionMixin, UpdateView): class IpUpdateView(LoginAdminPermissionMixin, UpdateView):
permission_required = 'abonapp.change_abon' permission_required = 'abonapp.change_abon'
form_class = forms.AddIpForm form_class = forms.AddIpForm
model = models.Abon
model = generic.Abon
slug_url_kwarg = 'uname' slug_url_kwarg = 'uname'
slug_field = 'username' slug_field = 'username'
template_name = 'abonapp/modal_ip_form.html' template_name = 'abonapp/modal_ip_form.html'
@ -637,7 +659,8 @@ def chgroup_tariff(request, gid):
return redirect('abonapp:ch_group_tariff', gid) return redirect('abonapp:ch_group_tariff', gid)
tariffs = Tariff.objects.all() tariffs = Tariff.objects.all()
seleted_tariffs_id = tuple( 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', { return render(request, 'abonapp/group_tariffs.html', {
'group': grp, 'group': grp,
'seleted_tariffs': seleted_tariffs_id, 'seleted_tariffs': seleted_tariffs_id,
@ -651,7 +674,7 @@ def chgroup_tariff(request, gid):
def dev(request, gid: int, uname): def dev(request, gid: int, uname):
abon_dev = None abon_dev = None
try: try:
abon = models.Abon.objects.get(username=uname)
abon = generic.Abon.objects.get(username=uname)
if request.method == 'POST': if request.method == 'POST':
abon.device = Device.objects.get(pk=request.POST.get('dev')) abon.device = Device.objects.get(pk=request.POST.get('dev'))
abon.save(update_fields=('device',)) abon.save(update_fields=('device',))
@ -660,9 +683,11 @@ def dev(request, gid: int, uname):
else: else:
abon_dev = abon.device abon_dev = abon.device
except Device.DoesNotExist: 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')) messages.error(request, _('Abon does not exist'))
return redirect('abonapp:people_list', gid=gid) return redirect('abonapp:people_list', gid=gid)
return render(request, 'abonapp/modal_dev.html', { 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')) @permission_required('group_app.view_group', (Group, 'pk', 'gid'))
def clear_dev(request, gid: int, uname): def clear_dev(request, gid: int, uname):
try: try:
abon = models.Abon.objects.get(username=uname)
abon = generic.Abon.objects.get(username=uname)
abon.device = None abon.device = None
abon.dev_port = None abon.dev_port = None
abon.is_dynamic_ip = False abon.is_dynamic_ip = False
abon.save(update_fields=('device', 'dev_port', 'is_dynamic_ip')) abon.save(update_fields=('device', 'dev_port', 'is_dynamic_ip'))
messages.success(request, _('Device has successfully unattached')) messages.success(request, _('Device has successfully unattached'))
except models.Abon.DoesNotExist:
except generic.Abon.DoesNotExist:
messages.error(request, _('Abon does not exist')) messages.error(request, _('Abon does not exist'))
return redirect('abonapp:people_list', gid=gid) return redirect('abonapp:people_list', gid=gid)
return redirect('abonapp:abon_home', gid=gid, uname=uname) return redirect('abonapp:abon_home', gid=gid, uname=uname)
@ -699,7 +724,7 @@ def abon_ping(request, gid: int, uname):
status = False status = False
text = '<span class="glyphicon glyphicon-exclamation-sign"></span> %s' % _( text = '<span class="glyphicon glyphicon-exclamation-sign"></span> %s' % _(
'no ping') 'no ping')
abon = get_object_or_404(models.Abon, username=uname)
abon = get_object_or_404(generic.Abon, username=uname)
try: try:
if ip is None: if ip is None:
raise lib.LogicError(_('Ip not passed')) 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): def set_auto_continue_service(request, gid: int, uname):
checked = request.GET.get('checked') checked = request.GET.get('checked')
checked = True if checked == 'true' else False 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.autoconnect_service = checked
abon.save(update_fields=('autoconnect_service',)) abon.save(update_fields=('autoconnect_service',))
return { return {
@ -766,14 +791,14 @@ def set_auto_continue_service(request, gid: int, uname):
@login_required @login_required
@only_admins @only_admins
def vcards(r): def vcards(r):
users = models.Abon.objects.exclude(group=None).select_related(
users = generic.Abon.objects.exclude(group=None).select_related(
'group', 'group',
'street' 'street'
).only( ).only(
'username', 'fio', 'group__title', 'telephone', 'username', 'fio', 'group__title', 'telephone',
'street__name', 'house' 'street__name', 'house'
) )
additional_tels = models.AdditionalTelephone.objects.select_related(
additional_tels = generic.AdditionalTelephone.objects.select_related(
'abon', 'abon',
'abon__group', 'abon__group',
'abon__street' 'abon__street'
@ -819,16 +844,19 @@ class DialsListView(LoginRequiredMixin, OnlyAdminsMixin, OrderedFilteredList):
template_name = 'abonapp/dial_log.html' template_name = 'abonapp/dial_log.html'
def get_queryset(self): def get_queryset(self):
abon = get_object_or_404(models.Abon,
abon = get_object_or_404(generic.Abon,
username=self.kwargs.get('uname')) username=self.kwargs.get('uname'))
if not self.request.user.has_perm('group_app.view_group', abon.group): if not self.request.user.has_perm('group_app.view_group', abon.group):
raise PermissionDenied raise PermissionDenied
self.abon = abon self.abon = abon
if abon.telephone is not None and abon.telephone != '': if abon.telephone is not None and abon.telephone != '':
tel = abon.telephone.replace('+', '') 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( logs = AsteriskCDR.objects.filter(
Q(src__contains=tel) | Q(dst__contains=tel) | Q(src__contains=tel) | Q(dst__contains=tel) |
Q(src__in=additional_tels) | Q(dst__in=additional_tels) 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): def render_to_response(self, context, **response_kwargs):
if hasattr(self.abon.group, 'pk') and self.abon.group.pk != int( if hasattr(self.abon.group, 'pk') and self.abon.group.pk != int(
self.kwargs.get('gid')): 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): def get(self, request, *args, **kwargs):
try: 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 = request.POST.get('is_dynamic_ip')
is_dynamic_ip = True if is_dynamic_ip == 'on' else False is_dynamic_ip = True if is_dynamic_ip == 'on' else False
try: try:
abon = models.Abon.objects.get(username=uname)
abon = generic.Abon.objects.get(username=uname)
if user_port == 0: if user_port == 0:
port = None port = None
else: else:
port = DevPort.objects.get(pk=user_port) port = DevPort.objects.get(pk=user_port)
if abon.device is not None: if abon.device is not None:
try: 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: 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) return redirect('abonapp:abon_home', gid, uname)
except models.Abon.DoesNotExist:
except generic.Abon.DoesNotExist:
pass pass
except models.Abon.MultipleObjectsReturned:
except generic.Abon.MultipleObjectsReturned:
messages.error(request, messages.error(request,
_('Multiple users on the same device port')) _('Multiple users on the same device port'))
return redirect('devapp:view', abon.device.group.pk, 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')) messages.success(request, _('User port has been saved'))
except DevPort.DoesNotExist: except DevPort.DoesNotExist:
messages.error(request, _('Selected port does not exist')) messages.error(request, _('Selected port does not exist'))
except models.Abon.DoesNotExist:
except generic.Abon.DoesNotExist:
messages.error(request, _('User does not exist')) messages.error(request, _('User does not exist'))
return redirect('abonapp:abon_home', gid, uname) return redirect('abonapp:abon_home', gid, uname)
@ -943,17 +980,17 @@ def street_edit(request, gid):
if request.method == 'POST': if request.method == 'POST':
for sid, sname in zip(request.POST.getlist('sid'), for sid, sname in zip(request.POST.getlist('sid'),
request.POST.getlist('sname')): request.POST.getlist('sname')):
street = models.AbonStreet.objects.get(pk=sid)
street = generic.AbonStreet.objects.get(pk=sid)
street.name = sname street.name = sname
street.save() street.save()
messages.success(request, _('Streets has been saved')) messages.success(request, _('Streets has been saved'))
else: else:
return render(request, 'abonapp/modal_editstreet.html', { return render(request, 'abonapp/modal_editstreet.html', {
'gid': gid, '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')) messages.error(request, _('One of these streets has not been found'))
return redirect('abonapp:people_list', gid) return redirect('abonapp:people_list', gid)
@ -965,9 +1002,9 @@ def street_edit(request, gid):
@permission_required('group_app.view_group', (Group, 'pk', 'gid')) @permission_required('group_app.view_group', (Group, 'pk', 'gid'))
def street_del(request, gid: int, sid: int): def street_del(request, gid: int, sid: int):
try: 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')) messages.success(request, _('The street successfully deleted'))
except models.AbonStreet.DoesNotExist:
except generic.AbonStreet.DoesNotExist:
messages.error(request, _('The street has not been found')) messages.error(request, _('The street has not been found'))
return redirect('abonapp:people_list', gid) return redirect('abonapp:people_list', gid)
@ -987,7 +1024,7 @@ def active_nets(request, gid):
@permission_required('abonapp.view_additionaltelephones') @permission_required('abonapp.view_additionaltelephones')
@permission_required('group_app.view_group', (Group, 'pk', 'gid')) @permission_required('group_app.view_group', (Group, 'pk', 'gid'))
def tels(request, gid: int, uname): 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() telephones = abon.additional_telephones.all()
return render(request, 'abonapp/modal_additional_telephones.html', { return render(request, 'abonapp/modal_additional_telephones.html', {
'telephones': telephones, 'telephones': telephones,
@ -1004,7 +1041,7 @@ def tel_add(request, gid: int, uname):
frm = forms.AdditionalTelephoneForm(request.POST) frm = forms.AdditionalTelephoneForm(request.POST)
if frm.is_valid(): if frm.is_valid():
new_tel = frm.save(commit=False) 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.abon = abon
new_tel.save() new_tel.save()
messages.success(request, _('New telephone has been saved')) 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): def tel_del(request, gid: int, uname):
try: try:
tid = lib.safe_int(request.GET.get('tid')) tid = lib.safe_int(request.GET.get('tid'))
tel = models.AdditionalTelephone.objects.get(pk=tid)
tel = generic.AdditionalTelephone.objects.get(pk=tid)
tel.delete() tel.delete()
messages.success(request, messages.success(request,
_('Additional telephone successfully deleted')) _('Additional telephone successfully deleted'))
except models.AdditionalTelephone.DoesNotExist:
except generic.AdditionalTelephone.DoesNotExist:
messages.error(request, _('Telephone not found')) messages.error(request, _('Telephone not found'))
return redirect('abonapp:abon_home', gid, uname) 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')) @permission_required('group_app.view_group', (Group, 'pk', 'gid'))
def phonebook(request, gid): def phonebook(request, gid):
res_format = request.GET.get('f') res_format = request.GET.get('f')
t1 = models.Abon.objects.filter(
t1 = generic.Abon.objects.filter(
group__id=int(gid) group__id=int(gid)
).only('telephone', 'fio').values_list( ).only('telephone', 'fio').values_list(
'telephone', 'fio' 'telephone', 'fio'
) )
t2 = models.AdditionalTelephone.objects.filter(
t2 = generic.AdditionalTelephone.objects.filter(
abon__group__id=gid abon__group__id=gid
).only( ).only(
'telephone', 'owner_name' 'telephone', 'owner_name'
@ -1078,24 +1115,30 @@ def abon_export(request, gid):
if frm.is_valid(): if frm.is_valid():
cleaned_data = frm.clean() cleaned_data = frm.clean()
fields = cleaned_data.get('fields') 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) *fields).values_list(*fields)
if res_format == 'csv': if res_format == 'csv':
import csv import csv
response = HttpResponse(content_type='text/csv') response = HttpResponse(content_type='text/csv')
response[ response[
'Content-Disposition'] = 'attachment; filename="users.csv"'
'Content-Disposition'
] = 'attachment; filename="users.csv"'
writer = csv.writer(response, quoting=csv.QUOTE_NONNUMERIC) 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) writer.writerow(display_values)
for row in subscribers: for row in subscribers:
writer.writerow(row) writer.writerow(row)
return response return response
else: 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') return redirect('abonapp:group_list')
else: else:
messages.error(request, _('fix form errors')) messages.error(request, _('fix form errors'))
@ -1111,7 +1154,7 @@ def abon_export(request, gid):
@login_required @login_required
@only_admins @only_admins
def fin_report(request): def fin_report(request):
q = models.AllTimePayLog.objects.by_days()
q = generic.AllTimePayLog.objects.by_days()
res_format = request.GET.get('f') res_format = request.GET.get('f')
if res_format == 'csv': if res_format == 'csv':
import csv import csv
@ -1120,7 +1163,8 @@ def fin_report(request):
writer = csv.writer(response, quoting=csv.QUOTE_NONNUMERIC) writer = csv.writer(response, quoting=csv.QUOTE_NONNUMERIC)
for row in q: for row in q:
writer.writerow( writer.writerow(
(row['summ'], row['pay_date'].strftime('%Y-%m-%d')))
(row['summ'], row['pay_date'].strftime('%Y-%m-%d'))
)
return response return response
return render(request, 'abonapp/fin_report.html', { return render(request, 'abonapp/fin_report.html', {
'logs': q '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 periodic_pay_id == 0:
if not request.user.has_perm('abonapp.add_periodicpayforid'): if not request.user.has_perm('abonapp.add_periodicpayforid'):
raise PermissionDenied raise PermissionDenied
periodic_pay_instance = models.PeriodicPayForId()
periodic_pay_instance = generic.PeriodicPayForId()
else: else:
if not request.user.has_perm('abonapp.change_periodicpayforid'): if not request.user.has_perm('abonapp.change_periodicpayforid'):
raise PermissionDenied 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': 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(): 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 = frm.save(commit=False)
inst.account = abon inst.account = abon
inst.save() 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('group_app.view_group', (Group, 'pk', 'gid'))
@permission_required('abonapp.delete_periodicpayforid') @permission_required('abonapp.delete_periodicpayforid')
def del_periodic_pay(request, gid: int, uname, periodic_pay_id): 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: if periodic_pay_instance.account.username != uname:
uname = periodic_pay_instance.account.username uname = periodic_pay_instance.account.username
periodic_pay_instance.delete() periodic_pay_instance.delete()
@ -1180,14 +1230,15 @@ class EditSibscriberMarkers(LoginAdminPermissionMixin, UpdateView):
http_method_names = ('get', 'post') http_method_names = ('get', 'post')
template_name = 'abonapp/modal_user_markers.html' template_name = 'abonapp/modal_user_markers.html'
form_class = forms.MarkersForm form_class = forms.MarkersForm
model = models.Abon
model = generic.Abon
slug_url_kwarg = 'uname' slug_url_kwarg = 'uname'
slug_field = 'username' slug_field = 'username'
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
try: try:
return super(EditSibscriberMarkers, self).dispatch(request, *args,
**kwargs)
return super(EditSibscriberMarkers, self).dispatch(
request, *args, **kwargs
)
except ValidationError as e: except ValidationError as e:
messages.error(request, e) messages.error(request, e)
return self.render_to_response(self.get_context_data()) return self.render_to_response(self.get_context_data())
@ -1204,8 +1255,10 @@ class EditSibscriberMarkers(LoginAdminPermissionMixin, UpdateView):
def form_valid(self, form): def form_valid(self, form):
v = super(EditSibscriberMarkers, self).form_valid(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 return v
@ -1213,7 +1266,7 @@ class EditSibscriberMarkers(LoginAdminPermissionMixin, UpdateView):
@only_admins @only_admins
@permission_required('abonapp.change_abon') @permission_required('abonapp.change_abon')
def user_session_free(request, gid: int, uname): 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: if abon.nas is None:
messages.error(request, _('gateway required')) messages.error(request, _('gateway required'))
return redirect('abonapp:abon_home', gid, uname) 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')) gateway_id = lib.safe_int(request.POST.get('gateway'))
if gateway_id: if gateway_id:
nas = get_object_or_404(NASModel, pk=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(): if abons.exists():
abons.update(nas=nas) abons.update(nas=nas)
messages.success( messages.success(
@ -1262,7 +1315,7 @@ def abons(request):
'tarif_id': abn.active_tariff().tariff.pk 'tarif_id': abn.active_tariff().tariff.pk
if abn.active_tariff() is not None else 0, if abn.active_tariff() is not None else 0,
'ip': abn.ip_address 'ip': abn.ip_address
} for abn in models.Abon.objects.iterator())
} for abn in generic.Abon.objects.iterator())
tarlist = ({ tarlist = ({
'id': trf.pk, 'id': trf.pk,
@ -1285,10 +1338,11 @@ def search_abon(request):
word = request.GET.get('s') word = request.GET.get('s')
if not word: if not word:
return None return None
results = models.Abon.objects.filter(fio__icontains=word)[:8]
results = generic.Abon.objects.filter(fio__icontains=word)[:8]
return list( 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): class DhcpLever(SecureApiView):
@ -1375,18 +1429,18 @@ class DublicatePay(SecureApiView):
return self._check_pay(request.GET) return self._check_pay(request.GET)
else: else:
return self._bad_ret(-101, 'ACT is not passed') return self._bad_ret(-101, 'ACT is not passed')
except models.Abon.DoesNotExist:
except generic.Abon.DoesNotExist:
return self._bad_ret(-40) return self._bad_ret(-40)
except DatabaseError: except DatabaseError:
return self._bad_ret(-90) return self._bad_ret(-90)
except models.AllTimePayLog.DoesNotExist:
except generic.AllTimePayLog.DoesNotExist:
return self._bad_ret(-10) return self._bad_ret(-10)
except AttributeError: except AttributeError:
return self._bad_ret(-101) return self._bad_ret(-101)
def _fetch_user_info(self, data: dict): def _fetch_user_info(self, data: dict):
pay_account = data.get('PAY_ACCOUNT') 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 fio = abon.fio
ballance = float(abon.ballance) ballance = float(abon.ballance)
return { return {
@ -1406,8 +1460,8 @@ class DublicatePay(SecureApiView):
pay_account = data.get('PAY_ACCOUNT') pay_account = data.get('PAY_ACCOUNT')
pay_id = data.get('PAY_ID') pay_id = data.get('PAY_ID')
pay_amount = lib.safe_float(data.get('PAY_AMOUNT')) 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: if pays.count() > 0:
return self._bad_ret(-100) return self._bad_ret(-100)
@ -1415,7 +1469,7 @@ class DublicatePay(SecureApiView):
comment='KonikaForward %.2f' % pay_amount) comment='KonikaForward %.2f' % pay_amount)
abon.save(update_fields=('ballance',)) abon.save(update_fields=('ballance',))
models.AllTimePayLog.objects.create(
generic.AllTimePayLog.objects.create(
pay_id=pay_id, pay_id=pay_id,
summ=pay_amount, summ=pay_amount,
abon=abon, abon=abon,
@ -1432,7 +1486,7 @@ class DublicatePay(SecureApiView):
def _check_pay(self, data: dict): def _check_pay(self, data: dict):
pay_id = data.get('PAY_ID') 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 { return {
'status_code': 11, 'status_code': 11,
'time_stamp': self.current_date, '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 import template
from django.db.models import Model from django.db.models import Model
from django.apps import apps from django.apps import apps
from abonapp.models import Abon
from abonapp.models.generic import Abon
from six import string_types, class_types from six import string_types, class_types
register = template.Library() register = template.Library()
@ -26,7 +26,10 @@ def can_login_by_location(request):
try: try:
remote_ip = ip_address(request.META.get('REMOTE_ADDR')) remote_ip = ip_address(request.META.get('REMOTE_ADDR'))
if remote_ip.version == 4: 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 return has_exist
except AddressValueError: except AddressValueError:
pass pass

13
agent/commands/dhcp.py

@ -1,10 +1,11 @@
from typing import Optional from typing import Optional
from django.core.exceptions import MultipleObjectsReturned from django.core.exceptions import MultipleObjectsReturned
from abonapp.models import Abon
from abonapp.models.generic import Abon
from devapp.models import Device, Port 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: try:
dev = Device.objects.get(mac_addr=switch_mac) dev = Device.objects.get(mac_addr=switch_mac)
mngr_class = dev.get_manager_klass() 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 'switch_mac': switch_mac
} }
except MultipleObjectsReturned as e: 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]: 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: if abon is None:
return "Subscriber with ip %s does not exist" % client_ip return "Subscriber with ip %s does not exist" % client_ip
else: else:

39
clientsideapp/views.py

@ -4,7 +4,7 @@ from django.contrib import messages
from django.db import transaction from django.db import transaction
from django.utils.translation import gettext_lazy as _, gettext 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 djing.lib.decorators import json_view
from tariff_app.models import Tariff from tariff_app.models import Tariff
from taskapp.models import Task from taskapp.models import Task
@ -14,7 +14,9 @@ from gw_app.nas_managers import NasFailedResult, NasNetworkError
@login_required @login_required
def home(request): 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', { return render(request, 'clientsideapp/index.html', {
'num_active_tasks': num_active_tasks 'num_active_tasks': num_active_tasks
}) })
@ -32,7 +34,9 @@ def pays(request):
def services(request): def services(request):
try: try:
abon = request.user 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() current_service = abon.active_tariff()
except Abon.DoesNotExist: except Abon.DoesNotExist:
all_tarifs = None all_tarifs = None
@ -50,14 +54,20 @@ def buy_service(request, srv_id):
try: try:
current_service = abon.active_tariff() current_service = abon.active_tariff()
if request.method == 'POST': 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() 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: else:
return render(request, 'clientsideapp/modal_service_buy.html', { return render(request, 'clientsideapp/modal_service_buy.html', {
'service': service, '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: except LogicError as e:
messages.error(request, e) messages.error(request, e)
@ -83,15 +93,20 @@ def debt_buy(request, d_id):
try: try:
sure = request.POST.get('sure') sure = request.POST.get('sure')
if sure != 'on': 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: if abon.ballance < debt.amount:
raise LogicError(_('Your account have not enough money')) raise LogicError(_('Your account have not enough money'))
amount = -debt.amount 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',)) abon.save(update_fields=('ballance',))
debt.set_ok() debt.set_ok()
debt.save(update_fields=('status', 'date_pay')) debt.save(update_fields=('status', 'date_pay'))

73
devapp/views.py

@ -1,7 +1,7 @@
import re import re
from ipaddress import ip_address from ipaddress import ip_address
from abonapp.models import Abon
from abonapp.models.generic import Abon
from accounts_app.models import UserProfile from accounts_app.models import UserProfile
from chatbot.models import ChatException from chatbot.models import ChatException
from devapp.base_intr import DeviceImplementationError from devapp.base_intr import DeviceImplementationError
@ -131,13 +131,19 @@ class DeviceUpdate(LoginAdminPermissionMixin, UpdateView):
mac_addr=self.request.POST.get('mac_addr')) mac_addr=self.request.POST.get('mac_addr'))
self.already_dev = already_dev self.already_dev = already_dev
if already_dev.group: 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: 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) return redirect('devapp:fix_device_group', already_dev.pk)
except Device.DoesNotExist: except Device.DoesNotExist:
pass pass
@ -161,8 +167,10 @@ class DeviceUpdate(LoginAdminPermissionMixin, UpdateView):
return super().dispatch(request, *args, **kwargs) return super().dispatch(request, *args, **kwargs)
def form_invalid(self, form): 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) return super().form_invalid(form)
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
@ -186,16 +194,23 @@ class DeviceCreateView(LoginAdminMixin, PermissionRequiredMixin, CreateView):
# check if that device is exist # check if that device is exist
try: try:
already_dev = self.model.objects.get( 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 self.already_dev = already_dev
if already_dev.group: 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: 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) return redirect('devapp:fix_device_group', already_dev.pk)
except Device.DoesNotExist: except Device.DoesNotExist:
pass pass
@ -575,10 +590,11 @@ def search_dev(request):
results = Device.objects.filter(qs).only('pk', 'ip_address', results = Device.objects.filter(qs).only('pk', 'ip_address',
'comment')[:16] 'comment')[:16]
results = tuple({ 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 return results
@ -595,11 +611,14 @@ def fix_device_group(request, device_id):
messages.success(request, _('Device fixed')) messages.success(request, _('Device fixed'))
return redirect('devapp:devs', ch_dev.group.pk) return redirect('devapp:devs', ch_dev.group.pk)
else: else:
messages.error(request,
_('Please attach group for device'))
messages.error(
request,
_('Please attach group for device')
)
else: else:
messages.error(request, _(
'Form is invalid, check fields and try again'))
messages.error(
request, _('Form is invalid, check fields and try again')
)
else: else:
frm = DeviceForm(instance=device) frm = DeviceForm(instance=device)
except ValueError: 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') 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>' % \ text = '<span class="glyphicon glyphicon-ok"></span> <span class="hidden-xs">%s</span>' % \
(_('Device with mac address %(mac)s does not exist') % { (_('Device with mac address %(mac)s does not exist') % {
'mac': mac})
'mac': mac
})
for srcmac, snmpnum in ports: for srcmac, snmpnum in ports:
# convert bytes mac address to str presentation mac address # convert bytes mac address to str presentation mac address
real_mac = ':'.join('%x' % ord(i) for i in srcmac) real_mac = ':'.join('%x' % ord(i) for i in srcmac)
@ -634,8 +654,7 @@ def fix_onu(request):
onu.snmp_extra = str(snmpnum) onu.snmp_extra = str(snmpnum)
onu.save(update_fields=('snmp_extra',)) onu.save(update_fields=('snmp_extra',))
status = 0 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 break
else: else:
text += '\n%s' % _('Parent device not found') 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.db.models import Q
from django.conf import settings 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.global_base_views import SecureApiView
from djing import JSONType from djing import JSONType
from djing.lib import safe_int from djing.lib import safe_int
@ -52,16 +52,24 @@ class LastCallsListView(BaseListView):
@login_required @login_required
@only_admins @only_admins
def to_abon(request, tel): 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() abon_count = abon.count()
if abon_count > 1: 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: elif abon_count == 0:
messages.error(request, _('User with the telephone number not found')) messages.error(request, _('User with the telephone number not found'))
return redirect('dialapp:home') return redirect('dialapp:home')
abon = abon[0] abon = abon[0]
if abon.group: 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: else:
return redirect('abonapp:group_list') 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 django.contrib.auth.backends import ModelBackend
from accounts_app.models import BaseAccount, UserProfile from accounts_app.models import BaseAccount, UserProfile
from abonapp.models import Abon
from abonapp.models.generic import Abon
class CustomAuthBackend(ModelBackend): class CustomAuthBackend(ModelBackend):
@ -39,7 +39,10 @@ class LocationAuthBackend(ModelBackend):
def authenticate(self, request, byip, **kwargs): def authenticate(self, request, byip, **kwargs):
try: try:
remote_ip = ip_address(request.META.get('REMOTE_ADDR')) 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: if user is None:
return return
if self.user_can_authenticate(user): if self.user_can_authenticate(user):

76
gw_app/tests.py

@ -1,6 +1,6 @@
from abc import ABCMeta from abc import ABCMeta
from abonapp.models import Abon
from abonapp.models.generic import Abon
from accounts_app.models import UserProfile from accounts_app.models import UserProfile
from django.conf import settings from django.conf import settings
from django.shortcuts import resolve_url from django.shortcuts import resolve_url
@ -18,7 +18,11 @@ class MyBaseTestCase(metaclass=ABCMeta):
:return: authorized response :return: authorized response
""" """
r = self.client.get(url) 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) self.client.force_login(self.adminuser)
r = self.client.get(url) r = self.client.get(url)
self.assertEqual(r.status_code, 200) self.assertEqual(r.status_code, 200)
@ -33,7 +37,10 @@ class MyBaseTestCase(metaclass=ABCMeta):
) )
a1.group = grp a1.group = grp
a1.save(update_fields=('group',)) 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.adminuser = my_admin
self.abon = a1 self.abon = a1
self.group = grp self.group = grp
@ -70,8 +77,12 @@ class NASModelTestCase(MyBaseTestCase, TestCase):
self.assertEqual(r.status_code, 302) self.assertEqual(r.status_code, 302)
msg = r.cookies.get('messages') msg = r.cookies.get('messages')
self.assertIn('New NAS has been created', msg.output()) 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 # test error ip_port big range
r = self.client.post(url, data={ r = self.client.post(url, data={
@ -82,10 +93,11 @@ class NASModelTestCase(MyBaseTestCase, TestCase):
'auth_passw': '_' 'auth_passw': '_'
}) })
self.assertEqual(r.status_code, 200) 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 # test get request
r = self.client.get(url) r = self.client.get(url)
@ -100,11 +112,13 @@ class NASModelTestCase(MyBaseTestCase, TestCase):
'auth_passw': '_v' 'auth_passw': '_v'
}) })
self.assertEqual(r.status_code, 200) 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 # test error duplicates default
r = self.client.post(url, data={ r = self.client.post(url, data={
@ -116,7 +130,10 @@ class NASModelTestCase(MyBaseTestCase, TestCase):
'default': True 'default': True
}) })
self.assertEqual(r.status_code, 200) 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 # test error duplicates ip_address
r = self.client.post(url, data={ r = self.client.post(url, data={
@ -127,11 +144,14 @@ class NASModelTestCase(MyBaseTestCase, TestCase):
'auth_passw': '_v' 'auth_passw': '_v'
}) })
self.assertEqual(r.status_code, 200) 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'),)) @override_settings(LANGUAGE_CODE='en', LANGUAGES=(('en', 'English'),))
def test_change(self): def test_change(self):
@ -153,8 +173,10 @@ class NASModelTestCase(MyBaseTestCase, TestCase):
self.assertRedirects(r, resolve_url('gw_app:edit', self.nas.pk)) self.assertRedirects(r, resolve_url('gw_app:edit', self.nas.pk))
msg = r.cookies.get('messages') msg = r.cookies.get('messages')
self.assertIn('Update successfully', msg.output()) 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'),)) @override_settings(LANGUAGE_CODE='en', LANGUAGES=(('en', 'English'),))
def test_delete(self): def test_delete(self):
@ -169,8 +191,10 @@ class NASModelTestCase(MyBaseTestCase, TestCase):
'nas_type': 'mktk' 'nas_type': 'mktk'
}) })
self.assertEqual(r.status_code, 302) 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) url = resolve_url('gw_app:del', o.pk)
# test get request # test get request
@ -191,7 +215,9 @@ class NASModelTestCase(MyBaseTestCase, TestCase):
# try to remove default nas # try to remove default nas
nas_id = self.nas.pk nas_id = self.nas.pk
r = self.client.post(resolve_url('gw_app:del', nas_id)) 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') msg = r.cookies.get('messages')
self.assertIn('You cannot remove default server', msg.output()) 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.utils import timezone
from django.db import transaction from django.db import transaction
from django.db.models import signals, Count 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.nas_managers import NasNetworkError, NasFailedResult
from gw_app.models import NASModel from gw_app.models import NASModel
from djing.lib import LogicError from djing.lib import LogicError

12
searchapp/views.py

@ -2,7 +2,7 @@ import re
from django.db.models import Q from django.db.models import Q
from django.shortcuts import render from django.shortcuts import render
from django.utils.html import escape from django.utils.html import escape
from abonapp.models import Abon
from abonapp.models.generic import Abon
from devapp.models import Device from devapp.models import Device
from djing import MAC_ADDR_REGEX from djing import MAC_ADDR_REGEX
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
@ -21,14 +21,18 @@ def home(request):
if s: if s:
abons = Abon.objects.filter( 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): if re.match(MAC_ADDR_REGEX, s):
devices = Device.objects.filter(mac_addr=s) devices = Device.objects.filter(mac_addr=s)
else: 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: else:
abons = () abons = ()

69
taskapp/models.py

@ -6,7 +6,7 @@ from django.conf import settings
from django.shortcuts import resolve_url from django.shortcuts import resolve_url
from django.utils import timezone from django.utils import timezone
from django.utils.translation import ugettext as _ 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 from .handle import handle as task_handle
TASK_PRIORITIES = ( TASK_PRIORITIES = (
@ -49,7 +49,10 @@ class ChangeLog(models.Model):
) )
act_type = models.CharField(max_length=1, choices=ACT_CHOICES) act_type = models.CharField(max_length=1, choices=ACT_CHOICES)
when = models.DateTimeField(auto_now_add=True) 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): def __str__(self):
return self.get_act_type_display() return self.get_act_type_display()
@ -60,18 +63,46 @@ def delta_add_days():
class Task(models.Model): 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: class Meta:
db_table = 'task' db_table = 'task'
@ -115,8 +146,14 @@ class Task(models.Model):
class ExtraComment(models.Model): class ExtraComment(models.Model):
text = models.TextField(_('Text of comment')) 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) date_create = models.DateTimeField(_('Time of create'), auto_now_add=True)
def __str__(self): 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 guardian.decorators import permission_required_or_403 as permission_required
from chatbot.models import MessageQueue from chatbot.models import MessageQueue
from abonapp.models import Abon
from abonapp.models.generic import Abon
from djing import httpresponse_to_referrer from djing import httpresponse_to_referrer
from djing.lib import safe_int, MultipleException, RuTimedelta from djing.lib import safe_int, MultipleException, RuTimedelta
from djing.lib.decorators import only_admins, json_view from djing.lib.decorators import only_admins, json_view
@ -38,9 +38,13 @@ class NewTasksView(ListView):
context_object_name = 'tasks' context_object_name = 'tasks'
def get_queryset(self): 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') @method_decorator(login_decs, name='dispatch')
@ -53,8 +57,11 @@ class FailedTasksView(NewTasksView):
context_object_name = 'tasks' context_object_name = 'tasks'
def get_queryset(self): 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') @method_decorator(login_decs, name='dispatch')
@ -63,8 +70,11 @@ class FinishedTaskListView(NewTasksView):
template_name = 'taskapp/tasklist_finish.html' template_name = 'taskapp/tasklist_finish.html'
def get_queryset(self): 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') @method_decorator(login_decs, name='dispatch')
@ -74,9 +84,11 @@ class OwnTaskListView(NewTasksView):
def get_queryset(self): def get_queryset(self):
# Attached and not finished tasks # 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') @method_decorator(login_decs, name='dispatch')
@ -86,8 +98,11 @@ class MyTaskListView(NewTasksView):
def get_queryset(self): def get_queryset(self):
# Tasks in which I participated # 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') @method_decorator(login_decs, name='dispatch')
@ -99,8 +114,11 @@ class AllTasksListView(ListView):
context_object_name = 'tasks' context_object_name = 'tasks'
def get_queryset(self): 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') @method_decorator(login_decs, name='dispatch')
@ -109,7 +127,9 @@ class EmptyTasksListView(NewTasksView):
template_name = 'taskapp/tasklist_empty.html' template_name = 'taskapp/tasklist_empty.html'
def get_queryset(self): 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 @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(): if request.user.is_superuser or request.user not in task.recipients.all():
task.delete() task.delete()
else: 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') return redirect('taskapp:home')
@ -196,7 +218,9 @@ class TaskUpdateView(UpdateView):
if task.out_date > now_date: if task.out_date > now_date:
time_diff = "%s: %s" % (_('time left'), RuTimedelta(task.out_date - now_date)) time_diff = "%s: %s" % (_('time left'), RuTimedelta(task.out_date - now_date))
else: 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: else:
time_diff = None time_diff = None
@ -217,7 +241,10 @@ class TaskUpdateView(UpdateView):
return resolve_url('taskapp:edit', task_id) return resolve_url('taskapp:edit', task_id)
def form_invalid(self, form): 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) return super(TaskUpdateView, self).form_invalid(form)

Loading…
Cancel
Save