mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	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:
		| @@ -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 @@ class TemplateCommand(BaseCommand): | ||||
|  | ||||
|         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 @@ class TemplateCommand(BaseCommand): | ||||
|                 # 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: | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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 | ||||
| <django.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 | ||||
| <django.template.Context>` used is: | ||||
|  | ||||
| - 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.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') | ||||
|   | ||||
		Reference in New Issue
	
	Block a user