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:
parent
bb6921ce88
commit
faeee611d6
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
# some file for {{ project_name }} test project
|
|
@ -0,0 +1 @@
|
||||||
|
# some file for {{ project_name }} test project
|
|
@ -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')
|
||||||
|
|
Loading…
Reference in New Issue