diff --git a/app/services/institution_importer.rb b/app/services/institution_importer.rb new file mode 100644 index 0000000000000000000000000000000000000000..32bda23833f43e07260b6bc2db6252b7c1f8cb06 --- /dev/null +++ b/app/services/institution_importer.rb @@ -0,0 +1,36 @@ +class InstitutionImporter + + attr_accessor :items + + def initialize + @names = [] + @learning_objects = [] + end + + def import + @items.each do |learning_object| + publisher = learning_object.get_metadata_value_of 'dc.creator' + if publisher.nil? + institution = Institution.where(name: "Banco Internacional de Objetos Educacionais").first_or_create + elsif !institution_exists?(publisher) + institution = Institution.new(name: publisher) + institution.save + @names << publisher + end + + learning_object.publisher = institution + learning_object.save + end + end + + private + + def institution_exists?(publisher) + exists = @names.include? publisher + unless exists + exists = Institution.exists?(name: publisher) + @names << publisher if exists + end + exists + end +end diff --git a/lib/tasks/import.rake b/lib/tasks/import.rake index 235f4e66dc9773ab034ea49679021dfe11099f4b..4ca7a227e499b2d970c89f345c2f109d8d71e7da 100644 --- a/lib/tasks/import.rake +++ b/lib/tasks/import.rake @@ -45,6 +45,49 @@ namespace :import do logger.close end + task :institution, [:log] => [:environment] do |t, args| + desc "Create Publisher relations based on its metadata" + include Log::Logging + + args.with_defaults(:log => STDOUT) + + Log::Logging.logger = Log::DatabaseLogger.new(args.log) + logger.level = Log::DatabaseLogger::CREATE + + + # Quantity of items fetched on each iteration + limit = 500 + # Start point from where items will be fetched + offset = 0 + importer = InstitutionImporter.new + + loop do + logger.info " --> Creating Publisher relations from #{offset} to #{offset+limit}" + + begin + # Get learning_objects (from offset to offset+limit) + learning_objects = LearningObject.limit(limit).offset(offset) + + rescue => e + logger.warn "Database error, going to sleep" + logger.error e + # Sleeps for a while to wait database's recovery + sleep(10.seconds) + # Goes to next iteration to retry + next + else + # Terminate loop if there are no more learning_objects to import + break if learning_objects.empty? + + importer.items = learning_objects + importer.import + + end + offset += limit + end + logger.close + end + task :learning_objects, [:log] => [:environment] do |t, args| desc "Importing Learning Objects from Dspace items"