Advertisement
Guest User

Untitled

a guest
Nov 26th, 2016
182
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.56 KB | None | 0 0
  1. class AdManager(models.Manager):
  2.     def _get_model(self, category):
  3.         try:
  4.             return [m for m in self.model.__subclasses__() if m.__name__ == category.ad_class][0]
  5.         except Exception as e:
  6.             raise ModelNotFound(category, traceback.format_exc())
  7.  
  8.     def get_models(self, category):
  9.         admodels = []
  10.         if category:
  11.             if category.is_endpoint:
  12.                 admodels = [self._get_model(category)]
  13.             else:
  14.                 for c in category.get_descendants().filter(is_endpoint=True):
  15.                     admodels.append(self._get_model(c))
  16.         else:
  17.             for c in Category.objects.filter(is_endpoint=True):
  18.                 admodels.append(self._get_model(c))
  19.         return admodels
  20.  
  21.     def _get_filter_params(self, city, options, query):
  22.         params = {'city__exact': city.pk}
  23.         q = query.get('q')[0] if query.get('q') else None
  24.         if q:
  25.             params.update({'description__contains': q})
  26.         params.update(dict(BaseOption.get_adoptions_classes(c).get_queryset_lookup(v) for c, v in options.items()))
  27.         return params
  28.  
  29.     def list(self, category, city, options, query):
  30.         params = self._get_filter_params(city, options, query)
  31.         admodels = self.get_models(category)
  32.  
  33.         if len(admodels) == 1:
  34.             result_qs = admodels[0].filter(**params)
  35.         else:
  36.             related_names = [m.__name__.lower() for m in admodels]
  37.             result_qs = self.model.objects.select_related(*related_names).filter(**params)
  38.         return result_qs
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement