diff --git a/app/services/projects/import_export/import_export.yml b/app/services/projects/import_export/import_export.yml index be7680775bae5c99d24022f51a36b1af9b0f9bf6..16a212d4c3860319cdd9b1a3798fa900081f5174 100644 --- a/app/services/projects/import_export/import_export.yml +++ b/app/services/projects/import_export/import_export.yml @@ -1,4 +1,4 @@ -# Class relationships to be included in the project import/export +# Model relationships to be included in the project import/export :project_tree: - :issues - :labels @@ -13,6 +13,7 @@ - :commit_statuses: - :commit +# Only include the following attributes for the models specified. :attributes_only: :project: - :name @@ -30,6 +31,7 @@ - :email - :username +# Do not include the following attributes for the models specified. :attributes_except: :snippets: - :expired_at \ No newline at end of file diff --git a/app/services/projects/import_export/project_tree_restorer.rb b/app/services/projects/import_export/project_tree_restorer.rb index ca68840e988da41d822e38761c17f2b5f5835363..9512fcb2a1ab796848945329cf1e5eddc2b76cd6 100644 --- a/app/services/projects/import_export/project_tree_restorer.rb +++ b/app/services/projects/import_export/project_tree_restorer.rb @@ -11,29 +11,25 @@ module Projects def restore json = IO.read(@path) @tree_hash = ActiveSupport::JSON.decode(json) + @project_members = @tree_hash.delete('project_members') create_relations - puts project.inspect end private def members_map @members ||= Projects::ImportExport::MembersMapper.map( - exported_members: @tree_hash.delete('project_members'), user: @user, project_id: project.id) + exported_members: @project_members, user: @user, project_id: project.id) end - #TODO Definitely refactor this method! - #TODO Think about having a yaml file to describe the tree instead of just hashes? def create_relations(relation_list = default_relation_list, tree_hash = @tree_hash) - members_map # TODO remove this and fix project_members relation_list.each do |relation| if relation.is_a?(Hash) - relation.values.each do |value| - create_relations(value, @tree_hash[relation.to_s]) - end + create_sub_relations(relation, tree_hash) end - relation_hash = create_relation(relation, tree_hash[relation.to_s]) - project.update_attribute(relation, relation_hash) + relation_key = relation.is_a?(Hash) ? relation.keys.first : relation + relation_hash = create_relation(relation_key, tree_hash[relation_key.to_s]) + project.update_attribute(relation_key, relation_hash) # relation_hash = nil # # FIXME # # next if tree_hash[relation.to_s].blank? @@ -56,10 +52,7 @@ module Projects end def default_relation_list - Projects::ImportExport::ImportExportReader.tree - # ImportExport.project_tree.reject do |rel| - # rel.is_a?(Hash) && !rel[:project_members].blank? - # end + Projects::ImportExport::ImportExportReader.tree.reject { |model| model.is_a?(Hash) && model[:project_members] } end def project @@ -74,6 +67,20 @@ module Projects project end + def create_sub_relations(relation, tree_hash) + # TODO refactor this + relation_key = relation.keys.first + tree_hash[relation_key.to_s].each do |relation_item| + relation.values.each do |sub_relation| + relation_hash = relation_item[sub_relation.to_s] + next if relation_hash.blank? + sub_relation_object = Projects::ImportExport::RelationFactory.create( + relation_sym: sub_relation, relation_hash: relation_hash, members_map: members_map) + relation_item[sub_relation.to_s] = sub_relation_object + end + end + end + def create_relation(relation, relation_hash_list) [relation_hash_list].flatten.map do |relation_hash| Projects::ImportExport::RelationFactory.create(