annotate vendor/plugins/redmine_bibliography/app/controllers/publications_controller.rb @ 574:f463be9d101a feature_36

some changes to add/remove projects. Not Finished.
author luisf <luis.figueira@eecs.qmul.ac.uk>
date Wed, 10 Aug 2011 14:30:40 +0100
parents f1ef29202956
children 2ada25d4b0a8
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@519 23 end
luis@409 24
luis@384 25
luis@539 26 def create
luis@539 27 find_project_by_project_id
luis@539 28
luis@390 29 @publication = Publication.new(params[:publication])
luis@553 30
luis@539 31 # @project = Project.find(params[:project_id])
luis@553 32 @publication.projects << @project unless @project.nil?
luis@553 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@538 43 if !params[:project_id].nil?
luis@538 44 find_project_by_project_id
luis@538 45 @project = Project.find(params[:project_id])
luis@538 46 @publications = Publication.find :all, :joins => :projects, :conditions => ["project_id = ?", @project.id]
luis@538 47 else
luis@538 48 @publications = Publication.find :all
luis@538 49 end
luis@445 50 end
luis@445 51
luis@445 52 def new_from_bibfile
luis@391 53 @publication.current_step = session[:publication_step]
luis@409 54
luis@404 55 # contents of the paste text area
luis@404 56 bibtex_entry = params[:bibtex_entry]
luis@384 57
luis@404 58 # method for creating "pasted" bibtex entries
luis@424 59 if bibtex_entry
luis@409 60 parse_bibtex_list bibtex_entry
luis@404 61 end
luis@329 62 end
luis@329 63
luis@467 64 def add_author
luis@467 65 if (request.xhr?)
luis@467 66 render :text => User.find(params[:user_id]).name
luis@467 67 else
luis@467 68 # No? Then render an action.
luis@467 69 #render :action => 'view_attribute', :attr => @name
luis@467 70 logger.error { "ERRO ADD AUTHOR" }
luis@467 71 end
luis@467 72 end
luis@467 73
luis@547 74 def edit
luis@547 75 find_project_by_project_id unless params[:project_id].nil?
luis@547 76
luis@428 77 @publication = Publication.find(params[:id])
luis@544 78 @selected_bibtex_entry_type_id = @publication.bibtex_entry.entry_type
luis@430 79 end
luis@430 80
luis@445 81 def update
luis@448 82 @publication = Publication.find(params[:id])
luis@538 83
luis@544 84 logger.error { "INSIDE THE UPDATE ACTION IN THE PUBLICATION CONTROLLER" }
luis@544 85
luis@430 86 if @publication.update_attributes(params[:publication])
luis@430 87 flash[:notice] = "Successfully updated Publication."
luis@538 88
luis@538 89 if !params[:project_id].nil?
luis@538 90 redirect_to :action => :show, :id => @publication, :project_id => params[:project_id]
luis@538 91 else
luis@538 92 redirect_to :action => :show, :id => @publication
luis@538 93 end
luis@430 94 else
luis@448 95 render :action => 'edit'
luis@448 96 end
luis@328 97 end
luis@328 98
luis@425 99 def show
luis@535 100 find_project_by_project_id unless params[:project_id].nil?
luis@574 101
luis@428 102 @publication = Publication.find(params[:id])
luis@547 103
luis@425 104 if @publication.nil?
luis@425 105 @publications = Publication.all
luis@538 106 render "index", :alert => 'The publication was not found!'
luis@425 107 else
luis@425 108 @authors = @publication.authors
luis@425 109 @bibtext_entry = @publication.bibtex_entry
luis@425 110 end
luis@329 111 end
luis@329 112
luis@406 113 # parse string with bibtex authors
luis@406 114 def parse_authors(authors_entry)
luis@406 115 # in bibtex the authors are always seperated by "and"
luis@407 116 return authors_entry.split(" and ")
luis@406 117 end
luis@406 118
luis@406 119 # parses a list of bibtex
luis@406 120 def parse_bibtex_list(bibtex_list)
luis@406 121 bibliography = BibTeX.parse bibtex_list
luis@406 122
luis@406 123 no_entries = bibliography.data.length
luis@406 124
luis@406 125 # parses the bibtex entries
luis@406 126 bibliography.data.map do |d|
luis@407 127
luis@407 128 if d.class == BibTeX::Entry
luis@407 129 create_bibtex_entry d
luis@407 130 end
luis@406 131 end
luis@407 132 end
luis@407 133
luis@409 134 def create_bibtex_entry(d)
luis@407 135 @publication = Publication.new
luis@407 136 @bentry = BibtexEntry.new
luis@407 137 authors = []
luis@407 138 institution = ""
luis@407 139 email = ""
luis@409 140
luis@407 141 d.fields.keys.map do |field|
luis@407 142 case field.to_s
luis@407 143 when "author"
luis@407 144 authors = parse_authors d[field]
luis@407 145 when "title"
luis@407 146 @publication.title = d[field]
luis@407 147 when "institution"
luis@407 148 institution = d[field]
luis@407 149 when "email"
luis@407 150 email = d[field]
luis@407 151 else
luis@407 152 @bentry[field] = d[field]
luis@407 153 end
luis@407 154 end
luis@406 155
luis@406 156 @publication.bibtex_entry = @bentry
luis@407 157 @publication.save
luis@409 158
luis@424 159 # what is this for???
luis@424 160 # @created_publications << @publication.id
luis@409 161
luis@407 162 # need to save all authors
luis@407 163 # and establish the author-publication association
luis@407 164 # via the authorships table
luis@407 165 authors.each_with_index.map do |authorname, idx|
luis@407 166 author = Author.new(:name => authorname)
luis@407 167 if author.save!
luis@407 168 puts "SAVED"
luis@407 169 else
luis@407 170 puts "NOT SAVED"
luis@406 171 end
luis@406 172
luis@407 173 author.authorships.create!(
luis@444 174 :publication => @publication,
luis@444 175 :institution => institution,
luis@444 176 :email => email,
luis@444 177 :order => idx)
luis@407 178 end
luis@407 179 end
luis@409 180
luis@407 181 # parses the bibtex file
luis@407 182 def parse_bibtex_file
luis@407 183
luis@406 184 end
luis@406 185
luis@444 186 def import
luis@444 187 @publication = Publication.new
luis@444 188
luis@444 189
luis@444 190 end
luis@461 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|
chris@566 215 @results << author unless users_list.include?(author.user)
luis@480 216 end
luis@519 217
luis@477 218 render :layout => false
luis@477 219 end
luis@471 220
luis@557 221 def sort_author_order
luis@557 222 params[:authorships].each_with_index do |id, index|
luis@557 223 Authorship.update_all(['auth_order=?', index+1], ['id=?', id])
luis@471 224 end
luis@471 225 render :nothing => true
luis@471 226 end
luis@574 227
luis@574 228 def add_project
luis@574 229 @projects = Project.find(params[:publication][:project_ids])
luis@574 230 @publication.projects << @projects
luis@574 231
luis@574 232 # TODO luisf should also respond to HTML???
luis@574 233 respond_to do |format|
luis@574 234 format.html { redirect_to :back }
luis@574 235 format.js {
luis@574 236 render(:update) {|page|
luis@574 237 page[:add_project_form].reset
luis@574 238 page.replace_html :list_projects, :partial => 'list_projects'
luis@574 239 }
luis@574 240 }
luis@574 241 end
luis@574 242 end
luis@554 243
luis@574 244 def remove_project
luis@574 245 find_project_by_project_id
luis@574 246 proj_to_remove = Project.find(params[:remove_project_id])
luis@574 247
luis@574 248 if proj_to_remove == @project
luis@574 249 warning = "You are about to remove the current project from the publication's project list. Are you sure?"
luis@574 250 end
luis@554 251
luis@574 252 if @publication.projects.length > 1
luis@574 253 if @publication.projects.exists? proj_to_remove
luis@574 254 @publication.projects.delete proj_to_remove if request.post?
luis@554 255 end
luis@554 256 else
luis@574 257 logger.error { "Cannot remove project from publication list" }
luis@554 258 end
luis@554 259
luis@554 260 respond_to do |format|
luis@574 261 format.html { redirect_to :back }
luis@574 262 format.js {
luis@574 263 render(:update) {|page|
luis@574 264 page.replace_html :list_projects, :partial => 'list_projects'
luis@574 265 }
luis@574 266 }
luis@554 267 end
luis@554 268 end
luis@554 269
luis@560 270 def destroy
luis@560 271 find_project_by_project_id
luis@560 272
luis@560 273 @publication.destroy
luis@560 274
luis@560 275 flash[:notice] = "Successfully deleted Publication."
luis@560 276 redirect_to :controller => :publications, :action => 'index', :project_id => @project
luis@560 277 end
luis@471 278
luis@478 279 def identify_author
luis@478 280
luis@478 281 end
luis@478 282
luis@538 283 private
luis@478 284
luis@328 285 end