X-Git-Url: https://git.mdrn.pl/redakcja_redmine.git/blobdiff_plain/378fe7c80dbc369bceb24e57e2cd81d3bd690ee9..e41ebde0b4ec4203e00e3ba906a3eadcd5edd10e:/lib/redmine_publications/issue_patch.rb diff --git a/lib/redmine_publications/issue_patch.rb b/lib/redmine_publications/issue_patch.rb index dbcbfa8..bd1f73e 100644 --- a/lib/redmine_publications/issue_patch.rb +++ b/lib/redmine_publications/issue_patch.rb @@ -11,14 +11,8 @@ module RedminePublications base.class_eval do unloadable # Send unloadable so it will not be unloaded in development + validate :check_relations after_save :update_relations - # after_destroy :check_relations - - # Add visible to Redmine 0.8.x - unless respond_to?(:visible) - named_scope :visible, lambda {|*args| { :include => :project, - :conditions => Project.allowed_to_condition(args.first || User.current, :view_issues) } } - end end end @@ -27,40 +21,54 @@ module RedminePublications end module InstanceMethods - def source_files - if not @source_files - @source_files = self.lookup_source_files.map { |pub| pub.source_file } + + def publication_names + if not @pubnames + self.publications.map { |pub| pub.name } + else + @pubnames end - @source_files end - def source_files=(value) - @source_files = value + def publication_names=(value) + @pubnames = value.sort! end - def lookup_source_files + def publications Publication.all( - :joins => - "JOIN issue_publications ON (issue_publications.publication_id = publications.id)", - :conditions => - [" issue_publications.issue_id = ? ", self.id] ) + :joins => + "JOIN issue_publications ON (issue_publications.publication_id = publications.id)", + :conditions => + ["issue_publications.issue_id = ? ", self.id] ) end - + + def check_relations + current_names = self.publication_names + non_existant = [] + + pubs = Publication.find_all_by_name(current_names).map {|i| i.name} + missing = current_names.select {|name| not pubs.include?name } + + if not missing.empty? + errors.add("publications", "Missing publication(s): " + missing.join(', ')) + end + end + def update_relations - self.reload - current_assocs = self.lookup_source_files - new_assocs_names = self.source_files.split(' ') + old = self.publications + current_names = self.publication_names + Rails.logger.info('[INFO] Updating relations: old= ' << old.inspect << ' current=' << current_names.inspect) - # delete unused relations - deleted = current_assocs.select { |v| not (new_assocs_names.include?(v.source_file)) } - deleted.each { |pub| IssuePublication.delete_all( - :contitions => ["issue_publications.issue_id = ? AND issue_publicatons.publication_id = ?", - self.id, pub.id]) } + # delete unused relations + deleted = old.select { |v| not (current_names.include?(v.name)) } + deleted.each do |pub| + IssuePublication.delete_all(["issue_publications.issue_id = ? AND issue_publications.publication_id = ?", self.id, pub.id]) + end - new_assocs_names.each do |name| - pub = Publication.find_or_create_by_source_file(name) - IssuePublication.find_or_create_by_publication_id_and_issue_id(pub.id, self.id) - end + current_names.each do |name| + pub = Publication.find_by_name(name) + IssuePublication.find_or_create_by_publication_id_and_issue_id(pub.id, self.id) + end return true end