annotate vendor/plugins/redmine_bibliography/app/controllers/publications_controller.rb @ 595:84e8d34d024c feature_36

DEV Commit: now generating the seach "author select box" with the appropriate options and element names and id's, so that it gets correctly submitted with the form.
author luisf <luis.figueira@eecs.qmul.ac.uk>
date Tue, 16 Aug 2011 02:06:36 +0100
parents 7234e0a90c62
children fcff84e1c1ce
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
chris@569 7 before_filter :find_model_object, :except => [:new, :create, :index, :autocomplete_for_project, :add_author, :sort_author_order, :autocomplete_for_author]
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@594 23
luis@594 24 @author_options = []
luis@594 25
luis@519 26 end
luis@409 27
luis@384 28
luis@539 29 def create
luis@539 30 find_project_by_project_id
luis@539 31
luis@390 32 @publication = Publication.new(params[:publication])
luis@553 33
luis@539 34 # @project = Project.find(params[:project_id])
luis@553 35 @publication.projects << @project unless @project.nil?
luis@553 36
luis@448 37 if @publication.save
luis@445 38 flash[:notice] = "Successfully created publication."
luis@459 39 redirect_to :action => :show, :id => @publication, :project_id => @project.id
luis@445 40 else
luis@445 41 render :action => 'new'
luis@445 42 end
luis@445 43 end
luis@445 44
luis@445 45 def index
luis@538 46 if !params[:project_id].nil?
luis@538 47 find_project_by_project_id
luis@538 48 @project = Project.find(params[:project_id])
luis@538 49 @publications = Publication.find :all, :joins => :projects, :conditions => ["project_id = ?", @project.id]
luis@538 50 else
luis@538 51 @publications = Publication.find :all
luis@538 52 end
luis@445 53 end
luis@445 54
luis@445 55 def new_from_bibfile
luis@391 56 @publication.current_step = session[:publication_step]
luis@409 57
luis@404 58 # contents of the paste text area
luis@404 59 bibtex_entry = params[:bibtex_entry]
luis@384 60
luis@404 61 # method for creating "pasted" bibtex entries
luis@424 62 if bibtex_entry
luis@409 63 parse_bibtex_list bibtex_entry
luis@404 64 end
luis@329 65 end
luis@329 66
luis@467 67 def add_author
luis@467 68 if (request.xhr?)
luis@467 69 render :text => User.find(params[:user_id]).name
luis@467 70 else
luis@467 71 # No? Then render an action.
luis@467 72 #render :action => 'view_attribute', :attr => @name
luis@467 73 logger.error { "ERRO ADD AUTHOR" }
luis@467 74 end
luis@467 75 end
luis@467 76
luis@547 77 def edit
luis@547 78 find_project_by_project_id unless params[:project_id].nil?
luis@547 79
luis@428 80 @publication = Publication.find(params[:id])
luis@544 81 @selected_bibtex_entry_type_id = @publication.bibtex_entry.entry_type
luis@430 82 end
luis@430 83
luis@445 84 def update
luis@448 85 @publication = Publication.find(params[:id])
luis@538 86
luis@544 87 logger.error { "INSIDE THE UPDATE ACTION IN THE PUBLICATION CONTROLLER" }
luis@544 88
luis@430 89 if @publication.update_attributes(params[:publication])
luis@430 90 flash[:notice] = "Successfully updated Publication."
luis@538 91
luis@538 92 if !params[:project_id].nil?
luis@538 93 redirect_to :action => :show, :id => @publication, :project_id => params[:project_id]
luis@538 94 else
luis@538 95 redirect_to :action => :show, :id => @publication
luis@538 96 end
luis@430 97 else
luis@448 98 render :action => 'edit'
luis@448 99 end
luis@328 100 end
luis@328 101
luis@425 102 def show
luis@535 103 find_project_by_project_id unless params[:project_id].nil?
luis@547 104
luis@425 105 if @publication.nil?
luis@579 106 @publications = Publication.all
luis@579 107 render "index", :alert => 'The publication was not found!'
luis@425 108 else
luis@425 109 @authors = @publication.authors
luis@425 110 @bibtext_entry = @publication.bibtex_entry
luis@425 111 end
luis@329 112 end
luis@329 113
luis@406 114 # parse string with bibtex authors
luis@406 115 def parse_authors(authors_entry)
luis@406 116 # in bibtex the authors are always seperated by "and"
luis@407 117 return authors_entry.split(" and ")
luis@406 118 end
luis@406 119
luis@406 120 # parses a list of bibtex
luis@406 121 def parse_bibtex_list(bibtex_list)
luis@406 122 bibliography = BibTeX.parse bibtex_list
luis@406 123
luis@406 124 no_entries = bibliography.data.length
luis@406 125
luis@406 126 # parses the bibtex entries
luis@406 127 bibliography.data.map do |d|
luis@407 128
luis@407 129 if d.class == BibTeX::Entry
luis@407 130 create_bibtex_entry d
luis@407 131 end
luis@406 132 end
luis@407 133 end
luis@407 134
luis@409 135 def create_bibtex_entry(d)
luis@407 136 @publication = Publication.new
luis@407 137 @bentry = BibtexEntry.new
luis@407 138 authors = []
luis@407 139 institution = ""
luis@407 140 email = ""
luis@409 141
luis@407 142 d.fields.keys.map do |field|
luis@407 143 case field.to_s
luis@407 144 when "author"
luis@407 145 authors = parse_authors d[field]
luis@407 146 when "title"
luis@407 147 @publication.title = d[field]
luis@407 148 when "institution"
luis@407 149 institution = d[field]
luis@407 150 when "email"
luis@407 151 email = d[field]
luis@407 152 else
luis@407 153 @bentry[field] = d[field]
luis@407 154 end
luis@407 155 end
luis@406 156
luis@406 157 @publication.bibtex_entry = @bentry
luis@407 158 @publication.save
luis@409 159
luis@424 160 # what is this for???
luis@424 161 # @created_publications << @publication.id
luis@409 162
luis@407 163 # need to save all authors
luis@407 164 # and establish the author-publication association
luis@407 165 # via the authorships table
luis@407 166 authors.each_with_index.map do |authorname, idx|
luis@407 167 author = Author.new(:name => authorname)
luis@407 168 if author.save!
luis@407 169 puts "SAVED"
luis@407 170 else
luis@407 171 puts "NOT SAVED"
luis@406 172 end
luis@406 173
luis@407 174 author.authorships.create!(
luis@444 175 :publication => @publication,
luis@444 176 :institution => institution,
luis@444 177 :email => email,
luis@444 178 :order => idx)
luis@407 179 end
luis@407 180 end
luis@409 181
luis@407 182 # parses the bibtex file
luis@407 183 def parse_bibtex_file
luis@407 184
luis@406 185 end
luis@406 186
luis@444 187 def import
luis@444 188 @publication = Publication.new
luis@444 189
luis@444 190
luis@444 191 end
luis@461 192
luis@461 193 def autocomplete_for_project
luis@461 194 @publication = Publication.find(params[:id])
luis@477 195
luis@464 196 @projects = Project.active.like(params[:q]).find(:all, :limit => 100) - @publication.projects
luis@461 197 logger.debug "Query for \"#{params[:q]}\" returned \"#{@projects.size}\" results"
luis@461 198 render :layout => false
luis@409 199 end
luis@471 200
luis@477 201 def autocomplete_for_author
luis@592 202 #TODO: luisf. optimize this Query: possible?
luis@592 203
luis@519 204 @results = []
luis@480 205
luis@595 206 @object_name = params[:object_name]
luis@595 207
luis@595 208 logger.error { "OBJECT NAME #{@object_name}" }
luis@595 209
luis@591 210 authorships_list = Authorship.like(params[:q]).find(:all, :limit => 100)
luis@480 211 users_list = User.active.like(params[:q]).find(:all, :limit => 100)
luis@480 212
luis@591 213 logger.debug "Query for \"#{params[:q]}\" returned \"#{authorships_list.size}\" authorships and \"#{users_list.size}\" users"
luis@480 214
luis@592 215 authorships_list.each do |authorship|
luis@592 216 # NEED TO COMPARE AUTHORSHIPS FOR SIMILAR NAME/INST/EMAIL
luis@592 217 @results << authorship
luis@592 218 logger.error { "Added AUTHORSHIP #{authorship.id} to the results list" }
luis@592 219 end
luis@592 220
luis@591 221 # need to subtract both lists; give priority to the users
luis@592 222 flag = true
luis@519 223 users_list.each do |user|
luis@592 224 if user.author.nil?
luis@592 225 @results << user
luis@592 226 else
luis@592 227 user.author.authorships.each do |auth|
luis@592 228 if authorships_list.include?(auth)
luis@592 229 flag = false
luis@592 230 break
luis@592 231 end
luis@592 232 end
luis@592 233 @results << user unless flag
luis@591 234 end
luis@480 235 end
luis@591 236
luis@592 237 # @results.uniq!
luis@592 238
luis@477 239 render :layout => false
luis@477 240 end
luis@471 241
luis@557 242 def sort_author_order
luis@557 243 params[:authorships].each_with_index do |id, index|
luis@557 244 Authorship.update_all(['auth_order=?', index+1], ['id=?', id])
luis@471 245 end
luis@471 246 render :nothing => true
luis@471 247 end
luis@574 248
luis@574 249 def add_project
luis@574 250 @projects = Project.find(params[:publication][:project_ids])
luis@574 251 @publication.projects << @projects
luis@579 252 @project = Project.find(params[:project_id])
luis@574 253
luis@574 254 # TODO luisf should also respond to HTML???
luis@574 255 respond_to do |format|
luis@574 256 format.html { redirect_to :back }
luis@574 257 format.js {
luis@574 258 render(:update) {|page|
luis@574 259 page[:add_project_form].reset
luis@574 260 page.replace_html :list_projects, :partial => 'list_projects'
luis@574 261 }
luis@574 262 }
luis@574 263 end
luis@574 264 end
luis@554 265
luis@579 266
luis@574 267 def remove_project
luis@579 268 @project = Project.find(params[:project_id])
luis@579 269 proj = Project.find(params[:remove_project_id])
luis@554 270
luis@574 271 if @publication.projects.length > 1
luis@579 272 if @publication.projects.exists? proj
luis@579 273 @publication.projects.delete proj if request.post?
luis@554 274 end
luis@554 275 else
luis@579 276 logger.error { "Cannot remove project from publication list" }
luis@554 277 end
luis@554 278
luis@591 279 logger.error { "CURRENT project name#{proj.name} and wanna delete #{@project.name}" }
luis@579 280
luis@579 281 render(:update) {|page|
luis@579 282 page.replace_html "list_projects", :partial => 'list_projects', :id => @publication
luis@579 283 }
luis@554 284 end
luis@579 285
luis@560 286 def destroy
luis@560 287 find_project_by_project_id
luis@560 288
luis@560 289 @publication.destroy
luis@560 290
luis@560 291 flash[:notice] = "Successfully deleted Publication."
luis@560 292 redirect_to :controller => :publications, :action => 'index', :project_id => @project
luis@560 293 end
luis@471 294
luis@538 295 private
luis@478 296
luis@328 297 end