annotate plugins/redmine_bibliography/app/models/authorship.rb @ 1394:0f918e37e1d6 biblio_alt_search_auth

Major interface changes; will use virtual attributes to identify search results.
author luisf <luis.figueira@eecs.qmul.ac.uk>
date Fri, 27 Sep 2013 18:43:29 +0100
parents a2e51c0a7860
children 0e4c6c2f400e
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@1394 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@1394 18 before_create :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@1394 47 return ""
luis@1394 48 else
luis@1394 49 return "Author"
luis@1394 50 end
luis@1394 51 end
luis@1394 52
luis@1394 53 def search_author_id
luis@1394 54 if self.author.nil?
luis@1394 55 return ""
luis@1394 56 else
luis@1394 57 return self.author_id
luis@1394 58 end
luis@1394 59 end
luis@1394 60
luis@1394 61 def search_author_tie
luis@1394 62 if self.author.nil?
luis@1394 63 return false
luis@1394 64 else
luis@1394 65 return true
luis@1394 66 end
luis@1394 67
luis@1394 68 end
luis@1394 69
luis@592 70 def name
luis@592 71 return self.name_on_paper
luis@592 72 end
luis@1123 73
luis@591 74 def <=>(authorship)
luis@592 75 name.downcase <=> authorship.name.downcase
luis@592 76 end
luis@1123 77
luis@592 78 def mail
luis@592 79 return self.email
luis@591 80 end
luis@1123 81
luis@1123 82 protected
luis@1367 83
luis@1367 84 def delete_publication_cache
luis@1367 85 publication = Publication.find(self.publication_id)
luis@1367 86 Rails.cache.delete "publication-#{publication.id}-ieee"
luis@1367 87 Rails.cache.delete "publication-#{publication.id}-bibtex"
luis@1367 88 end
luis@1367 89
luis@1394 90 def set_author
luis@1394 91 # if an author, simply associates with it
luis@1394 92 # if an user, checks if it has already an author associated with it
luis@1394 93 # if so, assicoates with that author
luis@1394 94 # otherwise, creates a new author
luis@1394 95
luis@1394 96 logger.error { "%%%%%%%%%%%%%%% Associate Author User %%%%%%%%%%%%%%" }
luis@1394 97
luis@1394 98 logger.error { "EU #{self.to_yaml}" }
luis@1394 99 logger.error { "Class: #{search_author_class}" }
luis@1394 100 logger.error { "ID #{search_author_id}" }
luis@1394 101
luis@1286 102 case self.search_author_class
luis@1366 103 when ""
luis@1394 104 logger.debug { "Adding new author to the database." }
luis@1366 105 author = Author.new
luis@1366 106 author.save
luis@1394 107
luis@1394 108 when "User"
luis@1394 109 # get user id
luis@1394 110 user = User.find(self.search_author_id)
luis@1394 111 logger.error { "Found user with this ID: #{user.id}" }
luis@1394 112
luis@1394 113 if user.author.nil?
luis@1394 114 logger.error { "The user has no author... creating one!" }
luis@1394 115
luis@1394 116 # User w/o author:
luis@1394 117 # create new author and update user
luis@1394 118 author = Author.new
luis@1394 119 author.save
luis@1394 120 user << author
luis@1394 121 else
luis@1394 122 logger.error { "found an author!" }
luis@1394 123 author = user.author
luis@1394 124 end
luis@1366 125
luis@1366 126 when "Author"
luis@1394 127 author = Author.find(self.search_author_id)
luis@1394 128 end
luis@1366 129
luis@1394 130 self.author = author
luis@518 131 end
luis@328 132 end