Skip to content

Commit

Permalink
build: move collectstatic ignore patterns into configuration
Browse files Browse the repository at this point in the history
Django provides the `collectstatic` management command, which collects static
assets into the STATIC_ROOT so that they can be served by some system external
to Django (like nginx or caddy), as is usually desired in production environments.

edx-platform contains several types of files that we don't want to be collected
into the STATIC_ROOT. Previously, these files had to be supplied to the manageme
nt command using the `--ignore` option:

    ./manage.py lms collectstatic --ignore geoip --ignore sass ...etc
    ./manage.py cms collectstatic --ignore geoip --ignore sass ...etc

This yields a long, hard-to-remember command. Paver wrapped the command in its
big `paver update_assets` task, but that task also builds assets, which is totally
overkill when you're just trying to collect them.

Fortunately, `collectstatic`'s default ignore patterns can be configured by
defining a custom AppConfig class. We define such an config
(`EdxPlatformStaticFilesConfig`) for LMS and CMS. Now, devs can collect LMS and
CMS assets with just:

    ./manage.py lms collectstatic
    ./manage.py cms collectstatic

Further reading on collecstatic and --ignore:
https://docs.djangoproject.com/en/3.2/ref/contrib/staticfiles/#customizing-the-i
gnored-pattern-list

Further reading on eschewing Paver:
https://github.com/openedx/edx-platform/blob/master/docs/decisions/0017-reimplem
ent-asset-processing.rst

Closes: openedx#31658
  • Loading branch information
kdmccormick committed Apr 20, 2023
1 parent e01afb1 commit d35df76
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 24 deletions.
6 changes: 5 additions & 1 deletion cms/envs/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -1565,8 +1565,12 @@
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',

# Tweaked version of django.contrib.staticfiles
'openedx.core.lib.staticfiles_config.EdxPlatformStaticFilesConfig',

'django_celery_results',

'method_override',

# Common Initialization
Expand Down
5 changes: 4 additions & 1 deletion lms/envs/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -2955,7 +2955,10 @@ def _make_locale_paths(settings): # pylint: disable=missing-function-docstring
'django.contrib.redirects',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.staticfiles',

# Tweaked version of django.contrib.staticfiles
'openedx.core.lib.staticfiles_config.EdxPlatformStaticFilesConfig',

'django_celery_results',

# Common Initialization
Expand Down
31 changes: 31 additions & 0 deletions openedx/core/lib/staticfiles_config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
"""
Configuration utilities for static assets. Shared by LMS and CMS.
"""
from django.contrib.staticfiles.apps import StaticFilesConfig


class EdxPlatformStaticFilesConfig(StaticFilesConfig):
"""
A thin wrapper around the standard django.contrib.staticfiles app
which adds the proper file & folder ignore patterns for edx-platform
static asset collection.
This allows devs & operators to run:
./manage.py [lms|cms] collectstatic
instead of:
./manage.py [lms|cms] collectstatic --ignore geoip --ignore sass ... etc.
"""
ignore_patterns = StaticFilesConfig.ignore_patterns + [

"geoip", # Geo-IP data, only accessed in Python
"sass", # We compile these out, don't need the source files in staticfiles
"xmodule_js", # Symlink for tests.

# Karma test related files:
"fixtures",
"karma_*.js",
"spec",
"spec_helpers",
"spec-helpers",
]
23 changes: 1 addition & 22 deletions pavelib/assets.py
Original file line number Diff line number Diff line change
Expand Up @@ -692,30 +692,9 @@ def collect_assets(systems, settings, **kwargs):
`settings` is the Django settings module to use.
`**kwargs` include arguments for using a log directory for collectstatic output. Defaults to /dev/null.
"""
ignore_patterns = [
# Karma test related files...
"fixtures",
"karma_*.js",
"spec",
"spec_helpers",
"spec-helpers",
"xmodule_js", # symlink for tests

# Geo-IP data, only accessed in Python
"geoip",

# We compile these out, don't need the source files in staticfiles
"sass",
]

ignore_args = " ".join(
f'--ignore "{pattern}"' for pattern in ignore_patterns
)

for sys in systems:
collectstatic_stdout_str = _collect_assets_cmd(sys, **kwargs)
sh(django_cmd(sys, settings, "collectstatic {ignore_args} --noinput {logfile_str}".format(
ignore_args=ignore_args,
sh(django_cmd(sys, settings, "collectstatic --noinput {logfile_str}".format(
logfile_str=collectstatic_stdout_str
)))
print(f"\t\tFinished collecting {sys} assets.")
Expand Down

0 comments on commit d35df76

Please sign in to comment.