From bfb3da3dc0482bc592799259390621b8b1c59cd3 Mon Sep 17 00:00:00 2001 From: Fabio Buso Date: Sat, 14 Oct 2023 17:19:50 +0200 Subject: [PATCH] [HWORKS-783] Cleanup PIA functionality (#1577) --- .../hopsworks/api/project/ProjectService.java | 30 -- .../common/dao/project/pia/PiaFacade.java | 96 ---- .../persistence/entity/project/pia/Pia.java | 423 ------------------ .../main/resources/META-INF/persistence.xml | 1 - .../controllers/projectSettingsCtrl.js | 54 +-- .../yo/app/scripts/services/ProjectService.js | 9 - .../yo/app/views/projectSettings.html | 133 +----- 7 files changed, 6 insertions(+), 740 deletions(-) delete mode 100644 hopsworks-common/src/main/java/io/hops/hopsworks/common/dao/project/pia/PiaFacade.java delete mode 100644 hopsworks-persistence/src/main/java/io/hops/hopsworks/persistence/entity/project/pia/Pia.java diff --git a/hopsworks-api/src/main/java/io/hops/hopsworks/api/project/ProjectService.java b/hopsworks-api/src/main/java/io/hops/hopsworks/api/project/ProjectService.java index 87993d6631..de712e16f0 100644 --- a/hopsworks-api/src/main/java/io/hops/hopsworks/api/project/ProjectService.java +++ b/hopsworks-api/src/main/java/io/hops/hopsworks/api/project/ProjectService.java @@ -68,7 +68,6 @@ import io.hops.hopsworks.common.dao.dataset.DatasetFacade; import io.hops.hopsworks.common.dao.hdfs.inode.InodeFacade; import io.hops.hopsworks.common.dao.project.ProjectFacade; -import io.hops.hopsworks.common.dao.project.pia.PiaFacade; import io.hops.hopsworks.common.dao.user.UserFacade; import io.hops.hopsworks.common.dataset.DatasetController; import io.hops.hopsworks.common.dataset.FilePreviewDTO; @@ -104,7 +103,6 @@ import io.hops.hopsworks.persistence.entity.hdfs.inode.Inode; import io.hops.hopsworks.persistence.entity.jobs.quota.YarnPriceMultiplicator; import io.hops.hopsworks.persistence.entity.project.Project; -import io.hops.hopsworks.persistence.entity.project.pia.Pia; import io.hops.hopsworks.persistence.entity.project.service.ProjectServiceEnum; import io.hops.hopsworks.persistence.entity.project.team.ProjectTeam; import io.hops.hopsworks.persistence.entity.user.Users; @@ -199,8 +197,6 @@ public class ProjectService { @EJB private AuthController authController; @EJB - private PiaFacade piaFacade; - @EJB private JWTHelper jWTHelper; @Inject private InferenceResource inference; @@ -721,32 +717,6 @@ public ProjectActivitiesResource activities(@PathParam("projectId") Integer id) return this.activitiesResource; } - @PUT - @Path("{projectId}/pia") - @Consumes(MediaType.APPLICATION_JSON) - @AllowedProjectRoles({AllowedProjectRoles.DATA_OWNER}) - public Response updatePia(Pia pia, @PathParam("projectId") Integer projectId, @Context SecurityContext sc) { - piaFacade.mergeUpdate(pia, projectId); - return noCacheResponse.getNoCacheResponseBuilder(Response.Status.OK).build(); - } - - @GET - @Path("{projectId}/pia") - @Produces(MediaType.APPLICATION_JSON) - @AllowedProjectRoles({AllowedProjectRoles.DATA_SCIENTIST, AllowedProjectRoles.DATA_OWNER}) - public Response getPia(@PathParam("projectId") Integer projectId, @Context SecurityContext sc) - throws ProjectException { - Project project = projectController.findProjectById(projectId); - if (project == null) { - throw new ProjectException(RESTCodes.ProjectErrorCode.PROJECT_NOT_FOUND, Level.FINE, "projectId: " + projectId); - } - Pia pia = piaFacade.findByProject(projectId); - GenericEntity genericPia = new GenericEntity(pia) { - }; - - return noCacheResponse.getNoCacheResponseBuilder(Response.Status.OK).entity(genericPia).build(); - } - @ApiOperation(value = "Model inference sub-resource", tags = {"Inference"}) @Path("/{projectId}/inference") diff --git a/hopsworks-common/src/main/java/io/hops/hopsworks/common/dao/project/pia/PiaFacade.java b/hopsworks-common/src/main/java/io/hops/hopsworks/common/dao/project/pia/PiaFacade.java deleted file mode 100644 index 0bbbda2787..0000000000 --- a/hopsworks-common/src/main/java/io/hops/hopsworks/common/dao/project/pia/PiaFacade.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Changes to this file committed after and not including commit-id: ccc0d2c5f9a5ac661e60e6eaf138de7889928b8b - * are released under the following license: - * - * This file is part of Hopsworks - * Copyright (C) 2018, Logical Clocks AB. All rights reserved - * - * Hopsworks is free software: you can redistribute it and/or modify it under the terms of - * the GNU Affero General Public License as published by the Free Software Foundation, - * either version 3 of the License, or (at your option) any later version. - * - * Hopsworks is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License along with this program. - * If not, see . - * - * Changes to this file committed before and including commit-id: ccc0d2c5f9a5ac661e60e6eaf138de7889928b8b - * are released under the following license: - * - * Copyright (C) 2013 - 2018, Logical Clocks AB and RISE SICS AB. All rights reserved - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of this - * software and associated documentation files (the "Software"), to deal in the Software - * without restriction, including without limitation the rights to use, copy, modify, merge, - * publish, distribute, sublicense, and/or sell copies of the Software, and to permit - * persons to whom the Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all copies or - * substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING - * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -package io.hops.hopsworks.common.dao.project.pia; - -import io.hops.hopsworks.common.dao.AbstractFacade; -import io.hops.hopsworks.persistence.entity.project.pia.Pia; - -import java.util.ArrayList; -import java.util.List; -import javax.ejb.Stateless; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.TypedQuery; - -@Stateless -public class PiaFacade extends AbstractFacade { - - @PersistenceContext(unitName = "kthfsPU") - private EntityManager em; - - @Override - protected EntityManager getEntityManager() { - return em; - } - - public PiaFacade() { - super(Pia.class); - } - - public Pia findByProject(int projectId) { - TypedQuery q = em.createNamedQuery("Pia.findByProjectId", Pia.class); - q.setParameter("projectId", projectId); - List allPias = q.getResultList(); - if (allPias == null || allPias.isEmpty()) { - Pia p = new Pia(); - p.setProjectId(projectId); - allPias = new ArrayList<>(); - allPias.add(p); - } - return allPias.iterator().next(); - } - -// public Pia findByProject(Project project) { -// Collection allPias = project.getPiaCollection(); -// if (allPias == null || allPias.isEmpty()) { -// Pia p = new Pia(); -// p.setProjectId(project); -// allPias = new ArrayList<>(); -// allPias.add(p); -// } -// return allPias.iterator().next(); -// } - public Pia mergeUpdate(Pia pia, int projectId) { - Pia piaManaged = findByProject(projectId); - pia.setProjectId(projectId); - piaManaged.deepCopy(pia); - return update(piaManaged); - } -} diff --git a/hopsworks-persistence/src/main/java/io/hops/hopsworks/persistence/entity/project/pia/Pia.java b/hopsworks-persistence/src/main/java/io/hops/hopsworks/persistence/entity/project/pia/Pia.java deleted file mode 100644 index 5ed14af074..0000000000 --- a/hopsworks-persistence/src/main/java/io/hops/hopsworks/persistence/entity/project/pia/Pia.java +++ /dev/null @@ -1,423 +0,0 @@ -/* - * This file is part of Hopsworks - * Copyright (C) 2018, Logical Clocks AB. All rights reserved - - * Hopsworks is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * Hopsworks is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ -package io.hops.hopsworks.persistence.entity.project.pia; - -import java.io.Serializable; -import javax.persistence.Basic; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.Table; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; -import javax.xml.bind.annotation.XmlRootElement; - -@Entity -@Table(name = "pia", - catalog = "hopsworks", - schema = "") -@XmlRootElement -@NamedQueries({ - @NamedQuery(name = "Pia.findAll", - query = "SELECT p FROM Pia p") - , - @NamedQuery(name = "Pia.findById", - query = "SELECT p FROM Pia p WHERE p.id = :id") - , - @NamedQuery(name = "Pia.findByPersonalData", - query = "SELECT p FROM Pia p WHERE p.personalData = :personalData") - , - @NamedQuery(name = "Pia.findByHowDataCollected", - query - = "SELECT p FROM Pia p WHERE p.howDataCollected = :howDataCollected") - , - @NamedQuery(name = "Pia.findBySpecifiedExplicitLegitimate", - query - = "SELECT p FROM Pia p WHERE p.specifiedExplicitLegitimate = :specifiedExplicitLegitimate") - , - @NamedQuery(name = "Pia.findByConsentProcess", - query - = "SELECT p FROM Pia p WHERE p.consentProcess = :consentProcess") - , - @NamedQuery(name = "Pia.findByConsentBasis", - query = "SELECT p FROM Pia p WHERE p.consentBasis = :consentBasis") - , - @NamedQuery(name = "Pia.findByDataMinimized", - query = "SELECT p FROM Pia p WHERE p.dataMinimized = :dataMinimized") - , - @NamedQuery(name = "Pia.findByDataUptodate", - query = "SELECT p FROM Pia p WHERE p.dataUptodate = :dataUptodate") - , - @NamedQuery(name = "Pia.findByUsersInformedHow", - query - = "SELECT p FROM Pia p WHERE p.usersInformedHow = :usersInformedHow") - , - @NamedQuery(name = "Pia.findByUserControlsDataCollectionRetention", - query - = "SELECT p FROM Pia p WHERE p.userControlsDataCollectionRetention = :userControlsDataCollectionRetention") - , - @NamedQuery(name = "Pia.findByDataEncrypted", - query = "SELECT p FROM Pia p WHERE p.dataEncrypted = :dataEncrypted") - , - @NamedQuery(name = "Pia.findByDataAnonymized", - query - = "SELECT p FROM Pia p WHERE p.dataAnonymized = :dataAnonymized") - , - @NamedQuery(name = "Pia.findByDataPseudonymized", - query - = "SELECT p FROM Pia p WHERE p.dataPseudonymized = :dataPseudonymized") - , - @NamedQuery(name = "Pia.findByDataBackedup", - query = "SELECT p FROM Pia p WHERE p.dataBackedup = :dataBackedup") - , - @NamedQuery(name = "Pia.findByDataSecurityMeasures", - query - = "SELECT p FROM Pia p WHERE p.dataSecurityMeasures = :dataSecurityMeasures") - , - @NamedQuery(name = "Pia.findByDataPortabilityMeasure", - query - = "SELECT p FROM Pia p WHERE p.dataPortabilityMeasure = :dataPortabilityMeasure") - , - @NamedQuery(name = "Pia.findBySubjectAccessRights", - query - = "SELECT p FROM Pia p WHERE p.subjectAccessRights = :subjectAccessRights") - , - @NamedQuery(name = "Pia.findByProjectId", - query - = "SELECT p FROM Pia p WHERE p.projectId = :projectId") - , - @NamedQuery(name = "Pia.findByRisks", - query = "SELECT p FROM Pia p WHERE p.risks = :risks")}) -public class Pia implements Serializable { - - private static final long serialVersionUID = 1L; - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Basic(optional = false) - @Column(name = "id") - private Long id; - @Basic(optional = false) - @NotNull - @Size(min = 1, - max = 4000) - @Column(name = "personal_data") - private String personalData=" "; - @Basic(optional = false) - @NotNull - @Size(min = 1, - max = 2000) - @Column(name = "how_data_collected") - private String howDataCollected=" "; - @Basic(optional = false) - @NotNull - @Column(name = "specified_explicit_legitimate") - private int specifiedExplicitLegitimate; - @Size(max = 1000) - @Column(name = "consent_process") - private String consentProcess=" "; - @Size(max = 1000) - @Column(name = "consent_basis") - private String consentBasis=" "; - @Basic(optional = false) - @NotNull - @Column(name = "data_minimized") - private int dataMinimized=0; - @Basic(optional = false) - @NotNull - @Column(name = "data_uptodate") - private int dataUptodate=0; - @Basic(optional = false) - @NotNull - @Size(min = 1, - max = 500) - @Column(name = "users_informed_how") - private String usersInformedHow=" "; - @Basic(optional = false) - @NotNull - @Size(min = 1, - max = 500) - @Column(name = "user_controls_data_collection_retention") - private String userControlsDataCollectionRetention=" "; - @Basic(optional = false) - @NotNull - @Column(name = "data_encrypted") - private int dataEncrypted=0; - @Basic(optional = false) - @NotNull - @Column(name = "data_anonymized") - private int dataAnonymized=0; - @Basic(optional = false) - @NotNull - @Column(name = "data_pseudonymized") - private int dataPseudonymized=0; - @Basic(optional = false) - @NotNull - @Column(name = "data_backedup") - private int dataBackedup=0; - @Basic(optional = false) - @NotNull - @Size(min = 1, - max = 500) - @Column(name = "data_security_measures") - private String dataSecurityMeasures=" "; - @Basic(optional = false) - @NotNull - @Size(min = 1, - max = 500) - @Column(name = "data_portability_measure") - private String dataPortabilityMeasure=" "; - @Basic(optional = false) - @NotNull - @Size(min = 1, - max = 500) - @Column(name = "subject_access_rights") - private String subjectAccessRights=" "; - @Basic(optional = false) - @NotNull - @Size(min = 1, - max = 2000) - @Column(name = "risks") - private String risks=" "; -// @JoinColumn(name = "project_id", -// referencedColumnName = "id") -// @ManyToOne(optional = false) -// @Nullable -// private Project projectId = null; - - @Basic(optional = false) - @Column(name = "project_id") - private int projectId = 0; - - public Pia() { - } - - public void deepCopy(Pia that) { - this.consentBasis = that.consentBasis; - this.consentProcess = that.consentProcess; - this.dataAnonymized = that.dataAnonymized; - this.dataBackedup = that.dataBackedup; - this.dataEncrypted = that.dataEncrypted; - this.dataMinimized = that.dataMinimized; - this.dataPortabilityMeasure = that.dataPortabilityMeasure; - this.dataPseudonymized = that.dataPseudonymized; - this.dataSecurityMeasures = that.dataSecurityMeasures; - this.dataUptodate = that.dataUptodate; - this.howDataCollected = that.howDataCollected; - this.personalData = that.personalData; - this.projectId = that.projectId; - this.risks = that.risks; - this.specifiedExplicitLegitimate = that.specifiedExplicitLegitimate; - this.subjectAccessRights = that.subjectAccessRights; - this.userControlsDataCollectionRetention = that.userControlsDataCollectionRetention; - this.usersInformedHow = that.usersInformedHow; - } - - public Pia(Long id) { - this.id = id; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getPersonalData() { - return personalData; - } - - public void setPersonalData(String personalData) { - this.personalData = personalData; - } - - public String getHowDataCollected() { - return howDataCollected; - } - - public void setHowDataCollected(String howDataCollected) { - this.howDataCollected = howDataCollected; - } - - public int getSpecifiedExplicitLegitimate() { - return specifiedExplicitLegitimate; - } - - public void setSpecifiedExplicitLegitimate(int specifiedExplicitLegitimate) { - this.specifiedExplicitLegitimate = specifiedExplicitLegitimate; - } - - public String getConsentProcess() { - return consentProcess; - } - - public void setConsentProcess(String consentProcess) { - this.consentProcess = consentProcess; - } - - public String getConsentBasis() { - return consentBasis; - } - - public void setConsentBasis(String consentBasis) { - this.consentBasis = consentBasis; - } - - public int getDataMinimized() { - return dataMinimized; - } - - public void setDataMinimized(int dataMinimized) { - this.dataMinimized = dataMinimized; - } - - public int getDataUptodate() { - return dataUptodate; - } - - public void setDataUptodate(int dataUptodate) { - this.dataUptodate = dataUptodate; - } - - public String getUsersInformedHow() { - return usersInformedHow; - } - - public void setUsersInformedHow(String usersInformedHow) { - this.usersInformedHow = usersInformedHow; - } - - public String getUserControlsDataCollectionRetention() { - return userControlsDataCollectionRetention; - } - - public void setUserControlsDataCollectionRetention(String userControlsDataCollectionRetention) { - this.userControlsDataCollectionRetention = userControlsDataCollectionRetention; - } - - public int getDataEncrypted() { - return dataEncrypted; - } - - public void setDataEncrypted(int dataEncrypted) { - this.dataEncrypted = dataEncrypted; - } - - public int getDataAnonymized() { - return dataAnonymized; - } - - public void setDataAnonymized(int dataAnonymized) { - this.dataAnonymized = dataAnonymized; - } - - public int getDataPseudonymized() { - return dataPseudonymized; - } - - public void setDataPseudonymized(int dataPseudonymized) { - this.dataPseudonymized = dataPseudonymized; - } - - public int getDataBackedup() { - return dataBackedup; - } - - public void setDataBackedup(int dataBackedup) { - this.dataBackedup = dataBackedup; - } - - public String getDataSecurityMeasures() { - return dataSecurityMeasures; - } - - public void setDataSecurityMeasures(String dataSecurityMeasures) { - this.dataSecurityMeasures = dataSecurityMeasures; - } - - public String getDataPortabilityMeasure() { - return dataPortabilityMeasure; - } - - public void setDataPortabilityMeasure(String dataPortabilityMeasure) { - this.dataPortabilityMeasure = dataPortabilityMeasure; - } - - public String getSubjectAccessRights() { - return subjectAccessRights; - } - - public void setSubjectAccessRights(String subjectAccessRights) { - this.subjectAccessRights = subjectAccessRights; - } - - public String getRisks() { - return risks; - } - - public void setRisks(String risks) { - this.risks = risks; - } - -// public Project getProjectId() { -// return projectId; -// } -// -// public void setProjectId(Project projectId) { -// this.projectId = projectId; -// } - - public int getProjectId() { - return projectId; - } - - public void setProjectId(int projectId) { - this.projectId = projectId; - } - - @Override - public int hashCode() { - int hash = 0; - hash += (id != null ? id.hashCode() : 0); - return hash; - } - - @Override - public boolean equals(Object object) { - // TODO: Warning - this method won't work in the case the id fields are not set - if (!(object instanceof Pia)) { - return false; - } - Pia other = (Pia) object; - if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { - return false; - } - return true; - } - - @Override - public String toString() { - return "io.hops.hopsworks.persistence.entity.project.pia.Pia[ id=" + id + " ]"; - } - -} diff --git a/hopsworks-persistence/src/main/resources/META-INF/persistence.xml b/hopsworks-persistence/src/main/resources/META-INF/persistence.xml index 004a2ebd2a..f6e4dfcd18 100644 --- a/hopsworks-persistence/src/main/resources/META-INF/persistence.xml +++ b/hopsworks-persistence/src/main/resources/META-INF/persistence.xml @@ -121,7 +121,6 @@ io.hops.hopsworks.persistence.entity.project.Project io.hops.hopsworks.persistence.entity.project.service.ProjectServices io.hops.hopsworks.persistence.entity.project.team.ProjectTeam - io.hops.hopsworks.persistence.entity.project.pia.Pia io.hops.hopsworks.persistence.entity.project.jobs.DefaultJobConfiguration io.hops.hopsworks.persistence.entity.provenance.FeatureGroupLink io.hops.hopsworks.persistence.entity.provenance.FeatureViewLink diff --git a/hopsworks-web/yo/app/scripts/controllers/projectSettingsCtrl.js b/hopsworks-web/yo/app/scripts/controllers/projectSettingsCtrl.js index e9b4551f99..42485b4e8c 100644 --- a/hopsworks-web/yo/app/scripts/controllers/projectSettingsCtrl.js +++ b/hopsworks-web/yo/app/scripts/controllers/projectSettingsCtrl.js @@ -50,59 +50,11 @@ angular.module('hopsWorksApp') self.projectId = $routeParams.projectID; self.quotas = {}; self.versions = []; - self.pia = { - "id": "", - "personalData": "", - "howDataCollected": "", - "specifiedExplicitLegitimate": 0, - "consentProcess": "", - "consentBasis": "", - "dataMinimized": 0, - "dataUptodate": 0, - "usersInformed_how": "", - "userControlsDataCollectionRetention": "", - "dataEncrypted": 0, - "dataAnonymized": 0, - "dataPseudonymized": 0, - "dataBackedup": 0, - "dataSecurityMeasures": "", - "dataPortabilityMeasure": "", - "subjectAccessRights": "", - "risks": "" - }; - var getPia = function () { - ProjectService.getPia({id: self.projectId}).$promise.then( - function (success) { - self.pia = success; - }, function (error) { - growl.error(error.data.errorMsg, {title: 'Error getting Pia', ttl: 5000}); - $location.path('/'); - }); + self.onSuccess = function (e) { + growl.success("Copied to clipboard", {title: '', ttl: 1000}); + e.clearSelection(); }; - getPia(); - - self.savePia = function () { - var forms = document.getElementsByClassName('needs-validation'); - Array.prototype.filter.call(forms, function (form) { - form.addEventListener('submit', function (event) { - if (form.checkValidity() === false) { - event.preventDefault(); - event.stopPropagation(); - } - form.classList.add('was-validated'); - }, false); - }); - - ProjectService.savePia({id: self.projectId}, self.pia) - .$promise.then(function (success) { - growl.success("Saved Pia", {title: 'Saved', ttl: 2000}); - }, function (error) { - self.working = false; - growl.warning("Error: " + error.data.errorMsg, {title: 'Error', ttl: 5000}); - }); - }; - self.getQuotas = function () { ProjectService.getQuotas({id: self.projectId}).$promise.then( diff --git a/hopsworks-web/yo/app/scripts/services/ProjectService.js b/hopsworks-web/yo/app/scripts/services/ProjectService.js index fae803ea85..7c19a24ef0 100644 --- a/hopsworks-web/yo/app/scripts/services/ProjectService.js +++ b/hopsworks-web/yo/app/scripts/services/ProjectService.js @@ -104,15 +104,6 @@ angular.module('hopsWorksApp') url: '/api/project/:id/getInodeInfo/:inodeId', 'method': 'GET' }, - "getPia":{ - url: '/api/project/:id/pia', - 'method': 'GET' - }, - "savePia": { - 'method': 'PUT', - headers: {'Content-Type': 'application/json; charset=UTF-8'}, - url: '/api/project/:id/pia' - }, "getProjectProvenanceStatus": { url: '/api/project/:id/provenance?type=PROJECT', method: 'GET' diff --git a/hopsworks-web/yo/app/views/projectSettings.html b/hopsworks-web/yo/app/views/projectSettings.html index 8c9bf2182f..074c722c3c 100644 --- a/hopsworks-web/yo/app/views/projectSettings.html +++ b/hopsworks-web/yo/app/views/projectSettings.html @@ -250,134 +250,7 @@
Set a default Job Configuration for all new Jobs. The Python and Spark confi - -

Privacy Impact Assessment

- -
-
- - -
- -
- - -
-
- - -
- -
- - -
-
- - -
- -
- - -
-
- - -
-
- - -
-
- - -
-
- - -
- -
- -
- -
-
- -
-
- -
-
-
- - -
-
- - -
-
- - -
-
- - - -
-
- - - -
- -
- -
-
-
- +

Hopsworks Software Versions

@@ -398,7 +271,7 @@

Hopsworks Software Versions

- +

Hopsworks Provenance Settings

@@ -485,7 +358,7 @@

Hopsworks Provenance Settings

- +

Project alert settings