annotate vendor/plugins/redmine_bibliography/app/controllers/publications_controller.rb @ 480:19efecf4561a feature_36

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