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
This commit is contained in:
Jannis Leidel 2012-02-04 13:01:30 +00:00
parent bb6921ce88
commit faeee611d6
6 changed files with 42 additions and 6 deletions

View File

@ -48,6 +48,11 @@ class TemplateCommand(BaseCommand):
help='The file extension(s) to render (default: "py") ' help='The file extension(s) to render (default: "py") '
'Separate multiple extensions with commas, or use ' 'Separate multiple extensions with commas, or use '
'-e multiple times.'), '-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 requires_model_validation = False
# Can't import settings during this command, because they haven't # Can't import settings during this command, because they haven't
@ -89,10 +94,16 @@ class TemplateCommand(BaseCommand):
extensions = tuple( extensions = tuple(
handle_extensions(options.get('extensions'), ignored=())) 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: if self.verbosity >= 2:
self.stdout.write("Rendering %s template files with " self.stdout.write("Rendering %s template files with "
"extensions: %s\n" % "extensions: %s\n" %
(app_or_project, ', '.join(extensions))) (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_name = '%s_name' % app_or_project
base_subdir = '%s_template' % app_or_project base_subdir = '%s_template' % app_or_project
@ -142,7 +153,7 @@ class TemplateCommand(BaseCommand):
# accidentally render Django templates files # accidentally render Django templates files
with open(old_path, 'r') as template_file: with open(old_path, 'r') as template_file:
content = template_file.read() content = template_file.read()
if filename.endswith(extensions): if filename.endswith(extensions) or filename in extra_files:
template = Template(content) template = Template(content)
content = template.render(context) content = template.render(context)
with open(new_path, 'w') as new_file: with open(new_path, 'w') as new_file:

View File

@ -115,11 +115,11 @@ name(s).
Prints the SQL statements for resetting PostgreSQL sequences for the Prints the SQL statements for resetting PostgreSQL sequences for the
given app name(s). given app name(s).
.TP .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 Creates a Django app directory structure for the given app name in
the current directory or the optional destination. the current directory or the optional destination.
.TP .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 Creates a Django project directory structure for the given project name
in the current directory or the optional destination. in the current directory or the optional destination.
.TP .TP
@ -213,9 +213,12 @@ Don't break long message lines into several lines.
.I \-a, \-\-all .I \-a, \-\-all
Process all available locales when using makemessages..SH "ENVIRONMENT" Process all available locales when using makemessages..SH "ENVIRONMENT"
.TP .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. The file or directory path or URL to load the project and app templates from.
.TP .TP
.I \-n, \-\-name=FILENAME
The name of an additional file to render when using app and project templates.
.TP
.I DJANGO_SETTINGS_MODULE .I DJANGO_SETTINGS_MODULE
In the absence of the In the absence of the
.BI \-\-settings .BI \-\-settings

View File

@ -951,7 +951,8 @@ creating the ``myapp`` app::
When Django copies the app template files, it also renders the files When Django copies the app template files, it also renders the files
whose extension matches those passed with the ``--extension`` option (``py`` 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
<django.template.Context>` used is: <django.template.Context>` used is:
- Any option passed to the startapp command - 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 When Django copies the project template files, it will also render the files
whose extension matches those passed with the ``--extension`` option (``py`` 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
<django.template.Context>` used is: <django.template.Context>` used is:
- Any option passed to the startproject command - Any option passed to the startproject command

View File

@ -0,0 +1 @@
# some file for {{ project_name }} test project

View File

@ -0,0 +1 @@
# some file for {{ project_name }} test project

View File

@ -1489,3 +1489,21 @@ class StartProject(LiveServerTestCase, AdminScriptTestCase):
self.assertNoOutput(err) self.assertNoOutput(err)
self.assertTrue(os.path.isdir(testproject_dir)) self.assertTrue(os.path.isdir(testproject_dir))
self.assertTrue(os.path.exists(os.path.join(testproject_dir, 'run.py'))) 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')