it/itf/app/models.py

109 lines
2.4 KiB
Python
Raw Normal View History

2010-12-06 22:33:00 +00:00
from django.db import models
2011-01-04 06:27:10 +00:00
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': '',
2011-01-06 05:59:08 +00:00
'sort': [],
'range': [0,50]
2011-01-04 06:27:10 +00:00
}
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)
2011-01-11 20:32:18 +00:00
2011-01-04 06:27:10 +00:00
sort = options['sort']
if sort != []:
2011-01-11 20:32:18 +00:00
for s in sort:
sort = s['operator'] + s['key']
qset = qset.order_by(sort)
2011-01-06 05:59:08 +00:00
r0 = options['range'][0]
r1 = options['range'][1]
results = qset[r0:r1]
for r in results:
2011-01-04 06:27:10 +00:00
ret.append(r.list_dict())
return ret
def getField(fields, name):
for f in fields:
if f.name == name:
return f
return False
2010-12-06 22:33:00 +00:00