diff --git a/abonapp/forms.py b/abonapp/forms.py index 38b4c4d..1188b5b 100644 --- a/abonapp/forms.py +++ b/abonapp/forms.py @@ -12,10 +12,10 @@ TELEPHONE_REGEXP = getattr(settings, 'TELEPHONE_REGEXP', r'^(\+[7,8,9,3]\d{10,11 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: - 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) @@ -65,7 +65,7 @@ class AbonForm(forms.ModelForm): class Meta: model = models.Abon - fields = ['username', 'telephone', 'fio', 'group', 'description', 'street', 'house', 'is_active', 'ip_address'] + fields = ('username', 'telephone', 'fio', 'group', 'description', 'street', 'house', 'is_active', 'ip_address') widgets = { 'fio': forms.TextInput(attrs={ 'placeholder': _('fio'), @@ -88,7 +88,7 @@ class AbonForm(forms.ModelForm): try: abon_raw_passw = models.AbonRawPassword.objects.get(account=acc) 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( account=acc, @@ -100,7 +100,7 @@ class AbonForm(forms.ModelForm): class PassportForm(forms.ModelForm): class Meta: model = models.PassportInfo - exclude = ['abon'] + exclude = ('abon',) widgets = { 'series': forms.TextInput(attrs={'required': '', 'pattern': '^\d{4}$'}), 'number': forms.TextInput(attrs={'required': '', 'pattern': '^\d{6}$'}), @@ -136,7 +136,7 @@ class AbonStreetForm(forms.ModelForm): class AdditionalTelephoneForm(forms.ModelForm): class Meta: model = models.AdditionalTelephone - exclude = ['abon'] + exclude = ('abon',) widgets = { 'telephone': forms.TextInput(attrs={ 'placeholder': _('telephone placeholder'), @@ -151,7 +151,7 @@ class AdditionalTelephoneForm(forms.ModelForm): class PeriodicPayForIdForm(forms.ModelForm): class Meta: model = models.PeriodicPayForId - exclude = ['account'] + exclude = ('account',) class ExportUsersForm(forms.Form): @@ -179,8 +179,8 @@ class ExportUsersForm(forms.Form): class MarkersForm(forms.ModelForm): class Meta: model = models.Abon - fields = ['markers'] + fields = ('markers',) def save(self, commit=True): instance = super(MarkersForm, self).save(commit=False) - return instance.save(update_fields=['markers']) + return instance.save(update_fields=('markers',)) diff --git a/abonapp/models.py b/abonapp/models.py index 59c8b33..e6349fc 100644 --- a/abonapp/models.py +++ b/abonapp/models.py @@ -34,7 +34,7 @@ class AbonLog(models.Model): permissions = ( ('can_view_abonlog', _('Can view subscriber logs')), ) - ordering = ['-date'] + ordering = ('-date',) def __str__(self): return self.comment @@ -68,7 +68,7 @@ class AbonTariff(models.Model): ) verbose_name = _('Abon service') verbose_name_plural = _('Abon services') - ordering = ['time_start'] + ordering = ('time_start',) class AbonStreet(models.Model): @@ -82,7 +82,7 @@ class AbonStreet(models.Model): db_table = 'abon_street' verbose_name = _('Street') verbose_name_plural = _('Streets') - ordering = ['name'] + ordering = ('name',) class ExtraFieldsModel(models.Model): @@ -185,7 +185,7 @@ class Abon(BaseAccount): # unique_together = ('device', 'dev_port') verbose_name = _('Abon') verbose_name_plural = _('Abons') - ordering = ['fio'] + ordering = ('fio',) def add_ballance(self, current_user, amount, comment): AbonLog.objects.create( @@ -273,7 +273,7 @@ class Abon(BaseAccount): # check if ip address already busy if self.ip_address is not None and Abon.objects.filter(ip_address=self.ip_address).exclude( pk=self.pk).count() > 0: - raise ValidationError({'ip_address': [gettext('Ip address already exist')]}) + raise ValidationError({'ip_address': (gettext('Ip address already exist'),)}) return super(Abon, self).clean() def sync_with_nas(self, created: bool) -> Optional[Exception]: @@ -292,8 +292,8 @@ class Abon(BaseAccount): class PassportInfo(models.Model): - series = models.CharField(_('Pasport serial'), max_length=4, validators=[validators.integer_validator]) - number = models.CharField(_('Pasport number'), max_length=6, validators=[validators.integer_validator]) + series = models.CharField(_('Pasport serial'), max_length=4, validators=(validators.integer_validator,)) + number = models.CharField(_('Pasport number'), max_length=6, validators=(validators.integer_validator,)) distributor = models.CharField(_('Distributor'), max_length=64) date_of_acceptance = models.DateField() abon = models.OneToOneField(Abon, on_delete=models.SET_NULL, blank=True, null=True) @@ -302,7 +302,7 @@ class PassportInfo(models.Model): db_table = 'passport_info' verbose_name = _('Passport Info') verbose_name_plural = _('Passport Info') - ordering = ['series'] + ordering = ('series',) def __str__(self): return "%s %s" % (self.series, self.number) @@ -366,7 +366,7 @@ class AllTimePayLog(models.Model): class Meta: db_table = 'all_time_pay_log' - ordering = ['-date_add'] + ordering = ('-date_add',) # log for all terminals @@ -381,7 +381,7 @@ class AllPayLog(models.Model): class Meta: db_table = 'all_pay_log' - ordering = ['-date_action'] + ordering = ('-date_action',) class AbonRawPassword(models.Model): @@ -401,7 +401,7 @@ class AdditionalTelephone(models.Model): max_length=16, verbose_name=_('Telephone'), # unique=True, - validators=[RegexValidator(TELEPHONE_REGEXP)] + validators=(RegexValidator(TELEPHONE_REGEXP),) ) owner_name = models.CharField(max_length=127) @@ -410,7 +410,7 @@ class AdditionalTelephone(models.Model): class Meta: db_table = 'additional_telephones' - ordering = ['owner_name'] + ordering = ('owner_name',) permissions = ( ('can_view_additionaltelephones', _('Can view additional telephones')), ) @@ -439,17 +439,17 @@ class PeriodicPayForId(models.Model): abon.add_ballance(author, -amount, comment=gettext('Charge for "%(service)s"') % { 'service': self.periodic_pay }) - abon.save(update_fields=['ballance']) + abon.save(update_fields=('ballance',)) self.last_pay = now self.next_pay = next_pay_date - self.save(update_fields=['last_pay', 'next_pay']) + self.save(update_fields=('last_pay', 'next_pay')) def __str__(self): return "%s %s" % (self.periodic_pay, self.next_pay) class Meta: db_table = 'periodic_pay_for_id' - ordering = ['last_pay'] + ordering = ('last_pay',) @receiver(post_delete, sender=Abon) diff --git a/abonapp/pay_systems.py b/abonapp/pay_systems.py index b09ecc1..90b025d 100644 --- a/abonapp/pay_systems.py +++ b/abonapp/pay_systems.py @@ -65,7 +65,7 @@ def allpay(request): return bad_ret(-100) abon.add_ballance(None, pay_amount, comment='AllPay %.2f' % pay_amount) - abon.save(update_fields=['ballance']) + abon.save(update_fields=('ballance',)) AllTimePayLog.objects.create( pay_id=pay_id, diff --git a/abonapp/tests.py b/abonapp/tests.py index d1cc940..4767c60 100644 --- a/abonapp/tests.py +++ b/abonapp/tests.py @@ -32,7 +32,7 @@ class AllPayTestCase(TestCase): ) a1.ballance = -13.12 a1.fio = 'Test Name' - a1.save(update_fields=['ballance', 'fio']) + a1.save(update_fields=('ballance', 'fio')) # Abon.objects.create_user( # telephone='+79788163841', # username='pay_account2', @@ -52,7 +52,7 @@ class AllPayTestCase(TestCase): } )) r = r.content.decode('utf-8') - self.assertXMLEqual(r, ''.join([ + self.assertXMLEqual(r, ''.join(( "", "-13.12", "Test Name", @@ -63,7 +63,7 @@ class AllPayTestCase(TestCase): "21", "%s" % current_date, "" - ])) + ))) def user_pay_pay(self): print('test_user_pay_pay') @@ -79,7 +79,7 @@ class AllPayTestCase(TestCase): 'SIGN': _make_sign(4, 'pay_account1', SERVICE_ID, '840ab457-e7d1-4494-8197-9570da035170') })) r = r.content.decode('utf-8') - xml = ''.join([ + xml = ''.join(( "", "840ab457-e7d1-4494-8197-9570da035170", "%s" % SERVICE_ID, @@ -87,7 +87,7 @@ class AllPayTestCase(TestCase): "22", "%s" % current_date, "" - ]) + )) self.test_pay_time = current_date self.assertXMLEqual(r, xml) @@ -103,7 +103,7 @@ class AllPayTestCase(TestCase): } )) r = r.content.decode('utf-8') - xml = ''.join([ + xml = ''.join(( "", "11", "%s" % current_date, @@ -115,7 +115,7 @@ class AllPayTestCase(TestCase): "%s" % self.test_pay_time, "" "" - ]) + )) self.assertXMLEqual(r, xml) def check_ballance(self): @@ -148,12 +148,12 @@ class AllPayTestCase(TestCase): } )) r = r.content.decode('utf-8') - self.assertXMLEqual(r, ''.join([ + self.assertXMLEqual(r, ''.join(( "", "-40", "%s" % current_date, "" - ])) + ))) def try_pay_double(self): print('try_pay_double') @@ -181,12 +181,12 @@ class AllPayTestCase(TestCase): 'SIGN': _make_sign(7, '', SERVICE_ID, uuid) })) r = r.content.decode('utf-8') - xml = ''.join([ + xml = ''.join(( "", "-10", "%s" % current_date, "" - ]) + )) self.assertXMLEqual(r, xml) def test_pays(self): diff --git a/abonapp/views.py b/abonapp/views.py index 4f58b5d..1cf6763 100644 --- a/abonapp/views.py +++ b/abonapp/views.py @@ -37,10 +37,10 @@ PAGINATION_ITEMS_PER_PAGE = getattr(settings, 'PAGINATION_ITEMS_PER_PAGE', 10) class BaseAbonListView(OrderingMixin, BaseListWithFiltering): paginate_by = PAGINATION_ITEMS_PER_PAGE - http_method_names = ['get'] + http_method_names = ('get',) -@method_decorator([login_required, mydefs.only_admins], name='dispatch') +@method_decorator((login_required, mydefs.only_admins), name='dispatch') class PeoplesListView(BaseAbonListView): context_object_name = 'peoples' template_name = 'abonapp/peoples.html' @@ -85,7 +85,7 @@ class PeoplesListView(BaseAbonListView): return context -@method_decorator([login_required, mydefs.only_admins], name='dispatch') +@method_decorator((login_required, mydefs.only_admins), name='dispatch') class GroupListView(BaseAbonListView): context_object_name = 'groups' template_name = 'abonapp/group_list.html' @@ -98,7 +98,7 @@ class GroupListView(BaseAbonListView): return queryset -@method_decorator([login_required, mydefs.only_admins], name='dispatch') +@method_decorator((login_required, mydefs.only_admins), name='dispatch') @method_decorator(permission_required('abonapp.add_abon'), name='dispatch') class AbonCreateView(CreateView): group = None @@ -154,7 +154,7 @@ class AbonCreateView(CreateView): return super(AbonCreateView, self).form_invalid(form) -@method_decorator([login_required, mydefs.only_admins], name='dispatch') +@method_decorator((login_required, mydefs.only_admins), name='dispatch') @method_decorator(permission_required('abonapp.delete_abon'), name='dispatch') class DelAbonDeleteView(DeleteView): model = models.Abon @@ -198,7 +198,7 @@ def abonamount(request, gid, uname): if abonuname == uname: amnt = mydefs.safe_float(request.POST.get('amount')) abon.add_ballance(request.user, amnt, comment=_('fill account through admin side')) - abon.save(update_fields=['ballance']) + abon.save(update_fields=('ballance',)) messages.success(request, _('Account filled successfully on %.2f') % amnt) return redirect('abonapp:abon_phistory', gid=gid, uname=uname) else: @@ -214,7 +214,7 @@ def abonamount(request, gid, uname): }, request=request) -@method_decorator([login_required, mydefs.only_admins], name='dispatch') +@method_decorator((login_required, mydefs.only_admins), name='dispatch') @method_decorator(permission_required('group_app.can_view_group', (Group, 'pk', 'gid')), name='dispatch') class DebtsListView(BaseAbonListView): context_object_name = 'invoices' @@ -232,7 +232,7 @@ class DebtsListView(BaseAbonListView): return context -@method_decorator([login_required, mydefs.only_admins], name='dispatch') +@method_decorator((login_required, mydefs.only_admins), name='dispatch') @method_decorator(permission_required('group_app.can_view_group', (Group, 'pk', 'gid')), name='dispatch') class PayHistoryListView(BaseAbonListView): context_object_name = 'pay_history' @@ -277,7 +277,7 @@ def abon_services(request, gid, uname): }) -@method_decorator([login_required, mydefs.only_admins], name='dispatch') +@method_decorator((login_required, mydefs.only_admins), name='dispatch') @method_decorator(permission_required('abonapp.change_abon'), name='post') class AbonHomeUpdateView(UpdateView): model = models.Abon @@ -473,7 +473,7 @@ def unsubscribe_service(request, gid, uname, abon_tariff_id): @method_decorator(permission_required('abonapp.can_view_abonlog'), name='dispatch') class LogListView(ListView): paginate_by = PAGINATION_ITEMS_PER_PAGE - http_method_names = ['get'] + http_method_names = ('get',) context_object_name = 'logs' template_name = 'abonapp/log.html' model = models.AbonLog @@ -483,7 +483,7 @@ class LogListView(ListView): @method_decorator(permission_required('abonapp.can_view_invoiceforpayment'), name='dispatch') class DebtorsListView(ListView): paginate_by = PAGINATION_ITEMS_PER_PAGE - http_method_names = ['get'] + http_method_names = ('get',) context_object_name = 'invoices' template_name = 'abonapp/debtors.html' queryset = models.InvoiceForPayment.objects.filter(status=True) @@ -493,7 +493,7 @@ class DebtorsListView(ListView): @method_decorator(permission_required('group_app.can_view_group', (Group, 'pk', 'gid')), name='dispatch') class TaskLogListView(ListView): paginate_by = PAGINATION_ITEMS_PER_PAGE - http_method_names = ['get'] + http_method_names = ('get',) context_object_name = 'tasks' template_name = 'abonapp/task_log.html' @@ -553,12 +553,12 @@ def chgroup_tariff(request, gid): if request.method == 'POST': tr = request.POST.getlist('tr') grp.tariff_set.clear() - grp.tariff_set.add(*[int(d) for d in tr]) + grp.tariff_set.add(*(int(d) for d in tr)) grp.save() messages.success(request, _('Successfully saved')) return redirect('abonapp:ch_group_tariff', gid) tariffs = Tariff.objects.all() - seleted_tariffs_id = [pk[0] for pk in grp.tariff_set.only('pk').values_list('pk')] + seleted_tariffs_id = (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, @@ -575,7 +575,7 @@ def dev(request, gid, uname): if request.method == 'POST': dev = Device.objects.get(pk=request.POST.get('dev')) abon.device = dev - abon.save(update_fields=['device']) + abon.save(update_fields=('device',)) messages.success(request, _('Device has successfully attached')) return redirect('abonapp:abon_home', gid=gid, uname=uname) else: @@ -600,7 +600,7 @@ def clear_dev(request, gid, uname): abon = models.Abon.objects.get(username=uname) abon.device = None abon.dev_port = None - abon.save(update_fields=['device', 'dev_port']) + abon.save(update_fields=('device', 'dev_port')) messages.success(request, _('Device has successfully unattached')) except models.Abon.DoesNotExist: messages.error(request, _('Abon does not exist')) @@ -624,7 +624,7 @@ def charts(request, gid, uname): abon = models.Abon.objects.get(username=uname) if abon.group is None: abon.group = Group.objects.get(pk=gid) - abon.save(update_fields=['group']) + abon.save(update_fields=('group',)) charts_data = StatElem.objects.chart( abon.username, @@ -692,12 +692,11 @@ def make_extra_field(request, gid, uname): @login_required @permission_required('abonapp.change_extra_fields_model') def extra_field_change(request, gid, uname): - extras = [(int(x), y) for x, y in zip(request.POST.getlist('ed'), request.POST.getlist('ex'))] try: - for ex in extras: - extra_field = models.ExtraFieldsModel.objects.get(pk=ex[0]) - extra_field.data = ex[1] - extra_field.save(update_fields=['data']) + for ed, ex in zip(request.POST.getlist('ed'), request.POST.getlist('ex')): + extra_field = models.ExtraFieldsModel.objects.get(pk=ed) + extra_field.data = ex + extra_field.save(update_fields=('data',)) messages.success(request, _("Extra fields has been saved")) except models.ExtraFieldsModel.DoesNotExist: messages.error(request, _('One or more extra fields has not been saved')) @@ -763,7 +762,7 @@ def abon_ping(request): } -@method_decorator([login_required, mydefs.only_admins], name='dispatch') +@method_decorator((login_required, mydefs.only_admins,), name='dispatch') class DialsListView(BaseAbonListView): context_object_name = 'logs' template_name = 'abonapp/dial_log.html' @@ -838,9 +837,9 @@ def save_user_dev_port(request, gid, uname): abon.dev_port = port if abon.is_dynamic_ip != is_dynamic_ip: abon.is_dynamic_ip = is_dynamic_ip - abon.save(update_fields=['dev_port', 'is_dynamic_ip']) + abon.save(update_fields=('dev_port', 'is_dynamic_ip')) else: - abon.save(update_fields=['dev_port']) + abon.save(update_fields=('dev_port',)) messages.success(request, _('User port has been saved')) except DevPort.DoesNotExist: messages.error(request, _('Selected port does not exist')) @@ -875,9 +874,7 @@ def street_add(request, gid): def street_edit(request, gid): try: if request.method == 'POST': - streets_pairs = [(int(sid), sname) for sid, sname in - zip(request.POST.getlist('sid'), request.POST.getlist('sname'))] - for sid, sname in streets_pairs: + for sid, sname in zip(request.POST.getlist('sid'), request.POST.getlist('sname')): street = models.AbonStreet.objects.get(pk=sid) street.name = sname street.save() @@ -993,7 +990,7 @@ def abon_export(request, gid): response = HttpResponse(content_type='text/csv') response['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) @@ -1019,7 +1016,7 @@ def abon_export(request, gid): def reset_ip(request, gid, uname): abon = get_object_or_404(models.Abon, username=uname) abon.ip_address = None - abon.save(update_fields=['ip_address']) + abon.save(update_fields=('ip_address',)) return { 'status': 0, 'dat': "" @@ -1087,9 +1084,9 @@ def del_periodic_pay(request, gid, uname, periodic_pay_id): return redirect('abonapp:abon_services', gid, uname) -@method_decorator([login_required, mydefs.only_admins], name='dispatch') +@method_decorator((login_required, mydefs.only_admins,), name='dispatch') class EditSibscriberMarkers(UpdateView): - http_method_names = ['get', 'post'] + http_method_names = ('get', 'post') template_name = 'abonapp/modal_user_markers.html' form_class = forms.MarkersForm @@ -1121,18 +1118,18 @@ class EditSibscriberMarkers(UpdateView): @mydefs.only_admins @json_view def abons(request): - ablist = [{ + ablist = ({ 'id': abn.pk, 'tarif_id': abn.active_tariff().tariff.pk if abn.active_tariff() is not None else 0, 'ip': abn.ip_address.int_ip(), 'is_active': abn.is_active - } for abn in models.Abon.objects.all()] + } for abn in models.Abon.objects.all()) - tarlist = [{ + tarlist = ({ 'id': trf.pk, 'speedIn': trf.speedIn, 'speedOut': trf.speedOut - } for trf in Tariff.objects.all()] + } for trf in Tariff.objects.all()) data = { 'subscribers': ablist, @@ -1150,7 +1147,7 @@ def search_abon(request): if not word: return None results = models.Abon.objects.filter(fio__icontains=word)[:8] - results = [{'id': usr.pk, 'text': "%s: %s" % (usr.username, usr.fio)} for usr in results] + results = ({'id': usr.pk, 'text': "%s: %s" % (usr.username, usr.fio)} for usr in results) return results @@ -1158,7 +1155,7 @@ class DhcpLever(SecureApiView): # # Api view for dhcp event # - http_method_names = ['get'] + http_method_names = ('get',) @method_decorator(json_view) def get(self, request, *args, **kwargs): diff --git a/accounts_app/forms.py b/accounts_app/forms.py index 36d122e..77f3b10 100644 --- a/accounts_app/forms.py +++ b/accounts_app/forms.py @@ -14,7 +14,7 @@ class MyUserObjectPermissionsForm(UserObjectPermissionsForm): Should be called *after* form is validated. """ perms = set(self.cleaned_data[self.get_obj_perms_field_name()]) - model_perms = set([c[0] for c in self.get_obj_perms_field_choices()]) + model_perms = set((c[0] for c in self.get_obj_perms_field_choices())) init_perms = set(self.get_obj_perms_field_initial()) to_remove = (model_perms - perms) & init_perms @@ -28,4 +28,4 @@ class MyUserObjectPermissionsForm(UserObjectPermissionsForm): class AvatarChangeForm(forms.ModelForm): class Meta: model = UserProfile - fields = ['avatar'] + fields = ('avatar',) diff --git a/accounts_app/models.py b/accounts_app/models.py index 596fefb..2e12793 100644 --- a/accounts_app/models.py +++ b/accounts_app/models.py @@ -50,7 +50,7 @@ class BaseAccount(AbstractBaseUser, PermissionsMixin): _('profile username'), max_length=127, unique=True, - validators=[RegexValidator(r'^\w{1,127}$')] + validators=(RegexValidator(r'^\w{1,127}$'),) ) fio = models.CharField(_('fio'), max_length=256) birth_day = models.DateField(_('birth day'), auto_now_add=True) @@ -60,11 +60,11 @@ class BaseAccount(AbstractBaseUser, PermissionsMixin): max_length=16, verbose_name=_('Telephone'), blank=True, - validators=[RegexValidator(TELEPHONE_REGEXP)] + validators=(RegexValidator(TELEPHONE_REGEXP),) ) USERNAME_FIELD = 'username' - REQUIRED_FIELDS = ['telephone'] + REQUIRED_FIELDS = ('telephone',) def get_full_name(self): return self.fio if self.fio else self.username @@ -86,12 +86,12 @@ class BaseAccount(AbstractBaseUser, PermissionsMixin): class Meta: db_table = 'base_accounts' - ordering = ['username'] + ordering = ('username',) class UserProfileManager(MyUserManager): def get_profiles_by_group(self, group_id): - return self.filter(responsibility_groups__id__in=[group_id], is_admin=True, is_active=True) + return self.filter(responsibility_groups__id__in=(group_id,), is_admin=True, is_active=True) class UserProfile(BaseAccount): @@ -116,7 +116,7 @@ class UserProfile(BaseAccount): ) verbose_name = _('Staff account profile') verbose_name_plural = _('Staff account profiles') - ordering = ['fio'] + ordering = ('fio',) def _thumbnail_avatar(self): if self.avatar and os.path.isfile(self.avatar.path): diff --git a/accounts_app/views.py b/accounts_app/views.py index 996862c..bf9a317 100644 --- a/accounts_app/views.py +++ b/accounts_app/views.py @@ -21,7 +21,7 @@ from guardian.shortcuts import get_objects_for_user, assign_perm, remove_perm class BaseAccListView(ListView): - http_method_names = ['get'] + http_method_names = ('get',) paginate_by = getattr(settings, 'PAGINATION_ITEMS_PER_PAGE', 10) @@ -87,7 +87,7 @@ def profile_show(request, uid=0): }) -@method_decorator([login_required, mydefs.only_admins], name='dispatch') +@method_decorator((login_required, mydefs.only_admins), name='dispatch') class AvatarUpdateView(UpdateView): form_class = AvatarChangeForm template_name = 'accounts/settings/ch_info.html' @@ -180,7 +180,7 @@ def delete_profile(request, uid): return redirect('acc_app:accounts_list') -@method_decorator([login_required, mydefs.only_admins], name='dispatch') +@method_decorator((login_required, mydefs.only_admins), name='dispatch') class AccountsListView(BaseAccListView): template_name = 'accounts/acc_list.html' context_object_name = 'users' @@ -270,7 +270,7 @@ def set_abon_groups_permission(request, uid): picked_groups = picked_groups.values_list('pk', flat=True) if request.method == 'POST': - checked_groups = [int(ag) for ag in request.POST.getlist('grp', default=0)] + checked_groups = tuple(int(ag) for ag in request.POST.getlist('grp', default=0)) for grp in Group.objects.all(): if grp.pk in checked_groups and grp.pk not in picked_groups: assign_perm('groupapp.can_view_group', userprofile, obj=grp) @@ -287,9 +287,9 @@ def set_abon_groups_permission(request, uid): }) -@method_decorator([login_required, mydefs.only_admins], name='dispatch') +@method_decorator((login_required, mydefs.only_admins), name='dispatch') class ManageResponsibilityGroups(ListView): - http_method_names = ['get', 'post'] + http_method_names = ('get', 'post') template_name = 'accounts/manage_responsibility_groups.html' context_object_name = 'groups' queryset = Group.objects.only('pk', 'title') @@ -306,14 +306,14 @@ class ManageResponsibilityGroups(ListView): context = super(ManageResponsibilityGroups, self).get_context_data(**kwargs) context['uid'] = self.kwargs.get('uid') context['userprofile'] = self.object - context['existing_groups'] = [g.get('pk') for g in self.object.responsibility_groups.only('pk').values('pk')] + context['existing_groups'] = (g.get('pk') for g in self.object.responsibility_groups.only('pk').values('pk')) return context def post(self, request, *args, **kwargs): - checked_groups = [int(ag) for ag in request.POST.getlist('grp', default=0)] + checked_groups = (int(ag) for ag in request.POST.getlist('grp', default=0)) profile = self.object profile.responsibility_groups.clear() - profile.responsibility_groups.add(*[int(g) for g in checked_groups]) + profile.responsibility_groups.add(*(int(g) for g in checked_groups)) profile.save() messages.success(request, _('Responsibilities has been updated')) return HttpResponseRedirect(self.get_success_url()) diff --git a/agent/commands/dhcp.py b/agent/commands/dhcp.py index 31e89b7..65c517c 100644 --- a/agent/commands/dhcp.py +++ b/agent/commands/dhcp.py @@ -24,7 +24,7 @@ def dhcp_commit(client_ip: str, client_mac: str, switch_mac: str, switch_port: i return if abon.ip_address != client_ip: abon.ip_address = client_ip - abon.save(update_fields=['ip_address']) + abon.save(update_fields=('ip_address',)) abon.sync_with_nas(created=False) except Abon.DoesNotExist: return "User with device with mac '%s' does not exist" % switch_mac @@ -36,14 +36,14 @@ 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) -> Optional[str]: try: abon = Abon.objects.get(ip_address=client_ip) abon.ip_address = None - abon.save(update_fields=['ip_address']) + abon.save(update_fields=('ip_address',)) abon.sync_with_nas(created=False) except Abon.DoesNotExist: return "Subscriber with ip %s does not exist" % client_ip diff --git a/agent/mod_mikrotik.py b/agent/mod_mikrotik.py index 55abc9f..fbeb7e0 100644 --- a/agent/mod_mikrotik.py +++ b/agent/mod_mikrotik.py @@ -4,7 +4,7 @@ import socket import binascii from abc import ABCMeta from hashlib import md5 -from typing import List, Iterable, Optional, Tuple +from typing import Iterable, Optional, Tuple from .core import BaseTransmitter, NasFailedResult, NasNetworkError from mydefs import singleton from .structs import TariffStruct, AbonStruct, IpStruct, VectorAbon, VectorTariff @@ -38,18 +38,18 @@ class ApiRos: if self.is_login: return chal = None - for repl, attrs in self.talk_iter(["/login"]): + for repl, attrs in self.talk_iter(("/login",)): chal = binascii.unhexlify(attrs['=ret']) md = md5() md.update(b'\x00') md.update(bytes(pwd, 'utf-8')) md.update(chal) - for _ in self.talk_iter(["/login", "=name=" + username, - "=response=00" + binascii.hexlify(md.digest()).decode('utf-8')]): + for _ in self.talk_iter(("/login", "=name=" + username, + "=response=00" + binascii.hexlify(md.digest()).decode('utf-8'))): pass self.is_login = True - def talk_iter(self, words): + def talk_iter(self, words: Iterable): if self.write_sentence(words) == 0: return while 1: @@ -68,7 +68,7 @@ class ApiRos: if reply == '!done': return - def write_sentence(self, words): + def write_sentence(self, words: Iterable): ret = 0 for w in words: self.write_word(w) @@ -99,18 +99,18 @@ class ApiRos: def write_len(self, l): if l < 0x80: - self.write_bytes(bytes([l])) + self.write_bytes(bytes((l,))) elif l < 0x4000: l |= 0x8000 - self.write_bytes(bytes([(l >> 8) & 0xff, l & 0xff])) + self.write_bytes(bytes(((l >> 8) & 0xff, l & 0xff))) elif l < 0x200000: l |= 0xC00000 - self.write_bytes(bytes([(l >> 16) & 0xff, (l >> 8) & 0xff, l & 0xff])) + self.write_bytes(bytes(((l >> 16) & 0xff, (l >> 8) & 0xff, l & 0xff))) elif l < 0x10000000: l |= 0xE0000000 - self.write_bytes(bytes([(l >> 24) & 0xff, (l >> 16) & 0xff, (l >> 8) & 0xff, l & 0xff])) + self.write_bytes(bytes(((l >> 24) & 0xff, (l >> 16) & 0xff, (l >> 8) & 0xff, l & 0xff))) else: - self.write_bytes(bytes([0xf0, (l >> 24) & 0xff, (l >> 16) & 0xff, (l >> 8) & 0xff, l & 0xff])) + self.write_bytes(bytes((0xf0, (l >> 24) & 0xff, (l >> 16) & 0xff, (l >> 8) & 0xff, l & 0xff))) def read_len(self): c = self.read_bytes(1)[0] @@ -182,8 +182,8 @@ class TransmitterManager(BaseTransmitter, metaclass=ABCMeta): if hasattr(self, 's'): self.s.close() - def _exec_cmd(self, cmd: list) -> list: - if not isinstance(cmd, list): + def _exec_cmd(self, cmd: Iterable) -> list: + if not isinstance(cmd, (list, tuple)): raise TypeError result_iter = self.ar.talk_iter(cmd) res = [] @@ -193,8 +193,8 @@ class TransmitterManager(BaseTransmitter, metaclass=ABCMeta): res.append(rt[1]) return res - def _exec_cmd_iter(self, cmd: list) -> Iterable: - if not isinstance(cmd, list): + def _exec_cmd_iter(self, cmd: Iterable) -> Iterable: + if not isinstance(cmd, (list, tuple)): raise TypeError result_iter = self.ar.talk_iter(cmd) for rt in result_iter: @@ -243,7 +243,7 @@ class TransmitterManager(BaseTransmitter, metaclass=ABCMeta): class QueueManager(TransmitterManager, metaclass=ABCMeta): # Find queue by name def find(self, name: str) -> AbonStruct: - ret = self._exec_cmd(['/queue/simple/print', '?name=%s' % name]) + ret = self._exec_cmd(('/queue/simple/print', '?name=%s' % name)) if len(ret) > 1: return self._build_shape_obj(ret[0]) @@ -252,26 +252,26 @@ class QueueManager(TransmitterManager, metaclass=ABCMeta): raise TypeError if user.tariff is None or not isinstance(user.tariff, TariffStruct): return - return self._exec_cmd(['/queue/simple/add', + return self._exec_cmd(('/queue/simple/add', '=name=uid%d' % user.uid, # FIXME: тут в разных микротиках или =target-addresses или =target - '=target=%s' % str(user.ip), + '=target=%s' % user.ip, '=max-limit=%.3fM/%.3fM' % (user.tariff.speedOut, user.tariff.speedIn), '=queue=MikroBILL_SFQ/MikroBILL_SFQ', '=burst-time=1/1' - ]) + )) def remove(self, user: AbonStruct): if not isinstance(user, AbonStruct): raise TypeError q = self.find('uid%d' % user.uid) if q is not None: - return self._exec_cmd(['/queue/simple/remove', '=.id=' + getattr(q, 'queue_id', '')]) + return self._exec_cmd(('/queue/simple/remove', '=.id=' + getattr(q, 'queue_id', ''),)) - def remove_range(self, q_ids: List[str]): + def remove_range(self, q_ids: Iterable[str]): try: # q_ids = [q.queue_id for q in q_ids] - return self._exec_cmd(['/queue/simple/remove', '=numbers=' + ','.join(q_ids)]) + return self._exec_cmd(('/queue/simple/remove', '=numbers=' + ','.join(q_ids))) except TypeError as e: print(e) @@ -285,17 +285,17 @@ class QueueManager(TransmitterManager, metaclass=ABCMeta): return self.add(user) else: mk_id = getattr(queue, 'queue_id', '') - return self._exec_cmd(['/queue/simple/set', '=.id=' + mk_id, + return self._exec_cmd(('/queue/simple/set', '=.id=' + mk_id, '=name=uid%d' % user.uid, '=max-limit=%.3fM/%.3fM' % (user.tariff.speedOut, user.tariff.speedIn), # FIXME: тут в разных микротиках или =target-addresses или =target - '=target=%s' % str(user.ip), + '=target=%s' % user.ip, '=queue=MikroBILL_SFQ/MikroBILL_SFQ', '=burst-time=1/1' - ]) + )) def read_queue_iter(self): - for code, dat in self._exec_cmd_iter(['/queue/simple/print', '=detail']): + for code, dat in self._exec_cmd_iter(('/queue/simple/print', '=detail')): if code == '!done': return sobj = self._build_shape_obj(dat) @@ -303,7 +303,7 @@ class QueueManager(TransmitterManager, metaclass=ABCMeta): yield sobj def read_mikroids_iter(self): - queues = self._exec_cmd_iter(['/queue/simple/print', '=detail']) + queues = self._exec_cmd_iter(('/queue/simple/print', '=detail')) for queue in queues: if queue[0] == '!done': return @@ -317,7 +317,7 @@ class QueueManager(TransmitterManager, metaclass=ABCMeta): self.add(user) return self.disable(user) else: - return self._exec_cmd(['/queue/simple/disable', '=.id=*' + getattr(q, 'queue_id', '')]) + return self._exec_cmd(('/queue/simple/disable', '=.id=*' + getattr(q, 'queue_id', ''))) def enable(self, user: AbonStruct): if not isinstance(user, AbonStruct): @@ -327,7 +327,7 @@ class QueueManager(TransmitterManager, metaclass=ABCMeta): self.add(user) self.enable(user) else: - return self._exec_cmd(['/queue/simple/enable', '=.id=*' + getattr(q, 'queue_id', '')]) + return self._exec_cmd(('/queue/simple/enable', '=.id=*' + getattr(q, 'queue_id', ''))) class IpAddressListObj(IpStruct): @@ -340,21 +340,21 @@ class IpAddressListManager(TransmitterManager, metaclass=ABCMeta): def add(self, list_name: str, ip: IpStruct): if not isinstance(ip, IpStruct): raise TypeError - commands = [ + commands = ( '/ip/firewall/address-list/add', '=list=%s' % list_name, - '=address=%s' % str(ip) - ] + '=address=%s' % ip + ) return self._exec_cmd(commands) def remove(self, mk_id): - return self._exec_cmd([ + return self._exec_cmd(( '/ip/firewall/address-list/remove', '=.id=*' + str(mk_id).replace('*', '') - ]) + )) def remove_range(self, items: Iterable[IpAddressListObj]): - ids = [ip.mk_id for ip in items if isinstance(ip, IpAddressListObj)] + ids = tuple(ip.mk_id for ip in items if isinstance(ip, IpAddressListObj)) if len(ids) > 0: return self._exec_cmd([ '/ip/firewall/address-list/remove', @@ -364,18 +364,18 @@ class IpAddressListManager(TransmitterManager, metaclass=ABCMeta): def find(self, ip: IpStruct, list_name: str): if not isinstance(ip, IpStruct): raise TypeError - return self._exec_cmd([ + return self._exec_cmd(( '/ip/firewall/address-list/print', 'where', '?list=%s' % list_name, - '?address=%s' % str(ip) - ]) + '?address=%s' % ip + )) def read_ips_iter(self, list_name: str): - ips = self._exec_cmd_iter([ + ips = self._exec_cmd_iter(( '/ip/firewall/address-list/print', 'where', '?list=%s' % list_name, '?dynamic=no' - ]) + )) for code, dat in ips: if dat != {}: yield IpAddressListObj(dat['=address'], dat['=.id']) @@ -384,19 +384,19 @@ class IpAddressListManager(TransmitterManager, metaclass=ABCMeta): r = IpAddressListManager.find(self, user.ip, LIST_USERS_ALLOWED) if len(r) > 1: mk_id = r[0]['=.id'] - return self._exec_cmd([ + return self._exec_cmd(( '/ip/firewall/address-list/disable', '=.id=' + str(mk_id), - ]) + )) def enable(self, user): r = IpAddressListManager.find(self, user.ip, LIST_USERS_ALLOWED) if len(r) > 1: mk_id = r[0]['=.id'] - return self._exec_cmd([ + return self._exec_cmd(( '/ip/firewall/address-list/enable', '=.id=' + str(mk_id), - ]) + )) class MikrotikTransmitter(QueueManager, IpAddressListManager): @@ -405,10 +405,11 @@ class MikrotikTransmitter(QueueManager, IpAddressListManager): self.add_user(usr) def remove_user_range(self, users: VectorAbon): - queue_ids = [usr.queue_id for usr in users if usr is not None] + if not isinstance(users, (tuple, list)): + raise ValueError('*users* is used twice, generator does not fit') + queue_ids = (usr.queue_id for usr in users if usr is not None) QueueManager.remove_range(self, queue_ids) - ips = [user.ip for user in users if isinstance(user, AbonStruct)] - for ip in ips: + for ip in (user.ip for user in users if isinstance(user, AbonStruct)): ip_list_entity = IpAddressListManager.find(self, ip, LIST_USERS_ALLOWED) if ip_list_entity is not None and len(ip_list_entity) > 1: IpAddressListManager.remove(self, ip_list_entity[0]['=.id']) @@ -416,8 +417,10 @@ class MikrotikTransmitter(QueueManager, IpAddressListManager): def add_user(self, user: AbonStruct, *args): if not isinstance(user.ip, IpStruct): raise TypeError - if user.tariff is None or not isinstance(user.tariff, TariffStruct): + if user.tariff is None: return + if not isinstance(user.tariff, TariffStruct): + raise TypeError QueueManager.add(self, user) IpAddressListManager.add(self, LIST_USERS_ALLOWED, user.ip) # remove user from denied user list @@ -468,17 +471,17 @@ class MikrotikTransmitter(QueueManager, IpAddressListManager): QueueManager.update(self, user) def ping(self, host, count=10) -> Optional[Tuple[int, int]]: - r = self._exec_cmd([ + r = self._exec_cmd(( '/ip/arp/print', '?address=%s' % host - ]) + )) if r == [{}]: return interface = r[0]['=interface'] - r = self._exec_cmd([ + r = self._exec_cmd(( '/ping', '=address=%s' % host, '=arp-ping=yes', '=interval=100ms', '=count=%d' % count, '=interface=%s' % interface - ]) + )) received, sent = int(r[-2:][0]['=received']), int(r[-2:][0]['=sent']) return received, sent @@ -504,13 +507,12 @@ class MikrotikTransmitter(QueueManager, IpAddressListManager): def read_users(self) -> Iterable[AbonStruct]: # shapes is ShapeItem allowed_ips = set(IpAddressListManager.read_ips_iter(self, LIST_USERS_ALLOWED)) - queues = set(q for q in QueueManager.read_queue_iter(self) if q.ip in allowed_ips) + queues = tuple(q for q in QueueManager.read_queue_iter(self) if q.ip in allowed_ips) - ips_from_queues = set([q.ip for q in queues]) - allowed_ips = set(allowed_ips) + ips_from_queues = set(q.ip for q in queues) - # удаляем ip адреса которые есть в firewall/address-list и нет соответствующих в queues - diff = list(allowed_ips - ips_from_queues) + # delete ip addresses that are in firewall/address-list and there are no corresponding in queues + diff = tuple(allowed_ips - ips_from_queues) if len(diff) > 0: IpAddressListManager.remove_range(self, diff) diff --git a/agent/monitoring_agent.py b/agent/monitoring_agent.py index 585da13..254121e 100755 --- a/agent/monitoring_agent.py +++ b/agent/monitoring_agent.py @@ -2,6 +2,8 @@ import sys import re from hashlib import sha256 +from typing import Iterable, Union, AnyStr + import requests API_AUTH_SECRET = 'your api key' @@ -19,31 +21,31 @@ def calc_hash(data): return sha256(result_data).hexdigest() -def check_sign(get_list, sign): +def check_sign(get_list: Iterable, sign: str): hashed = '_'.join(get_list) my_sign = calc_hash(hashed) return sign == my_sign -def validate(regexp, string): +def validate(regexp: Union[bytes, str, re.__Regex], string: AnyStr): if not re.match(regexp, string): raise ValueError return string -def validate_status(text): +def validate_status(text: str): if text not in ('UP', 'DOWN', 'UNREACHABLE'): raise ValueError return text -def send_request(mac, status, sign): +def send_request(mac, stat, sign_hash): r = requests.get( "%(domain)s/dev/on_device_event/" % {'domain': SERVER_DOMAIN}, params={ 'mac': mac, - 'status': status, - 'sign': sign + 'status': stat, + 'sign': sign_hash }) if r.status_code == 200: print(r.json()) diff --git a/agent/netflow/netflow_handler.py b/agent/netflow/netflow_handler.py index c495a17..e3f84bd 100755 --- a/agent/netflow/netflow_handler.py +++ b/agent/netflow/netflow_handler.py @@ -4,6 +4,7 @@ import sys import os from importlib import import_module + if __name__ == '__main__': if len(sys.argv) < 2: print("File name of netflow required") diff --git a/agent/utils.py b/agent/utils.py index b1b715b..88f41f5 100644 --- a/agent/utils.py +++ b/agent/utils.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- import socket import struct diff --git a/chatbot/models.py b/chatbot/models.py index 6a21947..263117f 100644 --- a/chatbot/models.py +++ b/chatbot/models.py @@ -1,4 +1,4 @@ -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext_lazy as _ from django.db import models from django.conf import settings @@ -20,7 +20,7 @@ class TelegramBot(models.Model): db_table = 'chat_telegram_bot' verbose_name = _('Telegram bot') verbose_name_plural = _('Telegram bots') - ordering = ['chat_id'] + ordering = ('chat_id',) class MessageHistory(models.Model): @@ -35,7 +35,7 @@ class MessageHistory(models.Model): db_table = 'chat_message_history' verbose_name = _('Message history') verbose_name_plural = _('Message histories') - ordering = ['-date_sent'] + ordering = ('-date_sent',) class MessageQueueManager(models.Manager): @@ -70,4 +70,4 @@ class MessageQueue(models.Model): db_table = 'chat_message_queue' verbose_name = _('Message queue') verbose_name_plural = _('Message queue') - ordering = ['target_employee__username'] + ordering = ('target_employee__username',) diff --git a/chatbot/telebot.py b/chatbot/telebot.py index 4e399aa..5f348a5 100755 --- a/chatbot/telebot.py +++ b/chatbot/telebot.py @@ -74,7 +74,7 @@ class DjingTelebot(helper.ChatHandler): text = msg['text'].lower() # выполняем комманды если они есть - if text in list(self.cmds.keys()): + if text in self.cmds.keys(): self.cmds[text]() elif self._dialog_fn is not None: if not callable(self._dialog_fn): @@ -123,7 +123,7 @@ class DjingTelebot(helper.ChatHandler): return try: socket.inet_aton(ip) - ret = os.popen('`which ping` -c 10 ' + ip).read() + ret = os.popen('`which ping` -c 10 %s' % ip).read() self._sent_reply(ret) except socket.error: self._question(_("It's not like ip address, try again"), self.ping) diff --git a/clientsideapp/views.py b/clientsideapp/views.py index 164273a..5faa7db 100644 --- a/clientsideapp/views.py +++ b/clientsideapp/views.py @@ -90,9 +90,9 @@ def debt_buy(request, d_id): 'username': abon.get_full_name(), 'amount': amount }) - abon.save(update_fields=['ballance']) + abon.save(update_fields=('ballance',)) debt.set_ok() - debt.save(update_fields=['status', 'date_pay']) + debt.save(update_fields=('status', 'date_pay')) return redirect('client_side:debts') except LogicError as e: messages.error(request, e) diff --git a/devapp/base_intr.py b/devapp/base_intr.py index 7fd96c9..5725e66 100644 --- a/devapp/base_intr.py +++ b/devapp/base_intr.py @@ -71,7 +71,7 @@ class BasePort(object, metaclass=ABCMeta): pass def mac(self) -> str: - return ':'.join(['%x' % ord(i) for i in self._mac]) + return ':'.join('%x' % ord(i) for i in self._mac) class SNMPBaseWorker(object, metaclass=ABCMeta): diff --git a/devapp/dev_types.py b/devapp/dev_types.py index 5fbce93..3bc369c 100644 --- a/devapp/dev_types.py +++ b/devapp/dev_types.py @@ -203,7 +203,7 @@ class OnuDevice(DevBase, SNMPBaseWorker): status = self.get_item('.1.3.6.1.4.1.3320.101.10.1.1.26.%d' % num) signal = self.get_item('.1.3.6.1.4.1.3320.101.10.5.1.5.%d' % num) distance = self.get_item('.1.3.6.1.4.1.3320.101.10.1.1.27.%d' % num) - mac = ':'.join(['%x' % ord(i) for i in self.get_item('.1.3.6.1.4.1.3320.101.10.1.1.3.%d' % num)]) + mac = ':'.join('%x' % ord(i) for i in self.get_item('.1.3.6.1.4.1.3320.101.10.1.1.3.%d' % num)) # uptime = self.get_item('.1.3.6.1.2.1.2.2.1.9.%d' % num) return { 'status': status, diff --git a/devapp/models.py b/devapp/models.py index 3737835..f268a02 100644 --- a/devapp/models.py +++ b/devapp/models.py @@ -54,7 +54,7 @@ class Device(models.Model): ) verbose_name = _('Device') verbose_name_plural = _('Devices') - ordering = ['id'] + ordering = ('id',) def get_abons(self): pass @@ -63,7 +63,7 @@ class Device(models.Model): return self.status def get_manager_klass(self): - klasses = [kl for kl in self.DEVICE_TYPES if kl[0] == self.devtype] + klasses = tuple(kl for kl in self.DEVICE_TYPES if kl[0] == self.devtype) if len(klasses) > 0: res = klasses[0][1] if issubclass(res, DevBase): @@ -94,7 +94,7 @@ class Device(models.Model): param = 'del' else: param = 'update' - run([filepath, param, newmac, code]) + run((filepath, param, newmac, code)) class Port(models.Model): @@ -113,4 +113,4 @@ class Port(models.Model): ) verbose_name = _('Port') verbose_name_plural = _('Ports') - ordering = ['num'] + ordering = ('num',) diff --git a/devapp/views.py b/devapp/views.py index b2f85f4..2e77fc1 100644 --- a/devapp/views.py +++ b/devapp/views.py @@ -30,11 +30,11 @@ from .forms import DeviceForm, PortForm class BaseDeviceListView(global_base_views.BaseListWithFiltering): - http_method_names = ['get'] + http_method_names = ('get',) paginate_by = getattr(settings, 'PAGINATION_ITEMS_PER_PAGE', 10) -@method_decorator([login_required, only_admins], name='dispatch') +@method_decorator((login_required, only_admins), name='dispatch') class DevicesListView(global_base_views.OrderingMixin, BaseDeviceListView): context_object_name = 'devices' template_name = 'devapp/devices.html' @@ -61,7 +61,7 @@ class DevicesListView(global_base_views.OrderingMixin, BaseDeviceListView): return response -@method_decorator([login_required, only_admins], name='dispatch') +@method_decorator((login_required, only_admins), name='dispatch') class DevicesWithoutGroupsListView(global_base_views.OrderingMixin, BaseDeviceListView): context_object_name = 'devices' template_name = 'devapp/devices_null_group.html' @@ -181,10 +181,10 @@ def manage_ports(request, device_id): }) -@method_decorator([login_required, only_admins], name='dispatch') +@method_decorator((login_required, only_admins), name='dispatch') class ShowSubscriberOnPort(global_base_views.RedirectWhenErrorMixin, DetailView): template_name = 'devapp/manage_ports/modal_show_subscriber_on_port.html' - http_method_names = ['get'] + http_method_names = ('get',) def get_object(self, queryset=None): dev_id = self.kwargs.get('device_id') @@ -241,7 +241,7 @@ def add_ports(request, device_id): try: port = Port.objects.get(num=port_num, device=dev) port.descr = port_text - port.save(update_fields=['descr']) + port.save(update_fields=('descr',)) except Port.DoesNotExist: Port.objects.create( num=port_num, @@ -250,12 +250,12 @@ def add_ports(request, device_id): ) db_ports = Port.objects.filter(device=dev) - db_ports = [TempPort(p.num, p.descr, None, True, p.pk) for p in db_ports] + db_ports = (TempPort(p.num, p.descr, None, True, p.pk) for p in db_ports) manager = dev.get_manager_object() ports = manager.get_ports() if ports is not None: - ports = [TempPort(p.num, p.nm, p.st, False) for p in ports] + ports = (TempPort(p.num, p.nm, p.st, False) for p in ports) res_ports = set(db_ports + ports) else: res_ports = db_ports @@ -417,7 +417,7 @@ def toggle_port(request, device_id, portid, status=0): return redirect('devapp:view', dev.group.pk if dev.group is not None else 0, device_id) -@method_decorator([login_required, only_admins], name='dispatch') +@method_decorator((login_required, only_admins), name='dispatch') class GroupsListView(BaseDeviceListView): context_object_name = 'groups' template_name = 'devapp/group_list.html' @@ -431,16 +431,18 @@ class GroupsListView(BaseDeviceListView): @login_required +@json_view def search_dev(request): word = request.GET.get('s') if word is None or word == '': - results = [{'id': 0, 'text': ''}] + results = ({'id': 0, 'text': ''},) else: results = Device.objects.filter( Q(comment__icontains=word) | Q(ip_address=word) ).only('pk', 'ip_address', 'comment')[:16] - results = [{'id': dev.pk, 'text': "%s: %s" % (dev.ip_address or '', dev.comment)} for dev in results] - return JsonResponse(results, json_dumps_params={'ensure_ascii': False}, safe=False) + results = ({'id': dev.pk, 'text': "%s: %s" % (dev.ip_address or '', dev.comment)} for dev in results) + #return JsonResponse(results, json_dumps_params={'ensure_ascii': False}, safe=False) + return results @login_required @@ -470,6 +472,7 @@ def fix_device_group(request, device_id): @login_required +@json_view def fix_onu(request): mac = request.GET.get('cmd_param') status = 1 @@ -484,10 +487,10 @@ def fix_onu(request): (_('Device with mac address %(mac)s does not exist') % {'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]) + real_mac = ':'.join('%x' % ord(i) for i in srcmac) if mac == real_mac: onu.snmp_item_num = snmpnum - onu.save(update_fields=['snmp_item_num']) + onu.save(update_fields=('snmp_item_num',)) status = 0 text = ' ' % _('Fixed') break @@ -495,10 +498,10 @@ def fix_onu(request): text = text + '\n%s' % _('Parent device not found') except Device.DoesNotExist: pass - return JsonResponse({ + return { 'status': status, 'dat': text - }) + } @login_required @@ -519,7 +522,7 @@ class OnDeviceMonitoringEvent(global_base_views.SecureApiView): # # Api view for monitoring devices # - http_method_names = ['get'] + http_method_names = ('get',) @method_decorator(json_view) def get(self, request): @@ -550,7 +553,7 @@ class OnDeviceMonitoringEvent(global_base_views.SecureApiView): device_down.status = 'und' notify_text = 'Device %(device_name)s getting undefined status code' - device_down.save(update_fields=['status']) + device_down.save(update_fields=('status',)) if not device_down.is_noticeable: return {'text': 'Notification for %s is unnecessary' % device_down.ip_address or device_down.comment} @@ -582,7 +585,7 @@ class OnDeviceMonitoringEvent(global_base_views.SecureApiView): class NagiosObjectsConfView(global_base_views.AuthenticatedOrHashAuthView): - http_method_names = ['get'] + http_method_names = ('get',) def get(self, request, *args, **kwargs): from transliterate import translit @@ -620,7 +623,7 @@ class NagiosObjectsConfView(global_base_views.AuthenticatedOrHashAuthView): def templ(host_name: str, host_addr: str, mac: Optional[str], parent_host_name: Optional[str]): if not host_addr: return - r = [ + r = ( "define host{", "\tuse generic-switch", "\thost_name %s" % host_name, @@ -628,14 +631,14 @@ class NagiosObjectsConfView(global_base_views.AuthenticatedOrHashAuthView): "\tparents %s" % parent_host_name if parent_host_name is not None else '', "\t_mac_addr %s" % mac if mac is not None else '', "}\n" - ] + ) return '\n'.join(i for i in r if i) @staticmethod def templ_onu(host_name: str, host_addr: str, mac: Optional[str], snmp_item: int): if not host_addr: return - r = [ + r = ( "define host{", "\tuse device-onu", "\thost_name %s" % host_name, @@ -643,18 +646,18 @@ class NagiosObjectsConfView(global_base_views.AuthenticatedOrHashAuthView): "\t_snmp_item %d" % snmp_item if snmp_item is not None else '', "\t_mac_addr %s" % mac if mac is not None else '', "}\n" - ] + ) return '\n'.join(i for i in r if i) class DevicesGetListView(global_base_views.SecureApiView): - http_method_names = ['get'] + http_method_names = ('get',) @method_decorator(json_view) def get(self, request, *args, **kwargs): from netaddr import EUI device_type = request.GET.get('type') - dev_types = [dt[0] for dt in Device.DEVICE_TYPES] + dev_types = tuple(dt[0] for dt in Device.DEVICE_TYPES) if device_type not in dev_types: devs = Device.objects.all() else: @@ -663,4 +666,4 @@ class DevicesGetListView(global_base_views.SecureApiView): for r in res: if isinstance(r['mac_addr'], EUI): r['mac_addr'] = int(r['mac_addr']) - return list(res) + return tuple(res) diff --git a/dialing_app/models.py b/dialing_app/models.py index 17fa39f..ad549c6 100644 --- a/dialing_app/models.py +++ b/dialing_app/models.py @@ -69,7 +69,7 @@ class AsteriskCDR(models.Model): class Meta: db_table = 'cdr' managed = False - ordering = ['-calldate'] + ordering = ('-calldate',) class SMSModel(models.Model): @@ -85,7 +85,7 @@ class SMSModel(models.Model): ) verbose_name = _('SMS') verbose_name_plural = _('SMS') - ordering = ['-when'] + ordering = ('-when',) def __str__(self): return self.text @@ -110,7 +110,7 @@ class SMSOut(models.Model): ) verbose_name = _('Out SMS') verbose_name_plural = _('Out SMS') - ordering = ['-when'] + ordering = ('-when',) def __str__(self): return self.text diff --git a/dialing_app/views.py b/dialing_app/views.py index cb369a6..ce5c203 100644 --- a/dialing_app/views.py +++ b/dialing_app/views.py @@ -22,11 +22,11 @@ from .forms import SMSOutForm class BaseListView(ListView): - http_method_names = ['get'] + http_method_names = ('get',) paginate_by = getattr(settings, 'PAGINATION_ITEMS_PER_PAGE', 10) -@method_decorator([login_required, permission_required('dialing_app.change_asteriskcdr')], name='dispatch') +@method_decorator((login_required, permission_required('dialing_app.change_asteriskcdr')), name='dispatch') class LastCallsListView(BaseListView): template_name = 'index.html' context_object_name = 'logs' @@ -62,7 +62,7 @@ def to_abon(request, tel): return redirect('abonapp:group_list') -@method_decorator([login_required, only_admins], name='dispatch') +@method_decorator((login_required, only_admins), name='dispatch') class VoiceMailRequestsListView(BaseListView): template_name = 'vmail.html' context_object_name = 'vmessages' @@ -83,7 +83,7 @@ class VoiceMailReportsListView(VoiceMailRequestsListView): return context -@method_decorator([login_required, only_admins], name='dispatch') +@method_decorator((login_required, only_admins), name='dispatch') class DialsFilterListView(BaseListView): context_object_name = 'logs' template_name = 'index.html' @@ -118,7 +118,7 @@ class DialsFilterListView(BaseListView): return cdr -@method_decorator([login_required, permission_required('dialing_app.can_view_sms')], name='dispatch') +@method_decorator((login_required, permission_required('dialing_app.can_view_sms')), name='dispatch') class InboxSMSListView(BaseListView): template_name = 'inbox_sms.html' context_object_name = 'sms_messages' @@ -160,7 +160,7 @@ class SmsManager(SecureApiView): # # Api view for management sms from dongle # - http_method_names = ['get'] + http_method_names = ('get',) @staticmethod def bad_cmd(**kwargs) -> JSONType: diff --git a/group_app/models.py b/group_app/models.py index f6cedbb..c915f0f 100644 --- a/group_app/models.py +++ b/group_app/models.py @@ -18,7 +18,7 @@ class Group(models.Model): ) verbose_name = _('Group') verbose_name_plural = _('Groups') - ordering = ['title'] + ordering = ('title',) def __str__(self): return self.title diff --git a/group_app/views.py b/group_app/views.py index 7a2d7d8..022135a 100644 --- a/group_app/views.py +++ b/group_app/views.py @@ -11,7 +11,7 @@ from . import forms @method_decorator(login_required, name='dispatch') class GroupListView(ListView): - http_method_names = ['get'] + http_method_names = ('get',) paginate_by = getattr(settings, 'PAGINATION_ITEMS_PER_PAGE', 10) template_name = 'group_app/group_list.html' model = models.Group @@ -20,7 +20,7 @@ class GroupListView(ListView): @method_decorator(login_required, name='dispatch') class EditGroupView(UpdateView): - http_method_names = ['get', 'post'] + http_method_names = ('get', 'post') template_name = 'group_app/edit_group.html' form_class = forms.GroupForm model = models.Group @@ -38,7 +38,7 @@ class EditGroupView(UpdateView): @method_decorator(login_required, name='dispatch') class AddGroupView(CreateView): - http_method_names = ['get', 'post'] + http_method_names = ('get', 'post') template_name = 'group_app/add_group.html' form_class = forms.GroupForm success_url = reverse_lazy('group_app:group_list') diff --git a/mapapp/models.py b/mapapp/models.py index 6be2314..67ce32a 100644 --- a/mapapp/models.py +++ b/mapapp/models.py @@ -14,7 +14,7 @@ class Dot(models.Model): db_table = 'dots' verbose_name = _('Map point') verbose_name_plural = _('Map points') - ordering = ['title'] + ordering = ('title',) permissions = ( ('can_view', _('Can view')), ) diff --git a/mapapp/views.py b/mapapp/views.py index e9c38d3..f996f42 100644 --- a/mapapp/views.py +++ b/mapapp/views.py @@ -20,7 +20,7 @@ from guardian.decorators import permission_required class BaseListView(ListView): - http_method_names = ['get'] + http_method_names = ('get',) paginate_by = getattr(settings, 'PAGINATION_ITEMS_PER_PAGE', 10) diff --git a/messaging/utils.py b/messaging/utils.py index 9544a4d..8bf7fca 100644 --- a/messaging/utils.py +++ b/messaging/utils.py @@ -88,11 +88,11 @@ def clean_number(n): def encode_str(s): """Returns the hexadecimal representation of ``s``""" - return ''.join(["%02x" % ord(n) for n in s]) + return ''.join("%02x" % ord(n) for n in s) def encode_bytes(b): - return ''.join(["%02x" % n for n in b]) + return ''.join("%02x" % n for n in b) def pack_8bits_to_7bits(message, udh=None): diff --git a/msg_app/models.py b/msg_app/models.py index b17413c..a0becae 100644 --- a/msg_app/models.py +++ b/msg_app/models.py @@ -48,7 +48,7 @@ class Message(models.Model): if ms.status == code: return False ms.status = code - ms.save(update_fields=['status']) + ms.save(update_fields=('status',)) return True except MessageStatus.DoesNotExist: return False @@ -64,7 +64,7 @@ class Message(models.Model): class Meta: db_table = 'messages' - ordering = ['-sent_at'] + ordering = ('-sent_at',) verbose_name = _("Message") verbose_name_plural = _("Messages") permissions = ( @@ -105,9 +105,9 @@ def id_to_userprofile(acc): class ConversationManager(models.Manager): def create_conversation(self, author, other_participants, title=None): - other_participants = [id_to_userprofile(acc) for acc in other_participants] + other_participants = tuple(id_to_userprofile(acc) for acc in other_participants) if not title: - usernames = [acc.username for acc in other_participants] + usernames = tuple(acc.username for acc in other_participants) if not usernames: title = _('No name') else: @@ -130,7 +130,7 @@ class ConversationManager(models.Manager): return 0 def fetch(self, account): - conversations = self.filter(models.Q(author=account) | models.Q(participants__in=[account])).annotate( + conversations = self.filter(models.Q(author=account) | models.Q(participants__in=(account,))).annotate( msg_count=models.Count('message', distinct=True) ) return conversations @@ -194,7 +194,7 @@ class Conversation(models.Model): if not isinstance(cm, ConversationMembership): raise TypeError('cm must be instance of msg_app.ConversationMembership') cm.status = status - cm.save(update_fields=['status']) + cm.save(update_fields=('status',)) return cm def make_participant_status_admin(self, user): @@ -243,4 +243,4 @@ class Conversation(models.Model): permissions = ( ('can_view_conversation', _('Can view conversation')), ) - ordering = ['title'] + ordering = ('title',) diff --git a/mydefs.py b/mydefs.py index a70d3c9..d885fa0 100644 --- a/mydefs.py +++ b/mydefs.py @@ -167,7 +167,7 @@ def require_ssl(view): class MultipleException(Exception): def __init__(self, err_list): - if not isinstance(err_list, list): + if not isinstance(err_list, (list, tuple)): raise TypeError self.err_list = err_list diff --git a/requirements.txt b/requirements.txt index 0083cb2..0dd7879 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ +urllib3 Django==1.11 Pillow telepot diff --git a/statistics/models.py b/statistics/models.py index 349915c..700d16a 100644 --- a/statistics/models.py +++ b/statistics/models.py @@ -9,8 +9,8 @@ from .fields import UnixDateTimeField def get_dates(): tables = connection.introspection.table_names() - tables = [t.replace('flowstat_', '') for t in tables if t.startswith('flowstat_')] - return [datetime.strptime(t, '%d%m%Y').date() for t in tables] + tables = (t.replace('flowstat_', '') for t in tables if t.startswith('flowstat_')) + return tuple(datetime.strptime(t, '%d%m%Y').date() for t in tables) class StatManager(models.Manager): @@ -22,21 +22,21 @@ class StatManager(models.Manager): chunk_size = len(lst) // chunk_count if chunk_size == 0: chunk_size = 1 - return [lst[i:i + chunk_size] for i in range(0, len(lst), chunk_size)] + return tuple(lst[i:i + chunk_size] for i in range(0, len(lst), chunk_size)) def avarage(elements): return sum(elements) / len(elements) try: charts_data = self.filter(uname=username) - charts_times = [cd.cur_time.timestamp() * 1000 for cd in charts_data] - charts_octets = [cd.octets for cd in charts_data] + charts_times = tuple(cd.cur_time.timestamp() * 1000 for cd in charts_data) + charts_octets = tuple(cd.octets for cd in charts_data) if len(charts_octets) > 0 and len(charts_octets) == len(charts_times): charts_octets = split_list(charts_octets, count_of_parts) - charts_octets = [byte_to_mbit(avarage(c)) for c in charts_octets] + charts_octets = (byte_to_mbit(avarage(c)) for c in charts_octets) charts_times = split_list(charts_times, count_of_parts) - charts_times = [avarage(t) for t in charts_times] + charts_times = (avarage(t) for t in charts_times) charts_data = zip(charts_times, charts_octets) charts_data = ["{x: new Date(%d), y: %.2f}" % (cd[0], cd[1]) for cd in charts_data] @@ -127,4 +127,4 @@ class StatCache(models.Model): class Meta: db_table = 'flowcache' - ordering = ['-last_time'] + ordering = ('-last_time',) diff --git a/tariff_app/models.py b/tariff_app/models.py index 7beb1d3..3cb82cb 100644 --- a/tariff_app/models.py +++ b/tariff_app/models.py @@ -11,7 +11,7 @@ from jsonfield import JSONField class TariffManager(models.Manager): def get_tariffs_by_group(self, group_id): - return self.filter(groups__id__in=[group_id]) + return self.filter(groups__id__in=(group_id,)) class Tariff(models.Model): @@ -51,7 +51,7 @@ class Tariff(models.Model): class Meta: db_table = 'tariffs' - ordering = ['title'] + ordering = ('title',) verbose_name = _('Service') verbose_name_plural = _('Services') @@ -104,7 +104,7 @@ class PeriodicPay(models.Model): ) verbose_name = _('Periodic pay') verbose_name_plural = _('Periodic pays') - ordering = ['-id'] + ordering = ('-id',) @receiver(models.signals.pre_delete, sender=PeriodicPay) diff --git a/tariff_app/views.py b/tariff_app/views.py index 1e51fee..9dbdaaa 100644 --- a/tariff_app/views.py +++ b/tariff_app/views.py @@ -17,11 +17,11 @@ from . import forms class BaseServiceListView(ListView): - http_method_names = ['get'] + http_method_names = ('get',) paginate_by = getattr(settings, 'PAGINATION_ITEMS_PER_PAGE', 10) -@method_decorator([login_required, mydefs.only_admins], name='dispatch') +@method_decorator((login_required, mydefs.only_admins), name='dispatch') class TariffsListView(BaseServiceListView, OrderingMixin): """ Show Services(Tariffs) list diff --git a/taskapp/models.py b/taskapp/models.py index 0209ab9..0dfcacf 100644 --- a/taskapp/models.py +++ b/taskapp/models.py @@ -88,7 +88,7 @@ class Task(models.Model): act_type='f', who=current_user ) - self.save(update_fields=['state', 'out_date']) + self.save(update_fields=('state', 'out_date')) def do_fail(self, current_user): self.state = 'C' # Crashed @@ -97,7 +97,7 @@ class Task(models.Model): act_type='b', who=current_user ) - self.save(update_fields=['state']) + self.save(update_fields=('state',)) def send_notification(self): if self.abon: @@ -132,4 +132,4 @@ class ExtraComment(models.Model): ) verbose_name = _('Extra comment') verbose_name_plural = _('Extra comments') - ordering = ['-date_create'] + ordering = ('-date_create',) diff --git a/taskapp/views.py b/taskapp/views.py index 202237a..970bb01 100644 --- a/taskapp/views.py +++ b/taskapp/views.py @@ -24,11 +24,11 @@ from .forms import TaskFrm, ExtraCommentForm class BaseTaskListView(ListView): - http_method_names = ['get'] + http_method_names = ('get',) paginate_by = getattr(settings, 'PAGINATION_ITEMS_PER_PAGE', 10) -@method_decorator([login_required, only_admins], name='dispatch') +@method_decorator((login_required, only_admins), name='dispatch') class NewTasksView(BaseTaskListView): """ Show new tasks @@ -81,7 +81,7 @@ class MyTaskListView(NewTasksView): .select_related('abon', 'abon__street', 'abon__group', 'author') -@method_decorator([login_required, permission_required('taskapp.can_viewall')], name='dispatch') +@method_decorator((login_required, permission_required('taskapp.can_viewall')), name='dispatch') class AllTasksListView(BaseTaskListView): template_name = 'taskapp/tasklist_all.html' context_object_name = 'tasks' @@ -110,9 +110,9 @@ def task_delete(request, task_id): return redirect('taskapp:home') -@method_decorator([login_required, only_admins], name='dispatch') +@method_decorator((login_required, only_admins), name='dispatch') class TaskUpdateView(UpdateView): - http_method_names = ['get', 'post'] + http_method_names = ('get', 'post') template_name = 'taskapp/add_edit_task.html' form_class = TaskFrm context_object_name = 'task' @@ -150,7 +150,7 @@ class TaskUpdateView(UpdateView): self.object = form.save() if self.object.author is None: self.object.author = self.request.user - self.object.save(update_fields=['author']) + self.object.save(update_fields=('author',)) task_id = safe_int(self.kwargs.get('task_id', 0)) if task_id == 0: log_text = _('Task has successfully created') @@ -234,7 +234,7 @@ def task_failed(request, task_id): def remind(request, task_id): try: task = get_object_or_404(Task, id=task_id) - task.save(update_fields=['state']) + task.save(update_fields=('state',)) task.send_notification() except MultipleException as errs: for err in errs.err_list: @@ -261,7 +261,7 @@ def check_news(request): return HttpResponse(dumps(r)) -@method_decorator([login_required, only_admins], name='dispatch') +@method_decorator((login_required, only_admins), name='dispatch') @method_decorator(permission_required('taskapp.add_extracomment'), name='dispatch') class NewCommentView(CreateView): form_class = ExtraCommentForm @@ -280,12 +280,12 @@ class NewCommentView(CreateView): return FormMixin.form_valid(self, form) -@method_decorator([login_required, only_admins], name='dispatch') +@method_decorator((login_required, only_admins), name='dispatch') @method_decorator(permission_required('taskapp.delete_extracomment'), name='dispatch') class DeleteCommentView(DeleteView): model = ExtraComment pk_url_kwarg = 'comment_id' - http_method_names = ['get', 'post'] + http_method_names = ('get', 'post') template_name = 'taskapp/comments/extracomment_confirm_delete.html' def get_context_data(self, **kwargs):