#!/usr/bin/env python """Find user login events for an IP address. :Copyright: 2006-2020 Jochen Kupperschmidt :License: Modified BSD, see LICENSE for details. """ from typing import Dict, List import click from byceps.services.user.models.event import UserEvent from byceps.services.user import service as user_service from byceps.services.user.transfer.models import User from byceps.typing import PartyID, UserID from byceps.util.system import get_config_filename_from_env_or_exit from _util import app_context @click.command() @click.argument('ip_address') def execute(ip_address: str): events = find_events(ip_address) users_by_id = get_users_by_id(events) for event in events: user = users_by_id[event.user_id] click.echo(f'{event.occurred_at}\t{ip_address}\t{user.screen_name}') def find_events(ip_address: str) -> List[UserEvent]: return UserEvent.query \ .filter_by(event_type='user-logged-in') \ .filter(UserEvent.data['ip_address'].astext == ip_address) \ .order_by(UserEvent.occurred_at) \ .all() def get_users_by_id(events: List[UserEvent]) -> Dict[UserID, User]: user_ids = {event.user_id for event in events} users = user_service.find_users(user_ids) return {user.id: user for user in users} if __name__ == '__main__': config_filename = get_config_filename_from_env_or_exit() with app_context(config_filename): execute()