Browse Source

Auto reformat code

devel
bashmak 8 years ago
parent
commit
7c29eca01e
  1. 1
      abonapp/admin.py
  2. 5
      abonapp/forms.py
  3. 74
      abonapp/migrations/0001_initial.py
  4. 7
      abonapp/models.py
  5. 46
      abonapp/pay_systems.py
  6. 1
      accounts_app/admin.py
  7. 1
      accounts_app/forms.py
  8. 27
      accounts_app/migrations/0001_initial.py
  9. 6
      accounts_app/models.py
  10. 2
      accounts_app/templatetags/acc_tags.py
  11. 1
      accounts_app/urls.py
  12. 1
      agent/__init__.py
  13. 1
      agent/monitoring_agent.py
  14. 1
      agent/netflow/netflow_handler.py
  15. 5
      agent/structs.py
  16. 11
      chatbot/migrations/0001_initial.py
  17. 3
      chatbot/models.py
  18. 10
      chatbot/telebot.py
  19. 2
      clientsideapp/models.py
  20. 2
      clientsideapp/urls.py
  21. 4
      cron.py
  22. 1
      devapp/admin.py
  23. 2
      devapp/apps.py
  24. 9
      devapp/base_intr.py
  25. 27
      devapp/migrations/0001_initial.py
  26. 1
      devapp/tests.py
  27. 1
      dhcp_lever.py
  28. 5
      dialing.py
  29. 9
      dialing_app/migrations/0001_initial.py
  30. 2
      dialing_app/templatetags/telephone_filters.py
  31. 2
      dialing_app/urls.py
  32. 3
      djing/__init__.py
  33. 7
      djing/fields.py
  34. 1
      djing/formfields.py
  35. 4
      djing/global_base_views.py
  36. 12
      djing/settings.py
  37. 4
      djing/urls.py
  38. 1
      group_app/migrations/0001_initial.py
  39. 2
      group_app/urls.py
  40. 4
      mapapp/migrations/0001_initial.py
  41. 2
      mapapp/templates/maps/dot.html
  42. 2
      mapapp/urls.py
  43. 1
      messaging/sms/base.py
  44. 9
      messaging/sms/deliver.py
  45. 9
      messaging/sms/gsm0338.py
  46. 1
      messaging/sms/pdu.py
  47. 3
      messaging/sms/udh.py
  48. 18
      migrate_to_0.2.py
  49. 1
      msg_app/admin.py
  50. 9
      msg_app/forms.py
  51. 33
      msg_app/migrations/0001_initial.py
  52. 6
      msg_app/models.py
  53. 2
      msg_app/urls.py
  54. 3
      photo_app/admin.py
  55. 1
      photo_app/migrations/0001_initial.py
  56. 9
      photo_app/urls.py
  57. 4
      queue_mngr.py
  58. 2
      searchapp/apps.py
  59. 2
      searchapp/models.py
  60. 1
      searchapp/urls.py
  61. 3
      statistics/fields.py
  62. 4
      statistics/migrations/0001_initial.py
  63. 20
      statistics/models.py
  64. 2
      statistics/urls.py
  65. 6
      systemd_units/webdav_backup.py
  66. 1
      tariff_app/admin.py
  67. 9
      tariff_app/migrations/0001_initial.py
  68. 1
      tariff_app/models.py
  69. 1
      taskapp/admin.py
  70. 1
      taskapp/forms.py
  71. 2
      taskapp/handle.py
  72. 44
      taskapp/migrations/0001_initial.py
  73. 7
      taskapp/models.py
  74. 5
      taskapp/urls.py
  75. 18
      taskapp/views.py

1
abonapp/admin.py

@ -2,7 +2,6 @@ from django.contrib import admin
from . import models from . import models
admin.site.register(models.Abon) admin.site.register(models.Abon)
admin.site.register(models.InvoiceForPayment) admin.site.register(models.InvoiceForPayment)
admin.site.register(models.AbonLog) admin.site.register(models.AbonLog)

5
abonapp/forms.py

@ -8,7 +8,6 @@ from string import digits, ascii_lowercase
from . import models from . import models
from django.conf import settings from django.conf import settings
TELEPHONE_REGEXP = getattr(settings, 'TELEPHONE_REGEXP', r'^\+[7,8,9,3]\d{10,11}$') TELEPHONE_REGEXP = getattr(settings, 'TELEPHONE_REGEXP', r'^\+[7,8,9,3]\d{10,11}$')
@ -54,8 +53,8 @@ class AbonForm(forms.ModelForm):
})) }))
password = forms.CharField(max_length=64, initial=generate_random_password, widget=forms.TextInput(attrs={ password = forms.CharField(max_length=64, initial=generate_random_password, widget=forms.TextInput(attrs={
'class': 'form-control', 'type': 'password', 'autocomplete': 'new-password'
}))
'class': 'form-control', 'type': 'password', 'autocomplete': 'new-password'
}))
class Meta: class Meta:
model = models.Abon model = models.Abon

74
abonapp/migrations/0001_initial.py

@ -12,7 +12,6 @@ import re
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
@ -27,20 +26,26 @@ class Migration(migrations.Migration):
migrations.CreateModel( migrations.CreateModel(
name='Abon', name='Abon',
fields=[ fields=[
('baseaccount_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='accounts_app.BaseAccount')),
('baseaccount_ptr',
models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True,
primary_key=True, serialize=False, to='accounts_app.BaseAccount')),
('ballance', models.FloatField(default=0.0)), ('ballance', models.FloatField(default=0.0)),
('ip_address', mydefs.MyGenericIPAddressField(blank=True, max_length=8, null=True, protocol='ipv4')), ('ip_address', mydefs.MyGenericIPAddressField(blank=True, max_length=8, null=True, protocol='ipv4')),
('description', models.TextField(blank=True, null=True, verbose_name='Comment')), ('description', models.TextField(blank=True, null=True, verbose_name='Comment')),
('house', models.CharField(blank=True, max_length=12, null=True, verbose_name='House')), ('house', models.CharField(blank=True, max_length=12, null=True, verbose_name='House')),
('is_dynamic_ip', models.BooleanField(default=False)), ('is_dynamic_ip', models.BooleanField(default=False)),
('markers', bitfield.models.BitField((('icon_donkey', 'Donkey'), ('icon_fire', 'Fire'), ('icon_ok', 'Ok'), ('icon_king', 'King'), ('icon_tv', 'TV'), ('icon_smile', 'Smile'), ('icon_dollar', 'Dollar'), ('icon_service', 'Service'), ('icon_mrk', 'Marker')), default=0)),
('markers', bitfield.models.BitField((('icon_donkey', 'Donkey'), ('icon_fire', 'Fire'),
('icon_ok', 'Ok'), ('icon_king', 'King'), ('icon_tv', 'TV'),
('icon_smile', 'Smile'), ('icon_dollar', 'Dollar'),
('icon_service', 'Service'), ('icon_mrk', 'Marker')), default=0)),
], ],
options={ options={
'verbose_name': 'Abon', 'verbose_name': 'Abon',
'verbose_name_plural': 'Abons', 'verbose_name_plural': 'Abons',
'db_table': 'abonent', 'db_table': 'abonent',
'ordering': ['fio'], 'ordering': ['fio'],
'permissions': (('can_buy_tariff', 'Buy service perm'), ('can_view_passport', 'Can view passport'), ('can_add_ballance', 'fill account'), ('can_ping', 'Can ping')),
'permissions': (('can_buy_tariff', 'Buy service perm'), ('can_view_passport', 'Can view passport'),
('can_add_ballance', 'fill account'), ('can_ping', 'Can ping')),
}, },
bases=('accounts_app.baseaccount',), bases=('accounts_app.baseaccount',),
), ),
@ -78,7 +83,8 @@ 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')),
('time_start', models.DateTimeField(blank=True, default=None, null=True)), ('time_start', models.DateTimeField(blank=True, default=None, null=True)),
('deadline', models.DateTimeField(blank=True, default=None, null=True)), ('deadline', models.DateTimeField(blank=True, default=None, null=True)),
('tariff', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='linkto_tariff', to='tariff_app.Tariff')),
('tariff', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='linkto_tariff',
to='tariff_app.Tariff')),
], ],
options={ options={
'verbose_name': 'Abon service', 'verbose_name': 'Abon service',
@ -92,7 +98,8 @@ class Migration(migrations.Migration):
name='AdditionalTelephone', name='AdditionalTelephone',
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')),
('telephone', models.CharField(max_length=16, validators=[django.core.validators.RegexValidator('^\\+[7,8,9,3]\\d{10,11}$')], verbose_name='Telephone')),
('telephone', models.CharField(max_length=16, validators=[
django.core.validators.RegexValidator('^\\+[7,8,9,3]\\d{10,11}$')], verbose_name='Telephone')),
('owner_name', models.CharField(max_length=127)), ('owner_name', models.CharField(max_length=127)),
], ],
options={ options={
@ -122,7 +129,8 @@ class Migration(migrations.Migration):
('pay_id', models.CharField(max_length=36, primary_key=True, serialize=False, unique=True)), ('pay_id', models.CharField(max_length=36, primary_key=True, serialize=False, unique=True)),
('date_add', models.DateTimeField(auto_now_add=True)), ('date_add', models.DateTimeField(auto_now_add=True)),
('summ', models.FloatField(default=0.0)), ('summ', models.FloatField(default=0.0)),
('trade_point', models.CharField(blank=True, default=None, max_length=20, null=True, verbose_name='Trade point')),
('trade_point',
models.CharField(blank=True, default=None, max_length=20, null=True, verbose_name='Trade point')),
('receipt_num', models.BigIntegerField(default=0, verbose_name='Receipt number')), ('receipt_num', models.BigIntegerField(default=0, verbose_name='Receipt number')),
], ],
options={ options={
@ -135,7 +143,9 @@ 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')),
('title', models.CharField(default='no title', max_length=16)), ('title', models.CharField(default='no title', max_length=16)),
('field_type', models.CharField(choices=[('int', 'Digital field'), ('str', 'Text field'), ('dbl', 'Floating field'), ('ipa', 'Ip Address')], default='str', max_length=3)),
('field_type', models.CharField(
choices=[('int', 'Digital field'), ('str', 'Text field'), ('dbl', 'Floating field'),
('ipa', 'Ip Address')], default='str', max_length=3)),
('data', models.CharField(blank=True, max_length=64, null=True)), ('data', models.CharField(blank=True, max_length=64, null=True)),
], ],
options={ options={
@ -164,8 +174,12 @@ class Migration(migrations.Migration):
name='PassportInfo', name='PassportInfo',
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')),
('series', models.CharField(max_length=4, validators=[django.core.validators.RegexValidator(re.compile('^-?\\d+\\Z', 32), code='invalid', message='Enter a valid integer.')])),
('number', models.CharField(max_length=6, validators=[django.core.validators.RegexValidator(re.compile('^-?\\d+\\Z', 32), code='invalid', message='Enter a valid integer.')])),
('series', models.CharField(max_length=4, validators=[
django.core.validators.RegexValidator(re.compile('^-?\\d+\\Z', 32), code='invalid',
message='Enter a valid integer.')])),
('number', models.CharField(max_length=6, validators=[
django.core.validators.RegexValidator(re.compile('^-?\\d+\\Z', 32), code='invalid',
message='Enter a valid integer.')])),
('distributor', models.CharField(max_length=64)), ('distributor', models.CharField(max_length=64)),
('date_of_acceptance', models.DateField()), ('date_of_acceptance', models.DateField()),
], ],
@ -189,7 +203,9 @@ class Migration(migrations.Migration):
migrations.CreateModel( migrations.CreateModel(
name='AbonRawPassword', name='AbonRawPassword',
fields=[ fields=[
('account', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to='abonapp.Abon')),
('account',
models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False,
to='abonapp.Abon')),
('passw_text', models.CharField(max_length=64)), ('passw_text', models.CharField(max_length=64)),
], ],
options={ options={
@ -199,17 +215,20 @@ class Migration(migrations.Migration):
migrations.AddField( migrations.AddField(
model_name='periodicpayforid', model_name='periodicpayforid',
name='account', name='account',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='abonapp.Abon', verbose_name='Account'),
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='abonapp.Abon',
verbose_name='Account'),
), ),
migrations.AddField( migrations.AddField(
model_name='periodicpayforid', model_name='periodicpayforid',
name='periodic_pay', name='periodic_pay',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tariff_app.PeriodicPay', verbose_name='Periodic pay'),
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tariff_app.PeriodicPay',
verbose_name='Periodic pay'),
), ),
migrations.AddField( migrations.AddField(
model_name='passportinfo', model_name='passportinfo',
name='abon', name='abon',
field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='abonapp.Abon'),
field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL,
to='abonapp.Abon'),
), ),
migrations.AddField( migrations.AddField(
model_name='invoiceforpayment', model_name='invoiceforpayment',
@ -219,17 +238,20 @@ class Migration(migrations.Migration):
migrations.AddField( migrations.AddField(
model_name='invoiceforpayment', model_name='invoiceforpayment',
name='author', name='author',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL),
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL,
related_name='+', to=settings.AUTH_USER_MODEL),
), ),
migrations.AddField( migrations.AddField(
model_name='alltimepaylog', model_name='alltimepaylog',
name='abon', name='abon',
field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_DEFAULT, to='abonapp.Abon'),
field=models.ForeignKey(blank=True, default=None, null=True,
on_delete=django.db.models.deletion.SET_DEFAULT, to='abonapp.Abon'),
), ),
migrations.AddField( migrations.AddField(
model_name='additionaltelephone', model_name='additionaltelephone',
name='abon', name='abon',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='additional_telephones', to='abonapp.Abon'),
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='additional_telephones',
to='abonapp.Abon'),
), ),
migrations.AddField( migrations.AddField(
model_name='abonlog', model_name='abonlog',
@ -239,22 +261,26 @@ class Migration(migrations.Migration):
migrations.AddField( migrations.AddField(
model_name='abonlog', model_name='abonlog',
name='author', name='author',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='+', to=settings.AUTH_USER_MODEL),
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE,
related_name='+', to=settings.AUTH_USER_MODEL),
), ),
migrations.AddField( migrations.AddField(
model_name='abon', model_name='abon',
name='current_tariff', name='current_tariff',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='abonapp.AbonTariff'),
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL,
to='abonapp.AbonTariff'),
), ),
migrations.AddField( migrations.AddField(
model_name='abon', model_name='abon',
name='dev_port', name='dev_port',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='devapp.Port'),
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL,
to='devapp.Port'),
), ),
migrations.AddField( migrations.AddField(
model_name='abon', model_name='abon',
name='device', name='device',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='devapp.Device'),
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL,
to='devapp.Device'),
), ),
migrations.AddField( migrations.AddField(
model_name='abon', model_name='abon',
@ -264,11 +290,13 @@ class Migration(migrations.Migration):
migrations.AddField( migrations.AddField(
model_name='abon', model_name='abon',
name='group', name='group',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='group_app.Group', verbose_name='User group'),
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL,
to='group_app.Group', verbose_name='User group'),
), ),
migrations.AddField( migrations.AddField(
model_name='abon', model_name='abon',
name='street', name='street',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='abonapp.AbonStreet', verbose_name='Street'),
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL,
to='abonapp.AbonStreet', verbose_name='Street'),
), ),
] ]

7
abonapp/models.py

@ -19,7 +19,6 @@ from djing import IP_ADDR_REGEX
from tariff_app.models import Tariff, PeriodicPay from tariff_app.models import Tariff, PeriodicPay
from bitfield import BitField from bitfield import BitField
TELEPHONE_REGEXP = getattr(settings, 'TELEPHONE_REGEXP', r'^\+[7,8,9,3]\d{10,11}$') TELEPHONE_REGEXP = getattr(settings, 'TELEPHONE_REGEXP', r'^\+[7,8,9,3]\d{10,11}$')
@ -129,7 +128,6 @@ class ExtraFieldsModel(models.Model):
class AbonManager(MyUserManager): class AbonManager(MyUserManager):
def get_queryset(self): def get_queryset(self):
return super(MyUserManager, self).get_queryset().filter(is_admin=False) return super(MyUserManager, self).get_queryset().filter(is_admin=False)
@ -184,7 +182,7 @@ class Abon(BaseAccount):
('can_ping', _('Can ping')) ('can_ping', _('Can ping'))
) )
# TODO: Fix when duplicates already in database # TODO: Fix when duplicates already in database
#unique_together = ('device', 'dev_port')
# unique_together = ('device', 'dev_port')
verbose_name = _('Abon') verbose_name = _('Abon')
verbose_name_plural = _('Abons') verbose_name_plural = _('Abons')
ordering = ['fio'] ordering = ['fio']
@ -273,7 +271,8 @@ class Abon(BaseAccount):
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
# check if ip address already busy # check if ip address already busy
if self.ip_address is not None and Abon.objects.filter(ip_address=self.ip_address).exclude(pk=self.pk).count() > 0:
if self.ip_address is not None and Abon.objects.filter(ip_address=self.ip_address).exclude(
pk=self.pk).count() > 0:
self.is_bad_ip = True self.is_bad_ip = True
raise LogicError(_('Ip address already exist')) raise LogicError(_('Ip address already exist'))
super(Abon, self).save(*args, **kwargs) super(Abon, self).save(*args, **kwargs)

46
abonapp/pay_systems.py

@ -5,13 +5,11 @@ from .models import Abon, AllTimePayLog
from django.db import DatabaseError from django.db import DatabaseError
from django.conf import settings from django.conf import settings
SECRET = getattr(settings, 'PAY_SECRET') SECRET = getattr(settings, 'PAY_SECRET')
SERV_ID = getattr(settings, 'PAY_SERV_ID') SERV_ID = getattr(settings, 'PAY_SERV_ID')
def allpay(request): def allpay(request):
def bad_ret(err_id, err_description=None): def bad_ret(err_id, err_description=None):
current_date = timezone.now() current_date = timezone.now()
res = [ res = [
@ -49,16 +47,16 @@ def allpay(request):
ballance = float(abon.ballance) ballance = float(abon.ballance)
current_date = timezone.now().strftime("%d.%m.%Y %H:%M:%S") current_date = timezone.now().strftime("%d.%m.%Y %H:%M:%S")
return "<?xml version='1.0' encoding='UTF-8'?>\n" \ return "<?xml version='1.0' encoding='UTF-8'?>\n" \
"<pay-response>\n" \
" <balance>%.2f</balance>\n" % ballance +\
" <name>%s</name>\n" % fio +\
" <account>%d</account>\n" % pay_account +\
" <service_id>%s</service_id>\n" % SERV_ID +\
" <min_amount>10.0</min_amount>\n" \
" <max_amount>50000</max_amount>\n" \
" <status_code>21</status_code>\n" \
" <time_stamp>%s</time_stamp>\n" % current_date +\
"</pay-response>"
"<pay-response>\n" \
" <balance>%.2f</balance>\n" % ballance + \
" <name>%s</name>\n" % fio + \
" <account>%d</account>\n" % pay_account + \
" <service_id>%s</service_id>\n" % SERV_ID + \
" <min_amount>10.0</min_amount>\n" \
" <max_amount>50000</max_amount>\n" \
" <status_code>21</status_code>\n" \
" <time_stamp>%s</time_stamp>\n" % current_date + \
"</pay-response>"
elif act == 4: elif act == 4:
trade_point = safe_int(request.GET.get('TRADE_POINT')) trade_point = safe_int(request.GET.get('TRADE_POINT'))
receipt_num = safe_int(request.GET.get('RECEIPT_NUM')) receipt_num = safe_int(request.GET.get('RECEIPT_NUM'))
@ -79,12 +77,12 @@ def allpay(request):
) )
current_date = timezone.now().strftime("%d.%m.%Y %H:%M:%S") current_date = timezone.now().strftime("%d.%m.%Y %H:%M:%S")
return "<?xml version='1.0' encoding='UTF-8'?>" \ return "<?xml version='1.0' encoding='UTF-8'?>" \
"<pay-response>\n" +\
" <pay_id>%s</pay_id>\n" % pay_id +\
" <service_id>%s</service_id>\n" % serv_id +\
" <amount>%.2f</amount>\n" % pay_amount +\
" <status_code>22</status_code>\n" +\
" <time_stamp>%s</time_stamp>\n" % current_date +\
"<pay-response>\n" + \
" <pay_id>%s</pay_id>\n" % pay_id + \
" <service_id>%s</service_id>\n" % serv_id + \
" <amount>%.2f</amount>\n" % pay_amount + \
" <status_code>22</status_code>\n" + \
" <time_stamp>%s</time_stamp>\n" % current_date + \
"</pay-response>" "</pay-response>"
elif act == 7: elif act == 7:
pay = AllTimePayLog.objects.get(pay_id=pay_id) pay = AllTimePayLog.objects.get(pay_id=pay_id)
@ -92,13 +90,13 @@ def allpay(request):
return "<?xml version='1.0' encoding='UTF-8'?>\n" \ return "<?xml version='1.0' encoding='UTF-8'?>\n" \
"<pay-response>\n" \ "<pay-response>\n" \
" <status_code>11</status_code>\n" \ " <status_code>11</status_code>\n" \
" <time_stamp>%s</time_stamp>\n" % current_date +\
" <time_stamp>%s</time_stamp>\n" % current_date + \
" <transaction>\n" \ " <transaction>\n" \
" <pay_id>%s</pay_id>\n" % pay_id +\
" <service_id>%s</service_id>\n" % serv_id +\
" <amount>%.2f</amount>\n" % float(pay.summ) +\
" <status>111</status>\n" +\
" <time_stamp>%s</time_stamp>\n" % current_date +\
" <pay_id>%s</pay_id>\n" % pay_id + \
" <service_id>%s</service_id>\n" % serv_id + \
" <amount>%.2f</amount>\n" % float(pay.summ) + \
" <status>111</status>\n" + \
" <time_stamp>%s</time_stamp>\n" % current_date + \
" </transaction>\n" \ " </transaction>\n" \
"</pay-response>" "</pay-response>"
else: else:

1
accounts_app/admin.py

@ -2,5 +2,4 @@ from django.contrib import admin
from .models import UserProfile from .models import UserProfile
admin.site.register(UserProfile) admin.site.register(UserProfile)

1
accounts_app/forms.py

@ -4,7 +4,6 @@ from guardian.shortcuts import assign_perm, remove_perm
class MyUserObjectPermissionsForm(UserObjectPermissionsForm): class MyUserObjectPermissionsForm(UserObjectPermissionsForm):
def save_obj_perms(self): def save_obj_perms(self):
""" """
Saves selected object permissions by creating new ones and removing Saves selected object permissions by creating new ones and removing

27
accounts_app/migrations/0001_initial.py

@ -8,7 +8,6 @@ import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
@ -24,13 +23,16 @@ 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')),
('password', models.CharField(max_length=128, verbose_name='password')), ('password', models.CharField(max_length=128, verbose_name='password')),
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
('is_superuser', models.BooleanField(default=False,
help_text='Designates that this user has all permissions without explicitly assigning them.',
verbose_name='superuser status')),
('username', models.CharField(max_length=127, unique=True, verbose_name='profile username')), ('username', models.CharField(max_length=127, unique=True, verbose_name='profile username')),
('fio', models.CharField(max_length=256, verbose_name='fio')), ('fio', models.CharField(max_length=256, verbose_name='fio')),
('birth_day', models.DateField(auto_now_add=True, verbose_name='birth day')), ('birth_day', models.DateField(auto_now_add=True, verbose_name='birth day')),
('is_active', models.BooleanField(default=True, verbose_name='Is active')), ('is_active', models.BooleanField(default=True, verbose_name='Is active')),
('is_admin', models.BooleanField(default=False)), ('is_admin', models.BooleanField(default=False)),
('telephone', models.CharField(max_length=16, validators=[django.core.validators.RegexValidator('^\\+[7,8,9,3]\\d{10,11}$')], verbose_name='Telephone')),
('telephone', models.CharField(max_length=16, validators=[
django.core.validators.RegexValidator('^\\+[7,8,9,3]\\d{10,11}$')], verbose_name='Telephone')),
], ],
options={ options={
'db_table': 'base_accounts', 'db_table': 'base_accounts',
@ -39,10 +41,14 @@ class Migration(migrations.Migration):
migrations.CreateModel( migrations.CreateModel(
name='UserProfile', name='UserProfile',
fields=[ fields=[
('baseaccount_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='accounts_app.BaseAccount')),
('baseaccount_ptr',
models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True,
primary_key=True, serialize=False, to='accounts_app.BaseAccount')),
('email', models.EmailField(default='admin@example.ru', max_length=254)), ('email', models.EmailField(default='admin@example.ru', max_length=254)),
('avatar', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='photo_app.Photo')),
('responsibility_groups', models.ManyToManyField(blank=True, to='group_app.Group', verbose_name='Responsibility groups')),
('avatar', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL,
to='photo_app.Photo')),
('responsibility_groups',
models.ManyToManyField(blank=True, to='group_app.Group', verbose_name='Responsibility groups')),
], ],
options={ options={
'verbose_name': 'Staff account profile', 'verbose_name': 'Staff account profile',
@ -55,11 +61,16 @@ class Migration(migrations.Migration):
migrations.AddField( migrations.AddField(
model_name='baseaccount', model_name='baseaccount',
name='groups', name='groups',
field=models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups'),
field=models.ManyToManyField(blank=True,
help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.',
related_name='user_set', related_query_name='user', to='auth.Group',
verbose_name='groups'),
), ),
migrations.AddField( migrations.AddField(
model_name='baseaccount', model_name='baseaccount',
name='user_permissions', name='user_permissions',
field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions'),
field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.',
related_name='user_set', related_query_name='user', to='auth.Permission',
verbose_name='user permissions'),
), ),
] ]

6
accounts_app/models.py

@ -8,7 +8,6 @@ from django.conf import settings
from photo_app.models import Photo from photo_app.models import Photo
from group_app.models import Group from group_app.models import Group
DEFAULT_PICTURE = getattr(settings, 'DEFAULT_PICTURE', '/static/img/user_ava.gif') DEFAULT_PICTURE = getattr(settings, 'DEFAULT_PICTURE', '/static/img/user_ava.gif')
TELEPHONE_REGEXP = getattr(settings, 'TELEPHONE_REGEXP', r'^\+[7,8,9,3]\d{10,11}$') TELEPHONE_REGEXP = getattr(settings, 'TELEPHONE_REGEXP', r'^\+[7,8,9,3]\d{10,11}$')
@ -39,7 +38,7 @@ class MyUserManager(BaseUserManager):
user = self.create_user(telephone, user = self.create_user(telephone,
password=password, password=password,
username=username username=username
)
)
user.is_admin = True user.is_admin = True
user.is_superuser = True user.is_superuser = True
user.save(using=self._db) user.save(using=self._db)
@ -60,7 +59,7 @@ class BaseAccount(AbstractBaseUser, PermissionsMixin):
telephone = models.CharField( telephone = models.CharField(
max_length=16, max_length=16,
verbose_name=_('Telephone'), verbose_name=_('Telephone'),
#unique=True,
# unique=True,
validators=[RegexValidator(TELEPHONE_REGEXP)] validators=[RegexValidator(TELEPHONE_REGEXP)]
) )
@ -90,7 +89,6 @@ class BaseAccount(AbstractBaseUser, PermissionsMixin):
class UserProfileManager(MyUserManager): class UserProfileManager(MyUserManager):
def get_profiles_by_group(self, group_id): def get_profiles_by_group(self, group_id):
return self.filter(responsibility_groups__id__in=[group_id], is_admin=True, is_active=True) return self.filter(responsibility_groups__id__in=[group_id], is_admin=True, is_active=True)

2
accounts_app/templatetags/acc_tags.py

@ -2,8 +2,8 @@ from django import template
from django.db.models import Model from django.db.models import Model
from django.apps import apps from django.apps import apps
from six import string_types, class_types from six import string_types, class_types
register = template.Library()
register = template.Library()
@register.simple_tag @register.simple_tag

1
accounts_app/urls.py

@ -2,7 +2,6 @@ from django.conf.urls import url
from . import views from . import views
app_name = 'account_app' app_name = 'account_app'
urlpatterns = [ urlpatterns = [

1
agent/__init__.py

@ -3,7 +3,6 @@ from .mod_mikrotik import MikrotikTransmitter
from .core import NasFailedResult, NasNetworkError from .core import NasFailedResult, NasNetworkError
from .structs import TariffStruct, AbonStruct from .structs import TariffStruct, AbonStruct
# Transmitter мы будем импортировать в других местах # Transmitter мы будем импортировать в других местах
# Тут надо указать какой у нас будет NAS # Тут надо указать какой у нас будет NAS
# т.е. какой класс будет управлять доступом в интернет # т.е. какой класс будет управлять доступом в интернет

1
agent/monitoring_agent.py

@ -8,7 +8,6 @@ API_AUTH_SECRET = 'your api key'
SERVER_DOMAIN = 'http://localhost:8000' SERVER_DOMAIN = 'http://localhost:8000'
IP_REGEXP = r'^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' \ IP_REGEXP = r'^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' \
r'(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' \ r'(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' \
r'(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' \ r'(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' \

1
agent/netflow/netflow_handler.py

@ -4,7 +4,6 @@ import sys
import os import os
from importlib import import_module from importlib import import_module
if __name__ == '__main__': if __name__ == '__main__':
if len(sys.argv) < 2: if len(sys.argv) < 2:
print("File name of netflow required") print("File name of netflow required")

5
agent/structs.py

@ -19,7 +19,6 @@ class BaseStruct(object, metaclass=ABCMeta):
class IpStruct(BaseStruct): class IpStruct(BaseStruct):
def __init__(self, ip): def __init__(self, ip):
if type(ip) is int: if type(ip) is int:
self.__ip = ip self.__ip = ip
@ -55,7 +54,6 @@ class IpStruct(BaseStruct):
# Как обслуживается абонент # Как обслуживается абонент
class TariffStruct(BaseStruct): class TariffStruct(BaseStruct):
def __init__(self, tariff_id=0, speedIn=None, speedOut=None): def __init__(self, tariff_id=0, speedIn=None, speedOut=None):
self.tid = int(tariff_id) self.tid = int(tariff_id)
self.speedIn = float(speedIn if speedIn is not None else 0.001) self.speedIn = float(speedIn if speedIn is not None else 0.001)
@ -92,7 +90,6 @@ class TariffStruct(BaseStruct):
# Абонент из базы # Абонент из базы
class AbonStruct(BaseStruct): class AbonStruct(BaseStruct):
def __init__(self, uid=0, ip=None, tariff=None, is_active=True): def __init__(self, uid=0, ip=None, tariff=None, is_active=True):
self.uid = int(uid or 0) self.uid = int(uid or 0)
self.ip = IpStruct(ip) self.ip = IpStruct(ip)
@ -143,7 +140,7 @@ class ShapeItem(BaseStruct):
def serialize(self): def serialize(self):
abon_pack = self.abon.serialize() abon_pack = self.abon.serialize()
dt = pack('!L', self.sid) dt = pack('!L', self.sid)
return dt+abon_pack
return dt + abon_pack
def deserialize(self, data, *args): def deserialize(self, data, *args):
sz = calcsize('!L') sz = calcsize('!L')

11
chatbot/migrations/0001_initial.py

@ -8,7 +8,6 @@ import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
@ -35,9 +34,12 @@ 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')),
('message', models.CharField(max_length=255, verbose_name='Message')), ('message', models.CharField(max_length=255, verbose_name='Message')),
('status', models.CharField(choices=[('n', 'New'), ('r', 'Read')], default='n', max_length=1, verbose_name='Status of message')),
('status', models.CharField(choices=[('n', 'New'), ('r', 'Read')], default='n', max_length=1,
verbose_name='Status of message')),
('tag', models.CharField(default='none', max_length=6, verbose_name='App tag')), ('tag', models.CharField(default='none', max_length=6, verbose_name='App tag')),
('target_employee', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Target employee')),
('target_employee',
models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL,
verbose_name='Target employee')),
], ],
options={ options={
'verbose_name': 'Message queue', 'verbose_name': 'Message queue',
@ -50,7 +52,8 @@ 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')),
('chat_id', models.PositiveIntegerField(default=0, verbose_name='Telegram chat id')), ('chat_id', models.PositiveIntegerField(default=0, verbose_name='Telegram chat id')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Employee')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL,
verbose_name='Employee')),
], ],
options={ options={
'verbose_name': 'Telegram bot', 'verbose_name': 'Telegram bot',

3
chatbot/models.py

@ -10,7 +10,7 @@ class ChatException(Exception):
class TelegramBot(models.Model): class TelegramBot(models.Model):
user = models.ForeignKey(AUTH_USER_MODEL, models.CASCADE, verbose_name=_('Employee'))
user = models.ForeignKey(AUTH_USER_MODEL, models.CASCADE, verbose_name=_('Employee'))
chat_id = models.PositiveIntegerField(_('Telegram chat id'), default=0) chat_id = models.PositiveIntegerField(_('Telegram chat id'), default=0)
def __str__(self): def __str__(self):
@ -37,7 +37,6 @@ class MessageHistory(models.Model):
class MessageQueueManager(models.Manager): class MessageQueueManager(models.Manager):
def pop(self, user, tag='none'): def pop(self, user, tag='none'):
msgs = self.filter(target_employee=user, status='n', tag=tag)[:1].only('message').values('id', 'message') msgs = self.filter(target_employee=user, status='n', tag=tag)[:1].only('message').values('id', 'message')
if len(msgs) > 0: if len(msgs) > 0:

10
chatbot/telebot.py

@ -102,11 +102,13 @@ class DjingTelebot(helper.ChatHandler):
chat_id=self._chat_id chat_id=self._chat_id
) )
except UserProfile.DoesNotExist: except UserProfile.DoesNotExist:
self._question(_("You are not found in the database, check that it correctly pointed out its LOGIN. Try again"),
self.question_name)
self._question(
_("You are not found in the database, check that it correctly pointed out its LOGIN. Try again"),
self.question_name)
return return
self._sent_reply(_("Yes, it's nice to meet %(username)s, I will notify you about events in billing. Successful work ;)")
% {'username': profile.get_full_name()})
self._sent_reply(
_("Yes, it's nice to meet %(username)s, I will notify you about events in billing. Successful work ;)")
% {'username': profile.get_full_name()})
# заканчивается время диалога # заканчивается время диалога
# ex - время ожидания (timeout=ex в pave_event_space) # ex - время ожидания (timeout=ex в pave_event_space)

2
clientsideapp/models.py

@ -1,3 +1 @@
# Create your models here. # Create your models here.

2
clientsideapp/urls.py

@ -2,10 +2,8 @@
from django.conf.urls import url from django.conf.urls import url
from . import views from . import views
app_name = 'clientsideapp' app_name = 'clientsideapp'
urlpatterns = [ urlpatterns = [
url(r'^$', views.home, name='home'), url(r'^$', views.home, name='home'),
url(r'^pays$', views.pays, name='pays'), url(r'^pays$', views.pays, name='pays'),

4
cron.py

@ -44,8 +44,8 @@ def main():
print('NetworkTrouble:', e) print('NetworkTrouble:', e)
# manage periodic pays # manage periodic pays
ppays = PeriodicPayForId.objects.filter(next_pay__lt=now)\
.prefetch_related('account', 'periodic_pay')
ppays = PeriodicPayForId.objects.filter(next_pay__lt=now) \
.prefetch_related('account', 'periodic_pay')
for pay in ppays: for pay in ppays:
pay.payment_for_service(now=now) pay.payment_for_service(now=now)

1
devapp/admin.py

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

2
devapp/apps.py

@ -1,5 +1,3 @@
from django.apps import AppConfig from django.apps import AppConfig

9
devapp/base_intr.py

@ -1,10 +1,10 @@
from abc import ABCMeta, abstractmethod from abc import ABCMeta, abstractmethod
from datetime import timedelta from datetime import timedelta
from django.utils.translation import gettext
from typing import Union, Iterable, AnyStr, Generator from typing import Union, Iterable, AnyStr, Generator
from easysnmp import Session from easysnmp import Session
ListOrError = Union[ ListOrError = Union[
Iterable, Iterable,
Union[Exception, Iterable] Union[Exception, Iterable]
@ -16,7 +16,6 @@ class DeviceImplementationError(Exception):
class DevBase(object, metaclass=ABCMeta): class DevBase(object, metaclass=ABCMeta):
def __init__(self, dev_instance=None): def __init__(self, dev_instance=None):
self.db_instance = dev_instance self.db_instance = dev_instance
@ -78,10 +77,12 @@ class BasePort(object, metaclass=ABCMeta):
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: str, community='public', ver=2):
if ip is None:
raise DeviceImplementationError(gettext('Ip address is required'))
self.ses = Session(hostname=ip, community=community, version=ver) self.ses = Session(hostname=ip, community=community, version=ver)
def set_int_value(self, oid, value):
def set_int_value(self, oid: str, value):
return self.ses.set(oid, value, 'i') return self.ses.set(oid, value, 'i')
def get_list(self, oid) -> Generator: def get_list(self, oid) -> Generator:

27
devapp/migrations/0001_initial.py

@ -9,7 +9,6 @@ import mydefs
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
@ -21,16 +20,25 @@ 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='ipv4', verbose_name='Ip address')),
('mac_addr', djing.fields.MACAddressField(blank=True, integer=True, null=True, unique=True, verbose_name='Mac address')),
(
'ip_address', mydefs.MyGenericIPAddressField(max_length=8, protocol='ipv4', verbose_name='Ip address')),
('mac_addr', djing.fields.MACAddressField(blank=True, integer=True, null=True, unique=True,
verbose_name='Mac address')),
('comment', models.CharField(max_length=256, verbose_name='Comment')), ('comment', models.CharField(max_length=256, verbose_name='Comment')),
('devtype', models.CharField(choices=[('Dl', 'DLink switch'), ('Pn', 'PON OLT'), ('On', 'PON ONU'), ('Ex', 'Eltex switch')], default='Dl', max_length=2, verbose_name='Device type')),
('devtype', models.CharField(
choices=[('Dl', 'DLink switch'), ('Pn', 'PON OLT'), ('On', 'PON ONU'), ('Ex', 'Eltex switch')],
default='Dl', max_length=2, verbose_name='Device type')),
('man_passw', models.CharField(blank=True, max_length=16, null=True, verbose_name='SNMP password')), ('man_passw', models.CharField(blank=True, max_length=16, null=True, verbose_name='SNMP password')),
('snmp_item_num', models.PositiveSmallIntegerField(blank=True, default=0, verbose_name='SNMP Number')), ('snmp_item_num', models.PositiveSmallIntegerField(blank=True, default=0, verbose_name='SNMP Number')),
('status', models.CharField(choices=[('und', 'Undefined'), ('up', 'Up'), ('unr', 'Unreachable'), ('dwn', 'Down')], default='und', max_length=3, verbose_name='Status')),
('is_noticeable', models.BooleanField(default=False, verbose_name='Send notify when monitoring state changed')),
('group', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='group_app.Group', verbose_name='Device group')),
('parent_dev', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='devapp.Device', verbose_name='Parent device')),
('status',
models.CharField(choices=[('und', 'Undefined'), ('up', 'Up'), ('unr', 'Unreachable'), ('dwn', 'Down')],
default='und', max_length=3, verbose_name='Status')),
('is_noticeable',
models.BooleanField(default=False, verbose_name='Send notify when monitoring state changed')),
('group', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL,
to='group_app.Group', verbose_name='Device group')),
('parent_dev', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL,
to='devapp.Device', verbose_name='Parent device')),
], ],
options={ options={
'verbose_name': 'Device', 'verbose_name': 'Device',
@ -46,7 +54,8 @@ 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, verbose_name='Number')), ('num', models.PositiveSmallIntegerField(default=0, verbose_name='Number')),
('descr', models.CharField(blank=True, max_length=60, null=True, verbose_name='Description')), ('descr', models.CharField(blank=True, max_length=60, null=True, verbose_name='Description')),
('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='devapp.Device', verbose_name='Device')),
('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='devapp.Device',
verbose_name='Device')),
], ],
options={ options={
'verbose_name': 'Port', 'verbose_name': 'Port',

1
devapp/tests.py

@ -3,7 +3,6 @@ from . import dev_types
class DevTest(TestCase): class DevTest(TestCase):
def setUp(self): def setUp(self):
pass pass

1
dhcp_lever.py

@ -7,6 +7,7 @@ def die(text):
print(text) print(text)
exit(1) exit(1)
''' '''
obj = { obj = {
'client_ip': ip2int('127.0.0.1'), 'client_ip': ip2int('127.0.0.1'),

5
dialing.py

@ -2,6 +2,7 @@
import os, signal import os, signal
from pid.decorator import pidfile from pid.decorator import pidfile
import django import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings") os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings")
django.setup() django.setup()
from messaging.sms import SmsSubmit, SmsDeliver from messaging.sms import SmsSubmit, SmsDeliver
@ -11,14 +12,12 @@ from time import sleep
from dialing_app.models import SMSModel, SMSOut from dialing_app.models import SMSModel, SMSOut
from django.conf import settings from django.conf import settings
ASTERISK_MANAGER_AUTH = getattr(settings, 'ASTERISK_MANAGER_AUTH', { ASTERISK_MANAGER_AUTH = getattr(settings, 'ASTERISK_MANAGER_AUTH', {
'username': 'admin', 'username': 'admin',
'password': 'admin', 'password': 'admin',
'host': '127.0.0.1' 'host': '127.0.0.1'
}) })
outbox_messages = False outbox_messages = False
@ -146,7 +145,7 @@ def main():
# register some callbacks # register some callbacks
manager.register_event('Shutdown', handle_shutdown) manager.register_event('Shutdown', handle_shutdown)
manager.register_event('DongleNewCMGR', handle_inbox_long_sms_message) # PDU Here
manager.register_event('DongleNewCMGR', handle_inbox_long_sms_message) # PDU Here
# get a status report # get a status report
response = manager.status() response = manager.status()

9
dialing_app/migrations/0001_initial.py

@ -6,7 +6,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
@ -30,7 +29,9 @@ class Migration(migrations.Migration):
('start', models.DateTimeField(blank=True, default=None, null=True)), ('start', models.DateTimeField(blank=True, default=None, null=True)),
('answer', models.DateTimeField(blank=True, default=None, null=True)), ('answer', models.DateTimeField(blank=True, default=None, null=True)),
('end', models.DateTimeField(blank=True, default=None, null=True)), ('end', models.DateTimeField(blank=True, default=None, null=True)),
('disposition', models.CharField(choices=[('NO ANSWER', 'No answer'), ('FAILED', 'Failed'), ('BUSY', 'Busy'), ('ANSWERED', 'Answered'), ('UNKNOWN', 'Unknown')], default='', max_length=45)),
('disposition', models.CharField(
choices=[('NO ANSWER', 'No answer'), ('FAILED', 'Failed'), ('BUSY', 'Busy'),
('ANSWERED', 'Answered'), ('UNKNOWN', 'Unknown')], default='', max_length=45)),
('amaflags', models.IntegerField(default=0)), ('amaflags', models.IntegerField(default=0)),
('accountcode', models.CharField(default='', max_length=20)), ('accountcode', models.CharField(default='', max_length=20)),
('userfield', models.CharField(default='', max_length=255)), ('userfield', models.CharField(default='', max_length=255)),
@ -66,7 +67,9 @@ class Migration(migrations.Migration):
('when', models.DateTimeField(auto_now_add=True, verbose_name='When')), ('when', models.DateTimeField(auto_now_add=True, verbose_name='When')),
('dst', models.CharField(max_length=16, verbose_name='Telephone')), ('dst', models.CharField(max_length=16, verbose_name='Telephone')),
('text', models.CharField(max_length=255, verbose_name='Text')), ('text', models.CharField(max_length=255, verbose_name='Text')),
('status', models.CharField(choices=[('nw', 'New'), ('st', 'Sent'), ('fd', 'Failed')], default='nw', max_length=2, verbose_name='Status')),
('status',
models.CharField(choices=[('nw', 'New'), ('st', 'Sent'), ('fd', 'Failed')], default='nw', max_length=2,
verbose_name='Status')),
], ],
options={ options={
'verbose_name': 'Out SMS', 'verbose_name': 'Out SMS',

2
dialing_app/templatetags/telephone_filters.py

@ -12,7 +12,7 @@ def abon_if_telephone(value):
"""Возвращаем ссыль на абонента если передали номер телефона""" """Возвращаем ссыль на абонента если передали номер телефона"""
if re.match(r'^\+?\d+$', value): if re.match(r'^\+?\d+$', value):
if value[0] != '+': if value[0] != '+':
value = '+'+value
value = '+' + value
url = resolve_url('dialapp:to_abon', tel=value) url = resolve_url('dialapp:to_abon', tel=value)
a = '<a href="%s" target="_blank">%s</a>' % (url, value) a = '<a href="%s" target="_blank">%s</a>' % (url, value)
return a return a

2
dialing_app/urls.py

@ -1,10 +1,8 @@
from django.conf.urls import url from django.conf.urls import url
from . import views from . import views
app_name = 'dialing_app' app_name = 'dialing_app'
urlpatterns = [ urlpatterns = [
url(r'^$', views.LastCallsListView.as_view(), name='home'), url(r'^$', views.LastCallsListView.as_view(), name='home'),
url(r'^filter$', views.DialsFilterListView.as_view(), name='vfilter'), url(r'^filter$', views.DialsFilterListView.as_view(), name='vfilter'),

3
djing/__init__.py

@ -1,7 +1,6 @@
import importlib import importlib
from netaddr import mac_unix, mac_eui48 from netaddr import mac_unix, mac_eui48
MAC_ADDR_REGEX = r'^([0-9A-Fa-f]{1,2}[:-]){5}([0-9A-Fa-f]{1,2})$' MAC_ADDR_REGEX = r'^([0-9A-Fa-f]{1,2}[:-]){5}([0-9A-Fa-f]{1,2})$'
IP_ADDR_REGEX = r'^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' \ IP_ADDR_REGEX = r'^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' \
@ -40,5 +39,5 @@ except DistributionNotFound:
__version__ = 'Please install this project with setup.py' __version__ = 'Please install this project with setup.py'
else: else:
__version__ = _dist.version __version__ = _dist.version
VERSION = __version__ # synonym
VERSION = __version__ # synonym
default_app_config = 'abonapp.apps.AbonappConfig' default_app_config = 'abonapp.apps.AbonappConfig'

7
djing/fields.py

@ -13,10 +13,10 @@ class MACAddressField(models.Field):
description = "A MAC address validated by netaddr.EUI" description = "A MAC address validated by netaddr.EUI"
empty_strings_allowed = False empty_strings_allowed = False
dialect = None dialect = None
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
self.integer = kwargs.pop('integer', True) self.integer = kwargs.pop('integer', True)
if not self.integer: # If storing MAC address as string, set max_length to default (17) or use supplied kwarg value.
if not self.integer: # If storing MAC address as string, set max_length to default (17) or use supplied kwarg value.
kwargs['max_length'] = kwargs.get('max_length', 17) kwargs['max_length'] = kwargs.get('max_length', 17)
super(MACAddressField, self).__init__(*args, **kwargs) super(MACAddressField, self).__init__(*args, **kwargs)
@ -63,7 +63,7 @@ class MACAddressField(models.Field):
def from_db_value(self, value, expression, connection, context): def from_db_value(self, value, expression, connection, context):
return self.to_python(value) return self.to_python(value)
def to_python(self, value): def to_python(self, value):
if value is None: if value is None:
return value return value
@ -103,6 +103,7 @@ class MACAddressField(models.Field):
try: try:
from south.modelsinspector import add_introspection_rules from south.modelsinspector import add_introspection_rules
add_introspection_rules([], ["^macaddress\.fields\.MACAddressField"]) add_introspection_rules([], ["^macaddress\.fields\.MACAddressField"])
except ImportError: except ImportError:
pass pass

1
djing/formfields.py

@ -7,7 +7,6 @@ from django.utils.translation import gettext_lazy as _
from netaddr import EUI, AddrFormatError from netaddr import EUI, AddrFormatError
from . import MAC_ADDR_REGEX from . import MAC_ADDR_REGEX
mac_address_validator = RegexValidator( mac_address_validator = RegexValidator(
_lazy_re_compile(MAC_ADDR_REGEX), _lazy_re_compile(MAC_ADDR_REGEX),
message=_('Enter a valid integer.'), message=_('Enter a valid integer.'),

4
djing/global_base_views.py

@ -23,7 +23,6 @@ class RedirectWhenError(Exception):
class HashAuthView(View): class HashAuthView(View):
@staticmethod @staticmethod
def calc_hash(data): def calc_hash(data):
if type(data) is str: if type(data) is str:
@ -60,7 +59,6 @@ class HashAuthView(View):
class AllowedSubnetMixin(object): class AllowedSubnetMixin(object):
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
""" """
Check if user ip in allowed subnet. Check if user ip in allowed subnet.
@ -80,6 +78,7 @@ class OrderingMixin(object):
@dir - direction of ordering. down or up. @dir - direction of ordering. down or up.
@order_by - ordering field name @order_by - ordering field name
""" """
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(OrderingMixin, self).get_context_data(**kwargs) context = super(OrderingMixin, self).get_context_data(**kwargs)
context['order_by'] = self.request.GET.get('order_by') context['order_by'] = self.request.GET.get('order_by')
@ -104,7 +103,6 @@ class OrderingMixin(object):
class RedirectWhenErrorMixin(object): class RedirectWhenErrorMixin(object):
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
try: try:
return super(RedirectWhenErrorMixin, self).get(request, *args, **kwargs) return super(RedirectWhenErrorMixin, self).get(request, *args, **kwargs)

12
djing/settings.py

@ -1,13 +1,11 @@
# -*- coding: utf-8 -* # -*- coding: utf-8 -*
import os import os
try: try:
from . import local_settings from . import local_settings
except ImportError: except ImportError:
raise ImportError("You must create config file local_settings.py from template") raise ImportError("You must create config file local_settings.py from template")
# Build paths inside the project like this: os.path.join(BASE_DIR, ...) # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
from django.urls import reverse_lazy from django.urls import reverse_lazy
@ -26,14 +24,14 @@ ALLOWED_HOSTS = local_settings.ALLOWED_HOSTS
# required for django-guardian # required for django-guardian
AUTHENTICATION_BACKENDS = ( AUTHENTICATION_BACKENDS = (
'djing.auth_backends.CustomAuthBackend', 'djing.auth_backends.CustomAuthBackend',
#'django.contrib.auth.backends.ModelBackend', # default
# 'django.contrib.auth.backends.ModelBackend', # default
'guardian.backends.ObjectPermissionBackend' 'guardian.backends.ObjectPermissionBackend'
) )
# Application definition # Application definition
INSTALLED_APPS = [ INSTALLED_APPS = [
#'django.contrib.admin',
# 'django.contrib.admin',
'django.contrib.auth', 'django.contrib.auth',
'django.contrib.contenttypes', 'django.contrib.contenttypes',
'django.contrib.sessions', 'django.contrib.sessions',
@ -79,7 +77,7 @@ TEMPLATES = [
'APP_DIRS': True, 'APP_DIRS': True,
'OPTIONS': { 'OPTIONS': {
'context_processors': [ 'context_processors': [
#'django.template.context_processors.debug',
# 'django.template.context_processors.debug',
'django.template.context_processors.request', 'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth', 'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages', 'django.contrib.messages.context_processors.messages',
@ -95,13 +93,11 @@ TEMPLATES = [
WSGI_APPLICATION = 'djing.wsgi.application' WSGI_APPLICATION = 'djing.wsgi.application'
# Database # Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases # https://docs.djangoproject.com/en/1.11/ref/settings/#databases
DATABASES = local_settings.DATABASES DATABASES = local_settings.DATABASES
# Password validation # Password validation
# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators # https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators
@ -145,7 +141,6 @@ FILE_UPLOAD_MAX_MEMORY_SIZE = 4096000
# time to session live, 1 day # time to session live, 1 day
SESSION_COOKIE_AGE = 60 * 60 * 24 SESSION_COOKIE_AGE = 60 * 60 * 24
# Static files (CSS, JavaScript, Images) # Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.9/howto/static-files/ # https://docs.djangoproject.com/en/1.9/howto/static-files/
@ -153,7 +148,6 @@ STATIC_URL = '/static/'
if DEBUG: if DEBUG:
STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"),) STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"),)
# Example output: 16 september 2018 # Example output: 16 september 2018
DATE_FORMAT = 'd E Y' DATE_FORMAT = 'd E Y'

4
djing/urls.py

@ -1,6 +1,6 @@
from django.conf.urls import url, include from django.conf.urls import url, include
from django.conf import settings from django.conf import settings
#from django.contrib import admin
# from django.contrib import admin
from .views import home from .views import home
@ -18,7 +18,7 @@ urlpatterns = [
url(r'^msg/', include('msg_app.urls', namespace='msg_app')), url(r'^msg/', include('msg_app.urls', namespace='msg_app')),
url(r'^dialing/', include('dialing_app.urls', namespace='dialapp')), url(r'^dialing/', include('dialing_app.urls', namespace='dialapp')),
url(r'^groups/', include('group_app.urls', namespace='group_app')), url(r'^groups/', include('group_app.urls', namespace='group_app')),
#url(r'^admin/', admin.site.urls)
# url(r'^admin/', admin.site.urls)
] ]

1
group_app/migrations/0001_initial.py

@ -6,7 +6,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [

2
group_app/urls.py

@ -7,4 +7,4 @@ urlpatterns = [
url(r'^$', views.GroupListView.as_view(), name='group_list'), url(r'^$', views.GroupListView.as_view(), name='group_list'),
url(r'^add/$', views.AddGroupView.as_view(), name='add'), url(r'^add/$', views.AddGroupView.as_view(), name='add'),
url(r'^(?P<group_id>\d{1,6})/edit/$', views.EditGroupView.as_view(), name='edit') url(r'^(?P<group_id>\d{1,6})/edit/$', views.EditGroupView.as_view(), name='edit')
]
]

4
mapapp/migrations/0001_initial.py

@ -6,7 +6,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
@ -21,7 +20,8 @@ class Migration(migrations.Migration):
('title', models.CharField(max_length=127, verbose_name='Map point title')), ('title', models.CharField(max_length=127, verbose_name='Map point title')),
('latitude', models.FloatField(verbose_name='Latitude')), ('latitude', models.FloatField(verbose_name='Latitude')),
('longitude', models.FloatField(verbose_name='Longitude')), ('longitude', models.FloatField(verbose_name='Longitude')),
('attachment', models.FileField(blank=True, null=True, upload_to='map_attachments/%Y_%m_%d', verbose_name='Attachment')),
('attachment', models.FileField(blank=True, null=True, upload_to='map_attachments/%Y_%m_%d',
verbose_name='Attachment')),
('devices', models.ManyToManyField(db_table='dot_device', to='devapp.Device', verbose_name='Devices')), ('devices', models.ManyToManyField(db_table='dot_device', to='devapp.Device', verbose_name='Devices')),
], ],
options={ options={

2
mapapp/templates/maps/dot.html

@ -73,7 +73,7 @@
<a href="{% url 'devapp:view' 0 dev.pk %}">{{ dev.comment }}</a> <a href="{% url 'devapp:view' 0 dev.pk %}">{{ dev.comment }}</a>
{% endif %} {% endif %}
</td> </td>
<td>{{ dev.ip_address }}</td>
<td>{{ dev.ip_address|default:'-' }}</td>
<td>{{ dev.get_comment_display }}</td> <td>{{ dev.get_comment_display }}</td>
<td> <td>
{% if dev.group %} {% if dev.group %}

2
mapapp/urls.py

@ -2,10 +2,8 @@ from django.conf.urls import url
from . import views from . import views
app_name = 'mapapp' app_name = 'mapapp'
urlpatterns = [ urlpatterns = [
url(r'^$', views.home, name='home'), url(r'^$', views.home, name='home'),
url(r'^options$', views.OptionsListView.as_view(), name='options'), url(r'^options$', views.OptionsListView.as_view(), name='options'),

1
messaging/sms/base.py

@ -2,7 +2,6 @@
class SmsBase(object): class SmsBase(object):
def __init__(self): def __init__(self):
self.udh = None self.udh = None
self.number = None self.number = None

9
messaging/sms/deliver.py

@ -142,7 +142,7 @@ class SmsDeliver(SmsBase):
if (tz & 0x08): if (tz & 0x08):
offset = offset * -1 offset = offset * -1
# 02/08/26 19:37:41
# 02/08/26 19:37:41
datestr = "%s%s/%s%s/%s%s %s%s:%s%s:%s%s" % tuple(date) datestr = "%s%s/%s%s/%s%s %s%s:%s%s:%s%s" % tuple(date)
outputfmt = '%y/%m/%d %H:%M:%S' outputfmt = '%y/%m/%d %H:%M:%S'
@ -174,7 +174,7 @@ class SmsDeliver(SmsBase):
if self.fmt == 0x00: if self.fmt == 0x00:
# XXX: Use unpack_msg2 # XXX: Use unpack_msg2
data = data[ud_len:].tolist() data = data[ud_len:].tolist()
#self.text = unpack_msg2(data).decode("gsm0338")
# self.text = unpack_msg2(data).decode("gsm0338")
self.text = unpack_msg(msg)[headlen:msgl].decode("gsm0338") self.text = unpack_msg(msg)[headlen:msgl].decode("gsm0338")
elif self.fmt == 0x04: elif self.fmt == 0x04:
@ -183,7 +183,7 @@ class SmsDeliver(SmsBase):
elif self.fmt == 0x08: elif self.fmt == 0x08:
data = data[ud_len:].tolist() data = data[ud_len:].tolist()
_bytes = [int("%02X%02X" % (data[i], data[i + 1]), 16) _bytes = [int("%02X%02X" % (data[i], data[i + 1]), 16)
for i in range(0, len(data), 2)]
for i in range(0, len(data), 2)]
self.text = ''.join(list(map(chr, _bytes))) self.text = ''.join(list(map(chr, _bytes)))
pdu = property(lambda self: self._pdu, _set_pdu) pdu = property(lambda self: self._pdu, _set_pdu)
@ -252,7 +252,7 @@ class SmsDeliver(SmsBase):
self.number = sender self.number = sender
self.text = "|".join(msg_l) self.text = "|".join(msg_l)
self.fmt = 0x08 # UCS2
self.fmt = 0x08 # UCS2
self.type = 0x03 # status report self.type = 0x03 # status report
self.sr = { self.sr = {
@ -261,4 +261,3 @@ class SmsDeliver(SmsBase):
'dt': dt, 'dt': dt,
'status': _status 'status': _status
} }

9
messaging/sms/gsm0338.py

@ -31,9 +31,9 @@ def_regular_decode_dict = {
'\x07': u'\u00EC', # LATIN SMALL LETTER I WITH GRAVE '\x07': u'\u00EC', # LATIN SMALL LETTER I WITH GRAVE
'\x08': u'\u00F2', # LATIN SMALL LETTER O WITH GRAVE '\x08': u'\u00F2', # LATIN SMALL LETTER O WITH GRAVE
'\x09': u'\u00C7', # LATIN CAPITAL LETTER C WITH CEDILLA '\x09': u'\u00C7', # LATIN CAPITAL LETTER C WITH CEDILLA
# The Unicode page suggests this is a mistake: but
# it's still in the latest version of the spec and
# our implementation has to be exact.
# The Unicode page suggests this is a mistake: but
# it's still in the latest version of the spec and
# our implementation has to be exact.
'\x0A': u'\u000A', # LINE FEED '\x0A': u'\u000A', # LINE FEED
'\x0B': u'\u00D8', # LATIN CAPITAL LETTER O WITH STROKE '\x0B': u'\u00D8', # LATIN CAPITAL LETTER O WITH STROKE
@ -222,7 +222,7 @@ def encode(input_, errors='strict'):
raise UnicodeError("Invalid GSM character") raise UnicodeError("Invalid GSM character")
elif errors == 'replace': elif errors == 'replace':
result.append( result.append(
def_replace_encode_dict.get(c, QUESTION_MARK))
def_replace_encode_dict.get(c, QUESTION_MARK))
elif errors == 'ignore': elif errors == 'ignore':
pass pass
else: else:
@ -275,6 +275,7 @@ def getregentry(encoding):
encode=encode, encode=encode,
decode=decode) decode=decode)
# Codec registration # Codec registration
codecs.register(getregentry) codecs.register(getregentry)

1
messaging/sms/pdu.py

@ -2,7 +2,6 @@
class Pdu(object): class Pdu(object):
def __init__(self, pdu, len_smsc, cnt=1, seq=1): def __init__(self, pdu, len_smsc, cnt=1, seq=1):
self.pdu = pdu.upper() self.pdu = pdu.upper()
self.length = len(pdu) / 2 - len_smsc self.length = len(pdu) / 2 - len_smsc

3
messaging/sms/udh.py

@ -2,7 +2,6 @@
class PortAddress(object): class PortAddress(object):
def __init__(self, dest_port, orig_port, eight_bits): def __init__(self, dest_port, orig_port, eight_bits):
self.dest_port = dest_port self.dest_port = dest_port
self.orig_port = orig_port self.orig_port = orig_port
@ -14,7 +13,6 @@ class PortAddress(object):
class ConcatReference(object): class ConcatReference(object):
def __init__(self, ref, cnt, seq, eight_bits): def __init__(self, ref, cnt, seq, eight_bits):
self.ref = ref self.ref = ref
self.cnt = cnt self.cnt = cnt
@ -27,7 +25,6 @@ class ConcatReference(object):
class UserDataHeader(object): class UserDataHeader(object):
def __init__(self): def __init__(self):
self.concat = None self.concat = None
self.ports = None self.ports = None

18
migrate_to_0.2.py

@ -6,13 +6,11 @@ import shutil
from json import dump from json import dump
import django import django
''' '''
Some permissions is not migrates, all admins is superuser Some permissions is not migrates, all admins is superuser
after migrate. after migrate.
''' '''
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings") os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings")
from django.db.models import fields as django_fields from django.db.models import fields as django_fields
@ -29,14 +27,16 @@ def get_fixture_from_unchanget_model(model_name: str, model_class):
def get_fields(obj): def get_fields(obj):
fields = dict() fields = dict()
for field in obj._meta.get_fields(): for field in obj._meta.get_fields():
if isinstance(field, (django_fields.reverse_related.ManyToOneRel, django_fields.reverse_related.ManyToManyRel)):
if isinstance(field,
(django_fields.reverse_related.ManyToOneRel, django_fields.reverse_related.ManyToManyRel)):
continue continue
field_val = getattr(obj, field.name) field_val = getattr(obj, field.name)
if field_val is None: if field_val is None:
continue continue
if isinstance(field, django_fields.related.ManyToManyField): if isinstance(field, django_fields.related.ManyToManyField):
fields[field.name] = [f.pk for f in field_val.all()] fields[field.name] = [f.pk for f in field_val.all()]
elif isinstance(field, (django_fields.related.ForeignKey, django.contrib.contenttypes.fields.GenericForeignKey)):
elif isinstance(field,
(django_fields.related.ForeignKey, django.contrib.contenttypes.fields.GenericForeignKey)):
fields[field.name] = field_val.pk fields[field.name] = field_val.pk
elif isinstance(field, django_fields.FloatField): elif isinstance(field, django_fields.FloatField):
fields[field.name] = float(field_val) fields[field.name] = float(field_val)
@ -324,13 +324,13 @@ def move_to_fixtures_dirs():
def apply_fixtures(): def apply_fixtures():
from django.core.management import execute_from_command_line from django.core.management import execute_from_command_line
from accounts_app.models import UserProfile from accounts_app.models import UserProfile
#from django.contrib.auth import models
# from django.contrib.auth import models
UserProfile.objects.filter(username='AnonymousUser').delete() UserProfile.objects.filter(username='AnonymousUser').delete()
#print('clearing auth.group')
#models.Group.objects.all().delete()
#print('clearing auth.permission')
#models.Permission.objects.all().delete()
# print('clearing auth.group')
# models.Group.objects.all().delete()
# print('clearing auth.permission')
# models.Permission.objects.all().delete()
fixtures_names = [ fixtures_names = [
'groups_fixture.json', 'tariffs_fixture.json', 'photos_fixture.json', 'groups_fixture.json', 'tariffs_fixture.json', 'photos_fixture.json',

1
msg_app/admin.py

@ -3,4 +3,3 @@ from . import models
admin.site.register(models.Message) admin.site.register(models.Message)
admin.site.register(models.Conversation) admin.site.register(models.Conversation)

9
msg_app/forms.py

@ -5,15 +5,16 @@ from accounts_app.models import UserProfile
class ConversationForm(forms.ModelForm): class ConversationForm(forms.ModelForm):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(ConversationForm, self).__init__(*args, **kwargs) super(ConversationForm, self).__init__(*args, **kwargs)
user_profile_queryset = UserProfile.objects.filter(is_admin=True) user_profile_queryset = UserProfile.objects.filter(is_admin=True)
if user_profile_queryset is not None: if user_profile_queryset is not None:
self.fields['participants'].choices = [(up.pk, up.get_full_name()) for up in user_profile_queryset] self.fields['participants'].choices = [(up.pk, up.get_full_name()) for up in user_profile_queryset]
title = forms.CharField(max_length=32, required=False, widget=forms.TextInput(attrs={'class': 'form-control', 'maxlength': '32'}))
participants = forms.MultipleChoiceField(required=False, widget=forms.SelectMultiple(attrs={'class': 'form-control'}))
title = forms.CharField(max_length=32, required=False,
widget=forms.TextInput(attrs={'class': 'form-control', 'maxlength': '32'}))
participants = forms.MultipleChoiceField(required=False,
widget=forms.SelectMultiple(attrs={'class': 'form-control'}))
class Meta: class Meta:
model = Conversation model = Conversation
@ -36,7 +37,6 @@ class ConversationForm(forms.ModelForm):
class MessageForm(forms.ModelForm): class MessageForm(forms.ModelForm):
class Meta: class Meta:
model = Message model = Message
exclude = ['sent_at', 'author', 'conversation', 'account_status'] exclude = ['sent_at', 'author', 'conversation', 'account_status']
@ -57,7 +57,6 @@ class MessageForm(forms.ModelForm):
) )
return msg return msg
def save(self, commit=True): def save(self, commit=True):
# You must use MessageForm.create() for save the form # You must use MessageForm.create() for save the form
raise NotImplementedError raise NotImplementedError

33
msg_app/migrations/0001_initial.py

@ -8,7 +8,6 @@ import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
@ -35,10 +34,16 @@ class Migration(migrations.Migration):
name='ConversationMembership', name='ConversationMembership',
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')),
('status', models.CharField(choices=[('adm', 'Admin'), ('gst', 'Guest'), ('ban', 'Banned user'), ('inv', 'Inviter')], default='gst', max_length=3)),
('account', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='memberships', to=settings.AUTH_USER_MODEL)),
('conversation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='msg_app.Conversation')),
('who_invite_that_user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='self_conversations', to=settings.AUTH_USER_MODEL)),
('status', models.CharField(
choices=[('adm', 'Admin'), ('gst', 'Guest'), ('ban', 'Banned user'), ('inv', 'Inviter')],
default='gst', max_length=3)),
('account', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='memberships',
to=settings.AUTH_USER_MODEL)),
('conversation',
models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='msg_app.Conversation')),
('who_invite_that_user',
models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE,
related_name='self_conversations', to=settings.AUTH_USER_MODEL)),
], ],
options={ options={
'verbose_name': 'Conversation membership', 'verbose_name': 'Conversation membership',
@ -66,9 +71,12 @@ class Migration(migrations.Migration):
name='MessageStatus', name='MessageStatus',
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')),
('state', models.CharField(choices=[('new', 'New'), ('old', 'Seen'), ('del', 'Deleted')], default='new', max_length=3)),
('msg', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='msg_statuses', to='msg_app.Message')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='usr_msg_status', to=settings.AUTH_USER_MODEL)),
('state', models.CharField(choices=[('new', 'New'), ('old', 'Seen'), ('del', 'Deleted')], default='new',
max_length=3)),
('msg', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='msg_statuses',
to='msg_app.Message')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='usr_msg_status',
to=settings.AUTH_USER_MODEL)),
], ],
options={ options={
'verbose_name': 'Message status', 'verbose_name': 'Message status',
@ -84,17 +92,20 @@ class Migration(migrations.Migration):
migrations.AddField( migrations.AddField(
model_name='message', model_name='message',
name='author', name='author',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='messages', to=settings.AUTH_USER_MODEL),
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='messages',
to=settings.AUTH_USER_MODEL),
), ),
migrations.AddField( migrations.AddField(
model_name='message', model_name='message',
name='conversation', name='conversation',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='msg_app.Conversation', verbose_name='Conversation'),
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='msg_app.Conversation',
verbose_name='Conversation'),
), ),
migrations.AddField( migrations.AddField(
model_name='conversation', model_name='conversation',
name='participants', name='participants',
field=models.ManyToManyField(related_name='conversations', through='msg_app.ConversationMembership', to=settings.AUTH_USER_MODEL),
field=models.ManyToManyField(related_name='conversations', through='msg_app.ConversationMembership',
to=settings.AUTH_USER_MODEL),
), ),
migrations.AlterUniqueTogether( migrations.AlterUniqueTogether(
name='messagestatus', name='messagestatus',

6
msg_app/models.py

@ -10,7 +10,7 @@ class MessageError(Exception):
class MessageStatus(models.Model): class MessageStatus(models.Model):
msg = models.ForeignKey('Message', models.CASCADE, related_name='msg_statuses')
msg = models.ForeignKey('Message', models.CASCADE, related_name='msg_statuses')
user = models.ForeignKey(UserProfile, models.CASCADE, related_name='usr_msg_status') user = models.ForeignKey(UserProfile, models.CASCADE, related_name='usr_msg_status')
MESSAGE_STATES = ( MESSAGE_STATES = (
('new', _('New')), ('new', _('New')),
@ -82,7 +82,8 @@ class ConversationMembership(models.Model):
('inv', _('Inviter')) ('inv', _('Inviter'))
) )
status = models.CharField(max_length=3, choices=PARTICIPANT_STATUS, default='gst') status = models.CharField(max_length=3, choices=PARTICIPANT_STATUS, default='gst')
who_invite_that_user = models.ForeignKey(UserProfile, models.CASCADE, null=True, blank=True, related_name='self_conversations')
who_invite_that_user = models.ForeignKey(UserProfile, models.CASCADE, null=True, blank=True,
related_name='self_conversations')
def __str__(self): def __str__(self):
return "%s < %s" % (self.conversation, self.account) return "%s < %s" % (self.conversation, self.account)
@ -103,7 +104,6 @@ def id_to_userprofile(acc):
class ConversationManager(models.Manager): class ConversationManager(models.Manager):
def create_conversation(self, author, other_participants, title=None): def create_conversation(self, author, other_participants, title=None):
other_participants = [id_to_userprofile(acc) for acc in other_participants] other_participants = [id_to_userprofile(acc) for acc in other_participants]
if not title: if not title:

2
msg_app/urls.py

@ -1,10 +1,8 @@
from django.conf.urls import url from django.conf.urls import url
from . import views from . import views
app_name = 'msg_app' app_name = 'msg_app'
urlpatterns = [ urlpatterns = [
url(r'^$', views.ConversationsListView.as_view(), name='home'), url(r'^$', views.ConversationsListView.as_view(), name='home'),
url(r'^new$', views.new_conversation, name='new_conversation'), url(r'^new$', views.new_conversation, name='new_conversation'),

3
photo_app/admin.py

@ -2,5 +2,4 @@ from django.contrib import admin
from . import models from . import models
admin.site.register(models.Photo)
admin.site.register(models.Photo)

1
photo_app/migrations/0001_initial.py

@ -6,7 +6,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [

9
photo_app/urls.py

@ -2,10 +2,9 @@
urlpatterns = [ urlpatterns = [
# url(r'^$', 'photo_albums', name='media_home_link'), # url(r'^$', 'photo_albums', name='media_home_link'),
#url(r'^(?P<id>\d+)$', 'photo_albums', name='media_home_link_by_id'),
#url(r'^album(?P<id>\d+)$', 'photos', name='media_photos_link'),
# url(r'^(?P<id>\d+)$', 'photo_albums', name='media_home_link_by_id'),
# url(r'^album(?P<id>\d+)$', 'photos', name='media_photos_link'),
#url(r'^newalbum/$', 'add_album', name='add_media_album_link'),
#url(r'^newphoto/$', 'add_photo_to_album', name='add_media_photo_link')
# url(r'^newalbum/$', 'add_album', name='add_media_album_link'),
# url(r'^newphoto/$', 'add_photo_to_album', name='add_media_photo_link')
] ]

4
queue_mngr.py

@ -4,10 +4,10 @@ from pickle import loads
from pid.decorator import pidfile from pid.decorator import pidfile
import socket import socket
import django import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings") os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings")
from mydefs import LogicError from mydefs import LogicError
''' '''
obj = { obj = {
'client_ip': ip2int('127.0.0.1'), 'client_ip': ip2int('127.0.0.1'),
@ -57,5 +57,5 @@ if __name__ == '__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings") os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings")
django.setup() django.setup()
from agent.commands.dhcp import dhcp_commit, dhcp_expiry, dhcp_release from agent.commands.dhcp import dhcp_commit, dhcp_expiry, dhcp_release
serve()
serve()

2
searchapp/apps.py

@ -1,5 +1,3 @@
from django.apps import AppConfig from django.apps import AppConfig

2
searchapp/models.py

@ -1,3 +1 @@
# Create your models here. # Create your models here.

1
searchapp/urls.py

@ -2,7 +2,6 @@ from django.conf.urls import url
from . import views from . import views
app_name = 'searchapp' app_name = 'searchapp'
urlpatterns = [ urlpatterns = [

3
statistics/fields.py

@ -8,7 +8,6 @@ import django.db.models as models
class UnixDateTimeField(models.DateTimeField): class UnixDateTimeField(models.DateTimeField):
# TODO(niklas9): # TODO(niklas9):
# * should we take care of transforming between time zones in any way here ? # * should we take care of transforming between time zones in any way here ?
# * get default datetime format from settings ? # * get default datetime format from settings ?
@ -16,7 +15,7 @@ class UnixDateTimeField(models.DateTimeField):
TZ_CONST = '+' TZ_CONST = '+'
# TODO(niklas9): # TODO(niklas9):
# * metaclass below just for Django < 1.9, fix a if stmt for it? # * metaclass below just for Django < 1.9, fix a if stmt for it?
#__metaclass__ = models.SubfieldBase
# __metaclass__ = models.SubfieldBase
description = "Unix timestamp integer to datetime object" description = "Unix timestamp integer to datetime object"
def get_internal_type(self): def get_internal_type(self):

4
statistics/migrations/0001_initial.py

@ -8,7 +8,6 @@ import statistics.fields
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
@ -19,7 +18,8 @@ class Migration(migrations.Migration):
name='StatCache', name='StatCache',
fields=[ fields=[
('last_time', statistics.fields.UnixDateTimeField()), ('last_time', statistics.fields.UnixDateTimeField()),
('ip', mydefs.MyGenericIPAddressField(max_length=8, primary_key=True, protocol='ipv4', serialize=False)),
(
'ip', mydefs.MyGenericIPAddressField(max_length=8, primary_key=True, protocol='ipv4', serialize=False)),
('octets', models.PositiveIntegerField(default=0)), ('octets', models.PositiveIntegerField(default=0)),
('packets', models.PositiveIntegerField(default=0)), ('packets', models.PositiveIntegerField(default=0)),
], ],

20
statistics/models.py

@ -14,23 +14,22 @@ def get_dates():
class StatManager(models.Manager): class StatManager(models.Manager):
def chart(self, username, count_of_parts=12, want_date=date.today()): def chart(self, username, count_of_parts=12, want_date=date.today()):
def byte_to_mbit(x): def byte_to_mbit(x):
return ((x/60)*8)/2**20
return ((x / 60) * 8) / 2 ** 20
def split_list(lst, chunk_count): def split_list(lst, chunk_count):
chunk_size = len(lst) // chunk_count chunk_size = len(lst) // chunk_count
if chunk_size == 0: if chunk_size == 0:
chunk_size = 1 chunk_size = 1
return [lst[i:i+chunk_size] for i in range(0, len(lst), chunk_size)]
return [lst[i:i + chunk_size] for i in range(0, len(lst), chunk_size)]
def avarage(elements): def avarage(elements):
return sum(elements) / len(elements) return sum(elements) / len(elements)
try: try:
charts_data = self.filter(uname=username) charts_data = self.filter(uname=username)
charts_times = [cd.cur_time.timestamp()*1000 for cd in charts_data]
charts_times = [cd.cur_time.timestamp() * 1000 for cd in charts_data]
charts_octets = [cd.octets for cd in charts_data] charts_octets = [cd.octets for cd in charts_data]
if len(charts_octets) > 0 and len(charts_octets) == len(charts_times): if len(charts_octets) > 0 and len(charts_octets) == len(charts_times):
charts_octets = split_list(charts_octets, count_of_parts) charts_octets = split_list(charts_octets, count_of_parts)
@ -52,7 +51,6 @@ class StatManager(models.Manager):
return return
class StatElem(models.Model): class StatElem(models.Model):
cur_time = UnixDateTimeField(primary_key=True) cur_time = UnixDateTimeField(primary_key=True)
uname = models.CharField(max_length=127, blank=True, null=True, default=None) uname = models.CharField(max_length=127, blank=True, null=True, default=None)
@ -81,7 +79,7 @@ class StatElem(models.Model):
cursor.execute(sql) cursor.execute(sql)
@staticmethod @staticmethod
def percentile(N, percent, key=lambda x:x):
def percentile(N, percent, key=lambda x: x):
""" """
Find the percentile of a list of values. Find the percentile of a list of values.
@ -93,25 +91,25 @@ class StatElem(models.Model):
""" """
if not N: if not N:
return None return None
k = (len(N)-1) * percent
k = (len(N) - 1) * percent
f = math.floor(k) f = math.floor(k)
c = math.ceil(k) c = math.ceil(k)
if f == c: if f == c:
return key(N[int(k)]) return key(N[int(k)])
d0 = key(N[int(f)]) * (c-k)
d1 = key(N[int(c)]) * (k-f)
return d0+d1
d0 = key(N[int(f)]) * (c - k)
d1 = key(N[int(c)]) * (k - f)
return d0 + d1
class Meta: class Meta:
abstract = True abstract = True
def getModel(want_date=now()): def getModel(want_date=now()):
class DynamicStatElem(StatElem): class DynamicStatElem(StatElem):
class Meta: class Meta:
db_table = 'flowstat_%s' % want_date.strftime("%d%m%Y") db_table = 'flowstat_%s' % want_date.strftime("%d%m%Y")
abstract = False abstract = False
return DynamicStatElem return DynamicStatElem

2
statistics/urls.py

@ -2,10 +2,8 @@ from django.conf.urls import url
from . import views from . import views
app_name = 'statistics' app_name = 'statistics'
urlpatterns = [ urlpatterns = [
url(r'^$', views.home, name='home'), url(r'^$', views.home, name='home'),
] ]

6
systemd_units/webdav_backup.py

@ -3,7 +3,6 @@ from sys import argv
from datetime import datetime, timedelta from datetime import datetime, timedelta
import webdav.client as wc import webdav.client as wc
options = { options = {
'webdav_hostname': "https://webdav.yandex.ru/", 'webdav_hostname': "https://webdav.yandex.ru/",
'webdav_login': "YANDEX USERNAME", 'webdav_login': "YANDEX USERNAME",
@ -11,13 +10,13 @@ options = {
} }
def remove_old_files(border_time : datetime, client):
def remove_old_files(border_time: datetime, client):
# files that older than border_time will be removed # files that older than border_time will be removed
for file in client.list('ISBackups'): for file in client.list('ISBackups'):
fdate = datetime.strptime(file, 'djing%Y-%m-%d_%H.%M.%S.sql.gz') fdate = datetime.strptime(file, 'djing%Y-%m-%d_%H.%M.%S.sql.gz')
if fdate < border_time: if fdate < border_time:
del_fname = 'ISBackups/%' % file del_fname = 'ISBackups/%' % file
client.clean( del_fname )
client.clean(del_fname)
print("rm %s" % del_fname) print("rm %s" % del_fname)
@ -32,4 +31,3 @@ if __name__ == '__main__':
client.upload_sync(remote_path="ISBackups/%s" % reqfile, local_path="/var/backups/%s" % reqfile) client.upload_sync(remote_path="ISBackups/%s" % reqfile, local_path="/var/backups/%s" % reqfile)
except wc.WebDavException as we: except wc.WebDavException as we:
print(we, type(we)) print(we, type(we))

1
tariff_app/admin.py

@ -2,5 +2,4 @@ from django.contrib import admin
from . import models from . import models
admin.site.register(models.Tariff) admin.site.register(models.Tariff)

9
tariff_app/migrations/0001_initial.py

@ -7,7 +7,6 @@ import jsonfield.fields
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
@ -21,7 +20,9 @@ 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')),
('name', models.CharField(max_length=64, verbose_name='Periodic pay name')), ('name', models.CharField(max_length=64, verbose_name='Periodic pay name')),
('when_add', models.DateTimeField(auto_now_add=True, verbose_name='When pay created')), ('when_add', models.DateTimeField(auto_now_add=True, verbose_name='When pay created')),
('calc_type', models.CharField(choices=[('df', 'Default periodic pay'), ('cs', 'Custom periodic pay')], default='df', max_length=2, verbose_name='Script type for calculations')),
('calc_type',
models.CharField(choices=[('df', 'Default periodic pay'), ('cs', 'Custom periodic pay')], default='df',
max_length=2, verbose_name='Script type for calculations')),
('amount', models.FloatField(verbose_name='Total amount')), ('amount', models.FloatField(verbose_name='Total amount')),
('extra_info', jsonfield.fields.JSONField()), ('extra_info', jsonfield.fields.JSONField()),
], ],
@ -42,7 +43,9 @@ class Migration(migrations.Migration):
('speedIn', models.FloatField(default=0.0, verbose_name='Speed In')), ('speedIn', models.FloatField(default=0.0, verbose_name='Speed In')),
('speedOut', models.FloatField(default=0.0, verbose_name='Speed Out')), ('speedOut', models.FloatField(default=0.0, verbose_name='Speed Out')),
('amount', models.FloatField(default=0.0, verbose_name='Price')), ('amount', models.FloatField(default=0.0, verbose_name='Price')),
('calc_type', models.CharField(choices=[('Df', 'Base calculate functionality'), ('Dp', 'IS'), ('Cp', 'Private service')], default='Df', max_length=2, verbose_name='Script')),
('calc_type', models.CharField(
choices=[('Df', 'Base calculate functionality'), ('Dp', 'IS'), ('Cp', 'Private service')],
default='Df', max_length=2, verbose_name='Script')),
('is_admin', models.BooleanField(default=False, verbose_name='Tech service')), ('is_admin', models.BooleanField(default=False, verbose_name='Tech service')),
('groups', models.ManyToManyField(blank=True, to='group_app.Group')), ('groups', models.ManyToManyField(blank=True, to='group_app.Group')),
], ],

1
tariff_app/models.py

@ -10,7 +10,6 @@ from jsonfield import JSONField
class TariffManager(models.Manager): class TariffManager(models.Manager):
def get_tariffs_by_group(self, group_id): def get_tariffs_by_group(self, group_id):
return self.filter(groups__id__in=[group_id]) return self.filter(groups__id__in=[group_id])

1
taskapp/admin.py

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

1
taskapp/forms.py

@ -44,7 +44,6 @@ class TaskFrm(forms.ModelForm):
class ExtraCommentForm(forms.ModelForm): class ExtraCommentForm(forms.ModelForm):
def make_save(self, author, task: Task): def make_save(self, author, task: Task):
comment = super(ExtraCommentForm, self).save(commit=False) comment = super(ExtraCommentForm, self).save(commit=False)
comment.author = author comment.author = author

2
taskapp/handle.py

@ -28,7 +28,7 @@ def handle(task, author, recipients, abon_group):
fulltext += _('locality %s.\n') % abon_group.title fulltext += _('locality %s.\n') % abon_group.title
if task.abon: if task.abon:
fulltext += _('address %(street)s %(house)s.\ntelephone %(telephone)s\n') % { fulltext += _('address %(street)s %(house)s.\ntelephone %(telephone)s\n') % {
'street': task.abon.street.name if task.abon.street is not None else '<'+_('not chosen')+'>',
'street': task.abon.street.name if task.abon.street is not None else '<' + _('not chosen') + '>',
'house': task.abon.house, 'house': task.abon.house,
'telephone': task.abon.telephone 'telephone': task.abon.telephone
} }

44
taskapp/migrations/0001_initial.py

@ -9,7 +9,6 @@ import taskapp.models
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
@ -22,7 +21,9 @@ class Migration(migrations.Migration):
name='ChangeLog', name='ChangeLog',
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')),
('act_type', models.CharField(choices=[('e', 'Change task'), ('c', 'Create task'), ('d', 'Delete task'), ('f', 'Completing tasks'), ('b', 'The task failed')], max_length=1)),
('act_type', models.CharField(choices=[('e', 'Change task'), ('c', 'Create task'), ('d', 'Delete task'),
('f', 'Completing tasks'), ('b', 'The task failed')],
max_length=1)),
('when', models.DateTimeField(auto_now_add=True)), ('when', models.DateTimeField(auto_now_add=True)),
], ],
), ),
@ -32,7 +33,8 @@ 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')),
('text', models.TextField(verbose_name='Text of comment')), ('text', models.TextField(verbose_name='Text of comment')),
('date_create', models.DateTimeField(auto_now_add=True, verbose_name='Time of create')), ('date_create', models.DateTimeField(auto_now_add=True, verbose_name='Time of create')),
('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Author')),
('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL,
verbose_name='Author')),
], ],
options={ options={
'verbose_name': 'Extra comment', 'verbose_name': 'Extra comment',
@ -46,15 +48,29 @@ 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(blank=True, max_length=128, null=True, verbose_name='Description')), ('descr', models.CharField(blank=True, max_length=128, null=True, verbose_name='Description')),
('priority', models.CharField(choices=[('A', 'Higher'), ('C', 'Average'), ('E', 'Low')], default='E', max_length=1, verbose_name='A priority')),
('out_date', models.DateField(blank=True, default=taskapp.models._delta_add_days, null=True, verbose_name='Reality')),
('priority',
models.CharField(choices=[('A', 'Higher'), ('C', 'Average'), ('E', 'Low')], default='E', max_length=1,
verbose_name='A priority')),
('out_date', models.DateField(blank=True, default=taskapp.models._delta_add_days, null=True,
verbose_name='Reality')),
('time_of_create', models.DateTimeField(auto_now_add=True, verbose_name='Date of create')), ('time_of_create', models.DateTimeField(auto_now_add=True, verbose_name='Date of create')),
('state', models.CharField(choices=[('S', 'New'), ('C', 'Confused'), ('F', 'Completed')], default='S', max_length=1, verbose_name='Condition')),
('attachment', models.ImageField(blank=True, null=True, upload_to='task_attachments/%Y.%m.%d', verbose_name='Attached image')),
('mode', models.CharField(choices=[('na', 'not chosen'), ('ic', 'ip conflict'), ('yt', 'yellow triangle'), ('rc', 'red cross'), ('ls', 'weak speed'), ('cf', 'cable break'), ('cn', 'connection'), ('pf', 'periodic disappearance'), ('cr', 'router setup'), ('co', 'configure onu'), ('fc', 'crimp cable'), ('ni', 'Internet crash'), ('ot', 'other')], default='na', max_length=2, verbose_name='The nature of the damage')),
('abon', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='abonapp.Abon', verbose_name='Subscriber')),
('author', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Task author')),
('recipients', models.ManyToManyField(related_name='them_task', to=settings.AUTH_USER_MODEL, verbose_name='Recipients')),
('state', models.CharField(choices=[('S', 'New'), ('C', 'Confused'), ('F', 'Completed')], default='S',
max_length=1, verbose_name='Condition')),
('attachment', models.ImageField(blank=True, null=True, upload_to='task_attachments/%Y.%m.%d',
verbose_name='Attached image')),
('mode', models.CharField(
choices=[('na', 'not chosen'), ('ic', 'ip conflict'), ('yt', 'yellow triangle'),
('rc', 'red cross'), ('ls', 'weak speed'), ('cf', 'cable break'), ('cn', 'connection'),
('pf', 'periodic disappearance'), ('cr', 'router setup'), ('co', 'configure onu'),
('fc', 'crimp cable'), ('ni', 'Internet crash'), ('ot', 'other')], default='na',
max_length=2, verbose_name='The nature of the damage')),
('abon', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE,
to='abonapp.Abon', verbose_name='Subscriber')),
('author', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL,
related_name='+', to=settings.AUTH_USER_MODEL,
verbose_name='Task author')),
('recipients', models.ManyToManyField(related_name='them_task', to=settings.AUTH_USER_MODEL,
verbose_name='Recipients')),
], ],
options={ options={
'db_table': 'task', 'db_table': 'task',
@ -65,7 +81,8 @@ class Migration(migrations.Migration):
migrations.AddField( migrations.AddField(
model_name='extracomment', model_name='extracomment',
name='task', name='task',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='taskapp.Task', verbose_name='Owner task'),
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='taskapp.Task',
verbose_name='Owner task'),
), ),
migrations.AddField( migrations.AddField(
model_name='changelog', model_name='changelog',
@ -75,6 +92,7 @@ class Migration(migrations.Migration):
migrations.AddField( migrations.AddField(
model_name='changelog', model_name='changelog',
name='who', name='who',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to=settings.AUTH_USER_MODEL),
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+',
to=settings.AUTH_USER_MODEL),
), ),
] ]

7
taskapp/models.py

@ -8,7 +8,6 @@ from django.utils.translation import ugettext as _
from abonapp.models import Abon from abonapp.models import Abon
from .handle import handle as task_handle from .handle import handle as task_handle
TASK_PRIORITIES = ( TASK_PRIORITIES = (
('A', _('Higher')), ('A', _('Higher')),
('C', _('Average')), ('C', _('Average')),
@ -61,8 +60,10 @@ def _delta_add_days():
class Task(models.Model): class Task(models.Model):
descr = models.CharField(_('Description'), max_length=128, null=True, blank=True) descr = models.CharField(_('Description'), max_length=128, null=True, blank=True)
recipients = models.ManyToManyField(settings.AUTH_USER_MODEL, verbose_name=_('Recipients'), related_name='them_task')
author = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='+', on_delete=models.SET_NULL, null=True, blank=True, verbose_name=_('Task author'))
recipients = models.ManyToManyField(settings.AUTH_USER_MODEL, verbose_name=_('Recipients'),
related_name='them_task')
author = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='+', on_delete=models.SET_NULL, null=True,
blank=True, verbose_name=_('Task author'))
priority = models.CharField(_('A priority'), max_length=1, choices=TASK_PRIORITIES, default=TASK_PRIORITIES[2][0]) priority = models.CharField(_('A priority'), max_length=1, choices=TASK_PRIORITIES, default=TASK_PRIORITIES[2][0])
out_date = models.DateField(_('Reality'), null=True, blank=True, default=_delta_add_days) out_date = models.DateField(_('Reality'), null=True, blank=True, default=_delta_add_days)
time_of_create = models.DateTimeField(_('Date of create'), auto_now_add=True) time_of_create = models.DateTimeField(_('Date of create'), auto_now_add=True)

5
taskapp/urls.py

@ -2,10 +2,8 @@ from django.conf.urls import url
from . import views from . import views
app_name = 'taskapp' app_name = 'taskapp'
urlpatterns = [ urlpatterns = [
url(r'^$', views.NewTasksView.as_view(), name='home'), url(r'^$', views.NewTasksView.as_view(), name='home'),
url(r'^(?P<task_id>\d+)$', views.TaskUpdateView.as_view(), name='edit'), url(r'^(?P<task_id>\d+)$', views.TaskUpdateView.as_view(), name='edit'),
@ -14,7 +12,8 @@ urlpatterns = [
url(r'^(?P<task_id>\d+)/fail$', views.task_failed, name='fail'), url(r'^(?P<task_id>\d+)/fail$', views.task_failed, name='fail'),
url(r'^(?P<task_id>\d+)/remind', views.remind, name='remind'), url(r'^(?P<task_id>\d+)/remind', views.remind, name='remind'),
url(r'^(?P<task_id>\d+)/comment/add$', views.NewCommentView.as_view(), name='comment_add'), url(r'^(?P<task_id>\d+)/comment/add$', views.NewCommentView.as_view(), name='comment_add'),
url(r'^(?P<task_id>\d+)/comment/(?P<comment_id>\d{1,8})/remove$', views.DeleteCommentView.as_view(), name='comment_del'),
url(r'^(?P<task_id>\d+)/comment/(?P<comment_id>\d{1,8})/remove$', views.DeleteCommentView.as_view(),
name='comment_del'),
url(r'^add$', views.TaskUpdateView.as_view(), name='add'), url(r'^add$', views.TaskUpdateView.as_view(), name='add'),
url(r'^failed$', views.FailedTasksView.as_view(), name='failed_tasks'), url(r'^failed$', views.FailedTasksView.as_view(), name='failed_tasks'),
url(r'^finished$', views.FinishedTaskListView.as_view(), name='finished_tasks'), url(r'^finished$', views.FinishedTaskListView.as_view(), name='finished_tasks'),

18
taskapp/views.py

@ -38,8 +38,8 @@ class NewTasksView(BaseTaskListView):
def get_queryset(self): def get_queryset(self):
return Task.objects.filter(recipients=self.request.user, state='S') \ return Task.objects.filter(recipients=self.request.user, state='S') \
.annotate(comment_count=Count('extracomment')) \
.select_related('abon', 'abon__street', 'abon__group', 'author')
.annotate(comment_count=Count('extracomment')) \
.select_related('abon', 'abon__street', 'abon__group', 'author')
class FailedTasksView(NewTasksView): class FailedTasksView(NewTasksView):
@ -51,7 +51,7 @@ class FailedTasksView(NewTasksView):
def get_queryset(self): def get_queryset(self):
return Task.objects.filter(recipients=self.request.user, state='C') \ return Task.objects.filter(recipients=self.request.user, state='C') \
.select_related('abon', 'abon__street', 'abon__group', 'author')
.select_related('abon', 'abon__street', 'abon__group', 'author')
class FinishedTaskListView(NewTasksView): class FinishedTaskListView(NewTasksView):
@ -59,7 +59,7 @@ class FinishedTaskListView(NewTasksView):
def get_queryset(self): def get_queryset(self):
return Task.objects.filter(recipients=self.request.user, state='F') \ return Task.objects.filter(recipients=self.request.user, state='F') \
.select_related('abon', 'abon__street', 'abon__group', 'author')
.select_related('abon', 'abon__street', 'abon__group', 'author')
class OwnTaskListView(NewTasksView): class OwnTaskListView(NewTasksView):
@ -67,9 +67,9 @@ class OwnTaskListView(NewTasksView):
def get_queryset(self): def get_queryset(self):
# Attached and not finished tasks # Attached and not finished tasks
return Task.objects.filter(author=self.request.user)\
.exclude(state='F')\
.select_related('abon', 'abon__street', 'abon__group')
return Task.objects.filter(author=self.request.user) \
.exclude(state='F') \
.select_related('abon', 'abon__street', 'abon__group')
class MyTaskListView(NewTasksView): class MyTaskListView(NewTasksView):
@ -78,7 +78,7 @@ class MyTaskListView(NewTasksView):
def get_queryset(self): def get_queryset(self):
# Tasks in which I participated # Tasks in which I participated
return Task.objects.filter(recipients=self.request.user) \ return Task.objects.filter(recipients=self.request.user) \
.select_related('abon', 'abon__street', 'abon__group', 'author')
.select_related('abon', 'abon__street', 'abon__group', 'author')
@method_decorator([login_required, permission_required('taskapp.can_viewall')], name='dispatch') @method_decorator([login_required, permission_required('taskapp.can_viewall')], name='dispatch')
@ -88,7 +88,7 @@ class AllTasksListView(BaseTaskListView):
def get_queryset(self): def get_queryset(self):
return Task.objects.annotate(comment_count=Count('extracomment')) \ return Task.objects.annotate(comment_count=Count('extracomment')) \
.select_related('abon', 'abon__street', 'abon__group', 'author')
.select_related('abon', 'abon__street', 'abon__group', 'author')
class EmptyTasksListView(NewTasksView): class EmptyTasksListView(NewTasksView):

Loading…
Cancel
Save