annotate vendor/plugins/redmine_bibliography/app/controllers/publications_controller.rb @ 471:49fb7a9ef79c feature_36

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