annotate plugins/redmine_bibliography/app/controllers/publications_controller.rb @ 1420:b688fe79f593 biblio_alt_search_auth

Reverted previous changes to name getter
author luisf <luis.figueira@eecs.qmul.ac.uk>
date Tue, 01 Oct 2013 18:36:13 +0100
parents fab9719b189e
children 69d32b831d2b
rev   line source
luisf@613 1 # -*- coding: utf-8 -*-
luis@385 2 # vendor/plugins/redmine_bibliography/app/controllers/publications_controller.rb
luis@385 3
luis@328 4 class PublicationsController < ApplicationController
luis@425 5 unloadable
luis@946 6
luis@560 7 model_object Publication
luis@1317 8 before_filter :find_model_object, :only => [ :show, :add_project ]
luis@631 9 before_filter :find_project_by_project_id, :authorize, :only => [ :edit, :new, :update, :create ]
luis@946 10
luis@404 11 def new
luis@539 12 find_project_by_project_id
luis@539 13 @publication = Publication.new
luis@946 14
luis@445 15 # we'll always want a new publication to have its bibtex entry
luis@539 16 @publication.build_bibtex_entry
luis@946 17
luis@519 18 end
luis@409 19
luis@1071 20 def create
luisf@613 21 @project = Project.find(params[:project_id])
luisf@613 22
luis@390 23 @publication = Publication.new(params[:publication])
luis@553 24 @publication.projects << @project unless @project.nil?
luis@946 25
luis@1071 26 if @publication.save
luis@666 27 @publication.notify_authors_publication_added(@project)
luis@946 28
luis@445 29 flash[:notice] = "Successfully created publication."
luisf@613 30 redirect_to :action => :show, :id => @publication, :project_id => @project
luis@445 31 else
luisf@613 32 render :action => 'new', :project_id => @project
luis@445 33 end
luis@445 34 end
luis@445 35
luis@445 36 def index
luis@538 37 if !params[:project_id].nil?
luis@538 38 find_project_by_project_id
luis@538 39 @project = Project.find(params[:project_id])
luis@538 40 @publications = Publication.find :all, :joins => :projects, :conditions => ["project_id = ?", @project.id]
luis@538 41 else
luis@538 42 @publications = Publication.find :all
luis@538 43 end
luis@445 44 end
luis@445 45
luis@445 46 def new_from_bibfile
luis@391 47 @publication.current_step = session[:publication_step]
luis@946 48
luis@404 49 # contents of the paste text area
luis@404 50 bibtex_entry = params[:bibtex_entry]
luis@384 51
luis@404 52 # method for creating "pasted" bibtex entries
luis@424 53 if bibtex_entry
luis@1071 54 parse_bibtex_list bibtex_entry
luis@404 55 end
luis@329 56 end
luis@329 57
luis@1274 58 def show_bibtex_fields
luis@1274 59 @fields = []
luis@675 60
luis@699 61 unless params[:value].empty?
luis@1274 62 @fields = BibtexEntryType.fields(params[:value])
luis@699 63 end
luis@675 64
luis@675 65 respond_to do |format|
luis@675 66 format.js {
luis@1274 67 render :show_bibtex_fields
luis@675 68 }
luis@675 69 end
luis@675 70 end
luis@675 71
luis@467 72 def add_author
luis@467 73 if (request.xhr?)
luis@467 74 render :text => User.find(params[:user_id]).name
luis@467 75 else
luis@467 76 # No? Then render an action.
luis@467 77 #render :action => 'view_attribute', :attr => @name
luis@675 78 logger.error { "Error while adding Author to publication." }
luis@467 79 end
luis@467 80 end
luis@467 81
luis@1071 82 def edit
luis@547 83 find_project_by_project_id unless params[:project_id].nil?
luis@946 84
luis@609 85 @edit_view = true;
luis@428 86 @publication = Publication.find(params[:id])
luis@626 87 @selected_bibtex_entry_type_id = @publication.bibtex_entry.entry_type
luis@626 88
luis@1071 89 @bibtype_fields = BibtexEntryType.fields(@selected_bibtex_entry_type_id)
luis@430 90 end
luis@430 91
luis@1071 92 def update
luis@1071 93 @publication = Publication.find(params[:id])
luis@626 94
luis@430 95 if @publication.update_attributes(params[:publication])
luis@430 96 flash[:notice] = "Successfully updated Publication."
luis@538 97
luis@1071 98 # expires the previosly cached entries
luis@1071 99 Rails.cache.delete "publication-#{@publication.id}-ieee"
luis@1071 100 Rails.cache.delete "publication-#{@publication.id}-bibtex"
luis@1071 101
luis@538 102 if !params[:project_id].nil?
luis@538 103 redirect_to :action => :show, :id => @publication, :project_id => params[:project_id]
luis@538 104 else
luis@538 105 redirect_to :action => :show, :id => @publication
luis@538 106 end
luis@430 107 else
luis@448 108 render :action => 'edit'
luis@1071 109 end
luis@328 110 end
luis@328 111
luis@946 112
luis@425 113 def show
luis@535 114 find_project_by_project_id unless params[:project_id].nil?
luis@946 115
luis@425 116 if @publication.nil?
luis@579 117 @publications = Publication.all
luis@579 118 render "index", :alert => 'The publication was not found!'
luis@425 119 else
luis@425 120 @authors = @publication.authors
luis@425 121 @bibtext_entry = @publication.bibtex_entry
luis@425 122 end
luis@329 123 end
luis@329 124
luis@406 125 # parse string with bibtex authors
luis@406 126 def parse_authors(authors_entry)
luis@406 127 # in bibtex the authors are always seperated by "and"
luis@407 128 return authors_entry.split(" and ")
luis@406 129 end
luis@406 130
luis@1071 131 # parses a list of bibtex
luis@406 132 def parse_bibtex_list(bibtex_list)
luis@406 133 bibliography = BibTeX.parse bibtex_list
luis@406 134
luis@406 135 no_entries = bibliography.data.length
luis@406 136
luis@406 137 # parses the bibtex entries
luis@406 138 bibliography.data.map do |d|
luis@407 139
luis@407 140 if d.class == BibTeX::Entry
luis@407 141 create_bibtex_entry d
luis@407 142 end
luis@406 143 end
luis@1071 144 end
luis@407 145
luis@1071 146 def create_bibtex_entry(d)
luis@407 147 @publication = Publication.new
luis@1071 148 @bentry = BibtexEntry.new
luis@407 149 authors = []
luis@407 150 institution = ""
luis@407 151 email = ""
luis@409 152
luis@407 153 d.fields.keys.map do |field|
luis@407 154 case field.to_s
luis@407 155 when "author"
luis@407 156 authors = parse_authors d[field]
luis@407 157 when "title"
luis@407 158 @publication.title = d[field]
luis@407 159 when "institution"
luis@407 160 institution = d[field]
luis@407 161 when "email"
luis@407 162 email = d[field]
luis@407 163 else
luis@407 164 @bentry[field] = d[field]
luis@407 165 end
luis@1071 166 end
luis@406 167
luis@406 168 @publication.bibtex_entry = @bentry
luis@407 169 @publication.save
luis@409 170
luis@1071 171 # what is this for???
luis@424 172 # @created_publications << @publication.id
luis@409 173
luis@407 174 # need to save all authors
luis@1071 175 # and establish the author-publication association
luis@1071 176 # via the authorships table
luis@407 177 authors.each_with_index.map do |authorname, idx|
luis@407 178 author = Author.new(:name => authorname)
luis@407 179 if author.save!
luis@946 180 # todo: catch the errors...
luis@407 181 puts "SAVED"
luis@407 182 else
luis@407 183 puts "NOT SAVED"
luis@406 184 end
luis@406 185
luis@407 186 author.authorships.create!(
luis@946 187 :publication => @publication,
luis@946 188 :institution => institution,
luis@946 189 :email => email,
luis@946 190 :order => idx)
luis@407 191 end
luis@407 192 end
luis@409 193
luis@461 194 def autocomplete_for_project
luis@461 195 @publication = Publication.find(params[:id])
luis@946 196
luis@1253 197 @projects = Project.active.name_or_homepage_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@1071 202 def autocomplete_for_author
luis@519 203 @results = []
luis@946 204
luis@596 205 object_id = params[:object_id]
luis@598 206 @object_name = "publications[authorships_attributes][#{object_id}][search_results]"
luis@946 207
Chris@674 208 # cc 20110909 -- revert to like instead of like_unique -- see #289
luis@1411 209 authorships_list = Authorship.like(params[:term]).group('author_id').find(:all, :limit => 100)
luis@1411 210
luis@1411 211 authors_list = authorships_list.collect do |x| x.author end
luis@1411 212
luis@1283 213 users_list = User.active.like(params[:term]).find(:all, :limit => 100)
luis@480 214
luis@1411 215 logger.debug "Query for \"#{params[:term]}\" returned \"#{authors_list.size}\" authors and \"#{users_list.size}\" users"
luis@946 216
luis@1411 217 # will check if any of the members of the users list
luis@1411 218 # doesn't belong to the authors list
luis@601 219
luis@1411 220 @results = authors_list
luis@946 221
luis@1411 222 users_list.each do |user|
luis@1411 223 @results << user unless authors_list.include?(user.author)
luis@592 224 end
luis@592 225
luis@1417 226 logger.debug { "Autocomplete_for_author results --> #{@results}" }
luis@1417 227
luis@1071 228 render :layout => false
luis@598 229 end
luis@946 230
luis@557 231 def sort_author_order
luis@557 232 params[:authorships].each_with_index do |id, index|
luis@557 233 Authorship.update_all(['auth_order=?', index+1], ['id=?', id])
luis@471 234 end
luis@471 235 render :nothing => true
luis@471 236 end
luis@574 237
luis@574 238 def add_project
luis@1071 239 @projects = Project.find(params[:publication][:project_ids])
luis@574 240 @publication.projects << @projects
luis@1071 241 @project = Project.find(params[:project_id])
luis@946 242
luis@1071 243 # TODO luisf should also respond to HTML???
luis@574 244 respond_to do |format|
luis@574 245 format.html { redirect_to :back }
luis@1071 246 format.js {
luis@1071 247 render(:update) {|page|
luis@1071 248 page[:add_project_form].reset
luis@574 249 page.replace_html :list_projects, :partial => 'list_projects'
luis@574 250 }
luis@574 251 }
luis@574 252 end
luis@574 253 end
luis@946 254
luis@574 255 def remove_project
luis@579 256 @project = Project.find(params[:project_id])
luis@579 257 proj = Project.find(params[:remove_project_id])
luis@554 258
luis@574 259 if @publication.projects.length > 1
luis@579 260 if @publication.projects.exists? proj
luis@579 261 @publication.projects.delete proj if request.post?
luis@554 262 end
luis@554 263 else
luis@1071 264 logger.error { "Cannot remove project from publication list" }
luis@554 265 end
luis@946 266
luis@591 267 logger.error { "CURRENT project name#{proj.name} and wanna delete #{@project.name}" }
luis@946 268
luis@1071 269 render(:update) {|page|
luis@579 270 page.replace_html "list_projects", :partial => 'list_projects', :id => @publication
luis@1071 271 }
luis@554 272 end
luis@946 273
luis@560 274 def destroy
luis@1406 275 find_project_by_project_id unless params[:project_id].nil?
luis@1406 276 @publication = Publication.find(params[:id])
luis@1405 277
luis@560 278 @publication.destroy
luis@946 279
luis@560 280 flash[:notice] = "Successfully deleted Publication."
luis@560 281 redirect_to :controller => :publications, :action => 'index', :project_id => @project
luis@560 282 end
luis@471 283
luis@538 284 private
luis@478 285
luis@328 286 end