diff vendor/plugins/redmine_bibliography/app/controllers/publications_controller.rb @ 947:be4106d14a35 bibplugin_bibtex

Parses a pasted bibtex entry and correctly adds its fields *except* the author names/institutions. Todo: Parse the author names/institutions and show the errors (flashing on the top of the page).
author luisf <luis.figueira@eecs.qmul.ac.uk>
date Wed, 18 Jul 2012 16:57:54 +0100
parents a0c9cc95bcf3
children 010291c90b0b
line wrap: on
line diff
--- a/vendor/plugins/redmine_bibliography/app/controllers/publications_controller.rb	Thu Jul 12 17:47:15 2012 +0100
+++ b/vendor/plugins/redmine_bibliography/app/controllers/publications_controller.rb	Wed Jul 18 16:57:54 2012 +0100
@@ -1,11 +1,13 @@
 # -*- coding: utf-8 -*-
 # vendor/plugins/redmine_bibliography/app/controllers/publications_controller.rb
 
+class BibtexParsingError < Exception; end
+
 class PublicationsController < ApplicationController
   unloadable
 
   model_object Publication
-  before_filter :find_model_object, :except => [:new, :create, :index, :get_bibtex_required_fields, :autocomplete_for_project, :add_author, :sort_author_order, :autocomplete_for_author, :get_user_info ]  
+  before_filter :find_model_object, :except => [:parse_bibtex, :new, :create, :index, :get_bibtex_required_fields, :autocomplete_for_project, :add_author, :sort_author_order, :autocomplete_for_author, :get_user_info ]  
   before_filter :find_project_by_project_id, :authorize, :only => [ :edit, :new, :update, :create ]
 
   def new
@@ -18,11 +20,56 @@
     # and at least one author
     # @publication.authorships.build.build_author        
     @author_options = [["#{User.current.name} (@#{User.current.mail.partition('@')[2]})", "#{User.current.class.to_s}_#{User.current.id.to_s}"]]
+  end
 
 
+  def parse_bibtex
+    find_project_by_project_id
+
+    @bibtex_paste = params[:bibtex_paste]
+
+    begin
+      bib = BibTeX.parse(@bibtex_paste)
+
+      if bib.errors.present? or bib[0].class == NilClass
+        raise BibtexParsingError, "Bibtex Parsing Error"
+      end
+
+      respond_to do |format| 
+        format.js {
+          render(:update) {|page|
+            flash[:notice] = "Correctly parsed BibTeX entry"
+
+            bibtex_entry_no = BibtexEntryType.find_by_name(bib[0].type.to_s).id
+            page["publication_title"].value = bib[0][:title]
+            page["publication_bibtex_entry_attributes_entry_type"].value = bibtex_entry_no
+
+            BibtexEntryType.fields(bibtex_entry_no).each do |field|
+              page["publication_bibtex_entry_attributes_#{field}"].value = bib[0][field]
+            end
+          }
+        }
+      end
+
+    rescue BibtexParsingError => e
+      logger.error { "Bibtex Parsing Error #{bib.errors}" }
+
+      # todo: not showing... should be inside render?
+      flash[:error] = e.message
+      
+      respond_to do |format|
+       format.js{ 
+         render(:update) {|page|
+         }
+       }
+      end
+
+    end
+
   end
 
-  def create    
+
+  def create            
     @project = Project.find(params[:project_id])
 
     @author_options = []
@@ -64,14 +111,12 @@
 
   def get_bibtex_required_fields
 
-    unless params[:value].empty?
-      fields = BibtexEntryType.fields(params[:value]) 
-    end
+    fields = BibtexEntryType.fields(params[:q]) 
 
     respond_to do |format|
       format.js {
         render(:update) {|page|       
-          if params[:value].empty?
+          if params[:q].empty?
             page << "hideOnLoad();"
           else
             page << "show_required_bibtex_fields(#{fields.to_json()});"
@@ -109,10 +154,8 @@
 
     @author_options = []
 
-    logger.error { "INSIDE THE UPDATE ACTION IN THE PUBLICATION CONTROLLER" }
-
     if @publication.update_attributes(params[:publication])
-      flash[:notice] = "Successfully updated Publication."
+      flash[:notice] = "Successfully Updated Publication."
 
       if !params[:project_id].nil?
         redirect_to :action => :show, :id => @publication, :project_id => params[:project_id]
@@ -224,6 +267,7 @@
     logger.debug "Query for \"#{params[:q]}\" returned \"#{@projects.size}\" results"
     render :layout => false
   end
+  
 
   def autocomplete_for_author    
     @results = []