Exemple #1
0
    def handle_noargs(self, **options):
        db = options.get('database')
        verbosity = options.get('verbosity')

        # Bypass loaddata command on migrate/syncdb to load initial data only for installed apps
        load_initial_data = options.get('load_initial_data')
        options['load_initial_data'] = False
        apps = []
        def app_sync(sender, *args, **kwargs):
            created_models = kwargs.get('created_models')
            for model in created_models:
                mod_name = '.'.join(model.__module__.split('.')[:-1])
                if not mod_name in apps:
                    apps.append(mod_name)
        models.signals.post_syncdb.connect(app_sync)
        super(Command, self).handle_noargs(**options)
        models.signals.post_syncdb.disconnect(app_sync)
        
        # Load initial data from sync apps
        if load_initial_data:
            fixtures = []
            for app in settings.INSTALLED_APPS:
                if not app in apps:
                    # Preserve apps priority
                    continue
                mod = import_module(app)
                dname = os.path.dirname(mod.__file__)
                fname = os.path.join(dname, 'fixtures', 'initial_data.json')
                if os.path.isfile(fname):
                    fixtures.append(fname)
                if hasattr(mod, 'app_info'):
                    fixtures += [os.path.join(dname, 'fixtures', f) for f in mod.app_info.get('fixtures', [])]

            if fixtures:
                call_command('loaddata', *fixtures, verbosity=verbosity,
                             database=db, skip_validation=False)

            # Load custom sql
            for app in settings.INSTALLED_APPS:
                if not app in apps:
                    # Preserve apps priority
                    continue
                engine = settings.DATABASES[db]['ENGINE'].split('.')[-1]
                mod = import_module(app)
                dname = os.path.dirname(mod.__file__)
                app_dir = os.path.normpath(os.path.join(dname, 'sql'))
                custom_files = [
                    os.path.join(app_dir, "custom.%s.sql" % engine),
                    os.path.join(app_dir, "custom.sql")
                ]

                for custom_file in custom_files:
                    if os.path.exists(custom_file):
                        print('Loading custom SQL for %s' % app)
                        try:
                            scripts.runfile(custom_file, db)
                        except Exception as e:
                            sys.stderr.write('Couldn\'t execute custom SQL for %s' % app)
                            import traceback
                            traceback.print_exc()
Exemple #2
0
 def handle(self, *args, **options):
     db = options['database']
     verbosity = options['verbosity']
     fixtures = []
     sqls = []
     for app in apps.app_configs:
         app = apps.app_configs[app]
         if isinstance(app, AppConfig):
             if app.fixtures:
                 for fixture in app.fixtures:
                     fixtures.append(os.path.join(app.path, 'fixtures', fixture))
             if app.sql:
                 for sql in app.sql:
                     sqls.append(os.path.join(app.path, 'sql', sql))
     if fixtures:
         call_command('loaddata', *fixtures, verbosity=verbosity, database=db, skip_validation=False)
     if sqls:
         for sql in sqls:
             try:
                 scripts.runfile(sql, db)
             except Exception as e:
                 sys.stderr.write('Couldn\'t execute "%s" SQL file.' % sql)
                 import traceback
                 traceback.print_exc()