it/itf/app/models.py

255 lines
6.2 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
2011-03-06 12:35:55 +00:00
from ox.django.fields import DictField
2011-01-04 06:27:10 +00:00
from django.core.paginator import Paginator, InvalidPage, EmptyPage
from django.template.loader import render_to_string
from django.contrib.contenttypes.models import ContentType
from insidepages.models import ModuleTab
2011-01-04 06:27:10 +00:00
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 = []
2011-04-04 01:35:25 +00:00
# related_models = []
2011-01-04 06:27:10 +00:00
sort_fields = []
2011-02-01 15:13:30 +00:00
hasComments = True
title_field = "title"
2011-01-04 06:27:10 +00:00
class Meta:
abstract = True
def list_dict(self):
return {}
def info_dict(self):
return self.get_dict()
def get_title(self):
return self.get(self.title_field)
def get_tab(self):
ctype = ContentType.objects.get(model=self.__class__._meta.module_name)
tab = ModuleTab.objects.filter(model=ctype)[0]
return tab
def get_absolute_url(self):
return "%s?tab_id=%d&object_id=%d" % (self.get_module().get_absolute_url(), self.get_tab().id, self.id)
def get_module(self):
tab = self.get_tab()
if tab:
return tab.module
else:
return None
def get_main_image(self):
return {
'url': '',
'caption': ''
}
def get_template_path(self):
kls = self.__class__
return "modules/%s/%s.html" % (kls._meta.app_label, kls._meta.module_name)
def get_dict(self):
2011-04-04 01:35:25 +00:00
return self.get(self._get_fields().keys())
def insidepage_dict(self):
try:
html = render_to_string(self.get_template_path(), self.info_dict())
except:
html = "Template for this model not found."
return {
'url': self.get_absolute_url(),
'title': self.get_title(),
'main_image': self.get_main_image(),
'html': html
}
def get(self, props):
typ = type(props)
if typ == list:
ret = {}
for p in props:
ret[p] = self._get_property(p)
return ret
elif typ == str:
return _get_property(props)
else:
return False
def _get_property(self, prop):
fields = self._get_fields()
if prop in fields.keys():
field_type = fields[prop]
if field_type in ["TextField", "CharField", "IntegerField"]:
return self.__getattribute__(prop)
elif field_type == "ImageField":
imagefield = self.__getattribute__(prop)
return imagefield.url if imagefield.name != '' else ''
elif field_type == "ForeignKey":
return self._get_fk(prop)
elif field_type == "ManyToMany":
return self._get_m2m(prop)
elif prop.lower() in self.related_models:
return self._get_related(prop)
else:
try:
val = self.__getattribute__(prop)
if type(val).__name__ == 'instancemethod' and prop in self.getters:
return val()
else:
return val
except:
return False #FIXME
def _get_fk(self, prop):
prop = prop.replace("_id", "")
return self.__getattribute__(prop).get_dict()
# def _get_related_objects(self, fk_field):
def _get_m2m(self, prop):
ret = []
for o in self.__getattribute__(prop).all():
ret.append(o.get_dict())
return ret
def _get_related(self, prop):
attr = prop.lower() + "_set"
ret = []
for o in self.__getattribute__(attr).all():
ret.append(o.get_dict())
return ret
2011-01-04 06:27:10 +00:00
@classmethod
def _get_fields(kls):
ret = {}
for f in kls._meta.fields:
ret[f.get_attname()] = type(f).__name__
return ret
2011-01-04 06:27:10 +00:00
@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))
2011-01-04 06:27:10 +00:00
@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']
2011-04-10 02:00:43 +00:00
try:
qset = kls.get_qset()
except:
qset = kls.objects.all()
2011-01-04 06:27:10 +00:00
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:
2011-01-13 10:08:10 +00:00
if s['operator'] == '-':
operator = '-'
else:
operator = ''
2011-04-10 02:00:43 +00:00
sort = operator + s['key']
2011-01-11 20:32:18 +00:00
qset = qset.order_by(sort)
2011-04-04 01:35:25 +00:00
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
2011-04-10 02:00:43 +00:00
@classmethod
def get_qset(kls):
'''
Override this method in your model class to define a custom queryset instead of objects.all(), for instance, to always exclude unpublished items.
'''
raise NotImplementedError
2011-01-04 06:27:10 +00:00
def getField(fields, name):
for f in fields:
if f.name == name:
return f
return False
2010-12-06 22:33:00 +00:00
2011-02-01 15:13:30 +00:00
2011-02-01 15:13:30 +00:00
def site_config():
with open(settings.SITE_CONFIG) as f:
site_config = json.load(f)
site_config['keys'] = {}
for key in site_config['itemKeys']:
site_config['keys'][key['id']] = key
site_config['_findKeys'] = {}
for key in site_config['findKeys']:
site_config['_findKeys'][key['id']] = key
return site_config