class AddonCategoryQueryParam(AddonQueryParam): query_param = 'category' es_field = 'category' valid_values = CATEGORIES_BY_ID.keys() def __init__(self, request): super(AddonCategoryQueryParam, self).__init__(request) # Category slugs are only unique for a given type+app combination. # Once we have that, it's just a matter of selecting the corresponding # dict in the categories constants and use that as the reverse dict, # and make sure to use get_value_from_object_from_reverse_dict(). try: app = AddonAppQueryParam(self.request).get_value() type_ = AddonTypeQueryParam(self.request).get_value() self.reverse_dict = CATEGORIES[app][type_] except KeyError: raise ValueError( 'Invalid combination of "%s", "%s" and "%s" parameters.' % ( AddonAppQueryParam.query_param, AddonTypeQueryParam.query_param, self.query_param)) def get_value_from_reverse_dict(self): return self.get_value_from_object_from_reverse_dict()
class AddonCategoryQueryParam(AddonQueryParam): query_param = 'category' es_field = 'category' valid_values = CATEGORIES_BY_ID.keys() operator = 'terms' def __init__(self, request): super(AddonCategoryQueryParam, self).__init__(request) # Category slugs are only unique for a given type+app combination. # Once we have that, it's just a matter of selecting the corresponding # dict in the categories constants and use that as the reverse dict, # and make sure to use get_value_from_object_from_reverse_dict(). try: app = AddonAppQueryParam(self.query_data).get_value() types = AddonTypeQueryParam(self.query_data).get_values() self.reverse_dict = [CATEGORIES[app][type_] for type_ in types] except KeyError: raise ValueError( ugettext( 'Invalid combination of "%s", "%s" and "%s" parameters.' % ( AddonAppQueryParam.query_param, AddonTypeQueryParam.query_param, self.query_param, ) ) ) def get_value(self): value = super(AddonCategoryQueryParam, self).get_value() # if API gets an int rather than string get_value won't return a list. return [value] if isinstance(value, int) else value def get_value_from_reverse_dict(self): return self.get_value_from_object_from_reverse_dict() def get_object_from_reverse_dict(self): query_value = self.query_data.get(self.query_param, '').lower() values = [] for reverse_dict in self.reverse_dict: value = reverse_dict.get(query_value) if value is None: raise ValueError(ugettext('Invalid "%s" parameter.' % self.query_param)) values.append(value) return values def get_value_from_object_from_reverse_dict(self): return [obj.id for obj in self.get_object_from_reverse_dict()] def is_valid(self, value): if isinstance(value, int): return value in self.valid_values else: return all([_value in self.valid_values for _value in value])
def get_queryset(self): return sorted(CATEGORIES_BY_ID.values(), key=lambda x: x.id)