annotate vendor/plugins/redmine_bibliography/app/controllers/publications_controller.rb @ 462:b02b2eb2a312 feature_36

Searching for publications via AJAX call; the publication ID is not being sent correctly, so still shows the current publication's associated projects in the select list.
author luisf <luis.figueira@eecs.qmul.ac.uk>
date Tue, 21 Jun 2011 01:27:41 +0100
parents 841b2e40895d
children fbdfec975bfa
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@462 6 before_filter :find_project_by_project_id, :except => [:autocomplete_for_project]
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@446 16 @publication.authors.build
luis@446 17
luis@458 18 @project_id = params[:project_id]
luis@458 19
luis@404 20 # the step we're at in the form
luis@459 21 # @publication.current_step = session[:publication_step]
luis@409 22
luis@409 23 @new_publications = []
luis@409 24 session[:publications] ||= {}
luis@393 25 end
luis@384 26
luis@404 27 def create
luis@390 28 @publication = Publication.new(params[:publication])
luis@458 29 @project = Project.find(params[:project_id])
luis@445 30
luis@458 31 logger.error { "FIGUEIRA" }
luis@458 32 Rails.logger.debug { @project }
luis@458 33
luis@458 34 @publication.projects << @project
luis@458 35
luis@448 36 if @publication.save
luis@445 37 flash[:notice] = "Successfully created publication."
luis@459 38 redirect_to :action => :show, :id => @publication, :project_id => @project.id
luis@445 39 else
luis@445 40 render :action => 'new'
luis@445 41 end
luis@445 42 end
luis@445 43
luis@445 44 def index
luis@458 45 @project = Project.find(params[:project_id])
luis@458 46 @publications = Publication.find :all, :joins => :projects, :conditions => ["project_id = ?", @project.id]
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@393 59
luis@404 60 # form's flow control
luis@390 61 if params[:back_button]
luis@390 62 @publication.previous_step
luis@390 63 else
luis@390 64 @publication.next_step
luis@390 65 end
luis@393 66
luis@390 67 session[:publication_step] = @publication.current_step
luis@429 68
luis@329 69 end
luis@329 70
luis@328 71
luis@445 72 def edit
luis@428 73 @publication = Publication.find(params[:id])
luis@430 74 end
luis@430 75
luis@445 76 def update
luis@448 77 @publication = Publication.find(params[:id])
luis@430 78 if @publication.update_attributes(params[:publication])
luis@430 79 flash[:notice] = "Successfully updated Publication."
luis@448 80 redirect_to @publication
luis@430 81 else
luis@448 82 render :action => 'edit'
luis@448 83 end
luis@328 84 end
luis@328 85
luis@425 86 def show
luis@430 87 logger.error "-------> No Show"
luis@430 88
luis@428 89 @publication = Publication.find(params[:id])
luis@425 90
luis@425 91 if @publication.nil?
luis@425 92 @publications = Publication.all
luis@425 93 render "index", :alert => 'Your Publications was not found!'
luis@425 94 else
luis@425 95 @authors = @publication.authors
luis@425 96 @bibtext_entry = @publication.bibtex_entry
luis@425 97
luis@425 98 respond_to do |format|
luis@425 99 format.html
luis@425 100 format.xml {render :xml => @publication}
luis@425 101 end
luis@425 102 end
luis@329 103 end
luis@329 104
luis@406 105 # parse string with bibtex authors
luis@406 106 def parse_authors(authors_entry)
luis@406 107 # in bibtex the authors are always seperated by "and"
luis@407 108 return authors_entry.split(" and ")
luis@406 109 end
luis@406 110
luis@406 111 # parses a list of bibtex
luis@406 112 def parse_bibtex_list(bibtex_list)
luis@406 113 bibliography = BibTeX.parse bibtex_list
luis@406 114
luis@406 115 no_entries = bibliography.data.length
luis@406 116
luis@406 117 # parses the bibtex entries
luis@406 118 bibliography.data.map do |d|
luis@407 119
luis@407 120 if d.class == BibTeX::Entry
luis@407 121 create_bibtex_entry d
luis@407 122 end
luis@406 123 end
luis@407 124 end
luis@407 125
luis@409 126 def create_bibtex_entry(d)
luis@407 127 @publication = Publication.new
luis@407 128 @bentry = BibtexEntry.new
luis@407 129 authors = []
luis@407 130 institution = ""
luis@407 131 email = ""
luis@409 132
luis@407 133 d.fields.keys.map do |field|
luis@407 134 case field.to_s
luis@407 135 when "author"
luis@407 136 authors = parse_authors d[field]
luis@407 137 when "title"
luis@407 138 @publication.title = d[field]
luis@407 139 when "institution"
luis@407 140 institution = d[field]
luis@407 141 when "email"
luis@407 142 email = d[field]
luis@407 143 else
luis@407 144 @bentry[field] = d[field]
luis@407 145 end
luis@407 146 end
luis@406 147
luis@406 148 @publication.bibtex_entry = @bentry
luis@407 149 @publication.save
luis@409 150
luis@424 151 # what is this for???
luis@424 152 # @created_publications << @publication.id
luis@409 153
luis@407 154 # need to save all authors
luis@407 155 # and establish the author-publication association
luis@407 156 # via the authorships table
luis@407 157 authors.each_with_index.map do |authorname, idx|
luis@407 158 author = Author.new(:name => authorname)
luis@407 159 if author.save!
luis@407 160 puts "SAVED"
luis@407 161 else
luis@407 162 puts "NOT SAVED"
luis@406 163 end
luis@406 164
luis@407 165 author.authorships.create!(
luis@444 166 :publication => @publication,
luis@444 167 :institution => institution,
luis@444 168 :email => email,
luis@444 169 :order => idx)
luis@407 170 end
luis@407 171 end
luis@409 172
luis@407 173 # parses the bibtex file
luis@407 174 def parse_bibtex_file
luis@407 175
luis@406 176 end
luis@406 177
luis@444 178 def import
luis@444 179 @publication = Publication.new
luis@444 180
luis@444 181
luis@444 182 end
luis@409 183
luis@461 184
luis@461 185 def add_project
luis@461 186 Rails.logger.debug { "ADD PROJECT" }
luis@461 187
luis@461 188 @project = Project.find(params[:project_id])
luis@461 189 @publication = Publication.find(params[:id])
luis@461 190
luis@461 191 @publication.projects << @project
luis@461 192
luis@461 193 end
luis@409 194
luis@461 195
luis@461 196 def autocomplete_for_project
luis@461 197 @publication = Publication.find(params[:id])
luis@461 198 @projects = Project.active.like(params[:q]).find(:all, :limit => 100) - @publication.projects
luis@462 199
luis@462 200 # @projects = Project.active.like(params[:q]).find(:all, :limit => 100)
luis@461 201 logger.debug "Query for \"#{params[:q]}\" returned \"#{@projects.size}\" results"
luis@461 202 render :layout => false
luis@409 203 end
luis@457 204
luis@457 205 private
luis@457 206
luis@459 207 # TODO: luisf. - only here for debugging purposes
luis@459 208 # Find project of id params[:project_id]
luis@459 209 def find_project_by_project_id
luis@459 210
luis@459 211 logger.error { "FIND PROJECT BY PROJECT ID" }
luis@459 212
luis@459 213 @project = Project.find(params[:project_id])
luis@459 214 rescue ActiveRecord::RecordNotFound
luis@459 215 render_404
luis@459 216 end
luis@328 217 end