annotate plugins/redmine_bibliography/app/models/authorship.rb @ 1519:afce8026aaeb redmine-2.4-integration

Merge from branch "live"
author Chris Cannam
date Tue, 09 Sep 2014 09:34:53 +0100
parents 35732ac4324a
children
rev   line source
luis@328 1 class Authorship < ActiveRecord::Base
luis@1123 2 unloadable
luis@1123 3
luis@328 4 belongs_to :author
luis@328 5 belongs_to :publication
luis@1123 6
luis@483 7 accepts_nested_attributes_for :author
luis@483 8 accepts_nested_attributes_for :publication
luis@686 9
luis@686 10 validates_presence_of :name_on_paper
luis@1123 11
luis@1395 12 attr_writer :search_author_id , :search_author_class
luis@1394 13 attr_writer :search_author_tie
luis@1364 14
luis@1394 15 ### attr_accessor :search_results, :identify_author
luis@1394 16 ## attr_writer :search_author_class
luis@1394 17
luis@1395 18 before_save :set_author
luis@1367 19 before_update :delete_publication_cache
luis@591 20
luis@1363 21 # tod: review scope of ordering
luis@1363 22 acts_as_list :column => 'auth_order'
luis@1317 23
luis@1124 24 # todo: review usage of scope --lf.20130108
luis@1123 25 scope :like_unique, lambda {|q|
luis@601 26 s = "%#{q.to_s.strip.downcase}%"
luis@601 27 {:conditions => ["LOWER(name_on_paper) LIKE :s OR LOWER(email) LIKE :s", {:s => s}],
luis@601 28 :order => 'name_on_paper',
luis@601 29 :group => "name_on_paper, institution, email"
luis@601 30 }
luis@601 31 }
luis@601 32
luis@1124 33 # todo: review usage of scope --lf.20130108
luis@1123 34 scope :like, lambda {|q|
luis@591 35 s = "%#{q.to_s.strip.downcase}%"
luis@601 36 {:conditions => ["LOWER(name_on_paper) LIKE :s OR LOWER(email) LIKE :s", {:s => s}],
luis@591 37 :order => 'name_on_paper'
luis@591 38 }
luis@591 39 }
luis@1123 40
luis@1394 41 def search_author_class
luis@1394 42 # Authorship must always have an Author
luis@1394 43 # unless it hasn't been saved yet
luis@1394 44 # using default setter (attr_writer)
luis@1394 45
luis@1394 46 if self.author.nil?
luis@1397 47 aclass = ""
luis@1394 48 else
luis@1397 49 aclass = "Author"
luis@1394 50 end
luis@1395 51
luis@1397 52 @search_author_class || aclass
luis@1394 53 end
luis@1394 54
luis@1394 55 def search_author_id
luis@1394 56 if self.author.nil?
luis@1398 57 authid = ""
luis@1394 58 else
luis@1397 59 authid = author_id
luis@1394 60 end
luis@1397 61
luis@1397 62 @search_author_id || authid
luis@1394 63 end
luis@1394 64
luis@1394 65 def search_author_tie
luis@1394 66 if self.author.nil?
luis@1397 67 auth_tie = false
luis@1394 68 else
luis@1397 69 auth_tie = true
luis@1394 70 end
luis@1394 71
luis@1397 72 @search_author_tie || auth_tie
luis@1394 73 end
luis@1394 74
luis@592 75 def name
luis@592 76 return self.name_on_paper
luis@592 77 end
luis@1123 78
luis@591 79 def <=>(authorship)
luis@592 80 name.downcase <=> authorship.name.downcase
luis@592 81 end
luis@1123 82
luis@592 83 def mail
luis@592 84 return self.email
luis@591 85 end
luis@1123 86
luis@1123 87 protected
luis@1367 88
luis@1367 89 def delete_publication_cache
luis@1367 90 publication = Publication.find(self.publication_id)
luis@1367 91 Rails.cache.delete "publication-#{publication.id}-ieee"
luis@1367 92 Rails.cache.delete "publication-#{publication.id}-bibtex"
luis@1367 93 end
luis@1367 94
luis@1395 95 private
luis@1395 96
luis@1394 97 def set_author
luis@1403 98 # do we want to associate the authorship
luis@1403 99 # with an existing author/user?
luis@1403 100 if @search_author_tie
luis@1403 101 # if an author, simply associates with it
luis@1403 102 # if an user, checks if it has already an author associated with it
luis@1403 103 # if so, associates with that author
luis@1403 104 # otherwise, creates a new author
luis@1394 105
luis@1403 106 case @search_author_class
luis@1403 107 when ""
luis@1403 108 author = Author.new
luis@1403 109 author.save
luis@1394 110
luis@1403 111 when "User"
luis@1403 112 user = User.find(@search_author_id)
luis@1394 113
luis@1403 114 if user.author.nil?
luis@1403 115 # User w/o author:
luis@1403 116 # create new author and update user
luis@1403 117 author = Author.new
luis@1403 118 author.save
luis@1403 119 user.author = author
luis@1403 120 user.save
luis@1403 121 else
luis@1403 122 author = user.author
luis@1403 123 end
luis@1403 124
luis@1403 125 when "Author"
luis@1403 126 author = Author.find(@search_author_id)
luis@1403 127 end
luis@1403 128
luis@1403 129 # if we don't want to associate with an existing author/user
luis@1403 130 else
luis@1403 131 # todo: should we delete any previously existing relationship?
luis@1366 132 author = Author.new
luis@1366 133 author.save
luis@1394 134 end
luis@1366 135
luis@1394 136 self.author = author
luis@518 137 end
luis@328 138 end