diff --git a/catalog/book/models.py b/catalog/book/models.py index 916e8881..d39dfb01 100644 --- a/catalog/book/models.py +++ b/catalog/book/models.py @@ -173,7 +173,7 @@ class Edition(Item): ) language = LanguageListField() pub_house = jsondata.CharField( - _("publishing house"), null=True, blank=False, max_length=500 + _("publishing house"), null=True, blank=True, max_length=500 ) pub_year = jsondata.IntegerField( _("publication year"), diff --git a/catalog/common/models.py b/catalog/common/models.py index 7965c6ac..c6259d59 100644 --- a/catalog/common/models.py +++ b/catalog/common/models.py @@ -419,6 +419,14 @@ class Item(PolymorphicModel): ] ] + def can_soft_delete(self): + return ( + not self.is_deleted + and not self.merged_to_item_id + and not self.merged_from_items.exists() + and not self.child_items.exists() + ) + def delete( self, using: Any = None, diff --git a/catalog/podcast/models.py b/catalog/podcast/models.py index f2dc9ab6..5ead99c8 100644 --- a/catalog/podcast/models.py +++ b/catalog/podcast/models.py @@ -17,7 +17,7 @@ from catalog.common import ( PrimaryLookupIdDescriptor, jsondata, ) -from catalog.common.models import LanguageListField +from catalog.common.models import LIST_OF_ONE_PLUS_STR_SCHEMA, LanguageListField class PodcastInSchema(ItemInSchema): @@ -52,10 +52,12 @@ class Podcast(Item): language = LanguageListField() - host = jsondata.ArrayField( + host = jsondata.JSONField( verbose_name=_("host"), - base_field=models.CharField(blank=True, default="", max_length=200), + null=False, + blank=False, default=list, + schema=LIST_OF_ONE_PLUS_STR_SCHEMA, ) official_site = jsondata.CharField( @@ -97,6 +99,14 @@ class Podcast(Item): def child_items(self): return self.episodes.filter(is_deleted=False, merged_to_item=None) + def can_soft_delete(self): + # override can_soft_delete() and allow delete podcast with episodes + return ( + not self.is_deleted + and not self.merged_to_item_id + and not self.merged_from_items.exists() + ) + class PodcastEpisode(Item): category = ItemCategory.Podcast diff --git a/catalog/templates/_sidebar_edit.html b/catalog/templates/_sidebar_edit.html index 53129333..a70ad3c5 100644 --- a/catalog/templates/_sidebar_edit.html +++ b/catalog/templates/_sidebar_edit.html @@ -157,7 +157,7 @@ {% endif %} {% if item.class_name == "tvseason" or item.class_name == "performanceproduction" %}
- {% trans "link to parent item" %} + {% trans "Link to parent item" %}
@@ -173,7 +173,7 @@ {% endif %} {% if item.class_name == "tvshow" %}
- {% trans "cleanup seasons" %} + {% trans "Cleanup seasons" %} @@ -186,7 +186,7 @@ {% endif %} {% if not item.journal_exists or request.user.is_staff %}
- {% trans 'merge' %} + {% trans 'Merge' %} {% csrf_token %} @@ -201,20 +201,13 @@ value="{% trans 'merge to another item' %}">
- {% if item.child_items %} - - {% elif item.merged_from_items.all %} - - {% else %} + {% if item.can_soft_delete %}
{% trans 'Delete' %}
{% csrf_token %} - +
{% endif %} diff --git a/catalog/views_edit.py b/catalog/views_edit.py index 3c98cb42..8630e9e2 100644 --- a/catalog/views_edit.py +++ b/catalog/views_edit.py @@ -119,7 +119,9 @@ def edit(request, item_path, item_uuid): def delete(request, item_path, item_uuid): item = get_object_or_404(Item, uid=get_uuid_or_404(item_uuid)) if not request.user.is_staff and item.journal_exists(): - raise PermissionDenied(_("Insufficient permission")) + raise PermissionDenied(_("Item in use.")) + if not item.can_soft_delete(): + raise PermissionDenied(_("Item cannot be deleted.")) if request.POST.get("sure", 0) != "1": return render(request, "catalog_delete.html", {"item": item}) else: