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