def get_users_activities(full=True):
    users = load_users()

    for user in users:
        print("Update", user['name'])
        url_uid = user['url'].split('/')[-1]
        user_data_path = os.path.join(GEN_USER_DATA, url_uid)
        get_statshunters_user_activities(user_data_path, user['url'], full=full)
Esempio n. 2
0
import os
from pathlib import Path

from common.config import load_users, GEN_USERS
from common.zones import load_zones_outer
from common.statshunters import tiles_from_activities
from common.kmlutils import create_kml_for_tiles
from common.squares import compute_max_square

outer_zones = load_zones_outer()
users = load_users()

print("Generate reports in", GEN_USERS)

for user in users:
    print("Treat " + user['name'])
    gen_path = os.path.join(GEN_USERS, user['name'])
    Path(gen_path).mkdir(exist_ok=True, parents=True)

    url_uid = user['url'].split('/')[-1]
    explored_tiles = tiles_from_activities(
        url_uid, filter_fct=lambda act: 'Virtual' not in act['type'])
    dep_explorer = []

    for zone in outer_zones:
        explored_tiles_zone = outer_zones[zone] & explored_tiles
        if explored_tiles_zone:
            kml_path = os.path.join(gen_path,
                                    "{}_{}.kml".format(user['name'], zone))
            create_kml_for_tiles(outer_zones[zone] - explored_tiles_zone,
                                 kml_path)
def compute_challenges(challenge_str=None, index=None):
    config = load_config()
    users_json = load_users()

    if challenge_str in config['challenges']:
        challenges = [challenge_str]
    elif challenge_str is None:
        challenges = config['challenges'].keys()
    else:
        challenges = list(
            filter(lambda c: challenge_str in c, config['challenges'].keys()))

    for challenge in challenges:
        print("")
        print("=== {} ===".format(challenge))

        challenge_config = config['challenges'][challenge]
        activity_types = config['activity_types_equiv'][
            challenge_config['activity_type']]

        users = list(
            filter(
                lambda u: challenge_config.get('user_default', False) or
                challenge in u.get('challenges', []), users_json))

        compare = challenge_config.get('compare', False)
        if not isinstance(compare, bool):
            compare = eval(compare, {}, {'index': index})

        sort_fields = challenge_config.get('sort', [])
        sort_fields += [f for f in FIELDS if f not in sort_fields]

        def compute_results(users, for_index):
            results = OrderedDict()

            for user in users:
                url_uid = user['url'].split('/')[-1]
                activities_list = statshunters.load_user_activities(
                    os.path.join(url_uid))
                activities_list = list(
                    filter(lambda a: a['type'] in activity_types,
                           activities_list))
                for filter_str in challenge_config.get('filter', []):
                    activities_list = list(
                        filter(
                            lambda a: eval(filter_str, {
                                "re": re,
                                "datetime": datetime
                            }, {
                                "activity": a,
                                "index": for_index
                            }), activities_list))

                tiles = set()
                useful_activities_count = 0
                unique_tiles = set()
                for a in activities_list:
                    unique_tiles -= a['tiles']
                    unique_tiles |= (a['tiles'] - tiles)
                    if not a['tiles'].issubset(tiles):
                        useful_activities_count += 1
                        tiles |= a['tiles']
                results[user['name']] = {
                    'user': user['name'],
                    'activities': len(activities_list),
                    'tiles': len(tiles),
                    'square': compute_max_square(tiles),
                    'cluster': compute_cluster(tiles),
                    'useful_ac': useful_activities_count,
                    'unique_tiles': len(unique_tiles),
                }
            results = OrderedDict(
                sorted(results.items(),
                       key=lambda kvp: tuple([kvp[1][f] for f in sort_fields]),
                       reverse=True))
            rank = 1
            for user, result in results.items():
                result['rank'] = rank
                rank += 1
            return results

        users_results = compute_results(users, index)

        users = list(
            filter(lambda u: users_results[u['name']]['activities'] > 0,
                   users))
        users_results = OrderedDict(
            filter(lambda kvp: kvp[1]['activities'] > 0,
                   users_results.items()))

        if compare:
            users_results_prev = compute_results(users, index - 1)
            for userName in users_results_prev:
                users_results[userName]["rank_diff"] = users_results_prev[userName]['rank'] - \
                                                           users_results[userName]['rank']
                for field in FIELDS:
                    users_results[userName][field + "_diff"] = users_results[userName][field] - \
                                                               users_results_prev[userName][field]

        if compare:
            format_str = "{0:<2} {2:>4} {1:<16}"
        else:
            format_str = "{0:<2} {1:<16}"

        header = format_str.format("##", "Name", "Diff")

        for sf in sort_fields:
            if compare:
                header += " {:^11}".format(sf)
            else:
                line = " {:>5}".format(sf)
                line += " " * (11 - len(line))
                header += line

        print(header)

        rank = 1
        for user, result in users_results.items():
            if compare:
                line_str = format_str.format(
                    result['rank'], result['user'],
                    "({:+2})".format(result["rank_diff"]))
            else:
                line_str = format_str.format(result['rank'], result['user'],
                                             "")

            for sf in sort_fields:
                line = " {:>5}".format(result[sf])
                if compare:
                    p = "({:+3})".format(result[sf + "_diff"])
                    if len(p) < 6:
                        p += " " * (6 - len(p))
                    line += p
                else:
                    line += "     "

                line_str += line

            print(line_str)
            rank += 1