def find_fixtures(self, fixture_label): """ Finds fixture files for a given label. """ fixture_name, ser_fmt, cmp_fmt = self.parse_name(fixture_label) databases = [self.using, None] cmp_fmts = list(self.compression_formats.keys()) if cmp_fmt is None else [cmp_fmt] ser_fmts = serializers.get_public_serializer_formats() if ser_fmt is None else [ser_fmt] if self.verbosity >= 2: self.stdout.write("Loading '%s' fixtures..." % fixture_name) if os.path.isabs(fixture_name): fixture_dirs = [os.path.dirname(fixture_name)] fixture_name = os.path.basename(fixture_name) else: fixture_dirs = self.fixture_dirs if os.path.sep in os.path.normpath(fixture_name): fixture_dirs = [os.path.join(dir_, os.path.dirname(fixture_name)) for dir_ in fixture_dirs] fixture_name = os.path.basename(fixture_name) suffixes = ( '.'.join(ext for ext in combo if ext) for combo in product(databases, ser_fmts, cmp_fmts) ) if fixture_name == "*": search_name = "" else: search_name = fixture_name targets = set('.'.join((search_name, suffix)) for suffix in suffixes) fixture_files = [] for fixture_dir in fixture_dirs: if self.verbosity >= 2: self.stdout.write("Checking %s for fixtures..." % humanize(fixture_dir)) fixture_files_in_dir = [] for candidate in glob.iglob(os.path.join(fixture_dir, search_name + '*')): if any([os.path.basename(candidate).endswith(t) for t in targets]): # Save the fixture_dir and fixture_name for future error messages. fixture_files_in_dir.append((candidate, fixture_dir, fixture_name)) if self.verbosity >= 2 and not fixture_files_in_dir: self.stdout.write("No fixture '%s' in %s." % (fixture_name, humanize(fixture_dir))) # Check kept for backwards-compatibility; it isn't clear why # duplicates are only allowed in different directories. # Commented out from django # if len(fixture_files_in_dir) > 1: # raise CommandError( # "Multiple fixtures named '%s' in %s. Aborting." % # (fixture_name, humanize(fixture_dir))) fixture_files.extend(fixture_files_in_dir) return fixture_files
def find_fixtures(self, fixture_label='aristotle_help_files'): """ Finds fixture files for a given label. """ fixture_name, ser_fmt = self.parse_name(fixture_label) databases = [self.using, None] ser_fmts = serializers.get_public_serializer_formats() if ser_fmt is None else [ser_fmt] if self.verbosity >= 2: self.stdout.write("Loading '%s' fixtures..." % fixture_name) if os.path.isabs(fixture_name): fixture_dirs = [os.path.dirname(fixture_name)] else: fixture_dirs = self.fixture_dirs if os.path.sep in os.path.normpath(fixture_name): fixture_dirs = [os.path.join(dir_, os.path.dirname(fixture_name)) for dir_ in fixture_dirs] suffixes = ( '.'.join(ext for ext in combo if ext) for combo in product(databases, ser_fmts) ) fixture_name = "*" search_name = "" targets = set('.'.join((search_name, suffix)) for suffix in suffixes) fixture_files = [] for fixture_dir in fixture_dirs: if self.verbosity >= 2: self.stdout.write("Checking %s for fixtures..." % humanize(fixture_dir)) fixture_files_in_dir = [] for dir_name, sub, candidates in os.walk(fixture_dir): # , search_name + '*')): for candidate in candidates: candidate = os.path.join(dir_name, candidate) if any([os.path.basename(candidate).endswith(t) for t in targets]): # Save the fixture_dir and fixture_name for future error messages. fixture_files_in_dir.append((candidate, fixture_dir, candidate.split('/')[-1])) dest_static_dir = os.path.join(settings.STATIC_ROOT, "aristotle_help") src = os.path.join(fixture_dir, 'static') if not os.path.exists(dest_static_dir): os.makedirs(dest_static_dir) if os.path.exists(src): from distutils import dir_util dir_util.copy_tree(src, dest_static_dir) # Check kept for backwards-compatibility; it isn't clear why # duplicates are only allowed in different directories. # Commented out from django # if len(fixture_files_in_dir) > 1: # raise CommandError( # "Multiple fixtures named '%s' in %s. Aborting." % # (fixture_name, humanize(fixture_dir))) fixture_files.extend(fixture_files_in_dir) return fixture_files
def load_label(self, fixture_label): """ Loads fixtures files for a given label. """ show_progress = self.verbosity >= 3 for fixture_file, fixture_dir, fixture_name in self.find_fixtures(fixture_label): _, ser_fmt, cmp_fmt = self.parse_name(os.path.basename(fixture_file)) open_method, mode = self.compression_formats[cmp_fmt] fixture = open_method(fixture_file, mode) try: self.fixture_count += 1 objects_in_fixture = 0 loaded_objects_in_fixture = 0 if self.verbosity >= 2: self.stdout.write( "Installing %s fixture '%s' from %s." % (ser_fmt, fixture_name, humanize(fixture_dir)) ) objects = serializers.deserialize( ser_fmt, fixture, using=self.using, ignorenonexistent=self.ignore ) for obj in objects: objects_in_fixture += 1 if router.allow_migrate_model(self.using, obj.object.__class__): loaded_objects_in_fixture += 1 self.models.add(obj.object.__class__) try: if self.update: keys = dict([ (key, getattr(obj.object, key)) for key in obj.object.unique_together ]) vals = dict([ (k, v) for k, v in model_to_dict(obj.object).items() if v is not None ]) item, created = obj.object.__class__.objects.get_or_create( defaults=vals, **keys ) if not created: if show_progress: self.stdout.write( 'Updated an object(s).', ending='' ) for k, v in vals.items(): setattr(item, k, v) item.save() else: obj.object.save() if show_progress: self.stdout.write( '\rProcessed %i object(s).' % loaded_objects_in_fixture, ending='' ) except (DatabaseError, IntegrityError) as e: e.args = ("Could not load %(app_label)s.%(object_name)s(pk=%(pk)s): %(error_msg)s" % { 'app_label': obj.object._meta.app_label, 'object_name': obj.object._meta.object_name, 'pk': obj.object.pk, 'error_msg': force_text(e) },) raise if objects and show_progress: self.stdout.write('') # add a newline after progress indicator self.loaded_object_count += loaded_objects_in_fixture self.fixture_object_count += objects_in_fixture except Exception as e: if not isinstance(e, CommandError): e.args = ("Problem installing fixture '%s': %s" % (fixture_file, e),) raise finally: fixture.close() # Warn if the fixture we loaded contains 0 objects. if objects_in_fixture == 0: warnings.warn( "No fixture data found for '%s'. (File format may be " "invalid.)" % fixture_name, RuntimeWarning )
def find_fixtures(self, fixture_label='aristotle_help_files'): """ Finds fixture files for a given label. """ fixture_name, ser_fmt = self.parse_name(fixture_label) databases = [self.using, None] ser_fmts = serializers.get_public_serializer_formats( ) if ser_fmt is None else [ser_fmt] if self.verbosity >= 2: self.stdout.write("Loading '%s' fixtures..." % fixture_name) if os.path.isabs(fixture_name): fixture_dirs = [os.path.dirname(fixture_name)] else: fixture_dirs = self.fixture_dirs if os.path.sep in os.path.normpath(fixture_name): fixture_dirs = [ os.path.join(dir_, os.path.dirname(fixture_name)) for dir_ in fixture_dirs ] suffixes = ('.'.join(ext for ext in combo if ext) for combo in product(databases, ser_fmts)) fixture_name = "*" search_name = "" targets = set('.'.join((search_name, suffix)) for suffix in suffixes) fixture_files = [] for fixture_dir in fixture_dirs: if self.verbosity >= 2: self.stdout.write("Checking %s for fixtures..." % humanize(fixture_dir)) fixture_files_in_dir = [] for dir_name, sub, candidates in os.walk( fixture_dir): # , search_name + '*')): for candidate in candidates: candidate = os.path.join(dir_name, candidate) if any([ os.path.basename(candidate).endswith(t) for t in targets ]): # Save the fixture_dir and fixture_name for future error messages. fixture_files_in_dir.append( (candidate, fixture_dir, candidate.split('/')[-1])) dest_static_dir = os.path.join(settings.STATIC_ROOT, "aristotle_help") src = os.path.join(fixture_dir, 'static') if not os.path.exists(dest_static_dir): os.makedirs(dest_static_dir) if os.path.exists(src): from distutils import dir_util dir_util.copy_tree(src, dest_static_dir) # Check kept for backwards-compatibility; it isn't clear why # duplicates are only allowed in different directories. # Commented out from django # if len(fixture_files_in_dir) > 1: # raise CommandError( # "Multiple fixtures named '%s' in %s. Aborting." % # (fixture_name, humanize(fixture_dir))) fixture_files.extend(fixture_files_in_dir) return fixture_files
def load_label(self): """ Loads fixtures files for a given label. """ show_progress = self.verbosity >= 3 for fixture_file, fixture_dir, fixture_name in self.find_fixtures(): _, ser_fmt = self.parse_name(os.path.basename(fixture_file)) fixture = open(fixture_file, 'rb') try: self.fixture_count += 1 objects_in_fixture = 0 loaded_objects_in_fixture = 0 if self.verbosity >= 2: self.stdout.write( "Installing %s fixture '%s' from %s." % (ser_fmt, fixture_name, humanize(fixture_dir))) objects = serializers.deserialize( ser_fmt, fixture, using=self.using, ignorenonexistent=self.ignore) for obj in objects: objects_in_fixture += 1 if router.allow_migrate_model(self.using, obj.object.__class__): loaded_objects_in_fixture += 1 self.models.add(obj.object.__class__) try: keys = dict([(key, getattr(obj.object, key)) for key in obj.object.unique_together ]) if self.update: vals = dict([(k, v) for k, v in model_to_dict( obj.object).items() if v is not None]) item, created = obj.object.__class__.objects.get_or_create( defaults=vals, **keys) if not created: if show_progress: self.stdout.write( 'Updated an object(s).', ending='') for k, v in vals.items(): setattr(item, k, v) item.save() else: if not obj.object.__class__.objects.filter( **keys).exists(): obj.object.save() if show_progress: self.stdout.write('\rProcessed %i object(s).' % loaded_objects_in_fixture, ending='') except (DatabaseError, IntegrityError) as e: e.args = ( "Could not load %(app_label)s.%(object_name)s(pk=%(pk)s): %(error_msg)s" % { 'app_label': obj.object._meta.app_label, 'object_name': obj.object._meta.object_name, 'pk': obj.object.pk, 'error_msg': force_text(e) }, ) raise if objects and show_progress: self.stdout.write( '') # add a newline after progress indicator self.loaded_object_count += loaded_objects_in_fixture self.fixture_object_count += objects_in_fixture except Exception as e: if not isinstance(e, CommandError): e.args = ("Problem installing fixture '%s': %s" % (fixture_file, e), ) raise finally: fixture.close() # Warn if the fixture we loaded contains 0 objects. if objects_in_fixture == 0: warnings.warn( "No fixture data found for '%s'. (File format may be " "invalid.)" % fixture_name, RuntimeWarning)
def load_label(self, fixture_label): """ Loads fixtures files for a given label. """ for fixture_file, fixture_dir, fixture_name in ( self.find_fixtures(fixture_label)): _, ser_fmt, cmp_fmt = self.parse_name( os.path.basename(fixture_file)) open_method, mode = self.compression_formats[cmp_fmt] fixture = open_method(fixture_file, mode) try: self.fixture_count += 1 objects_in_fixture = 0 loaded_objects_in_fixture = 0 if self.verbosity >= 2: self.stdout.write( "Installing %s fixture '%s' from %s." % (ser_fmt, fixture_name, humanize(fixture_dir))) objects = Deserializer(fixture, using=self.using, ignorenonexistent=self.ignore, state=self.state) for obj in objects: objects_in_fixture += 1 if is_django_1_7: router_allow = router.allow_migrate else: router_allow = router.allow_migrate_model if router_allow(self.using, obj.object.__class__): loaded_objects_in_fixture += 1 self.models.add(obj.object.__class__) try: obj.save(using=self.using) except (DatabaseError, IntegrityError) as e: e.args = ( "Could not load %(app_label)s." "%(object_name)s(pk=%(pk)s): " "%(error_msg)s" % { 'app_label': obj.object._meta.app_label, 'object_name': (obj.object._meta.object_name), 'pk': obj.object.pk, 'error_msg': force_text(e) }, ) raise self.loaded_object_count += loaded_objects_in_fixture self.fixture_object_count += objects_in_fixture except Exception as e: if not isinstance(e, CommandError): e.args = ("Problem installing fixture '%s': %s" % (fixture_file, e), ) raise finally: fixture.close() # Warn if the fixture we loaded contains 0 objects. if objects_in_fixture == 0: warnings.warn( "No fixture data found for '%s'. (File format may be " "invalid.)" % fixture_name, RuntimeWarning)
def load_label(self, fixture_label): """ Loads fixtures files for a given label. This method is largely copied from django.core.management.commands.loaddata.Command but with the addition of using bulk_create where possible. """ show_progress = self.verbosity >= 3 for fixture_file, fixture_dir, fixture_name in self.find_fixtures( fixture_label): _, ser_fmt, cmp_fmt = self.parse_name( os.path.basename(fixture_file)) open_method, mode = self.compression_formats[cmp_fmt] fixture = open_method(fixture_file, mode) try: self.fixture_count += 1 objects_in_fixture = 0 loaded_objects_in_fixture = 0 if self.verbosity >= 2: self.stdout.write( "Installing %s fixture '%s' from %s." % (ser_fmt, fixture_name, humanize(fixture_dir))) objects = serializers.deserialize( ser_fmt, fixture, using=self.using, ignorenonexistent=self.ignore, ) models_in_file = set() objects_to_create = [] for obj in objects: objects_in_fixture += 1 if (obj.object._meta.app_config in self.excluded_apps or type(obj.object) in self.excluded_models): continue if router.allow_migrate_model(self.using, obj.object.__class__): self.models.add(obj.object.__class__) models_in_file.add(obj.object.__class__) objects_to_create.append(obj) if len(models_in_file) == 1: model = list(models_in_file)[0] try: model_objects = [] m2m_related_objects = defaultdict(list) for obj in objects_to_create: model_objects.append(obj.object) if obj.m2m_data: for accessor_field, m2m_list in obj.m2m_data.items( ): m2m_rel = getattr(model, accessor_field).rel related_model = m2m_rel.model through_model = m2m_rel.through for m2m_id in m2m_list: model_id_field = '{}_id'.format( model._meta.model_name) related_model_id_field = '{}_id'.format( related_model._meta.model_name) m2m_related_objects[ through_model].append( through_model( **{ model_id_field: obj.object.pk, related_model_id_field: m2m_id })) model.objects.bulk_create(model_objects) for m2m_model in m2m_related_objects: m2m_model.objects.bulk_create( m2m_related_objects[m2m_model]) loaded_objects_in_fixture += len(objects_to_create) if show_progress: self.stdout.write('\rProcessed %i object(s).' % loaded_objects_in_fixture, ending='') except (DatabaseError, IntegrityError) as e: e.args = ( "Could not load %(app_label)s.%(object_name)s: %(error_msg)s" % { 'app_label': model._meta.app_label, 'object_name': model._meta.object_name, 'error_msg': force_text(e) }, ) raise else: for obj in objects_to_create: try: obj.save(using=self.using) loaded_objects_in_fixture += 1 if show_progress: self.stdout.write('\rProcessed %i object(s).' % loaded_objects_in_fixture, ending='') except (DatabaseError, IntegrityError) as e: e.args = ( "Could not load %(app_label)s.%(object_name)s(pk=%(pk)s): %(error_msg)s" % { 'app_label': obj.object._meta.app_label, 'object_name': obj.object._meta.object_name, 'pk': obj.object.pk, 'error_msg': force_text(e) }, ) raise if objects and show_progress: self.stdout.write( '') # add a newline after progress indicator self.loaded_object_count += loaded_objects_in_fixture self.fixture_object_count += objects_in_fixture except Exception as e: if not isinstance(e, CommandError): e.args = ("Problem installing fixture '%s': %s" % (fixture_file, e), ) raise finally: fixture.close() # Warn if the fixture we loaded contains 0 objects. if objects_in_fixture == 0: warnings.warn( "No fixture data found for '%s'. (File format may be " "invalid.)" % fixture_name, RuntimeWarning)
def load_label(self, fixture_label): """ Loads fixtures files for a given label. """ for fixture_file, fixture_dir, fixture_name in ( self.find_fixtures(fixture_label)): _, ser_fmt, cmp_fmt = self.parse_name( os.path.basename(fixture_file)) open_method, mode = self.compression_formats[cmp_fmt] fixture = open_method(fixture_file, mode) try: self.fixture_count += 1 objects_in_fixture = 0 loaded_objects_in_fixture = 0 if self.verbosity >= 2: self.stdout.write( "Installing %s fixture '%s' from %s." % (ser_fmt, fixture_name, humanize(fixture_dir))) objects = Deserializer( fixture, using=self.using, ignorenonexistent=self.ignore, state=self.state) for obj in objects: objects_in_fixture += 1 if is_django_1_7: router_allow = router.allow_migrate else: router_allow = router.allow_migrate_model if router_allow( self.using, obj.object.__class__): loaded_objects_in_fixture += 1 self.models.add(obj.object.__class__) try: obj.save(using=self.using) except (DatabaseError, IntegrityError) as e: e.args = ( "Could not load %(app_label)s." "%(object_name)s(pk=%(pk)s): " "%(error_msg)s" % { 'app_label': obj.object._meta.app_label, 'object_name': ( obj.object._meta.object_name), 'pk': obj.object.pk, 'error_msg': force_text(e) },) raise self.loaded_object_count += loaded_objects_in_fixture self.fixture_object_count += objects_in_fixture except Exception as e: if not isinstance(e, CommandError): e.args = ( "Problem installing fixture '%s': %s" % (fixture_file, e),) raise finally: fixture.close() # Warn if the fixture we loaded contains 0 objects. if objects_in_fixture == 0: warnings.warn( "No fixture data found for '%s'. (File format may be " "invalid.)" % fixture_name, RuntimeWarning )
def load_label(self, fixture_label): """Load fixtures files for a given label.""" show_progress = self.verbosity >= 3 for fixture_file, fixture_dir, fixture_name in self.find_fixtures(fixture_label): _, ser_fmt, cmp_fmt = self.parse_name(os.path.basename(fixture_file)) open_method, mode = self.compression_formats[cmp_fmt] fixture = open_method(fixture_file, mode) try: self.fixture_count += 1 objects_in_fixture = 0 loaded_objects_in_fixture = 0 if self.verbosity >= 2: self.stdout.write( "Installing %s fixture '%s' from %s." % (ser_fmt, fixture_name, humanize(fixture_dir)) ) objects = serializers.deserialize( ser_fmt, fixture, using=self.using, ignorenonexistent=self.ignore, ) for obj in objects: objects_in_fixture += 1 if (obj.object._meta.app_config in self.excluded_apps or type(obj.object) in self.excluded_models): continue if router.allow_migrate_model(self.using, obj.object.__class__): loaded_objects_in_fixture += 1 model = obj.object.__class__ self.models.add(model) try: obj.object.validate_unique() except ValidationError as e: if hasattr(model.objects, "get_natural_fields"): fields = model.objects.get_natural_fields() else: fields = e.message_dict.keys() existing_object = model.objects.get(**{k: getattr(obj.object, k) for k in fields}) obj.object.pk = existing_object.pk try: obj.save(using=self.using) if show_progress: self.stdout.write( '\rProcessed %i object(s).' % loaded_objects_in_fixture, ending='' ) # psycopg2 raises ValueError if data contains NUL chars. except (DatabaseError, IntegrityError, ValueError) as e: e.args = ("Could not load %(app_label)s.%(object_name)s(pk=%(pk)s): %(error_msg)s" % { 'app_label': obj.object._meta.app_label, 'object_name': obj.object._meta.object_name, 'pk': obj.object.pk, 'error_msg': e, },) raise if objects and show_progress: self.stdout.write('') # add a newline after progress indicator self.loaded_object_count += loaded_objects_in_fixture self.fixture_object_count += objects_in_fixture except Exception as e: if not isinstance(e, CommandError): e.args = ("Problem installing fixture '%s': %s" % (fixture_file, e),) raise finally: fixture.close() # Warn if the fixture we loaded contains 0 objects. if objects_in_fixture == 0: warnings.warn( "No fixture data found for '%s'. (File format may be " "invalid.)" % fixture_name, RuntimeWarning )
def load_label(self, fixture_label): """ Loads fixtures files for a given label using the queryset's bulk_create method. """ show_progress = self.verbosity >= 3 for fixture_file, fixture_dir, fixture_name in self.find_fixtures( fixture_label): _, ser_fmt, cmp_fmt = self.parse_name( os.path.basename(fixture_file)) open_method, mode = self.compression_formats[cmp_fmt] fixture = open_method(fixture_file, mode) try: self.fixture_count += 1 objects_in_fixture = 0 loaded_objects_in_fixture = 0 if self.verbosity >= 2: self.stdout.write( "Installing %s fixture '%s' from %s." % (ser_fmt, fixture_name, humanize(fixture_dir))) objects = serializers.deserialize( ser_fmt, fixture, using=self.using, ignorenonexistent=self.ignore) create_dict = OrderedDict() for object in objects: obj = object.object objects_in_fixture += 1 model = obj.__class__ if router.allow_migrate_model(self.using, model): self.models.add(model) if model in create_dict.keys(): create_dict[model].append(obj) else: create_dict[model] = [obj] for model in create_dict.keys(): objs = create_dict[model] loaded_objects_in_fixture += len(objs) try: model.objects.using(self.using).bulk_create(objs) if show_progress: self.stdout.write('\rProcessed %i object(s).' % loaded_objects_in_fixture, ending='') except (DatabaseError, IntegrityError) as e: e.args = ( "Could not load %(app_label)s.%(object_name)s: %(error_msg)s" % { 'app_label': model._meta.app_label, 'object_name': model._meta.object_name, 'error_msg': force_text(e) }, ) raise if objects and show_progress: self.stdout.write( '') # add a newline after progress indicator self.loaded_object_count += loaded_objects_in_fixture self.fixture_object_count += objects_in_fixture except Exception as e: if not isinstance(e, CommandError): e.args = ("Problem installing fixture '%s': %s" % (fixture_file, e), ) raise finally: fixture.close() # Warn if the fixture we loaded contains 0 objects. if objects_in_fixture == 0: warnings.warn( "No fixture data found for '%s'. (File format may be " "invalid.)" % fixture_name, RuntimeWarning)
def load_label(self, fixture_label): """ Loads fixtures files for a given label using the queryset's bulk_create method. """ show_progress = self.verbosity >= 3 for fixture_file, fixture_dir, fixture_name in self.find_fixtures(fixture_label): _, ser_fmt, cmp_fmt = self.parse_name(os.path.basename(fixture_file)) open_method, mode = self.compression_formats[cmp_fmt] fixture = open_method(fixture_file, mode) try: self.fixture_count += 1 objects_in_fixture = 0 loaded_objects_in_fixture = 0 if self.verbosity >= 2: self.stdout.write("Installing %s fixture '%s' from %s." % (ser_fmt, fixture_name, humanize(fixture_dir))) objects = serializers.deserialize(ser_fmt, fixture, using=self.using, ignorenonexistent=self.ignore) create_dict = OrderedDict() for object in objects: obj = object.object objects_in_fixture += 1 model = obj.__class__ if router.allow_migrate_model(self.using, model): self.models.add(model) if model in create_dict.keys(): create_dict[model].append(obj) else: create_dict[model] = [obj] for model in create_dict.keys(): objs = create_dict[model] loaded_objects_in_fixture += len(objs) try: model.objects.using(self.using).bulk_create(objs) if show_progress: self.stdout.write( '\rProcessed %i object(s).' % loaded_objects_in_fixture, ending='' ) except (DatabaseError, IntegrityError) as e: e.args = ("Could not load %(app_label)s.%(object_name)s: %(error_msg)s" % { 'app_label': model._meta.app_label, 'object_name': model._meta.object_name, 'error_msg': force_text(e) },) raise if objects and show_progress: self.stdout.write('') # add a newline after progress indicator self.loaded_object_count += loaded_objects_in_fixture self.fixture_object_count += objects_in_fixture except Exception as e: if not isinstance(e, CommandError): e.args = ("Problem installing fixture '%s': %s" % (fixture_file, e),) raise finally: fixture.close() # Warn if the fixture we loaded contains 0 objects. if objects_in_fixture == 0: warnings.warn( "No fixture data found for '%s'. (File format may be " "invalid.)" % fixture_name, RuntimeWarning )