luisf@613
|
1 # -*- coding: utf-8 -*-
|
luis@385
|
2 # vendor/plugins/redmine_bibliography/app/controllers/publications_controller.rb
|
luis@385
|
3
|
luis@328
|
4 class PublicationsController < ApplicationController
|
luis@425
|
5 unloadable
|
luis@946
|
6
|
luis@560
|
7 model_object Publication
|
luis@1317
|
8 before_filter :find_model_object, :only => [ :show, :add_project ]
|
luis@631
|
9 before_filter :find_project_by_project_id, :authorize, :only => [ :edit, :new, :update, :create ]
|
luis@946
|
10
|
luis@404
|
11 def new
|
luis@539
|
12 find_project_by_project_id
|
luis@539
|
13 @publication = Publication.new
|
luis@946
|
14
|
luis@445
|
15 # we'll always want a new publication to have its bibtex entry
|
luis@539
|
16 @publication.build_bibtex_entry
|
luis@946
|
17
|
luis@446
|
18 # and at least one author
|
luis@1071
|
19 # @publication.authorships.build.build_author
|
chris@647
|
20 @author_options = [["#{User.current.name} (@#{User.current.mail.partition('@')[2]})", "#{User.current.class.to_s}_#{User.current.id.to_s}"]]
|
luis@519
|
21 end
|
luis@409
|
22
|
luis@1071
|
23 def create
|
luisf@613
|
24 @project = Project.find(params[:project_id])
|
luisf@613
|
25
|
chris@661
|
26 @author_options = []
|
luis@614
|
27
|
luis@390
|
28 @publication = Publication.new(params[:publication])
|
luis@553
|
29 @publication.projects << @project unless @project.nil?
|
luis@946
|
30
|
luis@1071
|
31 if @publication.save
|
luis@666
|
32 @publication.notify_authors_publication_added(@project)
|
luis@946
|
33
|
luis@445
|
34 flash[:notice] = "Successfully created publication."
|
luisf@613
|
35 redirect_to :action => :show, :id => @publication, :project_id => @project
|
luis@445
|
36 else
|
luisf@613
|
37 render :action => 'new', :project_id => @project
|
luis@445
|
38 end
|
luis@445
|
39 end
|
luis@445
|
40
|
luis@445
|
41 def index
|
luis@538
|
42 if !params[:project_id].nil?
|
luis@538
|
43 find_project_by_project_id
|
luis@538
|
44 @project = Project.find(params[:project_id])
|
luis@538
|
45 @publications = Publication.find :all, :joins => :projects, :conditions => ["project_id = ?", @project.id]
|
luis@538
|
46 else
|
luis@538
|
47 @publications = Publication.find :all
|
luis@538
|
48 end
|
luis@445
|
49 end
|
luis@445
|
50
|
luis@445
|
51 def new_from_bibfile
|
luis@391
|
52 @publication.current_step = session[:publication_step]
|
luis@946
|
53
|
luis@404
|
54 # contents of the paste text area
|
luis@404
|
55 bibtex_entry = params[:bibtex_entry]
|
luis@384
|
56
|
luis@404
|
57 # method for creating "pasted" bibtex entries
|
luis@424
|
58 if bibtex_entry
|
luis@1071
|
59 parse_bibtex_list bibtex_entry
|
luis@404
|
60 end
|
luis@329
|
61 end
|
luis@329
|
62
|
luis@1274
|
63 def show_bibtex_fields
|
luis@1274
|
64 @fields = []
|
luis@675
|
65
|
luis@699
|
66 unless params[:value].empty?
|
luis@1274
|
67 @fields = BibtexEntryType.fields(params[:value])
|
luis@699
|
68 end
|
luis@675
|
69
|
luis@675
|
70 respond_to do |format|
|
luis@675
|
71 format.js {
|
luis@1274
|
72 render :show_bibtex_fields
|
luis@675
|
73 }
|
luis@675
|
74 end
|
luis@675
|
75 end
|
luis@675
|
76
|
luis@467
|
77 def add_author
|
luis@467
|
78 if (request.xhr?)
|
luis@467
|
79 render :text => User.find(params[:user_id]).name
|
luis@467
|
80 else
|
luis@467
|
81 # No? Then render an action.
|
luis@467
|
82 #render :action => 'view_attribute', :attr => @name
|
luis@675
|
83 logger.error { "Error while adding Author to publication." }
|
luis@467
|
84 end
|
luis@467
|
85 end
|
luis@467
|
86
|
luis@1071
|
87 def edit
|
luis@547
|
88 find_project_by_project_id unless params[:project_id].nil?
|
luis@946
|
89
|
luis@609
|
90 @edit_view = true;
|
luis@428
|
91 @publication = Publication.find(params[:id])
|
luis@626
|
92 @selected_bibtex_entry_type_id = @publication.bibtex_entry.entry_type
|
luis@626
|
93
|
luis@1071
|
94 @author_options = []
|
luis@946
|
95
|
luis@1071
|
96 @bibtype_fields = BibtexEntryType.fields(@selected_bibtex_entry_type_id)
|
luis@430
|
97 end
|
luis@430
|
98
|
luis@1071
|
99 def update
|
luis@1071
|
100 @publication = Publication.find(params[:id])
|
chris@661
|
101 @author_options = []
|
luis@626
|
102
|
luis@430
|
103 if @publication.update_attributes(params[:publication])
|
luis@430
|
104 flash[:notice] = "Successfully updated Publication."
|
luis@538
|
105
|
luis@1071
|
106 # expires the previosly cached entries
|
luis@1071
|
107 Rails.cache.delete "publication-#{@publication.id}-ieee"
|
luis@1071
|
108 Rails.cache.delete "publication-#{@publication.id}-bibtex"
|
luis@1071
|
109
|
luis@538
|
110 if !params[:project_id].nil?
|
luis@538
|
111 redirect_to :action => :show, :id => @publication, :project_id => params[:project_id]
|
luis@538
|
112 else
|
luis@538
|
113 redirect_to :action => :show, :id => @publication
|
luis@538
|
114 end
|
luis@430
|
115 else
|
luis@448
|
116 render :action => 'edit'
|
luis@1071
|
117 end
|
luis@328
|
118 end
|
luis@328
|
119
|
luis@946
|
120
|
luis@425
|
121 def show
|
luis@535
|
122 find_project_by_project_id unless params[:project_id].nil?
|
luis@946
|
123
|
luis@425
|
124 if @publication.nil?
|
luis@579
|
125 @publications = Publication.all
|
luis@579
|
126 render "index", :alert => 'The publication was not found!'
|
luis@425
|
127 else
|
luis@425
|
128 @authors = @publication.authors
|
luis@425
|
129 @bibtext_entry = @publication.bibtex_entry
|
luis@425
|
130 end
|
luis@329
|
131 end
|
luis@329
|
132
|
luis@406
|
133 # parse string with bibtex authors
|
luis@406
|
134 def parse_authors(authors_entry)
|
luis@406
|
135 # in bibtex the authors are always seperated by "and"
|
luis@407
|
136 return authors_entry.split(" and ")
|
luis@406
|
137 end
|
luis@406
|
138
|
luis@1071
|
139 # parses a list of bibtex
|
luis@406
|
140 def parse_bibtex_list(bibtex_list)
|
luis@406
|
141 bibliography = BibTeX.parse bibtex_list
|
luis@406
|
142
|
luis@406
|
143 no_entries = bibliography.data.length
|
luis@406
|
144
|
luis@406
|
145 # parses the bibtex entries
|
luis@406
|
146 bibliography.data.map do |d|
|
luis@407
|
147
|
luis@407
|
148 if d.class == BibTeX::Entry
|
luis@407
|
149 create_bibtex_entry d
|
luis@407
|
150 end
|
luis@406
|
151 end
|
luis@1071
|
152 end
|
luis@407
|
153
|
luis@1071
|
154 def create_bibtex_entry(d)
|
luis@407
|
155 @publication = Publication.new
|
luis@1071
|
156 @bentry = BibtexEntry.new
|
luis@407
|
157 authors = []
|
luis@407
|
158 institution = ""
|
luis@407
|
159 email = ""
|
luis@409
|
160
|
luis@407
|
161 d.fields.keys.map do |field|
|
luis@407
|
162 case field.to_s
|
luis@407
|
163 when "author"
|
luis@407
|
164 authors = parse_authors d[field]
|
luis@407
|
165 when "title"
|
luis@407
|
166 @publication.title = d[field]
|
luis@407
|
167 when "institution"
|
luis@407
|
168 institution = d[field]
|
luis@407
|
169 when "email"
|
luis@407
|
170 email = d[field]
|
luis@407
|
171 else
|
luis@407
|
172 @bentry[field] = d[field]
|
luis@407
|
173 end
|
luis@1071
|
174 end
|
luis@406
|
175
|
luis@406
|
176 @publication.bibtex_entry = @bentry
|
luis@407
|
177 @publication.save
|
luis@409
|
178
|
luis@1071
|
179 # what is this for???
|
luis@424
|
180 # @created_publications << @publication.id
|
luis@409
|
181
|
luis@407
|
182 # need to save all authors
|
luis@1071
|
183 # and establish the author-publication association
|
luis@1071
|
184 # via the authorships table
|
luis@407
|
185 authors.each_with_index.map do |authorname, idx|
|
luis@407
|
186 author = Author.new(:name => authorname)
|
luis@407
|
187 if author.save!
|
luis@946
|
188 # todo: catch the errors...
|
luis@407
|
189 puts "SAVED"
|
luis@407
|
190 else
|
luis@407
|
191 puts "NOT SAVED"
|
luis@406
|
192 end
|
luis@406
|
193
|
luis@407
|
194 author.authorships.create!(
|
luis@946
|
195 :publication => @publication,
|
luis@946
|
196 :institution => institution,
|
luis@946
|
197 :email => email,
|
luis@946
|
198 :order => idx)
|
luis@407
|
199 end
|
luis@407
|
200 end
|
luis@409
|
201
|
luis@407
|
202 # parses the bibtex file
|
luis@407
|
203 def parse_bibtex_file
|
luis@407
|
204
|
luis@406
|
205 end
|
luis@406
|
206
|
luis@444
|
207 def import
|
luis@444
|
208 @publication = Publication.new
|
luis@946
|
209
|
luis@946
|
210
|
luis@444
|
211 end
|
luis@946
|
212
|
luis@461
|
213 def autocomplete_for_project
|
luis@461
|
214 @publication = Publication.find(params[:id])
|
luis@946
|
215
|
luis@1253
|
216 @projects = Project.active.name_or_homepage_like(params[:q]).find(:all, :limit => 100) - @publication.projects
|
luis@461
|
217 logger.debug "Query for \"#{params[:q]}\" returned \"#{@projects.size}\" results"
|
luis@461
|
218 render :layout => false
|
luis@409
|
219 end
|
luis@471
|
220
|
luis@1071
|
221 def autocomplete_for_author
|
luis@519
|
222 @results = []
|
luis@946
|
223
|
luis@596
|
224 object_id = params[:object_id]
|
luis@598
|
225 @object_name = "publications[authorships_attributes][#{object_id}][search_results]"
|
luis@946
|
226
|
Chris@674
|
227 # cc 20110909 -- revert to like instead of like_unique -- see #289
|
luis@1283
|
228 authorships_list = Authorship.like(params[:term]).find(:all, :limit => 100)
|
luis@1283
|
229 users_list = User.active.like(params[:term]).find(:all, :limit => 100)
|
luis@480
|
230
|
luis@1283
|
231 logger.debug "Query for \"#{params[:term]}\" returned \"#{authorships_list.size}\" authorships and \"#{users_list.size}\" users"
|
luis@946
|
232
|
luis@601
|
233 @results = users_list
|
luis@601
|
234
|
luis@1071
|
235 # TODO: can be optimized…
|
luis@1071
|
236 authorships_list.each do |authorship|
|
luis@601
|
237 flag = true
|
luis@946
|
238
|
luis@601
|
239 users_list.each do |user|
|
luis@601
|
240 if authorship.name == user.name && authorship.email == user.mail && authorship.institution == user.institution
|
luis@601
|
241 Rails.logger.debug { "Rejecting Authorship #{authorship.id}" }
|
luis@601
|
242 flag = false
|
luis@601
|
243 break
|
luis@601
|
244 end
|
luis@601
|
245 end
|
luis@601
|
246
|
luis@601
|
247 @results << authorship if flag
|
luis@592
|
248 end
|
luis@592
|
249
|
luis@1071
|
250 render :layout => false
|
luis@598
|
251 end
|
luis@946
|
252
|
luis@598
|
253 def get_user_info
|
luis@598
|
254 object_id = params[:object_id]
|
luis@598
|
255 value = params[:value]
|
luis@598
|
256 classname = Kernel.const_get(value.split('_')[0])
|
luis@592
|
257
|
luis@598
|
258 item = classname.find(value.split('_')[1])
|
luis@598
|
259
|
luis@598
|
260 name_field = "publication_authorships_attributes_#{object_id}_name_on_paper".to_sym
|
luis@598
|
261 email_field = "publication_authorships_attributes_#{object_id}_email".to_sym
|
luis@600
|
262 institution_field = "publication_authorships_attributes_#{object_id}_institution".to_sym
|
luis@946
|
263
|
luis@600
|
264 yes_radio = "publication_authorships_attributes_#{object_id}_identify_author_yes".to_sym
|
luis@946
|
265
|
luis@598
|
266 respond_to do |format|
|
luis@675
|
267 format.js {
|
luis@1071
|
268 render(:update) {|page|
|
luis@598
|
269 page[name_field].value = item.name
|
luis@598
|
270 page[email_field].value = item.mail
|
luis@600
|
271 page[institution_field].value = item.institution
|
luis@600
|
272
|
luis@600
|
273 page[yes_radio].checked = true
|
luis@601
|
274 page[name_field].readOnly = true
|
luis@601
|
275 page[email_field].readOnly = true
|
luis@601
|
276 page[institution_field].readOnly = true
|
luis@598
|
277 }
|
luis@598
|
278 }
|
luis@598
|
279 end
|
luis@477
|
280 end
|
luis@471
|
281
|
luis@557
|
282 def sort_author_order
|
luis@557
|
283 params[:authorships].each_with_index do |id, index|
|
luis@557
|
284 Authorship.update_all(['auth_order=?', index+1], ['id=?', id])
|
luis@471
|
285 end
|
luis@471
|
286 render :nothing => true
|
luis@471
|
287 end
|
luis@574
|
288
|
luis@574
|
289 def add_project
|
luis@1071
|
290 @projects = Project.find(params[:publication][:project_ids])
|
luis@574
|
291 @publication.projects << @projects
|
luis@1071
|
292 @project = Project.find(params[:project_id])
|
luis@946
|
293
|
luis@1071
|
294 # TODO luisf should also respond to HTML???
|
luis@574
|
295 respond_to do |format|
|
luis@574
|
296 format.html { redirect_to :back }
|
luis@1071
|
297 format.js {
|
luis@1071
|
298 render(:update) {|page|
|
luis@1071
|
299 page[:add_project_form].reset
|
luis@574
|
300 page.replace_html :list_projects, :partial => 'list_projects'
|
luis@574
|
301 }
|
luis@574
|
302 }
|
luis@574
|
303 end
|
luis@574
|
304 end
|
luis@946
|
305
|
luis@946
|
306
|
luis@574
|
307 def remove_project
|
luis@579
|
308 @project = Project.find(params[:project_id])
|
luis@579
|
309 proj = Project.find(params[:remove_project_id])
|
luis@554
|
310
|
luis@574
|
311 if @publication.projects.length > 1
|
luis@579
|
312 if @publication.projects.exists? proj
|
luis@579
|
313 @publication.projects.delete proj if request.post?
|
luis@554
|
314 end
|
luis@554
|
315 else
|
luis@1071
|
316 logger.error { "Cannot remove project from publication list" }
|
luis@554
|
317 end
|
luis@946
|
318
|
luis@591
|
319 logger.error { "CURRENT project name#{proj.name} and wanna delete #{@project.name}" }
|
luis@946
|
320
|
luis@1071
|
321 render(:update) {|page|
|
luis@579
|
322 page.replace_html "list_projects", :partial => 'list_projects', :id => @publication
|
luis@1071
|
323 }
|
luis@554
|
324 end
|
luis@946
|
325
|
luis@560
|
326 def destroy
|
luis@560
|
327 find_project_by_project_id
|
luis@946
|
328
|
luis@560
|
329 @publication.destroy
|
luis@946
|
330
|
luis@560
|
331 flash[:notice] = "Successfully deleted Publication."
|
luis@560
|
332 redirect_to :controller => :publications, :action => 'index', :project_id => @project
|
luis@560
|
333 end
|
luis@471
|
334
|
luis@538
|
335 private
|
luis@478
|
336
|
luis@328
|
337 end
|