remove internal stats of actual devicehub
This commit is contained in:
parent
1cb0634bf1
commit
eae036d7c0
|
@ -1,96 +0,0 @@
|
|||
import csv
|
||||
|
||||
# import click_spinner
|
||||
# import ereuse_utils.cli
|
||||
from io import StringIO
|
||||
|
||||
from ereuse_devicehub.resources.action import models as evs
|
||||
from ereuse_devicehub.resources.device.models import Placeholder
|
||||
from ereuse_devicehub.resources.documents.device_row import InternalStatsRow
|
||||
|
||||
# import click
|
||||
|
||||
|
||||
class Report:
|
||||
def __init__(self, app) -> None:
|
||||
super().__init__()
|
||||
self.app = app
|
||||
short_help = 'Creates reports devices and users.'
|
||||
self.app.cli.command('report', short_help=short_help)(self.run)
|
||||
|
||||
def run(self):
|
||||
stats = InternalStatsView()
|
||||
stats.print()
|
||||
|
||||
|
||||
class InternalStatsView:
|
||||
def print(self):
|
||||
query = evs.Action.query.filter(
|
||||
evs.Action.type.in_(
|
||||
(
|
||||
'Snapshot',
|
||||
'Live',
|
||||
'Allocate',
|
||||
'Deallocate',
|
||||
'EraseBasic',
|
||||
'EraseSectors',
|
||||
)
|
||||
)
|
||||
)
|
||||
return self.generate_post_csv(query)
|
||||
|
||||
def generate_post_csv(self, query):
|
||||
data = StringIO()
|
||||
cw = csv.writer(data, delimiter=';', lineterminator="\n", quotechar='"')
|
||||
cw.writerow(InternalStatsRow('', "2000-1", [], []).keys())
|
||||
|
||||
for row in self.get_rows(query):
|
||||
cw.writerow(row)
|
||||
|
||||
return print(data.getvalue())
|
||||
|
||||
def get_rows(self, query):
|
||||
d = {}
|
||||
dd = {}
|
||||
disks = []
|
||||
for ac in query:
|
||||
create = '{}-{}'.format(ac.created.year, ac.created.month)
|
||||
user = ac.author.email
|
||||
|
||||
if user not in d:
|
||||
d[user] = {}
|
||||
dd[user] = {}
|
||||
if create not in d[user]:
|
||||
d[user][create] = []
|
||||
dd[user][create] = None
|
||||
d[user][create].append(ac)
|
||||
|
||||
for user, createds in d.items():
|
||||
for create, actions in createds.items():
|
||||
r = InternalStatsRow(user, create, actions, disks)
|
||||
dd[user][create] = r
|
||||
|
||||
return self.get_placeholders(dd)
|
||||
|
||||
def get_placeholders(self, dd):
|
||||
|
||||
for p in Placeholder.query.all():
|
||||
create = '{}-{}'.format(p.created.year, p.created.month)
|
||||
user = p.owner.email
|
||||
|
||||
if user not in dd:
|
||||
dd[user] = {}
|
||||
|
||||
if create not in dd[user]:
|
||||
dd[user][create] = None
|
||||
|
||||
if not dd[user][create]:
|
||||
dd[user][create] = InternalStatsRow(user, create, [], [])
|
||||
|
||||
dd[user][create]['Placeholders'] += 1
|
||||
|
||||
rows = []
|
||||
for user, createds in dd.items():
|
||||
for create, row in createds.items():
|
||||
rows.append(row.values())
|
||||
return rows
|
|
@ -15,7 +15,7 @@ from teal.teal import Teal
|
|||
|
||||
from ereuse_devicehub.auth import Auth
|
||||
from ereuse_devicehub.client import Client, UserClient
|
||||
from ereuse_devicehub.commands.reports import Report
|
||||
# from ereuse_devicehub.commands.reports import Report
|
||||
from ereuse_devicehub.commands.users import GetToken
|
||||
from ereuse_devicehub.config import DevicehubConfig
|
||||
from ereuse_devicehub.db import db
|
||||
|
@ -29,7 +29,7 @@ from ereuse_devicehub.templating import Environment
|
|||
class Devicehub(Teal):
|
||||
test_client_class = Client
|
||||
Dummy = Dummy
|
||||
Report = Report
|
||||
# Report = Report
|
||||
jinja_environment = Environment
|
||||
|
||||
def __init__(
|
||||
|
@ -70,7 +70,7 @@ class Devicehub(Teal):
|
|||
self.id = inventory
|
||||
"""The Inventory ID of this instance. In Teal is the app.schema."""
|
||||
self.dummy = Dummy(self)
|
||||
self.report = Report(self)
|
||||
# self.report = Report(self)
|
||||
self.get_token = GetToken(self)
|
||||
|
||||
@self.cli.group(
|
||||
|
|
|
@ -614,104 +614,3 @@ class ActionRow(OrderedDict):
|
|||
self['Type'] = allocate['type']
|
||||
self['LiveCreate'] = allocate['liveCreate']
|
||||
self['UsageTimeHdd'] = allocate['usageTimeHdd']
|
||||
|
||||
|
||||
class InternalStatsRow(OrderedDict):
|
||||
def __init__(self, user, create, actions, disks):
|
||||
super().__init__()
|
||||
# General information about all internal stats
|
||||
# user, quart, month, year:
|
||||
# Snapshot (Registers)
|
||||
# Snapshots (Update)
|
||||
# Snapshots (All)
|
||||
# Drives Erasure
|
||||
# Drives Erasure Uniques
|
||||
# Placeholders
|
||||
# Allocate
|
||||
# Deallocate
|
||||
# Live
|
||||
self.actions = actions
|
||||
year, month = create.split('-')
|
||||
self.disks = disks
|
||||
|
||||
self['User'] = user
|
||||
self['Year'] = year
|
||||
self['Quarter'] = self.quarter(month)
|
||||
self['Month'] = month
|
||||
self['Snapshot (Registers)'] = 0
|
||||
self['Snapshot (Update)'] = 0
|
||||
self['Snapshot (All)'] = 0
|
||||
self['Drives Erasure'] = 0
|
||||
self['Drives Erasure Uniques'] = 0
|
||||
self['Placeholders'] = 0
|
||||
self['Allocates'] = 0
|
||||
self['Deallocates'] = 0
|
||||
self['Lives'] = 0
|
||||
|
||||
self.count_actions()
|
||||
|
||||
def count_actions(self):
|
||||
for ac in self.actions:
|
||||
self.is_snapshot(
|
||||
self.is_deallocate(self.is_live(self.is_allocate(self.is_erase(ac))))
|
||||
)
|
||||
|
||||
def is_allocate(self, ac):
|
||||
if ac.type == 'Allocate':
|
||||
self['Allocates'] += 1
|
||||
return ac
|
||||
|
||||
def is_erase(self, ac):
|
||||
if ac.type in ['EraseBasic', 'EraseSectors']:
|
||||
self['Drives Erasure'] += 1
|
||||
if ac.device in self.disks:
|
||||
return ac
|
||||
self['Drives Erasure Uniques'] += 1
|
||||
self.disks.append(ac.device)
|
||||
return ac
|
||||
|
||||
def is_live(self, ac):
|
||||
if ac.type == 'Live':
|
||||
self['Lives'] += 1
|
||||
return ac
|
||||
|
||||
def is_deallocate(self, ac):
|
||||
if ac.type == 'Deallocate':
|
||||
self['Deallocates'] += 1
|
||||
return ac
|
||||
|
||||
def is_snapshot(self, ac):
|
||||
if not ac.type == 'Snapshot':
|
||||
return
|
||||
self['Snapshot (All)'] += 1
|
||||
|
||||
canary = False
|
||||
for _ac in ac.device.actions:
|
||||
if not _ac.type == 'Snapshot':
|
||||
continue
|
||||
|
||||
if _ac.created < ac.created:
|
||||
canary = True
|
||||
break
|
||||
|
||||
if canary:
|
||||
self['Snapshot (Update)'] += 1
|
||||
else:
|
||||
self['Snapshot (Registers)'] += 1
|
||||
|
||||
def quarter(self, month):
|
||||
q = {
|
||||
1: 'Q1',
|
||||
2: 'Q1',
|
||||
3: 'Q1',
|
||||
4: 'Q2',
|
||||
5: 'Q2',
|
||||
6: 'Q2',
|
||||
7: 'Q3',
|
||||
8: 'Q3',
|
||||
9: 'Q3',
|
||||
10: 'Q4',
|
||||
11: 'Q4',
|
||||
12: 'Q4',
|
||||
}
|
||||
return q[int(month)]
|
||||
|
|
|
@ -30,7 +30,6 @@ from ereuse_devicehub.resources.device.views import DeviceView
|
|||
from ereuse_devicehub.resources.documents.device_row import (
|
||||
ActionRow,
|
||||
DeviceRow,
|
||||
InternalStatsRow,
|
||||
StockRow,
|
||||
)
|
||||
from ereuse_devicehub.resources.enums import SessionType
|
||||
|
@ -345,42 +344,6 @@ class StampsView(View):
|
|||
result=result)
|
||||
|
||||
|
||||
class InternalStatsView(DeviceView):
|
||||
@cache(datetime.timedelta(minutes=1))
|
||||
def find(self, args: dict):
|
||||
if not g.user.email == app.config['EMAIL_ADMIN']:
|
||||
return jsonify('')
|
||||
query = evs.Action.query.filter(
|
||||
evs.Action.type.in_(('Snapshot', 'Live', 'Allocate', 'Deallocate')))
|
||||
return self.generate_post_csv(query)
|
||||
|
||||
def generate_post_csv(self, query):
|
||||
d = {}
|
||||
for ac in query:
|
||||
create = '{}-{}'.format(ac.created.year, ac.created.month)
|
||||
user = ac.author.email
|
||||
|
||||
if user not in d:
|
||||
d[user] = {}
|
||||
if create not in d[user]:
|
||||
d[user][create] = []
|
||||
d[user][create].append(ac)
|
||||
|
||||
data = StringIO()
|
||||
cw = csv.writer(data, delimiter=';', lineterminator="\n", quotechar='"')
|
||||
cw.writerow(InternalStatsRow('', "2000-1", []).keys())
|
||||
for user, createds in d.items():
|
||||
for create, actions in createds.items():
|
||||
cw.writerow(InternalStatsRow(user, create, actions).values())
|
||||
|
||||
bfile = data.getvalue().encode('utf-8')
|
||||
output = make_response(bfile)
|
||||
insert_hash(bfile)
|
||||
output.headers['Content-Disposition'] = 'attachment; filename=internal-stats.csv'
|
||||
output.headers['Content-type'] = 'text/csv'
|
||||
return output
|
||||
|
||||
|
||||
class WbConfDocumentView(DeviceView):
|
||||
def get(self, wbtype: str):
|
||||
if not wbtype.lower() in ['usodyrate', 'usodywipe']:
|
||||
|
@ -473,12 +436,6 @@ class DocumentDef(Resource):
|
|||
stamps_view = StampsView.as_view('StampsView', definition=self, auth=app.auth)
|
||||
self.add_url_rule('/stamps/', defaults={}, view_func=stamps_view, methods={'GET', 'POST'})
|
||||
|
||||
# internalstats_view = InternalStatsView.as_view(
|
||||
# 'InternalStatsView', definition=self, auth=app.auth)
|
||||
# internalstats_view = app.auth.requires_auth(internalstats_view)
|
||||
# self.add_url_rule('/internalstats/', defaults=d, view_func=internalstats_view,
|
||||
# methods=get)
|
||||
|
||||
actions_view = ActionsDocumentView.as_view('ActionsDocumentView',
|
||||
definition=self,
|
||||
auth=app.auth)
|
||||
|
|
Reference in New Issue