From 3a3e3d651c509a0b2f63733f286c6410d84b999b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Kr=C3=B6ger?= Date: Fri, 26 Jun 2026 09:10:16 +0000 Subject: [PATCH] api: Add endpoint returning all available attributes Add a dataset/attributes API endpoint that returns all available attributes including the special ones (e.g. hostname, servertype). Clients can use this, for example, to get the available attributes for auto completion or selection. --- serveradmin/api/urls.py | 2 ++ serveradmin/api/views.py | 44 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/serveradmin/api/urls.py b/serveradmin/api/urls.py index 7557a88d8..1556e3e6b 100644 --- a/serveradmin/api/urls.py +++ b/serveradmin/api/urls.py @@ -10,6 +10,7 @@ dataset_query, dataset_commit, dataset_new_object, + dataset_attributes, api_call, ) @@ -18,5 +19,6 @@ path('dataset/query', dataset_query), path('dataset/commit', dataset_commit), path('dataset/new_object', dataset_new_object), + path('dataset/attributes', dataset_attributes), path('call', api_call), ] diff --git a/serveradmin/api/views.py b/serveradmin/api/views.py index 48f01eb5e..73ed77192 100644 --- a/serveradmin/api/views.py +++ b/serveradmin/api/views.py @@ -8,11 +8,13 @@ PermissionDenied, ValidationError, ) +from django.http import JsonResponse from django.template.response import HttpResponse from adminapi.filters import BaseFilter, FilterValueError from serveradmin.api import ApiError, AVAILABLE_API_FUNCTIONS from serveradmin.api.decorators import api_view +from serveradmin.serverdb.models import Attribute from serveradmin.serverdb.query_committer import commit_query from serveradmin.serverdb.query_executer import execute_query from serveradmin.serverdb.query_materializer import ( @@ -66,6 +68,48 @@ def dataset_query(request, app, data): } +@api_view +def dataset_attributes(request, app, data): + """Return all available attributes + + This includes the special attributes (e.g. hostname, servertype) that + are not stored in the attribute table but are queryable like any other + attribute. + """ + attributes = list(Attribute.objects.all()) + attributes.extend(Attribute.specials.values()) + + result = [] + for attribute in attributes: + result.append({ + 'attribute_id': attribute.attribute_id, + 'type': attribute.type, + 'multi': attribute.multi, + 'hovertext': attribute.hovertext, + 'group': attribute.group, + 'help_link': attribute.help_link, + 'inet_address_family': attribute.inet_address_family, + 'readonly': attribute.readonly, + 'clone': attribute.clone, + 'history': attribute.history, + 'regexp': attribute.regexp, + 'reversed_attribute': attribute.reversed_attribute_id, + # Special attributes are not saved to the database, so accessing + # their many-to-many target_servertype is not possible. + 'target_servertypes': ( + [] if attribute.special else + list(attribute.target_servertype.values_list( + 'servertype_id', flat=True + )) + ), + }) + + return { + 'status': 'success', + 'result': result, + } + + @api_view def dataset_new_object(request, app, data): try: