Don't erase old publcations, so that the relations don't disappear.
[redakcja_redmine.git] / lib / redmine_publications / issue_patch.rb
index dbcbfa8..bd1f73e 100644 (file)
@@ -11,14 +11,8 @@ module RedminePublications
       base.class_eval do
         unloadable # Send unloadable so it will not be unloaded in development
  
       base.class_eval do
         unloadable # Send unloadable so it will not be unloaded in development
  
+        validate :check_relations
         after_save :update_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
       end
  
     end
@@ -27,40 +21,54 @@ module RedminePublications
     end
     
     module InstanceMethods
     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
         end
-       @source_files        
       end
 
       end
 
-      def source_files=(value)
-       @source_files = value
+      def publication_names=(value)
+        @pubnames = value.sort!
       end
 
       end
 
-      def lookup_source_files
+      def publications
         Publication.all( 
         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
       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
       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
 
         return true
       end