Skip to content

Commit 8e90f7e

Browse files
authored
Merge pull request #2231 from seek4science/project-default-data-ajax
Discipline annotations
2 parents a709b81 + 5aeaf70 commit 8e90f7e

32 files changed

+457
-127
lines changed

app/assets/javascripts/sharing.js.erb

Lines changed: 32 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,6 @@ var Sharing = {
2727
}
2828
}
2929

30-
// This ensures that if a project permission is added, and that project is associated with the resource, it gains
31-
// the "isMandatory" flag.
32-
if (permission.contributor_type === 'Project' && Sharing.projectsSelector) {
33-
for (var j = 0; j < Sharing.projectsSelector.selected.length; j++) {
34-
if (Sharing.projectsSelector.selected[j].id === permission.contributor_id) {
35-
permission.isMandatory = true;
36-
break;
37-
}
38-
}
39-
}
40-
4130
Sharing.permissionsTable.permissions.push(permission);
4231
},
4332

@@ -47,20 +36,7 @@ var Sharing = {
4736
contributor_type: 'Project',
4837
contributor_id: project.id,
4938
title: project.title,
50-
access_type: Sharing.associatedProjectAccessType,
51-
isMandatory: true }, true);
52-
},
53-
54-
removeMandatoryProjectPermissions: function () {
55-
if (!Sharing.permissionsTable)
56-
return;
57-
var indices = [];
58-
for (var i = Sharing.permissionsTable.permissions.length - 1; i >= 0; i--) {
59-
if (Sharing.permissionsTable.permissions[i].contributor_type === 'Project' &&
60-
Sharing.permissionsTable.permissions[i].isMandatory) {
61-
Sharing.permissionsTable.permissions.splice(i, 1);
62-
}
63-
}
39+
access_type: Sharing.associatedProjectAccessType }, true);
6440
},
6541

6642
removePermissionForProject: function (project) {
@@ -72,13 +48,12 @@ var Sharing = {
7248
}
7349
if (confirm('Do you want to remove any permissions for ' + project.title + '?')) {
7450
Sharing.permissionsTable.permissions.splice(i, 1);
75-
} else {
76-
Sharing.permissionsTable.permissions[i].isMandatory = false;
7751
}
7852
},
7953

8054
requestInstitutionsUrl: '<%= request_institutions_projects_path %>',
8155
requestAllInstitutionsUrl: '<%= request_all_sharing_form_institutions_path %>',
56+
requestDefaultDataUrl: '<%= default_data_project_path('_replaceme_') %>',
8257

8358
accessTypes: {
8459
noAccess: <%= Policy::NO_ACCESS %>,
@@ -120,15 +95,29 @@ var Sharing = {
12095
},
12196

12297
// Ask if they want to use the default policy (if there is one)
123-
defaultPolicyPrompt: function (project, skipPrompt) {
98+
defaultPolicyPrompt: function (project, policy, skipPrompt) {
12499
if (!Sharing.permissionsTable)
125100
return;
126101

127-
if (Sharing.defaultPolicies[project.id] && (skipPrompt || confirm('' + project.title + ' has a default sharing policy specified, do you want to apply it?'))) {
128-
Sharing.applyPolicy(Sharing.defaultPolicies[project.id]);
102+
if (policy && (skipPrompt || confirm('' + project.title + ' has a default sharing policy specified, do you want to apply it?'))) {
103+
Sharing.applyPolicy(policy);
129104
} else { // Otherwise just add a permission for the project
130105
Sharing.addPermissionForProject(project);
131106
}
107+
},
108+
109+
fetchDefaultData: function (project) {
110+
return new Promise((resolve, reject) => {
111+
$j.ajax(Sharing.requestDefaultDataUrl.replace('_replaceme_', project.id), {
112+
success: function (data) {
113+
resolve(data);
114+
},
115+
complete: function () {
116+
resolve({});
117+
}
118+
}
119+
);
120+
});
132121
}
133122
};
134123

@@ -171,7 +160,8 @@ Vue.component('permissions-table', {
171160
computed: {
172161
sortedPermissions: function () {
173162
return this.permissions.sort(function (a, b) {
174-
return (b.isMandatory || false) - (a.isMandatory || false);
163+
return ((b.contributor_type === 'Project') && Sharing.getSelectedProjectIds().includes(b.contributor_id)) -
164+
((a.contributor_type === 'Project') && Sharing.getSelectedProjectIds().includes(a.contributor_id));
175165
});
176166
}
177167
},
@@ -185,14 +175,14 @@ Vue.component('permissions-table', {
185175
Vue.component('permission-row', {
186176
props: ['index', 'permission', 'accessTypes', 'publicAccessType', 'fieldPrefixOrig'],
187177
template:
188-
'<tr class="permission-row" :class="{ mandatory: permission.isMandatory, hidden: permission.contributor_type === \'FavouriteGroup\' }">' +
178+
'<tr class="permission-row" :class="{ mandatory: mandatory, hidden: permission.contributor_type === \'FavouriteGroup\' }">' +
189179
'<td class="name-cell" :title="permission.title"><span class="type-icon-wrapper"><img :src="typeIcon" class="type-icon" :title="permission.contributor_type || \'All visitors\'"/></span> {{ permission.title }}' +
190180
'<input v-if="permission.contributor_type" type="hidden" :name="fieldPrefix+\'[contributor_type]\'" v-model="permission.contributor_type"/>' +
191181
'<input v-if="permission.contributor_id" type="hidden" :name="fieldPrefix+\'[contributor_id]\'" v-model="permission.contributor_id"/>' +
192182
'</td>' +
193183
'<td is="privilege-cell" v-for="accessType in accessTypes" :fieldPrefix="fieldPrefix" :permission="permission" :access-type="accessType" :public-access-type="publicAccessType"></td>' +
194184
'<td class="actions-cell">'+
195-
'<a v-if="!permission.isMandatory" @click="$emit(\'delete-permission\')" class="clickable remove-button" title="Remove this permission">' +
185+
'<a v-if="!mandatory" @click="$emit(\'delete-permission\')" class="clickable remove-button" title="Remove this permission">' +
196186
'<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>' +
197187
'</a>' +
198188
'</td>' +
@@ -216,6 +206,15 @@ Vue.component('permission-row', {
216206
}
217207

218208
return '<%= asset_path icon_filename_for_key('world') %>';
209+
},
210+
mandatory: function () {
211+
if (this.permission.isPublic) {
212+
return true;
213+
}
214+
if (this.permission.contributor_type === 'Project') {
215+
return Sharing.getSelectedProjectIds().includes(this.permission.contributor_id);
216+
}
217+
return false;
219218
}
220219
}
221220
});

app/controllers/projects_controller.rb

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,16 @@ class ProjectsController < ApplicationController
1818
:administer_create_project_request, :respond_create_project_request,
1919
:administer_import_project_request, :respond_import_project_request,
2020
:import_from_fairdata_station, :submit_fairdata_station,
21-
:project_join_requests, :project_creation_requests, :project_importation_requests, :typeahead]
21+
:project_join_requests, :project_creation_requests, :project_importation_requests,
22+
:typeahead, :default_data]
2223

2324
before_action :find_requested_item, only: %i[show admin edit update destroy admin_members
2425
asset_report populate populate_from_spreadsheet
2526
admin_member_roles update_members storage_report
2627
overview administer_join_request respond_join_request
2728
import_from_fairdata_station submit_fairdata_station
28-
fair_data_station_import_status hide_fair_data_station_import_status]
29+
fair_data_station_import_status hide_fair_data_station_import_status
30+
default_data]
2931

3032
before_action :has_spreadsheets, only: %i[:populate populate_from_spreadsheet]
3133

@@ -36,7 +38,8 @@ class ProjectsController < ApplicationController
3638
before_action :administerable_by_user, only: %i[admin admin_members admin_member_roles destroy update_members storage_report administer_join_request respond_join_request populate populate_from_spreadsheet]
3739

3840
before_action :member_of_this_project, only: [:asset_report, :import_from_fairdata_station, :submit_fairdata_station,
39-
:fair_data_station_import_status, :hide_fair_data_station_import_status], unless: :admin_logged_in?
41+
:fair_data_station_import_status, :hide_fair_data_station_import_status,
42+
:default_data], unless: :admin_logged_in?
4043

4144
before_action :validate_message_log_for_join, only: [:administer_join_request, :respond_join_request]
4245
before_action :validate_message_log_for_create, only: [:administer_create_project_request, :respond_create_project_request]
@@ -977,6 +980,12 @@ def typeahead
977980
end
978981
end
979982

983+
def default_data
984+
respond_to do |format|
985+
format.json
986+
end
987+
end
988+
980989
private
981990

982991
def project_role_params
@@ -993,7 +1002,7 @@ def project_role_params
9931002
def project_params
9941003
permitted_params = [:title, :web_page, :wiki_page, :description, { organism_ids: [] }, :parent_id, :start_date,
9951004
:end_date,
996-
{ funding_codes: [] }, { human_disease_ids: [] }, topic_annotations: [],
1005+
{ funding_codes: [] }, { human_disease_ids: [] }, { topic_annotations: [] }, { discipline_annotations: [] },
9971006
discussion_links_attributes:[:id, :url, :label, :_destroy], extended_metadata_attributes: determine_extended_metadata_keys ]
9981007

9991008
if User.admin_logged_in?
@@ -1089,10 +1098,10 @@ def member_of_this_project
10891098
@project = Project.find(params[:id])
10901099
if @project.nil? || !@project.has_member?(current_user)
10911100
flash[:error] = "You are not a member of this #{t('project')}, so cannot access this page."
1092-
redirect_to project_path(@project)
1093-
false
1094-
else
1095-
true
1101+
respond_to do |format|
1102+
format.html { redirect_to project_path(@project) }
1103+
format.json { head :forbidden }
1104+
end
10961105
end
10971106
end
10981107

app/controllers/workflows_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,7 @@ def workflow_params
377377
{ publication_ids: [] }, { presentation_ids: [] }, { document_ids: [] }, { data_file_ids: [] }, { sop_ids: [] },
378378
{ workflow_data_files_attributes:[:id, :data_file_id, :workflow_data_file_relationship_id, :_destroy] },
379379
:internals, :maturity_level, :source_link_url, :execution_instance_url,
380-
{ topic_annotations: [] }, { operation_annotations: [] },
380+
{ topic_annotations: [] }, { operation_annotations: [] }, { discipline_annotations: [] },
381381
{ discussion_links_attributes: [:id, :url, :label, :_destroy] },
382382
{ git_version_attributes: [:name, :comment, :ref, :commit, :root_path,
383383
:git_repository_id, :main_workflow_path,

app/helpers/license_helper.rb

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,6 @@ def default_license_for_current_user
5454
current_user.person.projects_with_default_license.any?
5555
end
5656

57-
# JSON that creates a lookup for project license by id
58-
def project_licenses_json
59-
projects = current_user.person.projects_with_default_license
60-
Hash[projects.collect { |proj| [proj.id, proj.default_license] }].to_json.html_safe
61-
end
62-
6357
private
6458

6559
def license_description_content(license)

app/helpers/policy_helper.rb

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,6 @@ def policy_hash(policy, associated_projects)
120120
# Mark associated project permissions as "mandatory"
121121
if permission.contributor_type == 'Project' && project_ids.include?(permission.contributor_id)
122122
project_ids.delete(permission.contributor_id)
123-
h[:isMandatory] = true
124123
end
125124

126125
h[:title] = permission_title(permission)
@@ -133,8 +132,7 @@ def policy_hash(policy, associated_projects)
133132
hash[:permissions] << { access_type: policy.access_type,
134133
contributor_id: project.id,
135134
contributor_type: 'Project',
136-
title: project.title,
137-
isMandatory: true }
135+
title: project.title }
138136
end
139137

140138
hash
@@ -144,16 +142,6 @@ def policy_json(policy, associated_projects)
144142
policy_hash(policy, associated_projects).to_json.html_safe
145143
end
146144

147-
def project_policies_json(projects)
148-
hash = {}
149-
150-
projects.each do |p|
151-
hash[p.id] = policy_hash(p.default_policy, [p]) if p.use_default_policy
152-
end
153-
154-
hash.to_json.html_safe
155-
end
156-
157145
def project_policy_json(project)
158146
hash = policy_hash(project.default_policy, [project]) if project.use_default_policy
159147
hash.to_json.html_safe

app/models/concerns/has_controlled_vocabulary_annotations.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ def associate_controlled_vocab_annotation_values(vals, property)
9292
vocab = annotation_controlled_vocab(property)
9393
values = Array(vals.split(',').flatten).map do |value|
9494
value = value.strip
95+
next if value.blank?
9596
vocab.sample_controlled_vocab_terms.find_by_label(value) ||
9697
vocab.sample_controlled_vocab_terms.find_by_iri(value)
9798
end.compact.uniq

app/models/project.rb

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ class Project < ApplicationRecord
7575
# is to be used)
7676
belongs_to :default_policy, class_name: 'Policy', dependent: :destroy, autosave: true
7777

78-
has_controlled_vocab_annotations :topics
78+
has_controlled_vocab_annotations :topics, :disciplines
7979

8080
# FIXME: temporary handler, projects need to support multiple programmes
8181
def programmes
@@ -93,6 +93,9 @@ def programmes
9393

9494
has_many :dependent_permissions, class_name: 'Permission', as: :contributor, dependent: :destroy
9595

96+
before_save :check_disciplines
97+
after_save :propagate_disciplines
98+
9699
def assets
97100
data_files | sops | models | publications | presentations | documents | workflows | collections
98101
end
@@ -282,4 +285,20 @@ def ro_crate_metadata
282285
end
283286
end
284287

288+
def check_disciplines
289+
@_disciplines = discipline_annotation_labels.sort
290+
end
291+
292+
def propagate_disciplines
293+
new_disciplines = discipline_annotation_labels.sort
294+
unless @_disciplines == new_disciplines
295+
disable_authorization_checks do
296+
workflows.find_each do |workflow|
297+
next if workflow.discipline_annotations.any?
298+
workflow.discipline_annotations = new_disciplines
299+
workflow.save(touch: false)
300+
end
301+
end
302+
end
303+
end
285304
end

app/models/sample_controlled_vocab.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,8 @@ class SystemVocabs
116116
topics: 'topic_annotations',
117117
operations: 'operation_annotations',
118118
data_formats: 'data_format_annotations',
119-
data_types: 'data_type_annotations'
119+
data_types: 'data_type_annotations',
120+
disciplines: 'discipline_annotations',
120121
}
121122

122123
def self.vocab_for_property(property)

app/models/workflow.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class Workflow < ApplicationRecord
1414

1515
acts_as_doi_parent
1616

17-
has_controlled_vocab_annotations :topics, :operations
17+
has_controlled_vocab_annotations :topics, :operations, :disciplines
1818

1919
validates :projects, presence: true, projects: { self: true }
2020

app/views/assays/_form.html.erb

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@
1919

2020
<%= render partial: 'extended_metadata/extended_metadata_attribute_input', locals:{f:f,resource:@assay} %>
2121

22-
<div class="form-group">
23-
<label class="required"><%= t('study') -%></label>
22+
<% if show_form_manage_specific_attributes? %>
23+
<div class="form-group">
24+
<label class="required"><%= t('study') -%></label>
2425

25-
<%= resource_study_selection('assay[study_id]', @assay.study) %>
26-
</div>
26+
<%= resource_study_selection('assay[study_id]', @assay.study) %>
27+
</div>
28+
<% end %>
2729

2830
<div class="form-group">
2931
<%= f.label "Assay position" -%><br/>

0 commit comments

Comments
 (0)