From 75024d0f05fda6a64b6c3641f247def037eac0d7 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Thu, 3 Nov 2016 23:14:52 +0000 Subject: [PATCH] coming soon.. --- .gitignore | 1 + abonapp/admin.py | 2 + abonapp/forms.py | 1 + abonapp/models.py | 11 +-- abonapp/tests.py | 1 + abonapp/urls.py | 2 + abonapp/urls_abon.py | 2 + abonapp/views.py | 10 ++- accounts_app/admin.py | 2 + accounts_app/models.py | 6 +- accounts_app/urls.py | 2 + accounts_app/views.py | 6 +- agent/db.py | 4 +- agent/main.py | 3 +- agent/netflow/netflow_handler.py | 49 ---------- agent/netflow/netflow_handler.sh | 16 ++-- agent/netflow/to_mysql.c | 125 ++++++++++++++++++++++++++ agent/netflow/to_mysql.py | 66 ++++++++++++++ agent/sslTransmitter.py | 1 + clientsideapp/admin.py | 2 - clientsideapp/models.py | 2 - clientsideapp/tests.py | 2 - clientsideapp/urls.py | 5 +- clientsideapp/views.py | 42 ++++++++- devapp/admin.py | 2 + devapp/base_intr.py | 1 + devapp/forms.py | 1 + devapp/migrations/0001_initial.py | 1 + devapp/models.py | 1 + devapp/tests.py | 2 - devapp/urls.py | 2 + devapp/views.py | 1 + djing/urls.py | 4 +- global_context_processors.py | 2 +- ip_pool/admin.py | 2 + ip_pool/forms.py | 1 + ip_pool/migrations/0001_initial.py | 1 + ip_pool/models.py | 1 + ip_pool/tests.py | 2 - ip_pool/urls.py | 2 + ip_pool/views.py | 1 + mapapp/admin.py | 2 + mapapp/tests.py | 2 - mapapp/urls.py | 2 + mapapp/views.py | 4 +- mydefs.py | 9 +- photo_app/admin.py | 2 + photo_app/models.py | 8 +- photo_app/urls.py | 1 - privatemessage/admin.py | 2 + privatemessage/tests.py | 3 +- privatemessage/urls.py | 2 + privatemessage/views.py | 13 +-- searchapp/admin.py | 2 - searchapp/models.py | 2 - searchapp/tests.py | 2 - searchapp/urls.py | 2 + searchapp/views.py | 6 +- statistics/admin.py | 2 + statistics/migrations/0001_initial.py | 1 + statistics/models.py | 1 + statistics/tests.py | 2 - statistics/urls.py | 4 +- tariff_app/admin.py | 2 + tariff_app/custom_tariffs.py | 5 +- tariff_app/forms.py | 1 + tariff_app/models.py | 2 + tariff_app/tests.py | 2 - tariff_app/urls.py | 2 + tariff_app/views.py | 1 + taskapp/admin.py | 2 + taskapp/context_proc.py | 3 +- taskapp/forms.py | 2 + taskapp/models.py | 4 +- taskapp/tests.py | 2 - taskapp/urls.py | 2 + taskapp/views.py | 2 +- templates/clientsideapp/debt_buy.html | 47 ++++++++++ templates/clientsideapp/debts.html | 48 ++++++++++ templates/clientsideapp/ext.html | 2 +- 80 files changed, 471 insertions(+), 122 deletions(-) delete mode 100755 agent/netflow/netflow_handler.py create mode 100644 agent/netflow/to_mysql.c create mode 100755 agent/netflow/to_mysql.py create mode 100644 templates/clientsideapp/debt_buy.html create mode 100644 templates/clientsideapp/debts.html diff --git a/.gitignore b/.gitignore index a7b0c79..1484e18 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ *.pyc *.db +*/*/*.txt media/* media/min/* ~*/migrations/000*.py diff --git a/abonapp/admin.py b/abonapp/admin.py index f62b3f7..3efc634 100644 --- a/abonapp/admin.py +++ b/abonapp/admin.py @@ -1,6 +1,8 @@ from django.contrib import admin + import models + admin.site.register(models.AbonGroup) admin.site.register(models.Abon) admin.site.register(models.InvoiceForPayment) diff --git a/abonapp/forms.py b/abonapp/forms.py index 284bedf..6a247e9 100644 --- a/abonapp/forms.py +++ b/abonapp/forms.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from django import forms from django.core.validators import RegexValidator + import models from mydefs import ip_addr_regex diff --git a/abonapp/models.py b/abonapp/models.py index 021509d..a32bbf0 100644 --- a/abonapp/models.py +++ b/abonapp/models.py @@ -4,12 +4,13 @@ from django.http import Http404 from django.shortcuts import get_object_or_404 from django.utils import timezone 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.conf import settings 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 @@ -206,12 +207,12 @@ class Abon(UserProfile): 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( abon = self, amount = -how_match_to_pay, author = curuser, - comment = u'Снятие со счёта средств' + comment = u_comment ) self.ballance -= how_match_to_pay diff --git a/abonapp/tests.py b/abonapp/tests.py index 82ce379..78f2c87 100644 --- a/abonapp/tests.py +++ b/abonapp/tests.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from django.shortcuts import get_object_or_404 from django.test import TestCase + from models import Abon, AbonTariff from tariff_app.models import Tariff diff --git a/abonapp/urls.py b/abonapp/urls.py index b4878ec..c7d0995 100644 --- a/abonapp/urls.py +++ b/abonapp/urls.py @@ -1,6 +1,8 @@ from django.conf.urls import url, include + import views + urlpatterns = [ url(r'^$', views.grouplist, name='abongroup_list_link'), diff --git a/abonapp/urls_abon.py b/abonapp/urls_abon.py index ac23a76..806b5ee 100644 --- a/abonapp/urls_abon.py +++ b/abonapp/urls_abon.py @@ -1,6 +1,8 @@ from django.conf.urls import url + import views + urlpatterns = [ url(r'^$', views.peoples, name='people_list_link'), url(r'^addabon$', views.addabon, name='addabon_link'), diff --git a/abonapp/views.py b/abonapp/views.py index b9a1d8c..b5942dc 100644 --- a/abonapp/views.py +++ b/abonapp/views.py @@ -1,15 +1,17 @@ # -*- coding: utf-8 -*- from json import dumps + from django.db import IntegrityError from django.db.models import Count from django.shortcuts import render, redirect, get_object_or_404, resolve_url from django.contrib.auth.decorators import login_required 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.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 import forms import models @@ -266,7 +268,7 @@ def terminal_pay(request): username = request.GET.get('username') 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.add_ballance(kernel_user, amount) diff --git a/accounts_app/admin.py b/accounts_app/admin.py index a98979a..473e805 100644 --- a/accounts_app/admin.py +++ b/accounts_app/admin.py @@ -1,4 +1,6 @@ from django.contrib import admin + from models import UserProfile + admin.site.register(UserProfile) diff --git a/accounts_app/models.py b/accounts_app/models.py index 8c77cd1..d1d0850 100644 --- a/accounts_app/models.py +++ b/accounts_app/models.py @@ -1,10 +1,11 @@ # -*- coding:utf-8 -*- 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.core.validators import RegexValidator +from djing.settings import DEFAULT_PICTURE +from photo_app.models import Photo + class MyUserManager(BaseUserManager): @@ -54,6 +55,7 @@ class UserProfile(AbstractBaseUser, PermissionsMixin): ) skype = models.CharField(max_length=20, blank=True) avatar = models.ForeignKey(Photo, null=True, blank=True) + email = models.EmailField() USERNAME_FIELD = 'username' REQUIRED_FIELDS = ['telephone'] diff --git a/accounts_app/urls.py b/accounts_app/urls.py index e7231df..10d4a14 100644 --- a/accounts_app/urls.py +++ b/accounts_app/urls.py @@ -1,7 +1,9 @@ # -*- coding:utf-8 -*- from django.conf.urls import url + import views + urlpatterns = [ url(r'^login/', views.to_signin, name='login_link'), diff --git a/accounts_app/views.py b/accounts_app/views.py index 9a2edb7..8417b38 100644 --- a/accounts_app/views.py +++ b/accounts_app/views.py @@ -1,15 +1,15 @@ # -*- coding: utf-8 -*- from django.contrib.auth.decorators import login_required#, permission_required from django.contrib.auth import authenticate, login, logout -from photo_app.models import Photo from django.core.urlresolvers import NoReverseMatch -from models import UserProfile from django.shortcuts import render, redirect, get_object_or_404, resolve_url from django.template.context_processors import csrf from django.http import Http404 from django.contrib.auth.models import Group, Permission + +from photo_app.models import Photo +from models import UserProfile import mydefs -from taskapp.models import Task @login_required diff --git a/agent/db.py b/agent/db.py index 229f2ce..48ffea9 100644 --- a/agent/db.py +++ b/agent/db.py @@ -1,7 +1,9 @@ # -*- coding:utf-8 -*- -import requests from json import loads + +import requests from requests.exceptions import ConnectionError + from models import deserialize_tariffs, deserialize_abonents import settings diff --git a/agent/main.py b/agent/main.py index eb3cb4e..e3f0415 100644 --- a/agent/main.py +++ b/agent/main.py @@ -1,8 +1,9 @@ # -*- coding:utf-8 -*- from sys import stdout +from time import sleep + from db import load_from_db from firewall import FirewallManager -from time import sleep from sslTransmitter import TransmitServer from agent.models import Abonent, Tariff diff --git a/agent/netflow/netflow_handler.py b/agent/netflow/netflow_handler.py deleted file mode 100755 index a59e00c..0000000 --- a/agent/netflow/netflow_handler.py +++ /dev/null @@ -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() diff --git a/agent/netflow/netflow_handler.sh b/agent/netflow/netflow_handler.sh index 3c1d83f..db275fa 100755 --- a/agent/netflow/netflow_handler.sh +++ b/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` +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 diff --git a/agent/netflow/to_mysql.c b/agent/netflow/to_mysql.c new file mode 100644 index 0000000..e57f41d --- /dev/null +++ b/agent/netflow/to_mysql.c @@ -0,0 +1,125 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include + + +#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; +} diff --git a/agent/netflow/to_mysql.py b/agent/netflow/to_mysql.py new file mode 100755 index 0000000..5c1cde8 --- /dev/null +++ b/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() diff --git a/agent/sslTransmitter.py b/agent/sslTransmitter.py index 084d5b4..ef2b656 100644 --- a/agent/sslTransmitter.py +++ b/agent/sslTransmitter.py @@ -2,6 +2,7 @@ import ssl import socket from multiprocessing import Process, Manager + import settings from models import EventNAS, Abonent, Tariff diff --git a/clientsideapp/admin.py b/clientsideapp/admin.py index 8c38f3f..846f6b4 100644 --- a/clientsideapp/admin.py +++ b/clientsideapp/admin.py @@ -1,3 +1 @@ -from django.contrib import admin - # Register your models here. diff --git a/clientsideapp/models.py b/clientsideapp/models.py index bd4b2ab..3eff443 100644 --- a/clientsideapp/models.py +++ b/clientsideapp/models.py @@ -1,5 +1,3 @@ from __future__ import unicode_literals -from django.db import models - # Create your models here. diff --git a/clientsideapp/tests.py b/clientsideapp/tests.py index 7ce503c..a39b155 100644 --- a/clientsideapp/tests.py +++ b/clientsideapp/tests.py @@ -1,3 +1 @@ -from django.test import TestCase - # Create your tests here. diff --git a/clientsideapp/urls.py b/clientsideapp/urls.py index efa3372..a147faa 100644 --- a/clientsideapp/urls.py +++ b/clientsideapp/urls.py @@ -1,10 +1,13 @@ # -*- coding:utf-8 -*- from django.conf.urls import url + import views urlpatterns = [ url(r'^$', views.home, name='client_home'), 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+)$', views.debt_buy, name='client_debt_buy') ] diff --git a/clientsideapp/views.py b/clientsideapp/views.py index 8122b05..0196cf8 100644 --- a/clientsideapp/views.py +++ b/clientsideapp/views.py @@ -1,6 +1,8 @@ +# coding=utf-8 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 mydefs import pag_mn @@ -33,3 +35,39 @@ def buy_service(request): 'own_abon_tariffs': own_abon_tariffs, '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 + }) diff --git a/devapp/admin.py b/devapp/admin.py index 19dff8d..095381c 100644 --- a/devapp/admin.py +++ b/devapp/admin.py @@ -1,6 +1,8 @@ from django.contrib import admin + import models + admin.site.register(models.Device) admin.site.register(models.Port) admin.site.register(models.PortStates) diff --git a/devapp/base_intr.py b/devapp/base_intr.py index c0e9bac..6e3b784 100644 --- a/devapp/base_intr.py +++ b/devapp/base_intr.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- from abc import ABCMeta, abstractmethod + from netsnmp import Session, VarList, Varbind diff --git a/devapp/forms.py b/devapp/forms.py index 36e857b..eae3d4b 100644 --- a/devapp/forms.py +++ b/devapp/forms.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- from django import forms + import models from mydefs import ip_addr_regex diff --git a/devapp/migrations/0001_initial.py b/devapp/migrations/0001_initial.py index 143d4b4..94a3d09 100644 --- a/devapp/migrations/0001_initial.py +++ b/devapp/migrations/0001_initial.py @@ -4,6 +4,7 @@ from __future__ import unicode_literals from django.db import migrations, models import django.db.models.deletion + import mydefs diff --git a/devapp/models.py b/devapp/models.py index 67835a5..bdd2f10 100644 --- a/devapp/models.py +++ b/devapp/models.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- from django.db import models + from base_intr import DevBase from mydefs import MyGenericIPAddressField, MyChoicesAdapter from dev_types import DEVICE_TYPES diff --git a/devapp/tests.py b/devapp/tests.py index 7ce503c..a39b155 100644 --- a/devapp/tests.py +++ b/devapp/tests.py @@ -1,3 +1 @@ -from django.test import TestCase - # Create your tests here. diff --git a/devapp/urls.py b/devapp/urls.py index be7fd11..f33e360 100644 --- a/devapp/urls.py +++ b/devapp/urls.py @@ -1,6 +1,8 @@ from django.conf.urls import url + import views + urlpatterns = [ url(r'^$', views.devices, name='devs_link'), url(r'^add$', views.dev, name='devs_add_link'), diff --git a/devapp/views.py b/devapp/views.py index 9b9e01a..0eebe2e 100644 --- a/devapp/views.py +++ b/devapp/views.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from django.contrib.auth.decorators import login_required from django.shortcuts import render, redirect, get_object_or_404 + from models import Device from mydefs import pag_mn, res_success, res_error, only_admins from forms import DeviceForm diff --git a/djing/urls.py b/djing/urls.py index 4881095..cc2f4e0 100644 --- a/djing/urls.py +++ b/djing/urls.py @@ -1,8 +1,10 @@ from django.conf.urls import url, include from django.contrib import admin + import settings from views import home + urlpatterns = [ url(r'^$', home), url(r'^accounts/', include('accounts_app.urls')), @@ -16,7 +18,7 @@ urlpatterns = [ url(r'^statistic/', include('statistics.urls')), url(r'^tasks/', include('taskapp.urls')), url(r'^client/', include('clientsideapp.urls')), - url(r'^admin/', admin.site.urls), + url(r'^admin/', admin.site.urls) ] diff --git a/global_context_processors.py b/global_context_processors.py index 50577ce..42fbcad 100644 --- a/global_context_processors.py +++ b/global_context_processors.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from abonapp.models import Abon from django.shortcuts import get_object_or_404 +from abonapp.models import Abon def context_processor_client_ipaddress(request): diff --git a/ip_pool/admin.py b/ip_pool/admin.py index 65ef72e..da36fb5 100644 --- a/ip_pool/admin.py +++ b/ip_pool/admin.py @@ -1,4 +1,6 @@ from django.contrib import admin + import models + admin.site.register(models.IpPoolItem) diff --git a/ip_pool/forms.py b/ip_pool/forms.py index 5395225..c5bd8ab 100644 --- a/ip_pool/forms.py +++ b/ip_pool/forms.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- from django import forms + from mydefs import ip_addr_regex diff --git a/ip_pool/migrations/0001_initial.py b/ip_pool/migrations/0001_initial.py index 05336f6..f255600 100644 --- a/ip_pool/migrations/0001_initial.py +++ b/ip_pool/migrations/0001_initial.py @@ -3,6 +3,7 @@ from __future__ import unicode_literals from django.db import migrations, models + import mydefs diff --git a/ip_pool/models.py b/ip_pool/models.py index b1342e4..f8fc171 100644 --- a/ip_pool/models.py +++ b/ip_pool/models.py @@ -1,4 +1,5 @@ from django.db import models, connection + from mydefs import ip2int, MyGenericIPAddressField diff --git a/ip_pool/tests.py b/ip_pool/tests.py index 7ce503c..a39b155 100644 --- a/ip_pool/tests.py +++ b/ip_pool/tests.py @@ -1,3 +1 @@ -from django.test import TestCase - # Create your tests here. diff --git a/ip_pool/urls.py b/ip_pool/urls.py index 5bfb07c..c9c075c 100644 --- a/ip_pool/urls.py +++ b/ip_pool/urls.py @@ -1,7 +1,9 @@ # -*- coding:utf-8 -*- from django.conf.urls import url + import views + urlpatterns = [ url(r'^$', views.home, name='pool_home_link'), diff --git a/ip_pool/views.py b/ip_pool/views.py index 943865a..eee96bc 100644 --- a/ip_pool/views.py +++ b/ip_pool/views.py @@ -1,5 +1,6 @@ from django.contrib.auth.decorators import login_required from django.shortcuts import render, redirect, get_object_or_404 + from forms import PoolForm from models import IpPoolItem import mydefs diff --git a/mapapp/admin.py b/mapapp/admin.py index 06bdd54..0ec8944 100644 --- a/mapapp/admin.py +++ b/mapapp/admin.py @@ -1,4 +1,6 @@ from django.contrib import admin + import models + admin.site.register(models.Dot) diff --git a/mapapp/tests.py b/mapapp/tests.py index 7ce503c..a39b155 100644 --- a/mapapp/tests.py +++ b/mapapp/tests.py @@ -1,3 +1 @@ -from django.test import TestCase - # Create your tests here. diff --git a/mapapp/urls.py b/mapapp/urls.py index 2309fbc..89d571a 100644 --- a/mapapp/urls.py +++ b/mapapp/urls.py @@ -1,6 +1,8 @@ from django.conf.urls import url + import views + urlpatterns = [ url(r'^$', views.home, name='maps_home_link'), url(r'^get_dots$', views.get_dots, name='maps_get_dots') diff --git a/mapapp/views.py b/mapapp/views.py index 86e73e4..66c0e4c 100644 --- a/mapapp/views.py +++ b/mapapp/views.py @@ -1,8 +1,10 @@ +from json import dumps + from django.contrib.auth.decorators import login_required from django.http import HttpResponse from django.shortcuts import render + from models import Dot -from json import dumps from mydefs import only_admins diff --git a/mydefs.py b/mydefs.py index 5c586e9..27acd42 100644 --- a/mydefs.py +++ b/mydefs.py @@ -1,13 +1,14 @@ # -*- coding: utf-8 -*- -from django.http import HttpResponse, Http404 from json import dumps -from django.shortcuts import redirect -from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage import socket import struct -from django.db import models 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]?)$' diff --git a/photo_app/admin.py b/photo_app/admin.py index 9d30a59..e9bc8f2 100644 --- a/photo_app/admin.py +++ b/photo_app/admin.py @@ -1,4 +1,6 @@ from django.contrib import admin + import models + admin.site.register(models.Photo) \ No newline at end of file diff --git a/photo_app/models.py b/photo_app/models.py index 9251c23..f5fdc0c 100644 --- a/photo_app/models.py +++ b/photo_app/models.py @@ -1,11 +1,13 @@ # -*- coding:utf-8 -*- -from django.db import models -from djing.settings import BASE_DIR import os -from PIL import Image import time import hashlib +from django.db import models +from PIL import Image + +from djing.settings import BASE_DIR + class Photo(models.Model): image = models.ImageField(width_field='wdth', height_field='heigt') diff --git a/photo_app/urls.py b/photo_app/urls.py index 3fa1f7b..a8e59e5 100644 --- a/photo_app/urls.py +++ b/photo_app/urls.py @@ -1,5 +1,4 @@ # -*- coding:utf-8 -*- -from django.conf.urls import patterns, url urlpatterns = [ #url(r'^$', 'photo_albums', name='media_home_link'), diff --git a/privatemessage/admin.py b/privatemessage/admin.py index 5e0689c..fd83d67 100644 --- a/privatemessage/admin.py +++ b/privatemessage/admin.py @@ -1,5 +1,7 @@ from django.contrib import admin + from models import PrivateMessages, Dialog + admin.site.register(PrivateMessages) admin.site.register(Dialog) diff --git a/privatemessage/tests.py b/privatemessage/tests.py index 04c4a6f..bae8b77 100644 --- a/privatemessage/tests.py +++ b/privatemessage/tests.py @@ -1,7 +1,8 @@ from django.test import TestCase -import models from django.contrib.auth.models import User +import models + class PaysTest(TestCase): diff --git a/privatemessage/urls.py b/privatemessage/urls.py index fbab5aa..d551d81 100644 --- a/privatemessage/urls.py +++ b/privatemessage/urls.py @@ -1,6 +1,8 @@ from django.conf.urls import url + import views + urlpatterns = [ url(r'^$', views.home, name='privmsg_home'), url(r'^delitem_(?P\d+)$', views.delitem, name='privmsg_delitem'), diff --git a/privatemessage/views.py b/privatemessage/views.py index 5fea3fa..a340902 100644 --- a/privatemessage/views.py +++ b/privatemessage/views.py @@ -1,13 +1,15 @@ # -*- coding: utf-8 -*- +from json import dumps + from django.contrib.auth.decorators import login_required from django.shortcuts import render, redirect from django.template.loader import render_to_string -from models import PrivateMessages from django.http import HttpResponse -from json import dumps from django.template.context_processors import csrf + +from models import PrivateMessages import mydefs -from accounts_app.models import UserProfile +from django.contrib.auth import get_user_model @login_required @@ -36,6 +38,7 @@ def delitem(request, id=0): @login_required @mydefs.only_admins def send_message(request): + UserModel = get_user_model() if request.method == 'GET': return HttpResponse(render_to_string('private_messages/send_form.html',{ '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) msg = PrivateMessages() 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.save() return redirect('privmsg_home') - except UserProfile.DoesNotExist: + except UserModel.DoesNotExist: return mydefs.res_error(request, u'Адресат не найден') else: return mydefs.res_error(request, u'Ошибка типа запроса') diff --git a/searchapp/admin.py b/searchapp/admin.py index 8c38f3f..846f6b4 100644 --- a/searchapp/admin.py +++ b/searchapp/admin.py @@ -1,3 +1 @@ -from django.contrib import admin - # Register your models here. diff --git a/searchapp/models.py b/searchapp/models.py index bd4b2ab..3eff443 100644 --- a/searchapp/models.py +++ b/searchapp/models.py @@ -1,5 +1,3 @@ from __future__ import unicode_literals -from django.db import models - # Create your models here. diff --git a/searchapp/tests.py b/searchapp/tests.py index 7ce503c..a39b155 100644 --- a/searchapp/tests.py +++ b/searchapp/tests.py @@ -1,3 +1 @@ -from django.test import TestCase - # Create your tests here. diff --git a/searchapp/urls.py b/searchapp/urls.py index 0838048..bbe219b 100644 --- a/searchapp/urls.py +++ b/searchapp/urls.py @@ -1,6 +1,8 @@ from django.conf.urls import url + import views + urlpatterns = [ url(r'^$', views.home, name='search_home_link'), diff --git a/searchapp/views.py b/searchapp/views.py index 0756bd3..5b2cbd7 100644 --- a/searchapp/views.py +++ b/searchapp/views.py @@ -1,8 +1,10 @@ +import re + from django.db.models import Q from django.shortcuts import render -from abonapp.models import Abon from django.utils.html import escape -import re + +from abonapp.models import Abon def replace_without_case(orig, old, new): diff --git a/statistics/admin.py b/statistics/admin.py index 684a10f..85f187a 100644 --- a/statistics/admin.py +++ b/statistics/admin.py @@ -1,4 +1,6 @@ from django.contrib import admin + import models + admin.site.register(models.StatElem) diff --git a/statistics/migrations/0001_initial.py b/statistics/migrations/0001_initial.py index 5ce143e..0cf599d 100644 --- a/statistics/migrations/0001_initial.py +++ b/statistics/migrations/0001_initial.py @@ -3,6 +3,7 @@ from __future__ import unicode_literals from django.db import migrations, models + import mydefs diff --git a/statistics/models.py b/statistics/models.py index 4cb4fc6..1856dec 100644 --- a/statistics/models.py +++ b/statistics/models.py @@ -1,6 +1,7 @@ from __future__ import unicode_literals from django.db import models + from mydefs import MyGenericIPAddressField diff --git a/statistics/tests.py b/statistics/tests.py index 7ce503c..a39b155 100644 --- a/statistics/tests.py +++ b/statistics/tests.py @@ -1,3 +1 @@ -from django.test import TestCase - # Create your tests here. diff --git a/statistics/urls.py b/statistics/urls.py index 30613be..1cd3a96 100644 --- a/statistics/urls.py +++ b/statistics/urls.py @@ -1,6 +1,8 @@ -from django.conf.urls import url, include +from django.conf.urls import url + import views + urlpatterns = [ url(r'^$', views.home, name='stat_home'), ] diff --git a/tariff_app/admin.py b/tariff_app/admin.py index e50ec25..c0ec005 100644 --- a/tariff_app/admin.py +++ b/tariff_app/admin.py @@ -1,4 +1,6 @@ from django.contrib import admin + import models + admin.site.register(models.Tariff) diff --git a/tariff_app/custom_tariffs.py b/tariff_app/custom_tariffs.py index 3993156..b6ae107 100644 --- a/tariff_app/custom_tariffs.py +++ b/tariff_app/custom_tariffs.py @@ -1,7 +1,10 @@ # -*- coding: utf-8 -*- -from django.utils import timezone from datetime import datetime, timedelta + +from django.utils import timezone + from base_intr import TariffBase + #from abonapp import AbonTariff diff --git a/tariff_app/forms.py b/tariff_app/forms.py index f49afd5..ff9f107 100644 --- a/tariff_app/forms.py +++ b/tariff_app/forms.py @@ -1,4 +1,5 @@ from django import forms + import models diff --git a/tariff_app/models.py b/tariff_app/models.py index b059049..d4b159d 100644 --- a/tariff_app/models.py +++ b/tariff_app/models.py @@ -1,10 +1,12 @@ # -*- coding: utf-8 -*- from django.db import models + from custom_tariffs import TariffBase, TARIFF_CHOICES from mydefs import MyChoicesAdapter from agent import get_TransmitterClientKlass + # Класс похож на адаптер. Предназначен для Django CHOICES чтоб можно было передавать классывместо просто описания поля, # классы передавать для того чтоб по значению из базы понять какой класс нужно взять для расчёта стоимости тарифа. class _TariffChoicesAdapter(MyChoicesAdapter): diff --git a/tariff_app/tests.py b/tariff_app/tests.py index 7ce503c..a39b155 100644 --- a/tariff_app/tests.py +++ b/tariff_app/tests.py @@ -1,3 +1 @@ -from django.test import TestCase - # Create your tests here. diff --git a/tariff_app/urls.py b/tariff_app/urls.py index 3ba7dca..fdd9943 100644 --- a/tariff_app/urls.py +++ b/tariff_app/urls.py @@ -1,6 +1,8 @@ from django.conf.urls import url + import views + urlpatterns = [ url(r'^$', views.tarifs, name='tarifs_link'), url(r'^(?P\d+)$', views.edit_tarif, name='tarifs_edit_link'), diff --git a/tariff_app/views.py b/tariff_app/views.py index b4d6ba9..2c21185 100644 --- a/tariff_app/views.py +++ b/tariff_app/views.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from django.contrib.auth.decorators import login_required from django.shortcuts import render, get_object_or_404, redirect + from models import Tariff import mydefs import forms diff --git a/taskapp/admin.py b/taskapp/admin.py index 6dba17b..0297440 100644 --- a/taskapp/admin.py +++ b/taskapp/admin.py @@ -1,4 +1,6 @@ from django.contrib import admin + import models + admin.site.register(models.Task) diff --git a/taskapp/context_proc.py b/taskapp/context_proc.py index 3ad3c80..f950fa8 100644 --- a/taskapp/context_proc.py +++ b/taskapp/context_proc.py @@ -1,11 +1,12 @@ from django.contrib.auth.models import AnonymousUser + from taskapp.models import Task def get_active_tasks_count(request): tasks_count = 0 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 { 'tasks_count': tasks_count } diff --git a/taskapp/forms.py b/taskapp/forms.py index f5e4d53..0e851ff 100644 --- a/taskapp/forms.py +++ b/taskapp/forms.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- from datetime import datetime, timedelta + from django import forms + from models import TASK_PRIORITIES, TASK_STATES from accounts_app.models import UserProfile from devapp.models import Device diff --git a/taskapp/models.py b/taskapp/models.py index 3d79bd4..05c4192 100644 --- a/taskapp/models.py +++ b/taskapp/models.py @@ -1,10 +1,12 @@ # coding=utf-8 from __future__ import unicode_literals +from datetime import datetime, timedelta + from django.db import models from django.conf import settings + from devapp.models import Device -from datetime import datetime, timedelta TASK_PRIORITIES = ( diff --git a/taskapp/tests.py b/taskapp/tests.py index 7ce503c..a39b155 100644 --- a/taskapp/tests.py +++ b/taskapp/tests.py @@ -1,3 +1 @@ -from django.test import TestCase - # Create your tests here. diff --git a/taskapp/urls.py b/taskapp/urls.py index 5f1a4fd..9f3bcf7 100644 --- a/taskapp/urls.py +++ b/taskapp/urls.py @@ -1,6 +1,8 @@ from django.conf.urls import url + import views + urlpatterns = [ url(r'^$', views.home, name='task_home'), url(r'^(?P\d+)/edit$', views.task_add_edit, name='task_edit'), diff --git a/taskapp/views.py b/taskapp/views.py index c8cda85..7b55553 100644 --- a/taskapp/views.py +++ b/taskapp/views.py @@ -1,7 +1,7 @@ # coding=utf-8 from django.contrib.auth.decorators import login_required from django.shortcuts import render, redirect, get_object_or_404 -from accounts_app.models import UserProfile + from models import Task from mydefs import pag_mn, only_admins, safe_int from forms import TaskFrm diff --git a/templates/clientsideapp/debt_buy.html b/templates/clientsideapp/debt_buy.html new file mode 100644 index 0000000..77d604b --- /dev/null +++ b/templates/clientsideapp/debt_buy.html @@ -0,0 +1,47 @@ +{% extends 'clientsideapp/ext.html' %} +{% block client_main %} + + + +
+
+

Оплатить задолженность

+
+
+
{% csrf_token %} +
+ +
+

+ С вашего счёта снимутся средства в размере {{ amount }} руб.
+ В результате у вас на счету останется {{ ballance_after }} руб.
+ Администратор сразу сможет видеть что у вас закрыта задолженность. +

+

Описание платежа

+
+ {{ debt.comment }} +
+ +
+ + + Отменить + +
+
+
+
+{% endblock %} \ No newline at end of file diff --git a/templates/clientsideapp/debts.html b/templates/clientsideapp/debts.html new file mode 100644 index 0000000..130a7d6 --- /dev/null +++ b/templates/clientsideapp/debts.html @@ -0,0 +1,48 @@ +{% extends 'clientsideapp/ext.html' %} +{% block client_main %} + + + + + + + + + + + + + + + {% for debt in debts %} + + + + + + + + + {% empty %} + + {% endfor %} + +
СостояниеСуммаОписаниеДата созданияДата платежаОплатить
{{ debt.amount }} руб.{{ debt.comment }}{{ debt.date_create|date:'d b H:i' }} + {% if debt.date_pay %} + {{ debt.date_pay|date:'d b H:i' }} + {% else %} + {% if debt.status %} + Создан оплаченным + {% else %} + Ещё не оплачен + {% endif %} + {% endif %} + + + + +
У вас нет долгов
+ +{% endblock %} \ No newline at end of file diff --git a/templates/clientsideapp/ext.html b/templates/clientsideapp/ext.html index 469ef87..d00d4a7 100644 --- a/templates/clientsideapp/ext.html +++ b/templates/clientsideapp/ext.html @@ -55,7 +55,7 @@ Другое