sufia 3.7.1 → 3.7.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6d9ca86c363c0d4e38d76b587a487b97f675c016
4
- data.tar.gz: d1a9151de4fa4bb651ddee3b1aabf246c167cc56
3
+ metadata.gz: b1c4c30d06096c8bf96dd31815ac959204aa7ba0
4
+ data.tar.gz: a5f92e07ff3b432ab8b0fcd9c257b86e7c9b76c0
5
5
  SHA512:
6
- metadata.gz: 0f444ca293e68574e34d8defb7b82d9d57d360d3a3526f58e7b42ab86da48f66551e7b1769ce778e573f83b5efcda300e1e1325e0bf0968eaf991c33a7416f91
7
- data.tar.gz: d6ad98fbb7809d6e828c740de33085e486016716a4329439300d29441a0bbea3969f7de606eca80cba9307ae083ca85281bc32538f821854e72873a355ed9d2f
6
+ metadata.gz: d09bc93fc96305ffb8f2406611419e9979ba1bc28e7096ca9d04370132d91396b820d44b03d23f09d30153b2b3c5d5792b4cc150e5ea45bd0724e8d96a3fdae5
7
+ data.tar.gz: 6150293ef7e9b349b62deab24475e3b370af265e2116c065c904943880506d3000a13d0878e746fd47b5fe693c78cd88d96f7d64e1df19da812f87e3a4dcb9b5
data/SUFIA_VERSION CHANGED
@@ -1 +1 @@
1
- 3.7.1
1
+ 3.7.2
@@ -49,6 +49,9 @@ limitations under the License.
49
49
  //= require hydra/batch_select
50
50
  //= require hydra_collections
51
51
 
52
+ // this needs to be after batch_select so that the form ids get setup correctly
53
+ //= require sufia/batch_edit
54
+
52
55
  //over ride the blacklight default to submit
53
56
  //form when sort by or show per page change
54
57
  Blacklight.do_select_submit = function() {
@@ -0,0 +1,170 @@
1
+ function batch_edit_init () {
2
+
3
+ // initialize popover helpers
4
+ $("a[rel=popover]").popover({ html: true });
5
+
6
+ $("tr.expandable").click(function () {
7
+ $(this).next("ul").slideToggle();
8
+
9
+ $(this).find('i.toggle').toggleClass("icon-chevron-down");
10
+ });
11
+
12
+ $("tr.expandable_new").click(function () {
13
+ $(this).find('i').toggleClass("icon-chevron-down");
14
+ });
15
+
16
+
17
+ function deserialize(Params) {
18
+ var Data = Params.split("&");
19
+ var i = Data.length;
20
+ var Result = {};
21
+ while (i--) {
22
+ var Pair = decodeURIComponent(Data[i]).split("=");
23
+ var Key = Pair[0];
24
+ var Val = Pair[1];
25
+ Result[Key] = Val;
26
+ }
27
+ return Result;
28
+ }
29
+
30
+ var ajaxManager = (function () {
31
+ var requests = [];
32
+ var running = false;
33
+ return {
34
+ addReq: function (opt) {
35
+ requests.push(opt);
36
+ },
37
+ removeReq: function (opt) {
38
+ if ($.inArray(opt, requests) > -1)
39
+ requests.splice($.inArray(opt, requests), 1);
40
+ },
41
+ runNow: function () {
42
+ clearTimeout(self.tid);
43
+ if (!running) {
44
+ this.run();
45
+ }
46
+ },
47
+ run: function () {
48
+ running = true;
49
+ var self = this,
50
+ orgSuc;
51
+
52
+ if (requests.length) {
53
+ oriSuc = requests[0].complete;
54
+
55
+ // combine data from multiple requests
56
+ if (requests.length > 1) {
57
+ var data = deserialize(requests[0].data.replace(/\+/g, " "));
58
+ form = [requests[0].form]
59
+ for (var i = requests.length - 1; i > 0; i--) {
60
+ req = requests.pop();
61
+ adata = deserialize(req.data.replace(/\+/g, " "));
62
+ for (key in Object.keys(adata)) {
63
+ curKey = Object.keys(adata)[key];
64
+ if (curKey.slice(0, 12) == "generic_file") {
65
+ data[curKey] = adata[curKey];
66
+ form.push(req.form);
67
+ }
68
+ }
69
+ }
70
+ requests[0].data = $.param(data);
71
+ requests[0].form = form;
72
+ }
73
+
74
+ requests[0].complete = function () {
75
+ if (typeof oriSuc === 'function') oriSuc();
76
+ if (typeof requests[0].form === 'object') {
77
+ for (f in form) {
78
+ form_id = form[f];
79
+ after_ajax(form_id);
80
+ }
81
+ }
82
+ requests.shift();
83
+ self.run.apply(self, []);
84
+ };
85
+
86
+ $.ajax(requests[0]);
87
+ } else {
88
+ self.tid = setTimeout(function () {
89
+ self.run.apply(self, []);
90
+ }, 500);
91
+ }
92
+ running = false;
93
+ },
94
+ stop: function () {
95
+ requests = [];
96
+ clearTimeout(this.tid);
97
+ }
98
+ };
99
+ }());
100
+
101
+
102
+ ajaxManager.run();
103
+
104
+ function after_ajax(form_id) {
105
+ var key = form_id.replace("form_", "");
106
+ var save_button = "#" + key + "_save";
107
+ var outer_div = "#collapse_" + key;
108
+ $("#status_" + key).html("Changes Saved");
109
+ $(save_button).removeAttr("disabled");
110
+ $(outer_div).removeClass("loading");
111
+ $('#' + form_id).children([".control-group"]).removeClass('hidden')
112
+ }
113
+
114
+ function before_ajax(form_id) {
115
+ var key = form_id.replace("form_", "");
116
+ var save_button = "#" + key + "_save";
117
+ var outer_div = "#collapse_" + key;
118
+ $(save_button).attr("disabled", "disabled");
119
+ $(outer_div).addClass("loading");
120
+ $('#' + form_id).children([".control-group"]).addClass('hidden')
121
+ }
122
+
123
+
124
+ function runSave(e) {
125
+ e.preventDefault();
126
+ var button = $(this);
127
+ var form = $(button.parent().parent()[0]);
128
+ var form_id = form[0].id
129
+ before_ajax(form_id);
130
+
131
+ ajaxManager.addReq({
132
+ form: form_id,
133
+ queue: "add_doc",
134
+ url: form.attr("action"),
135
+ dataType: "json",
136
+ type: form.attr("method").toUpperCase(),
137
+ data: form.serialize(),
138
+ success: function (e) {
139
+ eval(e.responseText);
140
+ after_ajax(form_id);
141
+ },
142
+ error: function (e) {
143
+ after_ajax(form_id);
144
+ if (e.status == 200) {
145
+ eval(e.responseText);
146
+ } else {
147
+ alert("Error! Status: " + e.status);
148
+ }
149
+ }
150
+ });
151
+ setTimeout(ajaxManager.runNow(), 100);
152
+ }
153
+
154
+ $("#permissions_save").click(runSave);
155
+ $(".field-save").click(runSave);
156
+
157
+ }
158
+
159
+
160
+
161
+
162
+ // turbolinks triggers page:load events on page transition
163
+ // If app isn't using turbolinks, this event will never be triggered, no prob.
164
+ $(document).on('page:load', function() {
165
+ batch_edit_init();
166
+ });
167
+
168
+ $(document).ready(function() {
169
+ batch_edit_init();
170
+ });
@@ -20,8 +20,11 @@ The control icons are from a custom font. Each icon corresponds to a character
20
20
  */
21
21
  @font-face {
22
22
  font-family: 'VideoJS';
23
- src: url('font/vjs.eot');
24
- src: url('font/vjs.eot?#iefix') format('embedded-opentype'), url('font/vjs.woff') format('woff'), url('font/vjs.ttf') format('truetype');
23
+ src:url(<%= asset_path 'vjs.eot' %>);
24
+ src:url(<%= asset_path 'vjs.eot?#iefix' %>) format('embedded-opentype'),
25
+ url(<%= asset_path 'vjs.woff' %>) format('woff'),
26
+ url(<%= asset_path 'vjs.ttf' %>) format('truetype'),
27
+ url(<%= asset_path 'vjs.svg#VideoJS' %>) format('svg');
25
28
  font-weight: normal;
26
29
  font-style: normal;
27
30
  }
@@ -50,9 +50,9 @@ module Sufia::UsersControllerBehavior
50
50
  @user.update_attributes(params.require(:user).permit(*User.permitted_attributes))
51
51
  end
52
52
  @user.populate_attributes if params[:update_directory]
53
- @user.avatar = nil if params[:delete_avatar]
53
+ @user.remove_avatar = true if params[:delete_avatar]
54
54
  unless @user.save
55
- redirect_to sufia.edit_profile_path(URI.escape(@user.to_s,'@.')), alert: @user.errors.full_messages
55
+ redirect_to sufia.edit_profile_path(@user.to_param), alert: @user.errors.full_messages
56
56
  return
57
57
  end
58
58
  params.keys.select {|k, v| k.starts_with? 'remove_trophy_' }.each do |smash_trophy|
@@ -60,7 +60,7 @@ module Sufia::UsersControllerBehavior
60
60
  current_user.trophies.where(generic_file_id: smash_trophy).destroy_all
61
61
  end
62
62
  Sufia.queue.push(UserEditProfileEventJob.new(@user.user_key))
63
- redirect_to sufia.profile_path(URI.escape(@user.to_s,'@.')), notice: "Your profile has been updated"
63
+ redirect_to sufia.profile_path(@user.to_param), notice: "Your profile has been updated"
64
64
  end
65
65
 
66
66
  def toggle_trophy
@@ -89,7 +89,7 @@ module Sufia::UsersControllerBehavior
89
89
  current_user.follow(@user)
90
90
  Sufia.queue.push(UserFollowEventJob.new(current_user.user_key, @user.user_key))
91
91
  end
92
- redirect_to sufia.profile_path(URI.escape(@user.to_s,'@.')), notice: "You are following #{@user.to_s}"
92
+ redirect_to sufia.profile_path(@user.to_param), notice: "You are following #{@user.to_s}"
93
93
  end
94
94
 
95
95
  # Unfollow a user
@@ -98,7 +98,7 @@ module Sufia::UsersControllerBehavior
98
98
  current_user.stop_following(@user)
99
99
  Sufia.queue.push(UserUnfollowEventJob.new(current_user.user_key, @user.user_key))
100
100
  end
101
- redirect_to sufia.profile_path(URI.escape(@user.to_s,'@.')), notice: "You are no longer following #{@user.to_s}"
101
+ redirect_to sufia.profile_path(@user.to_param), notice: "You are no longer following #{@user.to_s}"
102
102
  end
103
103
 
104
104
  protected
@@ -114,11 +114,11 @@ module Sufia::UsersControllerBehavior
114
114
  end
115
115
 
116
116
  def user_is_current_user
117
- redirect_to sufia.profile_path(URI.escape(@user.to_s,'@.')), alert: "Permission denied: cannot access this page." unless @user == current_user
117
+ redirect_to sufia.profile_path(@user.to_param), alert: "Permission denied: cannot access this page." unless @user == current_user
118
118
  end
119
119
 
120
120
  def user_not_current_user
121
- redirect_to sufia.profile_path(URI.escape(@user.to_s,'@.')), alert: "You cannot follow or unfollow yourself" if @user == current_user
121
+ redirect_to sufia.profile_path(@user.to_param), alert: "You cannot follow or unfollow yourself" if @user == current_user
122
122
  end
123
123
 
124
124
  def get_sort
@@ -1,178 +1,3 @@
1
- <% content_for :local_js do %>
2
-
3
- window.onbeforeunload = clearBatch;
4
- function clearBatch(){
5
- // clear the batch edit items (do it inline so it is done before the next page load
6
- var clearState = $.ajax({
7
- headers: {Accept : "application/javascript"},
8
- type: 'POST',
9
- url: '<%=sufia.batch_edits_clear_path %>',
10
- async: false,
11
- });
12
- }
13
-
14
- // initialize popover helpers
15
- $("a[rel=popover]").popover({ html: true });
16
- <% @terms.each do |term| %>
17
- <% vals = @show_file.send(term) %>
18
- <% next if vals.blank? %>
19
- $("#<%='generic_file_'+term.to_s%>").autocomplete({"source":["<%=vals.join(",")%>"]});
20
-
21
- <% end %>
22
-
23
- function after_ajax(form_id){
24
- var key = form_id.replace("form_","");
25
- var save_button = "#"+key+"_save";
26
- var outer_div = "#collapse_"+key;
27
- $("#status_"+key).html("Changes Saved");
28
- $(save_button).removeAttr("disabled");
29
- $(outer_div).removeClass("loading");
30
- $('#'+form_id).children([".control-group"]).removeClass('hidden')
31
- }
32
-
33
- function before_ajax(form_id){
34
- var key = form_id.replace("form_","");
35
- var save_button = "#"+key+"_save";
36
- var outer_div = "#collapse_"+key;
37
- $(save_button).attr("disabled", "disabled");
38
- $(outer_div).addClass("loading");
39
- $('#'+form_id).children([".control-group"]).addClass('hidden')
40
- }
41
-
42
-
43
- $("tr.expandable").click(function(){
44
- $(this).next("ul").slideToggle();
45
-
46
- $(this).find('i.toggle').toggleClass("icon-chevron-down");
47
- });
48
-
49
- $("tr.expandable_new").click(function(){
50
- $(this).find('i').toggleClass("icon-chevron-down");
51
- });
52
-
53
- function deserialize(Params) {
54
- var Data = Params.split("&");
55
- var i = Data.length;
56
- var Result = {};
57
- while (i--) {
58
- var Pair = decodeURIComponent(Data[i]).split("=");
59
- var Key = Pair[0];
60
- var Val = Pair[1];
61
- Result[Key] = Val;
62
- }
63
- return Result;
64
- }
65
-
66
- var ajaxManager = (function() {
67
- var requests = [];
68
- var running = false;
69
- return {
70
- addReq: function(opt) {
71
- requests.push(opt);
72
- },
73
- removeReq: function(opt) {
74
- if( $.inArray(opt, requests) > -1 )
75
- requests.splice($.inArray(opt, requests), 1);
76
- },
77
- runNow: function(){
78
- clearTimeout(self.tid);
79
- if (!running) {
80
- run();
81
- }
82
- },
83
- run: function() {
84
- running = true;
85
- var self = this,
86
- orgSuc;
87
-
88
- if( requests.length ) {
89
- oriSuc = requests[0].complete;
90
-
91
- // combine data from multiple requests
92
- if (requests.length > 1) {
93
- var data = deserialize(requests[0].data.replace(/\+/g," "));
94
- form = [requests[0].form]
95
- for (var i=requests.length-1; i>0 ; i--){
96
- req = requests.pop();
97
- adata = deserialize(req.data.replace(/\+/g," "));
98
- for (key in Object.keys(adata)){
99
- curKey = Object.keys(adata)[key] ;
100
- if (curKey.slice(0,12) == "generic_file"){
101
- data[curKey] = adata[curKey];
102
- form.push (req.form);
103
- }
104
- }
105
- }
106
- requests[0].data = $.param(data);
107
- requests[0].form = form;
108
- }
109
-
110
- requests[0].complete = function() {
111
- if( typeof oriSuc === 'function' ) oriSuc();
112
- if (typeof requests[0].form === 'object'){
113
- for (f in form) {
114
- form_id = form[f];
115
- after_ajax(form_id);
116
- }
117
- }
118
- requests.shift();
119
- self.run.apply(self, []);
120
- };
121
-
122
- $.ajax(requests[0]);
123
- } else {
124
- self.tid = setTimeout(function() {
125
- self.run.apply(self, []);
126
- }, 500);
127
- }
128
- running = false;
129
- },
130
- stop: function() {
131
- requests = [];
132
- clearTimeout(this.tid);
133
- }
134
- };
135
- }());
136
-
137
- ajaxManager.run();
138
-
139
-
140
- $("#permissions_save").click(runSave);
141
- $(".field-save").click(runSave);
142
-
143
- function runSave(e){
144
- e.preventDefault();
145
- var button = $(this);
146
- var form = $(button.parent().parent()[0]);
147
- var form_id = form[0].id
148
- before_ajax(form_id);
149
-
150
- ajaxManager.addReq({
151
- form: form_id,
152
- queue: "add_doc",
153
- url: form.attr("action"),
154
- dataType: "json",
155
- type: form.attr("method").toUpperCase(),
156
- data: form.serialize(),
157
- success: function (e) {
158
- eval(e.responseText);
159
- after_ajax(form_id);
160
- },
161
- error: function (e) {
162
- after_ajax(form_id);
163
- if (e.status == 200) {
164
- eval(e.responseText);
165
- } else {
166
- alert("Error! Status: "+e.status);
167
- }
168
- },
169
- });
170
- setTimeout(ajaxManager.runNow(),100);
171
- }
172
-
173
- <% end %>
174
-
175
-
176
1
  <%= render :partial => 'generic_files/breadcrumbs', :locals => {:include_file=>false} %>
177
2
  <h2 class="non lower">Batch Edit Descriptions &nbsp;&nbsp;&nbsp;<small>Click on labels below to edit file descriptions.</small> </h2>
178
3
  <div class="scrollx scrolly fileHeight"> <!-- original values -->
@@ -17,6 +17,6 @@ limitations under the License.
17
17
  <h1>User Support</h1>
18
18
  <h2>Service Inquiries and Requests</h2>
19
19
  <p>
20
- Use app/views/static/about.html.erb to override this file.
20
+ Use app/views/static/help.html.erb to override this file.
21
21
  </p>
22
22
 
@@ -5,7 +5,7 @@ $("a[rel=popover]").popover({ html: true });
5
5
 
6
6
  <h1>Edit Profile</h1>
7
7
  <div class="span45 well">
8
- <%= form_for @user, :url => sufia.profile_path(URI.escape(@user.to_s, '@.')), :html => {:multipart => true, :class => 'form-horizontal' } do |f| %>
8
+ <%= form_for @user, :url => sufia.profile_path(@user.to_param), :html => {:multipart => true, :class => 'form-horizontal' } do |f| %>
9
9
  <div class="control-group">
10
10
  <%= f.label :avatar, '<i class="icon-camera-retro"></i> Change picture'.html_safe, :class => "control-label" %>
11
11
  <div class="controls">
data/lib/sufia/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Sufia
2
- VERSION = "3.7.0"
2
+ VERSION = "3.7.2"
3
3
  end
@@ -106,7 +106,7 @@ describe UsersController do
106
106
  end
107
107
  it "redirects to show profile when user attempts to edit another profile" do
108
108
  get :edit, id: @another_user.user_key
109
- response.should redirect_to(@routes.url_helpers.profile_path(URI.escape(@another_user.user_key,'@.')))
109
+ response.should redirect_to(@routes.url_helpers.profile_path(@another_user.to_param))
110
110
  flash[:alert].should include("Permission denied: cannot access this page.")
111
111
  end
112
112
  describe "when the user has trophies" do
@@ -129,7 +129,7 @@ describe UsersController do
129
129
  describe "#update" do
130
130
  it "should not allow other users to update" do
131
131
  post :update, id: @another_user.user_key, user: { avatar: nil }
132
- response.should redirect_to(@routes.url_helpers.profile_path(URI.escape(@another_user.user_key,'@.')))
132
+ response.should redirect_to(@routes.url_helpers.profile_path(@another_user.to_param))
133
133
  flash[:alert].should include("Permission denied: cannot access this page.")
134
134
  end
135
135
  it "should set an avatar and redirect to profile" do
@@ -139,7 +139,7 @@ describe UsersController do
139
139
  Sufia.queue.should_receive(:push).with(s1).once
140
140
  f = fixture_file_upload('/world.png', 'image/png')
141
141
  post :update, id: @user.user_key, user: { avatar: f }
142
- response.should redirect_to(@routes.url_helpers.profile_path(URI.escape(@user.user_key,'@.')))
142
+ response.should redirect_to(@routes.url_helpers.profile_path(@user.to_param))
143
143
  flash[:notice].should include("Your profile has been updated")
144
144
  User.find_by_user_key(@user.user_key).avatar?.should be_true
145
145
  end
@@ -147,24 +147,31 @@ describe UsersController do
147
147
  Sufia.queue.should_receive(:push).never
148
148
  f = fixture_file_upload('/image.jp2', 'image/jp2')
149
149
  post :update, id: @user.user_key, user: { avatar: f }
150
- response.should redirect_to(@routes.url_helpers.edit_profile_path(URI.escape(@user.user_key,'@.')))
150
+ response.should redirect_to(@routes.url_helpers.edit_profile_path(@user.to_param))
151
151
  flash[:alert].should include("Avatar You are not allowed to upload \"jp2\" files, allowed types: jpg, jpeg, png, gif, bmp, tif, tiff")
152
152
  end
153
153
  it "should validate the size of an avatar" do
154
154
  f = fixture_file_upload('/4-20.png', 'image/png')
155
155
  Sufia.queue.should_receive(:push).never
156
156
  post :update, id: @user.user_key, user: { avatar: f }
157
- response.should redirect_to(@routes.url_helpers.edit_profile_path(URI.escape(@user.user_key,'@.')))
157
+ response.should redirect_to(@routes.url_helpers.edit_profile_path(@user.to_param))
158
158
  flash[:alert].should include("Avatar file size must be less than 2MB")
159
159
  end
160
- it "should delete an avatar" do
161
- s1 = double('one')
162
- UserEditProfileEventJob.should_receive(:new).with(@user.user_key).and_return(s1)
163
- Sufia.queue.should_receive(:push).with(s1).once
164
- post :update, id: @user.user_key, delete_avatar: true
165
- response.should redirect_to(@routes.url_helpers.profile_path(URI.escape(@user.user_key,'@.')))
166
- flash[:notice].should include("Your profile has been updated")
167
- @user.avatar?.should be_false
160
+ context "user with existing avatar" do
161
+ before do
162
+ f = fixture_file_upload('/world.png', 'image/png')
163
+ @user.avatar = f
164
+ @user.save
165
+ end
166
+ it "should delete an avatar" do
167
+ s1 = double('one')
168
+ UserEditProfileEventJob.should_receive(:new).with(@user.user_key).and_return(s1)
169
+ Sufia.queue.should_receive(:push).with(s1).once
170
+ post :update, id: @user.user_key, delete_avatar: true
171
+ response.should redirect_to(@routes.url_helpers.profile_path(@user.to_param))
172
+ flash[:notice].should include("Your profile has been updated")
173
+ User.find_by_user_key(@user.user_key).avatar?.should be_false
174
+ end
168
175
  end
169
176
  it "should refresh directory attributes" do
170
177
  s1 = double('one')
@@ -172,7 +179,7 @@ describe UsersController do
172
179
  Sufia.queue.should_receive(:push).with(s1).once
173
180
  User.any_instance.should_receive(:populate_attributes).once
174
181
  post :update, id: @user.user_key, update_directory: true
175
- response.should redirect_to(@routes.url_helpers.profile_path(URI.escape(@user.user_key,'@.')))
182
+ response.should redirect_to(@routes.url_helpers.profile_path(@user.to_param))
176
183
  flash[:notice].should include("Your profile has been updated")
177
184
  end
178
185
  it "should set an social handles" do
@@ -181,7 +188,7 @@ describe UsersController do
181
188
  @user.googleplus_handle.blank?.should be_true
182
189
  @user.linkedin_handle.blank?.should be_true
183
190
  post :update, id: @user.user_key, user: { twitter_handle: 'twit', facebook_handle: 'face', googleplus_handle: 'goo', linkedin_handle:"link" }
184
- response.should redirect_to(@routes.url_helpers.profile_path(URI.escape(@user.user_key,'@.')))
191
+ response.should redirect_to(@routes.url_helpers.profile_path(@user.to_param))
185
192
  flash[:notice].should include("Your profile has been updated")
186
193
  u = User.find_by_user_key(@user.user_key)
187
194
  u.twitter_handle.should == 'twit'
@@ -200,7 +207,7 @@ describe UsersController do
200
207
  expect {
201
208
  post :update, id: user.user_key, 'remove_trophy_'+file.noid => 'yes'
202
209
  }.to change { user.trophies.count }.by(-1)
203
- response.should redirect_to(@routes.url_helpers.profile_path(URI.escape(user.user_key,'@.')))
210
+ response.should redirect_to(@routes.url_helpers.profile_path(user.to_param))
204
211
  flash[:notice].should include("Your profile has been updated")
205
212
  end
206
213
  end
@@ -216,7 +223,7 @@ describe UsersController do
216
223
  UserFollowEventJob.should_receive(:new).with(@user.user_key, @another_user.user_key).and_return(s1)
217
224
  Sufia.queue.should_receive(:push).with(s1).once
218
225
  post :follow, id: @another_user.user_key
219
- response.should redirect_to(@routes.url_helpers.profile_path(URI.escape(@another_user.user_key,'@.')))
226
+ response.should redirect_to(@routes.url_helpers.profile_path(@another_user.to_param))
220
227
  flash[:notice].should include("You are following #{@another_user.user_key}")
221
228
  end
222
229
  it "should redirect to profile if already following and not log an event" do
@@ -224,14 +231,14 @@ describe UsersController do
224
231
  #Resque.should_receive(:enqueue).with(UserFollowEventJob, @user.user_key, @another_user.user_key).never
225
232
  Sufia.queue.should_receive(:push).never
226
233
  post :follow, id: @another_user.user_key
227
- response.should redirect_to(@routes.url_helpers.profile_path(URI.escape(@another_user.user_key,'@.')))
234
+ response.should redirect_to(@routes.url_helpers.profile_path(@another_user.to_param))
228
235
  flash[:notice].should include("You are following #{@another_user.user_key}")
229
236
  end
230
237
  it "should redirect to profile if user attempts to self-follow and not log an event" do
231
238
  #Resque.should_receive(:enqueue).with(UserFollowEventJob, @user.user_key, @user.user_key).never
232
239
  Sufia.queue.should_receive(:push).never
233
240
  post :follow, id: @user.user_key
234
- response.should redirect_to(@routes.url_helpers.profile_path(URI.escape(@user.user_key,'@.')))
241
+ response.should redirect_to(@routes.url_helpers.profile_path(@user.to_param))
235
242
  flash[:alert].should include("You cannot follow or unfollow yourself")
236
243
  end
237
244
  end
@@ -242,7 +249,7 @@ describe UsersController do
242
249
  UserUnfollowEventJob.should_receive(:new).with(@user.user_key, @another_user.user_key).and_return(s1)
243
250
  Sufia.queue.should_receive(:push).with(s1).once
244
251
  post :unfollow, id: @another_user.user_key
245
- response.should redirect_to(@routes.url_helpers.profile_path(URI.escape(@another_user.user_key,'@.')))
252
+ response.should redirect_to(@routes.url_helpers.profile_path(@another_user.to_param))
246
253
  flash[:notice].should include("You are no longer following #{@another_user.user_key}")
247
254
  end
248
255
  it "should redirect to profile if not following and not log an event" do
@@ -250,14 +257,14 @@ describe UsersController do
250
257
  #Resque.should_receive(:enqueue).with(UserUnfollowEventJob, @user.user_key, @another_user.user_key).never
251
258
  Sufia.queue.should_receive(:push).never
252
259
  post :unfollow, id: @another_user.user_key
253
- response.should redirect_to(@routes.url_helpers.profile_path(URI.escape(@another_user.user_key,'@.')))
260
+ response.should redirect_to(@routes.url_helpers.profile_path(@another_user.to_param))
254
261
  flash[:notice].should include("You are no longer following #{@another_user.user_key}")
255
262
  end
256
263
  it "should redirect to profile if user attempts to self-follow and not log an event" do
257
264
  #Resque.should_receive(:enqueue).with(UserUnfollowEventJob, @user.user_key, @user.user_key).never
258
265
  Sufia.queue.should_receive(:push).never
259
266
  post :unfollow, id: @user.user_key
260
- response.should redirect_to(@routes.url_helpers.profile_path(URI.escape(@user.user_key,'@.')))
267
+ response.should redirect_to(@routes.url_helpers.profile_path(@user.to_param))
261
268
  flash[:alert].should include("You cannot follow or unfollow yourself")
262
269
  end
263
270
  end
@@ -14,6 +14,7 @@ describe "User Profile" do
14
14
  it "should be editable" do
15
15
  click_link "curator1@example.com"
16
16
  click_link "Edit Your Profile"
17
+ page.should have_xpath("//form[@action='/users/curator1@example-dot-com']")
17
18
  fill_in 'user_twitter_handle', with: 'curatorOfData'
18
19
  click_button 'Save Profile'
19
20
  page.should have_content "Your profile has been updated"
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveFedoraPidBasedJob do
4
+ let (:user) {FactoryGirl.find_or_create(:user)}
5
+ let (:file) {GenericFile.new.tap do |gf|
6
+ gf.apply_depositor_metadata(user)
7
+ gf.save!
8
+ end}
9
+ after do
10
+ file.destroy
11
+ user.destroy
12
+ end
13
+ it "finds object" do
14
+ job = ActiveFedoraPidBasedJob.new(file.id)
15
+ expect(job.generic_file).to_not be_nil
16
+ expect(job.generic_file.reload_on_save?).to be_true
17
+ end
18
+ end
@@ -5,6 +5,7 @@ describe CharacterizeJob do
5
5
  @generic_file = GenericFile.new
6
6
  @generic_file.apply_depositor_metadata('jcoyne@example.com')
7
7
  @generic_file.save!
8
+ GenericFile.any_instance.stub(:reload_on_save?).and_return(false)
8
9
  end
9
10
 
10
11
  after do
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe Sufia::GenericFile::ReloadOnSave do
4
+ let(:user) { FactoryGirl.find_or_create(:user) }
5
+ let(:file) { GenericFile.new.tap { |f| f.apply_depositor_metadata(user); f.save! } }
6
+
7
+ it 'defaults to not call reload' do
8
+ file.should_not_receive(:reload)
9
+ file.save
10
+ end
11
+
12
+ it 'can be set to call reload' do
13
+ file.reload_on_save = true
14
+ file.should_receive(:reload)
15
+ file.save
16
+ end
17
+
18
+ it 'allows reload to be turned off and on' do
19
+ file.reload_on_save = true
20
+ file.should_receive(:reload).once
21
+ file.save
22
+ file.reload_on_save = false
23
+ file.save
24
+ end
25
+ end
@@ -1020,4 +1020,28 @@ describe GenericFile do
1020
1020
  end
1021
1021
  end
1022
1022
  end
1023
+
1024
+ describe "should create a full to_solr record" do
1025
+ before do
1026
+ subject.save
1027
+ end
1028
+ after do
1029
+ subject.destroy
1030
+ end
1031
+ it "gets both sets of data into solr" do
1032
+ f1= GenericFile.find(subject.id)
1033
+ f2 = GenericFile.find(subject.id)
1034
+ f2.reload_on_save = true
1035
+ f1.mime_type = "video/abc123"
1036
+ f2.title = "abc123"
1037
+ f1.save
1038
+ mime_type_key = Solrizer.solr_name("mime_type")
1039
+ title_key = Solrizer.solr_name("desc_metadata__title", :stored_searchable, type: :string)
1040
+ expect(f1.to_solr[mime_type_key]).to eq([f1.mime_type])
1041
+ expect(f1.to_solr[title_key]).to_not eq(f2.title)
1042
+ f2.save
1043
+ expect(f2.to_solr[mime_type_key]).to eq([f1.mime_type])
1044
+ expect(f2.to_solr[title_key]).to eq(f2.title)
1045
+ end
1046
+ end
1023
1047
  end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ describe GeoNamesResource do
4
+
5
+ it "should find locations" do
6
+ hits = GeoNamesResource.find_location("State")
7
+ hits.should_not be_nil
8
+ end
9
+ end
10
+
data/spec/spec_helper.rb CHANGED
@@ -6,6 +6,7 @@ require 'rspec/rails'
6
6
  require 'rspec/autorun'
7
7
  require 'capybara/rspec'
8
8
  require 'capybara/rails'
9
+ require 'equivalent-xml/rspec_matchers'
9
10
 
10
11
  require File.expand_path('../support/features', __FILE__)
11
12
 
@@ -77,6 +78,7 @@ RSpec.configure do |config|
77
78
 
78
79
  config.include Devise::TestHelpers, :type => :controller
79
80
  config.include EngineRoutes, :type => :controller
81
+ config.include EquivalentXml::RSpecMatchers
80
82
  end
81
83
 
82
84
  module FactoryGirl
@@ -5,10 +5,10 @@ class GeoNamesResource < ActiveResource::Base
5
5
 
6
6
  def self.collection_path(prefix_options = {}, query_options = nil)
7
7
  super(prefix_options, query_options).gsub(/\.json|\.xml/, "")
8
- end
9
-
10
- def self.instantiate_collection(collection, prefix_options = {})
11
- col = super(collection["geonames"],prefix_options)
8
+ end
9
+
10
+ def self.instantiate_collection(collection, original_params = {}, prefix_options = {})
11
+ col = super(collection["geonames"], original_params, prefix_options)
12
12
  col.map! {|item| { label: item.name+ (item.adminName1 ? ", " + item.adminName1 : "")+", " + item.countryName, value: item.name+ (item.adminName1 ? ", " + item.adminName1 : "")+", " + item.countryName} }
13
13
  return col
14
14
  end
@@ -11,6 +11,7 @@ module Sufia
11
11
  autoload :Metadata, 'sufia/models/generic_file/metadata'
12
12
  autoload :Versions, 'sufia/models/generic_file/versions'
13
13
  autoload :VirusCheck, 'sufia/models/generic_file/virus_check'
14
+ autoload :ReloadOnSave, 'sufia/models/generic_file/reload_on_save'
14
15
  include Sufia::ModelMethods
15
16
  include Sufia::Noid
16
17
  include Sufia::GenericFile::MimeTypes
@@ -25,6 +26,7 @@ module Sufia
25
26
  include Sufia::GenericFile::Metadata
26
27
  include Sufia::GenericFile::Versions
27
28
  include Sufia::GenericFile::VirusCheck
29
+ include Sufia::GenericFile::ReloadOnSave
28
30
 
29
31
  included do
30
32
  belongs_to :batch, :property => :is_part_of
@@ -0,0 +1,18 @@
1
+ # add this in here until we can use a version of Active Fedora that contains this ability
2
+ module Sufia
3
+ module GenericFile
4
+ module ReloadOnSave
5
+
6
+ attr_writer :reload_on_save
7
+
8
+ def reload_on_save?
9
+ !!@reload_on_save
10
+ end
11
+
12
+ def refresh
13
+ self.reload if reload_on_save?
14
+ end
15
+ end
16
+ end
17
+ end
18
+
@@ -8,7 +8,7 @@ class ActiveFedoraPidBasedJob
8
8
  self.pid = pid
9
9
  end
10
10
  def object
11
- @object ||= ActiveFedora::Base.find(pid, cast:true)
11
+ @object ||= ActiveFedora::Base.find(pid, cast:true).tap{|f| f.reload_on_save = true}
12
12
  end
13
13
  alias_method :generic_file, :object
14
14
  alias_method :generic_file_id, :pid
@@ -1,5 +1,5 @@
1
1
  module Sufia
2
2
  module Models
3
- VERSION = "3.6.1"
3
+ VERSION = "3.7.2"
4
4
  end
5
5
  end
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
27
27
  spec.add_development_dependency "rake"
28
28
 
29
29
  spec.add_dependency 'rails', '> 4.0.0', '< 5.0'
30
- spec.add_dependency 'activeresource' # No longer a dependency of rails 4.0
30
+ spec.add_dependency 'activeresource', "~>4.0.0" # No longer a dependency of rails 4.0
31
31
 
32
32
  spec.add_dependency "blacklight", "~> 4.7.0"
33
33
  spec.add_dependency "hydra-head", "~> 6.5.0"
data/sufia.gemspec CHANGED
@@ -21,6 +21,12 @@ Gem::Specification.new do |gem|
21
21
  gem.add_dependency 'blacklight_advanced_search', '~> 2.1.0'
22
22
  gem.add_dependency 'blacklight', '>= 4.5'
23
23
 
24
+ # sass-rails is typically generated into the app's gemfile by `rails new`
25
+ # In rails 3 it's put into the "assets" group and thus not available to the
26
+ # app. Blacklight 5.2 requires bootstrap-sass which requires (but does not
27
+ # declare a dependency on) sass-rails
28
+ gem.add_dependency 'sass-rails'
29
+
24
30
  gem.add_dependency 'hydra-batch-edit', '>= 1.1.1', '< 2.0.0'
25
31
 
26
32
  gem.add_dependency 'daemons', '1.1.9'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sufia
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.7.1
4
+ version: 3.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Coyne
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-20 00:00:00.000000000 Z
11
+ date: 2014-03-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sufia-models
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 3.7.1
19
+ version: 3.7.2
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 3.7.1
26
+ version: 3.7.2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: blacklight_advanced_search
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '4.5'
55
+ - !ruby/object:Gem::Dependency
56
+ name: sass-rails
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: hydra-batch-edit
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -223,6 +237,7 @@ files:
223
237
  - app/assets/javascripts/contact_form.js
224
238
  - app/assets/javascripts/sufia.js
225
239
  - app/assets/javascripts/sufia/audio.js
240
+ - app/assets/javascripts/sufia/batch_edit.js
226
241
  - app/assets/javascripts/sufia/batch_select_all.js
227
242
  - app/assets/javascripts/sufia/edit_metadata.js
228
243
  - app/assets/javascripts/sufia/fileupload.js
@@ -249,7 +264,7 @@ files:
249
264
  - app/assets/stylesheets/sufia-audio-overrides.css
250
265
  - app/assets/stylesheets/sufia.css.scss
251
266
  - app/assets/stylesheets/trophy.css
252
- - app/assets/stylesheets/video-js.css
267
+ - app/assets/stylesheets/video-js.css.erb
253
268
  - app/controllers/authorities_controller.rb
254
269
  - app/controllers/batch_controller.rb
255
270
  - app/controllers/batch_edits_controller.rb
@@ -560,6 +575,7 @@ files:
560
575
  - spec/jobs/ingest_local_file_job_spec.rb
561
576
  - spec/lib/sufia/id_service_spec.rb
562
577
  - spec/lib/sufia/upload_complete_behavior_spec.rb
578
+ - spec/models/active_fedora_pid_based_job_spec.rb
563
579
  - spec/models/audit_job_spec.rb
564
580
  - spec/models/batch_spec.rb
565
581
  - spec/models/batch_update_job_spec.rb
@@ -569,9 +585,11 @@ files:
569
585
  - spec/models/file_content_datastream_spec.rb
570
586
  - spec/models/fits_datastream_spec.rb
571
587
  - spec/models/generic_file/actions_spec.rb
588
+ - spec/models/generic_file/reload_on_save_spec.rb
572
589
  - spec/models/generic_file/visibility_spec.rb
573
590
  - spec/models/generic_file/web_form_spec.rb
574
591
  - spec/models/generic_file_spec.rb
592
+ - spec/models/geo_names_resource_spec.rb
575
593
  - spec/models/local_authority_spec.rb
576
594
  - spec/models/properties_datastream_spec.rb
577
595
  - spec/models/single_use_link_spec.rb
@@ -659,6 +677,7 @@ files:
659
677
  - sufia-models/lib/sufia/models/generic_file/metadata.rb
660
678
  - sufia-models/lib/sufia/models/generic_file/mime_types.rb
661
679
  - sufia-models/lib/sufia/models/generic_file/permissions.rb
680
+ - sufia-models/lib/sufia/models/generic_file/reload_on_save.rb
662
681
  - sufia-models/lib/sufia/models/generic_file/thumbnail.rb
663
682
  - sufia-models/lib/sufia/models/generic_file/trophies.rb
664
683
  - sufia-models/lib/sufia/models/generic_file/versions.rb
@@ -801,6 +820,7 @@ test_files:
801
820
  - spec/jobs/ingest_local_file_job_spec.rb
802
821
  - spec/lib/sufia/id_service_spec.rb
803
822
  - spec/lib/sufia/upload_complete_behavior_spec.rb
823
+ - spec/models/active_fedora_pid_based_job_spec.rb
804
824
  - spec/models/audit_job_spec.rb
805
825
  - spec/models/batch_spec.rb
806
826
  - spec/models/batch_update_job_spec.rb
@@ -810,9 +830,11 @@ test_files:
810
830
  - spec/models/file_content_datastream_spec.rb
811
831
  - spec/models/fits_datastream_spec.rb
812
832
  - spec/models/generic_file/actions_spec.rb
833
+ - spec/models/generic_file/reload_on_save_spec.rb
813
834
  - spec/models/generic_file/visibility_spec.rb
814
835
  - spec/models/generic_file/web_form_spec.rb
815
836
  - spec/models/generic_file_spec.rb
837
+ - spec/models/geo_names_resource_spec.rb
816
838
  - spec/models/local_authority_spec.rb
817
839
  - spec/models/properties_datastream_spec.rb
818
840
  - spec/models/single_use_link_spec.rb