From f3c4ac2cb63165923ada2dc5cd2315a303878917 Mon Sep 17 00:00:00 2001 From: Rowan Moss Date: Tue, 25 Nov 2025 15:37:21 +0000 Subject: [PATCH 1/7] Create validator django app - base file template for the new message validator - makes use of django app creator startapp --- monitoring/settings.py | 1 + monitoring/urls.py | 1 + monitoring/validator/__init__.py | 0 monitoring/validator/admin.py | 3 +++ monitoring/validator/apps.py | 6 ++++++ monitoring/validator/migrations/__init__.py | 0 monitoring/validator/models.py | 3 +++ monitoring/validator/tests.py | 3 +++ monitoring/validator/urls.py | 8 ++++++++ monitoring/validator/views.py | 5 +++++ 10 files changed, 30 insertions(+) create mode 100644 monitoring/validator/__init__.py create mode 100644 monitoring/validator/admin.py create mode 100644 monitoring/validator/apps.py create mode 100644 monitoring/validator/migrations/__init__.py create mode 100644 monitoring/validator/models.py create mode 100644 monitoring/validator/tests.py create mode 100644 monitoring/validator/urls.py create mode 100644 monitoring/validator/views.py diff --git a/monitoring/settings.py b/monitoring/settings.py index 5714c40..e10b183 100644 --- a/monitoring/settings.py +++ b/monitoring/settings.py @@ -95,6 +95,7 @@ 'monitoring.availability', 'monitoring.benchmarks', 'monitoring.iris', + 'monitoring.validator', ] REST_FRAMEWORK = { diff --git a/monitoring/urls.py b/monitoring/urls.py index 374a22e..185be43 100644 --- a/monitoring/urls.py +++ b/monitoring/urls.py @@ -10,4 +10,5 @@ path('benchmarks/', include('monitoring.benchmarks.urls')), path('iris/', include('monitoring.iris.urls')), path('api-auth/', include('rest_framework.urls', namespace='rest_framework')), + path('validator/', include ('monitoring.validator.urls')), ] diff --git a/monitoring/validator/__init__.py b/monitoring/validator/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/monitoring/validator/admin.py b/monitoring/validator/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/monitoring/validator/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/monitoring/validator/apps.py b/monitoring/validator/apps.py new file mode 100644 index 0000000..49e5efc --- /dev/null +++ b/monitoring/validator/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class ValidatorConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'validator' diff --git a/monitoring/validator/migrations/__init__.py b/monitoring/validator/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/monitoring/validator/models.py b/monitoring/validator/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/monitoring/validator/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/monitoring/validator/tests.py b/monitoring/validator/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/monitoring/validator/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/monitoring/validator/urls.py b/monitoring/validator/urls.py new file mode 100644 index 0000000..32b80d6 --- /dev/null +++ b/monitoring/validator/urls.py @@ -0,0 +1,8 @@ +from django.urls import path + +from monitoring.validator import views + +urlpatterns = [ + path('', views.index, name="validator"), +] + diff --git a/monitoring/validator/views.py b/monitoring/validator/views.py new file mode 100644 index 0000000..df5b2d6 --- /dev/null +++ b/monitoring/validator/views.py @@ -0,0 +1,5 @@ +from django.shortcuts import render +from django.http import HttpResponse + +def index(request): + return HttpResponse("Hello. This is validator index") From 2b92cebcdbeafe8b61f528a880419b2e1badb6e2 Mon Sep 17 00:00:00 2001 From: Rowan Moss Date: Thu, 27 Nov 2025 16:28:12 +0000 Subject: [PATCH 2/7] Update validator app config - within apps.py - update config to have the correct name --- monitoring/validator/apps.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/monitoring/validator/apps.py b/monitoring/validator/apps.py index 49e5efc..a754311 100644 --- a/monitoring/validator/apps.py +++ b/monitoring/validator/apps.py @@ -2,5 +2,4 @@ class ValidatorConfig(AppConfig): - default_auto_field = 'django.db.models.BigAutoField' - name = 'validator' + name = 'monitoring.validator' From 68c907111b099b059c03c1dd4a76a11009f66eb2 Mon Sep 17 00:00:00 2001 From: Rowan Moss Date: Tue, 9 Dec 2025 17:24:57 +0000 Subject: [PATCH 3/7] Create initial html page template and validator view - Linked into the Apel RecordFactory - Doesn't make use of django model --- monitoring/validator/models.py | 3 -- .../templates/validator/validator_index.html | 38 ++++++++++++++ monitoring/validator/views.py | 50 ++++++++++++++++++- 3 files changed, 86 insertions(+), 5 deletions(-) create mode 100644 monitoring/validator/templates/validator/validator_index.html diff --git a/monitoring/validator/models.py b/monitoring/validator/models.py index 71a8362..e69de29 100644 --- a/monitoring/validator/models.py +++ b/monitoring/validator/models.py @@ -1,3 +0,0 @@ -from django.db import models - -# Create your models here. diff --git a/monitoring/validator/templates/validator/validator_index.html b/monitoring/validator/templates/validator/validator_index.html new file mode 100644 index 0000000..c3e679c --- /dev/null +++ b/monitoring/validator/templates/validator/validator_index.html @@ -0,0 +1,38 @@ +{% load static %} + + + + + + + Record Validator + + + + + +

Record Validator!

+ +
+ {% csrf_token %} + + +

+ +
+ +
+ {% if output %} +

Output

+ {{ output }} + {% endif %} +
+ + diff --git a/monitoring/validator/views.py b/monitoring/validator/views.py index df5b2d6..369c623 100644 --- a/monitoring/validator/views.py +++ b/monitoring/validator/views.py @@ -1,5 +1,51 @@ from django.shortcuts import render -from django.http import HttpResponse +from django.views.decorators.http import require_http_methods +from apel.db.loader.record_factory import RecordFactory + + +@require_http_methods(["GET", "POST"]) def index(request): - return HttpResponse("Hello. This is validator index") + """ + Validates inputted records using Apel RecordFactory, + when html form is submitted. + """ + template_name = "validator/validator_index.html" + input_record = "" + output = "" + + + def validate(record: str) -> str: + """ + Validated record(s) passed in, and returns the result + """ + if not record: + return "Please enter a record to be validated." + + record = record.strip() + + try: + recordFactory = RecordFactory() + + result = recordFactory.create_records(record) + + return str(result) + + except Exception as e: + return str(e) + + + # On form submission, trigger record validation + if request.method == "POST": + input_record = request.POST.get("input_record", "") + try: + output = validate(input_record) + except Exception as e: + output = f"Error during validation: {e}" + + context = { + "input_record": input_record, + "output": output, + } + + return render(request, template_name, context) From 2b659845d17bb21bb65f9e6e41ced9553aefa3a8 Mon Sep 17 00:00:00 2001 From: Rowan Moss Date: Thu, 11 Dec 2025 14:00:24 +0000 Subject: [PATCH 4/7] Ensure textarea input value is kept on form submission and refresh - also cleans up some unnecessary code (unused exception handling) - validation output is also kept on submission and refresh --- .../validator/templates/validator/validator_index.html | 5 ++--- monitoring/validator/views.py | 10 +++++----- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/monitoring/validator/templates/validator/validator_index.html b/monitoring/validator/templates/validator/validator_index.html index c3e679c..b4369e7 100644 --- a/monitoring/validator/templates/validator/validator_index.html +++ b/monitoring/validator/templates/validator/validator_index.html @@ -22,15 +22,14 @@

Record Validator!

rows="10" cols="50" wrap="wrap" - value="{{ input_record|default:'' }}" - > + >{{ input_record|default:''|escape }}

{% if output %} -

Output

+

Validation Output

{{ output }} {% endif %}
diff --git a/monitoring/validator/views.py b/monitoring/validator/views.py index 369c623..201d9b9 100644 --- a/monitoring/validator/views.py +++ b/monitoring/validator/views.py @@ -29,7 +29,10 @@ def validate(record: str) -> str: result = recordFactory.create_records(record) - return str(result) + if "Record object at" in str(result): + return "Record(s) valid!" + else: + return str(result) except Exception as e: return str(e) @@ -38,10 +41,7 @@ def validate(record: str) -> str: # On form submission, trigger record validation if request.method == "POST": input_record = request.POST.get("input_record", "") - try: - output = validate(input_record) - except Exception as e: - output = f"Error during validation: {e}" + output = validate(input_record) context = { "input_record": input_record, From d641cac274286ab45c607cc92c561b00a21e0867 Mon Sep 17 00:00:00 2001 From: Rowan Moss Date: Thu, 11 Dec 2025 17:43:54 +0000 Subject: [PATCH 5/7] Add dropdown selection for record type - has to import the apel record type classes - has an option for all, which uses the record header instead --- .../templates/validator/validator_index.html | 20 +++++++++++ monitoring/validator/views.py | 34 +++++++++++++++++-- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/monitoring/validator/templates/validator/validator_index.html b/monitoring/validator/templates/validator/validator_index.html index b4369e7..533e1c0 100644 --- a/monitoring/validator/templates/validator/validator_index.html +++ b/monitoring/validator/templates/validator/validator_index.html @@ -15,6 +15,21 @@

Record Validator!

{% csrf_token %} + + +

Selecting 'All' will mean the type is determined by the record header.

+



- + +