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