From faeee611d69717614424b6c3867cd5798ee25496 Mon Sep 17 00:00:00 2001 From: Jannis Leidel Date: Sat, 4 Feb 2012 13:01:30 +0000 Subject: [PATCH] Fixed #17517 -- Added `--name` option to startproject and startapp management commands to be able to render files without a file extension. Thanks, Florian Apolloner. git-svn-id: http://code.djangoproject.com/svn/django/trunk@17432 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/core/management/templates.py | 13 ++++++++++++- docs/man/django-admin.1 | 9 ++++++--- docs/ref/django-admin.txt | 6 ++++-- .../project_template/additional_dir/Procfile | 1 + .../additional_dir/requirements.txt | 1 + tests/regressiontests/admin_scripts/tests.py | 18 ++++++++++++++++++ 6 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 tests/regressiontests/admin_scripts/custom_templates/project_template/additional_dir/Procfile create mode 100644 tests/regressiontests/admin_scripts/custom_templates/project_template/additional_dir/requirements.txt diff --git a/django/core/management/templates.py b/django/core/management/templates.py index 0a6a3a8932a17..1d26e97961413 100644 --- a/django/core/management/templates.py +++ b/django/core/management/templates.py @@ -48,6 +48,11 @@ class TemplateCommand(BaseCommand): help='The file extension(s) to render (default: "py") ' 'Separate multiple extensions with commas, or use ' '-e multiple times.'), + make_option('--name', '-n', dest='files', + action='append', default=[], + help='The file name(s) to render ' + 'Separate multiple extensions with commas, or use ' + '-n multiple times.') ) requires_model_validation = False # Can't import settings during this command, because they haven't @@ -89,10 +94,16 @@ def handle(self, app_or_project, name, target=None, **options): extensions = tuple( handle_extensions(options.get('extensions'), ignored=())) + extra_files = [] + for file in options.get('files'): + extra_files.extend(map(lambda x: x.strip(), file.split(','))) if self.verbosity >= 2: self.stdout.write("Rendering %s template files with " "extensions: %s\n" % (app_or_project, ', '.join(extensions))) + self.stdout.write("Rendering %s template files with " + "filenames: %s\n" % + (app_or_project, ', '.join(extra_files))) base_name = '%s_name' % app_or_project base_subdir = '%s_template' % app_or_project @@ -142,7 +153,7 @@ def handle(self, app_or_project, name, target=None, **options): # accidentally render Django templates files with open(old_path, 'r') as template_file: content = template_file.read() - if filename.endswith(extensions): + if filename.endswith(extensions) or filename in extra_files: template = Template(content) content = template.render(context) with open(new_path, 'w') as new_file: diff --git a/docs/man/django-admin.1 b/docs/man/django-admin.1 index 2326e827cf937..af710ff5fe8b3 100644 --- a/docs/man/django-admin.1 +++ b/docs/man/django-admin.1 @@ -115,11 +115,11 @@ name(s). Prints the SQL statements for resetting PostgreSQL sequences for the given app name(s). .TP -.BI "startapp [" "\-\-template=PATH_OR_URL" "] [" "\-\-extension=EXTENSION" "] [" "appname" "] [" "destination" "]" +.BI "startapp [" "\-\-template=PATH_OR_URL" "] [" "\-\-extension=EXTENSION" "] [" "\-\-name=FILENAME" "] [" "appname" "] [" "destination" "]" Creates a Django app directory structure for the given app name in the current directory or the optional destination. .TP -.BI "startproject [" "\-\-template=PATH_OR_URL" "] [" "\-\-extension=EXTENSION" "] [" "projectname" "] [" "destination" "]" +.BI "startproject [" "\-\-template=PATH_OR_URL" "] [" "\-\-extension=EXTENSION" "] [" "\-\-name=FILENAME" "] [" "projectname" "] [" "destination" "]" Creates a Django project directory structure for the given project name in the current directory or the optional destination. .TP @@ -213,9 +213,12 @@ Don't break long message lines into several lines. .I \-a, \-\-all Process all available locales when using makemessages..SH "ENVIRONMENT" .TP -.I \-a, \-\-template=PATH_OR_URL +.I \-\-template=PATH_OR_URL The file or directory path or URL to load the project and app templates from. .TP +.I \-n, \-\-name=FILENAME +The name of an additional file to render when using app and project templates. +.TP .I DJANGO_SETTINGS_MODULE In the absence of the .BI \-\-settings diff --git a/docs/ref/django-admin.txt b/docs/ref/django-admin.txt index 3010cd020c8b5..aa514606e28be 100644 --- a/docs/ref/django-admin.txt +++ b/docs/ref/django-admin.txt @@ -951,7 +951,8 @@ creating the ``myapp`` app:: When Django copies the app template files, it also renders the files whose extension matches those passed with the ``--extension`` option (``py`` -by default) using the template engine. The :class:`template context +by default) and those files which names are passed with the ``--name`` option +using the template engine. The :class:`template context ` used is: - Any option passed to the startapp command @@ -1013,7 +1014,8 @@ when creating the ``myproject`` project:: When Django copies the project template files, it will also render the files whose extension matches those passed with the ``--extension`` option (``py`` -by default) using the template engine. The :class:`template context +by default) and those files which names are passed with the ``--name`` option +using the template engine. The :class:`template context ` used is: - Any option passed to the startproject command diff --git a/tests/regressiontests/admin_scripts/custom_templates/project_template/additional_dir/Procfile b/tests/regressiontests/admin_scripts/custom_templates/project_template/additional_dir/Procfile new file mode 100644 index 0000000000000..032f0bcd72d94 --- /dev/null +++ b/tests/regressiontests/admin_scripts/custom_templates/project_template/additional_dir/Procfile @@ -0,0 +1 @@ +# some file for {{ project_name }} test project \ No newline at end of file diff --git a/tests/regressiontests/admin_scripts/custom_templates/project_template/additional_dir/requirements.txt b/tests/regressiontests/admin_scripts/custom_templates/project_template/additional_dir/requirements.txt new file mode 100644 index 0000000000000..032f0bcd72d94 --- /dev/null +++ b/tests/regressiontests/admin_scripts/custom_templates/project_template/additional_dir/requirements.txt @@ -0,0 +1 @@ +# some file for {{ project_name }} test project \ No newline at end of file diff --git a/tests/regressiontests/admin_scripts/tests.py b/tests/regressiontests/admin_scripts/tests.py index 17a2ccb194029..e981f54c23c44 100644 --- a/tests/regressiontests/admin_scripts/tests.py +++ b/tests/regressiontests/admin_scripts/tests.py @@ -1489,3 +1489,21 @@ def test_project_template_tarball_url(self): self.assertNoOutput(err) self.assertTrue(os.path.isdir(testproject_dir)) self.assertTrue(os.path.exists(os.path.join(testproject_dir, 'run.py'))) + + def test_file_without_extension(self): + "Make sure the startproject management command is able to render custom files" + template_path = os.path.join(test_dir, 'admin_scripts', 'custom_templates', 'project_template') + args = ['startproject', '--template', template_path, 'customtestproject', '-e', 'txt', '-n', 'Procfile'] + testproject_dir = os.path.join(test_dir, 'customtestproject') + + out, err = self.run_django_admin(args) + self.addCleanup(shutil.rmtree, testproject_dir) + self.assertNoOutput(err) + self.assertTrue(os.path.isdir(testproject_dir)) + self.assertTrue(os.path.exists(os.path.join(testproject_dir, 'additional_dir'))) + base_path = os.path.join(testproject_dir, 'additional_dir') + for f in ('Procfile', 'additional_file.py', 'requirements.txt'): + self.assertTrue(os.path.exists(os.path.join(base_path, f))) + with open(os.path.join(base_path, f)) as fh: + self.assertEqual(fh.read(), + '# some file for customtestproject test project')