annotate plugins/redmine_bibliography/app/controllers/publications_controller.rb @ 1298:4f746d8966dd redmine_2.3_integration

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