Skip to content

Commit

Permalink
Merge branch 'master' into db-contrib/waltz-6098-assessment-ratings-i…
Browse files Browse the repository at this point in the history
…nto-groups
  • Loading branch information
davidwatkins73 authored Jul 26, 2022
2 parents ad89f90 + 72f6db9 commit 87ce214
Show file tree
Hide file tree
Showing 16 changed files with 404 additions and 103 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,9 @@ Provisional dates for upcoming releases:

Release | Date | Summary
--- | --- | ---
~1.42.1~ | ~4th July~ | Rolling the permission fixes into 1.43...
~1.42.1~ | ~4th July~ | Rolling the permission fixes into 1.43...
1.43 | 27th July | Enhanced permissions on assessments and flows, overlay diagram improvements etc..
1.44 | 6th September | tbd
1.44 | 6th September | tbd
1.45 | 18th October | tbd
1.46 | 22nd November | tbd

Expand Down
1 change: 1 addition & 0 deletions waltz-data/src/main/ddl/liquibase/db.changelog-1.43.xml
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@
remarks="the id of the entity being given specific permissions"/>
</changeSet>


<changeSet id="20220719-6139-1"
author="woodjes">
<insert tableName="role">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ public class ApplicationIdSelectorFactory implements Function<IdSelectionOptions
private static final LogicalFlow logicalFlow = LOGICAL_FLOW.as("lf");
private static final MeasurableRating measurableRating = MEASURABLE_RATING.as("mr");
private static final Person person = PERSON.as("p");
private static final Person reportee = PERSON.as("pr");
private static final PersonHierarchy personHierarchy = PERSON_HIERARCHY.as("ph");


Expand Down Expand Up @@ -506,7 +507,9 @@ private Select<Record1<Long>> mkForPersonReportees(IdSelectionOptions options) {
SelectConditionStep<Record1<String>> reporteeIds = DSL
.selectDistinct(personHierarchy.EMPLOYEE_ID)
.from(personHierarchy)
.where(personHierarchy.MANAGER_ID.eq(emp));
.innerJoin(reportee).on(personHierarchy.EMPLOYEE_ID.eq(reportee.EMPLOYEE_ID))
.where(personHierarchy.MANAGER_ID.eq(emp)
.and(reportee.IS_REMOVED.isFalse()));

Condition applicationConditions = SelectorUtilities.mkApplicationConditions(options);
Condition condition = involvement.ENTITY_KIND.eq(EntityKind.APPLICATION.name())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@

package org.finos.waltz.data.measurable_rating;

import org.finos.waltz.schema.tables.records.MeasurableRatingRecord;
import org.finos.waltz.common.exception.NotFoundException;
import org.finos.waltz.data.InlineSelectFieldFactory;
import org.finos.waltz.data.JooqUtilities;
Expand All @@ -31,26 +30,37 @@
import org.finos.waltz.model.tally.ImmutableMeasurableRatingTally;
import org.finos.waltz.model.tally.MeasurableRatingTally;
import org.finos.waltz.model.tally.Tally;
import org.finos.waltz.schema.Tables;
import org.finos.waltz.schema.tables.records.MeasurableRatingRecord;
import org.jooq.*;
import org.jooq.impl.DSL;
import org.jooq.lambda.tuple.Tuple3;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.sql.Timestamp;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.function.Function;

import static org.finos.waltz.schema.tables.Application.APPLICATION;
import static org.finos.waltz.schema.tables.Measurable.MEASURABLE;
import static org.finos.waltz.schema.tables.MeasurableRating.MEASURABLE_RATING;
import static java.lang.String.format;
import static java.util.Collections.emptySet;
import static org.finos.waltz.common.Checks.checkNotNull;
import static org.finos.waltz.common.DateTimeUtilities.toLocalDateTime;
import static org.finos.waltz.common.EnumUtilities.readEnum;
import static org.finos.waltz.common.ListUtilities.newArrayList;
import static org.finos.waltz.common.SetUtilities.asSet;
import static org.finos.waltz.common.SetUtilities.union;
import static org.finos.waltz.common.StringUtilities.firstChar;
import static org.finos.waltz.common.StringUtilities.notEmpty;
import static org.finos.waltz.schema.Tables.MEASURABLE_CATEGORY;
import static org.finos.waltz.schema.Tables.USER_ROLE;
import static org.finos.waltz.schema.tables.Application.APPLICATION;
import static org.finos.waltz.schema.tables.Measurable.MEASURABLE;
import static org.finos.waltz.schema.tables.MeasurableRating.MEASURABLE_RATING;
import static org.jooq.lambda.tuple.Tuple.tuple;

@Repository
public class MeasurableRatingDao {
Expand Down Expand Up @@ -320,4 +330,41 @@ private SelectJoinStep<Record> mkBaseQuery() {
.from(MEASURABLE_RATING);
}

public Set<Operation> calculateAmendedRatingOperations(Set<Operation> operationsForEntityAssessment,
EntityReference entityReference,
long measurableId,
String username) {

Field<Boolean> readOnlyRatingField = DSL.coalesce(MEASURABLE_RATING.IS_READONLY, DSL.val(false)).as("rating_read_only");

SelectConditionStep<Record3<String, Boolean, Boolean>> qry = dsl
.select(USER_ROLE.ROLE,
MEASURABLE_CATEGORY.EDITABLE,
readOnlyRatingField)
.from(MEASURABLE)
.leftJoin(MEASURABLE_CATEGORY).on(MEASURABLE_CATEGORY.ID.eq(Tables.MEASURABLE.MEASURABLE_CATEGORY_ID))
.leftJoin(MEASURABLE_RATING).on(Tables.MEASURABLE.ID.eq(MEASURABLE_RATING.MEASURABLE_ID)
.and(MEASURABLE_RATING.ENTITY_KIND.eq(entityReference.kind().name())
.and(MEASURABLE_RATING.ENTITY_ID.eq(entityReference.id()))))
.leftJoin(USER_ROLE).on(USER_ROLE.ROLE.eq(MEASURABLE_CATEGORY.RATING_EDITOR_ROLE)
.and(USER_ROLE.USER_NAME.eq(username)))
.where(MEASURABLE.ID.eq(measurableId));

Tuple3<Boolean, Boolean, Boolean> hasRoleAndDefinitionEditableAndIsReadOnly = qry
.fetchOne(r -> tuple(
notEmpty(r.get(USER_ROLE.ROLE)),
r.get(MEASURABLE_CATEGORY.EDITABLE),
r.get(readOnlyRatingField)));

if (!hasRoleAndDefinitionEditableAndIsReadOnly.v2) {
return emptySet();
} else if (hasRoleAndDefinitionEditableAndIsReadOnly.v3) {
return emptySet();
} else if (hasRoleAndDefinitionEditableAndIsReadOnly.v1) {
return union(operationsForEntityAssessment, asSet(Operation.ADD, Operation.UPDATE, Operation.REMOVE));
} else {
return operationsForEntityAssessment;
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,20 @@
import org.finos.waltz.model.measurable_rating_planned_decommission.ImmutableMeasurableRatingPlannedDecommission;
import org.finos.waltz.model.measurable_rating_planned_decommission.MeasurableRatingPlannedDecommission;
import org.jooq.*;
import org.jooq.impl.DSL;
import org.jooq.lambda.tuple.Tuple;
import org.jooq.lambda.tuple.Tuple2;
import org.jooq.lambda.tuple.Tuple3;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.util.Collection;
import java.util.Set;

import static java.util.Collections.emptySet;
import static org.finos.waltz.common.SetUtilities.union;
import static org.finos.waltz.common.StringUtilities.notEmpty;
import static org.finos.waltz.schema.Tables.*;
import static org.finos.waltz.schema.tables.MeasurableRating.MEASURABLE_RATING;
import static org.finos.waltz.schema.tables.MeasurableRatingPlannedDecommission.MEASURABLE_RATING_PLANNED_DECOMMISSION;
import static org.finos.waltz.schema.tables.MeasurableRatingReplacement.MEASURABLE_RATING_REPLACEMENT;
Expand All @@ -46,6 +52,8 @@
import static org.finos.waltz.common.DateTimeUtilities.toSqlDate;
import static org.finos.waltz.common.SetUtilities.asSet;
import static org.finos.waltz.model.EntityReference.mkRef;
import static org.immutables.value.internal.$guava$.collect.$Sets.intersection;
import static org.jooq.lambda.tuple.Tuple.tuple;

@Repository
public class MeasurableRatingPlannedDecommissionDao {
Expand Down Expand Up @@ -164,7 +172,7 @@ public Tuple2<Operation, Boolean> save(EntityReference entityReference,
MeasurableRatingPlannedDecommissionRecord existingDecommRecord = existingRecord.into(MEASURABLE_RATING_PLANNED_DECOMMISSION);
updateDecommDateOnRecord(existingDecommRecord, dateChange, userName);
boolean updatedRecord = existingDecommRecord.update() == 1;
return Tuple.tuple(Operation.UPDATE, updatedRecord);
return tuple(Operation.UPDATE, updatedRecord);
} else {
MeasurableRatingPlannedDecommissionRecord record = dsl.newRecord(MEASURABLE_RATING_PLANNED_DECOMMISSION);
updateDecommDateOnRecord(record, dateChange, userName);
Expand All @@ -174,7 +182,7 @@ public Tuple2<Operation, Boolean> save(EntityReference entityReference,
record.setEntityKind(entityReference.kind().name());
record.setMeasurableId(measurableId);
boolean recordsInserted = record.insert() == 1;
return Tuple.tuple(Operation.ADD, recordsInserted);
return tuple(Operation.ADD, recordsInserted);
}
}

Expand Down Expand Up @@ -211,7 +219,6 @@ private void checkIfReadOnly(EntityReference entityReference, long measurableId)
}



private void updateDecommDateOnRecord(MeasurableRatingPlannedDecommissionRecord record,
DateFieldChange dateChange,
String userName) {
Expand All @@ -220,4 +227,28 @@ private void updateDecommDateOnRecord(MeasurableRatingPlannedDecommissionRecord
record.setPlannedDecommissionDate(toSqlDate(dateChange.newVal()));
}

public Set<Operation> calculateAmendedDecommOperations(Set<Operation> operationsForEntityAssessment,
long measurableCategoryId,
String username) {

Tuple2<Boolean, Boolean> hasRoleAndCategoryEditable = dsl
.select(USER_ROLE.ROLE,
MEASURABLE_CATEGORY.EDITABLE)
.from(MEASURABLE_CATEGORY)
.leftJoin(USER_ROLE)
.on(USER_ROLE.ROLE.eq(MEASURABLE_CATEGORY.RATING_EDITOR_ROLE)
.and(USER_ROLE.USER_NAME.eq(username)))
.where(MEASURABLE_CATEGORY.ID.eq(measurableCategoryId))
.fetchOne(r -> tuple(
notEmpty(r.get(USER_ROLE.ROLE)),
r.get(MEASURABLE_CATEGORY.EDITABLE)));

if (!hasRoleAndCategoryEditable.v2) {
return emptySet();
} else if (hasRoleAndCategoryEditable.v1) {
return union(operationsForEntityAssessment, asSet(Operation.ADD, Operation.UPDATE, Operation.REMOVE));
} else {
return operationsForEntityAssessment;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,11 @@
import java.util.Date;
import java.util.Set;

import static java.util.Collections.emptySet;
import static org.finos.waltz.common.SetUtilities.union;
import static org.finos.waltz.common.StringUtilities.notEmpty;
import static org.finos.waltz.schema.Tables.MEASURABLE_CATEGORY;
import static org.finos.waltz.schema.Tables.USER_ROLE;
import static org.finos.waltz.schema.tables.MeasurableRatingPlannedDecommission.MEASURABLE_RATING_PLANNED_DECOMMISSION;
import static org.finos.waltz.schema.tables.MeasurableRatingReplacement.MEASURABLE_RATING_REPLACEMENT;
import static org.finos.waltz.common.Checks.checkNotNull;
Expand Down Expand Up @@ -179,4 +184,29 @@ public boolean remove(long decommId, long replacementId) {
.execute() == 1;

}

public Set<Operation> calculateAmendedReplacementOperations(Set<Operation> operationsForEntityAssessment,
long categoryId,
String username) {

Tuple2<Boolean, Boolean> hasRoleAndCategoryEditable = dsl
.select(USER_ROLE.ROLE,
MEASURABLE_CATEGORY.EDITABLE)
.from(MEASURABLE_CATEGORY)
.leftJoin(USER_ROLE)
.on(USER_ROLE.ROLE.eq(MEASURABLE_CATEGORY.RATING_EDITOR_ROLE)
.and(USER_ROLE.USER_NAME.eq(username)))
.where(MEASURABLE_CATEGORY.ID.eq(categoryId))
.fetchOne(r -> tuple(
notEmpty(r.get(USER_ROLE.ROLE)),
r.get(MEASURABLE_CATEGORY.EDITABLE)));

if (!hasRoleAndCategoryEditable.v2) {
return emptySet();
} else if (hasRoleAndCategoryEditable.v1) {
return union(operationsForEntityAssessment, asSet(Operation.ADD, Operation.UPDATE, Operation.REMOVE));
} else {
return operationsForEntityAssessment;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ public enum SystemRole {
ATTESTATION_ADMIN,
AUTHORITATIVE_SOURCE_EDITOR,
BETA_TESTER,
BULK_FLOW_EDITOR,
BOOKMARK_EDITOR,
CAPABILITY_EDITOR,
CHANGE_INITIATIVE_EDITOR,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,26 +34,43 @@
</button>
<button type="button"
class="btn btn-xs btn-primary"
waltz-has-role="LOGICAL_DATA_FLOW_EDITOR"
waltz-has-role="BULK_FLOW_EDITOR"
uib-dropdown-toggle>
<span class="caret"></span>
</button>
<ul uib-dropdown-menu
class="dropdown-menu"
role="menu"
waltz-has-role="LOGICAL_DATA_FLOW_EDITOR">
waltz-has-role="BULK_FLOW_EDITOR">
<li role="menuitem">
<a href=""
ng-click="$ctrl.bulkLoad()"
class="small">
<waltz-icon name="upload"></waltz-icon>
Bulk Insert
<span style="padding-left: 1em">
<waltz-icon name="upload"></waltz-icon>
Bulk Insert
</span>
</a>
</li>
</ul>
</div>
</div>

<div style="display: inline-block"
ng-if="!$ctrl.canEdit && $ctrl.activeTab.id === 'SUMMARY' && !$ctrl.isAnyEditorVisible()">
<div class="btn-group"
uib-dropdown>
<button type="button"
class="btn btn-xs btn-primary"
waltz-has-role="BULK_FLOW_EDITOR"
data-ux="logical-flow-switch-to-edit-mode"
ng-click="$ctrl.bulkLoad()">
<waltz-icon name="upload"></waltz-icon>
Bulk Insert
</button>
</div>
</div>


<a ng-if="$ctrl.isAnyEditorVisible()"
ng-click="$ctrl.resetToViewMode()"
Expand All @@ -74,27 +91,44 @@
Edit
</a>
<button type="button"
waltz-has-role="LOGICAL_DATA_FLOW_EDITOR"
waltz-has-role="BULK_FLOW_EDITOR"
class="btn btn-xs btn-primary"
uib-dropdown-toggle>
<span class="caret"></span>
</button>
<ul uib-dropdown-menu
class="dropdown-menu"
role="menu"
waltz-has-role="LOGICAL_DATA_FLOW_EDITOR">
waltz-has-role="BULK_FLOW_EDITOR">
<li role="menuitem">
<a href=""
ng-click="$ctrl.bulkLoad()"
class="small">
<waltz-icon name="upload"></waltz-icon>
Bulk Insert
<span style="padding-left: 1em">
<waltz-icon name="upload"></waltz-icon>
Bulk Insert
</span>
</a>
</li>
</ul>
</div>
</div>

<div style="display: inline-block"
ng-if="!$ctrl.canEdit && $ctrl.activeTab.id === 'PHYSICAL' && !$ctrl.isAnyEditorVisible()">
<div class="btn-group"
uib-dropdown>
<button type="button"
class="btn btn-xs btn-primary"
waltz-has-role="BULK_FLOW_EDITOR"
data-ux="logical-flow-switch-to-edit-mode"
ng-click="$ctrl.bulkLoad()">
<waltz-icon name="upload"></waltz-icon>
Bulk Insert
</button>
</div>
</div>

<span>
<button style="display: inline-block"
class="btn btn-xs waltz-btn-transparent"
Expand Down
Loading

0 comments on commit 87ce214

Please sign in to comment.