def dtype(self, **fil): """Filter by document type.""" newfil = {} for k, v in fil.iteritems(): try: dt = DocType.objects.get(name=v, content_type=self._ct()) newfil['%s' % get_doc_metadata(self.model, k, 'type_mfield')] = dt except DocType.DoesNotExist: pass return self.filter(**newfil)
def dfilter(self, doc_type_name, **fil): """Filter by indexed document field.""" dt = DocType.objects.get(name=doc_type_name, content_type=self._ct()) newfil = {} for k, v in fil.iteritems(): doc_mfield, rest = peel(k, '__') index_mfield = get_doc_metadata(self.model, doc_mfield, 'index_mfield') dfield, rest = peel(rest, '__') newfil['%s__mapping__dfield' % index_mfield] = dfield mapping = DocIndexMapping.objects.get(doc_type=dt, dfield=dfield) if rest: rest = '__' + rest newfil['%s__key_%s%s' % (index_mfield, str(mapping.dfield_type), rest)] = v return self.filter(**newfil)
def maybe_index_doc(self, obj, new_mapping=False): # A simple typecheck first: refuse to index a document if it's # of the wrong type. type_mfield = get_doc_metadata( obj.__class__, self.doc_type.mfield, key='type_mfield') if getattr(obj, type_mfield) != self.doc_type.name: return False # Find the field name parts = self.dfield.split('.') doc = getattr(obj, self.doc_type.mfield) try: value = reduce(lambda doc, p: doc[p], parts, doc) except KeyError: # Option to be strict? return False # We cannot refer to `content_object' directly, see: # http://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/ ct = get_ct(obj.__class__) if new_mapping: r = DocIndexRow(mapping=self, content_type=ct, object_id=obj.id) else: try: r = DocIndexRow.objects.get( mapping=self, content_type__pk=ct.id, object_id=obj.id) except DocIndexRow.DoesNotExist: r = DocIndexRow(mapping=self, content_type=ct, object_id=obj.id) setattr(r, 'key_%s' % self.dfield_type, coerce_field(self.dfield_type, value)) r.save() return True