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