diff --git a/backend/core/admin.py b/backend/core/admin.py index ec23519..8410dfd 100644 --- a/backend/core/admin.py +++ b/backend/core/admin.py @@ -54,13 +54,13 @@ def has_add_permission(self, request): @admin.register(ProductContent) class ProductContentAdmin(admin.ModelAdmin): - list_display = ("id", "product", "column_name", "ucd", "order") + list_display = ("id", "product", "column_name", "ucd", "alias", "order") def has_add_permission(self, request): return False - def has_change_permission(self, request, obj=None): - return False + # def has_change_permission(self, request, obj=None): + # return False def has_delete_permission(self, request, obj=None): return False diff --git a/backend/core/migrations/0026_productcontent_alias.py b/backend/core/migrations/0026_productcontent_alias.py new file mode 100644 index 0000000..e4f9b48 --- /dev/null +++ b/backend/core/migrations/0026_productcontent_alias.py @@ -0,0 +1,18 @@ +# Generated by Django 4.0.2 on 2023-07-25 17:21 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0025_remove_product_survey'), + ] + + operations = [ + migrations.AddField( + model_name='productcontent', + name='alias', + field=models.CharField(blank=True, max_length=256, null=True, verbose_name='Alias'), + ), + ] diff --git a/backend/core/models/product_content.py b/backend/core/models/product_content.py index e027137..c670965 100644 --- a/backend/core/models/product_content.py +++ b/backend/core/models/product_content.py @@ -27,5 +27,8 @@ class ProductContent(models.Model): default=0, ) + alias = models.CharField( + max_length=256, verbose_name="Alias", null=True, blank=True) + def __str__(self): return f"{self.product.display_name} - {self.column_name}" diff --git a/backend/pzserver/urls.py b/backend/pzserver/urls.py index 9bbc18f..3859891 100644 --- a/backend/pzserver/urls.py +++ b/backend/pzserver/urls.py @@ -28,6 +28,7 @@ ) from django.contrib import admin from django.urls import include, path +from pzserver.views import update_aliases from drf_spectacular.views import ( SpectacularAPIView, SpectacularRedocView, @@ -58,6 +59,8 @@ path("api/logged_user/", LoggedUserView.as_view(), name="logged_user"), path("api/logout/", Logout.as_view(), name="logout"), path("api/shib/", include("core.shibboleth_urls", namespace="shibboleth")), + # API ALIAS + path('api/update-aliases/', update_aliases, name='update_aliases'), # API DOCs path("api/schema/", SpectacularAPIView.as_view(), name="schema"), path( diff --git a/backend/pzserver/views.py b/backend/pzserver/views.py new file mode 100644 index 0000000..f82c506 --- /dev/null +++ b/backend/pzserver/views.py @@ -0,0 +1,29 @@ +from rest_framework.decorators import api_view, permission_classes +from rest_framework.permissions import IsAuthenticated +from rest_framework.response import Response +from core.models import ProductContent +from django.views.decorators.csrf import csrf_exempt + +@api_view(['POST']) +@permission_classes([IsAuthenticated]) +@csrf_exempt +def update_aliases(request): + data = request.data + product_id = data.get('productId') + updates = data.get('updates', []) + + try: + product_contents = ProductContent.objects.filter(product_id=product_id) + for update in updates: + content_id = update.get('id') + alias = update.get('alias') + if content_id and alias: + content = product_contents.get(pk=content_id) + content.alias = alias + content.save() + + return Response({'message': 'Aliases updated successfully.'}) + except ProductContent.DoesNotExist: + return Response({'error': 'Product not found.'}, status=404) + except Exception as e: + return Response({'error': str(e)}, status=500) diff --git a/frontend/components/newProduct/Step3.js b/frontend/components/newProduct/Step3.js index 024741d..623bcd2 100644 --- a/frontend/components/newProduct/Step3.js +++ b/frontend/components/newProduct/Step3.js @@ -16,6 +16,7 @@ import PropTypes from 'prop-types' import React, { useEffect, useRef, useState } from 'react' import { contentAssociation, getProductContents } from '../../services/product' import Loading from '../Loading' +import axios from 'axios' export default function NewProductStep3({ productId, onNext, onPrev }) { const ucds = [ @@ -118,8 +119,25 @@ export default function NewProductStep3({ productId, onNext, onPrev }) { ...prevState, [pc.column_name]: value })) + updateAliasOnServer(pc.id, value) } + const updateAliasOnServer = async (contentId, aliasValue) => { + try { + await axios.post('/api/update-aliases/', { + productId: productId, + updates: [ + { + id: contentId, + alias: aliasValue + } + ] + }); + } catch (error) { + console.error('Error updating alias:', error); + } + }; + const handleCancelEdit = pc => { const updatedEditableFields = { ...editableFields } delete updatedEditableFields[pc.column_name]