def get_issue_scores(repo_username, repo_id):
    try:
        data = {
            'repo_username': repo_username,
            'repo_id': repo_id,
            'repo_url': 'https://github.com/%s/%s' % (repo_username, repo_id),
            'repo_issues_url': 'https://github.com/%s/%s/issues' % (repo_username, repo_id),
            'issues': []
        }

        open_issues = github_api.fetch_open_issues(repo_username, repo_id)
        if not open_issues or not isinstance(open_issues, list):
            return { 'error': 'Unable to fetch open issues: %s/%s' % (repo_username, repo_id) }

        for issue in open_issues:
            cache_key = get_issue_cache_key(repo_username, repo_id, issue.get('number'))
            cached_data = util.get_cached_data(cache_key)

            if cached_data:
                milestone = issue.get('milestone')
                if milestone:
                    cached_data['milestone'] = milestone.get('title', '') or ''

                if issue.get('pull_request') is not None:
                    cached_data['pull_request'] = True

                data['issues'].append(cached_data)
                continue

            db_data = models.get_issue(repo_username, repo_id, issue.get('number'))
            if db_data:
                issue_score = db_data.to_dict()

                milestone = issue.get('milestone')
                if milestone:
                    issue_score['milestone'] = milestone.get('title', '') or ''

                if issue.get('pull_request') is not None:
                    issue_score['pull_request'] = True

                data['issues'].append(issue_score)
                continue

            print 'could not find issue calculation: %s' % (cache_key)

        rank_inc = 1
        data['issues'] = sorted(data['issues'], key=lambda k: k['score'], reverse=True)
        for issue in data['issues']:
            issue['rank'] = rank_inc
            issue['repo_username'] = repo_username
            issue['repo_id'] = repo_id
            issue['repo_issue_url'] = 'https://github.com/%s/%s/issues/%s' % (repo_username, repo_id, issue.get('number'))
            rank_inc += 1

        return data

    except Exception as ex:
        print 'get_issue_scores error: %s' % ex
        return { 'error': '%s' % ex }
def run_maintenance_tasks():
    """
    maintenance tasks to run on older issues.
    """

    organization = 'driftyco'

    print "Running daily tasks, %s" % (organization)

    try:
        repos = github_api.fetch_repos_with_issues(organization)

        for repo in repos:
            repo_username = repo.get('repo_username')
            repo_id = repo.get('repo_id')
            print 'Running daily tasks: %s/%s' % (repo_username, repo_id)

            open_issues = []
            try:
                open_issues = github_api.fetch_open_issues(repo_username, repo_id)
                if not open_issues or not isinstance(open_issues, list) or not len(open_issues):
                    print 'No issues for %s/%s' % (repo_username, repo_id)
                    continue

                for issue in open_issues:
                    issue_maintenance(repo_username, repo_id, issue)

            except Exception as ex:
                print 'run_maintenance_tasks repo error, %s/%s: %s' % (repo_username, repo_id, ex)

            print "open issues, %s/%s: %s" % (repo_username, repo_id, len(open_issues))

        set_last_update()

    except Exception as ex2:
        print 'run_maintenance_tasks error: %s' % (ex2)