root / snf-webproject / synnefo / webproject / manage.py @ d01cd522
History | View | Annotate | Download (12 kB)
1 | eeda4702 | Kostas Papadimitriou | # Copyright 2011 GRNET S.A. All rights reserved.
|
---|---|---|---|
2 | eeda4702 | Kostas Papadimitriou | #
|
3 | eeda4702 | Kostas Papadimitriou | # Redistribution and use in source and binary forms, with or
|
4 | eeda4702 | Kostas Papadimitriou | # without modification, are permitted provided that the following
|
5 | eeda4702 | Kostas Papadimitriou | # conditions are met:
|
6 | eeda4702 | Kostas Papadimitriou | #
|
7 | eeda4702 | Kostas Papadimitriou | # 1. Redistributions of source code must retain the above
|
8 | eeda4702 | Kostas Papadimitriou | # copyright notice, this list of conditions and the following
|
9 | eeda4702 | Kostas Papadimitriou | # disclaimer.
|
10 | eeda4702 | Kostas Papadimitriou | #
|
11 | eeda4702 | Kostas Papadimitriou | # 2. Redistributions in binary form must reproduce the above
|
12 | eeda4702 | Kostas Papadimitriou | # copyright notice, this list of conditions and the following
|
13 | eeda4702 | Kostas Papadimitriou | # disclaimer in the documentation and/or other materials
|
14 | eeda4702 | Kostas Papadimitriou | # provided with the distribution.
|
15 | eeda4702 | Kostas Papadimitriou | #
|
16 | eeda4702 | Kostas Papadimitriou | # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
|
17 | eeda4702 | Kostas Papadimitriou | # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18 | eeda4702 | Kostas Papadimitriou | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
19 | eeda4702 | Kostas Papadimitriou | # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
|
20 | eeda4702 | Kostas Papadimitriou | # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
21 | eeda4702 | Kostas Papadimitriou | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
22 | eeda4702 | Kostas Papadimitriou | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
23 | eeda4702 | Kostas Papadimitriou | # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
24 | eeda4702 | Kostas Papadimitriou | # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
25 | eeda4702 | Kostas Papadimitriou | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
26 | eeda4702 | Kostas Papadimitriou | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
27 | eeda4702 | Kostas Papadimitriou | # POSSIBILITY OF SUCH DAMAGE.
|
28 | eeda4702 | Kostas Papadimitriou | #
|
29 | eeda4702 | Kostas Papadimitriou | # The views and conclusions contained in the software and
|
30 | eeda4702 | Kostas Papadimitriou | # documentation are those of the authors and should not be
|
31 | eeda4702 | Kostas Papadimitriou | # interpreted as representing official policies, either expressed
|
32 | eeda4702 | Kostas Papadimitriou | # or implied, of GRNET S.A.
|
33 | eeda4702 | Kostas Papadimitriou | |
34 | 18a544f5 | Kostas Papadimitriou | """
|
35 | 18a544f5 | Kostas Papadimitriou | Extented django management module
|
36 | 18a544f5 | Kostas Papadimitriou |
|
37 | 18a544f5 | Kostas Papadimitriou | Most of the code is shared from django.core.management module
|
38 | 18a544f5 | Kostas Papadimitriou | to allow us extend the default django ManagementUtility object
|
39 | 18a544f5 | Kostas Papadimitriou | used to provide command line interface of the django project
|
40 | 18a544f5 | Kostas Papadimitriou | included in snf-webproject package.
|
41 | 18a544f5 | Kostas Papadimitriou |
|
42 | 18a544f5 | Kostas Papadimitriou | The extended class provides the following:
|
43 | 18a544f5 | Kostas Papadimitriou |
|
44 | 18a544f5 | Kostas Papadimitriou | - additional argument for the configuration of the SYNNEFO_SETTINGS_DIR
|
45 | 18a544f5 | Kostas Papadimitriou | environmental variable (--settings-dir).
|
46 | 18a544f5 | Kostas Papadimitriou | - a fix for management utility to handle custom commands defined in
|
47 | 18a544f5 | Kostas Papadimitriou | applications living in namespaced packages (django ticket #14087)
|
48 | 18a544f5 | Kostas Papadimitriou | - override of --version command to display the snf-webproject version
|
49 | 18a544f5 | Kostas Papadimitriou | """
|
50 | 8c34763c | Giorgos Verigakis | |
51 | d2ff89df | Kostas Papadimitriou | from django.core.management import ManagementUtility, setup_environ, \ |
52 | 18a544f5 | Kostas Papadimitriou | BaseCommand, LaxOptionParser, handle_default_options, find_commands, \ |
53 | 18a544f5 | Kostas Papadimitriou | load_command_class
|
54 | d2ff89df | Kostas Papadimitriou | |
55 | 18a544f5 | Kostas Papadimitriou | from django.core import management |
56 | 18a544f5 | Kostas Papadimitriou | from django.utils.importlib import import_module |
57 | d2ff89df | Kostas Papadimitriou | from optparse import Option, make_option |
58 | 07d104d8 | Kostas Papadimitriou | from synnefo.util.version import get_component_version |
59 | d01cd522 | Christos Stavrakakis | from synnefo.lib.dictconfig import dictConfig |
60 | d2ff89df | Kostas Papadimitriou | |
61 | d2ff89df | Kostas Papadimitriou | import sys |
62 | d2ff89df | Kostas Papadimitriou | import os |
63 | 18a544f5 | Kostas Papadimitriou | import imp |
64 | 18a544f5 | Kostas Papadimitriou | |
65 | 18a544f5 | Kostas Papadimitriou | _commands = None
|
66 | 18a544f5 | Kostas Papadimitriou | |
67 | d01cd522 | Christos Stavrakakis | |
68 | 18a544f5 | Kostas Papadimitriou | def find_modules(name, path=None): |
69 | 18a544f5 | Kostas Papadimitriou | """Find all modules with name 'name'
|
70 | 18a544f5 | Kostas Papadimitriou |
|
71 | 18a544f5 | Kostas Papadimitriou | Unlike find_module in the imp package this returns a list of all
|
72 | 18a544f5 | Kostas Papadimitriou | matched modules.
|
73 | 18a544f5 | Kostas Papadimitriou | """
|
74 | 18c15348 | Kostas Papadimitriou | |
75 | 18a544f5 | Kostas Papadimitriou | results = [] |
76 | 18a544f5 | Kostas Papadimitriou | if path is None: path = sys.path |
77 | 18a544f5 | Kostas Papadimitriou | for p in path: |
78 | 18a544f5 | Kostas Papadimitriou | importer = sys.path_importer_cache.get(p, None)
|
79 | 18a544f5 | Kostas Papadimitriou | if importer is None: |
80 | 18a544f5 | Kostas Papadimitriou | find_module = imp.find_module |
81 | 18a544f5 | Kostas Papadimitriou | else:
|
82 | 18a544f5 | Kostas Papadimitriou | find_module = importer.find_module |
83 | 18a544f5 | Kostas Papadimitriou | |
84 | 18a544f5 | Kostas Papadimitriou | try:
|
85 | 18a544f5 | Kostas Papadimitriou | result = find_module(name, [p]) |
86 | 18a544f5 | Kostas Papadimitriou | if result is not None: |
87 | 18a544f5 | Kostas Papadimitriou | results.append(result) |
88 | 18a544f5 | Kostas Papadimitriou | except ImportError: |
89 | 18c15348 | Kostas Papadimitriou | if sys.modules.get(name, None): |
90 | 18c15348 | Kostas Papadimitriou | modpath = sys.modules[name].__path__ |
91 | 18c15348 | Kostas Papadimitriou | if isinstance(modpath, basestring) and not ('', modpath) in results: |
92 | 18c15348 | Kostas Papadimitriou | results.append(('', sys.modules[name].__path__))
|
93 | 18c15348 | Kostas Papadimitriou | else:
|
94 | 18c15348 | Kostas Papadimitriou | for mp in modpath: |
95 | 18c15348 | Kostas Papadimitriou | if not ('', mp) in results: |
96 | 18c15348 | Kostas Papadimitriou | results.append(('', mp))
|
97 | 18a544f5 | Kostas Papadimitriou | pass
|
98 | 18c15348 | Kostas Papadimitriou | |
99 | 18a544f5 | Kostas Papadimitriou | if not results: |
100 | 18a544f5 | Kostas Papadimitriou | raise ImportError("No module named %.200s" % name) |
101 | 18c15348 | Kostas Papadimitriou | |
102 | 18a544f5 | Kostas Papadimitriou | return results
|
103 | 18a544f5 | Kostas Papadimitriou | |
104 | 18a544f5 | Kostas Papadimitriou | def find_management_module(app_name): |
105 | 18a544f5 | Kostas Papadimitriou | """
|
106 | 18a544f5 | Kostas Papadimitriou | Determines the path to the management module for the given app_name,
|
107 | 18a544f5 | Kostas Papadimitriou | without actually importing the application or the management module.
|
108 | 18a544f5 | Kostas Papadimitriou |
|
109 | 18a544f5 | Kostas Papadimitriou | Raises ImportError if the management module cannot be found for any reason.
|
110 | 18a544f5 | Kostas Papadimitriou | """
|
111 | 18a544f5 | Kostas Papadimitriou | parts = app_name.split('.')
|
112 | 18a544f5 | Kostas Papadimitriou | parts.append('management')
|
113 | 18a544f5 | Kostas Papadimitriou | parts.reverse() |
114 | 18a544f5 | Kostas Papadimitriou | part = parts.pop() |
115 | 18a544f5 | Kostas Papadimitriou | paths = None
|
116 | 18a544f5 | Kostas Papadimitriou | |
117 | 18a544f5 | Kostas Papadimitriou | # When using manage.py, the project module is added to the path,
|
118 | 18a544f5 | Kostas Papadimitriou | # loaded, then removed from the path. This means that
|
119 | 18a544f5 | Kostas Papadimitriou | # testproject.testapp.models can be loaded in future, even if
|
120 | 18a544f5 | Kostas Papadimitriou | # testproject isn't in the path. When looking for the management
|
121 | 18a544f5 | Kostas Papadimitriou | # module, we need look for the case where the project name is part
|
122 | 18a544f5 | Kostas Papadimitriou | # of the app_name but the project directory itself isn't on the path.
|
123 | 18a544f5 | Kostas Papadimitriou | try:
|
124 | 18a544f5 | Kostas Papadimitriou | modules = find_modules(part, paths) |
125 | 18a544f5 | Kostas Papadimitriou | paths = [m[1] for m in modules] |
126 | 18a544f5 | Kostas Papadimitriou | except ImportError,e: |
127 | 18a544f5 | Kostas Papadimitriou | if os.path.basename(os.getcwd()) != part:
|
128 | 18a544f5 | Kostas Papadimitriou | raise e
|
129 | 18a544f5 | Kostas Papadimitriou | |
130 | 18a544f5 | Kostas Papadimitriou | while parts:
|
131 | 18a544f5 | Kostas Papadimitriou | part = parts.pop() |
132 | 18a544f5 | Kostas Papadimitriou | modules = find_modules(part, paths) |
133 | 18a544f5 | Kostas Papadimitriou | paths = [m[1] for m in modules] |
134 | 18a544f5 | Kostas Papadimitriou | return paths[0] |
135 | 18a544f5 | Kostas Papadimitriou | |
136 | 18a544f5 | Kostas Papadimitriou | |
137 | 18a544f5 | Kostas Papadimitriou | def get_commands(): |
138 | 18a544f5 | Kostas Papadimitriou | """
|
139 | 18a544f5 | Kostas Papadimitriou | Returns a dictionary mapping command names to their callback applications.
|
140 | 18a544f5 | Kostas Papadimitriou |
|
141 | 18a544f5 | Kostas Papadimitriou | This works by looking for a management.commands package in django.core, and
|
142 | 18a544f5 | Kostas Papadimitriou | in each installed application -- if a commands package exists, all commands
|
143 | 18a544f5 | Kostas Papadimitriou | in that package are registered.
|
144 | 18a544f5 | Kostas Papadimitriou |
|
145 | 18a544f5 | Kostas Papadimitriou | Core commands are always included. If a settings module has been
|
146 | 18a544f5 | Kostas Papadimitriou | specified, user-defined commands will also be included, the
|
147 | 18a544f5 | Kostas Papadimitriou | startproject command will be disabled, and the startapp command
|
148 | 18a544f5 | Kostas Papadimitriou | will be modified to use the directory in which the settings module appears.
|
149 | 18a544f5 | Kostas Papadimitriou |
|
150 | 18a544f5 | Kostas Papadimitriou | The dictionary is in the format {command_name: app_name}. Key-value
|
151 | 18a544f5 | Kostas Papadimitriou | pairs from this dictionary can then be used in calls to
|
152 | 18a544f5 | Kostas Papadimitriou | load_command_class(app_name, command_name)
|
153 | 18a544f5 | Kostas Papadimitriou |
|
154 | 18a544f5 | Kostas Papadimitriou | If a specific version of a command must be loaded (e.g., with the
|
155 | 18a544f5 | Kostas Papadimitriou | startapp command), the instantiated module can be placed in the
|
156 | 18a544f5 | Kostas Papadimitriou | dictionary in place of the application name.
|
157 | 18a544f5 | Kostas Papadimitriou |
|
158 | 18a544f5 | Kostas Papadimitriou | The dictionary is cached on the first call and reused on subsequent
|
159 | 18a544f5 | Kostas Papadimitriou | calls.
|
160 | 18a544f5 | Kostas Papadimitriou | """
|
161 | 18a544f5 | Kostas Papadimitriou | global _commands
|
162 | 18a544f5 | Kostas Papadimitriou | if _commands is None: |
163 | 18a544f5 | Kostas Papadimitriou | _commands = dict([(name, 'django.core') for name in \ |
164 | 18a544f5 | Kostas Papadimitriou | find_commands(management.__path__[0])])
|
165 | 18a544f5 | Kostas Papadimitriou | |
166 | 18a544f5 | Kostas Papadimitriou | # Find the installed apps
|
167 | 18a544f5 | Kostas Papadimitriou | try:
|
168 | 18a544f5 | Kostas Papadimitriou | from django.conf import settings |
169 | 18a544f5 | Kostas Papadimitriou | apps = settings.INSTALLED_APPS |
170 | 18a544f5 | Kostas Papadimitriou | except (AttributeError, EnvironmentError, ImportError): |
171 | 18a544f5 | Kostas Papadimitriou | apps = [] |
172 | 18a544f5 | Kostas Papadimitriou | |
173 | 18a544f5 | Kostas Papadimitriou | # Find the project directory
|
174 | 18a544f5 | Kostas Papadimitriou | try:
|
175 | 18a544f5 | Kostas Papadimitriou | from django.conf import settings |
176 | 18a544f5 | Kostas Papadimitriou | module = import_module(settings.SETTINGS_MODULE) |
177 | 18a544f5 | Kostas Papadimitriou | project_directory = setup_environ(module, settings.SETTINGS_MODULE) |
178 | 18a544f5 | Kostas Papadimitriou | except (AttributeError, EnvironmentError, ImportError, KeyError): |
179 | 18a544f5 | Kostas Papadimitriou | project_directory = None
|
180 | 18a544f5 | Kostas Papadimitriou | |
181 | 18a544f5 | Kostas Papadimitriou | # Find and load the management module for each installed app.
|
182 | 18a544f5 | Kostas Papadimitriou | for app_name in apps: |
183 | 18a544f5 | Kostas Papadimitriou | try:
|
184 | 18a544f5 | Kostas Papadimitriou | path = find_management_module(app_name) |
185 | 18a544f5 | Kostas Papadimitriou | _commands.update(dict([(name, app_name)
|
186 | 18a544f5 | Kostas Papadimitriou | for name in find_commands(path)])) |
187 | 18a544f5 | Kostas Papadimitriou | except ImportError: |
188 | 18a544f5 | Kostas Papadimitriou | pass # No management module - ignore this app |
189 | 18a544f5 | Kostas Papadimitriou | |
190 | 18a544f5 | Kostas Papadimitriou | if project_directory:
|
191 | 18a544f5 | Kostas Papadimitriou | # Remove the "startproject" command from self.commands, because
|
192 | 18a544f5 | Kostas Papadimitriou | # that's a django-admin.py command, not a manage.py command.
|
193 | 18a544f5 | Kostas Papadimitriou | del _commands['startproject'] |
194 | 18a544f5 | Kostas Papadimitriou | |
195 | 18a544f5 | Kostas Papadimitriou | # Override the startapp command so that it always uses the
|
196 | 18a544f5 | Kostas Papadimitriou | # project_directory, not the current working directory
|
197 | 18a544f5 | Kostas Papadimitriou | # (which is default).
|
198 | 18a544f5 | Kostas Papadimitriou | from django.core.management.commands.startapp import ProjectCommand |
199 | 18a544f5 | Kostas Papadimitriou | _commands['startapp'] = ProjectCommand(project_directory)
|
200 | 18a544f5 | Kostas Papadimitriou | |
201 | 18a544f5 | Kostas Papadimitriou | return _commands
|
202 | d2ff89df | Kostas Papadimitriou | |
203 | d2ff89df | Kostas Papadimitriou | class SynnefoManagementUtility(ManagementUtility): |
204 | d2ff89df | Kostas Papadimitriou | """
|
205 | d2ff89df | Kostas Papadimitriou | Override django ManagementUtility to allow us provide a custom
|
206 | d2ff89df | Kostas Papadimitriou | --settings-dir option for synnefo application.
|
207 | d2ff89df | Kostas Papadimitriou |
|
208 | d2ff89df | Kostas Papadimitriou | Most of the following code is a copy from django.core.management module
|
209 | d2ff89df | Kostas Papadimitriou | """
|
210 | d2ff89df | Kostas Papadimitriou | |
211 | d2ff89df | Kostas Papadimitriou | def execute(self): |
212 | d2ff89df | Kostas Papadimitriou | """
|
213 | d2ff89df | Kostas Papadimitriou | Given the command-line arguments, this figures out which subcommand is
|
214 | d2ff89df | Kostas Papadimitriou | being run, creates a parser appropriate to that command, and runs it.
|
215 | d2ff89df | Kostas Papadimitriou | """
|
216 | d2ff89df | Kostas Papadimitriou | |
217 | d2ff89df | Kostas Papadimitriou | # --settings-dir option
|
218 | d2ff89df | Kostas Papadimitriou | # will remove it later to avoid django commands from raising errors
|
219 | d2ff89df | Kostas Papadimitriou | option_list = BaseCommand.option_list + ( |
220 | d2ff89df | Kostas Papadimitriou | make_option('--settings-dir',
|
221 | d2ff89df | Kostas Papadimitriou | action='store',
|
222 | d2ff89df | Kostas Papadimitriou | dest='settings_dir',
|
223 | d2ff89df | Kostas Papadimitriou | default=None,
|
224 | d2ff89df | Kostas Papadimitriou | help='Load *.conf files from directory as settings'),)
|
225 | d2ff89df | Kostas Papadimitriou | |
226 | d2ff89df | Kostas Papadimitriou | # Preprocess options to extract --settings and --pythonpath.
|
227 | d2ff89df | Kostas Papadimitriou | # These options could affect the commands that are available, so they
|
228 | d2ff89df | Kostas Papadimitriou | # must be processed early.
|
229 | d2ff89df | Kostas Papadimitriou | parser = LaxOptionParser(usage="%prog subcommand [options] [args]",
|
230 | 07d104d8 | Kostas Papadimitriou | version=get_component_version('webproject'),
|
231 | d2ff89df | Kostas Papadimitriou | option_list=option_list) |
232 | d2ff89df | Kostas Papadimitriou | self.autocomplete()
|
233 | d2ff89df | Kostas Papadimitriou | try:
|
234 | d2ff89df | Kostas Papadimitriou | options, args = parser.parse_args(self.argv)
|
235 | d2ff89df | Kostas Papadimitriou | handle_default_options(options) |
236 | d2ff89df | Kostas Papadimitriou | except:
|
237 | d2ff89df | Kostas Papadimitriou | pass # Ignore any option errors at this point. |
238 | d2ff89df | Kostas Papadimitriou | |
239 | d2ff89df | Kostas Papadimitriou | # user provides custom settings dir
|
240 | d2ff89df | Kostas Papadimitriou | # set it as environmental variable and remove it from self.argv
|
241 | d2ff89df | Kostas Papadimitriou | if options.settings_dir:
|
242 | d2ff89df | Kostas Papadimitriou | os.environ['SYNNEFO_SETTINGS_DIR'] = options.settings_dir
|
243 | d2ff89df | Kostas Papadimitriou | for arg in self.argv: |
244 | d2ff89df | Kostas Papadimitriou | if arg.startswith('--settings-dir'): |
245 | d2ff89df | Kostas Papadimitriou | self.argv.remove(arg)
|
246 | d2ff89df | Kostas Papadimitriou | |
247 | d2ff89df | Kostas Papadimitriou | try:
|
248 | d2ff89df | Kostas Papadimitriou | subcommand = self.argv[1] |
249 | d2ff89df | Kostas Papadimitriou | except IndexError: |
250 | d2ff89df | Kostas Papadimitriou | subcommand = 'help' # Display help if no arguments were given. |
251 | d2ff89df | Kostas Papadimitriou | |
252 | d2ff89df | Kostas Papadimitriou | if subcommand == 'help': |
253 | d2ff89df | Kostas Papadimitriou | if len(args) > 2: |
254 | d2ff89df | Kostas Papadimitriou | self.fetch_command(args[2]).print_help(self.prog_name, args[2]) |
255 | d2ff89df | Kostas Papadimitriou | else:
|
256 | d2ff89df | Kostas Papadimitriou | parser.print_lax_help() |
257 | d2ff89df | Kostas Papadimitriou | sys.stdout.write(self.main_help_text() + '\n') |
258 | d2ff89df | Kostas Papadimitriou | sys.exit(1)
|
259 | d2ff89df | Kostas Papadimitriou | # Special-cases: We want 'django-admin.py --version' and
|
260 | d2ff89df | Kostas Papadimitriou | # 'django-admin.py --help' to work, for backwards compatibility.
|
261 | d2ff89df | Kostas Papadimitriou | elif self.argv[1:] == ['--version']: |
262 | d2ff89df | Kostas Papadimitriou | # LaxOptionParser already takes care of printing the version.
|
263 | d2ff89df | Kostas Papadimitriou | pass
|
264 | d2ff89df | Kostas Papadimitriou | elif self.argv[1:] in (['--help'], ['-h']): |
265 | d2ff89df | Kostas Papadimitriou | parser.print_lax_help() |
266 | d2ff89df | Kostas Papadimitriou | sys.stdout.write(self.main_help_text() + '\n') |
267 | d2ff89df | Kostas Papadimitriou | else:
|
268 | d2ff89df | Kostas Papadimitriou | self.fetch_command(subcommand).run_from_argv(self.argv) |
269 | 00b4f1be | Faidon Liambotis | |
270 | 18a544f5 | Kostas Papadimitriou | def main_help_text(self): |
271 | 18a544f5 | Kostas Papadimitriou | """
|
272 | 18a544f5 | Kostas Papadimitriou | Returns the script's main help text, as a string.
|
273 | 18a544f5 | Kostas Papadimitriou | """
|
274 | 18a544f5 | Kostas Papadimitriou | usage = ['',"Type '%s help <subcommand>' for help on a specific subcommand." % self.prog_name,''] |
275 | 18a544f5 | Kostas Papadimitriou | usage.append('Available subcommands:')
|
276 | 18a544f5 | Kostas Papadimitriou | commands = get_commands().keys() |
277 | 18a544f5 | Kostas Papadimitriou | commands.sort() |
278 | 18a544f5 | Kostas Papadimitriou | for cmd in commands: |
279 | 18a544f5 | Kostas Papadimitriou | usage.append(' %s' % cmd)
|
280 | 18a544f5 | Kostas Papadimitriou | return '\n'.join(usage) |
281 | 18a544f5 | Kostas Papadimitriou | |
282 | 18a544f5 | Kostas Papadimitriou | def fetch_command(self, subcommand): |
283 | 18a544f5 | Kostas Papadimitriou | """
|
284 | 18a544f5 | Kostas Papadimitriou | Tries to fetch the given subcommand, printing a message with the
|
285 | 18a544f5 | Kostas Papadimitriou | appropriate command called from the command line (usually
|
286 | 18a544f5 | Kostas Papadimitriou | "django-admin.py" or "manage.py") if it can't be found.
|
287 | 18a544f5 | Kostas Papadimitriou | """
|
288 | 18a544f5 | Kostas Papadimitriou | try:
|
289 | 18a544f5 | Kostas Papadimitriou | app_name = get_commands()[subcommand] |
290 | 18a544f5 | Kostas Papadimitriou | except KeyError: |
291 | 18a544f5 | Kostas Papadimitriou | sys.stderr.write("Unknown command: %r\nType '%s help' for usage.\n" % \
|
292 | 18a544f5 | Kostas Papadimitriou | (subcommand, self.prog_name))
|
293 | 18a544f5 | Kostas Papadimitriou | sys.exit(1)
|
294 | 18a544f5 | Kostas Papadimitriou | if isinstance(app_name, BaseCommand): |
295 | 18a544f5 | Kostas Papadimitriou | # If the command is already loaded, use it directly.
|
296 | 18a544f5 | Kostas Papadimitriou | klass = app_name |
297 | 18a544f5 | Kostas Papadimitriou | else:
|
298 | 18a544f5 | Kostas Papadimitriou | klass = load_command_class(app_name, subcommand) |
299 | 18a544f5 | Kostas Papadimitriou | return klass
|
300 | 18a544f5 | Kostas Papadimitriou | |
301 | d01cd522 | Christos Stavrakakis | |
302 | d01cd522 | Christos Stavrakakis | def configure_logging(): |
303 | d01cd522 | Christos Stavrakakis | try:
|
304 | d01cd522 | Christos Stavrakakis | from synnefo.settings import SNF_MANAGE_LOGGING_SETUP |
305 | d01cd522 | Christos Stavrakakis | dictConfig(SNF_MANAGE_LOGGING_SETUP) |
306 | d01cd522 | Christos Stavrakakis | except ImportError: |
307 | d01cd522 | Christos Stavrakakis | import logging |
308 | d01cd522 | Christos Stavrakakis | logging.basicConfig() |
309 | d01cd522 | Christos Stavrakakis | log = logging.getLogger() |
310 | d01cd522 | Christos Stavrakakis | log.warning("SNF_MANAGE_LOGGING_SETUP setting missing.")
|
311 | d01cd522 | Christos Stavrakakis | |
312 | d01cd522 | Christos Stavrakakis | |
313 | b9685924 | Kostas Papadimitriou | def main(): |
314 | d2ff89df | Kostas Papadimitriou | # no need to run setup_environ
|
315 | d2ff89df | Kostas Papadimitriou | # we already know our project
|
316 | d2ff89df | Kostas Papadimitriou | os.environ['DJANGO_SETTINGS_MODULE'] = os.environ.get('DJANGO_SETTINGS_MODULE', |
317 | d2ff89df | Kostas Papadimitriou | 'synnefo.settings')
|
318 | d01cd522 | Christos Stavrakakis | configure_logging() |
319 | d2ff89df | Kostas Papadimitriou | mu = SynnefoManagementUtility(sys.argv) |
320 | d2ff89df | Kostas Papadimitriou | mu.execute() |
321 | b9685924 | Kostas Papadimitriou | |
322 | b9685924 | Kostas Papadimitriou | if __name__ == "__main__": |
323 | b9685924 | Kostas Papadimitriou | main() |