Browse Source

Переехали на python3! Ура!

devel
Dmitry 9 years ago
parent
commit
ac1b7f8a2d
  1. 1
      .gitignore
  2. 2
      abonapp/admin.py
  3. 12
      abonapp/forms.py
  4. 3
      abonapp/migrations/0001_initial.py
  5. 1
      abonapp/migrations/0002_auto_20161206_2135.py
  6. 1
      abonapp/migrations/0003_abongroup_profiles.py
  7. 1
      abonapp/migrations/0004_auto_20161220_0102.py
  8. 7
      abonapp/migrations/0005_auto_20161226_0054.py
  9. 36
      abonapp/models.py
  10. 10
      abonapp/tests.py
  11. 2
      abonapp/urls.py
  12. 2
      abonapp/urls_abon.py
  13. 100
      abonapp/views.py
  14. 2
      accounts_app/admin.py
  15. 2
      accounts_app/forms.py
  16. 5
      accounts_app/migrations/0001_initial.py
  17. 1
      accounts_app/migrations/0002_userprofile_email.py
  18. 6
      accounts_app/migrations/0003_auto_20161206_2135.py
  19. 4
      accounts_app/models.py
  20. 2
      accounts_app/urls.py
  21. 16
      accounts_app/views.py
  22. 6
      agent/__init__.py
  23. 12
      agent/core.py
  24. 90
      agent/mod_mikrotik.py
  25. 4
      agent/netflow/to_mysql.py
  26. 10
      agent/structs.py
  27. 2
      chatbot/admin.py
  28. 1
      chatbot/migrations/0001_initial.py
  29. 8
      chatbot/models.py
  30. 35
      chatbot/telebot.py
  31. 2
      clientsideapp/models.py
  32. 2
      clientsideapp/urls.py
  33. 12
      clientsideapp/views.py
  34. 2
      devapp/admin.py
  35. 2
      devapp/apps.py
  36. 11
      devapp/base_intr.py
  37. 10
      devapp/dev_types.py
  38. 2
      devapp/forms.py
  39. 9
      devapp/migrations/0001_initial.py
  40. 1
      devapp/migrations/0002_auto_20160909_1018.py
  41. 12
      devapp/models.py
  42. 12
      devapp/tests.py
  43. 2
      devapp/urls.py
  44. 16
      devapp/views.py
  45. 4
      djing/urls.py
  46. 2
      djing/utils/load_from_nodeny.py
  47. 4
      djing/utils/push_snmp_passw.py
  48. 2
      djing/utils/save_dot_from_nodeny.py
  49. 4
      djing/utils/save_from_nodeny.py
  50. 2
      gmap/apps.py
  51. 23
      gmap/migrations/0001_initial.py
  52. 70
      gmap/models.py
  53. 26
      gmap/utils.py
  54. 4
      gmap/views.py
  55. 2
      ip_pool/admin.py
  56. 2
      ip_pool/apps.py
  57. 8
      ip_pool/forms.py
  58. 3
      ip_pool/migrations/0001_initial.py
  59. 6
      ip_pool/models.py
  60. 2
      ip_pool/urls.py
  61. 8
      ip_pool/views.py
  62. 2
      manage.py
  63. 33
      mydefs.py
  64. 2
      photo_app/admin.py
  65. 5
      photo_app/migrations/0001_initial.py
  66. 6
      photo_app/models.py
  67. 2
      privatemessage/admin.py
  68. 2
      privatemessage/context_processors.py
  69. 1
      privatemessage/migrations/0001_initial.py
  70. 4
      privatemessage/models.py
  71. 2
      privatemessage/tests.py
  72. 2
      privatemessage/urls.py
  73. 10
      privatemessage/views.py
  74. 1
      requirements.txt
  75. 2
      searchapp/apps.py
  76. 2
      searchapp/models.py
  77. 2
      searchapp/urls.py
  78. 2
      statistics/admin.py
  79. 5
      statistics/migrations/0001_initial.py
  80. 2
      statistics/models.py
  81. 2
      statistics/urls.py
  82. 2
      tariff_app/admin.py
  83. 6
      tariff_app/base_intr.py
  84. 8
      tariff_app/custom_tariffs.py
  85. 2
      tariff_app/forms.py
  86. 10
      tariff_app/migrations/0001_initial.py
  87. 1
      tariff_app/migrations/0002_tariff_descr.py
  88. 10
      tariff_app/models.py
  89. 2
      tariff_app/urls.py
  90. 6
      tariff_app/views.py
  91. 2
      taskapp/admin.py
  92. 4
      taskapp/forms.py
  93. 52
      taskapp/handle.py
  94. 3
      taskapp/migrations/0001_initial.py
  95. 3
      taskapp/migrations/0002_auto_20161006_0027.py
  96. 1
      taskapp/migrations/0003_auto_20161130_1815.py
  97. 3
      taskapp/migrations/0004_auto_20161202_1230.py
  98. 1
      taskapp/migrations/0005_auto_20161206_0013.py
  99. 5
      taskapp/migrations/0006_auto_20161206_2135.py
  100. 1
      taskapp/migrations/0007_auto_20161206_2303.py

1
.gitignore

@ -9,3 +9,4 @@ djing/settings.py
gmap/fixtures gmap/fixtures
*.sqlite3 *.sqlite3
*.json *.json
*.bak

2
abonapp/admin.py

@ -1,6 +1,6 @@
from django.contrib import admin from django.contrib import admin
import models
from . import models
admin.site.register(models.AbonGroup) admin.site.register(models.AbonGroup)

12
abonapp/forms.py

@ -2,24 +2,24 @@
from django import forms from django import forms
from django.core.validators import RegexValidator from django.core.validators import RegexValidator
import models
from . import models
from mydefs import ip_addr_regex from mydefs import ip_addr_regex
class AbonForm(forms.Form): class AbonForm(forms.Form):
username = forms.CharField(max_length=127, required=False, widget=forms.TextInput(attrs={ username = forms.CharField(max_length=127, required=False, widget=forms.TextInput(attrs={
'placeholder': u'Логин',
'placeholder': 'Логин',
'class': "form-control", 'class': "form-control",
'id': "login" 'id': "login"
})) }))
fio = forms.CharField(max_length=256, widget=forms.TextInput(attrs={ fio = forms.CharField(max_length=256, widget=forms.TextInput(attrs={
'placeholder': u'ФИО',
'placeholder': 'ФИО',
'class': "form-control", 'class': "form-control",
'id': "fio" 'id': "fio"
}), required=False) }), required=False)
ip_address = forms.GenericIPAddressField(protocol='IPv4', required=False, widget=forms.TextInput(attrs={
ip_address = forms.GenericIPAddressField(protocol='ipv4', required=False, widget=forms.TextInput(attrs={
'pattern': ip_addr_regex, 'pattern': ip_addr_regex,
'placeholder': u'127.0.0.1',
'placeholder': '127.0.0.1',
'class': "form-control", 'class': "form-control",
'id': "ip" 'id': "ip"
})) }))
@ -28,7 +28,7 @@ class AbonForm(forms.Form):
max_length=16, max_length=16,
validators=[RegexValidator(r'^\+[7,8,9,3]\d{10,11}$')], validators=[RegexValidator(r'^\+[7,8,9,3]\d{10,11}$')],
widget=forms.TextInput(attrs={ widget=forms.TextInput(attrs={
'placeholder': u'+[7,8,9,3] и 10,11 цифр',
'placeholder': '+[7,8,9,3] и 10,11 цифр',
'pattern': r'^\+[7,8,9,3]\d{10,11}$', 'pattern': r'^\+[7,8,9,3]\d{10,11}$',
'required': '', 'required': '',
'class': 'form-control', 'class': 'form-control',

3
abonapp/migrations/0001_initial.py

@ -1,6 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2016-06-28 23:51 # Generated by Django 1.9 on 2016-06-28 23:51
from __future__ import unicode_literals
from django.conf import settings from django.conf import settings
import django.core.validators import django.core.validators
@ -111,6 +110,6 @@ class Migration(migrations.Migration):
), ),
migrations.AlterUniqueTogether( migrations.AlterUniqueTogether(
name='abontariff', name='abontariff',
unique_together=set([('abon', 'tariff', 'tariff_priority')]),
unique_together={('abon', 'tariff', 'tariff_priority')},
), ),
] ]

1
abonapp/migrations/0002_auto_20161206_2135.py

@ -1,6 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2016-12-06 18:35 # Generated by Django 1.9 on 2016-12-06 18:35
from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models

1
abonapp/migrations/0003_abongroup_profiles.py

@ -1,6 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2016-12-16 19:14 # Generated by Django 1.9 on 2016-12-16 19:14
from __future__ import unicode_literals
from django.conf import settings from django.conf import settings
from django.db import migrations, models from django.db import migrations, models

1
abonapp/migrations/0004_auto_20161220_0102.py

@ -1,6 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2016-12-19 22:02 # Generated by Django 1.9 on 2016-12-19 22:02
from __future__ import unicode_literals
from django.conf import settings from django.conf import settings
from django.db import migrations, models from django.db import migrations, models

7
abonapp/migrations/0005_auto_20161226_0054.py

@ -1,6 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2016-12-25 21:54 # Generated by Django 1.9 on 2016-12-25 21:54
from __future__ import unicode_literals
from django.db import migrations from django.db import migrations
@ -14,14 +13,14 @@ class Migration(migrations.Migration):
operations = [ operations = [
migrations.AlterModelOptions( migrations.AlterModelOptions(
name='abon', name='abon',
options={'permissions': (('can_buy_tariff', '\u041f\u043e\u043a\u0443\u043f\u043a\u0430 \u0442\u0430\u0440\u0438\u0444\u0430 \u0430\u0431\u043e\u043d\u0435\u043d\u0442\u0443'),)},
options={'permissions': (('can_buy_tariff', 'Покупка тарифа абоненту'),)},
), ),
migrations.AlterModelOptions( migrations.AlterModelOptions(
name='abongroup', name='abongroup',
options={'permissions': (('can_add_ballance', '\u041f\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u0447\u0451\u0442\u0430'),)},
options={'permissions': (('can_add_ballance', 'Пополнение счёта'),)},
), ),
migrations.AlterModelOptions( migrations.AlterModelOptions(
name='abontariff', name='abontariff',
options={'ordering': ('tariff_priority',), 'permissions': (('can_complete_service', '\u0414\u043e\u0441\u0440\u043e\u0447\u043d\u043e\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0443\u0441\u043b\u0443\u0433\u0438 \u0430\u0431\u043e\u043d\u0435\u043d\u0442\u0430'), ('can_activate_service', '\u0410\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u0443\u0433\u0438 \u0430\u0431\u043e\u043d\u0435\u043d\u0442\u0430'))},
options={'ordering': ('tariff_priority',), 'permissions': (('can_complete_service', 'Досрочное завершение услуги абонента'), ('can_activate_service', 'Активация услуги абонента'))},
), ),
] ]

36
abonapp/models.py

@ -14,12 +14,10 @@ from accounts_app.models import UserProfile
class LogicError(Exception): class LogicError(Exception):
def __init__(self, value, err_id=None):
def __init__(self, value):
self.message = value self.message = value
if err_id:
self.err_id = err_id
def __unicode__(self):
def __str__(self):
return repr(self.message) return repr(self.message)
def __str__(self): def __str__(self):
@ -36,7 +34,7 @@ class AbonGroup(models.Model):
('can_add_ballance', 'Пополнение счёта'), ('can_add_ballance', 'Пополнение счёта'),
) )
def __unicode__(self):
def __str__(self):
return self.title return self.title
@ -50,7 +48,7 @@ class AbonLog(models.Model):
class Meta: class Meta:
db_table = 'abonent_log' db_table = 'abonent_log'
def __unicode__(self):
def __str__(self):
return self.comment return self.comment
@ -124,7 +122,7 @@ class AbonTariff(models.Model):
amnt = self.calc_amount_service() amnt = self.calc_amount_service()
# если не хватает денег # если не хватает денег
if self.abon.ballance < amnt: if self.abon.ballance < amnt:
raise LogicError(u'Не хватает денег на счету')
raise LogicError('Не хватает денег на счету')
# дата активации услуги # дата активации услуги
self.time_start = timezone.now() self.time_start = timezone.now()
# снимаем деньги за услугу # снимаем деньги за услугу
@ -135,7 +133,7 @@ class AbonTariff(models.Model):
def is_started(self): def is_started(self):
return True if self.time_start is not None else False return True if self.time_start is not None else False
def __unicode__(self):
def __str__(self):
return "%d: '%s' - '%s'" % ( return "%d: '%s' - '%s'" % (
self.tariff_priority, self.tariff_priority,
self.tariff.title, self.tariff.title,
@ -147,8 +145,8 @@ class AbonTariff(models.Model):
db_table = 'abonent_tariff' db_table = 'abonent_tariff'
unique_together = (('abon', 'tariff', 'tariff_priority'),) unique_together = (('abon', 'tariff', 'tariff_priority'),)
permissions = ( permissions = (
('can_complete_service', u'Досрочное завершение услуги абонента'),
('can_activate_service', u'Активация услуги абонента')
('can_complete_service', 'Досрочное завершение услуги абонента'),
('can_activate_service', 'Активация услуги абонента')
) )
@ -188,18 +186,18 @@ class Abon(UserProfile):
self.group = cd['group'] self.group = cd['group']
self.address = cd['address'] self.address = cd['address']
except Http404: except Http404:
raise LogicError(u'Введённый IP адрес не добавлен в ip pool')
raise LogicError('Введённый IP адрес не добавлен в ip pool')
except MultipleObjectsReturned: except MultipleObjectsReturned:
raise LogicError(u'Введённый IP адрес не определён')
raise LogicError('Введённый IP адрес не определён')
class Meta: class Meta:
db_table = 'abonent' db_table = 'abonent'
permissions = ( permissions = (
('can_buy_tariff', u'Покупка тарифа абоненту'),
('can_buy_tariff', 'Покупка тарифа абоненту'),
) )
# Платим за что-то # Платим за что-то
def make_pay(self, curuser, how_match_to_pay=0.0, u_comment=u'Снятие со счёта средств'):
def make_pay(self, curuser, how_match_to_pay=0.0, u_comment='Снятие со счёта средств'):
AbonLog.objects.create( AbonLog.objects.create(
abon=self, abon=self,
amount=-how_match_to_pay, amount=-how_match_to_pay,
@ -214,7 +212,7 @@ class Abon(UserProfile):
abon=self, abon=self,
amount=amount, amount=amount,
author=current_user, author=current_user,
comment=u'Пополнение счёта через админку'
comment='Пополнение счёта через админку'
) )
self.ballance += amount self.ballance += amount
@ -244,7 +242,7 @@ class Abon(UserProfile):
AbonLog.objects.create( AbonLog.objects.create(
abon=self, amount=-tariff.amount, abon=self, amount=-tariff.amount,
author=author, author=author,
comment=u'Покупка тарифного плана через админку, тариф "%s"' % tariff.title
comment='Покупка тарифного плана через админку, тариф "%s"' % tariff.title
) )
# Пробует подключить новую услугу если пришло время # Пробует подключить новую услугу если пришло время
@ -265,7 +263,7 @@ class Abon(UserProfile):
# И от заказа тарифа до начала этого месяца # И от заказа тарифа до начала этого месяца
if (nw - at.time_start) > (nw - to_start_month): if (nw - at.time_start) > (nw - to_start_month):
# Заказ из прошлого месяца, срок действия закончен # Заказ из прошлого месяца, срок действия закончен
print u'Заказ из прошлого месяца, срок действия закончен'
print('Заказ из прошлого месяца, срок действия закончен')
# выберем следующую по приоритету # выберем следующую по приоритету
# next_tarifs = AbonTariff.objects.filter(tariff_priority__gt = self.tariff_priority, abon=self.abon) # next_tarifs = AbonTariff.objects.filter(tariff_priority__gt = self.tariff_priority, abon=self.abon)
@ -284,7 +282,7 @@ class Abon(UserProfile):
abon=self, abon=self,
amount=0, amount=0,
author=author, author=author,
comment=u'Завершение услуги по истечению срока действия'
comment='Завершение услуги по истечению срока действия'
) )
# есть-ли доступ у абонента к услуге, смотрим в tariff_app.custom_tariffs.<TariffBase>.manage_access() # есть-ли доступ у абонента к услуге, смотрим в tariff_app.custom_tariffs.<TariffBase>.manage_access()
@ -307,7 +305,7 @@ class InvoiceForPayment(models.Model):
date_pay = models.DateTimeField(blank=True, null=True) date_pay = models.DateTimeField(blank=True, null=True)
author = models.ForeignKey(UserProfile, related_name='+') author = models.ForeignKey(UserProfile, related_name='+')
def __unicode__(self):
def __str__(self):
return "%s -> %d $" % (self.abon.username, self.amount) return "%s -> %d $" % (self.abon.username, self.amount)
def set_ok(self): def set_ok(self):

10
abonapp/tests.py

@ -2,7 +2,7 @@
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.test import TestCase from django.test import TestCase
from models import Abon, AbonTariff
from .models import Abon, AbonTariff
from tariff_app.models import Tariff from tariff_app.models import Tariff
@ -10,17 +10,17 @@ class AbonTariffTestCase(TestCase):
def setUp(self): def setUp(self):
abon1 = Abon.objects.create( abon1 = Abon.objects.create(
telephone='+79784653751', telephone='+79784653751',
fio=u'ФИО абона',
fio='ФИО абона',
username='аго мучич' username='аго мучич'
) )
tarif1 = Tariff.objects.create( tarif1 = Tariff.objects.create(
title=u'Тариф 1',
title='Тариф 1',
speedIn=120.3, speedIn=120.3,
speedOut=53, speedOut=53,
amount=38 amount=38
) )
tarif2 = Tariff.objects.create( tarif2 = Tariff.objects.create(
title=u'Тариф 2',
title='Тариф 2',
speedIn=130.3, speedIn=130.3,
speedOut=23, speedOut=23,
amount=82 amount=82
@ -38,7 +38,7 @@ class AbonTariffTestCase(TestCase):
def test_activate_next(self): def test_activate_next(self):
# возьмём абонента для опытов # возьмём абонента для опытов
abn = get_object_or_404(Abon, username=u'аго мучич')
abn = get_object_or_404(Abon, username='аго мучич')
# берём купленные услуги # берём купленные услуги
ats = AbonTariff.objects.filter(abon=abn) ats = AbonTariff.objects.filter(abon=abn)

2
abonapp/urls.py

@ -1,6 +1,6 @@
from django.conf.urls import url, include from django.conf.urls import url, include
import views
from . import views
urlpatterns = [ urlpatterns = [

2
abonapp/urls_abon.py

@ -1,6 +1,6 @@
from django.conf.urls import url from django.conf.urls import url
import views
from . import views
urlpatterns = [ urlpatterns = [

100
abonapp/views.py

@ -14,8 +14,8 @@ from django.contrib import messages
from ip_pool.models import IpPoolItem from ip_pool.models import IpPoolItem
from tariff_app.models import Tariff from tariff_app.models import Tariff
from agent import NasFailedResult, AbonStruct, Transmitter, TariffStruct, NasNetworkError from agent import NasFailedResult, AbonStruct, Transmitter, TariffStruct, NasNetworkError
import forms
import models
from . import forms
from . import models
import mydefs import mydefs
@ -48,14 +48,14 @@ def addgroup(request):
frm = forms.AbonGroupForm(request.POST) frm = forms.AbonGroupForm(request.POST)
if frm.is_valid(): if frm.is_valid():
frm.save() frm.save()
messages.success(request, u'Группа успешно создана')
messages.success(request, 'Группа успешно создана')
return redirect('abonapp:group_list') return redirect('abonapp:group_list')
else: else:
messages.error(request, u'Исправьте ошибки')
messages.error(request, 'Исправьте ошибки')
except NasFailedResult as e: except NasFailedResult as e:
messages.error(request, e.message)
messages.error(request, e)
except NasNetworkError as e: except NasNetworkError as e:
messages.error(request, e.message)
messages.error(request, e)
return render(request, 'abonapp/addGroup.html', { return render(request, 'abonapp/addGroup.html', {
'form': frm 'form': frm
}) })
@ -88,9 +88,9 @@ def delgroup(request):
get_object_or_404(models.AbonGroup, id=agd).delete() get_object_or_404(models.AbonGroup, id=agd).delete()
return mydefs.res_success(request, 'abonapp:group_list') return mydefs.res_success(request, 'abonapp:group_list')
except NasFailedResult as e: except NasFailedResult as e:
messages.error(request, e.message)
messages.error(request, e)
except NasNetworkError as e: except NasNetworkError as e:
messages.error(request, e.message)
messages.error(request, e)
return mydefs.res_error(request, 'abonapp:group_list') return mydefs.res_error(request, 'abonapp:group_list')
@ -110,16 +110,16 @@ def addabon(request, gid):
prf.save() prf.save()
return redirect('abonapp:people_list', group.id) return redirect('abonapp:people_list', group.id)
else: else:
messages.error(request, u'Некоторые поля заполнены не правильно, проверте ещё раз')
messages.error(request, 'Некоторые поля заполнены не правильно, проверте ещё раз')
except IntegrityError as e: except IntegrityError as e:
messages.error(request, e.message)
messages.error(request, e)
except models.LogicError as e: except models.LogicError as e:
messages.error(request, e.message)
messages.error(request, e)
except NasFailedResult as e: except NasFailedResult as e:
messages.error(request, e.message)
messages.error(request, e)
except NasNetworkError as e: except NasNetworkError as e:
messages.error(request, e.message)
messages.error(request, e)
if not frm: if not frm:
frm = forms.AbonForm(initial={ frm = forms.AbonForm(initial={
@ -153,9 +153,9 @@ def delentity(request):
get_object_or_404(models.AbonGroup, id=uid).delete() get_object_or_404(models.AbonGroup, id=uid).delete()
return mydefs.res_success(request, 'abonapp:group_list') return mydefs.res_success(request, 'abonapp:group_list')
except NasNetworkError as e: except NasNetworkError as e:
messages.error(request, e.message)
messages.error(request, e)
except NasFailedResult as e: except NasFailedResult as e:
messages.error(request, e.message)
messages.error(request, e)
return redirect('abonapp:group_list') return redirect('abonapp:group_list')
@ -170,14 +170,14 @@ def abonamount(request, gid, uid):
amnt = mydefs.safe_float(request.POST.get('amount')) amnt = mydefs.safe_float(request.POST.get('amount'))
abon.add_ballance(request.user, amnt) abon.add_ballance(request.user, amnt)
abon.save(update_fields=['ballance']) abon.save(update_fields=['ballance'])
messages.success(request, u'Счёт успешно пополнен на %d' % amnt)
messages.success(request, 'Счёт успешно пополнен на %d' % amnt)
return redirect('abonapp:abon_home', gid=gid, uid=uid) return redirect('abonapp:abon_home', gid=gid, uid=uid)
else: else:
messages.error(request, u'Не могу разобрать id абонента')
messages.error(request, 'Не могу разобрать id абонента')
except NasNetworkError as e: except NasNetworkError as e:
messages.error(request, e.message)
messages.error(request, e)
except NasFailedResult as e: except NasFailedResult as e:
messages.error(request, e.message)
messages.error(request, e)
return render(request, 'abonapp/abonamount.html', { return render(request, 'abonapp/abonamount.html', {
'abon': abon, 'abon': abon,
'abon_group': get_object_or_404(models.AbonGroup, id=gid) 'abon_group': get_object_or_404(models.AbonGroup, id=gid)
@ -236,7 +236,7 @@ def abonhome(request, gid, uid):
init_frm_dat = { init_frm_dat = {
'username': abon.username, 'username': abon.username,
'fio': abon.fio, 'fio': abon.fio,
'ip_address': abon.ip_address or u'Не назначен',
'ip_address': abon.ip_address or 'Не назначен',
'telephone': abon.telephone, 'telephone': abon.telephone,
'group': abon.group, 'group': abon.group,
'address': abon.address, 'address': abon.address,
@ -259,21 +259,21 @@ def abonhome(request, gid, uid):
# return redirect('abonapp:abon_home', gid, uid) # return redirect('abonapp:abon_home', gid, uid)
else: else:
messages.warning(request, u'Не правильные значения, проверте поля и попробуйте ещё')
messages.warning(request, 'Не правильные значения, проверте поля и попробуйте ещё')
else: else:
frm = forms.AbonForm(initial=init_frm_dat) frm = forms.AbonForm(initial=init_frm_dat)
except IntegrityError as e: except IntegrityError as e:
messages.error(request, u'Проверте введённые вами значения, скорее всего такой ip уже у кого-то есть. А вообще: %s' % e.message)
messages.error(request, 'Проверте введённые вами значения, скорее всего такой ip уже у кого-то есть. А вообще: %s' % e)
frm = forms.AbonForm(initial=init_frm_dat) frm = forms.AbonForm(initial=init_frm_dat)
except Http404: except Http404:
messages.error(request, u'Ip адрес не найден в списке IP адресов')
messages.error(request, 'Ip адрес не найден в списке IP адресов')
frm = forms.AbonForm(initial=init_frm_dat) frm = forms.AbonForm(initial=init_frm_dat)
except NasFailedResult as e: except NasFailedResult as e:
messages.error(request, e.message)
messages.error(request, e)
except NasNetworkError as e: except NasNetworkError as e:
messages.error(request, e.message)
messages.error(request, e)
return render(request, 'abonapp/editAbon.html', { return render(request, 'abonapp/editAbon.html', {
'form': frm or forms.AbonForm(initial=init_frm_dat), 'form': frm or forms.AbonForm(initial=init_frm_dat),
@ -313,7 +313,7 @@ def add_invoice(request, gid, uid):
newinv.amount = curr_amount newinv.amount = curr_amount
newinv.comment = comment newinv.comment = comment
if request.POST.get('status') == u'on':
if request.POST.get('status') == 'on':
newinv.status = True newinv.status = True
newinv.author = request.user newinv.author = request.user
@ -321,9 +321,9 @@ def add_invoice(request, gid, uid):
return redirect('abonapp:abon_home', gid=gid, uid=uid) return redirect('abonapp:abon_home', gid=gid, uid=uid)
except NasNetworkError as e: except NasNetworkError as e:
messages.error(request, e.message)
messages.error(request, e)
except NasFailedResult as e: except NasFailedResult as e:
messages.error(request, e.message)
messages.error(request, e)
return render(request, 'abonapp/addInvoice.html', { return render(request, 'abonapp/addInvoice.html', {
'abon': abon, 'abon': abon,
'invcount': models.InvoiceForPayment.objects.filter(abon=abon).count(), 'invcount': models.InvoiceForPayment.objects.filter(abon=abon).count(),
@ -346,15 +346,15 @@ def buy_tariff(request, gid, uid):
abon.save() abon.save()
return redirect('abonapp:abon_services', gid=gid, uid=abon.id) return redirect('abonapp:abon_services', gid=gid, uid=abon.id)
else: else:
messages.error(request, u'Что-то не так при покупке услуги, проверьте и попробуйте ещё')
messages.error(request, 'Что-то не так при покупке услуги, проверьте и попробуйте ещё')
else: else:
frm = forms.BuyTariff() frm = forms.BuyTariff()
except models.LogicError as e: except models.LogicError as e:
messages.error(request, e.message)
messages.error(request, e)
except NasFailedResult as e: except NasFailedResult as e:
messages.error(request, e.message)
messages.error(request, e)
except NasNetworkError as e: except NasNetworkError as e:
messages.error(request, e.message)
messages.error(request, e)
return redirect('abonapp:abon_services', gid=gid, uid=abon.id) return redirect('abonapp:abon_services', gid=gid, uid=abon.id)
return render(request, 'abonapp/buy_tariff.html', { return render(request, 'abonapp/buy_tariff.html', {
@ -378,9 +378,9 @@ def chpriority(request, gid, uid):
elif act == 'down': elif act == 'down':
current_abon_tariff.priority_down() current_abon_tariff.priority_down()
except NasFailedResult as e: except NasFailedResult as e:
messages.error(request, e.message)
messages.error(request, e)
except NasNetworkError as e: except NasNetworkError as e:
messages.error(request, e.message)
messages.error(request, e)
return redirect('abonapp:abon_home', gid=gid, uid=uid) return redirect('abonapp:abon_home', gid=gid, uid=uid)
@ -400,19 +400,19 @@ def complete_service(request, gid, uid, srvid):
if finish_confirm == 'yes': if finish_confirm == 'yes':
# удаляем запись о текущей услуге. # удаляем запись о текущей услуге.
abtar.delete() abtar.delete()
messages.success(request, u'Услуга успешно завершена')
messages.success(request, 'Услуга успешно завершена')
return redirect('abonapp:abon_home', gid, uid) return redirect('abonapp:abon_home', gid, uid)
else: else:
raise models.LogicError(u'Действие не подтверждено')
raise models.LogicError('Действие не подтверждено')
time_use = mydefs.RuTimedelta(timezone.now() - abtar.time_start) time_use = mydefs.RuTimedelta(timezone.now() - abtar.time_start)
except models.LogicError as e: except models.LogicError as e:
messages.error(request, e.message)
messages.error(request, e)
except NasFailedResult as e: except NasFailedResult as e:
messages.error(request, e.message)
messages.error(request, e)
except NasNetworkError as e: except NasNetworkError as e:
messages.warning(request, e.message)
messages.warning(request, e)
return redirect('abonapp:abon_home', gid, uid) return redirect('abonapp:abon_home', gid, uid)
return render(request, 'abonapp/complete_service.html', { return render(request, 'abonapp/complete_service.html', {
@ -438,11 +438,11 @@ def activate_service(request, gid, uid, srvid):
return redirect('abonapp:abon_home', gid, uid) return redirect('abonapp:abon_home', gid, uid)
except NasFailedResult as e: except NasFailedResult as e:
messages.error(request, e.message)
messages.error(request, e)
except NasNetworkError as e: except NasNetworkError as e:
messages.warning(request, e.message)
messages.warning(request, e)
except models.LogicError as e: except models.LogicError as e:
messages.error(request, e.message)
messages.error(request, e)
return render(request, 'abonapp/activate_service.html', { return render(request, 'abonapp/activate_service.html', {
'abon': abtar.abon, 'abon': abtar.abon,
'abon_group': abtar.abon.group, 'abon_group': abtar.abon.group,
@ -458,9 +458,9 @@ def unsubscribe_service(request, gid, uid, srvid):
try: try:
get_object_or_404(models.AbonTariff, id=int(srvid)).delete() get_object_or_404(models.AbonTariff, id=int(srvid)).delete()
except NasFailedResult as e: except NasFailedResult as e:
messages.error(request, e.message)
messages.error(request, e)
except NasNetworkError as e: except NasNetworkError as e:
messages.warning(request, e.message)
messages.warning(request, e)
return redirect('abonapp:abon_home', gid=gid, uid=uid) return redirect('abonapp:abon_home', gid=gid, uid=uid)
@ -512,27 +512,27 @@ def update_nas(request, group_id):
except NasFailedResult: except NasFailedResult:
tm.add_user(agent_abon) tm.add_user(agent_abon)
except NasFailedResult as e: except NasFailedResult as e:
messages.error(request, e.message)
messages.error(request, e)
except NasNetworkError as e: except NasNetworkError as e:
messages.warning(request, e.message)
messages.warning(request, e)
return redirect('abonapp:people_list', gid=group_id) return redirect('abonapp:people_list', gid=group_id)
# API's # API's
def abons(request): def abons(request):
ablist = map(lambda abn: {
ablist = [{
'id': abn.id, 'id': abn.id,
'tarif_id': abn.active_tariff().id if abn.active_tariff() else 0, 'tarif_id': abn.active_tariff().id if abn.active_tariff() else 0,
'ip': abn.ip_address.int_ip(), 'ip': abn.ip_address.int_ip(),
'is_active': abn.is_active 'is_active': abn.is_active
}, models.Abon.objects.all())
} for abn in models.Abon.objects.all()]
tarlist = map(lambda trf: {
tarlist = [{
'id': trf.id, 'id': trf.id,
'speedIn': trf.speedIn, 'speedIn': trf.speedIn,
'speedOut': trf.speedOut 'speedOut': trf.speedOut
}, Tariff.objects.all())
} for trf in Tariff.objects.all()]
data = { data = {
'subscribers': ablist, 'subscribers': ablist,

2
accounts_app/admin.py

@ -1,6 +1,6 @@
from django.contrib import admin from django.contrib import admin
from models import UserProfile
from .models import UserProfile
admin.site.register(UserProfile) admin.site.register(UserProfile)

2
accounts_app/forms.py

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django import forms from django import forms
from models import UserProfile
from .models import UserProfile
class SetupPerms(forms.ModelForm): class SetupPerms(forms.ModelForm):

5
accounts_app/migrations/0001_initial.py

@ -1,6 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2016-06-28 23:51 # Generated by Django 1.9 on 2016-06-28 23:51
from __future__ import unicode_literals
import django.core.validators import django.core.validators
from django.db import migrations, models from django.db import migrations, models
@ -31,8 +30,8 @@ class Migration(migrations.Migration):
('is_active', models.BooleanField(default=True)), ('is_active', models.BooleanField(default=True)),
('is_admin', models.BooleanField(default=False)), ('is_admin', models.BooleanField(default=False)),
('telephone', models.CharField(max_length=16, unique=True, validators=[ ('telephone', models.CharField(max_length=16, unique=True, validators=[
django.core.validators.RegexValidator(b'^\\+[7,8,9,3]\\d{10,11}$')],
verbose_name=b'Telephone number')),
django.core.validators.RegexValidator(r'^\\+[7,8,9,3]\\d{10,11}$')],
verbose_name='Telephone number')),
('skype', models.CharField(blank=True, max_length=20)), ('skype', models.CharField(blank=True, max_length=20)),
('avatar', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, ('avatar', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE,
to='photo_app.Photo')), to='photo_app.Photo')),

1
accounts_app/migrations/0002_userprofile_email.py

@ -1,6 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2016-11-30 15:15 # Generated by Django 1.9 on 2016-11-30 15:15
from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models

6
accounts_app/migrations/0003_auto_20161206_2135.py

@ -1,13 +1,11 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2016-12-06 18:35 # Generated by Django 1.9 on 2016-12-06 18:35
from __future__ import unicode_literals
import django.core.validators import django.core.validators
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('accounts_app', '0002_userprofile_email'), ('accounts_app', '0002_userprofile_email'),
] ]
@ -20,6 +18,8 @@ class Migration(migrations.Migration):
migrations.AlterField( migrations.AlterField(
model_name='userprofile', model_name='userprofile',
name='telephone', name='telephone',
field=models.CharField(max_length=16, validators=[django.core.validators.RegexValidator(b'^\\+[7,8,9,3]\\d{10,11}$')], verbose_name=b'Telephone number'),
field=models.CharField(max_length=16,
validators=[django.core.validators.RegexValidator('^\\+[7,8,9,3]\\d{10,11}$')],
verbose_name='Telephone number'),
), ),
] ]

4
accounts_app/models.py

@ -50,7 +50,7 @@ class UserProfile(AbstractBaseUser, PermissionsMixin):
max_length=16, max_length=16,
verbose_name='Telephone number', verbose_name='Telephone number',
#unique=True, #unique=True,
validators=[RegexValidator(r'^\+[7,8,9,3]\d{10,11}$')]
validators=[RegexValidator('^\+[7,8,9,3]\d{10,11}$')]
) )
avatar = models.ForeignKey(Photo, null=True, blank=True) avatar = models.ForeignKey(Photo, null=True, blank=True)
email = models.EmailField() email = models.EmailField()
@ -86,5 +86,5 @@ class UserProfile(AbstractBaseUser, PermissionsMixin):
else: else:
return DEFAULT_PICTURE return DEFAULT_PICTURE
def __unicode__(self):
def __str__(self):
return self.get_full_name() return self.get_full_name()

2
accounts_app/urls.py

@ -1,7 +1,7 @@
# -*- coding:utf-8 -*- # -*- coding:utf-8 -*-
from django.conf.urls import url from django.conf.urls import url
import views
from . import views
urlpatterns = [ urlpatterns = [

16
accounts_app/views.py

@ -10,7 +10,7 @@ from django.contrib import messages
from abonapp.models import AbonGroup from abonapp.models import AbonGroup
from photo_app.models import Photo from photo_app.models import Photo
from models import UserProfile
from .models import UserProfile
import mydefs import mydefs
@ -39,13 +39,13 @@ def to_signin(request):
return render(request, 'accounts/login.html', { return render(request, 'accounts/login.html', {
'next': nextl, 'next': nextl,
'errmsg': u'Неправильный логин или пароль, попробуйте ещё раз'
'errmsg': 'Неправильный логин или пароль, попробуйте ещё раз'
}) })
return render(request, 'accounts/login.html', { return render(request, 'accounts/login.html', {
'next': nextl 'next': nextl
}) })
except NoReverseMatch: except NoReverseMatch:
raise Http404(u"Destination page does not exist")
raise Http404("Destination page does not exist")
def sign_out(request): def sign_out(request):
@ -133,7 +133,7 @@ def ch_info(request):
newpasswd = request.POST.get('newpasswd') newpasswd = request.POST.get('newpasswd')
user.set_password(newpasswd) user.set_password(newpasswd)
else: else:
messages.error(request, u'Неправильный пароль')
messages.error(request, 'Неправильный пароль')
user.save() user.save()
request.user = user request.user = user
@ -158,10 +158,10 @@ def create_profile(request):
passwd = request.POST.get('passwd') passwd = request.POST.get('passwd')
conpasswd = request.POST.get('conpasswd') conpasswd = request.POST.get('conpasswd')
if not passwd: if not passwd:
messages.error(request, u'Забыли указать пароль для нового аккаунта')
messages.error(request, 'Забыли указать пароль для нового аккаунта')
if not conpasswd: if not conpasswd:
messages.error(request, u'Забыли повторить пароль для нового аккаунта')
messages.error(request, 'Забыли повторить пароль для нового аккаунта')
if passwd == conpasswd: if passwd == conpasswd:
user_qs = UserProfile.objects.filter(username=username)[:1] user_qs = UserProfile.objects.filter(username=username)[:1]
@ -170,9 +170,9 @@ def create_profile(request):
user.save() user.save()
return redirect('acc_app:accounts_list') return redirect('acc_app:accounts_list')
else: else:
messages.error(request, u'Пользователь с таким именем уже есть')
messages.error(request, 'Пользователь с таким именем уже есть')
else: else:
messages.error(request, u'Пароли не совпадают, попробуйте ещё раз')
messages.error(request, 'Пароли не совпадают, попробуйте ещё раз')
return render(request, 'accounts/create_acc.html', { return render(request, 'accounts/create_acc.html', {
'newuser': user 'newuser': user
}) })

6
agent/__init__.py

@ -1,7 +1,7 @@
# -*- coding: utf8 -*- # -*- coding: utf8 -*-
from mod_mikrotik import MikrotikTransmitter
from core import NasFailedResult, NasNetworkError
from structs import TariffStruct, AbonStruct
from .mod_mikrotik import MikrotikTransmitter
from .core import NasFailedResult, NasNetworkError
from .structs import TariffStruct, AbonStruct
# Transmitter мы будем импортировать в других местах # Transmitter мы будем импортировать в других местах

12
agent/core.py

@ -1,18 +1,16 @@
# -*- coding: utf8 -*- # -*- coding: utf8 -*-
from abc import ABCMeta, abstractmethod from abc import ABCMeta, abstractmethod
from structs import AbonStruct, TariffStruct
from .structs import AbonStruct, TariffStruct
# Всплывает если из NAS вернулся не удачный результат # Всплывает если из NAS вернулся не удачный результат
class NasFailedResult(Exception): class NasFailedResult(Exception):
def __init__(self, message):
super(NasFailedResult, self).__init__(message)
pass
# Всплывает когда нет связи с сервером доступа к инету (NAS) # Всплывает когда нет связи с сервером доступа к инету (NAS)
class NasNetworkError(Exception): class NasNetworkError(Exception):
def __init__(self, message):
super(NasNetworkError, self).__init__(message)
pass
# Проверяет входной тип на принадлежность классу. # Проверяет входной тип на принадлежность классу.
@ -32,9 +30,7 @@ def check_input_type(class_or_type):
# Общается с NAS'ом # Общается с NAS'ом
class BaseTransmitter(object):
__metaclass__ = ABCMeta
class BaseTransmitter(metaclass=ABCMeta):
@abstractmethod @abstractmethod
@check_input_type(AbonStruct) @check_input_type(AbonStruct)
def add_user_range(self, user_list): def add_user_range(self, user_list):

90
agent/mod_mikrotik.py

@ -2,15 +2,14 @@
import socket import socket
import binascii import binascii
from hashlib import md5 from hashlib import md5
from core import BaseTransmitter, NasFailedResult, NasNetworkError
from .core import BaseTransmitter, NasFailedResult, NasNetworkError
from mydefs import ping from mydefs import ping
from structs import TariffStruct, IpStruct
import settings
from .structs import TariffStruct, IpStruct
from . import settings
class ApiRos: class ApiRos:
"Routeros api" "Routeros api"
def __init__(self, sk): def __init__(self, sk):
self.sk = sk self.sk = sk
self.currenttag = 0 self.currenttag = 0
@ -19,11 +18,11 @@ class ApiRos:
for repl, attrs in self.talk(["/login"]): for repl, attrs in self.talk(["/login"]):
chal = binascii.unhexlify(attrs['=ret']) chal = binascii.unhexlify(attrs['=ret'])
md = md5() md = md5()
md.update('\x00')
md.update(pwd)
md.update(b'\x00')
md.update(bytes(pwd, 'utf-8'))
md.update(chal) md.update(chal)
self.talk(["/login", "=name=" + username, self.talk(["/login", "=name=" + username,
"=response=00" + binascii.hexlify(md.digest())])
"=response=00" + binascii.hexlify(md.digest()).decode('utf-8')])
def talk(self, words): def talk(self, words):
if self.writeSentence(words) == 0: return if self.writeSentence(words) == 0: return
@ -35,10 +34,10 @@ class ApiRos:
attrs = {} attrs = {}
for w in i[1:]: for w in i[1:]:
j = w.find('=', 1) j = w.find('=', 1)
if j == -1:
if (j == -1):
attrs[w] = '' attrs[w] = ''
else: else:
attrs[w[:j]] = w[j + 1:]
attrs[w[:j]] = w[j+1:]
r.append((reply, attrs)) r.append((reply, attrs))
if reply == '!done': return r if reply == '!done': return r
@ -58,84 +57,75 @@ class ApiRos:
r.append(w) r.append(w)
def writeWord(self, w): def writeWord(self, w):
print "<<< " + w
self.writeLen(len(w))
self.writeStr(w)
print("<<< " + w)
b = bytes(w, "utf-8")
self.writeLen(len(b))
self.writeBytes(b)
def readWord(self): def readWord(self):
ret = self.readStr(self.readLen())
print ">>> " + ret
ret = self.readBytes(self.readLen()).decode('utf-8')
print(">>> " + ret)
return ret return ret
def writeLen(self, l): def writeLen(self, l):
if l < 0x80: if l < 0x80:
self.writeStr(chr(l))
self.writeBytes(bytes([l]))
elif l < 0x4000: elif l < 0x4000:
l |= 0x8000 l |= 0x8000
self.writeStr(chr((l >> 8) & 0xFF))
self.writeStr(chr(l & 0xFF))
self.writeBytes(bytes([(l >> 8) & 0xff, l & 0xff]))
elif l < 0x200000: elif l < 0x200000:
l |= 0xC00000 l |= 0xC00000
self.writeStr(chr((l >> 16) & 0xFF))
self.writeStr(chr((l >> 8) & 0xFF))
self.writeStr(chr(l & 0xFF))
self.writeBytes(bytes([(l >> 16) & 0xff, (l >> 8) & 0xff, l & 0xff]))
elif l < 0x10000000: elif l < 0x10000000:
l |= 0xE0000000 l |= 0xE0000000
self.writeStr(chr((l >> 24) & 0xFF))
self.writeStr(chr((l >> 16) & 0xFF))
self.writeStr(chr((l >> 8) & 0xFF))
self.writeStr(chr(l & 0xFF))
self.writeBytes(bytes([(l >> 24) & 0xff, (l >> 16) & 0xff, (l >> 8) & 0xff, l & 0xff]))
else: else:
self.writeStr(chr(0xF0))
self.writeStr(chr((l >> 24) & 0xFF))
self.writeStr(chr((l >> 16) & 0xFF))
self.writeStr(chr((l >> 8) & 0xFF))
self.writeStr(chr(l & 0xFF))
self.writeBytes(bytes([0xf0, (l >> 24) & 0xff, (l >> 16) & 0xff, (l >> 8) & 0xff, l & 0xff]))
def readLen(self): def readLen(self):
c = ord(self.readStr(1))
c = self.readBytes(1)[0]
if (c & 0x80) == 0x00: if (c & 0x80) == 0x00:
pass pass
elif (c & 0xC0) == 0x80: elif (c & 0xC0) == 0x80:
c &= ~0xC0 c &= ~0xC0
c <<= 8 c <<= 8
c += ord(self.readStr(1))
c += self.readBytes(1)[0]
elif (c & 0xE0) == 0xC0: elif (c & 0xE0) == 0xC0:
c &= ~0xE0 c &= ~0xE0
c <<= 8 c <<= 8
c += ord(self.readStr(1))
c += self.readBytes(1)[0]
c <<= 8 c <<= 8
c += ord(self.readStr(1))
c += self.readBytes(1)[0]
elif (c & 0xF0) == 0xE0: elif (c & 0xF0) == 0xE0:
c &= ~0xF0 c &= ~0xF0
c <<= 8 c <<= 8
c += ord(self.readStr(1))
c += self.readBytes(1)[0]
c <<= 8 c <<= 8
c += ord(self.readStr(1))
c += self.readBytes(1)[0]
c <<= 8 c <<= 8
c += ord(self.readStr(1))
c += self.readBytes(1)[0]
elif (c & 0xF8) == 0xF0: elif (c & 0xF8) == 0xF0:
c = ord(self.readStr(1))
c = self.readBytes(1)[0]
c <<= 8 c <<= 8
c += ord(self.readStr(1))
c += self.readBytes(1)[0]
c <<= 8 c <<= 8
c += ord(self.readStr(1))
c += self.readBytes(1)[0]
c <<= 8 c <<= 8
c += ord(self.readStr(1))
c += self.readBytes(1)[0]
return c return c
def writeStr(self, text):
n = 0
while n < len(text):
r = self.sk.send(text[n:])
if r == 0: raise RuntimeError, "connection closed by remote end"
def writeBytes(self, str):
n = 0;
while n < len(str):
r = self.sk.send(str[n:])
if r == 0: raise RuntimeError("connection closed by remote end")
n += r n += r
def readStr(self, length):
ret = ''
def readBytes(self, length):
ret = b''
while len(ret) < length: while len(ret) < length:
s = self.sk.recv(length - len(ret)) s = self.sk.recv(length - len(ret))
if s == '': raise RuntimeError, "connection closed by remote end"
if len(s) == 0: raise RuntimeError("connection closed by remote end")
ret += s ret += s
return ret return ret
@ -145,7 +135,7 @@ class MikrotikTransmitter(BaseTransmitter):
def __init__(self, login=None, password=None, ip=None, port=None): def __init__(self, login=None, password=None, ip=None, port=None):
ip = ip or settings.NAS_IP ip = ip or settings.NAS_IP
if not ping(ip): if not ping(ip):
raise NasNetworkError(u'NAS %s не пингуется' % ip)
raise NasNetworkError('NAS %s не пингуется' % ip)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, port or settings.NAS_PORT)) s.connect((ip, port or settings.NAS_PORT))
self.ar = ApiRos(s) self.ar = ApiRos(s)
@ -165,7 +155,7 @@ class MikrotikTransmitter(BaseTransmitter):
return ret[0][1] return ret[0][1]
def add_user_range(self, user_list): def add_user_range(self, user_list):
return map(self.add_user, user_list)
return list(map(self.add_user, user_list))
def remove_user_range(self, user_list): def remove_user_range(self, user_list):
names = ['uid%d' % usr.uid for usr in user_list] names = ['uid%d' % usr.uid for usr in user_list]

4
agent/netflow/to_mysql.py

@ -33,7 +33,7 @@ def convert(query):
if __name__ == '__main__': if __name__ == '__main__':
f = sys.stdin f = sys.stdin
table_name = "flowstat_%s" % datetime.now().strftime("%d%m%Y") table_name = "flowstat_%s" % datetime.now().strftime("%d%m%Y")
print("CREATE TABLE IF NOT EXISTS %s (" % table_name)
print(("CREATE TABLE IF NOT EXISTS %s (" % table_name))
print("`id` int(10) AUTO_INCREMENT NOT NULL,") print("`id` int(10) AUTO_INCREMENT NOT NULL,")
print("`src_ip` INT(10) UNSIGNED NOT NULL,") print("`src_ip` INT(10) UNSIGNED NOT NULL,")
print("`dst_ip` INT(10) UNSIGNED NOT NULL,") print("`dst_ip` INT(10) UNSIGNED NOT NULL,")
@ -55,7 +55,7 @@ if __name__ == '__main__':
if not rs: exit() if not rs: exit()
# without first comma # without first comma
print(ins_sql) print(ins_sql)
print(rs[1:])
print((rs[1:]))
while n > 0: while n > 0:
rs = convert(f.readline()) rs = convert(f.readline())
if not rs: exit() if not rs: exit()

10
agent/structs.py

@ -1,12 +1,10 @@
# -*- coding: utf8 -*- # -*- coding: utf8 -*-
from abc import ABCMeta, abstractmethod from abc import ABCMeta, abstractmethod
from struct import pack, unpack from struct import pack, unpack
from utils import int2ip, ip2int
from .utils import int2ip, ip2int
class BaseStruct(object):
__metaclass__ = ABCMeta
class BaseStruct(object, metaclass=ABCMeta):
@abstractmethod @abstractmethod
def serialize(self): def serialize(self):
"""привращаем инфу в бинарную строку""" """привращаем инфу в бинарную строку"""
@ -55,7 +53,7 @@ class TariffStruct(BaseStruct):
class AbonStruct(BaseStruct): class AbonStruct(BaseStruct):
def __init__(self, uid=None, ip=None, tariff=None): def __init__(self, uid=None, ip=None, tariff=None):
self.uid = long(uid)
self.uid = int(uid)
self.ip = IpStruct(ip) self.ip = IpStruct(ip)
assert isinstance(tariff, TariffStruct) assert isinstance(tariff, TariffStruct)
self.tariff = tariff self.tariff = tariff
@ -70,7 +68,7 @@ class AbonStruct(BaseStruct):
dt = unpack("!LII", data) dt = unpack("!LII", data)
self.uid = dt[0] self.uid = dt[0]
self.ip = IpStruct(dt[1]) self.ip = IpStruct(dt[1])
tarifs = filter(lambda trf: trf.tid == dt[2], all_tarifs)
tarifs = [trf for trf in all_tarifs if trf.tid == dt[2]]
if len(tarifs) < 1: if len(tarifs) < 1:
raise IndexError raise IndexError
assert isinstance(tarifs[0], TariffStruct) assert isinstance(tarifs[0], TariffStruct)

2
chatbot/admin.py

@ -1,5 +1,5 @@
from django.contrib import admin from django.contrib import admin
import models
from . import models
admin.site.register(models.MessageHistory) admin.site.register(models.MessageHistory)
admin.site.register(models.TelegramBot) admin.site.register(models.TelegramBot)

1
chatbot/migrations/0001_initial.py

@ -1,6 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2017-01-15 20:55 # Generated by Django 1.9 on 2017-01-15 20:55
from __future__ import unicode_literals
from django.conf import settings from django.conf import settings
from django.db import migrations, models from django.db import migrations, models

8
chatbot/models.py

@ -2,11 +2,15 @@ from django.db import models
from djing.settings import AUTH_USER_MODEL from djing.settings import AUTH_USER_MODEL
class ChatException(Exception):
pass
class TelegramBot(models.Model): class TelegramBot(models.Model):
user = models.ForeignKey(AUTH_USER_MODEL) user = models.ForeignKey(AUTH_USER_MODEL)
chat_id = models.PositiveIntegerField(default=0) chat_id = models.PositiveIntegerField(default=0)
def __unicode__(self):
def __str__(self):
return self.user.get_full_name() + ' - ' + str(self.chat_id) return self.user.get_full_name() + ' - ' + str(self.chat_id)
@ -15,5 +19,5 @@ class MessageHistory(models.Model):
message = models.CharField(max_length=255) message = models.CharField(max_length=255)
date_sent = models.DateTimeField(auto_now_add=True) date_sent = models.DateTimeField(auto_now_add=True)
def __unicode__(self):
def __str__(self):
return self.message return self.message

35
chatbot/telebot.py

@ -2,9 +2,10 @@
from telepot import helper, glance, Bot from telepot import helper, glance, Bot
import os import os
import socket import socket
from models import TelegramBot
from .models import TelegramBot, ChatException
from chatbot.models import MessageHistory from chatbot.models import MessageHistory
from accounts_app.models import UserProfile from accounts_app.models import UserProfile
import collections
token = '285129725:AAF9Si5_b1n1_cN3vJtwXt0gkgsqKBptut4' token = '285129725:AAF9Si5_b1n1_cN3vJtwXt0gkgsqKBptut4'
@ -15,7 +16,7 @@ class DjingTelebot(helper.ChatHandler):
_chat_id = 0 _chat_id = 0
def __init__(self, seed_tuple, **kwargs): def __init__(self, seed_tuple, **kwargs):
super(DjingTelebot, self).__init__(seed_tuple, **kwargs)
super().__init__(seed_tuple, **kwargs)
self.cmds = { self.cmds = {
'ping': self.ping, 'ping': self.ping,
'iam': self.say_me 'iam': self.say_me
@ -27,7 +28,7 @@ class DjingTelebot(helper.ChatHandler):
# задаём вопрос пользователю, и ожидаем ответ в fn # задаём вопрос пользователю, и ожидаем ответ в fn
def _question(self, text, fn): def _question(self, text, fn):
assert callable(fn)
assert isinstance(fn, collections.Callable)
self._dialog_fn = fn self._dialog_fn = fn
if text is not None: if text is not None:
self._sent_reply(text) self._sent_reply(text)
@ -55,7 +56,7 @@ class DjingTelebot(helper.ChatHandler):
self._current_user = tbot.user self._current_user = tbot.user
self._message_log(initial_msg['text']) self._message_log(initial_msg['text'])
except TelegramBot.DoesNotExist: except TelegramBot.DoesNotExist:
self._question(u'Давай знакомиться, как тебя зовут? Напиши свой логин из биллинга.',
self._question('Давай знакомиться, как тебя зовут? Напиши свой логин из биллинга.',
self.question_name) self.question_name)
return True # prevent on_message() from being called on the initial message return True # prevent on_message() from being called on the initial message
@ -68,13 +69,14 @@ class DjingTelebot(helper.ChatHandler):
text = msg['text'].lower() text = msg['text'].lower()
# выполняем комманды если они есть # выполняем комманды если они есть
if text in self.cmds.keys():
if text in list(self.cmds.keys()):
self.cmds[text]() self.cmds[text]()
elif self._dialog_fn is not None: elif self._dialog_fn is not None:
assert callable(self._dialog_fn)
self._dialog_fn(text) self._dialog_fn(text)
self._dialog_fn = None self._dialog_fn = None
else: else:
self._sent_reply(u'Я пока не знаю ответа на это')
self._sent_reply('Я пока не знаю ответа на это')
if not self._message_log(text): if not self._message_log(text):
return return
@ -93,10 +95,10 @@ class DjingTelebot(helper.ChatHandler):
chat_id=self._chat_id chat_id=self._chat_id
) )
except UserProfile.DoesNotExist: except UserProfile.DoesNotExist:
self._question(u'Ты не найден в базе, проверь что правильно указал именно свой ЛОГИН. Попробуй ещё',
self._question('Ты не найден в базе, проверь что правильно указал именно свой ЛОГИН. Попробуй ещё',
self.question_name) self.question_name)
return return
self._sent_reply(u'Да, приятно познакомиться %s, я буду оповещать тебя о событиях в биллинге. Удачной работы ;)'
self._sent_reply('Да, приятно познакомиться %s, я буду оповещать тебя о событиях в биллинге. Удачной работы ;)'
% profile.get_full_name()) % profile.get_full_name())
# заканчивается время диалога # заканчивается время диалога
@ -109,22 +111,25 @@ class DjingTelebot(helper.ChatHandler):
# пингуем адрес # пингуем адрес
def ping(self, ip=None): def ping(self, ip=None):
if ip is None: if ip is None:
self._question(u'Давай пинганём, напиши ip. Нужно будет подождать 10 сек', self.ping)
self._question('Давай пинганём, напиши ip. Нужно будет подождать 10 сек', self.ping)
return return
try: try:
socket.inet_aton(ip) socket.inet_aton(ip)
ret = os.popen('`which ping` -c 10 ' + ip).read() ret = os.popen('`which ping` -c 10 ' + ip).read()
self._sent_reply(ret) self._sent_reply(ret)
except socket.error: except socket.error:
self._question(u'Это не похоже на ip адрес, попробуй ещё', self.ping)
self._question('Это не похоже на ip адрес, попробуй ещё', self.ping)
def say_me(self): def say_me(self):
self._sent_reply(u'Ты ведь %s ?' % self._current_user.get_full_name())
self._sent_reply('Ты ведь %s ?' % self._current_user.get_full_name())
# Просто отправляем текст оповещения указанному админу # Просто отправляем текст оповещения указанному админу
def send_notify(msg_text, account): def send_notify(msg_text, account):
tb = TelegramBot.objects.get(user=account)
tbot = Bot(token)
tbot.sendMessage(tb.chat_id, msg_text)
print(account)
try:
tb = TelegramBot.objects.get(user=account)
tbot = Bot(token)
tbot.sendMessage(tb.chat_id, msg_text)
except TelegramBot.DoesNotExist:
raise ChatException('Цель оповещения не подписан на оповещения')

2
clientsideapp/models.py

@ -1,3 +1,3 @@
from __future__ import unicode_literals
# Create your models here. # Create your models here.

2
clientsideapp/urls.py

@ -1,7 +1,7 @@
# -*- coding:utf-8 -*- # -*- coding:utf-8 -*-
from django.conf.urls import url from django.conf.urls import url
import views
from . import views
urlpatterns = [ urlpatterns = [

12
clientsideapp/views.py

@ -61,21 +61,21 @@ def debt_buy(request, d_id):
try: try:
sure = request.POST.get('sure') sure = request.POST.get('sure')
if sure != 'on': if sure != 'on':
raise LogicError(u'Вы не уверены что хотите оплатить долг?')
raise LogicError('Вы не уверены что хотите оплатить долг?')
if abon.ballance < debt.amount: if abon.ballance < debt.amount:
raise LogicError(u'Не достаточно средств на счету')
raise LogicError('Не достаточно средств на счету')
abon.make_pay(request.user, debt.amount, debt.comment) abon.make_pay(request.user, debt.amount, debt.comment)
debt.set_ok() debt.set_ok()
abon.save(update_fields=['ballance']) abon.save(update_fields=['ballance'])
debt.save(update_fields=['status', 'date_pay']) debt.save(update_fields=['status', 'date_pay'])
return redirect('client_side:debts') return redirect('client_side:debts')
except LogicError, e:
messages.error(request, e.value)
except LogicError as e:
messages.error(request, e)
except NasFailedResult as e: except NasFailedResult as e:
messages.error(request, e.message)
messages.error(request, e)
except NasNetworkError as e: except NasNetworkError as e:
messages.error(request, e.message)
messages.error(request, e)
return render(request, 'clientsideapp/debt_buy.html', { return render(request, 'clientsideapp/debt_buy.html', {
'debt': debt, 'debt': debt,
'amount': debt.amount, 'amount': debt.amount,

2
devapp/admin.py

@ -1,6 +1,6 @@
from django.contrib import admin from django.contrib import admin
import models
from . import models
admin.site.register(models.Device) admin.site.register(models.Device)

2
devapp/apps.py

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from django.apps import AppConfig from django.apps import AppConfig

11
devapp/base_intr.py

@ -3,9 +3,7 @@ from abc import ABCMeta, abstractmethod
from netsnmp import Session, VarList, Varbind from netsnmp import Session, VarList, Varbind
class DevBase(object):
__metaclass__ = ABCMeta
class DevBase(object, metaclass=ABCMeta):
@staticmethod @staticmethod
def description(): def description():
"""Возвращает текстовое описание""" """Возвращает текстовое описание"""
@ -27,9 +25,7 @@ class DevBase(object):
pass pass
class BasePort(object):
__metaclass__ = ABCMeta
class BasePort(object, metaclass=ABCMeta):
def __init__(self, num, name, status, mac, speed): def __init__(self, num, name, status, mac, speed):
self.num = int(num) self.num = int(num)
self.nm = name self.nm = name
@ -50,8 +46,7 @@ class BasePort(object):
return "%x:%x:%x:%x:%x:%x" % (ord(m[0]), ord(m[1]), ord(m[2]), ord(m[3]), ord(m[4]), ord(m[5])) return "%x:%x:%x:%x:%x:%x" % (ord(m[0]), ord(m[1]), ord(m[2]), ord(m[3]), ord(m[4]), ord(m[5]))
class SNMPBaseWorker(object):
__metaclass__ = ABCMeta
class SNMPBaseWorker(object, metaclass=ABCMeta):
ses = None ses = None
def __init__(self, ip, community='public', ver=2): def __init__(self, ip, community='public', ver=2):

10
devapp/dev_types.py

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from mydefs import RuTimedelta, safe_int from mydefs import RuTimedelta, safe_int
from base_intr import DevBase, SNMPBaseWorker, BasePort
from .base_intr import DevBase, SNMPBaseWorker, BasePort
@ -49,7 +49,7 @@ class DLinkDevice(DevBase, SNMPBaseWorker):
@staticmethod @staticmethod
def description(): def description():
return u"Свич D'Link"
return "Свич D'Link"
def reboot(self): def reboot(self):
pass pass
@ -61,13 +61,13 @@ class DLinkDevice(DevBase, SNMPBaseWorker):
speeds = self.get_list(oids['get_ports']['speeds']) speeds = self.get_list(oids['get_ports']['speeds'])
res = [] res = []
ln = len(speeds) ln = len(speeds)
for n in range(0, ln):
for n in range(ln):
status = True if int(stats[n]) == 1 else False status = True if int(stats[n]) == 1 else False
res.append(DLinkPort( res.append(DLinkPort(
n+1, n+1,
nams[n] if len(nams) > 0 else u'не получил имя',
nams[n] if len(nams) > 0 else 'не получил имя',
status, status,
macs[n] if len(macs) > 0 else u'не нашёл мак',
macs[n] if len(macs) > 0 else 'не нашёл мак',
int(speeds[n]) if len(speeds) > 0 else 0, int(speeds[n]) if len(speeds) > 0 else 0,
self)) self))
return res return res

2
devapp/forms.py

@ -1,7 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django import forms from django import forms
import models
from . import models
from mydefs import ip_addr_regex from mydefs import ip_addr_regex

9
devapp/migrations/0001_initial.py

@ -1,6 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2016-06-28 23:51 # Generated by Django 1.9 on 2016-06-28 23:51
from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion
@ -19,10 +18,10 @@ class Migration(migrations.Migration):
name='Device', name='Device',
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('ip_address', mydefs.MyGenericIPAddressField(max_length=8, protocol=b'IPv4')),
('ip_address', mydefs.MyGenericIPAddressField(max_length=8, protocol='ipv4')),
('comment', models.CharField(max_length=256)), ('comment', models.CharField(max_length=256)),
('devtype', ('devtype',
models.CharField(choices=[(b'Dl', "\u0421\u0432\u0438\u0447 D'Link")], default=b'Dl', max_length=2)),
models.CharField(choices=[('Dl', "Свич D'Link")], default='Dl', max_length=2)),
('man_passw', models.CharField(blank=True, max_length=16, null=True)), ('man_passw', models.CharField(blank=True, max_length=16, null=True)),
], ],
), ),
@ -32,7 +31,7 @@ class Migration(migrations.Migration):
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('num', models.PositiveSmallIntegerField(default=0)), ('num', models.PositiveSmallIntegerField(default=0)),
('speed', ('speed',
models.CharField(choices=[(b'h', b'100Mbps'), (b'k', b'1Gbps'), (b'd', b'10Gbps')], default=b'h',
models.CharField(choices=[('h', '100Mbps'), ('k', '1Gbps'), ('d', '10Gbps')], default='h',
max_length=1)), max_length=1)),
('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='devapp.Device')), ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='devapp.Device')),
], ],
@ -47,6 +46,6 @@ class Migration(migrations.Migration):
), ),
migrations.AlterUniqueTogether( migrations.AlterUniqueTogether(
name='port', name='port',
unique_together=set([('device', 'num')]),
unique_together={('device', 'num')},
), ),
] ]

1
devapp/migrations/0002_auto_20160909_1018.py

@ -1,6 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2016-09-09 07:18 # Generated by Django 1.9 on 2016-09-09 07:18
from __future__ import unicode_literals
from django.db import migrations from django.db import migrations

12
devapp/models.py

@ -1,14 +1,14 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.db import models from django.db import models
from base_intr import DevBase
from .base_intr import DevBase
from mydefs import MyGenericIPAddressField, MyChoicesAdapter from mydefs import MyGenericIPAddressField, MyChoicesAdapter
from dev_types import DEVICE_TYPES
from .dev_types import DEVICE_TYPES
class _DeviceChoicesAdapter(MyChoicesAdapter): class _DeviceChoicesAdapter(MyChoicesAdapter):
def __init__(self): def __init__(self):
super(_DeviceChoicesAdapter, self).__init__(DEVICE_TYPES)
super().__init__(DEVICE_TYPES)
class Device(models.Model): class Device(models.Model):
@ -28,15 +28,15 @@ class Device(models.Model):
pass pass
def get_manager_klass(self): def get_manager_klass(self):
klasses = filter(lambda kl: kl[0] == self.devtype, DEVICE_TYPES)
klasses = [kl for kl in DEVICE_TYPES if kl[0] == self.devtype]
if len(klasses) > 0: if len(klasses) > 0:
res = klasses[0][1] res = klasses[0][1]
if issubclass(res, DevBase): if issubclass(res, DevBase):
return res return res
return return
def __unicode__(self):
return u"%s: (%s) %s" % (self.comment, self.get_devtype_display(), self.ip_address)
def __str__(self):
return "%s: (%s) %s" % (self.comment, self.get_devtype_display(), self.ip_address)
class Port(models.Model): class Port(models.Model):

12
devapp/tests.py

@ -1,5 +1,5 @@
from django.test import TestCase from django.test import TestCase
import dev_types
from . import dev_types
class DevTest(TestCase): class DevTest(TestCase):
@ -10,13 +10,13 @@ class DevTest(TestCase):
def snmp(self): def snmp(self):
dev = dev_types.DLinkDevice('10.115.1.105', '<community>', 2) dev = dev_types.DLinkDevice('10.115.1.105', '<community>', 2)
print('DevName:', dev.get_device_name())
print(('DevName:', dev.get_device_name()))
ports = dev.get_ports() ports = dev.get_ports()
print 'gports'
print('gports')
for port in ports: for port in ports:
assert issubclass(port.__class__, dev_types.BasePort) assert issubclass(port.__class__, dev_types.BasePort)
print('\tPort:', port.nm, port.st, port.mac(), port.sp)
print(('\tPort:', port.nm, port.st, port.mac(), port.sp))
# Disable 2 port # Disable 2 port
print ports[1].disable()
print((ports[1].disable()))
# Enable 2 port # Enable 2 port
print ports[1].enable()
print((ports[1].enable()))

2
devapp/urls.py

@ -1,6 +1,6 @@
from django.conf.urls import url from django.conf.urls import url
import views
from . import views
urlpatterns = [ urlpatterns = [

16
devapp/views.py

@ -4,9 +4,9 @@ from django.core.exceptions import PermissionDenied
from django.shortcuts import render, redirect, get_object_or_404 from django.shortcuts import render, redirect, get_object_or_404
from django.contrib import messages from django.contrib import messages
from models import Device
from .models import Device
from mydefs import pag_mn, res_success, res_error, only_admins, ping from mydefs import pag_mn, res_success, res_error, only_admins, ping
from forms import DeviceForm
from .forms import DeviceForm
@login_required @login_required
@ -27,7 +27,7 @@ def devdel(request, did):
get_object_or_404(Device, id=did).delete() get_object_or_404(Device, id=did).delete()
return res_success(request, 'devapp:devs') return res_success(request, 'devapp:devs')
except: except:
return res_error(request, u'Неизвестная ошибка при удалении :(')
return res_error(request, 'Неизвестная ошибка при удалении :(')
@login_required @login_required
@ -47,7 +47,7 @@ def dev(request, devid=0):
frm.save() frm.save()
return redirect('devapp:view', did=devid) return redirect('devapp:view', did=devid)
else: else:
messages.error(request, u'Ошибка в данных, проверте их ещё раз')
messages.error(request, 'Ошибка в данных, проверте их ещё раз')
else: else:
frm = DeviceForm(instance=devinst) frm = DeviceForm(instance=devinst)
@ -70,9 +70,9 @@ def devview(request, did):
uptime = manager.uptime() uptime = manager.uptime()
ports = manager.get_ports() ports = manager.get_ports()
else: else:
messages.warning(request, u'Не указан snmp пароль для устройства')
messages.warning(request, 'Не указан snmp пароль для устройства')
else: else:
messages.error(request, u'Эта точка не пингуется')
messages.error(request, 'Эта точка не пингуется')
return render(request, 'devapp/ports.html', { return render(request, 'devapp/ports.html', {
'dev': dev, 'dev': dev,
@ -96,7 +96,7 @@ def toggle_port(request, did, portid, status=0):
else: else:
ports[portid-1].disable() ports[portid-1].disable()
else: else:
messages.warning(request, u'Не указан snmp пароль для устройства')
messages.warning(request, 'Не указан snmp пароль для устройства')
else: else:
messages.error(request, u'Эта точка не пингуется')
messages.error(request, 'Эта точка не пингуется')
return redirect('devapp:view', did=did) return redirect('devapp:view', did=did)

4
djing/urls.py

@ -1,8 +1,8 @@
from django.conf.urls import url, include from django.conf.urls import url, include
from django.contrib import admin from django.contrib import admin
import settings
from views import home
from . import settings
from .views import home
urlpatterns = [ urlpatterns = [

2
djing/utils/load_from_nodeny.py

@ -24,7 +24,7 @@ if __name__ == "__main__":
'name': res[0], 'name': res[0],
'fio': res[1], 'fio': res[1],
'tel': res[2], 'tel': res[2],
'addr': u"ул. %s д. %s" % (res[3], res[4]),
'addr': "ул. %s д. %s" % (res[3], res[4]),
'birth': int(res[5]), 'birth': int(res[5]),
'grp': int(res[6]) 'grp': int(res[6])
}) })

4
djing/utils/push_snmp_passw.py

@ -21,7 +21,7 @@ def cmd(ip):
tn.write("save config config_id 1\n") tn.write("save config config_id 1\n")
tn.write("log\n") tn.write("log\n")
print(tn.read_all())
print((tn.read_all()))
tn.close() tn.close()
@ -30,7 +30,7 @@ def prc(ip):
if ping(ip): if ping(ip):
cmd(ip) cmd(ip)
except error: except error:
print('Error connect to', ip)
print(('Error connect to', ip))
if __name__ == '__main__': if __name__ == '__main__':

2
djing/utils/save_dot_from_nodeny.py

@ -26,4 +26,4 @@ if __name__ == "__main__":
) )
dev.comment=dt['loc'] dev.comment=dt['loc']
dev.save() dev.save()
print(dt['descr'], dt['loc'], dev)
print((dt['descr'], dt['loc'], dev))

4
djing/utils/save_from_nodeny.py

@ -24,7 +24,7 @@ if __name__ == "__main__":
dt['obj'] = grp dt['obj'] = grp
for dt in dat['users']: for dt in dat['users']:
grp = filter(lambda gr: dt['grp']==gr['gid'], dat['groups'])
grp = [gr for gr in dat['groups'] if dt['grp']==gr['gid']]
grp = grp[0]['obj'] if len(grp)>0 else None grp = grp[0]['obj'] if len(grp)>0 else None
try: try:
abon = Abon.objects.get(username=dt['name']) abon = Abon.objects.get(username=dt['name'])
@ -35,4 +35,4 @@ if __name__ == "__main__":
abon.address=dt['addr'] abon.address=dt['addr']
abon.group=grp abon.group=grp
abon.save() abon.save()
print(abon.username, abon.fio, abon.group)
print((abon.username, abon.fio, abon.group))

2
gmap/apps.py

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from django.apps import AppConfig from django.apps import AppConfig

23
gmap/migrations/0001_initial.py

@ -1,6 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2016-11-30 15:15 # Generated by Django 1.9 on 2016-11-30 15:15
from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion
@ -30,7 +29,7 @@ class Migration(migrations.Migration):
('name', models.CharField(max_length=200)), ('name', models.CharField(max_length=200)),
('latitude', models.CharField(blank=True, max_length=30)), ('latitude', models.CharField(blank=True, max_length=30)),
('longitude', models.CharField(blank=True, max_length=30)), ('longitude', models.CharField(blank=True, max_length=30)),
('platinum', models.BooleanField(default=False, verbose_name=b'Platinum Partner')),
('platinum', models.BooleanField(default=False, verbose_name='Platinum Partner')),
('contact_name', models.CharField(blank=True, max_length=50)), ('contact_name', models.CharField(blank=True, max_length=50)),
('contact_title', models.CharField(blank=True, max_length=50)), ('contact_title', models.CharField(blank=True, max_length=50)),
('airport_name', models.CharField(blank=True, max_length=100)), ('airport_name', models.CharField(blank=True, max_length=100)),
@ -49,35 +48,35 @@ class Migration(migrations.Migration):
name='MarkerCategory', name='MarkerCategory',
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=200, unique=True, verbose_name=b'type')),
('name', models.CharField(max_length=200, unique=True, verbose_name='type')),
('position', models.IntegerField(default=0)), ('position', models.IntegerField(default=0)),
('icon', models.ImageField(blank=True, upload_to=b'gmap-icons/', verbose_name=b'icon')),
('platinum_icon', models.ImageField(blank=True, upload_to=b'gmap-icons/', verbose_name=b'platinum icon')),
('shadow', models.ImageField(blank=True, upload_to=b'gmap-icons/', verbose_name=b'icon shadow')),
('icon', models.ImageField(blank=True, upload_to='gmap-icons/', verbose_name='icon')),
('platinum_icon', models.ImageField(blank=True, upload_to='gmap-icons/', verbose_name='platinum icon')),
('shadow', models.ImageField(blank=True, upload_to='gmap-icons/', verbose_name='icon shadow')),
], ],
), ),
migrations.CreateModel( migrations.CreateModel(
name='MarkerSubCategory', name='MarkerSubCategory',
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=200, unique=True, verbose_name=b'Name')),
('name', models.CharField(max_length=200, unique=True, verbose_name='Name')),
], ],
), ),
migrations.CreateModel( migrations.CreateModel(
name='SalesBoundary', name='SalesBoundary',
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('boundary_code', models.CharField(max_length=75, verbose_name=b'Boundary Code')),
('boundary_code', models.CharField(max_length=75, verbose_name='Boundary Code')),
], ],
), ),
migrations.CreateModel( migrations.CreateModel(
name='SalesDirector', name='SalesDirector',
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=100, unique=True, verbose_name=b'Name')),
('name', models.CharField(max_length=100, unique=True, verbose_name='Name')),
('title', models.CharField(blank=True, max_length=50)), ('title', models.CharField(blank=True, max_length=50)),
('phone', models.CharField(blank=True, max_length=40, verbose_name=b'Phone Number')),
('email', models.EmailField(blank=True, max_length=254, verbose_name=b'Email')),
('phone', models.CharField(blank=True, max_length=40, verbose_name='Phone Number')),
('email', models.EmailField(blank=True, max_length=254, verbose_name='Email')),
('airport_code', models.CharField(blank=True, max_length=8)), ('airport_code', models.CharField(blank=True, max_length=8)),
('airport_name', models.CharField(blank=True, max_length=50)), ('airport_name', models.CharField(blank=True, max_length=50)),
('address', models.TextField(blank=True, max_length=200)), ('address', models.TextField(blank=True, max_length=200)),
@ -110,6 +109,6 @@ class Migration(migrations.Migration):
), ),
migrations.AlterUniqueTogether( migrations.AlterUniqueTogether(
name='salesboundary', name='salesboundary',
unique_together=set([('boundary_code', 'owner')]),
unique_together={('boundary_code', 'owner')},
), ),
] ]

70
gmap/models.py

@ -3,41 +3,41 @@ from django.db import models
from gmap.utils import geolocate from gmap.utils import geolocate
CATEGORY_LOOKUP = {u'1': 'Cirrus Authorized Service Center (ASC)', u'2': 'Cirrus Sales Representative or Center',
u'3': 'Cirrus Training Center (CTC)', u'4': 'Cirrus Standardized Instructor Pilot (CSIP)'}
CATEGORY_LOOKUP = {'1': 'Cirrus Authorized Service Center (ASC)', '2': 'Cirrus Sales Representative or Center',
'3': 'Cirrus Training Center (CTC)', '4': 'Cirrus Standardized Instructor Pilot (CSIP)'}
INVERSE_CATEGORY = dict((v, k) for k, v in CATEGORY_LOOKUP.iteritems())
INVERSE_CATEGORY = dict((v, k) for k, v in CATEGORY_LOOKUP.items())
SUBCATEGORY_LOOKUP = { SUBCATEGORY_LOOKUP = {
u'1': 'Composite & Paint Repair',
u'2': 'Pickup & Delivery Service',
u'3': 'Parts Distributor',
u'4': 'Air Conditioning Service',
u'5': 'Garmin Service',
u'6': 'Avidyne Service',
u'7': 'Full Avionics Facility',
u'8': 'Oxygen Service',
u'9': 'Wi-Fi Equipped',
u'10': 'CAPS Overhaul',
u'11': 'Cirrus Platinum Service Partner',
u'12': 'Ice Protection System Maintenance',
u'13': 'SR20 Rental',
u'14': 'SR22 Rental',
u'15': 'SR22T Rental',
u'16': 'Cirrus Perspective Avionics Available',
u'17': 'Avidyne Entegra Avionics Available',
u'18': 'Cirrus Platinum Training Partner',
u'19': 'Simulator Available',
u'20': 'Cirrus Perspective Qualified',
u'21': 'Avidyne Entegra Qualified',
u'22': 'New Cirrus Sales',
u'23': 'Used Cirrus Sales',
u'24': 'n/a'
'1': 'Composite & Paint Repair',
'2': 'Pickup & Delivery Service',
'3': 'Parts Distributor',
'4': 'Air Conditioning Service',
'5': 'Garmin Service',
'6': 'Avidyne Service',
'7': 'Full Avionics Facility',
'8': 'Oxygen Service',
'9': 'Wi-Fi Equipped',
'10': 'CAPS Overhaul',
'11': 'Cirrus Platinum Service Partner',
'12': 'Ice Protection System Maintenance',
'13': 'SR20 Rental',
'14': 'SR22 Rental',
'15': 'SR22T Rental',
'16': 'Cirrus Perspective Avionics Available',
'17': 'Avidyne Entegra Avionics Available',
'18': 'Cirrus Platinum Training Partner',
'19': 'Simulator Available',
'20': 'Cirrus Perspective Qualified',
'21': 'Avidyne Entegra Qualified',
'22': 'New Cirrus Sales',
'23': 'Used Cirrus Sales',
'24': 'n/a'
} }
INVERSE_SUBCATEGORY = dict((v, k) for k, v in SUBCATEGORY_LOOKUP.iteritems())
INVERSE_SUBCATEGORY = dict((v, k) for k, v in SUBCATEGORY_LOOKUP.items())
# name, category, platinum partner, contacT_name, contact_title, airport_name, airport_code, address, phone, fax, email, url, sub_category1, ..., sub_categoryN # name, category, platinum partner, contacT_name, contact_title, airport_name, airport_code, address, phone, fax, email, url, sub_category1, ..., sub_categoryN
@ -60,7 +60,7 @@ class SalesBoundary(models.Model):
class Meta: class Meta:
unique_together = ("boundary_code", "owner") unique_together = ("boundary_code", "owner")
def __unicode__(self):
def __str__(self):
return self.boundary_code return self.boundary_code
@ -146,7 +146,7 @@ class SalesDirector(models.Model):
# Ask django really, really nicely not to insert our object twice # Ask django really, really nicely not to insert our object twice
self.save() self.save()
def __unicode__(self):
def __str__(self):
return self.name return self.name
@ -166,7 +166,7 @@ class MarkerCategory(models.Model):
def natural_key(self): def natural_key(self):
return self.name return self.name
def __unicode__(self):
def __str__(self):
return self.name return self.name
@ -177,7 +177,7 @@ class MarkerSubCategory(models.Model):
def natural_key(self): def natural_key(self):
return self.name return self.name
def __unicode__(self):
def __str__(self):
return self.name return self.name
@ -198,7 +198,7 @@ class CountryISOCode(models.Model):
def natural_key(self): def natural_key(self):
return self.long_name return self.long_name
def __unicode__(self):
def __str__(self):
return self.long_name return self.long_name
@ -237,9 +237,9 @@ class MapMarker(models.Model):
else: else:
raise GeolocateFailure("Failed to geolocate address for %s" % self.name, full_address) raise GeolocateFailure("Failed to geolocate address for %s" % self.name, full_address)
super(MapMarker, self).save(*args, **kwargs)
super().save(*args, **kwargs)
def __unicode__(self):
def __str__(self):
return self.name return self.name
def from_csv(self, row, row_id, errors): def from_csv(self, row, row_id, errors):

26
gmap/utils.py

@ -1,15 +1,15 @@
import json import json
import urllib
import urllib2
import urllib.request, urllib.parse, urllib.error
import urllib.request, urllib.error, urllib.parse
import csv import csv
import codecs import codecs
import cStringIO
import io
def csvByLine(csvFile, lineHandler): def csvByLine(csvFile, lineHandler):
errors = '' errors = ''
for row_id, line in enumerate(UnicodeReader(csvFile)): for row_id, line in enumerate(UnicodeReader(csvFile)):
print "Calling Line handler for %s" % line
print(("Calling Line handler for %s" % line))
errors = ''.join([errors, lineHandler(line)]) errors = ''.join([errors, lineHandler(line)])
return errors return errors
@ -28,8 +28,8 @@ def geolocate(location, sensor=False):
""" """
sensor = str(sensor).lower() sensor = str(sensor).lower()
url = "http://maps.googleapis.com/maps/api/geocode/json?" url = "http://maps.googleapis.com/maps/api/geocode/json?"
url += urllib.urlencode({'address': location, 'sensor': sensor})
data = urllib2.urlopen(url).read()
url += urllib.parse.urlencode({'address': location, 'sensor': sensor})
data = urllib.request.urlopen(url).read()
data = json.loads(data) data = json.loads(data)
if data and data['status'] == 'OK': if data and data['status'] == 'OK':
return ({ return ({
@ -43,10 +43,10 @@ def geolocate(location, sensor=False):
def georeverse(lat, lon): def georeverse(lat, lon):
# construct url for reverse geocoding with google-maps # construct url for reverse geocoding with google-maps
url = "http://maps.googleapis.com/maps/api/geocode/json?" url = "http://maps.googleapis.com/maps/api/geocode/json?"
url += urllib.urlencode({'latlng': lat + ',' + lon, 'sensor': 'false'})
url += urllib.parse.urlencode({'latlng': lat + ',' + lon, 'sensor': 'false'})
# retrieve and load google-map data # retrieve and load google-map data
data = urllib2.urlopen(url).read()
data = urllib.request.urlopen(url).read()
data = json.loads(data) data = json.loads(data)
# if request goes through, return the state and country of the location # if request goes through, return the state and country of the location
@ -89,7 +89,7 @@ class UTF8Recoder:
def __iter__(self): def __iter__(self):
return self return self
def next(self):
def __next__(self):
# return self.reader.next().decode("cp1252").encode("utf-8") # return self.reader.next().decode("cp1252").encode("utf-8")
return self.reader.next().encode("utf-8") return self.reader.next().encode("utf-8")
@ -105,9 +105,9 @@ class UnicodeReader:
f = UTF8Recoder(f, encoding) f = UTF8Recoder(f, encoding)
self.reader = csv.reader(f, dialect=dialect, **kwds) self.reader = csv.reader(f, dialect=dialect, **kwds)
def next(self):
row = self.reader.next()
return [unicode(s, "utf-8") for s in row]
def __next__(self):
row = next(self.reader)
return [str(s, "utf-8") for s in row]
def __iter__(self): def __iter__(self):
return self return self
@ -121,7 +121,7 @@ class UnicodeWriter:
def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
# Redirect output to a queue # Redirect output to a queue
self.queue = cStringIO.StringIO()
self.queue = io.StringIO()
self.writer = csv.writer(self.queue, dialect=dialect, **kwds) self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
self.stream = f self.stream = f
self.encoder = codecs.getincrementalencoder(encoding)() self.encoder = codecs.getincrementalencoder(encoding)()

4
gmap/views.py

@ -103,7 +103,7 @@ def gmap_search(request):
def dump_csv(request): def dump_csv(request):
all_markers = MapMarker.objects.all() all_markers = MapMarker.objects.all()
print '# markers: ', len(all_markers)
print(('# markers: ', len(all_markers)))
# all_markers should now have all the things... # all_markers should now have all the things...
response = HttpResponse(mimetype='text/csv') response = HttpResponse(mimetype='text/csv')
@ -179,7 +179,7 @@ def process_row(row_id, row, errors):
def read_csv(request): def read_csv(request):
if request.method == 'POST' and request.FILES.has_key('datafile'):
if request.method == 'POST' and 'datafile' in request.FILES:
# it's conceivable the user could upload a file large enough # it's conceivable the user could upload a file large enough
# it gets split into chunks - to handle this we just direct all # it gets split into chunks - to handle this we just direct all

2
ip_pool/admin.py

@ -1,6 +1,6 @@
from django.contrib import admin from django.contrib import admin
import models
from . import models
admin.site.register(models.IpPoolItem) admin.site.register(models.IpPoolItem)

2
ip_pool/apps.py

@ -3,4 +3,4 @@ from django.apps import AppConfig
class IpPoolConfig(AppConfig): class IpPoolConfig(AppConfig):
name = 'ip_pool' name = 'ip_pool'
verbose_name = u"Ip pool"
verbose_name = "Ip pool"

8
ip_pool/forms.py

@ -5,17 +5,17 @@ from mydefs import ip_addr_regex
class PoolForm(forms.Form): class PoolForm(forms.Form):
start_ip = forms.GenericIPAddressField(protocol='IPv4', widget=forms.TextInput(attrs={
start_ip = forms.GenericIPAddressField(protocol='ipv4', widget=forms.TextInput(attrs={
'pattern': ip_addr_regex, 'pattern': ip_addr_regex,
'placeholder': u'127.0.0.1',
'placeholder': '127.0.0.1',
'id': 'start_ip', 'id': 'start_ip',
'class': 'form-control', 'class': 'form-control',
'required': '' 'required': ''
}), required=True) }), required=True)
end_ip = forms.GenericIPAddressField(protocol='IPv4', widget=forms.TextInput(attrs={
end_ip = forms.GenericIPAddressField(protocol='ipv4', widget=forms.TextInput(attrs={
'pattern': ip_addr_regex, 'pattern': ip_addr_regex,
'placeholder': u'127.0.0.1',
'placeholder': '127.0.0.1',
'id': 'end_ip', 'id': 'end_ip',
'class': 'form-control', 'class': 'form-control',
'required': '' 'required': ''

3
ip_pool/migrations/0001_initial.py

@ -1,6 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2016-06-28 23:51 # Generated by Django 1.9 on 2016-06-28 23:51
from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
@ -18,7 +17,7 @@ class Migration(migrations.Migration):
name='IpPoolItem', name='IpPoolItem',
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('ip', mydefs.MyGenericIPAddressField(max_length=8, protocol=b'IPv4')),
('ip', mydefs.MyGenericIPAddressField(max_length=8, protocol='ipv4')),
], ],
), ),
] ]

6
ip_pool/models.py

@ -29,9 +29,9 @@ class IpPoolItemManager(models.Manager):
end_ip = ip2int(end_ip) end_ip = ip2int(end_ip)
if (end_ip - start_ip) > 5000: if (end_ip - start_ip) > 5000:
raise Exception(u'Not add over 5000 ip\'s')
raise Exception('Not add over 5000 ip\'s')
sql_strs = map(lambda tip: r"(%d)" % tip, range(start_ip, end_ip + 1))
sql_strs = [r"(%d)" % tip for tip in range(start_ip, end_ip + 1)]
sql = r'INSERT INTO ip_pool_ippoolitem (ip) VALUES %s' % r",".join(sql_strs) sql = r'INSERT INTO ip_pool_ippoolitem (ip) VALUES %s' % r",".join(sql_strs)
cursor = connection.cursor() cursor = connection.cursor()
@ -55,5 +55,5 @@ class IpPoolItem(models.Model):
def int_ip(self): def int_ip(self):
return ip2int(self.ip) return ip2int(self.ip)
def __unicode__(self):
def __str__(self):
return self.ip return self.ip

2
ip_pool/urls.py

@ -1,7 +1,7 @@
# -*- coding:utf-8 -*- # -*- coding:utf-8 -*-
from django.conf.urls import url from django.conf.urls import url
import views
from . import views
urlpatterns = [ urlpatterns = [

8
ip_pool/views.py

@ -3,8 +3,8 @@ from django.contrib.auth.decorators import login_required, permission_required
from django.shortcuts import render, redirect, get_object_or_404 from django.shortcuts import render, redirect, get_object_or_404
from django.contrib import messages from django.contrib import messages
from forms import PoolForm
from models import IpPoolItem
from .forms import PoolForm
from .models import IpPoolItem
import mydefs import mydefs
@ -14,7 +14,7 @@ def home(request):
pools = IpPoolItem.objects.get_pools() pools = IpPoolItem.objects.get_pools()
if pools: if pools:
pools = map(lambda ip: (mydefs.int2ip(ip[0]), mydefs.int2ip(ip[1]), ip[2]), pools)
pools = [(mydefs.int2ip(ip[0]), mydefs.int2ip(ip[1]), ip[2]) for ip in pools]
pools = mydefs.pag_mn(request, pools) pools = mydefs.pag_mn(request, pools)
return render(request, 'ip_pool/index.html', { return render(request, 'ip_pool/index.html', {
@ -65,7 +65,7 @@ def add_pool(request):
IpPoolItem.objects.add_pool(cd['start_ip'], cd['end_ip']) IpPoolItem.objects.add_pool(cd['start_ip'], cd['end_ip'])
return redirect('ip_pool:home') return redirect('ip_pool:home')
else: else:
messages.error(request, u'Исправьте ошибки')
messages.error(request, 'Исправьте ошибки')
else: else:
frm = PoolForm() frm = PoolForm()
return render(request, 'ip_pool/add_pool.html', { return render(request, 'ip_pool/add_pool.html', {

2
manage.py

@ -1,4 +1,4 @@
#!/usr/bin/env python2
#!/usr/bin/env python3
import os import os
import sys import sys

33
mydefs.py

@ -73,13 +73,13 @@ def pag_mn(request, objs, count_per_page=PAGINATION_ITEMS_PER_PAGE):
class MyGenericIPAddressField(models.GenericIPAddressField): class MyGenericIPAddressField(models.GenericIPAddressField):
description = "Int32 notation ip address" description = "Int32 notation ip address"
def __init__(self, protocol='IPv4', *args, **kwargs):
super(MyGenericIPAddressField, self).__init__(protocol=protocol, *args, **kwargs)
def __init__(self, protocol='ipv4', *args, **kwargs):
super().__init__(protocol=protocol, *args, **kwargs)
self.max_length = 8 self.max_length = 8
def get_prep_value(self, value): def get_prep_value(self, value):
# strIp to Int # strIp to Int
value = super(models.GenericIPAddressField, self).get_prep_value(value)
value = super().get_prep_value(value)
return ip2int(value) return ip2int(value)
def to_python(self, addr): def to_python(self, addr):
@ -106,7 +106,7 @@ class MyChoicesAdapter(Iterator):
self._max_index = len(choices) self._max_index = len(choices)
self.chs = choices self.chs = choices
def next(self):
def __next__(self):
if self.current_index >= self._max_index: if self.current_index >= self._max_index:
raise StopIteration raise StopIteration
else: else:
@ -121,19 +121,19 @@ class MyChoicesAdapter(Iterator):
# через get должно быть передано order_by=<поле в бд> а в dir=<up|down> направление сортировки # через get должно быть передано order_by=<поле в бд> а в dir=<up|down> направление сортировки
# возвращает новое направление сортировки и поле для сортировки с направлением # возвращает новое направление сортировки и поле для сортировки с направлением
def order_helper(request): def order_helper(request):
dir = request.GET.get('dir')
dr = request.GET.get('dir')
dfx = '' dfx = ''
if dir == 'down':
dir = 'up'
if dr == 'down':
dr = 'up'
dfx = '-' dfx = '-'
else: else:
dir = 'down'
dr = 'down'
orby = request.GET.get('order_by') orby = request.GET.get('order_by')
if orby: if orby:
return dir, dfx + orby
return dr, dfx + orby
else: else:
return dir, orby
return dr, orby
# Декоратор проверяет аккаунт, чтоб не пускать клиентов в страницы администрации # Декоратор проверяет аккаунт, чтоб не пускать клиентов в страницы администрации
@ -155,10 +155,7 @@ def ping(hostname):
# Русифицированный вывод timedelta # Русифицированный вывод timedelta
class RuTimedelta(timedelta): class RuTimedelta(timedelta):
def __init__(self, *args, **kwargs):
super(RuTimedelta, self).__init__(*args, **kwargs)
def __unicode__(self):
def __str__(self):
hours, remainder = divmod(self.seconds, 3600) hours, remainder = divmod(self.seconds, 3600)
minutes, seconds = divmod(remainder, 60) minutes, seconds = divmod(remainder, 60)
text_date = "%d:%d:%d" % ( text_date = "%d:%d:%d" % (
@ -167,10 +164,10 @@ class RuTimedelta(timedelta):
seconds seconds
) )
if self.days > 1: if self.days > 1:
ru_days = u'дней'
ru_days = 'дней'
if 5 > self.days > 1: if 5 > self.days > 1:
ru_days = u'дня'
ru_days = 'дня'
elif self.days == 1: elif self.days == 1:
ru_days = u'день'
text_date = u'%d %s %s' % (self.days, ru_days, text_date)
ru_days = 'день'
text_date = '%d %s %s' % (self.days, ru_days, text_date)
return text_date return text_date

2
photo_app/admin.py

@ -1,6 +1,6 @@
from django.contrib import admin from django.contrib import admin
import models
from . import models
admin.site.register(models.Photo) admin.site.register(models.Photo)

5
photo_app/migrations/0001_initial.py

@ -1,6 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2016-06-28 23:51 # Generated by Django 1.9 on 2016-06-28 23:51
from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
@ -16,8 +15,8 @@ class Migration(migrations.Migration):
name='Photo', name='Photo',
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('image', models.ImageField(height_field=b'heigt', upload_to=b'', width_field=b'wdth')),
('wdth', models.PositiveSmallIntegerField(blank=True, default=b'759', editable=False, null=True)),
('image', models.ImageField(height_field='heigt', upload_to='', width_field='wdth')),
('wdth', models.PositiveSmallIntegerField(blank=True, default='759', editable=False, null=True)),
('heigt', models.PositiveSmallIntegerField(blank=True, editable=False, null=True)), ('heigt', models.PositiveSmallIntegerField(blank=True, editable=False, null=True)),
], ],
), ),

6
photo_app/models.py

@ -14,7 +14,7 @@ class Photo(models.Model):
wdth = models.PositiveSmallIntegerField(null=True, blank=True, editable=False, default="759") wdth = models.PositiveSmallIntegerField(null=True, blank=True, editable=False, default="759")
heigt = models.PositiveSmallIntegerField(null=True, blank=True, editable=False) heigt = models.PositiveSmallIntegerField(null=True, blank=True, editable=False)
def __unicode__(self):
def __str__(self):
return "{0}".format(self.image) return "{0}".format(self.image)
def big(self): def big(self):
@ -28,7 +28,7 @@ class Photo(models.Model):
if not self.image: if not self.image:
return return
super(Photo, self).save()
super().save()
im = Image.open(self.image.path) im = Image.open(self.image.path)
im.thumbnail((759, 759), Image.ANTIALIAS) im.thumbnail((759, 759), Image.ANTIALIAS)
@ -40,7 +40,7 @@ class Photo(models.Model):
im.save(fname) im.save(fname)
os.remove(self.image.path) os.remove(self.image.path)
self.image = "%s.%s" % (hs, ext) self.image = "%s.%s" % (hs, ext)
super(Photo, self).save()
super().save()
# class Meta: # class Meta:

2
privatemessage/admin.py

@ -1,6 +1,6 @@
from django.contrib import admin from django.contrib import admin
from models import PrivateMessages, Dialog
from .models import PrivateMessages, Dialog
admin.site.register(PrivateMessages) admin.site.register(PrivateMessages)

2
privatemessage/context_processors.py

@ -1,4 +1,4 @@
from models import PrivateMessages
from .models import PrivateMessages
def avail_messages(request): def avail_messages(request):

1
privatemessage/migrations/0001_initial.py

@ -1,6 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2016-06-28 23:51 # Generated by Django 1.9 on 2016-06-28 23:51
from __future__ import unicode_literals
from django.conf import settings from django.conf import settings
from django.db import migrations, models from django.db import migrations, models

4
privatemessage/models.py

@ -17,7 +17,7 @@ class Dialog(models.Model):
recepient = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='+') recepient = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='+')
date_create = models.DateTimeField(auto_now_add=True) date_create = models.DateTimeField(auto_now_add=True)
def __unicode__(self):
def __str__(self):
return self.title return self.title
@ -29,5 +29,5 @@ class PrivateMessages(models.Model):
objects = MessagesManager() objects = MessagesManager()
def __unicode__(self):
def __str__(self):
return self.text return self.text

2
privatemessage/tests.py

@ -1,7 +1,7 @@
from django.test import TestCase from django.test import TestCase
from django.contrib.auth.models import User from django.contrib.auth.models import User
import models
from . import models
class PaysTest(TestCase): class PaysTest(TestCase):

2
privatemessage/urls.py

@ -1,6 +1,6 @@
from django.conf.urls import url from django.conf.urls import url
import views
from . import views
urlpatterns = [ urlpatterns = [

10
privatemessage/views.py

@ -8,7 +8,7 @@ from django.http import HttpResponse
from django.template.context_processors import csrf from django.template.context_processors import csrf
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from models import PrivateMessages
from .models import PrivateMessages
import mydefs import mydefs
@ -24,13 +24,13 @@ def home(request):
@login_required @login_required
@mydefs.only_admins @mydefs.only_admins
def delitem(request, id=0): def delitem(request, id=0):
r = {'errnum': 0, 'errtext': u''}
r = {'errnum': 0, 'errtext': ''}
try: try:
PrivateMessages.objects.get(id=id).delete() PrivateMessages.objects.get(id=id).delete()
except PrivateMessages.DoesNotExist: except PrivateMessages.DoesNotExist:
r = { r = {
'errnum': 1, 'errnum': 1,
'errtext': u'Error while deleting, item does not exist'
'errtext': 'Error while deleting, item does not exist'
} }
return HttpResponse(dumps(r)) return HttpResponse(dumps(r))
@ -55,6 +55,6 @@ def send_message(request):
msg.save() msg.save()
return redirect('privmsg:home') return redirect('privmsg:home')
except UserModel.DoesNotExist: except UserModel.DoesNotExist:
return mydefs.res_error(request, u'Адресат не найден')
return mydefs.res_error(request, 'Адресат не найден')
else: else:
return mydefs.res_error(request, u'Ошибка типа запроса')
return mydefs.res_error(request, 'Ошибка типа запроса')

1
requirements.txt

@ -2,3 +2,4 @@ Django==1.9
Pillow Pillow
MySQL-python MySQL-python
telepot telepot
python3-netsnmp

2
searchapp/apps.py

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from django.apps import AppConfig from django.apps import AppConfig

2
searchapp/models.py

@ -1,3 +1,3 @@
from __future__ import unicode_literals
# Create your models here. # Create your models here.

2
searchapp/urls.py

@ -1,6 +1,6 @@
from django.conf.urls import url from django.conf.urls import url
import views
from . import views
urlpatterns = [ urlpatterns = [

2
statistics/admin.py

@ -1,6 +1,6 @@
from django.contrib import admin from django.contrib import admin
import models
from . import models
admin.site.register(models.StatElem) admin.site.register(models.StatElem)

5
statistics/migrations/0001_initial.py

@ -1,6 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2016-06-28 23:51 # Generated by Django 1.9 on 2016-06-28 23:51
from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
@ -18,8 +17,8 @@ class Migration(migrations.Migration):
name='StatElem', name='StatElem',
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('src_ip', mydefs.MyGenericIPAddressField(max_length=8, protocol=b'IPv4')),
('dst_ip', mydefs.MyGenericIPAddressField(max_length=8, protocol=b'IPv4')),
('src_ip', mydefs.MyGenericIPAddressField(max_length=8, protocol='ipv4')),
('dst_ip', mydefs.MyGenericIPAddressField(max_length=8, protocol='ipv4')),
('proto', models.PositiveSmallIntegerField(default=0)), ('proto', models.PositiveSmallIntegerField(default=0)),
('src_port', models.PositiveIntegerField(default=0)), ('src_port', models.PositiveIntegerField(default=0)),
('dst_port', models.PositiveIntegerField(default=0)), ('dst_port', models.PositiveIntegerField(default=0)),

2
statistics/models.py

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from django.db import models from django.db import models

2
statistics/urls.py

@ -1,6 +1,6 @@
from django.conf.urls import url from django.conf.urls import url
import views
from . import views
urlpatterns = [ urlpatterns = [

2
tariff_app/admin.py

@ -1,6 +1,6 @@
from django.contrib import admin from django.contrib import admin
import models
from . import models
admin.site.register(models.Tariff) admin.site.register(models.Tariff)

6
tariff_app/base_intr.py

@ -3,11 +3,7 @@ from abc import ABCMeta, abstractmethod
# from abonapp import Abon # from abonapp import Abon
class TariffBase:
__metaclass__ = ABCMeta
# Принимает на вход:
# abon_tariff - models.AbonTariff object
class TariffBase(metaclass=ABCMeta):
@abstractmethod @abstractmethod
def calc_amount(self, abon_tariff): def calc_amount(self, abon_tariff):
"""Считает итоговую сумму платежа""" """Считает итоговую сумму платежа"""

8
tariff_app/custom_tariffs.py

@ -3,7 +3,7 @@ from datetime import datetime, timedelta
from django.utils import timezone from django.utils import timezone
from base_intr import TariffBase
from .base_intr import TariffBase
# from abonapp import AbonTariff # from abonapp import AbonTariff
@ -33,7 +33,7 @@ class TariffDefault(TariffBase):
@staticmethod @staticmethod
def description(): def description():
return u'Базовый расчётный функционал'
return 'Базовый расчётный функционал'
class TariffDp(TariffBase): class TariffDp(TariffBase):
@ -45,7 +45,7 @@ class TariffDp(TariffBase):
@staticmethod @staticmethod
def description(): def description():
return u'Как в IS'
return 'Как в IS'
class TariffCp(TariffBase): class TariffCp(TariffBase):
@ -54,7 +54,7 @@ class TariffCp(TariffBase):
@staticmethod @staticmethod
def description(): def description():
return u'Пользовательский'
return 'Пользовательский'
# Первый - всегда по умолчанию # Первый - всегда по умолчанию

2
tariff_app/forms.py

@ -1,6 +1,6 @@
from django import forms from django import forms
import models
from . import models
class TariffForm(forms.ModelForm): class TariffForm(forms.ModelForm):

10
tariff_app/migrations/0001_initial.py

@ -1,6 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2016-06-28 23:51 # Generated by Django 1.9 on 2016-06-28 23:51
from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
@ -21,11 +20,10 @@ class Migration(migrations.Migration):
('speedOut', models.FloatField(default=0.0)), ('speedOut', models.FloatField(default=0.0)),
('amount', models.FloatField(default=0.0)), ('amount', models.FloatField(default=0.0)),
('time_of_action', models.IntegerField(default=30)), ('time_of_action', models.IntegerField(default=30)),
('calc_type', models.CharField(choices=[(b'Df',
'\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u0440\u0430\u0441\u0447\u0451\u0442\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b'),
(b'Dp', '\u041a\u0430\u043a \u0432 IS'), (b'Cp',
'\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439')],
default=b'Df', max_length=2)),
('calc_type', models.CharField(choices=[('Df', 'Базовый расчётный функционал'),
('Dp', 'Как в IS'),
('Cp', 'Пользовательский')],
default='Df', max_length=2)),
], ],
), ),
] ]

1
tariff_app/migrations/0002_tariff_descr.py

@ -1,6 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2016-10-25 22:54 # Generated by Django 1.9 on 2016-10-25 22:54
from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models

10
tariff_app/models.py

@ -1,7 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.db import models from django.db import models
from custom_tariffs import TariffBase, TARIFF_CHOICES
from .custom_tariffs import TariffBase, TARIFF_CHOICES
from mydefs import MyChoicesAdapter from mydefs import MyChoicesAdapter
@ -10,7 +10,7 @@ from mydefs import MyChoicesAdapter
class _TariffChoicesAdapter(MyChoicesAdapter): class _TariffChoicesAdapter(MyChoicesAdapter):
# На вход принимает кортеж кортежей, вложенный из 2х элементов: кода и класса, как: TARIFF_CHOICES # На вход принимает кортеж кортежей, вложенный из 2х элементов: кода и класса, как: TARIFF_CHOICES
def __init__(self): def __init__(self):
super(_TariffChoicesAdapter, self).__init__(TARIFF_CHOICES)
super().__init__(TARIFF_CHOICES)
class Tariff(models.Model): class Tariff(models.Model):
@ -24,11 +24,11 @@ class Tariff(models.Model):
# Возвращает потомок класса TariffBase, методы которого дают нужную логику оплаты по тарифу # Возвращает потомок класса TariffBase, методы которого дают нужную логику оплаты по тарифу
def get_calc_type(self): def get_calc_type(self):
ob = filter(lambda TC: TC[0] == self.calc_type, TARIFF_CHOICES)
ob = [TC for TC in TARIFF_CHOICES if TC[0] == self.calc_type]
if len(ob) > 0: if len(ob) > 0:
res_type = ob[0][1] res_type = ob[0][1]
assert issubclass(res_type, TariffBase) assert issubclass(res_type, TariffBase)
return res_type() return res_type()
def __unicode__(self):
return u"%s (%f)" % (self.title, self.amount)
def __str__(self):
return "%s (%f)" % (self.title, self.amount)

2
tariff_app/urls.py

@ -1,6 +1,6 @@
from django.conf.urls import url from django.conf.urls import url
import views
from . import views
urlpatterns = [ urlpatterns = [

6
tariff_app/views.py

@ -4,9 +4,9 @@ from django.shortcuts import render, get_object_or_404, redirect
from django.contrib import messages from django.contrib import messages
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from models import Tariff
from .models import Tariff
import mydefs import mydefs
import forms
from . import forms
@login_required @login_required
@ -45,7 +45,7 @@ def edit_tarif(request, tarif_id=0):
frm.save() frm.save()
return redirect('tarifs:home') return redirect('tarifs:home')
else: else:
messages.warning(request, u'Не все поля заполнены правильно, проверте и попробуйте ещё раз')
messages.warning(request, 'Не все поля заполнены правильно, проверте и попробуйте ещё раз')
else: else:
if tarif_id == 0: if tarif_id == 0:
tarif = Tariff() tarif = Tariff()

2
taskapp/admin.py

@ -1,6 +1,6 @@
from django.contrib import admin from django.contrib import admin
import models
from . import models
admin.site.register(models.Task) admin.site.register(models.Task)

4
taskapp/forms.py

@ -1,7 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from datetime import datetime, timedelta from datetime import datetime, timedelta
from django import forms from django import forms
from models import Task
from .models import Task
class TaskFrm(forms.ModelForm): class TaskFrm(forms.ModelForm):
@ -11,7 +11,7 @@ class TaskFrm(forms.ModelForm):
exclude = ['time_of_create', 'author', 'recipients', 'device'] exclude = ['time_of_create', 'author', 'recipients', 'device']
widgets = { widgets = {
'descr': forms.TextInput(attrs={ 'descr': forms.TextInput(attrs={
'placeholder': u'Краткое описание',
'placeholder': 'Краткое описание',
'class': "form-control", 'class': "form-control",
'autofocus': '' 'autofocus': ''
}), }),

52
taskapp/handle.py

@ -1,27 +1,35 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from chatbot.telebot import send_notify from chatbot.telebot import send_notify
from chatbot.models import ChatException
class TaskException(Exception):
pass
def handle(task, author, recipient, abon_group): def handle(task, author, recipient, abon_group):
dst_account = recipient
text = u'Задача'
# Если сигнал самому себе то молчим
if author == recipient:
return
# Если задача 'На выполнении' то молчим
if task.state == b'C':
return
# Если задача завершена
elif task.state == b'F':
text = u'Задача завершена'
# Меняем телефон назначения на телефон автора, т.к. при завершении
# идёт оповещение автору о выполнении
dst_account = author
fulltext=u"%s: %s. " % (text, task.abon.get_full_name())
if task.abon:
fulltext += u"по адресу %s тел. %s. " % (
task.abon.address, task.abon.telephone
)
fulltext += u"с. %s. Тип задачи - %s. " % (abon_group.title, task.get_mode_display())
fulltext += task.descr if task.descr else u'<без описания>'
send_notify(fulltext, dst_account)
try:
dst_account = recipient
text = 'Задача'
# Если сигнал самому себе то молчим
if author == recipient:
return
# Если задача 'На выполнении' то молчим
if task.state == 'C':
return
# Если задача завершена
elif task.state == 'F':
text = 'Задача завершена'
# Меняем телефон назначения на телефон автора, т.к. при завершении
# идёт оповещение автору о выполнении
dst_account = author
fulltext="%s: %s. " % (text, task.abon.get_full_name())
if task.abon:
fulltext += "по адресу %s тел. %s. " % (
task.abon.address, task.abon.telephone
)
fulltext += "с. %s. Тип задачи - %s. " % (abon_group.title, task.get_mode_display())
fulltext += task.descr if task.descr else '<без описания>'
send_notify(fulltext, dst_account)
except ChatException as e:
raise TaskException(e)

3
taskapp/migrations/0001_initial.py

@ -1,6 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2016-09-09 07:18 # Generated by Django 1.9 on 2016-09-09 07:18
from __future__ import unicode_literals
import taskapp.models import taskapp.models
from django.conf import settings from django.conf import settings
@ -23,7 +22,7 @@ class Migration(migrations.Migration):
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('descr', models.CharField(max_length=128)), ('descr', models.CharField(max_length=128)),
('priority', models.CharField(choices=[(b'A', '\u0412\u044b\u0441\u0448\u0438\u0439'), (b'B', '\u0412\u044b\u0448\u0435 \u0441\u0440\u0435\u0434\u043d\u0435\u0433\u043e'), (b'C', '\u0421\u0440\u0435\u0434\u043d\u0438\u0439'), (b'D', '\u041d\u0438\u0436\u0435 \u0441\u0440\u0435\u0434\u043d\u0435\u0433\u043e'), (b'E', '\u041d\u0438\u0437\u043a\u0438\u0439')], default=b'C', max_length=1)),
('priority', models.CharField(choices=[('A', 'Высший'), ('B', 'Выше среднего'), ('C', 'Средний'), ('D', 'Ниже среднего'), ('E', 'Низкий')], default='C', max_length=1)),
('out_date', models.DateField(blank=True, default=taskapp.models._delta_add_days, null=True)), ('out_date', models.DateField(blank=True, default=taskapp.models._delta_add_days, null=True)),
('time_of_create', models.DateTimeField(auto_now_add=True)), ('time_of_create', models.DateTimeField(auto_now_add=True)),
('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to=settings.AUTH_USER_MODEL)), ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to=settings.AUTH_USER_MODEL)),

3
taskapp/migrations/0002_auto_20161006_0027.py

@ -1,6 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2016-10-05 21:27 # Generated by Django 1.9 on 2016-10-05 21:27
from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
@ -19,6 +18,6 @@ class Migration(migrations.Migration):
migrations.AddField( migrations.AddField(
model_name='task', model_name='task',
name='state', name='state',
field=models.CharField(choices=[(b'S', '\u041d\u043e\u0432\u0430\u044f'), (b'C', '\u041d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438'), (b'F', '\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430')], default=b'S', max_length=1),
field=models.CharField(choices=[('S', 'Новая'), ('C', 'На выполнении'), ('F', 'Выполнена')], default='S', max_length=1),
) )
] ]

1
taskapp/migrations/0003_auto_20161130_1815.py

@ -1,6 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2016-11-30 15:15 # Generated by Django 1.9 on 2016-11-30 15:15
from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models

3
taskapp/migrations/0004_auto_20161202_1230.py

@ -1,6 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2016-12-02 09:30 # Generated by Django 1.9 on 2016-12-02 09:30
from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
@ -15,6 +14,6 @@ class Migration(migrations.Migration):
migrations.AddField( migrations.AddField(
model_name='task', model_name='task',
name='mode', name='mode',
field=models.CharField(choices=[(b'na', '\u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043e'), (b'yt', '\u0436\u0451\u043b\u0442\u044b\u0439 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a'), (b'rc', '\u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u043a\u0440\u0435\u0441\u0442\u0438\u043a'), (b'ls', '\u0441\u043b\u0430\u0431\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c'), (b'cf', '\u043e\u0431\u0440\u044b\u0432 \u043a\u0430\u0431\u0435\u043b\u044f'), (b'cn', '\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435'), (b'pf', '\u043f\u0435\u0440\u0435\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u0435'), (b'cr', '\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0440\u043e\u0443\u0442\u0435\u0440\u0430'), (b'ot', '\u0434\u0440\u0443\u0433\u043e\u0435')], default=b'na', max_length=2),
field=models.CharField(choices=[('na', 'не выбрано'), ('yt', 'жёлтый треугольник'), ('rc', 'красный крестик'), ('ls', 'слабая скорость'), ('cf', 'обрыв кабеля'), ('cn', 'подключение'), ('pf', 'переодическое пропадание'), ('cr', 'настройка роутера'), ('ot', 'другое')], default='na', max_length=2),
) )
] ]

1
taskapp/migrations/0005_auto_20161206_0013.py

@ -1,6 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2016-12-05 21:13 # Generated by Django 1.9 on 2016-12-05 21:13
from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion

5
taskapp/migrations/0006_auto_20161206_2135.py

@ -1,6 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2016-12-06 18:35 # Generated by Django 1.9 on 2016-12-06 18:35
from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
@ -15,11 +14,11 @@ class Migration(migrations.Migration):
migrations.AlterField( migrations.AlterField(
model_name='task', model_name='task',
name='mode', name='mode',
field=models.CharField(choices=[(b'na', '\u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043e'), (b'yt', '\u0436\u0451\u043b\u0442\u044b\u0439 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a'), (b'rc', '\u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u043a\u0440\u0435\u0441\u0442\u0438\u043a'), (b'ls', '\u0441\u043b\u0430\u0431\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c'), (b'cf', '\u043e\u0431\u0440\u044b\u0432 \u043a\u0430\u0431\u0435\u043b\u044f'), (b'cn', '\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435'), (b'pf', '\u043f\u0435\u0440\u0435\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u0435'), (b'cr', '\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0440\u043e\u0443\u0442\u0435\u0440\u0430'), (b'co', '\u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c onu'), (b'fc', '\u043e\u0431\u0436\u0430\u0442\u044c \u043a\u0430\u0431\u0435\u043b\u044c'), (b'ot', '\u0434\u0440\u0443\u0433\u043e\u0435')], default=b'na', max_length=2),
field=models.CharField(choices=[('na', 'не выбрано'), ('yt', 'жёлтый треугольник'), ('rc', 'красный крестик'), ('ls', 'слабая скорость'), ('cf', 'обрыв кабеля'), ('cn', 'подключение'), ('pf', 'переодическое пропадание'), ('cr', 'настройка роутера'), ('co', 'настроить onu'), ('fc', 'обжать кабель'), ('ot', 'другое')], default='na', max_length=2),
), ),
migrations.AlterField( migrations.AlterField(
model_name='task', model_name='task',
name='priority', name='priority',
field=models.CharField(choices=[(b'A', '\u0412\u044b\u0441\u0448\u0438\u0439'), (b'C', '\u0421\u0440\u0435\u0434\u043d\u0438\u0439'), (b'E', '\u041d\u0438\u0437\u043a\u0438\u0439')], default=b'E', max_length=1),
field=models.CharField(choices=[('A', 'Высший'), ('C', 'Средний'), ('E', 'Низкий')], default='E', max_length=1),
), ),
] ]

1
taskapp/migrations/0007_auto_20161206_2303.py

@ -1,6 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2016-12-06 20:03 # Generated by Django 1.9 on 2016-12-06 20:03
from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save