Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / management / commands / stats-astakos.py @ 9b3081a6

History | View | Annotate | Download (3.6 kB)

1 79f67df6 Christos Stavrakakis
# Copyright 2013 GRNET S.A. All rights reserved.
2 79f67df6 Christos Stavrakakis
#
3 79f67df6 Christos Stavrakakis
# Redistribution and use in source and binary forms, with or
4 79f67df6 Christos Stavrakakis
# without modification, are permitted provided that the following
5 79f67df6 Christos Stavrakakis
# conditions are met:
6 79f67df6 Christos Stavrakakis
#
7 79f67df6 Christos Stavrakakis
#   1. Redistributions of source code must retain the above
8 79f67df6 Christos Stavrakakis
#      copyright notice, this list of conditions and the following
9 79f67df6 Christos Stavrakakis
#      disclaimer.
10 79f67df6 Christos Stavrakakis
#
11 79f67df6 Christos Stavrakakis
#   2. Redistributions in binary form must reproduce the above
12 79f67df6 Christos Stavrakakis
#      copyright notice, this list of conditions and the following
13 79f67df6 Christos Stavrakakis
#      disclaimer in the documentation and/or other materials
14 79f67df6 Christos Stavrakakis
#      provided with the distribution.
15 79f67df6 Christos Stavrakakis
#
16 79f67df6 Christos Stavrakakis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 79f67df6 Christos Stavrakakis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 79f67df6 Christos Stavrakakis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 79f67df6 Christos Stavrakakis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 79f67df6 Christos Stavrakakis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 79f67df6 Christos Stavrakakis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 79f67df6 Christos Stavrakakis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 79f67df6 Christos Stavrakakis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 79f67df6 Christos Stavrakakis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 79f67df6 Christos Stavrakakis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 79f67df6 Christos Stavrakakis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 79f67df6 Christos Stavrakakis
# POSSIBILITY OF SUCH DAMAGE.
28 79f67df6 Christos Stavrakakis
#
29 79f67df6 Christos Stavrakakis
# The views and conclusions contained in the software and
30 79f67df6 Christos Stavrakakis
# documentation are those of the authors and should not be
31 79f67df6 Christos Stavrakakis
# interpreted as representing official policies, either expressed
32 79f67df6 Christos Stavrakakis
# or implied, of GRNET S.A.
33 79f67df6 Christos Stavrakakis
import json
34 79f67df6 Christos Stavrakakis
import string
35 79f67df6 Christos Stavrakakis
#from optparse import make_option
36 79f67df6 Christos Stavrakakis
37 79f67df6 Christos Stavrakakis
from snf_django.management.commands import SynnefoCommand, CommandError
38 c8a38c0e Christos Stavrakakis
from snf_django.management.utils import pprint_table
39 c8a38c0e Christos Stavrakakis
#from astakos.im.models import AstakosUser, Resource
40 c8a38c0e Christos Stavrakakis
#from astakos.quotaholder_app.models import Holding
41 c8a38c0e Christos Stavrakakis
from astakos.admin import stats as statistics
42 79f67df6 Christos Stavrakakis
43 79f67df6 Christos Stavrakakis
44 79f67df6 Christos Stavrakakis
class Command(SynnefoCommand):
45 79f67df6 Christos Stavrakakis
    help = "Get available statistics of Astakos service"
46 79f67df6 Christos Stavrakakis
    can_import_settings = True
47 79f67df6 Christos Stavrakakis
48 79f67df6 Christos Stavrakakis
    option_list = SynnefoCommand.option_list + (
49 79f67df6 Christos Stavrakakis
    )
50 79f67df6 Christos Stavrakakis
51 79f67df6 Christos Stavrakakis
    def handle(self, *args, **options):
52 c8a38c0e Christos Stavrakakis
        stats = statistics.get_astakos_stats()
53 79f67df6 Christos Stavrakakis
54 79f67df6 Christos Stavrakakis
        output_format = options["output_format"]
55 79f67df6 Christos Stavrakakis
        if output_format == "json":
56 79f67df6 Christos Stavrakakis
            self.stdout.write(json.dumps(stats, indent=4) + "\n")
57 79f67df6 Christos Stavrakakis
        elif output_format == "pretty":
58 79f67df6 Christos Stavrakakis
            pretty_print_stats(stats, self.stdout)
59 79f67df6 Christos Stavrakakis
        else:
60 79f67df6 Christos Stavrakakis
            raise CommandError("Output format '%s' not supported." %
61 79f67df6 Christos Stavrakakis
                               output_format)
62 79f67df6 Christos Stavrakakis
63 79f67df6 Christos Stavrakakis
64 79f67df6 Christos Stavrakakis
def columns_from_fields(fields, values):
65 79f67df6 Christos Stavrakakis
    return zip(map(string.lower, fields), [values.get(f, 0) for f in fields])
66 79f67df6 Christos Stavrakakis
67 79f67df6 Christos Stavrakakis
68 79f67df6 Christos Stavrakakis
def pretty_print_stats(stats, stdout):
69 79f67df6 Christos Stavrakakis
    newline = lambda: stdout.write("\n")
70 79f67df6 Christos Stavrakakis
71 c8a38c0e Christos Stavrakakis
    _datetime = stats.get("datetime")
72 c8a38c0e Christos Stavrakakis
    stdout.write("datetime: %s\n" % _datetime)
73 79f67df6 Christos Stavrakakis
    newline()
74 79f67df6 Christos Stavrakakis
75 79f67df6 Christos Stavrakakis
    users = stats.get("users", {})
76 79f67df6 Christos Stavrakakis
77 79f67df6 Christos Stavrakakis
    all_providers = users.pop("total")
78 79f67df6 Christos Stavrakakis
    if all_providers is not None:
79 79f67df6 Christos Stavrakakis
        fields = ["total", "verified", "active"]
80 79f67df6 Christos Stavrakakis
        table = columns_from_fields(fields, all_providers)
81 79f67df6 Christos Stavrakakis
        usage = all_providers.get("usage", {})
82 79f67df6 Christos Stavrakakis
        for name, val in sorted(usage.items()):
83 79f67df6 Christos Stavrakakis
            table.append((name, val))
84 79f67df6 Christos Stavrakakis
        pprint_table(stdout, table, None,
85 79f67df6 Christos Stavrakakis
                     title="Statistics for All Providers")
86 79f67df6 Christos Stavrakakis
        newline()
87 79f67df6 Christos Stavrakakis
88 79f67df6 Christos Stavrakakis
    for provider_name, provider_info in sorted(users.items()):
89 79f67df6 Christos Stavrakakis
        fields = ["total", "verified", "active"]
90 79f67df6 Christos Stavrakakis
        table = columns_from_fields(fields, provider_info)
91 79f67df6 Christos Stavrakakis
        usage = provider_info.get("usage", {})
92 79f67df6 Christos Stavrakakis
        for name, val in sorted(usage.items()):
93 79f67df6 Christos Stavrakakis
            table.append((name, val))
94 79f67df6 Christos Stavrakakis
        pprint_table(stdout, table, None,
95 79f67df6 Christos Stavrakakis
                     title="Statistics for Provider '%s'" % provider_name)
96 79f67df6 Christos Stavrakakis
        newline()