"""Logic layer for conflicts data.""" import copy from owsfeatures import features as owsfeatures from conflict_manager import features from conflict_manager.constants import query_parameters as query_consts from conflict_manager.models import fact_conflict as fact_conflict_model from conflict_manager.models import fact_conflict_elasticsearch from conflict_manager.models import ows_territories from conflict_manager.utils import filter_utils from conflict_manager.utils import model_utils from conflict_manager.utils import pagination_utils @owsfeatures.load_features def get_new_conflicts(account, args): """Get list of all new conflicts. Args: account (namedtuple): User account data args (ImmutableMultiDict): A list of request args. Returns: response.Response: items with pagination """ sorting_columns = copy.deepcopy( query_consts.NEW_CONFLICT_SORTABLE_COLUMNS) if features.is_conflict_mgr_views_in_conflict_data_enabled(): sorting_columns.append('views_in_conflict') pagination_options = pagination_utils.get_pagination_options( sort_by_options=sorting_columns, default_sort_by='daily_average_views') filter_options = {} conflicts = None # if limit is 0, just return the count with no items if args.get(query_consts.PAGE_LIMIT) and \ int(args.get(query_consts.PAGE_LIMIT)) == 0: return fact_conflict_elasticsearch.\ get_new_conflict_count_for_account(account) if model_utils._validate_query_args(args): query, fields = _parse_query_args_to_dict(args) filter_options = filter_utils.get_filter_options( filter_fields=query_consts.ANY_CONFLICT_FILTERABLE_COLUMNS, query=query, fields=fields) if filter_options: model_params = _merge_two_dicts(filter_options, pagination_options) conflicts = ( fact_conflict_elasticsearch.get_new_conflicts_for_account( account, **model_params)) if conflicts is not None: return conflicts res = fact_conflict_model.get_new_youtube_conflicts_for_account( account, **pagination_options) if not res or res.message['pagination']['total_records'] == 0: return res _expand_territory_data(res.message['items'], lambda x: x['territories']) return res def get_actioned_conflicts(account): """Get a list of all actioned conflicts. Args: account (namedtuple): User account data Returns: response.Response: items with pagination """ pagination_options = pagination_utils.get_pagination_options( sort_by_options=query_consts.ACTIONED_CONFLICT_SORTABLE_COLUMNS, default_sort_by='action_date') res = fact_conflict_model.get_actioned_youtube_conflicts_for_account( account, **pagination_options) if not res or res.message['pagination']['total_records'] == 0: return res _expand_territory_data( res.message['items'], lambda x: x['release_action']['territories']) _expand_territory_data( res.message['items'], lambda x: x['assert_action']['territories']) return res def get_resolved_conflicts(account): """Get a list of all resolved conflicts. Args: account (namedtuple): User account data Returns: response.Response: items with pagination """ pagination_options = pagination_utils.get_pagination_options( sort_by_options=query_consts.RESOLVED_CONFLICT_SORTABLE_COLUMNS, default_sort_by='resolved_datetime') res = fact_conflict_model.get_resolved_youtube_conflicts_for_account( account, **pagination_options) if not res or res.message['pagination']['total_records'] == 0: return res _expand_territory_data(res.message['items'], lambda x: x['territories']) return res def _expand_territory_data(conflicts, get_territories): """Expand the territory list with additional metadata. Args: conflicts (list): List of conflicts get_territories (func): Function to get territories from a conflict """ territories_map = ows_territories.get_territories_map().message for conflict in conflicts: territories = get_territories(conflict) for t in territories: territory_mapping = territories_map[t['code']] t['continent_name'] = territory_mapping['continent'] t['name'] = territory_mapping['territory_name'] def _parse_query_args_to_dict(args): """Parse, pare, and validate GET args. Args: args (ImmutableMultiDict): A list of request args. Returns: (str), (list): A string which represents the query, and a list which represents the fields on which to search for the query string. """ query = args.get('query') fields = args.getlist('fields') return query, fields def _merge_two_dicts(x, y): z = x.copy() # start with x's keys and values z.update(y) # modifies z with y's keys and values & returns None return z