예제 #1
0
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()
예제 #2
0
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])
예제 #3
0
 def get_queryset(self):
     return sorted(CATEGORIES_BY_ID.values(), key=lambda x: x.id)
예제 #4
0
파일: views.py 프로젝트: bqbn/addons-server
 def get_queryset(self):
     return sorted(CATEGORIES_BY_ID.values(), key=lambda x: x.id)