summaryrefslogtreecommitdiff
path: root/ishtar_common/admin.py
diff options
context:
space:
mode:
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
commit3221ede6e709fc680e1bebebcfc334cc46e889ca (patch)
tree88ad3ba1c0bc80e648cf994794652a0bb53673f1 /ishtar_common/admin.py
parent6fc6efad0ee57e430903b0d24c6e925652ff3714 (diff)
downloadIshtar-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.py75
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)