annotate vendor/plugins/redmine_bibliography/app/controllers/publications_controller.rb @ 684:cd7e10c4ab86 feature_36

Feature #238 - Edit Publication now showing the correct fields.
author luisf <luis.figueira@eecs.qmul.ac.uk>
date Fri, 16 Sep 2011 13:17:28 +0100
parents c3e6c51170fa
children 4481db876cdb
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
Chris@677 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@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
chris@647 20 @author_options = [["#{User.current.name} (@#{User.current.mail.partition('@')[2]})", "#{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
chris@661 28 @author_options = []
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@666 34 @publication.notify_authors_publication_added(@project)
luis@666 35
luis@445 36 flash[:notice] = "Successfully created publication."
luisf@613 37 redirect_to :action => :show, :id => @publication, :project_id => @project
luis@445 38 else
luisf@613 39 render :action => 'new', :project_id => @project
luis@445 40 end
luis@445 41 end
luis@445 42
luis@445 43 def index
luis@538 44 if !params[:project_id].nil?
luis@538 45 find_project_by_project_id
luis@538 46 @project = Project.find(params[:project_id])
luis@538 47 @publications = Publication.find :all, :joins => :projects, :conditions => ["project_id = ?", @project.id]
luis@538 48 else
luis@538 49 @publications = Publication.find :all
luis@538 50 end
luis@445 51 end
luis@445 52
luis@445 53 def new_from_bibfile
luis@391 54 @publication.current_step = session[:publication_step]
luis@409 55
luis@404 56 # contents of the paste text area
luis@404 57 bibtex_entry = params[:bibtex_entry]
luis@384 58
luis@404 59 # method for creating "pasted" bibtex entries
luis@424 60 if bibtex_entry
luis@409 61 parse_bibtex_list bibtex_entry
luis@404 62 end
luis@329 63 end
luis@329 64
Chris@677 65 def get_bibtex_required_fields
luis@684 66 all_fields = [ "editor", "publisher", "chapter", "pages", "volume", "series", "address", "edition", "month", "year", "type", "note", "number", "journal", "howpublished", "key", "school" ]
Chris@677 67
Chris@677 68 fields = Hash.new
Chris@677 69 fields[ 'article' ] = [ 'journal', 'year', 'volume', 'number', 'pages', 'month', 'note' ]
Chris@677 70 fields[ 'book' ] = [ 'editor', 'publisher', 'volume', 'series', 'address', 'edition', 'month', 'year', 'note' ]
Chris@677 71 fields[ 'booklet' ] = [ 'howpublished', 'address', 'year', 'month', 'note', 'key' ]
Chris@677 72 fields[ 'conference' ] = [ 'booktitle', 'year', 'editor', 'pages', 'organization', 'publisher', 'address', 'month', 'note' ]
Chris@677 73 fields[ 'inbook' ] = [ 'editor', 'publisher', 'chapter', 'pages', 'volume', 'series', 'address', 'edition', 'year', 'note' ]
Chris@677 74 fields[ 'incollection' ] = [ 'editor', 'publisher', 'chapter', 'pages', 'volume', 'series', 'address', 'edition', 'year', 'note' ]
Chris@677 75 fields[ 'inproceedings' ] = [ 'booktitle', 'year', 'editor', 'pages', 'organization', 'publisher', 'address', 'month', 'note' ]
Chris@677 76 fields[ 'manual' ] = [ 'organization', 'address', 'edition', 'month', 'year', 'note' ]
Chris@677 77 fields[ 'masterthesis' ] = [ 'school', 'year', 'address', 'month', 'note' ]
Chris@677 78 fields[ 'misc' ] = [ 'howpublished', 'month', 'year', 'note' ]
Chris@677 79 fields[ 'phdthesis' ] = [ 'school', 'year', 'address', 'month', 'note' ]
Chris@677 80 fields[ 'proceedings' ] = [ 'booktitle', 'year', 'editor', 'pages', 'organization', 'publisher', 'address', 'month', 'note' ]
luis@683 81 fields[ 'techreport' ] = [ 'year', 'type', 'number', 'address', 'month', 'note' ]
Chris@677 82 fields[ 'unpublished' ] = [ 'note', 'month', 'year' ]
Chris@677 83
Chris@677 84 entrytype = BibtexEntryType.find(params[:value]).name
Chris@677 85
Chris@677 86 respond_to do |format|
Chris@677 87 format.js {
Chris@677 88 render(:update) {|page|
luis@683 89 all_fields.each_with_index do |field, idx|
Chris@677 90 unless fields[entrytype].include? field
luis@683 91 page["publication_bibtex_entry_attributes_#{field}"].up('p').hide()
luis@683 92 else
luis@683 93 page["publication_bibtex_entry_attributes_#{field}"].up('p').show()
Chris@677 94 end
Chris@677 95 end
Chris@677 96 }
Chris@677 97 }
Chris@677 98 end
Chris@677 99 end
Chris@677 100
luis@467 101 def add_author
luis@467 102 if (request.xhr?)
luis@467 103 render :text => User.find(params[:user_id]).name
luis@467 104 else
luis@467 105 # No? Then render an action.
luis@467 106 #render :action => 'view_attribute', :attr => @name
Chris@677 107 logger.error { "Error while adding Author to publication." }
luis@467 108 end
luis@467 109 end
luis@467 110
luis@547 111 def edit
luis@547 112 find_project_by_project_id unless params[:project_id].nil?
luis@609 113
luis@609 114 @edit_view = true;
luis@428 115 @publication = Publication.find(params[:id])
luis@626 116 @selected_bibtex_entry_type_id = @publication.bibtex_entry.entry_type
luis@626 117
chris@647 118 @author_options = []
luis@684 119
luis@684 120
luis@684 121 fields = Hash.new
luis@684 122 fields[ 'article' ] = [ 'journal', 'year', 'volume', 'number', 'pages', 'month', 'note' ]
luis@684 123 fields[ 'book' ] = [ 'editor', 'publisher', 'volume', 'series', 'address', 'edition', 'month', 'year', 'note' ]
luis@684 124 fields[ 'booklet' ] = [ 'howpublished', 'address', 'year', 'month', 'note', 'key' ]
luis@684 125 fields[ 'conference' ] = [ 'booktitle', 'year', 'editor', 'pages', 'organization', 'publisher', 'address', 'month', 'note' ]
luis@684 126 fields[ 'inbook' ] = [ 'editor', 'publisher', 'chapter', 'pages', 'volume', 'series', 'address', 'edition', 'year', 'note' ]
luis@684 127 fields[ 'incollection' ] = [ 'editor', 'publisher', 'chapter', 'pages', 'volume', 'series', 'address', 'edition', 'year', 'note' ]
luis@684 128 fields[ 'inproceedings' ] = [ 'booktitle', 'year', 'editor', 'pages', 'organization', 'publisher', 'address', 'month', 'note' ]
luis@684 129 fields[ 'manual' ] = [ 'organization', 'address', 'edition', 'month', 'year', 'note' ]
luis@684 130 fields[ 'masterthesis' ] = [ 'school', 'year', 'address', 'month', 'note' ]
luis@684 131 fields[ 'misc' ] = [ 'howpublished', 'month', 'year', 'note' ]
luis@684 132 fields[ 'phdthesis' ] = [ 'school', 'year', 'address', 'month', 'note' ]
luis@684 133 fields[ 'proceedings' ] = [ 'booktitle', 'year', 'editor', 'pages', 'organization', 'publisher', 'address', 'month', 'note' ]
luis@684 134 fields[ 'techreport' ] = [ 'year', 'type', 'number', 'address', 'month', 'note' ]
luis@684 135 fields[ 'unpublished' ] = [ 'note', 'month', 'year' ]
luis@684 136
luis@684 137 entrytype = BibtexEntryType.find(@selected_bibtex_entry_type_id).name
luis@684 138
luis@684 139 @bibtype_fields = fields[entrytype]
luis@684 140
luis@430 141 end
luis@430 142
luis@445 143 def update
luis@448 144 @publication = Publication.find(params[:id])
luis@538 145
chris@661 146 @author_options = []
luis@626 147
luis@544 148 logger.error { "INSIDE THE UPDATE ACTION IN THE PUBLICATION CONTROLLER" }
luis@544 149
luis@430 150 if @publication.update_attributes(params[:publication])
luis@430 151 flash[:notice] = "Successfully updated Publication."
luis@538 152
luis@538 153 if !params[:project_id].nil?
luis@538 154 redirect_to :action => :show, :id => @publication, :project_id => params[:project_id]
luis@538 155 else
luis@538 156 redirect_to :action => :show, :id => @publication
luis@538 157 end
luis@430 158 else
luis@448 159 render :action => 'edit'
luis@448 160 end
luis@328 161 end
luis@328 162
luis@425 163 def show
luis@535 164 find_project_by_project_id unless params[:project_id].nil?
luis@684 165
luis@425 166 if @publication.nil?
luis@579 167 @publications = Publication.all
luis@579 168 render "index", :alert => 'The publication was not found!'
luis@425 169 else
luis@425 170 @authors = @publication.authors
luis@425 171 @bibtext_entry = @publication.bibtex_entry
luis@425 172 end
luis@329 173 end
luis@329 174
luis@406 175 # parse string with bibtex authors
luis@406 176 def parse_authors(authors_entry)
luis@406 177 # in bibtex the authors are always seperated by "and"
luis@407 178 return authors_entry.split(" and ")
luis@406 179 end
luis@406 180
luis@406 181 # parses a list of bibtex
luis@406 182 def parse_bibtex_list(bibtex_list)
luis@406 183 bibliography = BibTeX.parse bibtex_list
luis@406 184
luis@406 185 no_entries = bibliography.data.length
luis@406 186
luis@406 187 # parses the bibtex entries
luis@406 188 bibliography.data.map do |d|
luis@407 189
luis@407 190 if d.class == BibTeX::Entry
luis@407 191 create_bibtex_entry d
luis@407 192 end
luis@406 193 end
luis@407 194 end
luis@407 195
luis@409 196 def create_bibtex_entry(d)
luis@407 197 @publication = Publication.new
luis@407 198 @bentry = BibtexEntry.new
luis@407 199 authors = []
luis@407 200 institution = ""
luis@407 201 email = ""
luis@409 202
luis@407 203 d.fields.keys.map do |field|
luis@407 204 case field.to_s
luis@407 205 when "author"
luis@407 206 authors = parse_authors d[field]
luis@407 207 when "title"
luis@407 208 @publication.title = d[field]
luis@407 209 when "institution"
luis@407 210 institution = d[field]
luis@407 211 when "email"
luis@407 212 email = d[field]
luis@407 213 else
luis@407 214 @bentry[field] = d[field]
luis@407 215 end
luis@407 216 end
luis@406 217
luis@406 218 @publication.bibtex_entry = @bentry
luis@407 219 @publication.save
luis@409 220
luis@424 221 # what is this for???
luis@424 222 # @created_publications << @publication.id
luis@409 223
luis@407 224 # need to save all authors
luis@407 225 # and establish the author-publication association
luis@407 226 # via the authorships table
luis@407 227 authors.each_with_index.map do |authorname, idx|
luis@407 228 author = Author.new(:name => authorname)
luis@407 229 if author.save!
luis@407 230 puts "SAVED"
luis@407 231 else
luis@407 232 puts "NOT SAVED"
luis@406 233 end
luis@406 234
luis@407 235 author.authorships.create!(
luis@444 236 :publication => @publication,
luis@444 237 :institution => institution,
luis@444 238 :email => email,
luis@444 239 :order => idx)
luis@407 240 end
luis@407 241 end
luis@409 242
luis@407 243 # parses the bibtex file
luis@407 244 def parse_bibtex_file
luis@407 245
luis@406 246 end
luis@406 247
luis@444 248 def import
luis@444 249 @publication = Publication.new
luis@444 250
luis@444 251
luis@444 252 end
luis@461 253
luis@461 254 def autocomplete_for_project
luis@461 255 @publication = Publication.find(params[:id])
luis@477 256
luis@464 257 @projects = Project.active.like(params[:q]).find(:all, :limit => 100) - @publication.projects
luis@461 258 logger.debug "Query for \"#{params[:q]}\" returned \"#{@projects.size}\" results"
luis@461 259 render :layout => false
luis@409 260 end
luis@471 261
luis@601 262 def autocomplete_for_author
luis@519 263 @results = []
luis@480 264
luis@596 265 object_id = params[:object_id]
luis@598 266 @object_name = "publications[authorships_attributes][#{object_id}][search_results]"
luis@601 267
Chris@676 268 # cc 20110909 -- revert to like instead of like_unique -- see #289
Chris@676 269 authorships_list = Authorship.like(params[:q]).find(:all, :limit => 100)
luis@480 270 users_list = User.active.like(params[:q]).find(:all, :limit => 100)
luis@480 271
luis@591 272 logger.debug "Query for \"#{params[:q]}\" returned \"#{authorships_list.size}\" authorships and \"#{users_list.size}\" users"
luis@480 273
luis@601 274 @results = users_list
luis@601 275
luis@601 276 # TODO: can be optimized…
luis@601 277 authorships_list.each do |authorship|
luis@601 278 flag = true
luis@601 279
luis@601 280 users_list.each do |user|
luis@601 281 if authorship.name == user.name && authorship.email == user.mail && authorship.institution == user.institution
luis@601 282 Rails.logger.debug { "Rejecting Authorship #{authorship.id}" }
luis@601 283 flag = false
luis@601 284 break
luis@601 285 end
luis@601 286 end
luis@601 287
luis@601 288 @results << authorship if flag
luis@592 289 end
luis@592 290
luis@598 291 render :layout => false
luis@598 292 end
luis@598 293
luis@598 294
luis@598 295 def get_user_info
luis@598 296 object_id = params[:object_id]
luis@598 297 value = params[:value]
luis@598 298 classname = Kernel.const_get(value.split('_')[0])
luis@592 299
luis@598 300 item = classname.find(value.split('_')[1])
luis@598 301
luis@598 302 name_field = "publication_authorships_attributes_#{object_id}_name_on_paper".to_sym
luis@598 303 email_field = "publication_authorships_attributes_#{object_id}_email".to_sym
luis@600 304 institution_field = "publication_authorships_attributes_#{object_id}_institution".to_sym
luis@600 305
luis@600 306 yes_radio = "publication_authorships_attributes_#{object_id}_identify_author_yes".to_sym
luis@598 307
luis@598 308 respond_to do |format|
Chris@677 309 format.js {
luis@598 310 render(:update) {|page|
luis@598 311 page[name_field].value = item.name
luis@598 312 page[email_field].value = item.mail
luis@600 313 page[institution_field].value = item.institution
luis@600 314
luis@600 315 page[yes_radio].checked = true
luis@601 316 page[name_field].readOnly = true
luis@601 317 page[email_field].readOnly = true
luis@601 318 page[institution_field].readOnly = true
luis@598 319 }
luis@598 320 }
luis@598 321 end
luis@477 322 end
luis@471 323
luis@557 324 def sort_author_order
luis@557 325 params[:authorships].each_with_index do |id, index|
luis@557 326 Authorship.update_all(['auth_order=?', index+1], ['id=?', id])
luis@471 327 end
luis@471 328 render :nothing => true
luis@471 329 end
luis@574 330
luis@574 331 def add_project
luis@574 332 @projects = Project.find(params[:publication][:project_ids])
luis@574 333 @publication.projects << @projects
luis@579 334 @project = Project.find(params[:project_id])
luis@574 335
luis@574 336 # TODO luisf should also respond to HTML???
luis@574 337 respond_to do |format|
luis@574 338 format.html { redirect_to :back }
luis@574 339 format.js {
luis@574 340 render(:update) {|page|
luis@574 341 page[:add_project_form].reset
luis@574 342 page.replace_html :list_projects, :partial => 'list_projects'
luis@574 343 }
luis@574 344 }
luis@574 345 end
luis@574 346 end
luis@554 347
luis@579 348
luis@574 349 def remove_project
luis@579 350 @project = Project.find(params[:project_id])
luis@579 351 proj = Project.find(params[:remove_project_id])
luis@554 352
luis@574 353 if @publication.projects.length > 1
luis@579 354 if @publication.projects.exists? proj
luis@579 355 @publication.projects.delete proj if request.post?
luis@554 356 end
luis@554 357 else
luis@579 358 logger.error { "Cannot remove project from publication list" }
luis@554 359 end
luis@554 360
luis@591 361 logger.error { "CURRENT project name#{proj.name} and wanna delete #{@project.name}" }
luis@579 362
luis@579 363 render(:update) {|page|
luis@579 364 page.replace_html "list_projects", :partial => 'list_projects', :id => @publication
luis@579 365 }
luis@554 366 end
luis@579 367
luis@560 368 def destroy
luis@560 369 find_project_by_project_id
luis@560 370
luis@560 371 @publication.destroy
luis@560 372
luis@560 373 flash[:notice] = "Successfully deleted Publication."
luis@560 374 redirect_to :controller => :publications, :action => 'index', :project_id => @project
luis@560 375 end
luis@471 376
luis@538 377 private
luis@478 378
luis@328 379 end