Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class AdManager(models.Manager):
- def _get_model(self, category):
- try:
- return [m for m in self.model.__subclasses__() if m.__name__ == category.ad_class][0]
- except Exception as e:
- raise ModelNotFound(category, traceback.format_exc())
- def get_models(self, category):
- admodels = []
- if category:
- if category.is_endpoint:
- admodels = [self._get_model(category)]
- else:
- for c in category.get_descendants().filter(is_endpoint=True):
- admodels.append(self._get_model(c))
- else:
- for c in Category.objects.filter(is_endpoint=True):
- admodels.append(self._get_model(c))
- return admodels
- def _get_filter_params(self, city, options, query):
- params = {'city__exact': city.pk}
- q = query.get('q')[0] if query.get('q') else None
- if q:
- params.update({'description__contains': q})
- params.update(dict(BaseOption.get_adoptions_classes(c).get_queryset_lookup(v) for c, v in options.items()))
- return params
- def list(self, category, city, options, query):
- params = self._get_filter_params(city, options, query)
- admodels = self.get_models(category)
- if len(admodels) == 1:
- result_qs = admodels[0].filter(**params)
- else:
- related_names = [m.__name__.lower() for m in admodels]
- result_qs = self.model.objects.select_related(*related_names).filter(**params)
- return result_qs
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement