]> git.ipfire.org Git - ipfire.org.git/commitdiff
docs: Show where an image is being used
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 20 Dec 2023 14:50:54 +0000 (14:50 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 20 Dec 2023 14:50:54 +0000 (14:50 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/backend/wiki.py
src/templates/docs/files/detail.html

index 949cd49508cb69f2c0516b647a0c47ad4e110342..66b867fd5cd27f94c8bc87fa60c400c9837a8d87 100644 (file)
@@ -497,6 +497,8 @@ class File(misc.Object):
                if isinstance(other, self.__class__):
                        return self.id == other.id
 
+               return NotImplemented
+
        @property
        def url(self):
                return "/docs%s" % os.path.join(self.path, self.filename)
@@ -527,9 +529,20 @@ class File(misc.Object):
                return self.data.created_at
 
        def delete(self, author=None):
+               if not self.can_be_deleted():
+                       raise RuntimeError("Cannot delete %s" % self)
+
                self.db.execute("UPDATE wiki_files SET deleted_at = NOW(), deleted_by = %s \
                        WHERE id = %s", author.uid if author else None, self.id)
 
+       def can_be_deleted(self):
+               # Cannot be deleted if still in use
+               if self.pages:
+                       return False
+
+               # Can be deleted
+               return True
+
        @property
        def deleted_at(self):
                return self.data.deleted_at
@@ -590,6 +603,29 @@ class File(misc.Object):
 
                return thumbnail
 
+       @property
+       def pages(self):
+               """
+                       Returns a list of all pages this file is linked by
+               """
+               pages = self.backend.wiki._get_pages("""
+                       SELECT
+                               wiki.*
+                       FROM
+                               wiki_linked_files
+                       JOIN
+                               wiki_current ON wiki_linked_files.page_id = wiki_current.id
+                       LEFT JOIN
+                               wiki ON wiki_linked_files.page_id = wiki.id
+                       WHERE
+                               wiki_linked_files.path = %s
+                       ORDER BY
+                               wiki.page
+                       """, os.path.join(self.path, self.filename),
+               )
+
+               return list(pages)
+
 
 class WikiRenderer(misc.Object):
        schemas = (
index 368f697e0f5d4f70ed7e5a59cd2f86caf7a2d4de..3466feb2c7088324b721bd219c556fafc56b96c7 100644 (file)
 
        <section class="section">
                <div class="container">
+                       {% if file.pages %}
+                               <h6 class="title is-6">{{ _("Used By") }}</h6>
+
+                               <div class="block">
+                                       <ul>
+                                               {% for page in file.pages %}
+                                                       <li>
+                                                               <a href="{{ page.url }}">
+                                                                       {% for p, b in page.breadcrumbs %}
+                                                                               {{ b }} /
+                                                                       {% end %}
+
+                                                                       {{ page.title }}
+                                                               </a>
+                                                       </li>
+                                               {% end %}
+                                       </ul>
+                               </div>
+                       {% end %}
+
                        <h6 class="title is-6">{{ _("Delete") }}</h6>
 
                        <div class="block">
-                               <a class="button is-danger" href="{{ file.url }}/_delete">
+                               <a class="button is-danger" href="{{ file.url }}/_delete" {% if not file.can_be_deleted() %}disabled{% end %}>
                                        {{ _("Delete") }}
                                </a>
                        </div>