annotate plugins/redmine_bibliography/app/controllers/publications_controller.rb @ 1267:b587499d50a9 redmine-2.2-integration

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