Browse Source

coming soon..

devel
Dmitry 9 years ago
parent
commit
75024d0f05
  1. 1
      .gitignore
  2. 2
      abonapp/admin.py
  3. 1
      abonapp/forms.py
  4. 11
      abonapp/models.py
  5. 1
      abonapp/tests.py
  6. 2
      abonapp/urls.py
  7. 2
      abonapp/urls_abon.py
  8. 10
      abonapp/views.py
  9. 2
      accounts_app/admin.py
  10. 6
      accounts_app/models.py
  11. 2
      accounts_app/urls.py
  12. 6
      accounts_app/views.py
  13. 4
      agent/db.py
  14. 3
      agent/main.py
  15. 49
      agent/netflow/netflow_handler.py
  16. 16
      agent/netflow/netflow_handler.sh
  17. 125
      agent/netflow/to_mysql.c
  18. 66
      agent/netflow/to_mysql.py
  19. 1
      agent/sslTransmitter.py
  20. 2
      clientsideapp/admin.py
  21. 2
      clientsideapp/models.py
  22. 2
      clientsideapp/tests.py
  23. 5
      clientsideapp/urls.py
  24. 42
      clientsideapp/views.py
  25. 2
      devapp/admin.py
  26. 1
      devapp/base_intr.py
  27. 1
      devapp/forms.py
  28. 1
      devapp/migrations/0001_initial.py
  29. 1
      devapp/models.py
  30. 2
      devapp/tests.py
  31. 2
      devapp/urls.py
  32. 1
      devapp/views.py
  33. 4
      djing/urls.py
  34. 2
      global_context_processors.py
  35. 2
      ip_pool/admin.py
  36. 1
      ip_pool/forms.py
  37. 1
      ip_pool/migrations/0001_initial.py
  38. 1
      ip_pool/models.py
  39. 2
      ip_pool/tests.py
  40. 2
      ip_pool/urls.py
  41. 1
      ip_pool/views.py
  42. 2
      mapapp/admin.py
  43. 2
      mapapp/tests.py
  44. 2
      mapapp/urls.py
  45. 4
      mapapp/views.py
  46. 9
      mydefs.py
  47. 2
      photo_app/admin.py
  48. 8
      photo_app/models.py
  49. 1
      photo_app/urls.py
  50. 2
      privatemessage/admin.py
  51. 3
      privatemessage/tests.py
  52. 2
      privatemessage/urls.py
  53. 13
      privatemessage/views.py
  54. 2
      searchapp/admin.py
  55. 2
      searchapp/models.py
  56. 2
      searchapp/tests.py
  57. 2
      searchapp/urls.py
  58. 6
      searchapp/views.py
  59. 2
      statistics/admin.py
  60. 1
      statistics/migrations/0001_initial.py
  61. 1
      statistics/models.py
  62. 2
      statistics/tests.py
  63. 4
      statistics/urls.py
  64. 2
      tariff_app/admin.py
  65. 5
      tariff_app/custom_tariffs.py
  66. 1
      tariff_app/forms.py
  67. 2
      tariff_app/models.py
  68. 2
      tariff_app/tests.py
  69. 2
      tariff_app/urls.py
  70. 1
      tariff_app/views.py
  71. 2
      taskapp/admin.py
  72. 3
      taskapp/context_proc.py
  73. 2
      taskapp/forms.py
  74. 4
      taskapp/models.py
  75. 2
      taskapp/tests.py
  76. 2
      taskapp/urls.py
  77. 2
      taskapp/views.py
  78. 47
      templates/clientsideapp/debt_buy.html
  79. 48
      templates/clientsideapp/debts.html
  80. 2
      templates/clientsideapp/ext.html

1
.gitignore

@ -1,5 +1,6 @@
*.pyc *.pyc
*.db *.db
*/*/*.txt
media/* media/*
media/min/* media/min/*
~*/migrations/000*.py ~*/migrations/000*.py

2
abonapp/admin.py

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

1
abonapp/forms.py

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

11
abonapp/models.py

@ -4,12 +4,13 @@ from django.http import Http404
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.utils import timezone from django.utils import timezone
from django.utils.datetime_safe import datetime from django.utils.datetime_safe import datetime
from agent import get_TransmitterClientKlass
from ip_pool.models import IpPoolItem
from tariff_app.models import Tariff
from django.db import models from django.db import models
from django.conf import settings from django.conf import settings
from django.core.validators import DecimalValidator from django.core.validators import DecimalValidator
from agent import get_TransmitterClientKlass
from ip_pool.models import IpPoolItem
from tariff_app.models import Tariff
from accounts_app.models import UserProfile from accounts_app.models import UserProfile
@ -206,12 +207,12 @@ class Abon(UserProfile):
db_table = 'abonent' db_table = 'abonent'
# Платим за что-то # Платим за что-то
def make_pay(self, curuser, how_match_to_pay=0.0):
def make_pay(self, curuser, how_match_to_pay=0.0, u_comment=u'Снятие со счёта средств'):
AbonLog.objects.create( AbonLog.objects.create(
abon = self, abon = self,
amount = -how_match_to_pay, amount = -how_match_to_pay,
author = curuser, author = curuser,
comment = u'Снятие со счёта средств'
comment = u_comment
) )
self.ballance -= how_match_to_pay self.ballance -= how_match_to_pay

1
abonapp/tests.py

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.test import TestCase from django.test import TestCase
from models import Abon, AbonTariff from models import Abon, AbonTariff
from tariff_app.models import Tariff from tariff_app.models import Tariff

2
abonapp/urls.py

@ -1,6 +1,8 @@
from django.conf.urls import url, include from django.conf.urls import url, include
import views import views
urlpatterns = [ urlpatterns = [
url(r'^$', views.grouplist, name='abongroup_list_link'), url(r'^$', views.grouplist, name='abongroup_list_link'),

2
abonapp/urls_abon.py

@ -1,6 +1,8 @@
from django.conf.urls import url from django.conf.urls import url
import views import views
urlpatterns = [ urlpatterns = [
url(r'^$', views.peoples, name='people_list_link'), url(r'^$', views.peoples, name='people_list_link'),
url(r'^addabon$', views.addabon, name='addabon_link'), url(r'^addabon$', views.addabon, name='addabon_link'),

10
abonapp/views.py

@ -1,15 +1,17 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from json import dumps from json import dumps
from django.db import IntegrityError from django.db import IntegrityError
from django.db.models import Count from django.db.models import Count
from django.shortcuts import render, redirect, get_object_or_404, resolve_url from django.shortcuts import render, redirect, get_object_or_404, resolve_url
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.utils import timezone from django.utils import timezone
from accounts_app.models import UserProfile
from ip_pool.models import IpPoolItem
from tariff_app.models import Tariff
from django.template.context_processors import csrf from django.template.context_processors import csrf
from django.http import HttpResponse, Http404 from django.http import HttpResponse, Http404
from django.contrib.auth import get_user_model
from ip_pool.models import IpPoolItem
from tariff_app.models import Tariff
from agent import NetExcept from agent import NetExcept
import forms import forms
import models import models
@ -266,7 +268,7 @@ def terminal_pay(request):
username = request.GET.get('username') username = request.GET.get('username')
amount = mydefs.safe_float(request.GET.get('amount')) amount = mydefs.safe_float(request.GET.get('amount'))
kernel_user = get_object_or_404(UserProfile, username='kernel')
kernel_user = get_object_or_404(get_user_model(), username='kernel')
abon = get_object_or_404(models.Abon, username=username) abon = get_object_or_404(models.Abon, username=username)
abon.add_ballance(kernel_user, amount) abon.add_ballance(kernel_user, amount)

2
accounts_app/admin.py

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

6
accounts_app/models.py

@ -1,10 +1,11 @@
# -*- coding:utf-8 -*- # -*- coding:utf-8 -*-
from django.db import models from django.db import models
from djing.settings import DEFAULT_PICTURE
from photo_app.models import Photo
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser, PermissionsMixin from django.contrib.auth.models import BaseUserManager, AbstractBaseUser, PermissionsMixin
from django.core.validators import RegexValidator from django.core.validators import RegexValidator
from djing.settings import DEFAULT_PICTURE
from photo_app.models import Photo
class MyUserManager(BaseUserManager): class MyUserManager(BaseUserManager):
@ -54,6 +55,7 @@ class UserProfile(AbstractBaseUser, PermissionsMixin):
) )
skype = models.CharField(max_length=20, blank=True) skype = models.CharField(max_length=20, blank=True)
avatar = models.ForeignKey(Photo, null=True, blank=True) avatar = models.ForeignKey(Photo, null=True, blank=True)
email = models.EmailField()
USERNAME_FIELD = 'username' USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['telephone'] REQUIRED_FIELDS = ['telephone']

2
accounts_app/urls.py

@ -1,7 +1,9 @@
# -*- coding:utf-8 -*- # -*- coding:utf-8 -*-
from django.conf.urls import url from django.conf.urls import url
import views import views
urlpatterns = [ urlpatterns = [
url(r'^login/', views.to_signin, name='login_link'), url(r'^login/', views.to_signin, name='login_link'),

6
accounts_app/views.py

@ -1,15 +1,15 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.contrib.auth.decorators import login_required#, permission_required from django.contrib.auth.decorators import login_required#, permission_required
from django.contrib.auth import authenticate, login, logout from django.contrib.auth import authenticate, login, logout
from photo_app.models import Photo
from django.core.urlresolvers import NoReverseMatch from django.core.urlresolvers import NoReverseMatch
from models import UserProfile
from django.shortcuts import render, redirect, get_object_or_404, resolve_url from django.shortcuts import render, redirect, get_object_or_404, resolve_url
from django.template.context_processors import csrf from django.template.context_processors import csrf
from django.http import Http404 from django.http import Http404
from django.contrib.auth.models import Group, Permission from django.contrib.auth.models import Group, Permission
from photo_app.models import Photo
from models import UserProfile
import mydefs import mydefs
from taskapp.models import Task
@login_required @login_required

4
agent/db.py

@ -1,7 +1,9 @@
# -*- coding:utf-8 -*- # -*- coding:utf-8 -*-
import requests
from json import loads from json import loads
import requests
from requests.exceptions import ConnectionError from requests.exceptions import ConnectionError
from models import deserialize_tariffs, deserialize_abonents from models import deserialize_tariffs, deserialize_abonents
import settings import settings

3
agent/main.py

@ -1,8 +1,9 @@
# -*- coding:utf-8 -*- # -*- coding:utf-8 -*-
from sys import stdout from sys import stdout
from time import sleep
from db import load_from_db from db import load_from_db
from firewall import FirewallManager from firewall import FirewallManager
from time import sleep
from sslTransmitter import TransmitServer from sslTransmitter import TransmitServer
from agent.models import Abonent, Tariff from agent.models import Abonent, Tariff

49
agent/netflow/netflow_handler.py

@ -1,49 +0,0 @@
#!/bin/env python2
import sys
import socket
import struct
from re import sub
def ip2int(strip):
return struct.unpack("!I", socket.inet_aton(strip))[0]
def convert(query):
dat = sub(r'\s+', ' ', query.strip('\n')).split(' ')
if len(dat) == 1:
return
src_ip = ip2int(dat[0])
dst_ip = ip2int(dat[1])
proto = int(dat[2])
src_port = int(dat[3])
dst_port = int(dat[4])
octets = int(dat[5])
packets = int(dat[6])
sql = ",(%s,%s,%d,%d,%d,%d,%d)" % (
hex(src_ip), hex(dst_ip), proto, src_port, dst_port, octets, packets
)
return sql
if __name__=='__main__':
f=sys.stdin
print("INSERT INTO flowstat(`src_ip`, `dst_ip`, `proto`, `src_port`, `dst_port`, `octets`, `packets`) VALUES")
# always none
f.readline()
# first line
rs = convert(f.readline())
# without first comma
print(rs[1:])
while True:
rs = convert(f.readline())
if not rs:
break
print(rs)
f.close()

16
agent/netflow/netflow_handler.sh

@ -1,11 +1,17 @@
#!/bin/sh
#!/bin/bash
DUMP_DIR="/var/db/flows"
FNAME="$1"
if [[ -z "$FNAME" ]]; then
echo "Нужно имя файла дампа netflow"
exit 1
fi
DUMP_FILE="$DUMP_DIR/$1"
PATH=/usr/local/sbin:/usr/local/bin:/usr/bin
CUR_DIR=`dirname $0` CUR_DIR=`dirname $0`
DUMP_FILE="$CUR_DIR/$FNAME"
PATH=/usr/local/sbin:/usr/local/bin:/usr/bin
flow-print -f3 < ${DUMP_FILE} | ${CUR_DIR}/netflow_handler.py \
flow-print -f3 < ${DUMP_FILE} | ${CUR_DIR}/to_mysql \
| mysql -uroot -p jungagent --password=ps | mysql -uroot -p jungagent --password=ps

125
agent/netflow/to_mysql.c

@ -0,0 +1,125 @@
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdint.h>
#include <stdbool.h>
#include <time.h>
#define FLOW_COLS 8
#define uint unsigned int
uint32_t ip2int(const char* ip)
{
uint32_t res = 0;
inet_pton(AF_INET, ip, &res);
return htonl(res);
}
uint str_split(char* str, const char* delimiter, char** pInChunks)
{
char* dat = strtok(str, " ");
register uint n=0;
while(dat)
{
pInChunks[n++] = dat;
dat = strtok(NULL, " ");
}
return n;
}
void curtime(char* pInStrTime, const uint maxlen)
{
time_t rawtime;
time( &rawtime );
strftime(pInStrTime, maxlen, "flowstat_%d%m%Y", localtime( &rawtime ));
}
void convert(char* query, char* pInRes)
{
char* chunks[FLOW_COLS] = {NULL};
int chunk_count = str_split(query, " ", chunks);
if(chunk_count < 7)
{
printf("Too short input line\n");
exit(1);
}
uint32_t src_ip = ip2int(chunks[0]);
uint32_t dst_ip = ip2int(chunks[1]);
uint proto = atoi(chunks[2]);
uint16_t src_port = ip2int(chunks[3]);
uint16_t dst_port = ip2int(chunks[4]);
uint octets = atoi(chunks[5]);
uint packets = atoi(chunks[6]);
sprintf(pInRes, ",(%u,%u,%u,%u,%u,%u,%u)\0",
src_ip, dst_ip, proto, src_port, dst_port, octets, packets);
}
int main()
{
char buf_result_convert[0xff] = {0};
FILE* f = stdin;
char* input_line = malloc(0xff);
size_t input_line_len = 0;
ssize_t read_len = 0;
char table_name[19] = {0};
curtime(table_name, 19);
printf("CREATE TABLE IF NOT EXISTS %s (\n", table_name);
printf("`id` int(10) AUTO_INCREMENT NOT NULL,\n");
printf("`src_ip` INT(10) UNSIGNED NOT NULL,\n");
printf("`dst_ip` INT(10) UNSIGNED NOT NULL,\n");
printf("`proto` smallint(2) unsigned NOT NULL DEFAULT 0,\n");
printf("`src_port` smallint(5) unsigned NOT NULL DEFAULT 0,\n");
printf("`dst_port` smallint(5) unsigned NOT NULL DEFAULT 0,\n");
printf("`octets` INT unsigned NOT NULL DEFAULT 0,\n");
printf("`packets` INT unsigned NOT NULL DEFAULT 0,\n");
printf("PRIMARY KEY (`id`)\n");
printf(") ENGINE=MyISAM DEFAULT CHARSET=utf8;\n");
char ins_sql[0xff] = {0};
sprintf(ins_sql, "INSERT INTO %s(`src_ip`, `dst_ip`, `proto`, `src_port`, `dst_port`, `octets`, `packets`) VALUES", table_name);
// always none
read_len = getline(&input_line, &input_line_len, f);
while(true)
{
register uint n=0xfff;
read_len = getline(&input_line, &input_line_len, f);
if(read_len <= 0)
break;
convert(input_line, buf_result_convert);
printf("%s\n", ins_sql);
// without first comma
printf("%s\n", buf_result_convert+1);
while(n>0)
{
read_len = getline(&input_line, &input_line_len, f);
if(read_len <= 0)
break;
convert(input_line, buf_result_convert);
printf("%s\n", buf_result_convert);
n--;
}
putc(';', stdout);
}
free(input_line);
return 0;
}

66
agent/netflow/to_mysql.py

@ -0,0 +1,66 @@
#!/bin/env python2
import sys
import socket
import struct
from re import sub
from datetime import datetime
def ip2int(strip):
return struct.unpack("!I", socket.inet_aton(strip))[0]
def convert(query):
dat = sub(r'\s+', ' ', query.strip('\n')).split(' ')
if len(dat) == 1:
return
src_ip = ip2int(dat[0])
dst_ip = ip2int(dat[1])
proto = int(dat[2])
src_port = int(dat[3])
dst_port = int(dat[4])
octets = int(dat[5])
packets = int(dat[6])
sql = ",(%d,%d,%d,%d,%d,%d,%d)" % (
src_ip, dst_ip, proto, src_port, dst_port, octets, packets
)
return sql
if __name__=='__main__':
f = sys.stdin
table_name = "flowstat_%s" % datetime.now().strftime("%d%m%Y")
print("CREATE TABLE IF NOT EXISTS %s (" % table_name)
print("`id` int(10) AUTO_INCREMENT NOT NULL,")
print("`src_ip` INT(10) UNSIGNED NOT NULL,")
print("`dst_ip` INT(10) UNSIGNED NOT NULL,")
print("`proto` smallint(2) unsigned NOT NULL DEFAULT 0,")
print("`src_port` smallint(5) unsigned NOT NULL DEFAULT 0,")
print("`dst_port` smallint(5) unsigned NOT NULL DEFAULT 0,")
print("`octets` INT unsigned NOT NULL DEFAULT 0,")
print("`packets` INT unsigned NOT NULL DEFAULT 0,")
print("PRIMARY KEY (`id`)")
print(") ENGINE=MyISAM DEFAULT CHARSET=utf8;")
ins_sql = r"INSERT INTO %s(`src_ip`, `dst_ip`, `proto`, `src_port`, `dst_port`, `octets`, `packets`) VALUES" % table_name
# always none
f.readline()
while True:
n=0xfff
rs = convert(f.readline())
if not rs: exit()
# without first comma
print(ins_sql)
print(rs[1:])
while n > 0:
rs = convert(f.readline())
if not rs: exit()
print(rs)
n -= 1
print(';')
f.close()

1
agent/sslTransmitter.py

@ -2,6 +2,7 @@
import ssl import ssl
import socket import socket
from multiprocessing import Process, Manager from multiprocessing import Process, Manager
import settings import settings
from models import EventNAS, Abonent, Tariff from models import EventNAS, Abonent, Tariff

2
clientsideapp/admin.py

@ -1,3 +1 @@
from django.contrib import admin
# Register your models here. # Register your models here.

2
clientsideapp/models.py

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

2
clientsideapp/tests.py

@ -1,3 +1 @@
from django.test import TestCase
# Create your tests here. # Create your tests here.

5
clientsideapp/urls.py

@ -1,10 +1,13 @@
# -*- coding:utf-8 -*- # -*- coding:utf-8 -*-
from django.conf.urls import url from django.conf.urls import url
import views import views
urlpatterns = [ urlpatterns = [
url(r'^$', views.home, name='client_home'), url(r'^$', views.home, name='client_home'),
url(r'^pays$', views.pays, name='client_pays'), url(r'^pays$', views.pays, name='client_pays'),
url(r'^buy$', views.buy_service, name='client_buy')
url(r'^buy$', views.buy_service, name='client_buy'),
url(r'^debts$', views.debts_list, name='client_debts'),
url(r'^debts/(?P<d_id>\d+)$', views.debt_buy, name='client_debt_buy')
] ]

42
clientsideapp/views.py

@ -1,6 +1,8 @@
# coding=utf-8
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.shortcuts import render, get_object_or_404
from abonapp.models import AbonLog, AbonTariff
from django.shortcuts import render, get_object_or_404, redirect
from abonapp.models import AbonLog, AbonTariff, InvoiceForPayment, Abon, LogicError
from tariff_app.models import Tariff from tariff_app.models import Tariff
from mydefs import pag_mn from mydefs import pag_mn
@ -33,3 +35,39 @@ def buy_service(request):
'own_abon_tariffs': own_abon_tariffs, 'own_abon_tariffs': own_abon_tariffs,
'current_service': current_service 'current_service': current_service
}) })
@login_required
def debts_list(request):
debts = InvoiceForPayment.objects.filter(abon=request.user)
return render(request, 'clientsideapp/debts.html', {
'debts': debts
})
@login_required
def debt_buy(request, d_id):
warntext=u''
debt = get_object_or_404(InvoiceForPayment, id=d_id)
abon = get_object_or_404(Abon, id=request.user.id)
if request.method == 'POST':
try:
sure = request.POST.get('sure')
if sure != 'on':
raise LogicError(u'Вы не уверены что хотите оплатить долг?')
if abon.ballance < debt.amount:
raise LogicError(u'Не достаточно средств на счету')
abon.make_pay(request.user, debt.amount, debt.comment)
debt.set_ok()
abon.save(update_fields=['ballance'])
debt.save(update_fields=['status', 'date_pay'])
return redirect('client_debts')
except LogicError, e:
warntext=e.value
return render(request, 'clientsideapp/debt_buy.html', {
'warntext': warntext,
'debt': debt,
'amount': debt.amount,
'ballance_after': abon.ballance - debt.amount
})

2
devapp/admin.py

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

1
devapp/base_intr.py

@ -1,5 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from abc import ABCMeta, abstractmethod from abc import ABCMeta, abstractmethod
from netsnmp import Session, VarList, Varbind from netsnmp import Session, VarList, Varbind

1
devapp/forms.py

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

1
devapp/migrations/0001_initial.py

@ -4,6 +4,7 @@ from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion
import mydefs import mydefs

1
devapp/models.py

@ -1,5 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.db import models from django.db import models
from base_intr import DevBase from base_intr import DevBase
from mydefs import MyGenericIPAddressField, MyChoicesAdapter from mydefs import MyGenericIPAddressField, MyChoicesAdapter
from dev_types import DEVICE_TYPES from dev_types import DEVICE_TYPES

2
devapp/tests.py

@ -1,3 +1 @@
from django.test import TestCase
# Create your tests here. # Create your tests here.

2
devapp/urls.py

@ -1,6 +1,8 @@
from django.conf.urls import url from django.conf.urls import url
import views import views
urlpatterns = [ urlpatterns = [
url(r'^$', views.devices, name='devs_link'), url(r'^$', views.devices, name='devs_link'),
url(r'^add$', views.dev, name='devs_add_link'), url(r'^add$', views.dev, name='devs_add_link'),

1
devapp/views.py

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect, get_object_or_404 from django.shortcuts import render, redirect, get_object_or_404
from models import Device from models import Device
from mydefs import pag_mn, res_success, res_error, only_admins from mydefs import pag_mn, res_success, res_error, only_admins
from forms import DeviceForm from forms import DeviceForm

4
djing/urls.py

@ -1,8 +1,10 @@
from django.conf.urls import url, include from django.conf.urls import url, include
from django.contrib import admin from django.contrib import admin
import settings import settings
from views import home from views import home
urlpatterns = [ urlpatterns = [
url(r'^$', home), url(r'^$', home),
url(r'^accounts/', include('accounts_app.urls')), url(r'^accounts/', include('accounts_app.urls')),
@ -16,7 +18,7 @@ urlpatterns = [
url(r'^statistic/', include('statistics.urls')), url(r'^statistic/', include('statistics.urls')),
url(r'^tasks/', include('taskapp.urls')), url(r'^tasks/', include('taskapp.urls')),
url(r'^client/', include('clientsideapp.urls')), url(r'^client/', include('clientsideapp.urls')),
url(r'^admin/', admin.site.urls),
url(r'^admin/', admin.site.urls)
] ]

2
global_context_processors.py

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from abonapp.models import Abon
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from abonapp.models import Abon
def context_processor_client_ipaddress(request): def context_processor_client_ipaddress(request):

2
ip_pool/admin.py

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

1
ip_pool/forms.py

@ -1,5 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django import forms from django import forms
from mydefs import ip_addr_regex from mydefs import ip_addr_regex

1
ip_pool/migrations/0001_initial.py

@ -3,6 +3,7 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
import mydefs import mydefs

1
ip_pool/models.py

@ -1,4 +1,5 @@
from django.db import models, connection from django.db import models, connection
from mydefs import ip2int, MyGenericIPAddressField from mydefs import ip2int, MyGenericIPAddressField

2
ip_pool/tests.py

@ -1,3 +1 @@
from django.test import TestCase
# Create your tests here. # Create your tests here.

2
ip_pool/urls.py

@ -1,7 +1,9 @@
# -*- coding:utf-8 -*- # -*- coding:utf-8 -*-
from django.conf.urls import url from django.conf.urls import url
import views import views
urlpatterns = [ urlpatterns = [
url(r'^$', views.home, name='pool_home_link'), url(r'^$', views.home, name='pool_home_link'),

1
ip_pool/views.py

@ -1,5 +1,6 @@
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect, get_object_or_404 from django.shortcuts import render, redirect, get_object_or_404
from forms import PoolForm from forms import PoolForm
from models import IpPoolItem from models import IpPoolItem
import mydefs import mydefs

2
mapapp/admin.py

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

2
mapapp/tests.py

@ -1,3 +1 @@
from django.test import TestCase
# Create your tests here. # Create your tests here.

2
mapapp/urls.py

@ -1,6 +1,8 @@
from django.conf.urls import url from django.conf.urls import url
import views import views
urlpatterns = [ urlpatterns = [
url(r'^$', views.home, name='maps_home_link'), url(r'^$', views.home, name='maps_home_link'),
url(r'^get_dots$', views.get_dots, name='maps_get_dots') url(r'^get_dots$', views.get_dots, name='maps_get_dots')

4
mapapp/views.py

@ -1,8 +1,10 @@
from json import dumps
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.http import HttpResponse from django.http import HttpResponse
from django.shortcuts import render from django.shortcuts import render
from models import Dot from models import Dot
from json import dumps
from mydefs import only_admins from mydefs import only_admins

9
mydefs.py

@ -1,13 +1,14 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.http import HttpResponse, Http404
from json import dumps from json import dumps
from django.shortcuts import redirect
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
import socket import socket
import struct import struct
from django.db import models
from collections import Iterator from collections import Iterator
from django.http import HttpResponse, Http404
from django.shortcuts import redirect
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
from django.db import models
ip_addr_regex = r'^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(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]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$'

2
photo_app/admin.py

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

8
photo_app/models.py

@ -1,11 +1,13 @@
# -*- coding:utf-8 -*- # -*- coding:utf-8 -*-
from django.db import models
from djing.settings import BASE_DIR
import os import os
from PIL import Image
import time import time
import hashlib import hashlib
from django.db import models
from PIL import Image
from djing.settings import BASE_DIR
class Photo(models.Model): class Photo(models.Model):
image = models.ImageField(width_field='wdth', height_field='heigt') image = models.ImageField(width_field='wdth', height_field='heigt')

1
photo_app/urls.py

@ -1,5 +1,4 @@
# -*- coding:utf-8 -*- # -*- coding:utf-8 -*-
from django.conf.urls import patterns, url
urlpatterns = [ urlpatterns = [
#url(r'^$', 'photo_albums', name='media_home_link'), #url(r'^$', 'photo_albums', name='media_home_link'),

2
privatemessage/admin.py

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

3
privatemessage/tests.py

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

2
privatemessage/urls.py

@ -1,6 +1,8 @@
from django.conf.urls import url from django.conf.urls import url
import views import views
urlpatterns = [ urlpatterns = [
url(r'^$', views.home, name='privmsg_home'), url(r'^$', views.home, name='privmsg_home'),
url(r'^delitem_(?P<id>\d+)$', views.delitem, name='privmsg_delitem'), url(r'^delitem_(?P<id>\d+)$', views.delitem, name='privmsg_delitem'),

13
privatemessage/views.py

@ -1,13 +1,15 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from json import dumps
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect from django.shortcuts import render, redirect
from django.template.loader import render_to_string from django.template.loader import render_to_string
from models import PrivateMessages
from django.http import HttpResponse from django.http import HttpResponse
from json import dumps
from django.template.context_processors import csrf from django.template.context_processors import csrf
from models import PrivateMessages
import mydefs import mydefs
from accounts_app.models import UserProfile
from django.contrib.auth import get_user_model
@login_required @login_required
@ -36,6 +38,7 @@ def delitem(request, id=0):
@login_required @login_required
@mydefs.only_admins @mydefs.only_admins
def send_message(request): def send_message(request):
UserModel = get_user_model()
if request.method == 'GET': if request.method == 'GET':
return HttpResponse(render_to_string('private_messages/send_form.html',{ return HttpResponse(render_to_string('private_messages/send_form.html',{
'csrf_token': csrf(request)['csrf_token'], 'csrf_token': csrf(request)['csrf_token'],
@ -47,11 +50,11 @@ def send_message(request):
a = 0 if a is None or a == '' else int(a) a = 0 if a is None or a == '' else int(a)
msg = PrivateMessages() msg = PrivateMessages()
msg.sender = request.user msg.sender = request.user
msg.recepient = UserProfile.objects.get(id=a)
msg.recepient = UserModel.objects.get(id=a)
msg.text = request.POST.get('msg_text') msg.text = request.POST.get('msg_text')
msg.save() msg.save()
return redirect('privmsg_home') return redirect('privmsg_home')
except UserProfile.DoesNotExist:
except UserModel.DoesNotExist:
return mydefs.res_error(request, u'Адресат не найден') return mydefs.res_error(request, u'Адресат не найден')
else: else:
return mydefs.res_error(request, u'Ошибка типа запроса') return mydefs.res_error(request, u'Ошибка типа запроса')

2
searchapp/admin.py

@ -1,3 +1 @@
from django.contrib import admin
# Register your models here. # Register your models here.

2
searchapp/models.py

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

2
searchapp/tests.py

@ -1,3 +1 @@
from django.test import TestCase
# Create your tests here. # Create your tests here.

2
searchapp/urls.py

@ -1,6 +1,8 @@
from django.conf.urls import url from django.conf.urls import url
import views import views
urlpatterns = [ urlpatterns = [
url(r'^$', views.home, name='search_home_link'), url(r'^$', views.home, name='search_home_link'),

6
searchapp/views.py

@ -1,8 +1,10 @@
import re
from django.db.models import Q from django.db.models import Q
from django.shortcuts import render from django.shortcuts import render
from abonapp.models import Abon
from django.utils.html import escape from django.utils.html import escape
import re
from abonapp.models import Abon
def replace_without_case(orig, old, new): def replace_without_case(orig, old, new):

2
statistics/admin.py

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

1
statistics/migrations/0001_initial.py

@ -3,6 +3,7 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
import mydefs import mydefs

1
statistics/models.py

@ -1,6 +1,7 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import models from django.db import models
from mydefs import MyGenericIPAddressField from mydefs import MyGenericIPAddressField

2
statistics/tests.py

@ -1,3 +1 @@
from django.test import TestCase
# Create your tests here. # Create your tests here.

4
statistics/urls.py

@ -1,6 +1,8 @@
from django.conf.urls import url, include
from django.conf.urls import url
import views import views
urlpatterns = [ urlpatterns = [
url(r'^$', views.home, name='stat_home'), url(r'^$', views.home, name='stat_home'),
] ]

2
tariff_app/admin.py

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

5
tariff_app/custom_tariffs.py

@ -1,7 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.utils import timezone
from datetime import datetime, timedelta from datetime import datetime, timedelta
from django.utils import timezone
from base_intr import TariffBase from base_intr import TariffBase
#from abonapp import AbonTariff #from abonapp import AbonTariff

1
tariff_app/forms.py

@ -1,4 +1,5 @@
from django import forms from django import forms
import models import models

2
tariff_app/models.py

@ -1,10 +1,12 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.db import models from django.db import models
from custom_tariffs import TariffBase, TARIFF_CHOICES from custom_tariffs import TariffBase, TARIFF_CHOICES
from mydefs import MyChoicesAdapter from mydefs import MyChoicesAdapter
from agent import get_TransmitterClientKlass from agent import get_TransmitterClientKlass
# Класс похож на адаптер. Предназначен для Django CHOICES чтоб можно было передавать классывместо просто описания поля, # Класс похож на адаптер. Предназначен для Django CHOICES чтоб можно было передавать классывместо просто описания поля,
# классы передавать для того чтоб по значению из базы понять какой класс нужно взять для расчёта стоимости тарифа. # классы передавать для того чтоб по значению из базы понять какой класс нужно взять для расчёта стоимости тарифа.
class _TariffChoicesAdapter(MyChoicesAdapter): class _TariffChoicesAdapter(MyChoicesAdapter):

2
tariff_app/tests.py

@ -1,3 +1 @@
from django.test import TestCase
# Create your tests here. # Create your tests here.

2
tariff_app/urls.py

@ -1,6 +1,8 @@
from django.conf.urls import url from django.conf.urls import url
import views import views
urlpatterns = [ urlpatterns = [
url(r'^$', views.tarifs, name='tarifs_link'), url(r'^$', views.tarifs, name='tarifs_link'),
url(r'^(?P<tarif_id>\d+)$', views.edit_tarif, name='tarifs_edit_link'), url(r'^(?P<tarif_id>\d+)$', views.edit_tarif, name='tarifs_edit_link'),

1
tariff_app/views.py

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.shortcuts import render, get_object_or_404, redirect from django.shortcuts import render, get_object_or_404, redirect
from models import Tariff from models import Tariff
import mydefs import mydefs
import forms import forms

2
taskapp/admin.py

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

3
taskapp/context_proc.py

@ -1,11 +1,12 @@
from django.contrib.auth.models import AnonymousUser from django.contrib.auth.models import AnonymousUser
from taskapp.models import Task from taskapp.models import Task
def get_active_tasks_count(request): def get_active_tasks_count(request):
tasks_count = 0 tasks_count = 0
if not isinstance(request.user, AnonymousUser): if not isinstance(request.user, AnonymousUser):
tasks_count = Task.objects.filter(recipient=request.user).count()
tasks_count = Task.objects.filter(recipient=request.user, state='S').count()
return { return {
'tasks_count': tasks_count 'tasks_count': tasks_count
} }

2
taskapp/forms.py

@ -1,6 +1,8 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from datetime import datetime, timedelta from datetime import datetime, timedelta
from django import forms from django import forms
from models import TASK_PRIORITIES, TASK_STATES from models import TASK_PRIORITIES, TASK_STATES
from accounts_app.models import UserProfile from accounts_app.models import UserProfile
from devapp.models import Device from devapp.models import Device

4
taskapp/models.py

@ -1,10 +1,12 @@
# coding=utf-8 # coding=utf-8
from __future__ import unicode_literals from __future__ import unicode_literals
from datetime import datetime, timedelta
from django.db import models from django.db import models
from django.conf import settings from django.conf import settings
from devapp.models import Device from devapp.models import Device
from datetime import datetime, timedelta
TASK_PRIORITIES = ( TASK_PRIORITIES = (

2
taskapp/tests.py

@ -1,3 +1 @@
from django.test import TestCase
# Create your tests here. # Create your tests here.

2
taskapp/urls.py

@ -1,6 +1,8 @@
from django.conf.urls import url from django.conf.urls import url
import views import views
urlpatterns = [ urlpatterns = [
url(r'^$', views.home, name='task_home'), url(r'^$', views.home, name='task_home'),
url(r'^(?P<task_id>\d+)/edit$', views.task_add_edit, name='task_edit'), url(r'^(?P<task_id>\d+)/edit$', views.task_add_edit, name='task_edit'),

2
taskapp/views.py

@ -1,7 +1,7 @@
# coding=utf-8 # coding=utf-8
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect, get_object_or_404 from django.shortcuts import render, redirect, get_object_or_404
from accounts_app.models import UserProfile
from models import Task from models import Task
from mydefs import pag_mn, only_admins, safe_int from mydefs import pag_mn, only_admins, safe_int
from forms import TaskFrm from forms import TaskFrm

47
templates/clientsideapp/debt_buy.html

@ -0,0 +1,47 @@
{% extends 'clientsideapp/ext.html' %}
{% block client_main %}
<div class="page-header">
<h3>Задолженность</h3>
{% if warntext %}
<div class="alert alert-danger alert-dismissable">
<button class="close" type="button" aria-hidden="true" data-dismiss="alert">&times;</button>
<strong>Ошибка!</strong> {{ warntext|safe }}
</div>
{% endif %}
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Оплатить задолженность</h3>
</div>
<div class="panel-body">
<form role="form" action="{% url 'client_debt_buy' debt.id %}" method="post">{% csrf_token %}
<div class="checkbox">
<label>
<input type="checkbox" checked name="sure">
Вы уверены что хотите провести платёж?
</label>
</div>
<p>
С вашего счёта снимутся средства в размере <b>{{ amount }}</b> руб.<br/>
В результате у вас на счету останется {{ ballance_after }} руб.<br/>
Администратор сразу сможет видеть что у вас закрыта задолженность.
</p>
<h4>Описание платежа</h4>
<div class="alert alert-info">
{{ debt.comment }}
</div>
<div class="btn-group">
<button type="submit" class="btn btn-sm btn-primary">
<span class="glyphicon glyphicon-save"></span> Подтвердить
</button>
<a href="{% url 'client_debts' %}" class="btn btn-sm btn-default">
<span class="glyphicon glyphicon-remove-circle"></span> Отменить
</a>
</div>
</form>
</div>
</div>
{% endblock %}

48
templates/clientsideapp/debts.html

@ -0,0 +1,48 @@
{% extends 'clientsideapp/ext.html' %}
{% block client_main %}
<div class="page-header">
<h3>Ваши долги</h3>
</div>
<table class="table table-striped table-bordered">
<thead>
<tr>
<th class="col-xs-1">Состояние</th>
<th>Сумма</th>
<th>Описание</th>
<th>Дата создания</th>
<th>Дата платежа</th>
<th class="col-xs-1">Оплатить</th>
</tr>
</thead>
<tbody>
{% for debt in debts %}
<tr>
<td class="text-center"><span class="glyphicon glyphicon-{{ debt.status|yesno:'ok,time' }}"></span></td>
<td>{{ debt.amount }} руб.</td>
<td>{{ debt.comment }}</td>
<td>{{ debt.date_create|date:'d b H:i' }}</td>
<td>
{% if debt.date_pay %}
{{ debt.date_pay|date:'d b H:i' }}
{% else %}
{% if debt.status %}
Создан оплаченным
{% else %}
Ещё не оплачен
{% endif %}
{% endif %}
</td>
<td class="text-center">
<a href="{% url 'client_debt_buy' debt.id %}" class="btn btn-sm btn-success" title="Оплатить">
<span class="glyphicon glyphicon-usd"></span>
</a>
</td>
</tr>
{% empty %}
<tr><td colspan="6">У вас нет долгов <span class="glyphicon glyphicon-ok"></span></td></tr>
{% endfor %}
</tbody>
</table>
{% endblock %}

2
templates/clientsideapp/ext.html

@ -55,7 +55,7 @@
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Другое <b class="caret"></b></a> <a href="#" class="dropdown-toggle" data-toggle="dropdown">Другое <b class="caret"></b></a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a href="#">Подать заявку</a></li> <li><a href="#">Подать заявку</a></li>
<li><a href="#">Просмотреть и оплатить долги <span class="badge">2</span></a></li>
<li><a href="{% url 'client_debts' %}">Просмотреть и оплатить долги <span class="badge">2</span></a></li>
<li><a href="#">Сеансы подключений</a></li> <li><a href="#">Сеансы подключений</a></li>
<li class="divider"></li> <li class="divider"></li>
<li class="dropdown-header">Nav header</li> <li class="dropdown-header">Nav header</li>

Loading…
Cancel
Save