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