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