class OrderListJson(BaseDatatableView): """ Ways to look up json for datatables for objects """ model = None # dictionary that is for our filter filterDict = {} # to hold the Q queries for or-ing a search queries = None # set max limit of records returned, this is used to protect our site if someone tries to attack our site # and make it return huge amount of data max_display_length = 100 def lookupModel(self, modelName): try: self.model = LazyGetModelByName(getattr(settings, modelName)).get() except: self.model = LazyGetModelByName(modelName).get() @never_cache def dispatch(self, request, *args, **kwargs): self.filterDict.clear() if not self.model: if 'modelName' in kwargs: self.lookupModel(kwargs.get('modelName')) if 'filter' in kwargs: theFilter = kwargs.get('filter', None) self.buildFilterDict(theFilter) return super(OrderListJson, self).dispatch(request, *args, **kwargs) def addQuery(self, query): if self.queries: self.queries |= query else: self.queries = query def buildQuery(self, search): self.queries = None if search: try: for key in self.model.getSearchableFields(): self.addQuery(Q(**{key+'__icontains':search})) if unicode(search).isnumeric(): for key in self.model.getSearchableNumericFields(): self.addQuery(Q(**{key:search})) except: try: self.model._meta.get_field('name') self.addQuery(Q(**{'name__icontains':search})) except: pass try: self.model._meta.get_field('description') self.addQuery(Q(**{'description__icontains':search})) except: pass def buildFilterDict(self, theFilter): dictEntries = str(theFilter).split(",") for entry in dictEntries: splits = str(entry).split(":") try: value = int(splits[1]); self.filterDict[splits[0]] = value except: self.filterDict[splits[0]] = splits[1] def filter_queryset(self, qs): if self.filterDict: qs = qs.filter(**self.filterDict) defaultToday = u'true' if settings.GEOCAM_UTIL_LIVE_MODE else u'false' todayOnly = self.request.GET.get(u'today', defaultToday) if todayOnly == u'true': timesearchField = self.model.timesearchField() if timesearchField != None: today = timezone.localtime(timezone.now()).date() filterDict = { timesearchField + '__gt': today} qs = qs.filter(**filterDict) # TODO handle search with sphinx search = self.request.GET.get(u'search[value]', None) if search: self.buildQuery(str(search)) if self.queries: qs = qs.filter(self.queries) last = self.request.GET.get(u'last', -1) if last > 0: qs = qs[-last:] return qs