From 5bd14fcd939c772c7e3c0966f399a5d51fff3a03 Mon Sep 17 00:00:00 2001 From: Fasand Date: Mon, 24 Jul 2023 12:46:17 +0200 Subject: [PATCH] #636: enable large custom seed upload through a TXT file, don't display in an HTML field if too large, back up before overwriting, some optimizing --- Seeder/harvests/forms.py | 20 ++- Seeder/harvests/views.py | 42 ++++- Seeder/locale/cs/LC_MESSAGES/django.po | 197 +++++++++++++--------- Seeder/locale/en_US/LC_MESSAGES/django.po | 197 +++++++++++++--------- 4 files changed, 286 insertions(+), 170 deletions(-) diff --git a/Seeder/harvests/forms.py b/Seeder/harvests/forms.py index b7920867..f3ff3dd6 100644 --- a/Seeder/harvests/forms.py +++ b/Seeder/harvests/forms.py @@ -200,16 +200,34 @@ class Meta: class InternalTopicCollectionEditForm(InternalTopicCollectionForm): files_to_delete = forms.MultipleChoiceField(required=False) + custom_seeds_file = forms.FileField(required=False, help_text=_L( + "Provide a text file with one seed per line which will overwrite " + "all custom_seeds. The original custom_seeds will be backed up to " + "the media/seeds/backup folder.")) + ''' Maximum length of custom seeds (chars) to be displayed & editable ''' + CUSTOM_SEEDS_MAXLEN = 1 * 1000 * 1000 # 1MB def __init__(self, attachment_list, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['files_to_delete']._set_choices( [(file.id, str(file)) for file in attachment_list] ) + # Don't show custom seeds textfield if there's too many of them + self.custom_seeds_too_large = ( + len(self.initial.get("custom_seeds", "")) + > self.CUSTOM_SEEDS_MAXLEN) + if self.custom_seeds_too_large: + del self.fields["custom_seeds"] + # Remove initial value so it doesn't get "re-saved" + if "custom_seeds" in self.initial: + del self.initial["custom_seeds"] + self.fields["custom_seeds_file"].help_text += "
" + _( + "Custom seeds field is disabled because there are too many " + "seeds to be displayed in an HTML text field.") + "" class Meta(InternalTopicCollectionForm.Meta): fields = InternalTopicCollectionForm.Meta.fields + \ - ('files_to_delete',) + ('files_to_delete', 'custom_seeds_file') class ExternalTopicCollectionForm(forms.ModelForm): diff --git a/Seeder/harvests/views.py b/Seeder/harvests/views.py index 9b0eccc5..e750d5a3 100644 --- a/Seeder/harvests/views.py +++ b/Seeder/harvests/views.py @@ -20,6 +20,7 @@ from django.views.generic.base import TemplateView from django.views.generic import DetailView, FormView, View from django.conf import settings +from django.utils.safestring import mark_safe from core import generic_views from comments.views import CommentViewGeneric @@ -475,19 +476,46 @@ def get_form(self, form_class=None): return form_class(files, **self.get_form_kwargs()) def form_valid(self, form): - topic = form.save() - topic.pair_custom_seeds() - + topic = form.save(commit=False) + form.save_m2m() # must save m2m when commit=False + # Create and delete attachments ids_to_delete = form.cleaned_data['files_to_delete'] for att in models.Attachment.objects.filter(id__in=ids_to_delete): att.file.delete() att.delete() - for each in form.cleaned_data["attachments"]: models.Attachment.objects.create( - file=each, - topic_collection=topic - ) + file=each, topic_collection=topic) + # If a custom seeds file is uploaded, backup and replace TC.custom_seeds + new_custom_seeds = form.cleaned_data.get("custom_seeds_file") + if new_custom_seeds: + url = topic.backup_custom_seeds() + try: + topic.custom_seeds = new_custom_seeds.read().decode("utf-8") + topic.save() # full save, including new large custom seeds + except UnicodeDecodeError: + messages.error(self.request, _("Cannot decode file to UTF-8")) + messages.success(self.request, mark_safe(_( + "Original custom_seeds have been backed to: %(url)s" + ) % {"url": url})) + messages.warning(self.request, _( + "Uploaded custom seeds will not be paired automatically")) + else: + # Small edits shouldn't touch custom_seeds because it'll never load + if form.custom_seeds_too_large: + topic.save(update_fields=( + set(form.fields.keys()) - set([ + "custom_seeds", "custom_sources", "attachments", + "files_to_delete", "custom_seeds_file", + ]) + )) + # Only pair custom seeds if there aren't too many of them and they + # haven't just been imported + else: + topic.save() # full save, not many custom seeds + topic.pair_custom_seeds() + return HttpResponseRedirect(topic.get_absolute_url()) diff --git a/Seeder/locale/cs/LC_MESSAGES/django.po b/Seeder/locale/cs/LC_MESSAGES/django.po index 869bfd33..f36ea6e1 100644 --- a/Seeder/locale/cs/LC_MESSAGES/django.po +++ b/Seeder/locale/cs/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Seeder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 07:53+0000\n" +"POT-Creation-Date: 2023-07-24 10:40+0000\n" "PO-Revision-Date: 2018-04-16 13:40+0200\n" "Last-Translator: mariehaskovcova , 2017\n" "Language-Team: Czech (https://www.transifex.com/webarchivecz/teams/43032/" @@ -151,7 +151,7 @@ msgid "This comment has been removed" msgstr "Komentář byl odstraněn" #: comments/models.py:168 qa/models.py:40 qa/templates/detail.html:30 -#: source/models.py:254 source/models.py:509 source/templates/source.html:83 +#: source/models.py:254 source/models.py:534 source/templates/source.html:83 #: templates/history.html:14 msgid "Comment" msgstr "Komentář" @@ -215,7 +215,7 @@ msgid "Narodni knihovna CR - archivace Vasich webovych stranek" msgstr "Narodni knihovna CR - archivace Vasich webovych stranek" #: contracts/models.py:55 contracts/templates/contract.html:21 -#: harvests/models.py:232 harvests/models.py:710 source/models.py:268 +#: harvests/models.py:233 harvests/models.py:711 source/models.py:268 #: voting/models.py:27 msgid "State" msgstr "Stav" @@ -522,15 +522,33 @@ msgstr "dataLimit nesmí být přes 1TB" msgid "One URL per line" msgstr "Jedna URL na řádku" -#: harvests/models.py:49 +#: harvests/forms.py:204 +msgid "" +"Provide a text file with one seed per line which will overwrite all " +"custom_seeds. The original custom_seeds will be backed up to the media/seeds/" +"backup folder." +msgstr "" +"Přiložte textový soubor s jedním semínkem na řádek, který přepíše všechna " +"mimosystémová semínka. Původní semínka budou zálohována do media/seeds/" +"backup složky." + +#: harvests/forms.py:225 +msgid "" +"Custom seeds field is disabled because there are too many seeds to be " +"displayed in an HTML text field." +msgstr "" +"Pole mimosystémových semínek je nyní schováno jelikož kolekce má příliš mnoho " +"semínek pro zobrazení v HTML textovém poli." + +#: harvests/models.py:50 msgid "Included sources" msgstr "Přiřazené zdroje" -#: harvests/models.py:54 +#: harvests/models.py:55 msgid "Custom seeds URL" msgstr "Mimosystémová semínka" -#: harvests/models.py:55 +#: harvests/models.py:56 msgid "" "Sem vložte všechna semínka, po uložení zde zůstanou zdroje bez záznamu v " "Seederu, ostatní budu v poli Přiřazené zdroje" @@ -538,198 +556,198 @@ msgstr "" "Sem vložte všechna semínka, po uložení zde zůstanou zdroje bez záznamu v " "Seederu, ostatní budu v poli Přiřazené zdroje" -#: harvests/models.py:204 +#: harvests/models.py:205 msgid "Planned" msgstr "Plánované" -#: harvests/models.py:205 +#: harvests/models.py:206 msgid "Ready to harvest" msgstr "Připraveno na sklízení" -#: harvests/models.py:206 harvests/models.py:687 +#: harvests/models.py:207 harvests/models.py:688 msgid "Running" msgstr "Probíhající" -#: harvests/models.py:207 +#: harvests/models.py:208 msgid "Success" msgstr "Úspěšné" -#: harvests/models.py:208 +#: harvests/models.py:209 msgid "Success with failures" msgstr "Úspěšné se závadami" -#: harvests/models.py:209 +#: harvests/models.py:210 msgid "Cancelled" msgstr "Zrušené" -#: harvests/models.py:210 +#: harvests/models.py:211 msgid "Failed" msgstr "Neúspěšné" -#: harvests/models.py:234 harvests/models.py:801 +#: harvests/models.py:235 harvests/models.py:820 #: harvests/templates/harvest.html:19 harvests/templates/harvest_config.html:18 msgid "Harvest type" msgstr "Typ sklizně" -#: harvests/models.py:236 harvests/models.py:596 harvests/models.py:714 +#: harvests/models.py:237 harvests/models.py:597 harvests/models.py:715 #: harvests/tables.py:76 harvests/tables.py:93 www/tables.py:13 msgid "title" msgstr "Název" -#: harvests/models.py:238 harvests/templates/harvest.html:17 +#: harvests/models.py:239 harvests/templates/harvest.html:17 #: source/models.py:255 source/templates/source.html:87 msgid "Annotation" msgstr "Anotace" -#: harvests/models.py:240 harvests/models.py:729 +#: harvests/models.py:241 harvests/models.py:730 msgid "Date of harvest" msgstr "Datum sklizně" -#: harvests/models.py:242 +#: harvests/models.py:243 msgid "Seeds by frequency" msgstr "Semínka podle frekvence" -#: harvests/models.py:254 harvests/templates/harvest.html:27 +#: harvests/models.py:255 harvests/templates/harvest.html:27 msgid "Date frozen" msgstr "Datum zmrazení" -#: harvests/models.py:259 +#: harvests/models.py:260 msgid "Topic collections" msgstr "Tematické kolekce" -#: harvests/models.py:264 harvests/templates/harvest.html:58 +#: harvests/models.py:265 harvests/templates/harvest.html:58 msgid "Topic collections by frequency" msgstr "Tematické kolekce podle frekvence" -#: harvests/models.py:272 harvests/templates/harvest.html:37 +#: harvests/models.py:273 harvests/templates/harvest.html:37 msgid "Paraharvest" msgstr "Parasklizeň" -#: harvests/models.py:275 harvests/templates/harvest.html:39 +#: harvests/models.py:276 harvests/templates/harvest.html:39 msgid "Manuals" msgstr "Manuals" -#: harvests/models.py:277 harvests/templates/harvest.html:51 +#: harvests/models.py:278 harvests/templates/harvest.html:51 msgid "Combined" msgstr "Combined" -#: harvests/models.py:279 harvests/views.py:382 +#: harvests/models.py:280 harvests/views.py:383 msgid "ArchiveIt" msgstr "ArchiveIt" -#: harvests/models.py:282 harvests/views.py:384 +#: harvests/models.py:283 harvests/views.py:385 msgid "Tests" msgstr "Tests" -#: harvests/models.py:286 harvests/models.py:803 +#: harvests/models.py:287 harvests/models.py:822 #: harvests/templates/harvest.html:65 harvests/templates/harvest_config.html:20 msgid "duration" msgstr "duration" -#: harvests/models.py:288 harvests/models.py:805 +#: harvests/models.py:289 harvests/models.py:824 #: harvests/templates/harvest.html:67 harvests/templates/harvest_config.html:22 msgid "budget" msgstr "budget" -#: harvests/models.py:290 harvests/models.py:807 +#: harvests/models.py:291 harvests/models.py:826 #: harvests/templates/harvest.html:69 harvests/templates/harvest_config.html:24 msgid "dataLimit" msgstr "dataLimit" -#: harvests/models.py:292 harvests/models.py:809 +#: harvests/models.py:293 harvests/models.py:828 #: harvests/templates/harvest.html:71 harvests/templates/harvest_config.html:26 msgid "documentLimit" msgstr "documentLimit" -#: harvests/models.py:294 harvests/models.py:811 +#: harvests/models.py:295 harvests/models.py:830 #: harvests/templates/harvest.html:73 harvests/templates/harvest_config.html:28 msgid "deduplication" msgstr "deduplication" -#: harvests/models.py:298 harvests/templates/harvest.html:82 +#: harvests/models.py:299 harvests/templates/harvest.html:82 msgid "Seeds not harvested" msgstr "Nesklizená semínka" -#: harvests/models.py:600 harvests/models.py:717 source/constants.py:124 +#: harvests/models.py:601 harvests/models.py:718 source/constants.py:124 #: source/models.py:239 msgid "Curator" msgstr "Kurátor" -#: harvests/models.py:604 source/templates/source.html:91 +#: harvests/models.py:605 source/templates/source.html:91 msgid "keywords" msgstr "Klíčová slova" -#: harvests/models.py:607 harvests/models.py:734 +#: harvests/models.py:608 harvests/models.py:735 msgid "annotation" msgstr "anotace" -#: harvests/models.py:611 +#: harvests/models.py:612 msgid "image" msgstr "obrázek" -#: harvests/models.py:670 harvests/templates/topic_collection.html:13 +#: harvests/models.py:671 harvests/templates/topic_collection.html:13 msgid "External Topic Collection" msgstr "Externí tematická kolekce" -#: harvests/models.py:671 templates/base.html:110 +#: harvests/models.py:672 templates/base.html:110 msgid "External Topic Collections" msgstr "Externí tematické kolekce" -#: harvests/models.py:688 +#: harvests/models.py:689 msgid "New" msgstr "Aktualita" -#: harvests/models.py:689 +#: harvests/models.py:690 msgid "Finished" msgstr "Hotovo" -#: harvests/models.py:701 harvests/templates/topic_collection.html:49 +#: harvests/models.py:702 harvests/templates/topic_collection.html:49 #: source/models.py:274 source/templates/source.html:56 templates/api.html:17 msgid "Frequency" msgstr "Frekvence" -#: harvests/models.py:738 +#: harvests/models.py:739 msgid "All sources are under open license or contract" msgstr "Všechny zdroje jsou nasmlouvány nebo vystaveny pod otevřenou licencí" -#: harvests/models.py:741 +#: harvests/models.py:742 msgid "Date from" msgstr "Od" -#: harvests/models.py:742 +#: harvests/models.py:743 msgid "Date to" msgstr "Do" -#: harvests/models.py:746 harvests/templates/topic_collection.html:24 +#: harvests/models.py:747 harvests/templates/topic_collection.html:24 msgid "Collection alias" msgstr "Alias kolekce" -#: harvests/models.py:748 harvests/templates/topic_collection.html:82 +#: harvests/models.py:749 harvests/templates/topic_collection.html:82 msgid "Aggregation with same type" msgstr "Agregovat se stejným typem" -#: harvests/models.py:773 +#: harvests/models.py:792 msgid "Internal Topic Collection" msgstr "Interní tematická kolekce" -#: harvests/models.py:774 harvests/templates/external_topic_collection.html:82 +#: harvests/models.py:793 harvests/templates/external_topic_collection.html:82 #: templates/base.html:113 msgid "Internal Topic Collections" msgstr "Interní tematické kolekce" -#: harvests/models.py:780 +#: harvests/models.py:799 msgid "file" msgstr "pole" -#: harvests/models.py:814 +#: harvests/models.py:833 msgid "Harvest Configuration" msgstr "Konfigurace sklizní" -#: harvests/models.py:815 harvests/views.py:397 templates/base.html:127 +#: harvests/models.py:834 harvests/views.py:398 templates/base.html:127 msgid "Harvest Configurations" msgstr "Konfigurace sklizní" -#: harvests/models.py:819 +#: harvests/models.py:838 #, python-format msgid "Configuration for %(type)s Harvests" msgstr "Konfigurace pro %(type)s Sklizně" @@ -924,61 +942,78 @@ msgid "All sources are open?" msgstr "Všechny zdroje jsou otevřené?" #: harvests/templates/topic_collection.html:94 qa/templates/qa_form.html:20 -#: source/models.py:538 source/templates/source.html:152 +#: source/models.py:563 source/templates/source.html:152 msgid "Seeds" msgstr "Semínka" -#: harvests/views.py:57 templates/base.html:122 +#: harvests/views.py:58 templates/base.html:122 msgid "Harvests" msgstr "Sklizně" -#: harvests/views.py:112 harvests/views.py:130 +#: harvests/views.py:113 harvests/views.py:131 msgid "Harvest contains no seeds!" msgstr "" "Sklizeň neobsahuje žádná semínka! Tím pádem nemůže být zmrazena (stav " "nastaven na 'Připraveno na sklízení')" -#: harvests/views.py:352 harvests/views.py:371 +#: harvests/views.py:353 harvests/views.py:372 msgid "Available URLs for date" msgstr "Seznam URL pro datum" -#: harvests/views.py:356 +#: harvests/views.py:357 msgid "All seeds for Harvest" msgstr "Všechna semínka pro sklizeň" -#: harvests/views.py:383 +#: harvests/views.py:384 msgid "VNC" msgstr "VNC: Výběrové custom" -#: harvests/views.py:385 +#: harvests/views.py:386 msgid "Totals" msgstr "Totals: Všechna semínka" -#: harvests/views.py:444 +#: harvests/views.py:445 msgid "TopicCollections" msgstr "Tematické kolekce" -#: harvests/views.py:454 +#: harvests/views.py:455 msgid "Add TopicCollection" msgstr "Přidat tematickou kolekci" -#: harvests/views.py:530 +#: harvests/views.py:497 +msgid "Cannot decode file to UTF-8" +msgstr "Nelze dekódovat soubor do UTF-8" + +#: harvests/views.py:499 +#, python-format +msgid "" +"Original custom_seeds have been backed to: " +"%(url)s" +msgstr "" +"Původní mimosystémová semínka byla zálohována do " +"%(url)s" + +#: harvests/views.py:503 +msgid "Uploaded custom seeds will not be paired automatically" +msgstr "Nahraná mimosystémová semínka nebudou automaticky párována" + +#: harvests/views.py:558 msgid "ExternalTopicCollections" msgstr "Externí tematické kolekce" -#: harvests/views.py:540 +#: harvests/views.py:568 msgid "Add ExternalTopicCollection" msgstr "Přidat Externí tematickou kolekci" -#: harvests/views.py:624 +#: harvests/views.py:652 msgid "Topic collection published" msgstr "Tematická kolekce publikována" -#: harvests/views.py:626 +#: harvests/views.py:654 msgid "Topic collection unpublished" msgstr "Tematická kolekce nepublikována" -#: harvests/views.py:640 +#: harvests/views.py:668 msgid "URL slug successfully updated" msgstr "URL byla úspěšné změněna" @@ -1262,63 +1297,63 @@ msgstr "Podkategorie" msgid "Source is dead" msgstr "Mrtvý web" -#: source/models.py:490 +#: source/models.py:515 msgid "default" msgstr "výchozí" -#: source/models.py:491 +#: source/models.py:516 msgid "low" msgstr "low" -#: source/models.py:492 +#: source/models.py:517 msgid "very_low" msgstr "very low" -#: source/models.py:503 +#: source/models.py:528 msgid "Main seed" msgstr "Hlavní semínko" -#: source/models.py:504 +#: source/models.py:529 msgid "Seed url" msgstr "URL semínko" -#: source/models.py:510 +#: source/models.py:535 msgid "From" msgstr "Od" -#: source/models.py:511 +#: source/models.py:536 msgid "To" msgstr "Do" -#: source/models.py:514 +#: source/models.py:539 msgid "Javascript" msgstr "Javascript" -#: source/models.py:515 +#: source/models.py:540 msgid "Global reject" msgstr "Odmítnuto" -#: source/models.py:516 +#: source/models.py:541 msgid "Youtube" msgstr "Youtube" -#: source/models.py:517 +#: source/models.py:542 msgid "Calendars" msgstr "Kalendáře" -#: source/models.py:518 +#: source/models.py:543 msgid "Local traps" msgstr "Local traps" -#: source/models.py:519 +#: source/models.py:544 msgid "Redirect on seed" msgstr "Přesměrováno na semínko" -#: source/models.py:520 +#: source/models.py:545 msgid "Robots.txt active" msgstr "aktivní Robots.txt" -#: source/models.py:537 +#: source/models.py:562 msgid "Seed" msgstr "Semínko" diff --git a/Seeder/locale/en_US/LC_MESSAGES/django.po b/Seeder/locale/en_US/LC_MESSAGES/django.po index 2046849d..229a1005 100644 --- a/Seeder/locale/en_US/LC_MESSAGES/django.po +++ b/Seeder/locale/en_US/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Seeder\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 07:53+0000\n" +"POT-Creation-Date: 2023-07-24 10:40+0000\n" "PO-Revision-Date: 2017-11-07 12:38+0100\n" "Last-Translator: Visgean Skeloru , 2017\n" "Language-Team: English (United States) (https://www.transifex.com/" @@ -152,7 +152,7 @@ msgid "This comment has been removed" msgstr "This comment has been removed" #: comments/models.py:168 qa/models.py:40 qa/templates/detail.html:30 -#: source/models.py:254 source/models.py:509 source/templates/source.html:83 +#: source/models.py:254 source/models.py:534 source/templates/source.html:83 #: templates/history.html:14 msgid "Comment" msgstr "Comment" @@ -216,7 +216,7 @@ msgid "Narodni knihovna CR - archivace Vasich webovych stranek" msgstr "National library of the CR - archiving your web sites" #: contracts/models.py:55 contracts/templates/contract.html:21 -#: harvests/models.py:232 harvests/models.py:710 source/models.py:268 +#: harvests/models.py:233 harvests/models.py:711 source/models.py:268 #: voting/models.py:27 msgid "State" msgstr "State" @@ -525,15 +525,33 @@ msgstr "dataLimit cannot be over 1TB" msgid "One URL per line" msgstr "One URL per line" -#: harvests/models.py:49 +#: harvests/forms.py:204 +msgid "" +"Provide a text file with one seed per line which will overwrite all " +"custom_seeds. The original custom_seeds will be backed up to the media/seeds/" +"backup folder." +msgstr "" +"Provide a text file with one seed per line which will overwrite all " +"custom_seeds. The original custom_seeds will be backed up to the media/seeds/" +"backup folder." + +#: harvests/forms.py:225 +msgid "" +"Custom seeds field is disabled because there are too many seeds to be " +"displayed in an HTML text field." +msgstr "" +"Custom seeds field is disabled because there are too many seeds to be " +"displayed in an HTML text field." + +#: harvests/models.py:50 msgid "Included sources" msgstr "Included sources" -#: harvests/models.py:54 +#: harvests/models.py:55 msgid "Custom seeds URL" msgstr "Custom seeds URL" -#: harvests/models.py:55 +#: harvests/models.py:56 msgid "" "Sem vložte všechna semínka, po uložení zde zůstanou zdroje bez záznamu v " "Seederu, ostatní budu v poli Přiřazené zdroje" @@ -541,198 +559,198 @@ msgstr "" "Enter all your seeds here. After saving, unknown sources will stay here, " "while the rest will be assigned to Custom sources" -#: harvests/models.py:204 +#: harvests/models.py:205 msgid "Planned" msgstr "Planned" -#: harvests/models.py:205 +#: harvests/models.py:206 msgid "Ready to harvest" msgstr "Ready to harvest" -#: harvests/models.py:206 harvests/models.py:687 +#: harvests/models.py:207 harvests/models.py:688 msgid "Running" msgstr "Running" -#: harvests/models.py:207 +#: harvests/models.py:208 msgid "Success" msgstr "Success" -#: harvests/models.py:208 +#: harvests/models.py:209 msgid "Success with failures" msgstr "Success with failures" -#: harvests/models.py:209 +#: harvests/models.py:210 msgid "Cancelled" msgstr "Cancelled" -#: harvests/models.py:210 +#: harvests/models.py:211 msgid "Failed" msgstr "Failed" -#: harvests/models.py:234 harvests/models.py:801 +#: harvests/models.py:235 harvests/models.py:820 #: harvests/templates/harvest.html:19 harvests/templates/harvest_config.html:18 msgid "Harvest type" msgstr "Harvest type" -#: harvests/models.py:236 harvests/models.py:596 harvests/models.py:714 +#: harvests/models.py:237 harvests/models.py:597 harvests/models.py:715 #: harvests/tables.py:76 harvests/tables.py:93 www/tables.py:13 msgid "title" msgstr "Title" -#: harvests/models.py:238 harvests/templates/harvest.html:17 +#: harvests/models.py:239 harvests/templates/harvest.html:17 #: source/models.py:255 source/templates/source.html:87 msgid "Annotation" msgstr "Annotation" -#: harvests/models.py:240 harvests/models.py:729 +#: harvests/models.py:241 harvests/models.py:730 msgid "Date of harvest" msgstr "Date of harvest" -#: harvests/models.py:242 +#: harvests/models.py:243 msgid "Seeds by frequency" msgstr "Seeds by frequency" -#: harvests/models.py:254 harvests/templates/harvest.html:27 +#: harvests/models.py:255 harvests/templates/harvest.html:27 msgid "Date frozen" msgstr "Date frozen" -#: harvests/models.py:259 +#: harvests/models.py:260 msgid "Topic collections" msgstr "Topic collections" -#: harvests/models.py:264 harvests/templates/harvest.html:58 +#: harvests/models.py:265 harvests/templates/harvest.html:58 msgid "Topic collections by frequency" msgstr "Topic collections by frequency" -#: harvests/models.py:272 harvests/templates/harvest.html:37 +#: harvests/models.py:273 harvests/templates/harvest.html:37 msgid "Paraharvest" msgstr "Paraharvest" -#: harvests/models.py:275 harvests/templates/harvest.html:39 +#: harvests/models.py:276 harvests/templates/harvest.html:39 msgid "Manuals" msgstr "Manuals" -#: harvests/models.py:277 harvests/templates/harvest.html:51 +#: harvests/models.py:278 harvests/templates/harvest.html:51 msgid "Combined" msgstr "Combined" -#: harvests/models.py:279 harvests/views.py:382 +#: harvests/models.py:280 harvests/views.py:383 msgid "ArchiveIt" msgstr "ArchiveIt" -#: harvests/models.py:282 harvests/views.py:384 +#: harvests/models.py:283 harvests/views.py:385 msgid "Tests" msgstr "Tests" -#: harvests/models.py:286 harvests/models.py:803 +#: harvests/models.py:287 harvests/models.py:822 #: harvests/templates/harvest.html:65 harvests/templates/harvest_config.html:20 msgid "duration" msgstr "duration" -#: harvests/models.py:288 harvests/models.py:805 +#: harvests/models.py:289 harvests/models.py:824 #: harvests/templates/harvest.html:67 harvests/templates/harvest_config.html:22 msgid "budget" msgstr "budget" -#: harvests/models.py:290 harvests/models.py:807 +#: harvests/models.py:291 harvests/models.py:826 #: harvests/templates/harvest.html:69 harvests/templates/harvest_config.html:24 msgid "dataLimit" msgstr "dataLimit" -#: harvests/models.py:292 harvests/models.py:809 +#: harvests/models.py:293 harvests/models.py:828 #: harvests/templates/harvest.html:71 harvests/templates/harvest_config.html:26 msgid "documentLimit" msgstr "documentLimit" -#: harvests/models.py:294 harvests/models.py:811 +#: harvests/models.py:295 harvests/models.py:830 #: harvests/templates/harvest.html:73 harvests/templates/harvest_config.html:28 msgid "deduplication" msgstr "deduplication" -#: harvests/models.py:298 harvests/templates/harvest.html:82 +#: harvests/models.py:299 harvests/templates/harvest.html:82 msgid "Seeds not harvested" msgstr "Seeds not harvested" -#: harvests/models.py:600 harvests/models.py:717 source/constants.py:124 +#: harvests/models.py:601 harvests/models.py:718 source/constants.py:124 #: source/models.py:239 msgid "Curator" msgstr "Curator" -#: harvests/models.py:604 source/templates/source.html:91 +#: harvests/models.py:605 source/templates/source.html:91 msgid "keywords" msgstr "Keywords" -#: harvests/models.py:607 harvests/models.py:734 +#: harvests/models.py:608 harvests/models.py:735 msgid "annotation" msgstr "annotation" -#: harvests/models.py:611 +#: harvests/models.py:612 msgid "image" msgstr "image" -#: harvests/models.py:670 harvests/templates/topic_collection.html:13 +#: harvests/models.py:671 harvests/templates/topic_collection.html:13 msgid "External Topic Collection" msgstr "External Topic Collection" -#: harvests/models.py:671 templates/base.html:110 +#: harvests/models.py:672 templates/base.html:110 msgid "External Topic Collections" msgstr "External Topic Collections" -#: harvests/models.py:688 +#: harvests/models.py:689 msgid "New" msgstr "New" -#: harvests/models.py:689 +#: harvests/models.py:690 msgid "Finished" msgstr "Finished" -#: harvests/models.py:701 harvests/templates/topic_collection.html:49 +#: harvests/models.py:702 harvests/templates/topic_collection.html:49 #: source/models.py:274 source/templates/source.html:56 templates/api.html:17 msgid "Frequency" msgstr "Frequency" -#: harvests/models.py:738 +#: harvests/models.py:739 msgid "All sources are under open license or contract" msgstr "All sources are under open license or contract" -#: harvests/models.py:741 +#: harvests/models.py:742 msgid "Date from" msgstr "Date from" -#: harvests/models.py:742 +#: harvests/models.py:743 msgid "Date to" msgstr "Date to" -#: harvests/models.py:746 harvests/templates/topic_collection.html:24 +#: harvests/models.py:747 harvests/templates/topic_collection.html:24 msgid "Collection alias" msgstr "Collection alias" -#: harvests/models.py:748 harvests/templates/topic_collection.html:82 +#: harvests/models.py:749 harvests/templates/topic_collection.html:82 msgid "Aggregation with same type" msgstr "Aggregation with same type" -#: harvests/models.py:773 +#: harvests/models.py:792 msgid "Internal Topic Collection" msgstr "Internal Topic Collection" -#: harvests/models.py:774 harvests/templates/external_topic_collection.html:82 +#: harvests/models.py:793 harvests/templates/external_topic_collection.html:82 #: templates/base.html:113 msgid "Internal Topic Collections" msgstr "Internal Topic Collections" -#: harvests/models.py:780 +#: harvests/models.py:799 msgid "file" msgstr "file" -#: harvests/models.py:814 +#: harvests/models.py:833 msgid "Harvest Configuration" msgstr "Harvest Configuration" -#: harvests/models.py:815 harvests/views.py:397 templates/base.html:127 +#: harvests/models.py:834 harvests/views.py:398 templates/base.html:127 msgid "Harvest Configurations" msgstr "Harvest Configurations" -#: harvests/models.py:819 +#: harvests/models.py:838 #, python-format msgid "Configuration for %(type)s Harvests" msgstr "Configuration for %(type)s Harvests" @@ -927,61 +945,78 @@ msgid "All sources are open?" msgstr "All sources are open?" #: harvests/templates/topic_collection.html:94 qa/templates/qa_form.html:20 -#: source/models.py:538 source/templates/source.html:152 +#: source/models.py:563 source/templates/source.html:152 msgid "Seeds" msgstr "Seeds" -#: harvests/views.py:57 templates/base.html:122 +#: harvests/views.py:58 templates/base.html:122 msgid "Harvests" msgstr "Harvests" -#: harvests/views.py:112 harvests/views.py:130 +#: harvests/views.py:113 harvests/views.py:131 msgid "Harvest contains no seeds!" msgstr "" "Harvest contains no seeds! This means it cannot be frozen (set as 'Ready to " "harvest')" -#: harvests/views.py:352 harvests/views.py:371 +#: harvests/views.py:353 harvests/views.py:372 msgid "Available URLs for date" msgstr "Available URLs for date" -#: harvests/views.py:356 +#: harvests/views.py:357 msgid "All seeds for Harvest" msgstr "All seeds for Harvest" -#: harvests/views.py:383 +#: harvests/views.py:384 msgid "VNC" msgstr "VNC: Custom seeds" -#: harvests/views.py:385 +#: harvests/views.py:386 msgid "Totals" msgstr "Totals: All seeds" -#: harvests/views.py:444 +#: harvests/views.py:445 msgid "TopicCollections" msgstr "Topic Collections" -#: harvests/views.py:454 +#: harvests/views.py:455 msgid "Add TopicCollection" msgstr "Add Topic Collection" -#: harvests/views.py:530 +#: harvests/views.py:497 +msgid "Cannot decode file to UTF-8" +msgstr "Cannot decode file to UTF-8" + +#: harvests/views.py:499 +#, python-format +msgid "" +"Original custom_seeds have been backed to: " +"%(url)s" +msgstr "" +"Original custom_seeds have been backed to: " +"%(url)s" + +#: harvests/views.py:503 +msgid "Uploaded custom seeds will not be paired automatically" +msgstr "Uploaded custom seeds will not be paired automatically" + +#: harvests/views.py:558 msgid "ExternalTopicCollections" msgstr "External Topic Collections" -#: harvests/views.py:540 +#: harvests/views.py:568 msgid "Add ExternalTopicCollection" msgstr "Add External Topic Collection" -#: harvests/views.py:624 +#: harvests/views.py:652 msgid "Topic collection published" msgstr "Topic collection published" -#: harvests/views.py:626 +#: harvests/views.py:654 msgid "Topic collection unpublished" msgstr "Topic collection unpublished" -#: harvests/views.py:640 +#: harvests/views.py:668 msgid "URL slug successfully updated" msgstr "URL slug successfully updated" @@ -1265,63 +1300,63 @@ msgstr "Sub category" msgid "Source is dead" msgstr "Source is dead" -#: source/models.py:490 +#: source/models.py:515 msgid "default" msgstr "default" -#: source/models.py:491 +#: source/models.py:516 msgid "low" msgstr "low" -#: source/models.py:492 +#: source/models.py:517 msgid "very_low" msgstr "very_low" -#: source/models.py:503 +#: source/models.py:528 msgid "Main seed" msgstr "Main seed" -#: source/models.py:504 +#: source/models.py:529 msgid "Seed url" msgstr "Seed URL" -#: source/models.py:510 +#: source/models.py:535 msgid "From" msgstr "From" -#: source/models.py:511 +#: source/models.py:536 msgid "To" msgstr "To" -#: source/models.py:514 +#: source/models.py:539 msgid "Javascript" msgstr "Javascript" -#: source/models.py:515 +#: source/models.py:540 msgid "Global reject" msgstr "Global reject" -#: source/models.py:516 +#: source/models.py:541 msgid "Youtube" msgstr "YouTube" -#: source/models.py:517 +#: source/models.py:542 msgid "Calendars" msgstr "Calendars" -#: source/models.py:518 +#: source/models.py:543 msgid "Local traps" msgstr "Local traps" -#: source/models.py:519 +#: source/models.py:544 msgid "Redirect on seed" msgstr "Redirect on seed" -#: source/models.py:520 +#: source/models.py:545 msgid "Robots.txt active" msgstr "Robots.txt active" -#: source/models.py:537 +#: source/models.py:562 msgid "Seed" msgstr "Seed"