Просмотр исходного кода

Initial work on deleting themes - leaf themes deletion

rafalp 6 лет назад
Родитель
Сommit
3a6ca7fb0f

+ 25 - 3
misago/templates/misago/admin/themes/list.html

@@ -93,9 +93,18 @@
 </td>
 <td class="row-action">
   {% if not item.is_active and not item.is_default %}
-    <a href="{% url 'misago:admin:appearance:themes:delete' pk=item.pk %}" class="btn btn-danger tooltip-top" title="{% trans "Delete" %}">
-      <span class="fa fa-times"></span>
-    </a>
+    {% if item.is_leaf_node %}
+      <form action="{% url 'misago:admin:appearance:themes:delete' pk=item.pk %" method="POST" class="delete-prompt">
+        {% csrf_token %}
+        <button class="btn btn-danger tooltip-top" title="{% trans "Delete" %}">
+          <span class="fa fa-times"></span>
+        </button>
+      </form>
+    {% else %}
+      <a href="{% url 'misago:admin:appearance:themes:delete' pk=item.pk %}" class="btn btn-danger tooltip-top" title="{% trans "Delete" %}">
+        <span class="fa fa-times"></span>
+      </a>
+    { %endif %}
   {% else %}
     <button class="btn" type="button" disabled>
       <span class="fa fa-times"></span>
@@ -103,3 +112,16 @@
   {% endif %}
 </td>
 {% endblock %}
+
+
+{% block javascripts %}
+{{ block.super }}
+<script type="text/javascript">
+  $(function() {
+    $('.delete-prompt').submit(function() {
+      var decision = confirm("{% trans 'Are you sure you want to delete this theme?' %}");
+      return decision;
+    });
+  });
+</script>
+{% endblock %}

+ 13 - 0
misago/themes/admin/views.py

@@ -57,6 +57,19 @@ class DeleteTheme(ThemeAdmin, generic.ModelFormView):
     def check_permissions(self, request, target):
         if target.is_default:
             return gettext("Default theme can't be deleted.")
+        if target.is_active:
+            return gettext("Active theme can't be deleted.")
+
+    def real_dispatch(self, request, target):
+        if request.method == "POST" and target.is_leaf_node():
+            return self.delete_theme_without_children(request, target)
+
+        return super().real_dispatch(request, target)
+
+    def delete_theme_without_children(self, request, target):
+        target.delete()
+        messages.success(request, self.message_submit % {"name": target})
+        return redirect(self.root_link)
 
 
 class ActivateTheme(ThemeAdmin, generic.ButtonView):

+ 8 - 0
misago/themes/models.py

@@ -27,6 +27,14 @@ class Theme(MPTTModel):
     class MPTTMeta:
         order_insertion_by = ["-is_default", "name"]
 
+    def delete(self, *args, **kwargs):
+        for css in self.css.all():
+            css.delete()
+        for media in self.media.all():
+            media.delete()
+
+        super().delete(*args, **kwargs)
+
     def __str__(self):
         if self.is_default:
             return gettext("Default Misago Theme")