93 lines
3.8 KiB
Python
93 lines
3.8 KiB
Python
|
#-----------------------------------------------------------------------------
|
||
|
# Copyright (c) 2005-2023, PyInstaller Development Team.
|
||
|
#
|
||
|
# Distributed under the terms of the GNU General Public License (version 2
|
||
|
# or later) with exception for distributing the bootloader.
|
||
|
#
|
||
|
# The full license is in the file COPYING.txt, distributed with this software.
|
||
|
#
|
||
|
# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception)
|
||
|
#-----------------------------------------------------------------------------
|
||
|
|
||
|
# Tested with django 2.2
|
||
|
|
||
|
import glob
|
||
|
import os
|
||
|
|
||
|
from PyInstaller import log as logging
|
||
|
from PyInstaller.utils import hooks
|
||
|
from PyInstaller.utils.hooks import django
|
||
|
|
||
|
logger = logging.getLogger(__name__)
|
||
|
|
||
|
# Collect everything. Some submodules of django are not importable without considerable external setup. Ignore the
|
||
|
# errors they raise.
|
||
|
datas, binaries, hiddenimports = hooks.collect_all('django', on_error="ignore")
|
||
|
|
||
|
root_dir = django.django_find_root_dir()
|
||
|
if root_dir:
|
||
|
logger.info('Django root directory %s', root_dir)
|
||
|
# Include imports from the mysite.settings.py module.
|
||
|
settings_py_imports = django.django_dottedstring_imports(root_dir)
|
||
|
# Include all submodules of all imports detected in mysite.settings.py.
|
||
|
for submod in settings_py_imports:
|
||
|
hiddenimports.append(submod)
|
||
|
hiddenimports += hooks.collect_submodules(submod)
|
||
|
# Include main django modules - settings.py, urls.py, wsgi.py. Without them the django server won't run.
|
||
|
package_name = os.path.basename(root_dir)
|
||
|
default_settings_module = f'{package_name}.settings'
|
||
|
settings_module = os.environ.get('DJANGO_SETTINGS_MODULE', default_settings_module)
|
||
|
hiddenimports += [
|
||
|
# TODO: consider including 'mysite.settings.py' in source code as a data files,
|
||
|
# since users might need to edit this file.
|
||
|
settings_module,
|
||
|
package_name + '.urls',
|
||
|
package_name + '.wsgi',
|
||
|
]
|
||
|
# Django hiddenimports from the standard Python library.
|
||
|
hiddenimports += [
|
||
|
'http.cookies',
|
||
|
'html.parser',
|
||
|
]
|
||
|
|
||
|
# Bundle django DB schema migration scripts as data files. They are necessary for some commands.
|
||
|
logger.info('Collecting Django migration scripts.')
|
||
|
migration_modules = [
|
||
|
'django.conf.app_template.migrations',
|
||
|
'django.contrib.admin.migrations',
|
||
|
'django.contrib.auth.migrations',
|
||
|
'django.contrib.contenttypes.migrations',
|
||
|
'django.contrib.flatpages.migrations',
|
||
|
'django.contrib.redirects.migrations',
|
||
|
'django.contrib.sessions.migrations',
|
||
|
'django.contrib.sites.migrations',
|
||
|
]
|
||
|
# Include migration scripts of Django-based apps too.
|
||
|
installed_apps = hooks.get_module_attribute(settings_module, 'INSTALLED_APPS')
|
||
|
migration_modules.extend(set(app + '.migrations' for app in installed_apps))
|
||
|
# Copy migration files.
|
||
|
for mod in migration_modules:
|
||
|
mod_name, bundle_name = mod.split('.', 1)
|
||
|
mod_dir = os.path.dirname(hooks.get_module_file_attribute(mod_name))
|
||
|
bundle_dir = bundle_name.replace('.', os.sep)
|
||
|
pattern = os.path.join(mod_dir, bundle_dir, '*.py')
|
||
|
files = glob.glob(pattern)
|
||
|
for f in files:
|
||
|
datas.append((f, os.path.join(mod_name, bundle_dir)))
|
||
|
|
||
|
# Include data files from your Django project found in your django root package.
|
||
|
datas += hooks.collect_data_files(package_name)
|
||
|
|
||
|
# Include database file if using sqlite. The sqlite database is usually next to the manage.py script.
|
||
|
root_dir_parent = os.path.dirname(root_dir)
|
||
|
# TODO Add more patterns if necessary.
|
||
|
_patterns = ['*.db', 'db.*']
|
||
|
for p in _patterns:
|
||
|
files = glob.glob(os.path.join(root_dir_parent, p))
|
||
|
for f in files:
|
||
|
# Place those files next to the executable.
|
||
|
datas.append((f, '.'))
|
||
|
|
||
|
else:
|
||
|
logger.warning('No django root directory could be found!')
|