annotate vendor/plugins/redmine_bibliography/app/controllers/publications_controller.rb @ 553:e25c069ab3b8 feature_36

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