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