]> git.0d.be Git - chloro.git/blobdiff - chloro/phyll/models.py
maintain interlinks
[chloro.git] / chloro / phyll / models.py
index 80acf9b40da68fd782b4294bdaeec59ce0c1fa08..f803444f7d2299a2686fe6926f2259bef6d1b23d 100644 (file)
@@ -16,6 +16,7 @@
 
 import html
 import re
+import urllib.parse
 
 from django.db import models, transaction
 from django.utils.html import strip_tags
@@ -39,6 +40,8 @@ class Note(models.Model):
         ordering = ['-creation_timestamp']
 
     def get_absolute_url(self):
+        if self.slug == 'index':
+            return '/'
         return '/%s/' % self.slug
 
     def lang(self):
@@ -51,4 +54,28 @@ class Note(models.Model):
             self.plain_text = re.sub(
                 r"[’'\"«»,;:\. ]", ' ', html.unescape(strip_tags(self.text)).replace('’', ' ')
             )
+        if not kwargs.get('update_fields'):
+            self.maintain_interlinks()
         return super().save(*args, **kwargs)
+
+    def maintain_interlinks(self):
+        links = re.findall(r'href="(.*?)"', self.text or '')
+        with transaction.atomic():
+            Interlink.objects.filter(note1=self).delete()
+            for link in links:
+                parsed = urllib.parse.urlparse(link)
+                if parsed.netloc != '':
+                    continue
+                path_parts = parsed.path.strip('/').split()
+                if len(path_parts) != 1:
+                    continue
+                try:
+                    note2 = Note.objects.get(slug=path_parts[0])
+                    Interlink.objects.create(note1=self, note2=note2)
+                except Note.DoesNotExist:
+                    pass
+
+
+class Interlink(models.Model):
+    note1 = models.ForeignKey(Note, on_delete=models.SET_NULL, null=True, related_name='+')
+    note2 = models.ForeignKey(Note, on_delete=models.SET_NULL, null=True, related_name='linking_note')