Skip to content

Commit 807657a

Browse files
committed
add skipped items to fetch releases task result
1 parent 8b610ec commit 807657a

File tree

2 files changed

+93
-42
lines changed

2 files changed

+93
-42
lines changed

src/events/calendar.py

Lines changed: 56 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,45 +20,73 @@ def fetch_releases(user=None, items_to_process=None):
2020
if items_to_process and items_to_process[0].source == Sources.MANUAL.value:
2121
return "Manual sources are not processed"
2222

23-
if not items_to_process:
24-
items_to_process = get_items_to_process(user)
25-
23+
items_to_process = items_to_process or get_items_to_process(user)
2624
if not items_to_process:
2725
return "No items to process"
2826

27+
events_bulk, skipped_items = process_items(items_to_process)
28+
save_events(events_bulk)
29+
cleanup_invalid_events(events_bulk)
30+
31+
return generate_final_message(items_to_process, skipped_items)
32+
33+
34+
def process_items(items_to_process):
35+
"""Process items and categorize them."""
2936
events_bulk = []
3037
anime_to_process = []
38+
skipped_items = []
3139

3240
for item in items_to_process:
33-
# anime can later be processed in bulk
3441
if item.media_type == MediaTypes.ANIME.value:
3542
anime_to_process.append(item)
3643
elif item.media_type == MediaTypes.TV.value:
37-
process_tv(item, events_bulk)
44+
process_tv(item, events_bulk, skipped_items)
3845
elif item.media_type == MediaTypes.COMIC.value:
39-
process_comic(item, events_bulk)
46+
process_comic(item, events_bulk, skipped_items)
4047
else:
41-
process_other(item, events_bulk)
48+
process_other(item, events_bulk, skipped_items)
4249

4350
process_anime_bulk(anime_to_process, events_bulk)
51+
return events_bulk, skipped_items
4452

53+
54+
def save_events(events_bulk):
55+
"""Save events in bulk."""
4556
for event in events_bulk:
4657
Event.objects.update_or_create(
4758
item=event.item,
4859
content_number=event.content_number,
4960
defaults={"datetime": event.datetime},
5061
)
5162

52-
cleanup_invalid_events(events_bulk)
5363

54-
result_msg = "\n".join(
55-
f"{item} ({item.get_media_type_display()})" for item in items_to_process
56-
)
64+
def generate_final_message(items_to_process, skipped_items):
65+
"""Generate the final message summarizing the results."""
66+
successful_items = [item for item in items_to_process if item not in skipped_items]
67+
final_message_parts = []
68+
69+
if successful_items:
70+
success_details = "\n".join(
71+
f" - {item} ({item.get_media_type_display()})" for item in successful_items
72+
)
73+
final_message_parts.append(
74+
f"Releases have been fetched for the following items:\n{success_details}",
75+
)
5776

58-
if len(items_to_process) > 0:
59-
return f"""Releases have been fetched for the following items:
60-
{result_msg}"""
61-
return "No releases have been fetched for any items."
77+
if skipped_items:
78+
skipped_details = "\n".join(
79+
f" - {item} ({item.get_media_type_display()})" for item in skipped_items
80+
)
81+
final_message_parts.append(
82+
f"The following items were skipped due to errors:\n{skipped_details}",
83+
)
84+
85+
return (
86+
"\n\n".join(final_message_parts)
87+
if final_message_parts
88+
else "No releases have been fetched for any items."
89+
)
6290

6391

6492
def cleanup_invalid_events(events_bulk):
@@ -306,7 +334,7 @@ def get_anime_schedule_bulk(media_ids):
306334
return all_data
307335

308336

309-
def process_tv(tv_item, events_bulk):
337+
def process_tv(tv_item, events_bulk, skipped_items):
310338
"""Process TV item and create events for all seasons and episodes.
311339
312340
Only processes:
@@ -330,8 +358,12 @@ def process_tv(tv_item, events_bulk):
330358
"Failed to fetch metadata for %s",
331359
tv_item,
332360
)
361+
if tv_item not in skipped_items:
362+
skipped_items.append(tv_item)
333363
except Exception:
334364
logger.exception("Error processing %s", tv_item)
365+
if tv_item not in skipped_items:
366+
skipped_items.append(tv_item)
335367

336368

337369
def get_seasons_to_process(tv_item):
@@ -561,7 +593,7 @@ def get_tvmaze_episode_map(tvdb_id):
561593
return tvmaze_map
562594

563595

564-
def process_comic(item, events_bulk):
596+
def process_comic(item, events_bulk, skipped_items):
565597
"""Process comic item and add events to the event list."""
566598
logger.info("Fetching releases for %s", item)
567599
try:
@@ -575,6 +607,8 @@ def process_comic(item, events_bulk):
575607
"Failed to fetch metadata for %s",
576608
item,
577609
)
610+
if item not in skipped_items:
611+
skipped_items.append(item)
578612
return
579613

580614
# get latest event
@@ -592,6 +626,8 @@ def process_comic(item, events_bulk):
592626
"Failed to fetch issue metadata for %s",
593627
item,
594628
)
629+
if item not in skipped_items:
630+
skipped_items.append(item)
595631
return
596632

597633
if issue_metadata["store_date"]:
@@ -610,7 +646,7 @@ def process_comic(item, events_bulk):
610646
)
611647

612648

613-
def process_other(item, events_bulk):
649+
def process_other(item, events_bulk, skipped_items):
614650
"""Process other types of items and add events to the event list."""
615651
logger.info("Fetching releases for %s", item)
616652
try:
@@ -624,6 +660,8 @@ def process_other(item, events_bulk):
624660
"Failed to fetch metadata for %s",
625661
item,
626662
)
663+
if item not in skipped_items:
664+
skipped_items.append(item)
627665
return
628666

629667
date_key = media_type_config.get_date_key(item.media_type)

src/events/tests/test_calendar.py

Lines changed: 37 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -153,19 +153,21 @@ def test_fetch_releases_all_types(
153153
):
154154
"""Test fetch_releases with all media types."""
155155
# Setup mocks
156-
mock_process_tv.side_effect = lambda _, events_bulk: events_bulk.append(
156+
mock_process_tv.side_effect = lambda _, events_bulk, __: events_bulk.append(
157157
Event(
158158
item=self.season_item,
159159
content_number=1,
160160
datetime=timezone.now(),
161161
),
162162
)
163-
mock_process_other.side_effect = lambda item, events_bulk: events_bulk.append(
164-
Event(
165-
item=item,
166-
content_number=1,
167-
datetime=timezone.now(),
168-
),
163+
mock_process_other.side_effect = (
164+
lambda item, events_bulk, __: events_bulk.append(
165+
Event(
166+
item=item,
167+
content_number=1,
168+
datetime=timezone.now(),
169+
),
170+
)
169171
)
170172
# Setup mock for process_anime_bulk to create events for anime items
171173
mock_process_anime_bulk.side_effect = lambda items, events_bulk: [
@@ -212,12 +214,14 @@ def test_fetch_releases_all_types(
212214
def test_fetch_releases_specific_items(self, mock_process_other):
213215
"""Test fetch_releases with specific items to process."""
214216
# Setup mock
215-
mock_process_other.side_effect = lambda item, events_bulk: events_bulk.append(
216-
Event(
217-
item=item,
218-
content_number=1,
219-
datetime=timezone.now(),
220-
),
217+
mock_process_other.side_effect = (
218+
lambda item, events_bulk, _: events_bulk.append(
219+
Event(
220+
item=item,
221+
content_number=1,
222+
datetime=timezone.now(),
223+
),
224+
)
221225
)
222226

223227
# Call the task with specific items
@@ -394,7 +398,8 @@ def test_process_tv_season(
394398

395399
# Process the item
396400
events_bulk = []
397-
process_tv(self.tv_item, events_bulk)
401+
skipped_items = []
402+
process_tv(self.tv_item, events_bulk, skipped_items)
398403

399404
# Verify events were added
400405
self.assertEqual(len(events_bulk), 6)
@@ -420,7 +425,8 @@ def test_process_other_movie(self, mock_get_media_metadata):
420425

421426
# Process the item
422427
events_bulk = []
423-
process_other(self.movie_item, events_bulk)
428+
skipped_items = []
429+
process_other(self.movie_item, events_bulk, skipped_items)
424430

425431
# Verify event was added
426432
self.assertEqual(len(events_bulk), 1)
@@ -447,7 +453,8 @@ def test_process_other_book(self, mock_get_media_metadata):
447453

448454
# Process the item
449455
events_bulk = []
450-
process_other(self.book_item, events_bulk)
456+
skipped_items = []
457+
process_other(self.book_item, events_bulk, skipped_items)
451458

452459
# Verify event was added
453460
self.assertEqual(len(events_bulk), 1)
@@ -471,7 +478,8 @@ def test_process_other_manga(self, mock_get_media_metadata):
471478

472479
# Process the item
473480
events_bulk = []
474-
process_other(self.manga_item, events_bulk)
481+
skipped_items = []
482+
process_other(self.manga_item, events_bulk, skipped_items)
475483

476484
# Verify event was added
477485
self.assertEqual(len(events_bulk), 1)
@@ -706,7 +714,8 @@ def test_process_other_invalid_date(self, mock_get_media_metadata):
706714

707715
# Process the item
708716
events_bulk = []
709-
process_other(self.movie_item, events_bulk)
717+
skipped_items = []
718+
process_other(self.movie_item, events_bulk, skipped_items)
710719

711720
# Verify no events were added
712721
self.assertEqual(len(events_bulk), 0)
@@ -721,7 +730,8 @@ def test_process_other_no_date(self, mock_get_media_metadata):
721730

722731
# Process the item
723732
events_bulk = []
724-
process_other(self.movie_item, events_bulk)
733+
skipped_items = []
734+
process_other(self.movie_item, events_bulk, skipped_items)
725735

726736
# Verify no events were added
727737
self.assertEqual(len(events_bulk), 0)
@@ -800,12 +810,12 @@ def test_http_error_handling(self, mock_tmdb_movie):
800810

801811
# Process the item - should not raise exception
802812
events_bulk = []
803-
process_other(self.movie_item, events_bulk)
813+
skipped_items = []
814+
process_other(self.movie_item, events_bulk, skipped_items)
804815

805816
# Verify no events were added
806817
self.assertEqual(len(events_bulk), 0)
807818

808-
809819
@patch("events.calendar.services.get_media_metadata")
810820
@patch("events.calendar.comicvine.issue")
811821
def test_process_comic_with_store_date(self, mock_issue, mock_get_media_metadata):
@@ -833,7 +843,8 @@ def test_process_comic_with_store_date(self, mock_issue, mock_get_media_metadata
833843

834844
# Process the item
835845
events_bulk = []
836-
process_comic(comic_item, events_bulk)
846+
skipped_items = []
847+
process_comic(comic_item, events_bulk, skipped_items)
837848

838849
# Verify event was added
839850
self.assertEqual(len(events_bulk), 1)
@@ -878,7 +889,8 @@ def test_process_comic_with_cover_date_only(
878889

879890
# Process the item
880891
events_bulk = []
881-
process_comic(comic_item, events_bulk)
892+
skipped_items = []
893+
process_comic(comic_item, events_bulk, skipped_items)
882894

883895
# Verify event was added
884896
self.assertEqual(len(events_bulk), 1)
@@ -916,7 +928,8 @@ def test_process_comic_no_dates(self, mock_issue, mock_get_media_metadata):
916928

917929
# Process the item
918930
events_bulk = []
919-
process_comic(comic_item, events_bulk)
931+
skipped_items = []
932+
process_comic(comic_item, events_bulk, skipped_items)
920933

921934
# Verify no event was added
922935
self.assertEqual(len(events_bulk), 0)

0 commit comments

Comments
 (0)