Пример #1
0
    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)
Пример #2
0
    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)
Пример #3
0
    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