cleanup tv seasons

This commit is contained in:
Your Name 2023-06-12 15:07:55 -04:00 committed by Henri Dickson
parent a301aa78b7
commit 3bb677b68d
7 changed files with 70 additions and 44 deletions

View file

@ -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):

View file

@ -55,13 +55,11 @@
{% elif item.class_name == "tvshow" %}
{% if item.all_seasons %}<i>⛔️ 条目下已有子项</i>{% endif %}
{% if not item.all_seasons or request.user.is_staff %}
<form method="post"
action="{% url 'catalog:recast' item.url_path item.uuid %}"
onsubmit="return confirm('确认切换吗?');">
{% comment %} <form method="post" action="{% url 'catalog:recast' item.url_path item.uuid %}" onsubmit="return confirm('确认切换吗?');">
{% csrf_token %}
<input type="hidden" value="movie" name="class">
<input class="contrast" type="submit" value="{% trans '更改为电影' %}">
</form>
</form> {% endcomment %}
<form method="post"
action="{% url 'catalog:recast' item.url_path item.uuid %}"
onsubmit="return confirm('确认切换吗?');">
@ -78,7 +76,7 @@
<i>⛔️ 条目已被删除</i>
{% elif item.merged_to_item and not request.user.is_staff %}
<i>⛔️ 条目已被合并</i>
{% elif item.journal_exist and not request.user.is_staff %}
{% elif item.journal_exists and not request.user.is_staff %}
<i>⛔️ 条目已被用户标记过</i>
{% else %}
{% if item.class_name == "tvseason" or item.class_name == "performanceproduction" %}
@ -95,14 +93,24 @@
value="{{ item.show.absolute_url }}"
required>
<br>
<input class="contrast" type="submit" value="{% trans '关联' %}">
<input class="contrast" type="submit" value="{% trans '更新关联' %}">
</form>
</details>
{% endif %}
{% elif item.class_name == "tvshow" %}
<details>
<summary>清理单季</summary>
<form method="post"
action="{% url 'catalog:remove_unused_seasons' item.url_path item.uuid %}"
onsubmit="return confirm('本操作不可撤销。确认删除吗?');">
{% csrf_token %}
<input class="contrast" type="submit" value="{% trans '删除未被标记的单季' %}">
</form>
</details>
{% endif %}
<details>
<summary>{% trans '合并到同类另一条目' %}</summary>
{% if item.journal_exist %}<i>🚸 条目已被用户标记过</i>{% endif %}
{% if item.journal_exists %}<i>🚸 条目已被用户标记过</i>{% endif %}
<form method="post"
action="{% url 'catalog:merge' item.url_path item.uuid %}"
onsubmit="return confirm('本操作不可撤销。确认合并吗?');">

View file

@ -11,13 +11,6 @@
{% load thumb %}
<!-- class specific details -->
{% block details %}
<div>
{% if item.imdb %}
{% trans 'IMDb' %}<a href="https://www.imdb.com/title/{{ item.imdb }}/"
target="_blank"
rel="noopener">{{ item.imdb }}</a>
{% endif %}
</div>
<div>
{% if item.director %}
{% trans '导演:' %}
@ -30,13 +23,12 @@
{% if item.director|length > 5 %}
<a href="javascript:void(0);" id="directorMore">{% trans '更多' %}</a>
<script>
$("#directorMore").on('click', function (e) {
$("span.director:not(:visible)").each(function (e) {
$(this).parent().removeAttr('style');
});
$(this).remove();
})
$("#directorMore").on('click', function (e) {
$("span.director:not(:visible)").each(function (e) {
$(this).parent().removeAttr('style');
});
$(this).remove();
})
</script>
{% endif %}
{% endif %}
@ -154,6 +146,13 @@
{% endfor %}
{% endif %}
</div>
<div>
{% if item.imdb %}
{% trans 'IMDb' %}<a href="https://www.imdb.com/title/{{ item.imdb }}/"
target="_blank"
rel="noopener">{{ item.imdb }}</a>
{% endif %}
</div>
<div>
{% if item.site %}
{% trans '网站:' %}

View file

@ -58,6 +58,13 @@ urlpatterns = [
assign_parent,
name="assign_parent",
),
re_path(
r"^(?P<item_path>"
+ _get_all_url_paths()
+ ")/(?P<item_uuid>[A-Za-z0-9]{21,22})/remove_unused_seasons$",
remove_unused_seasons,
name="remove_unused_seasons",
),
re_path(
r"^(?P<item_path>"
+ _get_all_url_paths()

View file

@ -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")

View file

@ -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

View file

@ -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