From 3bb677b68d4efa338efdd2e0d65047ffee7c0baa Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 12 Jun 2023 15:07:55 -0400 Subject: [PATCH] cleanup tv seasons --- catalog/common/models.py | 7 ++++- catalog/templates/_sidebar_edit.html | 22 +++++++++----- catalog/templates/movie.html | 27 ++++++++--------- catalog/urls.py | 7 +++++ catalog/views.py | 44 ++++++++++++++++------------ journal/models.py | 2 +- requirements.txt | 5 ++-- 7 files changed, 70 insertions(+), 44 deletions(-) diff --git a/catalog/common/models.py b/catalog/common/models.py index e2ff9c6f..c7642df1 100644 --- a/catalog/common/models.py +++ b/catalog/common/models.py @@ -280,8 +280,12 @@ class Item(SoftDeleteMixin, PolymorphicModel): ] def clear(self): + self.set_parent_item(None) self.primary_lookup_id_value = None self.primary_lookup_id_type = None + for res in self.external_resources.all(): + res.item = None + res.save() def __str__(self): return f"{self.__class__.__name__}|{self.id}|{self.uuid} {self.primary_lookup_id_type}:{self.primary_lookup_id_value if self.primary_lookup_id_value else ''} ({self.title})" @@ -317,7 +321,8 @@ class Item(SoftDeleteMixin, PolymorphicModel): return list(self.child_items.values_list("id", flat=True)) def set_parent_item(self, value): - raise ValueError("cannot set parent item") + # raise ValueError("cannot set parent item") + pass @property def parent_uuid(self): diff --git a/catalog/templates/_sidebar_edit.html b/catalog/templates/_sidebar_edit.html index 7b52a354..be5f0af7 100644 --- a/catalog/templates/_sidebar_edit.html +++ b/catalog/templates/_sidebar_edit.html @@ -55,13 +55,11 @@ {% elif item.class_name == "tvshow" %} {% if item.all_seasons %}⛔️ 条目下已有子项{% endif %} {% if not item.all_seasons or request.user.is_staff %} -
+ {% comment %} {% csrf_token %} -
+ {% endcomment %}
@@ -78,7 +76,7 @@ ⛔️ 条目已被删除 {% elif item.merged_to_item and not request.user.is_staff %} ⛔️ 条目已被合并 - {% elif item.journal_exist and not request.user.is_staff %} + {% elif item.journal_exists and not request.user.is_staff %} ⛔️ 条目已被用户标记过 {% else %} {% if item.class_name == "tvseason" or item.class_name == "performanceproduction" %} @@ -95,14 +93,24 @@ value="{{ item.show.absolute_url }}" required>
- +
{% endif %} + {% elif item.class_name == "tvshow" %} +
+ 清理单季 +
+ {% csrf_token %} + +
+
{% endif %}
{% trans '合并到同类另一条目' %} - {% if item.journal_exist %}🚸 条目已被用户标记过{% endif %} + {% if item.journal_exists %}🚸 条目已被用户标记过{% endif %}
diff --git a/catalog/templates/movie.html b/catalog/templates/movie.html index 1ec82fd6..a17bb662 100644 --- a/catalog/templates/movie.html +++ b/catalog/templates/movie.html @@ -11,13 +11,6 @@ {% load thumb %} {% block details %} -
- {% if item.imdb %} - {% trans 'IMDb:' %}{{ item.imdb }} - {% endif %} -
{% if item.director %} {% trans '导演:' %} @@ -30,13 +23,12 @@ {% if item.director|length > 5 %} {% trans '更多' %} {% endif %} {% endif %} @@ -154,6 +146,13 @@ {% endfor %} {% endif %}
+
+ {% if item.imdb %} + {% trans 'IMDb:' %}{{ item.imdb }} + {% endif %} +
{% if item.site %} {% trans '网站:' %} diff --git a/catalog/urls.py b/catalog/urls.py index 468861cb..1fd317f9 100644 --- a/catalog/urls.py +++ b/catalog/urls.py @@ -58,6 +58,13 @@ urlpatterns = [ assign_parent, name="assign_parent", ), + re_path( + r"^(?P" + + _get_all_url_paths() + + ")/(?P[A-Za-z0-9]{21,22})/remove_unused_seasons$", + remove_unused_seasons, + name="remove_unused_seasons", + ), re_path( r"^(?P" + _get_all_url_paths() diff --git a/catalog/views.py b/catalog/views.py index c3b220bb..87d08318 100644 --- a/catalog/views.py +++ b/catalog/views.py @@ -73,7 +73,7 @@ def retrieve(request, item_path, item_uuid): item_url = f"/{item_path}/{item_uuid}" if item.url != item_url: return redirect(item.url) - skipcheck = request.GET.get("skipcheck", False) and request.user.is_staff + skipcheck = request.GET.get("skipcheck", False) and request.user.is_authenticated if not skipcheck and item.merged_to_item: return redirect(item.merged_to_item.url) if not skipcheck and item.is_deleted: @@ -122,6 +122,16 @@ def retrieve(request, item_path, item_uuid): ) +def episode_data(request, item_uuid): + item = get_object_or_404(Item, uid=get_uuid_or_404(item_uuid)) + qs = item.episodes.all().order_by("-pub_date") + if request.GET.get("last"): + qs = qs.filter(pub_date__lt=request.GET.get("last")) + return render( + request, "podcast_episode_data.html", {"item": item, "episodes": qs[:5]} + ) + + def _add_error_map_detail(e): e.additonal_detail = [] for f, v in e.as_data().items(): @@ -215,11 +225,8 @@ def delete(request, item_path, item_uuid): if request.method != "POST": raise BadRequest() item = get_object_or_404(Item, uid=get_uuid_or_404(item_uuid)) - if not request.user.is_staff and item.journal_exist: + if not request.user.is_staff and item.journal_exists(): raise PermissionDenied() - for res in item.external_resources.all(): - res.item = None - res.save() item.delete() return ( redirect(item.url + "?skipcheck=1") if request.user.is_staff else redirect("/") @@ -296,12 +303,23 @@ def assign_parent(request, item_path, item_uuid): return redirect(item.url) +@login_required +def remove_unused_seasons(request, item_path, item_uuid): + if request.method != "POST": + raise BadRequest() + item = get_object_or_404(Item, uid=get_uuid_or_404(item_uuid)) + for s in item.seasons.all(): + if not s.journal_exists(): + s.delete() + return redirect(item.url) + + @login_required def merge(request, item_path, item_uuid): if request.method != "POST": raise BadRequest() item = get_object_or_404(Item, uid=get_uuid_or_404(item_uuid)) - if not request.user.is_staff and item.journal_exist: + if not request.user.is_staff and item.journal_exists(): raise PermissionDenied() if request.POST.get("new_item_url"): new_item = Item.get_by_url(request.POST.get("new_item_url")) @@ -323,16 +341,6 @@ def merge(request, item_path, item_uuid): return redirect(item.url) -def episode_data(request, item_uuid): - item = get_object_or_404(Item, uid=get_uuid_or_404(item_uuid)) - qs = item.episodes.all().order_by("-pub_date") - if request.GET.get("last"): - qs = qs.filter(pub_date__lt=request.GET.get("last")) - return render( - request, "podcast_episode_data.html", {"item": item, "episodes": qs[:5]} - ) - - @login_required def mark_list(request, item_path, item_uuid, following_only=False): item = get_object_or_404(Item, uid=get_uuid_or_404(item_uuid)) @@ -387,7 +395,7 @@ def comments(request, item_path, item_uuid): item = get_object_or_404(Item, uid=get_uuid_or_404(item_uuid)) if not item: raise Http404() - ids = list(item.child_item_ids) + [item.id] + ids = item.child_item_ids + [item.id] queryset = Comment.objects.filter(item_id__in=ids).order_by("-created_time") queryset = queryset.filter(query_visible(request.user)) before_time = request.GET.get("last") @@ -408,7 +416,7 @@ def reviews(request, item_path, item_uuid): item = get_object_or_404(Item, uid=get_uuid_or_404(item_uuid)) if not item: raise Http404() - ids = list(item.child_item_ids) + [item.id] + ids = item.child_item_ids + [item.id] queryset = Review.objects.filter(item_id__in=ids).order_by("-created_time") queryset = queryset.filter(query_visible(request.user)) before_time = request.GET.get("last") diff --git a/journal/models.py b/journal/models.py index 15c26701..7c3e10f8 100644 --- a/journal/models.py +++ b/journal/models.py @@ -1296,4 +1296,4 @@ def journal_exists_for_item(item): return False -Item.journal_exist = property(journal_exists_for_item) +Item.journal_exists = journal_exists_for_item diff --git a/requirements.txt b/requirements.txt index 61e1bc02..6bca1c4e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ dateparser -mistune>=3.0.0 +mistune rq>=1.12.0 django~=3.2.19 django-auditlog @@ -20,7 +20,6 @@ django-tz-detect django-bleach django-redis django-oauth-toolkit -meilisearch easy-thumbnails lxml openpyxl @@ -36,5 +35,5 @@ markdownify igdb-api-v4 podcastparser listparser -fontawesomefree~=6.4.0 +fontawesomefree discord.py