annotate vendor/plugins/redmine_bibliography/app/controllers/publications_controller.rb @ 614:712324fee0c0 feature_36

Started working on Feature #241.
author luisf <luis.figueira@eecs.qmul.ac.uk>
date Tue, 23 Aug 2011 15:47:15 +0100
parents 3b63cea01e7b
children df7551a82bbe
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@457 6
luis@560 7 model_object Publication
luis@598 8 before_filter :find_model_object, :except => [:new, :create, :index, :autocomplete_for_project, :add_author, :sort_author_order, :autocomplete_for_author, :get_user_info ]
luis@560 9
luis@614 10 before_filter :find_project_by_project_id, :authorize, :only => :edit
luis@614 11
luis@614 12
luis@538 13 # before_filter :find_project, :except => [:autocomplete_for_project, :add_author, :sort_authors, :autocomplete_for_author]
luis@519 14
luis@404 15 def new
luis@539 16 find_project_by_project_id
luis@539 17 @publication = Publication.new
luis@445 18
luis@445 19 # we'll always want a new publication to have its bibtex entry
luis@539 20 @publication.build_bibtex_entry
luis@445 21
luis@446 22 # and at least one author
luis@608 23 # @publication.authorships.build.build_author
luis@614 24 @author_options = [User.current]
luis@614 25
luis@614 26
luis@519 27 end
luis@409 28
luis@539 29 def create
luisf@613 30 @project = Project.find(params[:project_id])
luisf@613 31
luis@614 32 @author_options = [User.current]
luis@614 33
luis@390 34 @publication = Publication.new(params[:publication])
luis@553 35 @publication.projects << @project unless @project.nil?
luis@553 36
luis@448 37 if @publication.save
luis@445 38 flash[:notice] = "Successfully created publication."
luisf@613 39 redirect_to :action => :show, :id => @publication, :project_id => @project
luis@445 40 else
luisf@613 41 render :action => 'new', :project_id => @project
luis@445 42 end
luis@445 43 end
luis@445 44
luis@445 45 def index
luis@538 46 if !params[:project_id].nil?
luis@538 47 find_project_by_project_id
luis@538 48 @project = Project.find(params[:project_id])
luis@538 49 @publications = Publication.find :all, :joins => :projects, :conditions => ["project_id = ?", @project.id]
luis@538 50 else
luis@538 51 @publications = Publication.find :all
luis@538 52 end
luis@445 53 end
luis@445 54
luis@445 55 def new_from_bibfile
luis@391 56 @publication.current_step = session[:publication_step]
luis@409 57
luis@404 58 # contents of the paste text area
luis@404 59 bibtex_entry = params[:bibtex_entry]
luis@384 60
luis@404 61 # method for creating "pasted" bibtex entries
luis@424 62 if bibtex_entry
luis@409 63 parse_bibtex_list bibtex_entry
luis@404 64 end
luis@329 65 end
luis@329 66
luis@467 67 def add_author
luis@467 68 if (request.xhr?)
luis@467 69 render :text => User.find(params[:user_id]).name
luis@467 70 else
luis@467 71 # No? Then render an action.
luis@467 72 #render :action => 'view_attribute', :attr => @name
luis@467 73 logger.error { "ERRO ADD AUTHOR" }
luis@467 74 end
luis@467 75 end
luis@467 76
luis@547 77 def edit
luis@547 78 find_project_by_project_id unless params[:project_id].nil?
luis@609 79
luis@609 80 @edit_view = true;
luis@609 81
luis@609 82 @author_options = []
luis@428 83 @publication = Publication.find(params[:id])
luis@544 84 @selected_bibtex_entry_type_id = @publication.bibtex_entry.entry_type
luis@430 85 end
luis@430 86
luis@445 87 def update
luis@448 88 @publication = Publication.find(params[:id])
luis@538 89
luis@544 90 logger.error { "INSIDE THE UPDATE ACTION IN THE PUBLICATION CONTROLLER" }
luis@544 91
luis@430 92 if @publication.update_attributes(params[:publication])
luis@430 93 flash[:notice] = "Successfully updated Publication."
luis@538 94
luis@538 95 if !params[:project_id].nil?
luis@538 96 redirect_to :action => :show, :id => @publication, :project_id => params[:project_id]
luis@538 97 else
luis@538 98 redirect_to :action => :show, :id => @publication
luis@538 99 end
luis@430 100 else
luis@448 101 render :action => 'edit'
luis@448 102 end
luis@328 103 end
luis@328 104
luis@425 105 def show
luis@535 106 find_project_by_project_id unless params[:project_id].nil?
luis@547 107
luis@425 108 if @publication.nil?
luis@579 109 @publications = Publication.all
luis@579 110 render "index", :alert => 'The publication was not found!'
luis@425 111 else
luis@425 112 @authors = @publication.authors
luis@425 113 @bibtext_entry = @publication.bibtex_entry
luis@425 114 end
luis@329 115 end
luis@329 116
luis@406 117 # parse string with bibtex authors
luis@406 118 def parse_authors(authors_entry)
luis@406 119 # in bibtex the authors are always seperated by "and"
luis@407 120 return authors_entry.split(" and ")
luis@406 121 end
luis@406 122
luis@406 123 # parses a list of bibtex
luis@406 124 def parse_bibtex_list(bibtex_list)
luis@406 125 bibliography = BibTeX.parse bibtex_list
luis@406 126
luis@406 127 no_entries = bibliography.data.length
luis@406 128
luis@406 129 # parses the bibtex entries
luis@406 130 bibliography.data.map do |d|
luis@407 131
luis@407 132 if d.class == BibTeX::Entry
luis@407 133 create_bibtex_entry d
luis@407 134 end
luis@406 135 end
luis@407 136 end
luis@407 137
luis@409 138 def create_bibtex_entry(d)
luis@407 139 @publication = Publication.new
luis@407 140 @bentry = BibtexEntry.new
luis@407 141 authors = []
luis@407 142 institution = ""
luis@407 143 email = ""
luis@409 144
luis@407 145 d.fields.keys.map do |field|
luis@407 146 case field.to_s
luis@407 147 when "author"
luis@407 148 authors = parse_authors d[field]
luis@407 149 when "title"
luis@407 150 @publication.title = d[field]
luis@407 151 when "institution"
luis@407 152 institution = d[field]
luis@407 153 when "email"
luis@407 154 email = d[field]
luis@407 155 else
luis@407 156 @bentry[field] = d[field]
luis@407 157 end
luis@407 158 end
luis@406 159
luis@406 160 @publication.bibtex_entry = @bentry
luis@407 161 @publication.save
luis@409 162
luis@424 163 # what is this for???
luis@424 164 # @created_publications << @publication.id
luis@409 165
luis@407 166 # need to save all authors
luis@407 167 # and establish the author-publication association
luis@407 168 # via the authorships table
luis@407 169 authors.each_with_index.map do |authorname, idx|
luis@407 170 author = Author.new(:name => authorname)
luis@407 171 if author.save!
luis@407 172 puts "SAVED"
luis@407 173 else
luis@407 174 puts "NOT SAVED"
luis@406 175 end
luis@406 176
luis@407 177 author.authorships.create!(
luis@444 178 :publication => @publication,
luis@444 179 :institution => institution,
luis@444 180 :email => email,
luis@444 181 :order => idx)
luis@407 182 end
luis@407 183 end
luis@409 184
luis@407 185 # parses the bibtex file
luis@407 186 def parse_bibtex_file
luis@407 187
luis@406 188 end
luis@406 189
luis@444 190 def import
luis@444 191 @publication = Publication.new
luis@444 192
luis@444 193
luis@444 194 end
luis@461 195
luis@461 196 def autocomplete_for_project
luis@461 197 @publication = Publication.find(params[:id])
luis@477 198
luis@464 199 @projects = Project.active.like(params[:q]).find(:all, :limit => 100) - @publication.projects
luis@461 200 logger.debug "Query for \"#{params[:q]}\" returned \"#{@projects.size}\" results"
luis@461 201 render :layout => false
luis@409 202 end
luis@471 203
luis@601 204 def autocomplete_for_author
luis@519 205 @results = []
luis@480 206
luis@596 207 object_id = params[:object_id]
luis@598 208 @object_name = "publications[authorships_attributes][#{object_id}][search_results]"
luis@601 209
luis@601 210 authorships_list = Authorship.like_unique(params[:q]).find(:all, :limit => 100)
luis@480 211 users_list = User.active.like(params[:q]).find(:all, :limit => 100)
luis@480 212
luis@591 213 logger.debug "Query for \"#{params[:q]}\" returned \"#{authorships_list.size}\" authorships and \"#{users_list.size}\" users"
luis@480 214
luis@601 215 @results = users_list
luis@601 216
luis@601 217 # TODO: can be optimized…
luis@601 218 authorships_list.each do |authorship|
luis@601 219 flag = true
luis@601 220
luis@601 221 users_list.each do |user|
luis@601 222 if authorship.name == user.name && authorship.email == user.mail && authorship.institution == user.institution
luis@601 223 Rails.logger.debug { "Rejecting Authorship #{authorship.id}" }
luis@601 224 flag = false
luis@601 225 break
luis@601 226 end
luis@601 227 end
luis@601 228
luis@601 229 @results << authorship if flag
luis@592 230 end
luis@592 231
luis@598 232 render :layout => false
luis@598 233 end
luis@598 234
luis@598 235
luis@598 236 def get_user_info
luis@598 237 object_id = params[:object_id]
luis@598 238 value = params[:value]
luis@598 239 classname = Kernel.const_get(value.split('_')[0])
luis@592 240
luis@598 241 item = classname.find(value.split('_')[1])
luis@598 242
luis@598 243 name_field = "publication_authorships_attributes_#{object_id}_name_on_paper".to_sym
luis@598 244 email_field = "publication_authorships_attributes_#{object_id}_email".to_sym
luis@600 245 institution_field = "publication_authorships_attributes_#{object_id}_institution".to_sym
luis@600 246
luis@600 247 yes_radio = "publication_authorships_attributes_#{object_id}_identify_author_yes".to_sym
luis@598 248
luis@598 249 respond_to do |format|
luis@598 250 format.js {logger.error { "JS" }
luis@598 251 render(:update) {|page|
luis@598 252 page[name_field].value = item.name
luis@598 253 page[email_field].value = item.mail
luis@600 254 page[institution_field].value = item.institution
luis@600 255
luis@600 256 page[yes_radio].checked = true
luis@601 257 page[name_field].readOnly = true
luis@601 258 page[email_field].readOnly = true
luis@601 259 page[institution_field].readOnly = true
luis@598 260 }
luis@598 261 }
luis@598 262 end
luis@477 263 end
luis@471 264
luis@557 265 def sort_author_order
luis@557 266 params[:authorships].each_with_index do |id, index|
luis@557 267 Authorship.update_all(['auth_order=?', index+1], ['id=?', id])
luis@471 268 end
luis@471 269 render :nothing => true
luis@471 270 end
luis@574 271
luis@574 272 def add_project
luis@574 273 @projects = Project.find(params[:publication][:project_ids])
luis@574 274 @publication.projects << @projects
luis@579 275 @project = Project.find(params[:project_id])
luis@574 276
luis@574 277 # TODO luisf should also respond to HTML???
luis@574 278 respond_to do |format|
luis@574 279 format.html { redirect_to :back }
luis@574 280 format.js {
luis@574 281 render(:update) {|page|
luis@574 282 page[:add_project_form].reset
luis@574 283 page.replace_html :list_projects, :partial => 'list_projects'
luis@574 284 }
luis@574 285 }
luis@574 286 end
luis@574 287 end
luis@554 288
luis@579 289
luis@574 290 def remove_project
luis@579 291 @project = Project.find(params[:project_id])
luis@579 292 proj = Project.find(params[:remove_project_id])
luis@554 293
luis@574 294 if @publication.projects.length > 1
luis@579 295 if @publication.projects.exists? proj
luis@579 296 @publication.projects.delete proj if request.post?
luis@554 297 end
luis@554 298 else
luis@579 299 logger.error { "Cannot remove project from publication list" }
luis@554 300 end
luis@554 301
luis@591 302 logger.error { "CURRENT project name#{proj.name} and wanna delete #{@project.name}" }
luis@579 303
luis@579 304 render(:update) {|page|
luis@579 305 page.replace_html "list_projects", :partial => 'list_projects', :id => @publication
luis@579 306 }
luis@554 307 end
luis@579 308
luis@560 309 def destroy
luis@560 310 find_project_by_project_id
luis@560 311
luis@560 312 @publication.destroy
luis@560 313
luis@560 314 flash[:notice] = "Successfully deleted Publication."
luis@560 315 redirect_to :controller => :publications, :action => 'index', :project_id => @project
luis@560 316 end
luis@471 317
luis@538 318 private
luis@478 319
luis@328 320 end