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@462
|
6 before_filter :find_project_by_project_id, :except => [:autocomplete_for_project]
|
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@446
|
16 @publication.authors.build
|
luis@446
|
17
|
luis@458
|
18 @project_id = params[:project_id]
|
luis@458
|
19
|
luis@404
|
20 # the step we're at in the form
|
luis@459
|
21 # @publication.current_step = session[:publication_step]
|
luis@409
|
22
|
luis@409
|
23 @new_publications = []
|
luis@409
|
24 session[:publications] ||= {}
|
luis@393
|
25 end
|
luis@384
|
26
|
luis@404
|
27 def create
|
luis@390
|
28 @publication = Publication.new(params[:publication])
|
luis@458
|
29 @project = Project.find(params[:project_id])
|
luis@445
|
30
|
luis@458
|
31 logger.error { "FIGUEIRA" }
|
luis@458
|
32 Rails.logger.debug { @project }
|
luis@458
|
33
|
luis@458
|
34 @publication.projects << @project
|
luis@458
|
35
|
luis@448
|
36 if @publication.save
|
luis@445
|
37 flash[:notice] = "Successfully created publication."
|
luis@459
|
38 redirect_to :action => :show, :id => @publication, :project_id => @project.id
|
luis@445
|
39 else
|
luis@445
|
40 render :action => 'new'
|
luis@445
|
41 end
|
luis@445
|
42 end
|
luis@445
|
43
|
luis@445
|
44 def index
|
luis@458
|
45 @project = Project.find(params[:project_id])
|
luis@458
|
46 @publications = Publication.find :all, :joins => :projects, :conditions => ["project_id = ?", @project.id]
|
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@393
|
59
|
luis@404
|
60 # form's flow control
|
luis@390
|
61 if params[:back_button]
|
luis@390
|
62 @publication.previous_step
|
luis@390
|
63 else
|
luis@390
|
64 @publication.next_step
|
luis@390
|
65 end
|
luis@393
|
66
|
luis@390
|
67 session[:publication_step] = @publication.current_step
|
luis@429
|
68
|
luis@329
|
69 end
|
luis@329
|
70
|
luis@328
|
71
|
luis@445
|
72 def edit
|
luis@428
|
73 @publication = Publication.find(params[:id])
|
luis@430
|
74 end
|
luis@430
|
75
|
luis@445
|
76 def update
|
luis@448
|
77 @publication = Publication.find(params[:id])
|
luis@430
|
78 if @publication.update_attributes(params[:publication])
|
luis@430
|
79 flash[:notice] = "Successfully updated Publication."
|
luis@448
|
80 redirect_to @publication
|
luis@430
|
81 else
|
luis@448
|
82 render :action => 'edit'
|
luis@448
|
83 end
|
luis@328
|
84 end
|
luis@328
|
85
|
luis@425
|
86 def show
|
luis@430
|
87 logger.error "-------> No Show"
|
luis@430
|
88
|
luis@428
|
89 @publication = Publication.find(params[:id])
|
luis@425
|
90
|
luis@425
|
91 if @publication.nil?
|
luis@425
|
92 @publications = Publication.all
|
luis@425
|
93 render "index", :alert => 'Your Publications was not found!'
|
luis@425
|
94 else
|
luis@425
|
95 @authors = @publication.authors
|
luis@425
|
96 @bibtext_entry = @publication.bibtex_entry
|
luis@425
|
97
|
luis@425
|
98 respond_to do |format|
|
luis@425
|
99 format.html
|
luis@425
|
100 format.xml {render :xml => @publication}
|
luis@425
|
101 end
|
luis@425
|
102 end
|
luis@329
|
103 end
|
luis@329
|
104
|
luis@406
|
105 # parse string with bibtex authors
|
luis@406
|
106 def parse_authors(authors_entry)
|
luis@406
|
107 # in bibtex the authors are always seperated by "and"
|
luis@407
|
108 return authors_entry.split(" and ")
|
luis@406
|
109 end
|
luis@406
|
110
|
luis@406
|
111 # parses a list of bibtex
|
luis@406
|
112 def parse_bibtex_list(bibtex_list)
|
luis@406
|
113 bibliography = BibTeX.parse bibtex_list
|
luis@406
|
114
|
luis@406
|
115 no_entries = bibliography.data.length
|
luis@406
|
116
|
luis@406
|
117 # parses the bibtex entries
|
luis@406
|
118 bibliography.data.map do |d|
|
luis@407
|
119
|
luis@407
|
120 if d.class == BibTeX::Entry
|
luis@407
|
121 create_bibtex_entry d
|
luis@407
|
122 end
|
luis@406
|
123 end
|
luis@407
|
124 end
|
luis@407
|
125
|
luis@409
|
126 def create_bibtex_entry(d)
|
luis@407
|
127 @publication = Publication.new
|
luis@407
|
128 @bentry = BibtexEntry.new
|
luis@407
|
129 authors = []
|
luis@407
|
130 institution = ""
|
luis@407
|
131 email = ""
|
luis@409
|
132
|
luis@407
|
133 d.fields.keys.map do |field|
|
luis@407
|
134 case field.to_s
|
luis@407
|
135 when "author"
|
luis@407
|
136 authors = parse_authors d[field]
|
luis@407
|
137 when "title"
|
luis@407
|
138 @publication.title = d[field]
|
luis@407
|
139 when "institution"
|
luis@407
|
140 institution = d[field]
|
luis@407
|
141 when "email"
|
luis@407
|
142 email = d[field]
|
luis@407
|
143 else
|
luis@407
|
144 @bentry[field] = d[field]
|
luis@407
|
145 end
|
luis@407
|
146 end
|
luis@406
|
147
|
luis@406
|
148 @publication.bibtex_entry = @bentry
|
luis@407
|
149 @publication.save
|
luis@409
|
150
|
luis@424
|
151 # what is this for???
|
luis@424
|
152 # @created_publications << @publication.id
|
luis@409
|
153
|
luis@407
|
154 # need to save all authors
|
luis@407
|
155 # and establish the author-publication association
|
luis@407
|
156 # via the authorships table
|
luis@407
|
157 authors.each_with_index.map do |authorname, idx|
|
luis@407
|
158 author = Author.new(:name => authorname)
|
luis@407
|
159 if author.save!
|
luis@407
|
160 puts "SAVED"
|
luis@407
|
161 else
|
luis@407
|
162 puts "NOT SAVED"
|
luis@406
|
163 end
|
luis@406
|
164
|
luis@407
|
165 author.authorships.create!(
|
luis@444
|
166 :publication => @publication,
|
luis@444
|
167 :institution => institution,
|
luis@444
|
168 :email => email,
|
luis@444
|
169 :order => idx)
|
luis@407
|
170 end
|
luis@407
|
171 end
|
luis@409
|
172
|
luis@407
|
173 # parses the bibtex file
|
luis@407
|
174 def parse_bibtex_file
|
luis@407
|
175
|
luis@406
|
176 end
|
luis@406
|
177
|
luis@444
|
178 def import
|
luis@444
|
179 @publication = Publication.new
|
luis@444
|
180
|
luis@444
|
181
|
luis@444
|
182 end
|
luis@409
|
183
|
luis@461
|
184
|
luis@461
|
185 def add_project
|
luis@461
|
186 Rails.logger.debug { "ADD PROJECT" }
|
luis@461
|
187
|
luis@461
|
188 @project = Project.find(params[:project_id])
|
luis@461
|
189 @publication = Publication.find(params[:id])
|
luis@461
|
190
|
luis@461
|
191 @publication.projects << @project
|
luis@461
|
192
|
luis@461
|
193 end
|
luis@409
|
194
|
luis@461
|
195
|
luis@461
|
196 def autocomplete_for_project
|
luis@461
|
197 @publication = Publication.find(params[:id])
|
luis@461
|
198 @projects = Project.active.like(params[:q]).find(:all, :limit => 100) - @publication.projects
|
luis@462
|
199
|
luis@462
|
200 # @projects = Project.active.like(params[:q]).find(:all, :limit => 100)
|
luis@461
|
201 logger.debug "Query for \"#{params[:q]}\" returned \"#{@projects.size}\" results"
|
luis@461
|
202 render :layout => false
|
luis@409
|
203 end
|
luis@457
|
204
|
luis@457
|
205 private
|
luis@457
|
206
|
luis@459
|
207 # TODO: luisf. - only here for debugging purposes
|
luis@459
|
208 # Find project of id params[:project_id]
|
luis@459
|
209 def find_project_by_project_id
|
luis@459
|
210
|
luis@459
|
211 logger.error { "FIND PROJECT BY PROJECT ID" }
|
luis@459
|
212
|
luis@459
|
213 @project = Project.find(params[:project_id])
|
luis@459
|
214 rescue ActiveRecord::RecordNotFound
|
luis@459
|
215 render_404
|
luis@459
|
216 end
|
luis@328
|
217 end
|