annotate vendor/plugins/redmine_bibliography/app/controllers/publications_controller.rb @ 519:3be6bc3c2a17 feature_36

Correctly searches and sends the parameters for both users and authors.
author luisf <luis.figueira@eecs.qmul.ac.uk>
date Fri, 15 Jul 2011 17:21:05 +0100
parents b24091590b63
children ce1614b19759
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@478 6 before_filter :find_project_by_project_id, :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@458 24 @project = Project.find(params[:project_id])
luis@445 25
luis@518 26 logger.error { "PARAMS publication" }
luis@518 27 logger.error { params[:publication] }
luis@518 28
luis@519 29 # array with the user ids
luis@519 30 @users = []
luis@519 31
luis@458 32 @publication.projects << @project
luis@458 33
luis@448 34 if @publication.save
luis@445 35 flash[:notice] = "Successfully created publication."
luis@459 36 redirect_to :action => :show, :id => @publication, :project_id => @project.id
luis@445 37 else
luis@445 38 render :action => 'new'
luis@445 39 end
luis@445 40 end
luis@445 41
luis@445 42 def index
luis@458 43 @project = Project.find(params[:project_id])
luis@458 44 @publications = Publication.find :all, :joins => :projects, :conditions => ["project_id = ?", @project.id]
luis@445 45 end
luis@445 46
luis@445 47 def new_from_bibfile
luis@391 48 @publication.current_step = session[:publication_step]
luis@409 49
luis@404 50 # contents of the paste text area
luis@404 51 bibtex_entry = params[:bibtex_entry]
luis@384 52
luis@404 53 # method for creating "pasted" bibtex entries
luis@424 54 if bibtex_entry
luis@409 55 parse_bibtex_list bibtex_entry
luis@404 56 end
luis@329 57 end
luis@329 58
luis@467 59 def add_author
luis@467 60 if (request.xhr?)
luis@467 61 render :text => User.find(params[:user_id]).name
luis@467 62 else
luis@467 63 # No? Then render an action.
luis@467 64 #render :action => 'view_attribute', :attr => @name
luis@467 65 logger.error { "ERRO ADD AUTHOR" }
luis@467 66 end
luis@467 67 end
luis@467 68
luis@445 69 def edit
luis@428 70 @publication = Publication.find(params[:id])
luis@430 71 end
luis@430 72
luis@445 73 def update
luis@448 74 @publication = Publication.find(params[:id])
luis@430 75 if @publication.update_attributes(params[:publication])
luis@430 76 flash[:notice] = "Successfully updated Publication."
luis@448 77 redirect_to @publication
luis@430 78 else
luis@448 79 render :action => 'edit'
luis@448 80 end
luis@328 81 end
luis@328 82
luis@425 83 def show
luis@430 84 logger.error "-------> No Show"
luis@430 85
luis@428 86 @publication = Publication.find(params[:id])
luis@425 87
luis@425 88 if @publication.nil?
luis@425 89 @publications = Publication.all
luis@425 90 render "index", :alert => 'Your Publications was not found!'
luis@425 91 else
luis@425 92 @authors = @publication.authors
luis@425 93 @bibtext_entry = @publication.bibtex_entry
luis@425 94
luis@425 95 respond_to do |format|
luis@425 96 format.html
luis@425 97 format.xml {render :xml => @publication}
luis@425 98 end
luis@425 99 end
luis@329 100 end
luis@329 101
luis@406 102 # parse string with bibtex authors
luis@406 103 def parse_authors(authors_entry)
luis@406 104 # in bibtex the authors are always seperated by "and"
luis@407 105 return authors_entry.split(" and ")
luis@406 106 end
luis@406 107
luis@406 108 # parses a list of bibtex
luis@406 109 def parse_bibtex_list(bibtex_list)
luis@406 110 bibliography = BibTeX.parse bibtex_list
luis@406 111
luis@406 112 no_entries = bibliography.data.length
luis@406 113
luis@406 114 # parses the bibtex entries
luis@406 115 bibliography.data.map do |d|
luis@407 116
luis@407 117 if d.class == BibTeX::Entry
luis@407 118 create_bibtex_entry d
luis@407 119 end
luis@406 120 end
luis@407 121 end
luis@407 122
luis@409 123 def create_bibtex_entry(d)
luis@407 124 @publication = Publication.new
luis@407 125 @bentry = BibtexEntry.new
luis@407 126 authors = []
luis@407 127 institution = ""
luis@407 128 email = ""
luis@409 129
luis@407 130 d.fields.keys.map do |field|
luis@407 131 case field.to_s
luis@407 132 when "author"
luis@407 133 authors = parse_authors d[field]
luis@407 134 when "title"
luis@407 135 @publication.title = d[field]
luis@407 136 when "institution"
luis@407 137 institution = d[field]
luis@407 138 when "email"
luis@407 139 email = d[field]
luis@407 140 else
luis@407 141 @bentry[field] = d[field]
luis@407 142 end
luis@407 143 end
luis@406 144
luis@406 145 @publication.bibtex_entry = @bentry
luis@407 146 @publication.save
luis@409 147
luis@424 148 # what is this for???
luis@424 149 # @created_publications << @publication.id
luis@409 150
luis@407 151 # need to save all authors
luis@407 152 # and establish the author-publication association
luis@407 153 # via the authorships table
luis@407 154 authors.each_with_index.map do |authorname, idx|
luis@407 155 author = Author.new(:name => authorname)
luis@407 156 if author.save!
luis@407 157 puts "SAVED"
luis@407 158 else
luis@407 159 puts "NOT SAVED"
luis@406 160 end
luis@406 161
luis@407 162 author.authorships.create!(
luis@444 163 :publication => @publication,
luis@444 164 :institution => institution,
luis@444 165 :email => email,
luis@444 166 :order => idx)
luis@407 167 end
luis@407 168 end
luis@409 169
luis@407 170 # parses the bibtex file
luis@407 171 def parse_bibtex_file
luis@407 172
luis@406 173 end
luis@406 174
luis@444 175 def import
luis@444 176 @publication = Publication.new
luis@444 177
luis@444 178
luis@444 179 end
luis@461 180
luis@461 181 def add_project
luis@464 182 @projects = Project.find(params[:publication][:project_ids])
luis@464 183 @publication = Publication.find(params[:id])
luis@464 184 @publication.projects << @projects
luis@461 185
luis@464 186 # TODO luisf should also respond to HTML???
luis@464 187 respond_to do |format|
luis@464 188 format.js
luis@464 189 end
luis@461 190 end
luis@409 191
luis@461 192 def autocomplete_for_project
luis@461 193 @publication = Publication.find(params[:id])
luis@477 194
luis@464 195 @projects = Project.active.like(params[:q]).find(:all, :limit => 100) - @publication.projects
luis@461 196 logger.debug "Query for \"#{params[:q]}\" returned \"#{@projects.size}\" results"
luis@461 197 render :layout => false
luis@409 198 end
luis@471 199
luis@477 200 def autocomplete_for_author
luis@519 201 @results = []
luis@480 202
luis@480 203 authors_list = Author.like(params[:q]).find(:all, :limit => 100)
luis@480 204 users_list = User.active.like(params[:q]).find(:all, :limit => 100)
luis@480 205
luis@519 206 logger.debug "Query for \"#{params[:q]}\" returned \"#{authors_list.size}\" authors and \"#{users_list.size}\" users"
luis@480 207
luis@480 208 # need to subtract both lists
luis@519 209 # give priority to the users
luis@519 210 users_list.each do |user|
luis@519 211 @results << user
luis@519 212 end
luis@480 213
luis@519 214 authors_list.each do |author|
luis@519 215 @results << author unless users_list.include?(author.user_id)
luis@480 216 end
luis@519 217
luis@477 218 render :layout => false
luis@477 219 end
luis@471 220
luis@471 221 def sort_authors
luis@471 222 params[:authors].each_with_index do |id, index|
luis@471 223 Author.update_all(['order=?', index+1], ['id=?', id])
luis@471 224 end
luis@471 225 render :nothing => true
luis@471 226 end
luis@471 227
luis@478 228 def identify_author
luis@478 229
luis@478 230 end
luis@478 231
luis@478 232
luis@457 233
luis@457 234 private
luis@457 235
luis@459 236 # TODO: luisf. - only here for debugging purposes
luis@459 237 # Find project of id params[:project_id]
luis@459 238 def find_project_by_project_id
luis@459 239
luis@459 240 logger.error { "FIND PROJECT BY PROJECT ID" }
luis@459 241
luis@459 242 @project = Project.find(params[:project_id])
luis@459 243 rescue ActiveRecord::RecordNotFound
luis@459 244 render_404
luis@459 245 end
luis@328 246 end