示例#1
0
文件: views.py 项目: xgds/xgds_core
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