diff --git a/coldfront/config/plugins/api.py b/coldfront/config/plugins/api.py index f0d05728bc..d99ef9a340 100644 --- a/coldfront/config/plugins/api.py +++ b/coldfront/config/plugins/api.py @@ -23,6 +23,6 @@ SPECTACULAR_SETTINGS = { "TITLE": "RTS Coldfront API", "DESCRIPTION": "HPC Project Management portal", - "VERSION": "2025.12.02", + "VERSION": "2026.10.08", "SERVE_INCLUDE_SCHEMA": False, } diff --git a/coldfront/core/grant/admin.py b/coldfront/core/grant/admin.py index f92121eff2..068e3c82f8 100644 --- a/coldfront/core/grant/admin.py +++ b/coldfront/core/grant/admin.py @@ -20,6 +20,7 @@ class GrantAdmin(SimpleHistoryAdmin): "project", "title", "grant_number", + "nyu_cayuse_id", "role", "grant_pi_full_name", "funding_agency", diff --git a/coldfront/core/grant/forms.py b/coldfront/core/grant/forms.py index b15cc083a7..45aebdf583 100644 --- a/coldfront/core/grant/forms.py +++ b/coldfront/core/grant/forms.py @@ -32,6 +32,7 @@ class Meta: def __init__(self, *args, **kwargs): super(GrantForm, self).__init__(*args, **kwargs) self.fields["funding_agency"].queryset = self.fields["funding_agency"].queryset.order_by("name") + self.fields["nyu_cayuse_id"].required = True self.fields["grant_start"].widget.attrs["class"] = "datepicker" self.fields["grant_end"].widget.attrs["class"] = "datepicker" diff --git a/coldfront/core/grant/migrations/0002_grant_nyu_cayuse_id_historicalgrant_nyu_cayuse_id.py b/coldfront/core/grant/migrations/0002_grant_nyu_cayuse_id_historicalgrant_nyu_cayuse_id.py new file mode 100644 index 0000000000..81171519f3 --- /dev/null +++ b/coldfront/core/grant/migrations/0002_grant_nyu_cayuse_id_historicalgrant_nyu_cayuse_id.py @@ -0,0 +1,23 @@ +# Generated by Django 5.2.18 on 2026-10-08 15:14 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('grant', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='grant', + name='nyu_cayuse_id', + field=models.CharField(default='', max_length=255, verbose_name='NYU Cayuse ID'), + ), + migrations.AddField( + model_name='historicalgrant', + name='nyu_cayuse_id', + field=models.CharField(default='', max_length=255, verbose_name='NYU Cayuse ID'), + ), + ] diff --git a/coldfront/core/grant/models.py b/coldfront/core/grant/models.py index a733497814..3519b369ba 100644 --- a/coldfront/core/grant/models.py +++ b/coldfront/core/grant/models.py @@ -68,6 +68,7 @@ class Grant(TimeStampedModel): project (Project): links the project to the grant title (str): grant title grant_number (str): grant number from agency used for identification + nyu_cayuse_id (str): NYU Cayuse ID for the grant role (str): role of the user in charge of the grant grant_pi_full_name (str): PI's name funding_agency (GrantFundingAgency): represents the agency funding the grant @@ -91,6 +92,7 @@ class Grant(TimeStampedModel): validators=[MinLengthValidator(3), MaxLengthValidator(255)], max_length=255, ) + nyu_cayuse_id = models.CharField("NYU Cayuse ID", max_length=255, default="") ROLE_CHOICES = ( ("PI", "Principal Investigator (PI)"), ("CoPI", "Co-Principal Investigator (CoPI)"), diff --git a/coldfront/core/grant/tests/tests.py b/coldfront/core/grant/tests/tests.py index cbcf6c511c..2e8cd34bb9 100644 --- a/coldfront/core/grant/tests/tests.py +++ b/coldfront/core/grant/tests/tests.py @@ -30,6 +30,7 @@ def __init__(self): "project": project, "title": "Quantum Halls", "grant_number": "12345", + "nyu_cayuse_id": "CAYUSE-12345", "role": "PI", "grant_pi_full_name": "Stephanie Foster", "funding_agency": grantFundingAgency, diff --git a/coldfront/core/grant/views.py b/coldfront/core/grant/views.py index e4c1cd4404..ad744f30c2 100644 --- a/coldfront/core/grant/views.py +++ b/coldfront/core/grant/views.py @@ -64,6 +64,7 @@ def form_valid(self, form): project=project_obj, title=form_data.get("title"), grant_number=form_data.get("grant_number"), + nyu_cayuse_id=form_data.get("nyu_cayuse_id"), role=form_data.get("role"), grant_pi_full_name=form_data.get("grant_pi_full_name"), funding_agency=form_data.get("funding_agency"), @@ -115,6 +116,7 @@ def test_func(self): fields = [ "title", "grant_number", + "nyu_cayuse_id", "role", "grant_pi_full_name", "funding_agency", diff --git a/coldfront/plugins/api/openapi.yaml b/coldfront/plugins/api/openapi.yaml index febba8c492..1ef3e58b8c 100644 --- a/coldfront/plugins/api/openapi.yaml +++ b/coldfront/plugins/api/openapi.yaml @@ -1,7 +1,7 @@ openapi: 3.0.3 info: title: RTS Coldfront API - version: 2025.12.02 + version: 2026.10.08 description: HPC Project Management portal paths: /api/allocation-change-requests/: diff --git a/coldfront/plugins/api/serializers.py b/coldfront/plugins/api/serializers.py index 8787d9b050..6de346e0d3 100644 --- a/coldfront/plugins/api/serializers.py +++ b/coldfront/plugins/api/serializers.py @@ -208,7 +208,7 @@ class GrantSerializer(serializers.ModelSerializer): class Meta: model = Grant - fields = ("title", "funding_agency", "total_amount_awarded", "status") + fields = ("title", "nyu_cayuse_id", "funding_agency", "total_amount_awarded", "status") class ProjectSerializer(serializers.ModelSerializer): diff --git a/coldfront/plugins/api/tests.py b/coldfront/plugins/api/tests.py index 2b71bf8fea..d62b46bc66 100644 --- a/coldfront/plugins/api/tests.py +++ b/coldfront/plugins/api/tests.py @@ -52,6 +52,7 @@ def setUpTestData(self): project=project, title="Test grant", grant_number="TEST-123", + nyu_cayuse_id="CAYUSE-123", role="PI", grant_pi_full_name="", funding_agency=GrantFundingAgency.objects.create(name="Test agency"), @@ -157,6 +158,7 @@ def test_project_query_params(self): [ { "title": "Test grant", + "nyu_cayuse_id": "CAYUSE-123", "funding_agency": "Test agency", "total_amount_awarded": 2000, "status": "Active",