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@946
|
6
|
luis@560
|
7 model_object Publication
|
luis@1317
|
8 before_filter :find_model_object, :only => [ :show, :add_project ]
|
luis@631
|
9 before_filter :find_project_by_project_id, :authorize, :only => [ :edit, :new, :update, :create ]
|
luis@946
|
10
|
luis@404
|
11 def new
|
luis@539
|
12 find_project_by_project_id
|
luis@539
|
13 @publication = Publication.new
|
luis@946
|
14
|
luis@445
|
15 # we'll always want a new publication to have its bibtex entry
|
luis@539
|
16 @publication.build_bibtex_entry
|
luis@946
|
17
|
luis@519
|
18 end
|
luis@409
|
19
|
luis@1071
|
20 def create
|
luisf@613
|
21 @project = Project.find(params[:project_id])
|
luisf@613
|
22
|
luis@390
|
23 @publication = Publication.new(params[:publication])
|
luis@553
|
24 @publication.projects << @project unless @project.nil?
|
luis@946
|
25
|
luis@1071
|
26 if @publication.save
|
luis@666
|
27 @publication.notify_authors_publication_added(@project)
|
luis@946
|
28
|
luis@445
|
29 flash[:notice] = "Successfully created publication."
|
luisf@613
|
30 redirect_to :action => :show, :id => @publication, :project_id => @project
|
luis@445
|
31 else
|
luisf@613
|
32 render :action => 'new', :project_id => @project
|
luis@445
|
33 end
|
luis@445
|
34 end
|
luis@445
|
35
|
luis@445
|
36 def index
|
luis@538
|
37 if !params[:project_id].nil?
|
luis@538
|
38 find_project_by_project_id
|
luis@538
|
39 @project = Project.find(params[:project_id])
|
luis@538
|
40 @publications = Publication.find :all, :joins => :projects, :conditions => ["project_id = ?", @project.id]
|
luis@538
|
41 else
|
luis@538
|
42 @publications = Publication.find :all
|
luis@538
|
43 end
|
luis@445
|
44 end
|
luis@445
|
45
|
luis@445
|
46 def new_from_bibfile
|
luis@391
|
47 @publication.current_step = session[:publication_step]
|
luis@946
|
48
|
luis@404
|
49 # contents of the paste text area
|
luis@404
|
50 bibtex_entry = params[:bibtex_entry]
|
luis@384
|
51
|
luis@404
|
52 # method for creating "pasted" bibtex entries
|
luis@424
|
53 if bibtex_entry
|
luis@1071
|
54 parse_bibtex_list bibtex_entry
|
luis@404
|
55 end
|
luis@329
|
56 end
|
luis@329
|
57
|
luis@1274
|
58 def show_bibtex_fields
|
luis@1274
|
59 @fields = []
|
luis@675
|
60
|
luis@699
|
61 unless params[:value].empty?
|
luis@1274
|
62 @fields = BibtexEntryType.fields(params[:value])
|
luis@699
|
63 end
|
luis@675
|
64
|
luis@675
|
65 respond_to do |format|
|
luis@675
|
66 format.js {
|
luis@1274
|
67 render :show_bibtex_fields
|
luis@675
|
68 }
|
luis@675
|
69 end
|
luis@675
|
70 end
|
luis@675
|
71
|
luis@467
|
72 def add_author
|
luis@467
|
73 if (request.xhr?)
|
luis@467
|
74 render :text => User.find(params[:user_id]).name
|
luis@467
|
75 else
|
luis@467
|
76 # No? Then render an action.
|
luis@467
|
77 #render :action => 'view_attribute', :attr => @name
|
luis@675
|
78 logger.error { "Error while adding Author to publication." }
|
luis@467
|
79 end
|
luis@467
|
80 end
|
luis@467
|
81
|
luis@1071
|
82 def edit
|
luis@547
|
83 find_project_by_project_id unless params[:project_id].nil?
|
luis@946
|
84
|
luis@609
|
85 @edit_view = true;
|
luis@428
|
86 @publication = Publication.find(params[:id])
|
luis@626
|
87 @selected_bibtex_entry_type_id = @publication.bibtex_entry.entry_type
|
luis@626
|
88
|
luis@1071
|
89 @bibtype_fields = BibtexEntryType.fields(@selected_bibtex_entry_type_id)
|
luis@430
|
90 end
|
luis@430
|
91
|
luis@1071
|
92 def update
|
luis@1071
|
93 @publication = Publication.find(params[:id])
|
luis@626
|
94
|
luis@430
|
95 if @publication.update_attributes(params[:publication])
|
luis@430
|
96 flash[:notice] = "Successfully updated Publication."
|
luis@538
|
97
|
luis@1071
|
98 # expires the previosly cached entries
|
luis@1071
|
99 Rails.cache.delete "publication-#{@publication.id}-ieee"
|
luis@1071
|
100 Rails.cache.delete "publication-#{@publication.id}-bibtex"
|
luis@1071
|
101
|
luis@538
|
102 if !params[:project_id].nil?
|
luis@538
|
103 redirect_to :action => :show, :id => @publication, :project_id => params[:project_id]
|
luis@538
|
104 else
|
luis@538
|
105 redirect_to :action => :show, :id => @publication
|
luis@538
|
106 end
|
luis@430
|
107 else
|
luis@448
|
108 render :action => 'edit'
|
luis@1071
|
109 end
|
luis@328
|
110 end
|
luis@328
|
111
|
luis@946
|
112
|
luis@425
|
113 def show
|
luis@535
|
114 find_project_by_project_id unless params[:project_id].nil?
|
luis@946
|
115
|
luis@425
|
116 if @publication.nil?
|
luis@579
|
117 @publications = Publication.all
|
luis@579
|
118 render "index", :alert => 'The publication was not found!'
|
luis@425
|
119 else
|
luis@425
|
120 @authors = @publication.authors
|
luis@425
|
121 @bibtext_entry = @publication.bibtex_entry
|
luis@425
|
122 end
|
luis@329
|
123 end
|
luis@329
|
124
|
luis@406
|
125 # parse string with bibtex authors
|
luis@406
|
126 def parse_authors(authors_entry)
|
luis@406
|
127 # in bibtex the authors are always seperated by "and"
|
luis@407
|
128 return authors_entry.split(" and ")
|
luis@406
|
129 end
|
luis@406
|
130
|
luis@1071
|
131 # parses a list of bibtex
|
luis@406
|
132 def parse_bibtex_list(bibtex_list)
|
luis@406
|
133 bibliography = BibTeX.parse bibtex_list
|
luis@406
|
134
|
luis@406
|
135 no_entries = bibliography.data.length
|
luis@406
|
136
|
luis@406
|
137 # parses the bibtex entries
|
luis@406
|
138 bibliography.data.map do |d|
|
luis@407
|
139
|
luis@407
|
140 if d.class == BibTeX::Entry
|
luis@407
|
141 create_bibtex_entry d
|
luis@407
|
142 end
|
luis@406
|
143 end
|
luis@1071
|
144 end
|
luis@407
|
145
|
luis@1071
|
146 def create_bibtex_entry(d)
|
luis@407
|
147 @publication = Publication.new
|
luis@1071
|
148 @bentry = BibtexEntry.new
|
luis@407
|
149 authors = []
|
luis@407
|
150 institution = ""
|
luis@407
|
151 email = ""
|
luis@409
|
152
|
luis@407
|
153 d.fields.keys.map do |field|
|
luis@407
|
154 case field.to_s
|
luis@407
|
155 when "author"
|
luis@407
|
156 authors = parse_authors d[field]
|
luis@407
|
157 when "title"
|
luis@407
|
158 @publication.title = d[field]
|
luis@407
|
159 when "institution"
|
luis@407
|
160 institution = d[field]
|
luis@407
|
161 when "email"
|
luis@407
|
162 email = d[field]
|
luis@407
|
163 else
|
luis@407
|
164 @bentry[field] = d[field]
|
luis@407
|
165 end
|
luis@1071
|
166 end
|
luis@406
|
167
|
luis@406
|
168 @publication.bibtex_entry = @bentry
|
luis@407
|
169 @publication.save
|
luis@409
|
170
|
luis@407
|
171 # need to save all authors
|
luis@1071
|
172 # and establish the author-publication association
|
luis@1071
|
173 # via the authorships table
|
luis@407
|
174 authors.each_with_index.map do |authorname, idx|
|
luis@407
|
175 author = Author.new(:name => authorname)
|
luis@407
|
176 if author.save!
|
luis@946
|
177 # todo: catch the errors...
|
luis@407
|
178 puts "SAVED"
|
luis@407
|
179 else
|
luis@407
|
180 puts "NOT SAVED"
|
luis@406
|
181 end
|
luis@406
|
182
|
luis@407
|
183 author.authorships.create!(
|
luis@946
|
184 :publication => @publication,
|
luis@946
|
185 :institution => institution,
|
luis@946
|
186 :email => email,
|
luis@946
|
187 :order => idx)
|
luis@407
|
188 end
|
luis@407
|
189 end
|
luis@409
|
190
|
luis@461
|
191 def autocomplete_for_project
|
luis@461
|
192 @publication = Publication.find(params[:id])
|
luis@946
|
193
|
luis@1253
|
194 @projects = Project.active.name_or_homepage_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@1071
|
199 def autocomplete_for_author
|
luis@519
|
200 @results = []
|
luis@946
|
201
|
luis@596
|
202 object_id = params[:object_id]
|
luis@598
|
203 @object_name = "publications[authorships_attributes][#{object_id}][search_results]"
|
luis@946
|
204
|
Chris@674
|
205 # cc 20110909 -- revert to like instead of like_unique -- see #289
|
luis@1411
|
206 authorships_list = Authorship.like(params[:term]).group('author_id').find(:all, :limit => 100)
|
luis@1411
|
207
|
luis@1411
|
208 authors_list = authorships_list.collect do |x| x.author end
|
luis@1411
|
209
|
luis@1283
|
210 users_list = User.active.like(params[:term]).find(:all, :limit => 100)
|
luis@480
|
211
|
luis@1411
|
212 logger.debug "Query for \"#{params[:term]}\" returned \"#{authors_list.size}\" authors and \"#{users_list.size}\" users"
|
luis@946
|
213
|
luis@1411
|
214 # will check if any of the members of the users list
|
luis@1411
|
215 # doesn't belong to the authors list
|
luis@601
|
216
|
luis@1411
|
217 @results = authors_list
|
luis@946
|
218
|
luis@1411
|
219 users_list.each do |user|
|
luis@1411
|
220 @results << user unless authors_list.include?(user.author)
|
luis@592
|
221 end
|
luis@592
|
222
|
luis@1417
|
223 logger.debug { "Autocomplete_for_author results --> #{@results}" }
|
luis@1417
|
224
|
luis@1071
|
225 render :layout => false
|
luis@598
|
226 end
|
luis@946
|
227
|
luis@557
|
228 def sort_author_order
|
luis@557
|
229 params[:authorships].each_with_index do |id, index|
|
luis@557
|
230 Authorship.update_all(['auth_order=?', index+1], ['id=?', id])
|
luis@471
|
231 end
|
luis@471
|
232 render :nothing => true
|
luis@471
|
233 end
|
luis@574
|
234
|
luis@574
|
235 def add_project
|
luis@1071
|
236 @projects = Project.find(params[:publication][:project_ids])
|
luis@574
|
237 @publication.projects << @projects
|
luis@1071
|
238 @project = Project.find(params[:project_id])
|
luis@946
|
239
|
luis@1071
|
240 # TODO luisf should also respond to HTML???
|
luis@574
|
241 respond_to do |format|
|
luis@574
|
242 format.html { redirect_to :back }
|
luis@1071
|
243 format.js {
|
luis@1071
|
244 render(:update) {|page|
|
luis@1071
|
245 page[:add_project_form].reset
|
luis@574
|
246 page.replace_html :list_projects, :partial => 'list_projects'
|
luis@574
|
247 }
|
luis@574
|
248 }
|
luis@574
|
249 end
|
luis@574
|
250 end
|
luis@946
|
251
|
luis@574
|
252 def remove_project
|
luis@579
|
253 @project = Project.find(params[:project_id])
|
luis@579
|
254 proj = Project.find(params[:remove_project_id])
|
luis@554
|
255
|
luis@574
|
256 if @publication.projects.length > 1
|
luis@579
|
257 if @publication.projects.exists? proj
|
luis@579
|
258 @publication.projects.delete proj if request.post?
|
luis@554
|
259 end
|
luis@554
|
260 else
|
luis@1071
|
261 logger.error { "Cannot remove project from publication list" }
|
luis@554
|
262 end
|
luis@946
|
263
|
luis@591
|
264 logger.error { "CURRENT project name#{proj.name} and wanna delete #{@project.name}" }
|
luis@946
|
265
|
luis@1071
|
266 render(:update) {|page|
|
luis@579
|
267 page.replace_html "list_projects", :partial => 'list_projects', :id => @publication
|
luis@1071
|
268 }
|
luis@554
|
269 end
|
luis@946
|
270
|
luis@560
|
271 def destroy
|
luis@1406
|
272 find_project_by_project_id unless params[:project_id].nil?
|
luis@1406
|
273 @publication = Publication.find(params[:id])
|
luis@1405
|
274
|
luis@560
|
275 @publication.destroy
|
luis@946
|
276
|
luis@560
|
277 flash[:notice] = "Successfully deleted Publication."
|
luis@560
|
278 redirect_to :controller => :publications, :action => 'index', :project_id => @project
|
luis@560
|
279 end
|
luis@471
|
280
|
luis@538
|
281 private
|
luis@478
|
282
|
luis@328
|
283 end
|