from ...constants import EXCLUDED_KWARGS from .base import Command def django(management_command, *args, excluded_kwargs=None, **kwargs): """Common function for assembling Django management commands. :param management_command: The name of the management command. :type management_command: str :param excluded_kwargs: A dictionary of kwargs that should be excluded from the management command parameters. :param excluded_kwargs: dict :rtype: scripttease.lib.commands.base.Command If provided, args are passed directly to the command as positional parameters. Any provided kwargs are converted to long form parameters. For example, database="alternative_db" becomes ``--database="alternative_db"``. A kwarg with a ``True`` value becomes a long form parameter with no value. For example, natural_foreign=True becomes ``--natural-foreign``. Finally, any kwarg that is not a string is passed without quotes. For example, testing=1 becomes ``--testing=1``. """ # The excluded parameters (filtered below) may vary based on implementation. We do, however, need a default. excluded_kwargs = excluded_kwargs or EXCLUDED_KWARGS venv = kwargs.pop("venv", None) if venv is not None: kwargs['prefix'] = "source %s/bin/activate" % venv # Django's management commands can have a number of options. We need to filter out internal parameters so that these # are not used as options for the management command. _kwargs = dict() for key in excluded_kwargs: if key in kwargs: _kwargs[key] = kwargs.pop(key) if 'comment' not in _kwargs: _kwargs['comment'] = "run %s django management command" % management_command a = list() a.append("./manage.py %s" % management_command) for key, value in kwargs.items(): key = key.replace("_", "-") if type(value) is bool and value is True: a.append("--%s" % key) elif type(value) is str: a.append('--%s="%s"' % (key, value)) else: a.append('--%s=%s' % (key, value)) _args = list(args) if len(_args) > 0: a.append(" ".join(_args)) statement = " ".join(a) return Command(statement, **_kwargs) def django_check(**kwargs): """Run Django checks.""" kwargs.setdefault("comment", "run django checks") kwargs.setdefault("register", "django_checks_out") return django("check", **kwargs) def django_createsuperuser(username, email=None, **kwargs): """Create a superuser account. :param username: The name for the user account. :type username: str :param email: The user's email address. Optional, but recommended because the account must be created without a password. :type email: str """ kwargs.setdefault("comment", "create the %s superuser" % username) kwargs['username'] = username kwargs['noinput'] = True if email is not None: kwargs['email'] = email return django("createsuperuser", **kwargs) def django_dump(target, path=None, **kwargs): """Dump data fixtures. :param target: The app name or ``app.ModelName``. :type target: str :param path: The path to the fixture file. :type path: str """ kwargs.setdefault("comment", "dump app/model data for %s" % target) kwargs.setdefault("format", "json") kwargs.setdefault("indent", 4) app = target file_name = "%s/initial.%s" % (app, kwargs['format']) if "." in target: app, model = target.split(".") file_name = "%s/%s.%s" % (app, model.lower(), kwargs['format']) if path is None: path = "../fixtures/%s" % file_name return django("dumpdata", target, "> %s" % path, **kwargs) def django_load(target, path=None, **kwargs): """Load data fixtures. :param target: The app name or ``app.ModelName``. :type target: str :param path: The path to the fixture file. :type path: str """ kwargs.setdefault("comment", "load app/model data from %s" % target) input_format = kwargs.pop("format", "json") app = target file_name = "%s/initial.%s" % (app, input_format) if "." in target: app, model = target.split(".") file_name = "%s/%s.%s" % (app, model.lower(), input_format) if path is None: path = "../fixtures/%s" % file_name return django("loaddata", path, **kwargs) def django_migrate(**kwargs): """Apply database migrations.""" kwargs.setdefault("comment", "apply database migrations") return django("migrate", **kwargs) def django_static(**kwargs): """Collect static files.""" kwargs.setdefault("comment", "collect static files") kwargs.setdefault("noinput", True) return django("collectstatic", **kwargs) DJANGO_MAPPINGS = { 'django': django, 'django.check': django_check, 'django.collectstatic': django_static, 'django.createsuperuser': django_createsuperuser, 'django.dump': django_dump, 'django.dumpdata': django_dump, 'django.load': django_load, 'django.loaddata': django_load, 'django.migrate': django_migrate, 'django.static': django_static, }