diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2021-10-15 17:54:03 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2022-12-12 12:20:59 +0100 |
commit | 3221ede6e709fc680e1bebebcfc334cc46e889ca (patch) | |
tree | 88ad3ba1c0bc80e648cf994794652a0bb53673f1 /ishtar_common/admin.py | |
parent | 6fc6efad0ee57e430903b0d24c6e925652ff3714 (diff) | |
download | Ishtar-3221ede6e709fc680e1bebebcfc334cc46e889ca.tar.bz2 Ishtar-3221ede6e709fc680e1bebebcfc334cc46e889ca.zip |
Syndication - initialize type match with a source
Diffstat (limited to 'ishtar_common/admin.py')
-rw-r--r-- | ishtar_common/admin.py | 75 |
1 files changed, 74 insertions, 1 deletions
diff --git a/ishtar_common/admin.py b/ishtar_common/admin.py index 7444aa9cd..39d7de021 100644 --- a/ishtar_common/admin.py +++ b/ishtar_common/admin.py @@ -21,6 +21,7 @@ import csv import json from io import TextIOWrapper, BytesIO import os +import requests import shutil import tempfile import urllib @@ -1482,7 +1483,8 @@ serialize_importer_action.short_description = SERIALIZE_DESC @admin.register(models.ImporterType, site=admin_site) class ImporterTypeAdmin(ImportJSONActionAdmin): list_display = ("name", "associated_models", "available") - actions = importer_type_actions + [serialize_importer_action, + actions = importer_type_actions + [ + serialize_importer_action, change_value("available", True, _("Make available")), change_value("available", False, _("Make unavailable")), ] @@ -2110,6 +2112,7 @@ class ApiSearchModelAdminForm(forms.ModelForm): class Meta: model = models.ApiUser exclude = [] + content_type = forms.ModelChoiceField( label=_("Content type"), queryset=get_main_content_types_query() ) @@ -2121,3 +2124,73 @@ class ApiSearchModelAdmin(admin.ModelAdmin): admin_site.register(models.ApiSearchModel, ApiSearchModelAdmin) + + +def send_error_message(request, msg, return_url, message_type=messages.ERROR): + messages.add_message( + request, + message_type, + msg, + ) + return HttpResponseRedirect(return_url) + + +def update_types_from_source(modeladmin, request, queryset): + return_url = ( + reverse( + "admin:%s_%s_changelist" + % (modeladmin.model._meta.app_label, modeladmin.model._meta.model_name) + ) + + "?" + + urllib.parse.urlencode(request.GET) + ) + if queryset.count() != 1: + return send_error_message( + request, + str(_("Select only one source.")), + return_url, + message_type=messages.WARNING, + ) + source = queryset.all()[0] + try: + response = requests.get( + source.url, + timeout=20, + headers={"Authorization": f"access_token {source.key}"}, + ) + except requests.exceptions.Timeout: + return send_error_message( + request, + str(_("Timeout: failed to join {}.")).format(source.url), + return_url + ) + if response.status_code != 200: + return send_error_message( + request, + str( + _( + "Bad response for {}. Response status code {} != 200. Check your key?" + ) + ).format(source.name, response.status_code), + return_url + ) + try: + content = response.json() + except ValueError: + return send_error_message( + request, + str(_("Response of {} is not a valid JSON message.")).format(source.url), + return_url + ) + result = source.update_matches(content) + print(result) + return response + + +class ApiExternalSource(admin.ModelAdmin): + model = models_rest.ApiExternalSource + actions = [update_types_from_source] + list_display = ("name", "url", "key") + + +admin_site.register(models_rest.ApiExternalSource, ApiExternalSource) |