annotate vendor/plugins/redmine_bibliography/app/controllers/publications_controller.rb @ 538:e25248ba597c feature_36

Fixed project_id parameter bug related to Issue #217.
author luisf <luis.figueira@eecs.qmul.ac.uk>
date Wed, 27 Jul 2011 16:49:38 +0100
parents dd9d9c0ff0f9
children d4bf55b01092
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@538 6 # before_filter :find_project, :except => [:autocomplete_for_project, :add_author, :sort_authors, :autocomplete_for_author]
luis@519 7
luis@404 8 def new
luis@444 9 @publication = Publication.new
luis@445 10
luis@445 11 # we'll always want a new publication to have its bibtex entry
luis@480 12 # @publication.build_bibtex_entry
luis@445 13
luis@446 14 # and at least one author
luis@480 15 # @publication.authorships.build.build_author
luis@446 16
luis@458 17 @project_id = params[:project_id]
luis@467 18 @current_user = User.current
luis@519 19 end
luis@409 20
luis@384 21
luis@404 22 def create
luis@390 23 @publication = Publication.new(params[:publication])
luis@530 24
luis@530 25 logger.error { "PUBLICATION CREATE ACTION" }
luis@530 26 logger.error { params[:publication] }
luis@535 27
luis@458 28 @project = Project.find(params[:project_id])
luis@445 29
luis@518 30 logger.error { "PARAMS publication" }
luis@518 31 logger.error { params[:publication] }
luis@530 32
luis@458 33 @publication.projects << @project
luis@458 34
luis@448 35 if @publication.save
luis@445 36 flash[:notice] = "Successfully created publication."
luis@459 37 redirect_to :action => :show, :id => @publication, :project_id => @project.id
luis@445 38 else
luis@445 39 render :action => 'new'
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
luis@467 65 def add_author
luis@467 66 if (request.xhr?)
luis@467 67 render :text => User.find(params[:user_id]).name
luis@467 68 else
luis@467 69 # No? Then render an action.
luis@467 70 #render :action => 'view_attribute', :attr => @name
luis@467 71 logger.error { "ERRO ADD AUTHOR" }
luis@467 72 end
luis@467 73 end
luis@467 74
luis@445 75 def edit
luis@428 76 @publication = Publication.find(params[:id])
luis@430 77 end
luis@430 78
luis@445 79 def update
luis@448 80 @publication = Publication.find(params[:id])
luis@538 81
luis@430 82 if @publication.update_attributes(params[:publication])
luis@430 83 flash[:notice] = "Successfully updated Publication."
luis@538 84
luis@538 85 if !params[:project_id].nil?
luis@538 86 redirect_to :action => :show, :id => @publication, :project_id => params[:project_id]
luis@538 87 else
luis@538 88 redirect_to :action => :show, :id => @publication
luis@538 89 end
luis@430 90 else
luis@448 91 render :action => 'edit'
luis@448 92 end
luis@328 93 end
luis@328 94
luis@425 95 def show
luis@538 96 logger.error { "PARAMS PROJECT_ID #{params[:project_id]} <---" }
luis@538 97
luis@535 98 find_project_by_project_id unless params[:project_id].nil?
luis@430 99
luis@428 100 @publication = Publication.find(params[:id])
luis@425 101
luis@425 102 if @publication.nil?
luis@425 103 @publications = Publication.all
luis@538 104 render "index", :alert => 'The publication was not found!'
luis@425 105 else
luis@425 106 @authors = @publication.authors
luis@425 107 @bibtext_entry = @publication.bibtex_entry
luis@425 108 end
luis@329 109 end
luis@329 110
luis@406 111 # parse string with bibtex authors
luis@406 112 def parse_authors(authors_entry)
luis@406 113 # in bibtex the authors are always seperated by "and"
luis@407 114 return authors_entry.split(" and ")
luis@406 115 end
luis@406 116
luis@406 117 # parses a list of bibtex
luis@406 118 def parse_bibtex_list(bibtex_list)
luis@406 119 bibliography = BibTeX.parse bibtex_list
luis@406 120
luis@406 121 no_entries = bibliography.data.length
luis@406 122
luis@406 123 # parses the bibtex entries
luis@406 124 bibliography.data.map do |d|
luis@407 125
luis@407 126 if d.class == BibTeX::Entry
luis@407 127 create_bibtex_entry d
luis@407 128 end
luis@406 129 end
luis@407 130 end
luis@407 131
luis@409 132 def create_bibtex_entry(d)
luis@407 133 @publication = Publication.new
luis@407 134 @bentry = BibtexEntry.new
luis@407 135 authors = []
luis@407 136 institution = ""
luis@407 137 email = ""
luis@409 138
luis@407 139 d.fields.keys.map do |field|
luis@407 140 case field.to_s
luis@407 141 when "author"
luis@407 142 authors = parse_authors d[field]
luis@407 143 when "title"
luis@407 144 @publication.title = d[field]
luis@407 145 when "institution"
luis@407 146 institution = d[field]
luis@407 147 when "email"
luis@407 148 email = d[field]
luis@407 149 else
luis@407 150 @bentry[field] = d[field]
luis@407 151 end
luis@407 152 end
luis@406 153
luis@406 154 @publication.bibtex_entry = @bentry
luis@407 155 @publication.save
luis@409 156
luis@424 157 # what is this for???
luis@424 158 # @created_publications << @publication.id
luis@409 159
luis@407 160 # need to save all authors
luis@407 161 # and establish the author-publication association
luis@407 162 # via the authorships table
luis@407 163 authors.each_with_index.map do |authorname, idx|
luis@407 164 author = Author.new(:name => authorname)
luis@407 165 if author.save!
luis@407 166 puts "SAVED"
luis@407 167 else
luis@407 168 puts "NOT SAVED"
luis@406 169 end
luis@406 170
luis@407 171 author.authorships.create!(
luis@444 172 :publication => @publication,
luis@444 173 :institution => institution,
luis@444 174 :email => email,
luis@444 175 :order => idx)
luis@407 176 end
luis@407 177 end
luis@409 178
luis@407 179 # parses the bibtex file
luis@407 180 def parse_bibtex_file
luis@407 181
luis@406 182 end
luis@406 183
luis@444 184 def import
luis@444 185 @publication = Publication.new
luis@444 186
luis@444 187
luis@444 188 end
luis@461 189
luis@461 190 def add_project
luis@464 191 @projects = Project.find(params[:publication][:project_ids])
luis@464 192 @publication = Publication.find(params[:id])
luis@464 193 @publication.projects << @projects
luis@461 194
luis@464 195 # TODO luisf should also respond to HTML???
luis@464 196 respond_to do |format|
luis@464 197 format.js
luis@464 198 end
luis@461 199 end
luis@409 200
luis@461 201 def autocomplete_for_project
luis@461 202 @publication = Publication.find(params[:id])
luis@477 203
luis@464 204 @projects = Project.active.like(params[:q]).find(:all, :limit => 100) - @publication.projects
luis@461 205 logger.debug "Query for \"#{params[:q]}\" returned \"#{@projects.size}\" results"
luis@461 206 render :layout => false
luis@409 207 end
luis@471 208
luis@477 209 def autocomplete_for_author
luis@519 210 @results = []
luis@480 211
luis@480 212 authors_list = Author.like(params[:q]).find(:all, :limit => 100)
luis@480 213 users_list = User.active.like(params[:q]).find(:all, :limit => 100)
luis@480 214
luis@519 215 logger.debug "Query for \"#{params[:q]}\" returned \"#{authors_list.size}\" authors and \"#{users_list.size}\" users"
luis@480 216
luis@480 217 # need to subtract both lists
luis@519 218 # give priority to the users
luis@519 219 users_list.each do |user|
luis@519 220 @results << user
luis@519 221 end
luis@480 222
luis@519 223 authors_list.each do |author|
luis@519 224 @results << author unless users_list.include?(author.user_id)
luis@480 225 end
luis@519 226
luis@477 227 render :layout => false
luis@477 228 end
luis@471 229
luis@471 230 def sort_authors
luis@471 231 params[:authors].each_with_index do |id, index|
luis@471 232 Author.update_all(['order=?', index+1], ['id=?', id])
luis@471 233 end
luis@471 234 render :nothing => true
luis@471 235 end
luis@471 236
luis@478 237 def identify_author
luis@478 238
luis@478 239 end
luis@478 240
luis@538 241 private
luis@478 242
luis@328 243 end