from django.db import models import operator from django.db.models import Q from ox.text import smartSplit from django.core.paginator import Paginator, InvalidPage, EmptyPage def splitSearch(string): ret = [] for s in smartSplit(string): word = s.replace("'", "").replace('"', '') ret.append(word) return ret class ItfModel(models.Model): fts_fields = [] fk_filters = [] sort_fields = [] class Meta: abstract = True def list_dict(self): return {} def info_dict(self): return {} @classmethod def fts(kls, qset, search): terms = splitSearch(search) qobjects = [] for t in terms: for f in kls.fts_fields: qstring = f + '__icontains' qobject = Q(**{qstring:t}) qobjects.append(qobject) return qset.filter(reduce(operator.or_, qobjects)) ''' eg. fks = { 'somefield': [1, 5, 7], 'someotherfield': [3] } ''' @classmethod def filter_by_fks(kls, qset, fks): qobjects = [] for key in fks.keys(): field = getField(kls._meta.fields, key) if field: # rel_class = field.related.parent_model for i in fks[key]: qobject = Q(**{field.name: i}) qobjects.append(qobject) return qset.filter(reduce(operator.or_, qobjects)) @classmethod def get_fk_objects(kls): ret = {} for f in kls.fk_filters: ret[f] = [] field = getField(kls._meta.fields, f) rel_class = field.related.parent_model for o in rel_class.objects.all(): ret[f].append({ 'id': o.id, 'title': unicode(o) }) return ret @classmethod def get_list(kls, data): options = { 'page_no': 1, 'list_size': 8, 'search': '', 'sort': [], 'range': [0,50] } options.update(data) ret = [] page_no = options['page_no'] list_size = options['list_size'] qset = kls.objects.all() search = options['search'] if search != '': qset = kls.fts(qset, search) sort = options['sort'] if sort != []: for s in sort: if s['operator'] == '-': operator = '-' else: operator = '' sort = operator + s['key'] qset = qset.order_by(sort) r0 = options['range'][0] r1 = options['range'][1] results = qset[r0:r1] for r in results: ret.append(r.list_dict()) return ret def getField(fields, name): for f in fields: if f.name == name: return f return False