Browse Source

Дописал и перенёс расчёт сглаженного графика в менеджер модели

devel
Dmitry 9 years ago
parent
commit
caf25f0d21
  1. 15
      abonapp/views.py
  2. 33
      statistics/models.py

15
abonapp/views.py

@ -19,6 +19,7 @@ from . import models
import mydefs import mydefs
from devapp.models import Device from devapp.models import Device
from datetime import datetime from datetime import datetime
from taskapp.models import Task
@login_required @login_required
@ -610,7 +611,6 @@ def update_nas(request, group_id):
@login_required @login_required
@mydefs.only_admins @mydefs.only_admins
def task_log(request, gid, uid): def task_log(request, gid, uid):
from taskapp.models import Task
abon = get_object_or_404(models.Abon, pk=uid) abon = get_object_or_404(models.Abon, pk=uid)
tasks = Task.objects.filter(abon=abon) tasks = Task.objects.filter(abon=abon)
return render(request, 'abonapp/task_log.html', { return render(request, 'abonapp/task_log.html', {
@ -715,11 +715,8 @@ def clear_dev(request, gid, uid):
@mydefs.only_admins @mydefs.only_admins
def charts(request, gid, uid): def charts(request, gid, uid):
from statistics.models import getModel from statistics.models import getModel
from datetime import datetime, date, time, timedelta
high = 100 high = 100
def byte_to_mbit(x):
return ((x/60)*8)/2**20
try: try:
StatElem = getModel() StatElem = getModel()
abon = models.Abon.objects.get(pk=uid) abon = models.Abon.objects.get(pk=uid)
@ -731,15 +728,7 @@ def charts(request, gid, uid):
if abon.ip_address is None: if abon.ip_address is None:
charts_data = None charts_data = None
else: else:
charts_data = StatElem.objects.filter(ip=abon.ip_address)
#oct_limit = StatElem.percentile([cd.octets for cd in charts_data], 0.05)
# ниже возвращаем пары значений трафика который переведён в mByte, и unix timestamp
midnight = datetime.combine(date.today(), time.min)
charts_data = [(cd.cur_time.timestamp()*1000, byte_to_mbit(cd.octets)) for cd in charts_data]
if len(charts_data) > 0:
charts_data.append( (charts_data[-1:][0][0], 0.0) )
charts_data = ["{x: new Date(%d), y: %.2f}" % (cd[0], cd[1]) for cd in charts_data]
charts_data.append("{x:new Date(%d),y:0}" % (int((midnight + timedelta(days=1)).timestamp()) * 1000))
charts_data = StatElem.objects.chart(abon.ip_address)
abontariff = abon.active_tariff() abontariff = abon.active_tariff()
high = abontariff.speedIn + abontariff.speedOut high = abontariff.speedIn + abontariff.speedOut

33
statistics/models.py

@ -1,5 +1,5 @@
import math import math
from datetime import datetime, timedelta
from datetime import datetime, timedelta, date, time
from django.db import models, ProgrammingError from django.db import models, ProgrammingError
from django.utils import timezone from django.utils import timezone
from mydefs import MyGenericIPAddressField from mydefs import MyGenericIPAddressField
@ -22,6 +22,35 @@ class StatManager(models.Manager):
except ProgrammingError as e: except ProgrammingError as e:
raise LogicError(e) raise LogicError(e)
def chart(self, ip_addr, count_of_parts=12):
def byte_to_mbit(x):
return ((x/60)*8)/2**20
def split_list(lst, chunk_count):
chunk_size = len(lst) // chunk_count
return [lst[i:i+chunk_size] for i in range(0, len(lst), chunk_size)]
def avarage(elements):
return sum(elements) / len(elements)
charts_data = self.filter(ip=ip_addr)
charts_times = [cd.cur_time.timestamp()*1000 for cd in charts_data]
charts_octets = [byte_to_mbit(cd.octets) for cd in charts_data]
if len(charts_octets) > 0 and len(charts_octets) == len(charts_times):
charts_octets = split_list(charts_octets, count_of_parts)
charts_octets = [avarage(c) for c in charts_octets]
charts_times = split_list(charts_times, count_of_parts)
charts_times = [avarage(t) for t in charts_times]
charts_data = map(lambda x, y: (x, y), charts_times, charts_octets)
charts_data = ["{x: new Date(%d), y: %.2f}" % (cd[0], cd[1]) for cd in charts_data]
midnight = datetime.combine(date.today(), time.min)
charts_data.append("{x:new Date(%d),y:0}" % (int((midnight + timedelta(days=1)).timestamp()) * 1000))
return charts_data
else:
return
class StatElem(models.Model): class StatElem(models.Model):
cur_time = UnixDateTimeField(primary_key=True) cur_time = UnixDateTimeField(primary_key=True)
@ -67,6 +96,6 @@ def getModel():
class DynamicStatElem(StatElem): class DynamicStatElem(StatElem):
class Meta: class Meta:
db_table = 'flowstat_%s' % timezone.now().strftime("%d%m%Y")
db_table = 'flowstat_%s' % datetime.now().strftime("%d%m%Y")
abstract = False abstract = False
return DynamicStatElem return DynamicStatElem
Loading…
Cancel
Save