Added manage.py project_stats command.
It counts file size, nr of nodes and nr of top-level nodes per project.
This commit is contained in:
parent
879a18ee68
commit
4dc5b4dbbf
@ -870,5 +870,71 @@ def refresh_file_sizes():
|
||||
log.info('%i bytes (%.3f GiB) storage used in total.',
|
||||
total_size, total_size / 1024 ** 3)
|
||||
|
||||
|
||||
@manager.command
|
||||
def project_stats():
|
||||
import csv
|
||||
import sys
|
||||
from application.modules import projects
|
||||
|
||||
proj_coll = app.data.driver.db['projects']
|
||||
nodes = app.data.driver.db['nodes']
|
||||
|
||||
aggr_project_count = 0
|
||||
aggr_file_size = 0
|
||||
aggr_node_count = 0
|
||||
aggr_top_nodes = 0
|
||||
|
||||
csvout = csv.writer(sys.stdout)
|
||||
csvout.writerow(['project ID', 'owner', 'project name', 'file size',
|
||||
'nr of nodes', 'nr of top-level nodes', ])
|
||||
|
||||
for proj in proj_coll.find(projection={'user': 1,
|
||||
'name': 1,
|
||||
'_id': 1}):
|
||||
project_id = proj['_id']
|
||||
row = [str(project_id),
|
||||
str(proj['user']),
|
||||
str(proj['name'])]
|
||||
|
||||
file_size = projects.project_total_file_size(project_id)
|
||||
row.append(file_size)
|
||||
|
||||
node_count_result = nodes.aggregate([
|
||||
{'$match': {'project': project_id}},
|
||||
{'$project': {'parent': 1,
|
||||
'is_top': {'$cond': [{'$gt': ['$parent', None]}, 0, 1]},
|
||||
}},
|
||||
{'$group': {
|
||||
'_id': None,
|
||||
'all': {'$sum': 1},
|
||||
'top': {'$sum': '$is_top'},
|
||||
}}
|
||||
])
|
||||
|
||||
try:
|
||||
node_counts = next(node_count_result)
|
||||
nodes_all = node_counts['all']
|
||||
nodes_top = node_counts['top']
|
||||
except StopIteration:
|
||||
# No result from the nodes means nodeless project.
|
||||
nodes_all = 0
|
||||
nodes_top = 0
|
||||
row.append(nodes_all)
|
||||
row.append(nodes_top)
|
||||
|
||||
aggr_project_count += 1
|
||||
aggr_file_size += file_size
|
||||
aggr_node_count += nodes_all
|
||||
aggr_top_nodes += nodes_top
|
||||
|
||||
csvout.writerow(row)
|
||||
|
||||
csvout.writerow([
|
||||
'total', '', '%i projects' % aggr_project_count, aggr_file_size, aggr_node_count,
|
||||
aggr_top_nodes
|
||||
])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
manager.run()
|
||||
|
Loading…
x
Reference in New Issue
Block a user