luis@385: # vendor/plugins/redmine_bibliography/app/controllers/publications_controller.rb luis@385: luis@328: class PublicationsController < ApplicationController luis@425: unloadable luis@457: luis@478: before_filter :find_project_by_project_id, :except => [:autocomplete_for_project, :add_author, :sort_authors, :autocomplete_for_author] luis@462: luis@457: luis@404: def new luis@444: @publication = Publication.new luis@445: luis@445: # we'll always want a new publication to have its bibtex entry luis@445: @publication.build_bibtex_entry luis@445: luis@446: # and at least one author luis@471: @publication.authorships.build.build_author luis@446: luis@458: @project_id = params[:project_id] luis@467: @current_user = User.current luis@409: luis@393: end luis@384: luis@404: def create luis@390: @publication = Publication.new(params[:publication]) luis@458: @project = Project.find(params[:project_id]) luis@445: luis@458: @publication.projects << @project luis@458: luis@448: if @publication.save luis@445: flash[:notice] = "Successfully created publication." luis@459: redirect_to :action => :show, :id => @publication, :project_id => @project.id luis@445: else luis@445: render :action => 'new' luis@445: end luis@445: end luis@445: luis@445: def index luis@458: @project = Project.find(params[:project_id]) luis@458: @publications = Publication.find :all, :joins => :projects, :conditions => ["project_id = ?", @project.id] luis@445: end luis@445: luis@445: def new_from_bibfile luis@391: @publication.current_step = session[:publication_step] luis@409: luis@404: # contents of the paste text area luis@404: bibtex_entry = params[:bibtex_entry] luis@384: luis@404: # method for creating "pasted" bibtex entries luis@424: if bibtex_entry luis@409: parse_bibtex_list bibtex_entry luis@404: end luis@329: end luis@329: luis@467: def add_author luis@467: if (request.xhr?) luis@467: render :text => User.find(params[:user_id]).name luis@467: else luis@467: # No? Then render an action. luis@467: #render :action => 'view_attribute', :attr => @name luis@467: logger.error { "ERRO ADD AUTHOR" } luis@467: end luis@467: end luis@467: luis@472: def add_me_as_author luis@472: if (request.xhr?) luis@472: if User.current.author.nil? luis@478: logger.error { "current user has no author" } luis@478: @author = Author.new(:user_id => User.current, :name => User.current.name) luis@472: else luis@479: logger.error { "current user already has an author" } luis@472: @author = User.current.author luis@477: end luis@478: luis@479: # @authorship = Authorship.create(:author => @author, :publication => @publication) luis@472: else luis@472: # No? Then render an action. luis@472: #render :action => 'view_attribute', :attr => @name luis@472: logger.error { "ERROR ADD ME AS AUTHOR" } luis@472: end luis@472: end luis@472: luis@328: luis@445: def edit luis@428: @publication = Publication.find(params[:id]) luis@430: end luis@430: luis@445: def update luis@448: @publication = Publication.find(params[:id]) luis@430: if @publication.update_attributes(params[:publication]) luis@430: flash[:notice] = "Successfully updated Publication." luis@448: redirect_to @publication luis@430: else luis@448: render :action => 'edit' luis@448: end luis@328: end luis@328: luis@425: def show luis@430: logger.error "-------> No Show" luis@430: luis@428: @publication = Publication.find(params[:id]) luis@425: luis@425: if @publication.nil? luis@425: @publications = Publication.all luis@425: render "index", :alert => 'Your Publications was not found!' luis@425: else luis@425: @authors = @publication.authors luis@425: @bibtext_entry = @publication.bibtex_entry luis@425: luis@425: respond_to do |format| luis@425: format.html luis@425: format.xml {render :xml => @publication} luis@425: end luis@425: end luis@329: end luis@329: luis@406: # parse string with bibtex authors luis@406: def parse_authors(authors_entry) luis@406: # in bibtex the authors are always seperated by "and" luis@407: return authors_entry.split(" and ") luis@406: end luis@406: luis@406: # parses a list of bibtex luis@406: def parse_bibtex_list(bibtex_list) luis@406: bibliography = BibTeX.parse bibtex_list luis@406: luis@406: no_entries = bibliography.data.length luis@406: luis@406: # parses the bibtex entries luis@406: bibliography.data.map do |d| luis@407: luis@407: if d.class == BibTeX::Entry luis@407: create_bibtex_entry d luis@407: end luis@406: end luis@407: end luis@407: luis@409: def create_bibtex_entry(d) luis@407: @publication = Publication.new luis@407: @bentry = BibtexEntry.new luis@407: authors = [] luis@407: institution = "" luis@407: email = "" luis@409: luis@407: d.fields.keys.map do |field| luis@407: case field.to_s luis@407: when "author" luis@407: authors = parse_authors d[field] luis@407: when "title" luis@407: @publication.title = d[field] luis@407: when "institution" luis@407: institution = d[field] luis@407: when "email" luis@407: email = d[field] luis@407: else luis@407: @bentry[field] = d[field] luis@407: end luis@407: end luis@406: luis@406: @publication.bibtex_entry = @bentry luis@407: @publication.save luis@409: luis@424: # what is this for??? luis@424: # @created_publications << @publication.id luis@409: luis@407: # need to save all authors luis@407: # and establish the author-publication association luis@407: # via the authorships table luis@407: authors.each_with_index.map do |authorname, idx| luis@407: author = Author.new(:name => authorname) luis@407: if author.save! luis@407: puts "SAVED" luis@407: else luis@407: puts "NOT SAVED" luis@406: end luis@406: luis@407: author.authorships.create!( luis@444: :publication => @publication, luis@444: :institution => institution, luis@444: :email => email, luis@444: :order => idx) luis@407: end luis@407: end luis@409: luis@407: # parses the bibtex file luis@407: def parse_bibtex_file luis@407: luis@406: end luis@406: luis@444: def import luis@444: @publication = Publication.new luis@444: luis@444: luis@444: end luis@461: luis@461: def add_project luis@464: @projects = Project.find(params[:publication][:project_ids]) luis@464: @publication = Publication.find(params[:id]) luis@464: @publication.projects << @projects luis@461: luis@464: # TODO luisf should also respond to HTML??? luis@464: respond_to do |format| luis@464: format.js luis@464: end luis@461: end luis@409: luis@461: def autocomplete_for_project luis@461: @publication = Publication.find(params[:id]) luis@477: luis@464: @projects = Project.active.like(params[:q]).find(:all, :limit => 100) - @publication.projects luis@461: logger.debug "Query for \"#{params[:q]}\" returned \"#{@projects.size}\" results" luis@461: render :layout => false luis@409: end luis@471: luis@477: def autocomplete_for_author luis@478: @authors = Author.like(params[:q]).find(:all, :limit => 100) luis@477: logger.debug "Query for \"#{params[:q]}\" returned \"#{@authors.size}\" results" luis@477: render :layout => false luis@477: end luis@471: luis@471: def sort_authors luis@471: params[:authors].each_with_index do |id, index| luis@471: Author.update_all(['order=?', index+1], ['id=?', id]) luis@471: end luis@471: render :nothing => true luis@471: end luis@471: luis@478: def identify_author luis@478: luis@478: end luis@478: luis@478: luis@457: luis@457: private luis@457: luis@459: # TODO: luisf. - only here for debugging purposes luis@459: # Find project of id params[:project_id] luis@459: def find_project_by_project_id luis@459: luis@459: logger.error { "FIND PROJECT BY PROJECT ID" } luis@459: luis@459: @project = Project.find(params[:project_id]) luis@459: rescue ActiveRecord::RecordNotFound luis@459: render_404 luis@459: end luis@328: end