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