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
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()