Skip to content

Commit

Permalink
Merge pull request #644 from MetadataRegistry/MET-612-data-model-poli…
Browse files Browse the repository at this point in the history
…cies

Met 612 data model policies
  • Loading branch information
musketyr committed May 27, 2016
2 parents 3ebb92c + c7b8bb6 commit 0ef3afc
Show file tree
Hide file tree
Showing 73 changed files with 1,542 additions and 135 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ Model catalogue core plugin (metadata registry)


def doWithSpring = {
ModelCatalogueTypes.CATALOGUE_ELEMENT.implementation = CatalogueElement
ModelCatalogueTypes.DATA_MODEL.implementation = DataModel
ModelCatalogueTypes.DATA_CLASS.implementation = DataClass
ModelCatalogueTypes.DATA_ELEMENT.implementation = DataElement
Expand Down Expand Up @@ -117,7 +118,8 @@ Model catalogue core plugin (metadata registry)
new UserMarshaller(),
new ChangeMarshaller(),
new ValidationRuleMarshaller(),
new ProgressMonitorMarshaller()
new ProgressMonitorMarshaller(),
new DataModelPolicyMarshaller()
]
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import org.modelcatalogue.core.DataModelPolicy

fixture{
for (int i = 1 ; i <= 12 ; i++) {
"DMP$i"(DataModelPolicy, name:"Policy $i", policyText: 'check dataType property "name" is unique')
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<div class="col-md-3">
<strong class="small">Data Model Policies</strong>
</div>
<div class="col-md-9">
<div ng-if="!editableForm.$visible">
<span ng-repeat="policy in element.policies" class="small"><a ng-href="{{policy.href()}}" target="_blank" title="{{policy.policyText}}"><catalogue-element-icon type="policy.elementType"></catalogue-element-icon> {{policy.name}}</a><br ng-if="!$last"/></span>
</div>
<div ng-if="editableForm.$visible">
<elements-as-tags elements="copy.policies"></elements-as-tags>
<input type="text" global="true" id="dataModelPolicy" placeholder="Data Model Policy" ng-model="copy.dataModelPolicy" catalogue-element-picker="dataModelPolicy" label="el.name" typeahead-on-select="copy.policies.push(copy.dataModelPolicy);copy.dataModelPolicy = null">
</div>
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<div class="col-md-3">
<strong class="small">Data Type</strong>
</div>
<div class="full-width-editable col-md-9">
<div ng-if="editableForm.$visible">
<input type="text" id="dataType" placeholder="Data Type" ng-model="copy.dataType"
catalogue-element-picker="dataType" label="el.name">
</div>
<span class="editable-empty" ng-if="!editableForm.$visible &amp;&amp; !element.dataType">empty</span>
<a ng-if="!editableForm.$visible &amp;&amp; element.dataType" class="small with-pointer"
ng-href="{{element.dataType.href()}}">
<span ng-class="element.dataType.getIcon()">&nbsp;</span>
<span class="unit-name">{{element.dataType.name}}&nbsp;</span>
<small>
<a ng-if="!editableForm.$visible" ng-href="{{element.dataType.dataModel.href()}}" class="label"
ng-class="{'label-warning': element.dataType.getDataModelStatus() == 'DRAFT', 'label-info': element.dataType.getDataModelStatus() == 'PENDING', 'label-primary': element.dataType.getDataModelStatus() == 'FINALIZED', 'label-danger': element.dataType.getDataModelStatus() == 'DEPRECATED'}">{{element.dataType.getDataModelWithVersion()}}</a>
</small>
</a>

</div>
<div class="small col-md-9 col-md-offset-3" ng-if="!editableForm.$visible &amp;&amp; element.dataType.measurementUnit">
uses <a class="small with-pointer" ng-href="{{element.dataType.measurementUnit.href()}}">
<span ng-class="element.dataType.measurementUnit.getIcon()">&nbsp;</span>
<span class="unit-name">{{element.dataType.measurementUnit.name}}&nbsp;</span>
<small>
<a ng-href="{{element.dataType.measurementUnit.dataModel.href()}}" class="label"
ng-class="{'label-warning': element.dataType.measurementUnit.getDataModelStatus() == 'DRAFT', 'label-info': element.dataType.measurementUnit.getDataModelStatus() == 'PENDING', 'label-primary': element.dataType.measurementUnit.getDataModelStatus() == 'FINALIZED', 'label-danger': element.dataType.measurementUnit.getDataModelStatus() == 'DEPRECATED'}">{{element.dataType.measurementUnit.getDataModelWithVersion()}}</a>
</small>
</a>
</div>
<div class="small col-md-9 col-md-offset-3" ng-if="!editableForm.$visible &amp;&amp; element.dataType.dataClass">
refers to <a class="small with-pointer" ng-href="{{element.dataType.dataClass.href()}}">
<span ng-class="element.dataType.dataClass.getIcon()">&nbsp;</span>
<span class="unit-name">{{element.dataType.dataClass.name}}&nbsp;</span>
<small>
<a ng-href="{{element.dataType.dataClass.dataModel.href()}}" class="label"
ng-class="{'label-warning': element.dataType.dataClass.getDataModelStatus() == 'DRAFT', 'label-info': element.dataType.dataClass.getDataModelStatus() == 'PENDING', 'label-primary': element.dataType.dataClass.getDataModelStatus() == 'FINALIZED', 'label-danger': element.dataType.dataClass.getDataModelStatus() == 'DEPRECATED'}">{{element.dataType.dataClass.getDataModelWithVersion()}}</a>
</small>
</a>
</div>
<div class="small col-md-9 col-md-offset-3" ng-if="!editableForm.$visible &amp;&amp; element.dataType.enumerations">
<div class="row">
<div class="col-md-12"><strong class="small">Enumerations</strong></div>
<div class="col-md-3" ng-repeat-start="value in element.dataType.enumerations.values">
<strong class="small">{{value.key}}</strong>
</div>
<div class="col-md-9 preserve-new-lines" ng-repeat-end>
<small>{{value.value}}</small>
</div>
</div>
</div>
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ <h3 class="ce-name">
ng-class="{'label-warning': element.getDataModelStatus() == 'DRAFT', 'label-info': element.getDataModelStatus() == 'PENDING', 'label-primary': element.getDataModelStatus() == 'FINALIZED', 'label-danger': element.getDataModelStatus() == 'DEPRECATED'}">{{element.getDataModelWithVersion()}}</a>
</small>
</h3>
<messages-panel messages="messages"></messages-panel>
<messages-panel messages="messages" max="1000"></messages-panel>
<div class="row detail-section" ng-repeat="view in detailSections" data-view-name="{{view.title}}">
<p ng-if="view.title"
class="text-center detail-section-title small"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,8 @@ angular.module('mc.core.catalogueElementEnhancer', ['ui.router', 'mc.util.rest',
return $state.go('simple.actions.show', {id: self.id}, {reload: reload}); self
if self.isInstanceOf "csvTransformation"
return $state.go('mc.csvTransformations.show', {id: self.id}, {reload: reload}); self
if self.isInstanceOf "dataModelPolicy"
return $state.go('simple.resource.show', {id: self.id, resource: 'dataModelPolicy'}) ; self
if self.isInstanceOf "relationships"
return $state.go('mc.resource.show.property', {dataModelId: self.element.getDataModelId(), id: self.element.id, resource: names.getPropertyNameFromType(self.element.elementType), property: self.property}, {reload: reload})
if self.isInstanceOf "enumeratedValue"
Expand All @@ -103,6 +105,8 @@ angular.module('mc.core.catalogueElementEnhancer', ['ui.router', 'mc.util.rest',
return $state.href('simple.actions.show', {id: self.id})
if self.isInstanceOf "csvTransformation"
return $state.href('mc.csvTransformations.show', {id: self.id})
if self.isInstanceOf "dataModelPolicy"
return $state.href('simple.resource.show', {id: self.id, resource: 'dataModelPolicy'})
if self.isInstanceOf "relationships"
return $state.href('mc.resource.show.property', {dataModelId: self.element.getDataModelId(), id: self.element.id, resource: names.getPropertyNameFromType(self.element.elementType), property: self.property})
if self.isInstanceOf "enumeratedValue"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
angular.module('mc.core.ui.bs.catalogue', ['mc.core.catalogue']).config ['catalogueProvider', (catalogueProvider)->
catalogueProvider.setPlural 'dataClass', 'Data Classes'
catalogueProvider.setPlural 'batch', 'Batches'
catalogueProvider.setPlural 'dataModelPolicy', 'Data Model Policies'

catalogueProvider.setIcon 'dataModel', "fa fa-fw fa-book"
catalogueProvider.setIcon 'classification', "fa fa-fw fa-book"
Expand All @@ -25,6 +26,7 @@ angular.module('mc.core.ui.bs.catalogue', ['mc.core.catalogue']).config ['catalo
catalogueProvider.setIcon 'relationships', "fa fa-fw fa-link"
catalogueProvider.setIcon 'mapping', "fa fa-fw fa-superscript"
catalogueProvider.setIcon 'validationRule', "fa fa-fw fa-university"
catalogueProvider.setIcon 'dataModelPolicy', "fa fa-fw fa-check-square-o"

# this should be generated automatically in the future

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,4 +144,9 @@ angular.module('mc.core.ui.bs.columns', ['mc.util.names']).config ['columnsProvi
{header: "Message" , value: 'message' , classes: 'col-md-7' }
]

columnsProvider.registerColumns 'org.modelcatalogue.core.DataModelPolicy', [
{header: "Name" , value: 'name' , classes: 'col-md-6', show: true, href: 'href()', sort: {property: 'name', type: 'alpha'}}
{header: "Policy Text" , value: 'policyText' , classes: 'col-md-6'}
]

]
Original file line number Diff line number Diff line change
Expand Up @@ -95,53 +95,6 @@ metadataEditors.run ['$templateCache', ($templateCache) ->
</div>
'''

$templateCache.put 'modelcatalogue/core/ui/detailSections/dataType.html', '''
<div class="col-md-3">
<strong class="small">Data Type</strong>
</div>
<div class="full-width-editable col-md-9">
<div ng-if="editableForm.$visible">
<input type="text" id="dataType" placeholder="Data Type" ng-model="copy.dataType" catalogue-element-picker="dataType" label="el.name">
</div>
<span class="editable-empty" ng-if="!editableForm.$visible &amp;&amp; !element.dataType">empty</span>
<a ng-if="!editableForm.$visible &amp;&amp; element.dataType" class="small with-pointer" ng-href="{{element.dataType.href()}}">
<span ng-class="element.dataType.getIcon()">&nbsp;</span>
<span class="unit-name">{{element.dataType.name}}&nbsp;</span>
<small>
<a ng-if="!editableForm.$visible" ng-href="{{element.dataType.dataModel.href()}}" class="label" ng-class="{'label-warning': element.dataType.getDataModelStatus() == 'DRAFT', 'label-info': element.dataType.getDataModelStatus() == 'PENDING', 'label-primary': element.dataType.getDataModelStatus() == 'FINALIZED', 'label-danger': element.dataType.getDataModelStatus() == 'DEPRECATED'}">{{element.dataType.getDataModelWithVersion()}}</a>
</small>
</a>
</div>
<div class="small col-md-9 col-md-offset-3" ng-if="!editableForm.$visible &amp;&amp; element.dataType.measurementUnit">
uses <a class="small with-pointer" ng-href="{{element.dataType.measurementUnit.href()}}">
<span ng-class="element.dataType.measurementUnit.getIcon()">&nbsp;</span>
<span class="unit-name">{{element.dataType.measurementUnit.name}}&nbsp;</span>
<small>
<a ng-href="{{element.dataType.measurementUnit.dataModel.href()}}" class="label" ng-class="{'label-warning': element.dataType.measurementUnit.getDataModelStatus() == 'DRAFT', 'label-info': element.dataType.measurementUnit.getDataModelStatus() == 'PENDING', 'label-primary': element.dataType.measurementUnit.getDataModelStatus() == 'FINALIZED', 'label-danger': element.dataType.measurementUnit.getDataModelStatus() == 'DEPRECATED'}">{{element.dataType.measurementUnit.getDataModelWithVersion()}}</a>
</small>
</a>
</div>
<div class="small col-md-9 col-md-offset-3" ng-if="!editableForm.$visible &amp;&amp; element.dataType.dataClass">
refers to <a class="small with-pointer" ng-href="{{element.dataType.dataClass.href()}}">
<span ng-class="element.dataType.dataClass.getIcon()">&nbsp;</span>
<span class="unit-name">{{element.dataType.dataClass.name}}&nbsp;</span>
<small>
<a ng-href="{{element.dataType.dataClass.dataModel.href()}}" class="label" ng-class="{'label-warning': element.dataType.dataClass.getDataModelStatus() == 'DRAFT', 'label-info': element.dataType.dataClass.getDataModelStatus() == 'PENDING', 'label-primary': element.dataType.dataClass.getDataModelStatus() == 'FINALIZED', 'label-danger': element.dataType.dataClass.getDataModelStatus() == 'DEPRECATED'}">{{element.dataType.dataClass.getDataModelWithVersion()}}</a>
</small>
</a>
</div>
<div class="small col-md-9 col-md-offset-3" ng-if="!editableForm.$visible &amp;&amp; element.dataType.enumerations">
<div class="row">
<div class="col-md-12" ><strong class="small">Enumerations</strong></div>
<div class="col-md-3" ng-repeat-start="value in element.dataType.enumerations.values">
<strong class="small">{{value.key}}</strong>
</div>
<div class="col-md-9 preserve-new-lines" ng-repeat-end><small>{{value.value}}</small></div>
</div>
</div>
'''

$templateCache.put 'modelcatalogue/core/ui/detailSections/assetPreview.html', '''
<div class="col-md-12">
<img style="max-width: 100%" ng-src="{{element.downloadUrl}}" ng-if="element.contentType.indexOf('image/') == 0"/>
Expand Down Expand Up @@ -234,7 +187,7 @@ x in ['apple', 'banana', 'cherry']
'dataElement'
]
keys: []
template: 'modelcatalogue/core/ui/detailSections/dataType.html'
template: '/mc/core/ui/detail-sections/dataType.html'
}

detailSectionsProvider.register {
Expand All @@ -247,6 +200,16 @@ x in ['apple', 'banana', 'cherry']
template: 'modelcatalogue/core/ui/detailSections/modelCatalogueId.html'
}

detailSectionsProvider.register {
title: 'Policies'
position: -10000
types: [
'dataModel'
]
keys: []
template: '/mc/core/ui/detail-sections/dataModelPolicies.html'
}

detailSectionsProvider.register {
title: 'Basic'
position: 0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ angular.module('mc.core.ui.bs', [
'mc.core.ui.bs.modalPromptActionParametersEdit'
'mc.core.ui.bs.modalPromptModel'
'mc.core.ui.bs.modalPromptRelationshipTypeEdit'
'mc.core.ui.bs.modalPromptDatModelPolicyEdit'
'mc.core.ui.bs.modalPromptGenerateSuggestions'
'mc.core.ui.bs.modalPromptDataElementEdit'
'mc.core.ui.bs.modalAbout'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ angular.module('mc.core.ui.bs.modalFinalize', ['mc.util.messages']).config ['mes
<div class="modal-body">
<p>Do you want to finalize data model <strong>''' + args.element.name + '''</strong>?</p>
<p><small>Every item declared inside data model will be finalized as well. The data model will be published under given semantic version which cannot be changed later.</small></p>
<messages-panel messages="messages"></messages-panel>
<messages-panel messages="messages" max="10000"></messages-panel>
<form role="form" ng-submit="finalizeElement()">
<div class="form-group">
<label for="semanticVersion" class="">Semantic Version</label>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
angular.module('mc.core.ui.bs.modalPromptDatModelPolicyEdit', ['mc.util.messages']).config (messagesProvider)->
factory = ($modal, $q, messages) ->
"ngInject"
(title, body, args) ->
if not args?.element? and not args?.create?
messages.error('Cannot create edit dialog.', 'The element to be edited is missing.')
return $q.reject('Missing element argument!')

dialog = $modal.open {
windowClass: 'basic-edit-modal-prompt'
template: '''
<div class="modal-header">
<h4>''' + title + '''</h4>
</div>
<div class="modal-body">
<messages-panel messages="messages"></messages-panel>
<form role="form" ng-submit="saveElement()">
<div class="form-group">
<label for="name" class="">Name</label>
<input type="text" class="form-control" id="name" placeholder="Name" ng-model="copy.name">
</div>
<div class="form-group">
<label for="policyText">Policy Text</label>
<textarea rows="10" ng-model="copy.policyText" placeholder="Policy Text" class="form-control" id="policyText"></textarea>
</div>
<fake-submit-button/>
</form>
</div>
<div class="modal-footer">
<contextual-actions role="modal"></contextual-actions>
</div>
'''

controller: ($scope, messages, $controller, $modalInstance) ->
$scope.copy = angular.copy(args.element ? {})
$scope.create = args.create
$scope.original = args.element ? {}
$scope.messages = messages.createNewMessages()

angular.extend(this, $controller('saveAndCreateAnotherCtrlMixin', {$scope: $scope, $modalInstance: $modalInstance}))

$scope.hasChanged = ->
for prop in ['name', 'policyText']
return true if !angular.equals($scope.copy[prop], $scope.original[prop])
return false

$scope.beforeSave = ->

$scope.validate = ->
if not $scope.copy.name
$scope.messages.error 'Empty Name', 'Please fill the name'
return false

if not $scope.copy.policyText
$scope.messages.error 'Empty Policy Text', 'Please fill the Policy Text'
return false
return true

}

dialog.result

messagesProvider.setPromptFactory 'edit-dataModelPolicy', factory
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ module.config ['messagesProvider', (messagesProvider)->
<div class="list-group">
<div class="leave-10-before"></div>
<a ng-repeat="element in elements" class="list-group-item with-pointer item-found" ng-class="{'list-group-item-warning': element.status == 'DRAFT', 'list-group-item-info': element.status == 'PENDING', 'list-group-item-danger': element.status == 'DEPRECATED', 'active': $index == selected}" ng-click="$close(element)">
<h4 class="list-group-item-heading"><catalogue-element-icon type="element.elementType"></catalogue-element-icon> <span class='classified-name'>{{element.classifiedName}}</span></h4>
<h4 class="list-group-item-heading"><catalogue-element-icon type="element.elementType"></catalogue-element-icon> <span class='classified-name'>{{element.classifiedName || element.name}}</span></h4>
<p ng-if="element.modelCatalogueId || element.internalModelCatalogueId" class="search-model-catalogue-id small">{{element.modelCatalogueId || element.internalModelCatalogueId}}</p>
<p ng-if="element.description" class="list-group-item-text preserve-new-lines modal-search-for-catalogue-element-description">{{element.description}}</p>
</a>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,18 @@ angular.module('mc.core.ui.bs.navigationRightActions', ['mc.util.ui.actions', 'm
}
]



actionsProvider.registerChildAction 'admin-menu', 'data-model-policies', ['$state', ($state) ->
{
position: 2100
icon: 'fa fa-check-square-o fa-fw'
label: 'Data Model Policies'
action: ->
$state.go 'simple.resource.list', resource: 'dataModelPolicy'
}
]

actionsProvider.registerChildAction 'admin-menu', 'action-batches', ['$state', ($state) ->
{
position: 1000
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ catalogueElementPicker.run ['$templateCache', ($templateCache) ->
$templateCache.put "modelcatalogue/core/ui/catalogueElementPickerTypeahead.html", """
<a class="cep-item" ng-class="{'show-more-cep-item': match.model.more}">
<span class="omnisearch-text" ng-class="{'text-warning': match.model.status == 'DRAFT', 'text-info': match.model.status == 'PENDING'}">
<span class="text-muted" ng-class="match.model.getIcon()"/><span> {{match.model.classifiedName}}
<span class="text-muted" ng-class="match.model.getIcon()"/><span> {{match.model.classifiedName || match.model.name}}
</span><br/>
<small ng-if="match.model.description">{{match.model.description}}</small>
</a>
Expand Down
Loading

0 comments on commit 0ef3afc

Please sign in to comment.