示例#1
0
    def create_atoms(self):
        from knowledge.format import replace_references

        overwrite = self.cleaned_data.get('overwrite',False)
        if overwrite:
            for atom in Atom.objects.all():
                atom.delete()

        for atom in self.ordered:
            typ = AtomType.objects.get(slug=atom['type'])

            text = atom['text']
            for oatom in atom['outgoing']:
                text = replace_references(text,
                        '$'+oatom['ref'], str(oatom['id']))

            ra = Atom.objects.create(typ=typ,text=text)
            if 'name' in atom:
                ra.name = atom['name']
            if 'slug' in atom:
                ra.slug = atom['slug']
            ra.save()
            atom['id'] = ra.id
示例#2
0
    def save(self, *args, **kwargs):
        old_slug = None
        if self.pk is not None:
            old_self = Atom.objects.get(pk=self.pk)
            old_slug = old_self.slug

        super(Atom, self).save(*args, **kwargs)
        # reify any orphan relationship
        for orphan_rel in AtomOrphanRelationship.objects.filter(ref=self.slug):
            # in case it already exists (is it even possible?)
            try:
                existing_rel = AtomRelationship.objects.get(from_atom=orphan_rel.atom,
                        to_atom=self, typ=orphan_rel.typ)
            except ObjectDoesNotExist:
                reify_rel = AtomRelationship.objects.create(from_atom=orphan_rel.atom,
                    to_atom=self, typ=orphan_rel.typ)
                reify_rel.save()

            orphan_rel.delete()

        from knowledge.format import extract_references, replace_references
        # fix references when slug is changed
        if self.slug != old_slug:
            if old_slug is None or old_slug == '':
                old_ref = str(self.pk)
            else:
                old_ref = old_slug

            if self.slug is None or self.slug == '':
                new_ref = str(self.pk)
            else:
                new_ref = self.slug

            rels = AtomRelationship.objects.filter(to_atom=self)

            for rel in rels: 
                atom = rel.from_atom
                atom.text = replace_references(atom.text, old_ref, new_ref)
                atom.save()

        # extract references and test for relationships
        uptodate_rel = []
        for verb, ref in extract_references(self.text):
            try:
                reltype = AtomRelationshipType.objects.get(slug=verb)
            except ObjectDoesNotExist:
                continue
            try:
                atom = Atom.objects.by_ref(ref)
                try:
                    existing_rel = AtomRelationship.objects.get(from_atom=self,
                            to_atom=atom, typ=reltype)
                    uptodate_rel.append(existing_rel)
                except ObjectDoesNotExist:
                    arel = AtomRelationship.objects.create(from_atom=self,
                            to_atom=atom, typ=reltype)
                    arel.save()
                    uptodate_rel.append(arel)
            except ObjectDoesNotExist:
                arel = AtomOrphanRelationship.objects.create(atom=self,
                        ref=ref, typ=reltype)
                arel.save()
        extra_rel = AtomRelationship.objects.filter(from_atom=self) \
                .exclude(id__in=[ rel.id for rel in uptodate_rel ])
        for extra in extra_rel:
            extra.delete()