annotate vendor/plugins/redmine_bibliography/app/controllers/publications_controller.rb @ 607:bdaabf6ee591 feature_36

added the @author_options array to the create action so that the validations still work
author luisf <luis.figueira@eecs.qmul.ac.uk>
date Thu, 18 Aug 2011 17:44:12 +0100
parents 1608b3cb50cd
children c7559c3a8d03
rev   line source
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@560 6 model_object Publication
luis@598 7 before_filter :find_model_object, :except => [:new, :create, :index, :autocomplete_for_project, :add_author, :sort_author_order, :autocomplete_for_author, :get_user_info ]
luis@560 8
luis@538 9 # before_filter :find_project, :except => [:autocomplete_for_project, :add_author, :sort_authors, :autocomplete_for_author]
luis@519 10
luis@404 11 def new
luis@539 12 find_project_by_project_id
luis@539 13 @publication = Publication.new
luis@445 14
luis@445 15 # we'll always want a new publication to have its bibtex entry
luis@539 16 @publication.build_bibtex_entry
luis@445 17
luis@446 18 # and at least one author
luis@480 19 # @publication.authorships.build.build_author
luis@446 20
luis@458 21 @project_id = params[:project_id]
luis@539 22 @current_user = User.current
luis@598 23
luis@607 24 @author_options = Authorship.like_unique(User.name).find(:all, :limit => 100)
luis@519 25 end
luis@409 26
luis@539 27 def create
luis@539 28 find_project_by_project_id
luis@539 29
luis@607 30 @author_options = Authorship.like_unique(User.name).find(:all, :limit => 100)
luis@607 31
luis@607 32
luis@390 33 @publication = Publication.new(params[:publication])
luis@553 34
luis@539 35 # @project = Project.find(params[:project_id])
luis@553 36 @publication.projects << @project unless @project.nil?
luis@553 37
luis@448 38 if @publication.save
luis@445 39 flash[:notice] = "Successfully created publication."
luis@459 40 redirect_to :action => :show, :id => @publication, :project_id => @project.id
luis@445 41 else
luis@445 42 render :action => 'new'
luis@445 43 end
luis@445 44 end
luis@445 45
luis@445 46 def index
luis@538 47 if !params[:project_id].nil?
luis@538 48 find_project_by_project_id
luis@538 49 @project = Project.find(params[:project_id])
luis@538 50 @publications = Publication.find :all, :joins => :projects, :conditions => ["project_id = ?", @project.id]
luis@538 51 else
luis@538 52 @publications = Publication.find :all
luis@538 53 end
luis@445 54 end
luis@445 55
luis@445 56 def new_from_bibfile
luis@391 57 @publication.current_step = session[:publication_step]
luis@409 58
luis@404 59 # contents of the paste text area
luis@404 60 bibtex_entry = params[:bibtex_entry]
luis@384 61
luis@404 62 # method for creating "pasted" bibtex entries
luis@424 63 if bibtex_entry
luis@409 64 parse_bibtex_list bibtex_entry
luis@404 65 end
luis@329 66 end
luis@329 67
luis@467 68 def add_author
luis@467 69 if (request.xhr?)
luis@467 70 render :text => User.find(params[:user_id]).name
luis@467 71 else
luis@467 72 # No? Then render an action.
luis@467 73 #render :action => 'view_attribute', :attr => @name
luis@467 74 logger.error { "ERRO ADD AUTHOR" }
luis@467 75 end
luis@467 76 end
luis@467 77
luis@547 78 def edit
luis@547 79 find_project_by_project_id unless params[:project_id].nil?
luis@547 80
luis@428 81 @publication = Publication.find(params[:id])
luis@544 82 @selected_bibtex_entry_type_id = @publication.bibtex_entry.entry_type
luis@430 83 end
luis@430 84
luis@445 85 def update
luis@448 86 @publication = Publication.find(params[:id])
luis@538 87
luis@544 88 logger.error { "INSIDE THE UPDATE ACTION IN THE PUBLICATION CONTROLLER" }
luis@544 89
luis@430 90 if @publication.update_attributes(params[:publication])
luis@430 91 flash[:notice] = "Successfully updated Publication."
luis@538 92
luis@538 93 if !params[:project_id].nil?
luis@538 94 redirect_to :action => :show, :id => @publication, :project_id => params[:project_id]
luis@538 95 else
luis@538 96 redirect_to :action => :show, :id => @publication
luis@538 97 end
luis@430 98 else
luis@448 99 render :action => 'edit'
luis@448 100 end
luis@328 101 end
luis@328 102
luis@425 103 def show
luis@535 104 find_project_by_project_id unless params[:project_id].nil?
luis@547 105
luis@425 106 if @publication.nil?
luis@579 107 @publications = Publication.all
luis@579 108 render "index", :alert => 'The publication was not found!'
luis@425 109 else
luis@425 110 @authors = @publication.authors
luis@425 111 @bibtext_entry = @publication.bibtex_entry
luis@425 112 end
luis@329 113 end
luis@329 114
luis@406 115 # parse string with bibtex authors
luis@406 116 def parse_authors(authors_entry)
luis@406 117 # in bibtex the authors are always seperated by "and"
luis@407 118 return authors_entry.split(" and ")
luis@406 119 end
luis@406 120
luis@406 121 # parses a list of bibtex
luis@406 122 def parse_bibtex_list(bibtex_list)
luis@406 123 bibliography = BibTeX.parse bibtex_list
luis@406 124
luis@406 125 no_entries = bibliography.data.length
luis@406 126
luis@406 127 # parses the bibtex entries
luis@406 128 bibliography.data.map do |d|
luis@407 129
luis@407 130 if d.class == BibTeX::Entry
luis@407 131 create_bibtex_entry d
luis@407 132 end
luis@406 133 end
luis@407 134 end
luis@407 135
luis@409 136 def create_bibtex_entry(d)
luis@407 137 @publication = Publication.new
luis@407 138 @bentry = BibtexEntry.new
luis@407 139 authors = []
luis@407 140 institution = ""
luis@407 141 email = ""
luis@409 142
luis@407 143 d.fields.keys.map do |field|
luis@407 144 case field.to_s
luis@407 145 when "author"
luis@407 146 authors = parse_authors d[field]
luis@407 147 when "title"
luis@407 148 @publication.title = d[field]
luis@407 149 when "institution"
luis@407 150 institution = d[field]
luis@407 151 when "email"
luis@407 152 email = d[field]
luis@407 153 else
luis@407 154 @bentry[field] = d[field]
luis@407 155 end
luis@407 156 end
luis@406 157
luis@406 158 @publication.bibtex_entry = @bentry
luis@407 159 @publication.save
luis@409 160
luis@424 161 # what is this for???
luis@424 162 # @created_publications << @publication.id
luis@409 163
luis@407 164 # need to save all authors
luis@407 165 # and establish the author-publication association
luis@407 166 # via the authorships table
luis@407 167 authors.each_with_index.map do |authorname, idx|
luis@407 168 author = Author.new(:name => authorname)
luis@407 169 if author.save!
luis@407 170 puts "SAVED"
luis@407 171 else
luis@407 172 puts "NOT SAVED"
luis@406 173 end
luis@406 174
luis@407 175 author.authorships.create!(
luis@444 176 :publication => @publication,
luis@444 177 :institution => institution,
luis@444 178 :email => email,
luis@444 179 :order => idx)
luis@407 180 end
luis@407 181 end
luis@409 182
luis@407 183 # parses the bibtex file
luis@407 184 def parse_bibtex_file
luis@407 185
luis@406 186 end
luis@406 187
luis@444 188 def import
luis@444 189 @publication = Publication.new
luis@444 190
luis@444 191
luis@444 192 end
luis@461 193
luis@461 194 def autocomplete_for_project
luis@461 195 @publication = Publication.find(params[:id])
luis@477 196
luis@464 197 @projects = Project.active.like(params[:q]).find(:all, :limit => 100) - @publication.projects
luis@461 198 logger.debug "Query for \"#{params[:q]}\" returned \"#{@projects.size}\" results"
luis@461 199 render :layout => false
luis@409 200 end
luis@471 201
luis@601 202 def autocomplete_for_author
luis@519 203 @results = []
luis@480 204
luis@596 205 object_id = params[:object_id]
luis@598 206 @object_name = "publications[authorships_attributes][#{object_id}][search_results]"
luis@601 207
luis@601 208 authorships_list = Authorship.like_unique(params[:q]).find(:all, :limit => 100)
luis@480 209 users_list = User.active.like(params[:q]).find(:all, :limit => 100)
luis@480 210
luis@591 211 logger.debug "Query for \"#{params[:q]}\" returned \"#{authorships_list.size}\" authorships and \"#{users_list.size}\" users"
luis@480 212
luis@601 213 @results = users_list
luis@601 214
luis@601 215 # TODO: can be optimized…
luis@601 216 authorships_list.each do |authorship|
luis@601 217 flag = true
luis@601 218
luis@601 219 users_list.each do |user|
luis@601 220 if authorship.name == user.name && authorship.email == user.mail && authorship.institution == user.institution
luis@601 221 Rails.logger.debug { "Rejecting Authorship #{authorship.id}" }
luis@601 222 flag = false
luis@601 223 break
luis@601 224 end
luis@601 225 end
luis@601 226
luis@601 227 @results << authorship if flag
luis@592 228 end
luis@592 229
luis@598 230 render :layout => false
luis@598 231 end
luis@598 232
luis@598 233
luis@598 234 def get_user_info
luis@598 235 object_id = params[:object_id]
luis@598 236 value = params[:value]
luis@598 237 classname = Kernel.const_get(value.split('_')[0])
luis@592 238
luis@598 239 item = classname.find(value.split('_')[1])
luis@598 240
luis@598 241 name_field = "publication_authorships_attributes_#{object_id}_name_on_paper".to_sym
luis@598 242 email_field = "publication_authorships_attributes_#{object_id}_email".to_sym
luis@600 243 institution_field = "publication_authorships_attributes_#{object_id}_institution".to_sym
luis@600 244
luis@600 245 yes_radio = "publication_authorships_attributes_#{object_id}_identify_author_yes".to_sym
luis@598 246
luis@598 247 respond_to do |format|
luis@598 248 format.js {logger.error { "JS" }
luis@598 249 render(:update) {|page|
luis@598 250 page[name_field].value = item.name
luis@598 251 page[email_field].value = item.mail
luis@600 252 page[institution_field].value = item.institution
luis@600 253
luis@600 254 page[yes_radio].checked = true
luis@601 255 page[name_field].readOnly = true
luis@601 256 page[email_field].readOnly = true
luis@601 257 page[institution_field].readOnly = true
luis@598 258 }
luis@598 259 }
luis@598 260 end
luis@477 261 end
luis@471 262
luis@557 263 def sort_author_order
luis@557 264 params[:authorships].each_with_index do |id, index|
luis@557 265 Authorship.update_all(['auth_order=?', index+1], ['id=?', id])
luis@471 266 end
luis@471 267 render :nothing => true
luis@471 268 end
luis@574 269
luis@574 270 def add_project
luis@574 271 @projects = Project.find(params[:publication][:project_ids])
luis@574 272 @publication.projects << @projects
luis@579 273 @project = Project.find(params[:project_id])
luis@574 274
luis@574 275 # TODO luisf should also respond to HTML???
luis@574 276 respond_to do |format|
luis@574 277 format.html { redirect_to :back }
luis@574 278 format.js {
luis@574 279 render(:update) {|page|
luis@574 280 page[:add_project_form].reset
luis@574 281 page.replace_html :list_projects, :partial => 'list_projects'
luis@574 282 }
luis@574 283 }
luis@574 284 end
luis@574 285 end
luis@554 286
luis@579 287
luis@574 288 def remove_project
luis@579 289 @project = Project.find(params[:project_id])
luis@579 290 proj = Project.find(params[:remove_project_id])
luis@554 291
luis@574 292 if @publication.projects.length > 1
luis@579 293 if @publication.projects.exists? proj
luis@579 294 @publication.projects.delete proj if request.post?
luis@554 295 end
luis@554 296 else
luis@579 297 logger.error { "Cannot remove project from publication list" }
luis@554 298 end
luis@554 299
luis@591 300 logger.error { "CURRENT project name#{proj.name} and wanna delete #{@project.name}" }
luis@579 301
luis@579 302 render(:update) {|page|
luis@579 303 page.replace_html "list_projects", :partial => 'list_projects', :id => @publication
luis@579 304 }
luis@554 305 end
luis@579 306
luis@560 307 def destroy
luis@560 308 find_project_by_project_id
luis@560 309
luis@560 310 @publication.destroy
luis@560 311
luis@560 312 flash[:notice] = "Successfully deleted Publication."
luis@560 313 redirect_to :controller => :publications, :action => 'index', :project_id => @project
luis@560 314 end
luis@471 315
luis@538 316 private
luis@478 317
luis@328 318 end