diff --git a/wp1-frontend/src/components/MyLists.vue b/wp1-frontend/src/components/MyLists.vue index a7f51ffad..843c6b54d 100644 --- a/wp1-frontend/src/components/MyLists.vue +++ b/wp1-frontend/src/components/MyLists.vue @@ -86,7 +86,7 @@ v-else-if="item.z_url && !hasDeletedZim(item)" :class="{ 'outdated-zim': hasOutdatedZim(item) }" > - Download ZIM + Download ZIM -

+

Your ZIM file has expired and needs to be re-created. ZIM file download links are only valid for 2 weeks. You can re-create your ZIM file with the button below. @@ -108,7 +111,8 @@

@@ -364,11 +371,15 @@ export default { repetitionPeriodInMonths: 1, numberOfRepetitions: 1, scheduleEmail: '', + forceExpiredDisplay: false, }; }, created: async function () { await this.getBuilder(); await this.getStatus(); + if (this.$route.query.expired) { + this.forceExpiredDisplay = true; + } await this.loadUserEmail(); this.ready = true; }, diff --git a/wp1/web/builders.py b/wp1/web/builders.py index 249167d70..b00d840e8 100644 --- a/wp1/web/builders.py +++ b/wp1/web/builders.py @@ -1,4 +1,5 @@ import logging +import requests import flask @@ -356,6 +357,10 @@ def latest_zim_file_for_builder(builder_id): if not url: flask.abort(404) + head = requests.head(url) + if head.status_code == 404: + flask.abort(410) + return flask.redirect(url, code=302) diff --git a/wp1/web/builders_test.py b/wp1/web/builders_test.py index fb1c426ce..8b628a57a 100644 --- a/wp1/web/builders_test.py +++ b/wp1/web/builders_test.py @@ -1287,7 +1287,9 @@ def test_zimfarm_status(self): "wp1.logic.builder.zimfarm.zim_file_url_for_task_id", return_value="http://fake-file-host.fake/1234/file.zim", ) - def test_latest_zim_file_for_builder(self, mock_zimfarm): + @patch("wp1.web.builders.requests.head") + def test_latest_zim_file_for_builder(self, mock_head, mock_zimfarm): + mock_head.return_value.status_code = 200 builder_id = self._insert_builder() self._insert_selections(builder_id) self.app = create_app() @@ -1306,6 +1308,20 @@ def test_latest_zim_file_for_builder_404(self): rv = client.get("/v1/builders/abcd-1234/zim/latest") self.assertEqual("404 NOT FOUND", rv.status) + @patch( + "wp1.logic.builder.zimfarm.zim_file_url_for_task_id", + return_value="http://fake-file-host.fake/1234/file.zim", + ) + @patch("wp1.web.builders.requests.head") + def test_latest_zim_file_for_builder_410(self, mock_head, mock_zimfarm): + mock_head.return_value.status_code = 404 + builder_id = self._insert_builder() + self._insert_selections(builder_id) + self.app = create_app() + with self.app.test_client() as client: + rv = client.get("/v1/builders/%s/zim/latest" % builder_id) + self.assertEqual("410 GONE", rv.status) + def test_latest_selection_article_count_for_builder(self): builder_id = self._insert_builder() self._insert_selections(builder_id)