annotate vendor/plugins/redmine_bibliography/app/controllers/publications_controller.rb @ 640:47b21bb3fa03 cannam_integration

Merge from branch "feature_36"
author Chris Cannam <chris.cannam@soundsoftware.ac.uk>
date Tue, 06 Sep 2011 12:23:51 +0100
parents 324678bbbe77
children 525f48af3f54
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@457 6
luis@560 7 model_object Publication
luis@626 8 before_filter :find_model_object, :except => [:new, :create, :index, :autocomplete_for_project, :add_author, :sort_author_order, :autocomplete_for_author, :get_user_info ]
luis@631 9 before_filter :find_project_by_project_id, :authorize, :only => [ :edit, :new, :update, :create ]
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@608 19 # @publication.authorships.build.build_author
luis@620 20 @author_options = [["#{User.current.name} (#{User.current.mail})", "#{User.current.class.to_s}_#{User.current.id.to_s}"]]
luis@614 21
luis@614 22
luis@519 23 end
luis@409 24
luis@539 25 def create
luisf@613 26 @project = Project.find(params[:project_id])
luisf@613 27
luis@620 28 @author_options = [["#{User.current.name} (#{User.current.mail})", "#{User.current.class.to_s}_#{User.current.id.to_s}"]]
luis@614 29
luis@390 30 @publication = Publication.new(params[:publication])
luis@553 31 @publication.projects << @project unless @project.nil?
luis@553 32
luis@448 33 if @publication.save
luis@445 34 flash[:notice] = "Successfully created publication."
luisf@613 35 redirect_to :action => :show, :id => @publication, :project_id => @project
luis@445 36 else
luisf@613 37 render :action => 'new', :project_id => @project
luis@445 38 end
luis@445 39 end
luis@445 40
luis@445 41 def index
luis@538 42 if !params[:project_id].nil?
luis@538 43 find_project_by_project_id
luis@538 44 @project = Project.find(params[:project_id])
luis@538 45 @publications = Publication.find :all, :joins => :projects, :conditions => ["project_id = ?", @project.id]
luis@538 46 else
luis@538 47 @publications = Publication.find :all
luis@538 48 end
luis@445 49 end
luis@445 50
luis@445 51 def new_from_bibfile
luis@391 52 @publication.current_step = session[:publication_step]
luis@409 53
luis@404 54 # contents of the paste text area
luis@404 55 bibtex_entry = params[:bibtex_entry]
luis@384 56
luis@404 57 # method for creating "pasted" bibtex entries
luis@424 58 if bibtex_entry
luis@409 59 parse_bibtex_list bibtex_entry
luis@404 60 end
luis@329 61 end
luis@329 62
luis@467 63 def add_author
luis@467 64 if (request.xhr?)
luis@467 65 render :text => User.find(params[:user_id]).name
luis@467 66 else
luis@467 67 # No? Then render an action.
luis@467 68 #render :action => 'view_attribute', :attr => @name
luis@467 69 logger.error { "ERRO ADD AUTHOR" }
luis@467 70 end
luis@467 71 end
luis@467 72
luis@547 73 def edit
luis@547 74 find_project_by_project_id unless params[:project_id].nil?
luis@609 75
luis@609 76 @edit_view = true;
luis@609 77
luis@620 78 @options = [["#{User.current.name} (#{User.current.mail})", "#{User.current.class.to_s}_#{User.current.id.to_s}"]]
luis@428 79 @publication = Publication.find(params[:id])
luis@626 80 @selected_bibtex_entry_type_id = @publication.bibtex_entry.entry_type
luis@626 81
luis@626 82 # todo: should be removed?
luis@626 83 @author_options = [["#{User.current.name} (#{User.current.mail})", "#{User.current.class.to_s}_#{User.current.id.to_s}"]]
luis@430 84 end
luis@430 85
luis@445 86 def update
luis@448 87 @publication = Publication.find(params[:id])
luis@538 88
luis@626 89 # todo: should be removed?
luis@626 90 @author_options = [["#{User.current.name} (#{User.current.mail})", "#{User.current.class.to_s}_#{User.current.id.to_s}"]]
luis@626 91
luis@544 92 logger.error { "INSIDE THE UPDATE ACTION IN THE PUBLICATION CONTROLLER" }
luis@544 93
luis@430 94 if @publication.update_attributes(params[:publication])
luis@430 95 flash[:notice] = "Successfully updated Publication."
luis@538 96
luis@538 97 if !params[:project_id].nil?
luis@538 98 redirect_to :action => :show, :id => @publication, :project_id => params[:project_id]
luis@538 99 else
luis@538 100 redirect_to :action => :show, :id => @publication
luis@538 101 end
luis@430 102 else
luis@448 103 render :action => 'edit'
luis@448 104 end
luis@328 105 end
luis@328 106
luis@425 107 def show
luis@535 108 find_project_by_project_id unless params[:project_id].nil?
luis@547 109
luis@425 110 if @publication.nil?
luis@579 111 @publications = Publication.all
luis@579 112 render "index", :alert => 'The publication was not found!'
luis@425 113 else
luis@425 114 @authors = @publication.authors
luis@425 115 @bibtext_entry = @publication.bibtex_entry
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 autocomplete_for_project
luis@461 199 @publication = Publication.find(params[:id])
luis@477 200
luis@464 201 @projects = Project.active.like(params[:q]).find(:all, :limit => 100) - @publication.projects
luis@461 202 logger.debug "Query for \"#{params[:q]}\" returned \"#{@projects.size}\" results"
luis@461 203 render :layout => false
luis@409 204 end
luis@471 205
luis@601 206 def autocomplete_for_author
luis@519 207 @results = []
luis@480 208
luis@596 209 object_id = params[:object_id]
luis@598 210 @object_name = "publications[authorships_attributes][#{object_id}][search_results]"
luis@601 211
luis@601 212 authorships_list = Authorship.like_unique(params[:q]).find(:all, :limit => 100)
luis@480 213 users_list = User.active.like(params[:q]).find(:all, :limit => 100)
luis@480 214
luis@591 215 logger.debug "Query for \"#{params[:q]}\" returned \"#{authorships_list.size}\" authorships and \"#{users_list.size}\" users"
luis@480 216
luis@601 217 @results = users_list
luis@601 218
luis@601 219 # TODO: can be optimized…
luis@601 220 authorships_list.each do |authorship|
luis@601 221 flag = true
luis@601 222
luis@601 223 users_list.each do |user|
luis@601 224 if authorship.name == user.name && authorship.email == user.mail && authorship.institution == user.institution
luis@601 225 Rails.logger.debug { "Rejecting Authorship #{authorship.id}" }
luis@601 226 flag = false
luis@601 227 break
luis@601 228 end
luis@601 229 end
luis@601 230
luis@601 231 @results << authorship if flag
luis@592 232 end
luis@592 233
luis@598 234 render :layout => false
luis@598 235 end
luis@598 236
luis@598 237
luis@598 238 def get_user_info
luis@598 239 object_id = params[:object_id]
luis@598 240 value = params[:value]
luis@598 241 classname = Kernel.const_get(value.split('_')[0])
luis@592 242
luis@598 243 item = classname.find(value.split('_')[1])
luis@598 244
luis@598 245 name_field = "publication_authorships_attributes_#{object_id}_name_on_paper".to_sym
luis@598 246 email_field = "publication_authorships_attributes_#{object_id}_email".to_sym
luis@600 247 institution_field = "publication_authorships_attributes_#{object_id}_institution".to_sym
luis@600 248
luis@600 249 yes_radio = "publication_authorships_attributes_#{object_id}_identify_author_yes".to_sym
luis@598 250
luis@598 251 respond_to do |format|
luis@598 252 format.js {logger.error { "JS" }
luis@598 253 render(:update) {|page|
luis@598 254 page[name_field].value = item.name
luis@598 255 page[email_field].value = item.mail
luis@600 256 page[institution_field].value = item.institution
luis@600 257
luis@600 258 page[yes_radio].checked = true
luis@601 259 page[name_field].readOnly = true
luis@601 260 page[email_field].readOnly = true
luis@601 261 page[institution_field].readOnly = true
luis@598 262 }
luis@598 263 }
luis@598 264 end
luis@477 265 end
luis@471 266
luis@557 267 def sort_author_order
luis@557 268 params[:authorships].each_with_index do |id, index|
luis@557 269 Authorship.update_all(['auth_order=?', index+1], ['id=?', id])
luis@471 270 end
luis@471 271 render :nothing => true
luis@471 272 end
luis@574 273
luis@574 274 def add_project
luis@574 275 @projects = Project.find(params[:publication][:project_ids])
luis@574 276 @publication.projects << @projects
luis@579 277 @project = Project.find(params[:project_id])
luis@574 278
luis@574 279 # TODO luisf should also respond to HTML???
luis@574 280 respond_to do |format|
luis@574 281 format.html { redirect_to :back }
luis@574 282 format.js {
luis@574 283 render(:update) {|page|
luis@574 284 page[:add_project_form].reset
luis@574 285 page.replace_html :list_projects, :partial => 'list_projects'
luis@574 286 }
luis@574 287 }
luis@574 288 end
luis@574 289 end
luis@554 290
luis@579 291
luis@574 292 def remove_project
luis@579 293 @project = Project.find(params[:project_id])
luis@579 294 proj = Project.find(params[:remove_project_id])
luis@554 295
luis@574 296 if @publication.projects.length > 1
luis@579 297 if @publication.projects.exists? proj
luis@579 298 @publication.projects.delete proj if request.post?
luis@554 299 end
luis@554 300 else
luis@579 301 logger.error { "Cannot remove project from publication list" }
luis@554 302 end
luis@554 303
luis@591 304 logger.error { "CURRENT project name#{proj.name} and wanna delete #{@project.name}" }
luis@579 305
luis@579 306 render(:update) {|page|
luis@579 307 page.replace_html "list_projects", :partial => 'list_projects', :id => @publication
luis@579 308 }
luis@554 309 end
luis@579 310
luis@560 311 def destroy
luis@560 312 find_project_by_project_id
luis@560 313
luis@560 314 @publication.destroy
luis@560 315
luis@560 316 flash[:notice] = "Successfully deleted Publication."
luis@560 317 redirect_to :controller => :publications, :action => 'index', :project_id => @project
luis@560 318 end
luis@471 319
luis@538 320 private
luis@478 321
luis@328 322 end