Merge pull request #1539 from umap-project/no-compressor

Use custom storage instead of django-compressor
This commit is contained in:
Yohan Boniface 2024-01-17 18:47:48 +01:00 committed by GitHub
commit 016f74753f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
13 changed files with 190 additions and 105 deletions

1
.gitignore vendored
View file

@ -10,6 +10,7 @@ site/*
node_modules node_modules
umap.conf umap.conf
data data
static
### Python ### ### Python ###
# Byte-compiled / optimized / DLL files # Byte-compiled / optimized / DLL files

View file

@ -32,7 +32,6 @@ classifiers = [
dependencies = [ dependencies = [
"Django==4.2", "Django==4.2",
"django-agnocomplete==2.2.0", "django-agnocomplete==2.2.0",
"django-compressor==4.3.1",
"django-environ==0.10.0", "django-environ==0.10.0",
"django-probes==1.7.0", "django-probes==1.7.0",
"Pillow==10.0.1", "Pillow==10.0.1",

View file

@ -119,7 +119,6 @@ INSTALLED_APPS = (
"django.contrib.gis", "django.contrib.gis",
"django_probes", "django_probes",
"umap", "umap",
"compressor",
"social_django", "social_django",
# See https://github.com/peopledoc/django-agnocomplete/commit/26eda2dfa4a2f8a805ca2ea19a0c504b9d773a1c # See https://github.com/peopledoc/django-agnocomplete/commit/26eda2dfa4a2f8a805ca2ea19a0c504b9d773a1c
# Django does not find the app config in the default place, so the app is not loaded # Django does not find the app config in the default place, so the app is not loaded
@ -163,9 +162,16 @@ MEDIA_ROOT = os.path.join("uploads")
STATICFILES_FINDERS = [ STATICFILES_FINDERS = [
"django.contrib.staticfiles.finders.FileSystemFinder", "django.contrib.staticfiles.finders.FileSystemFinder",
"django.contrib.staticfiles.finders.AppDirectoriesFinder", "django.contrib.staticfiles.finders.AppDirectoriesFinder",
"compressor.finders.CompressorFinder",
] ]
STATICFILES_DIRS = [] # May be extended when using UMAP_CUSTOM_STATICS STATICFILES_DIRS = [] # May be extended when using UMAP_CUSTOM_STATICS
STORAGES = {
"default": {
"BACKEND": "django.core.files.storage.FileSystemStorage",
},
"staticfiles": {
"BACKEND": "umap.utils.UmapManifestStaticFilesStorage",
},
}
# ============================================================================= # =============================================================================
# Templates # Templates
@ -262,9 +268,6 @@ LEAFLET_ZOOM = env.int("LEAFLET_ZOOM", default=6)
# ============================================================================= # =============================================================================
# Third party app settings # Third party app settings
# ============================================================================= # =============================================================================
COMPRESS_ENABLED = True
COMPRESS_OFFLINE = True
LOGIN_URL = "login" LOGIN_URL = "login"
SOCIAL_AUTH_LOGIN_REDIRECT_URL = "/login/popup/end/" SOCIAL_AUTH_LOGIN_REDIRECT_URL = "/login/popup/end/"

View file

@ -29,9 +29,6 @@ DATABASES = {
} }
} }
COMPRESS_ENABLED = False
COMPRESS_OFFLINE = True
LANGUAGE_CODE = "en" LANGUAGE_CODE = "en"
# Set to False if login into django account should not be possible. You can # Set to False if login into django account should not be possible. You can

View file

@ -1,4 +1,4 @@
{% load compress umap_tags i18n %} {% load umap_tags i18n static %}
<!DOCTYPE html> <!DOCTYPE html>
<html {% if LANGUAGE_BIDI %}dir="rtl"{% endif %}> <html {% if LANGUAGE_BIDI %}dir="rtl"{% endif %}>
<head> <head>
@ -17,13 +17,13 @@
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
{# See https://evilmartians.com/chronicles/how-to-favicon-in-2021-six-files-that-fit-most-needs #} {# See https://evilmartians.com/chronicles/how-to-favicon-in-2021-six-files-that-fit-most-needs #}
<link rel="icon" <link rel="icon"
href="{{ STATIC_URL }}umap/favicons/favicon.ico" href="{% static 'umap/favicons/favicon.ico' %}"
sizes="32x32"> sizes="32x32">
<link rel="icon" <link rel="icon"
href="{{ STATIC_URL }}umap/favicons/icon.svg" href="{% static 'umap/favicons/icon.svg' %}"
type="image/svg+xml"> type="image/svg+xml">
<link rel="apple-touch-icon" <link rel="apple-touch-icon"
href="{{ STATIC_URL }}umap/favicons/apple-touch-icon.png"> href="{% static 'umap/favicons/apple-touch-icon.png' %}">
<!-- 180×180 --> <!-- 180×180 -->
<link rel="manifest" href="/manifest.webmanifest"> <link rel="manifest" href="/manifest.webmanifest">
</head> </head>

View file

@ -1,9 +1,9 @@
{% load i18n %} {% load i18n static %}
<div class="wrapper about_summary highlights"> <div class="wrapper about_summary highlights">
<div class="row"> <div class="row">
<div class="col quarter mwide"> <div class="col quarter mwide">
<img class="colophon" <img class="colophon"
src="{{ STATIC_URL }}umap/img/osm.svg" src="{% static 'umap/img/osm.svg' %}"
alt="" alt=""
width="128px" width="128px"
height="128px" /> height="128px" />
@ -13,7 +13,7 @@
</div> </div>
<div class="col umap-features-list half mwide"> <div class="col umap-features-list half mwide">
<img class="colophon" <img class="colophon"
src="{{ STATIC_URL }}umap/img/edit.svg" src="{% static 'umap/img/edit.svg' %}"
alt="" alt=""
width="128px" width="128px"
height="128px" /> height="128px" />
@ -29,7 +29,7 @@
</div> </div>
<div class="col quarter mwide"> <div class="col quarter mwide">
<img class="colophon" <img class="colophon"
src="{{ STATIC_URL }}umap/img/opensource.svg" src="{% static 'umap/img/opensource.svg' %}"
alt="" alt=""
width="128px" width="128px"
height="128px" /> height="128px" />

View file

@ -1,12 +1,10 @@
{% extends "base.html" %} {% extends "base.html" %}
{% load umap_tags compress i18n %} {% load umap_tags i18n %}
{% block body_class %} {% block body_class %}
content content
{% endblock body_class %} {% endblock body_class %}
{% block extra_head %} {% block extra_head %}
{% compress css %}
{% umap_css %} {% umap_css %}
{% endcompress css %}
{% umap_js %} {% umap_js %}
{% endblock extra_head %} {% endblock extra_head %}
{% block header %} {% block header %}

View file

@ -1,28 +1,30 @@
{% load static %}
<link rel="stylesheet" <link rel="stylesheet"
href="{{ STATIC_URL }}umap/vendors/leaflet/leaflet.css" /> href="{% static 'umap/vendors/leaflet/leaflet.css' %}" />
<link rel="stylesheet" <link rel="stylesheet"
href="{{ STATIC_URL }}umap/vendors/markercluster/MarkerCluster.css" /> href="{% static 'umap/vendors/markercluster/MarkerCluster.css' %}" />
<link rel="stylesheet" <link rel="stylesheet"
href="{{ STATIC_URL }}umap/vendors/markercluster/MarkerCluster.Default.css" /> href="{% static 'umap/vendors/markercluster/MarkerCluster.Default.css' %}" />
<link rel="stylesheet" <link rel="stylesheet"
href="{{ STATIC_URL }}umap/vendors/editinosm/Leaflet.EditInOSM.css" /> href="{% static 'umap/vendors/editinosm/Leaflet.EditInOSM.css' %}" />
<link rel="stylesheet" <link rel="stylesheet"
href="{{ STATIC_URL }}umap/vendors/minimap/Control.MiniMap.css" /> href="{% static 'umap/vendors/minimap/Control.MiniMap.css' %}" />
<link rel="stylesheet" <link rel="stylesheet"
href="{{ STATIC_URL }}umap/vendors/contextmenu/leaflet.contextmenu.css" /> href="{% static 'umap/vendors/contextmenu/leaflet.contextmenu.css' %}" />
<link rel="stylesheet" <link rel="stylesheet"
href="{{ STATIC_URL }}umap/vendors/toolbar/leaflet.toolbar.css" /> href="{% static 'umap/vendors/toolbar/leaflet.toolbar.css' %}" />
<link rel="stylesheet" <link rel="stylesheet"
href="{{ STATIC_URL }}umap/vendors/measurable/Leaflet.Measurable.css" /> href="{% static 'umap/vendors/measurable/Leaflet.Measurable.css' %}" />
<link rel="stylesheet" <link rel="stylesheet"
href="{{ STATIC_URL }}umap/vendors/fullscreen/leaflet.fullscreen.css" /> href="{% static 'umap/vendors/fullscreen/leaflet.fullscreen.css' %}" />
<link rel="stylesheet" <link rel="stylesheet"
href="{{ STATIC_URL }}umap/vendors/locatecontrol/L.Control.Locate.css" /> href="{% static 'umap/vendors/locatecontrol/L.Control.Locate.css' %}" />
<link rel="stylesheet" <link rel="stylesheet"
href="{{ STATIC_URL }}umap/vendors/iconlayers/iconLayers.css" /> href="{% static 'umap/vendors/iconlayers/iconLayers.css' %}" />
<link rel="stylesheet" href="{{ STATIC_URL }}umap/font.css"> <link rel="stylesheet" href="{% static 'umap/font.css' %}">
<link rel="stylesheet" href="{{ STATIC_URL }}umap/base.css"> <link rel="stylesheet" href="{% static 'umap/base.css' %}">
<link rel="stylesheet" href="{{ STATIC_URL }}umap/content.css"> <link rel="stylesheet" href="{% static 'umap/content.css' %}">
<link rel="stylesheet" href="{{ STATIC_URL }}umap/nav.css"> <link rel="stylesheet" href="{% static 'umap/nav.css' %}">
<link rel="stylesheet" href="{{ STATIC_URL }}umap/map.css" /> <link rel="stylesheet" href="{% static 'umap/map.css' %}" />
<link rel="stylesheet" href="{{ STATIC_URL }}umap/theme.css"> <link rel="stylesheet" href="{% static 'umap/theme.css' %}">

View file

@ -1,62 +1,53 @@
{% load compress %} {% load static %}
{% compress js %}
<script type="module" src="{{ STATIC_URL }}umap/js/modules/global.js" defer></script> <script type="module" src="{% static 'umap/js/modules/global.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/vendors/editable/Path.Drag.js" defer></script> <script src="{% static 'umap/vendors/editable/Path.Drag.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/vendors/editable/Leaflet.Editable.js" defer></script> <script src="{% static 'umap/vendors/editable/Leaflet.Editable.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/vendors/hash/leaflet-hash.js" defer></script> <script src="{% static 'umap/vendors/hash/leaflet-hash.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/vendors/i18n/Leaflet.i18n.js" defer></script> <script src="{% static 'umap/vendors/i18n/Leaflet.i18n.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/vendors/editinosm/Leaflet.EditInOSM.js" <script src="{% static 'umap/vendors/editinosm/Leaflet.EditInOSM.js' %}" defer></script>
defer></script> <script src="{% static 'umap/vendors/minimap/Control.MiniMap.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/vendors/minimap/Control.MiniMap.js" defer></script> <script src="{% static 'umap/vendors/csv2geojson/csv2geojson.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/vendors/csv2geojson/csv2geojson.js" defer></script> <script src="{% static 'umap/vendors/togeojson/togeojson.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/vendors/togeojson/togeojson.js" defer></script> <script src="{% static 'umap/vendors/osmtogeojson/osmtogeojson.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/vendors/osmtogeojson/osmtogeojson.js" defer></script> <script src="{% static 'umap/vendors/loading/Control.Loading.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/vendors/loading/Control.Loading.js" defer></script> <script src="{% static 'umap/vendors/markercluster/leaflet.markercluster-src.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/vendors/markercluster/leaflet.markercluster-src.js" <script src="{% static 'umap/vendors/contextmenu/leaflet.contextmenu.js' %}" defer></script>
defer></script> <script src="{% static 'umap/vendors/photon/leaflet.photon.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/vendors/contextmenu/leaflet.contextmenu.js" <script src="{% static 'umap/vendors/georsstogeojson/GeoRSSToGeoJSON.js' %}" defer></script>
defer></script> <script src="{% static 'umap/vendors/heat/leaflet-heat.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/vendors/photon/leaflet.photon.js" defer></script> <script src="{% static 'umap/vendors/fullscreen/Leaflet.fullscreen.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/vendors/georsstogeojson/GeoRSSToGeoJSON.js" <script src="{% static 'umap/vendors/toolbar/leaflet.toolbar-src.js' %}" defer></script>
defer></script> <script src="{% static 'umap/vendors/formbuilder/Leaflet.FormBuilder.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/vendors/heat/leaflet-heat.js" defer></script> <script src="{% static 'umap/vendors/measurable/Leaflet.Measurable.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/vendors/fullscreen/Leaflet.fullscreen.js" <script src="{% static 'umap/vendors/togpx/togpx.js' %}" defer></script>
defer></script> <script src="{% static 'umap/vendors/iconlayers/iconLayers.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/vendors/toolbar/leaflet.toolbar-src.js" <script src="{% static 'umap/vendors/tokml/tokml.js' %}" defer></script>
defer></script> <script src="{% static 'umap/vendors/locatecontrol/L.Control.Locate.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/vendors/formbuilder/Leaflet.FormBuilder.js" <script src="{% static 'umap/vendors/dompurify/purify.js' %}" defer></script>
defer></script> <script src="{% static 'umap/vendors/colorbrewer/colorbrewer.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/vendors/measurable/Leaflet.Measurable.js" <script src="{% static 'umap/vendors/simple-statistics/simple-statistics.min.js' %}" defer></script>
defer></script> {% if locale %}
<script src="{{ STATIC_URL }}umap/vendors/togpx/togpx.js" defer></script> {% with "umap/locale/"|add:locale|add:".js" as path %}
<script src="{{ STATIC_URL }}umap/vendors/iconlayers/iconLayers.js" defer></script> <script src="{% static path %}" defer></script>
<script src="{{ STATIC_URL }}umap/vendors/tokml/tokml.js" defer></script> {% endwith %}
<script src="{{ STATIC_URL }}umap/vendors/locatecontrol/L.Control.Locate.js" {% endif %}
defer></script> <script src="{% static 'umap/js/umap.core.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/vendors/dompurify/purify.js" defer></script> <script src="{% static 'umap/js/umap.autocomplete.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/vendors/colorbrewer/colorbrewer.js" defer></script> <script src="{% static 'umap/js/umap.popup.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/vendors/simple-statistics/simple-statistics.min.js" <script src="{% static 'umap/js/umap.xhr.js' %}" defer></script>
defer></script> <script src="{% static 'umap/js/umap.forms.js' %}" defer></script>
{% endcompress %} <script src="{% static 'umap/js/umap.icon.js' %}" defer></script>
{% if locale %}<script src="{{ STATIC_URL }}umap/locale/{{ locale }}.js" defer></script>{% endif %} <script src="{% static 'umap/js/umap.features.js' %}" defer></script>
{% compress js %} <script src="{% static 'umap/js/umap.permissions.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/js/umap.core.js" defer></script> <script src="{% static 'umap/js/umap.datalayer.permissions.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/js/umap.autocomplete.js" defer></script> <script src="{% static 'umap/js/umap.layer.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/js/umap.popup.js" defer></script> <script src="{% static 'umap/js/umap.controls.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/js/umap.xhr.js" defer></script> <script src="{% static 'umap/js/umap.slideshow.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/js/umap.forms.js" defer></script> <script src="{% static 'umap/js/umap.tableeditor.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/js/umap.icon.js" defer></script> <script src="{% static 'umap/js/umap.browser.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/js/umap.features.js" defer></script> <script src="{% static 'umap/js/umap.importer.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/js/umap.permissions.js" defer></script> <script src="{% static 'umap/js/umap.share.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/js/umap.datalayer.permissions.js" defer></script> <script src="{% static 'umap/js/umap.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/js/umap.layer.js" defer></script> <script src="{% static 'umap/js/umap.ui.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/js/umap.controls.js" defer></script> <script src="{% static 'umap/js/components/fragment.js' %}" defer></script>
<script src="{{ STATIC_URL }}umap/js/umap.slideshow.js" defer></script>
<script src="{{ STATIC_URL }}umap/js/umap.tableeditor.js" defer></script>
<script src="{{ STATIC_URL }}umap/js/umap.browser.js" defer></script>
<script src="{{ STATIC_URL }}umap/js/umap.importer.js" defer></script>
<script src="{{ STATIC_URL }}umap/js/umap.share.js" defer></script>
<script src="{{ STATIC_URL }}umap/js/umap.js" defer></script>
<script src="{{ STATIC_URL }}umap/js/umap.ui.js" defer></script>
<script src="{{ STATIC_URL }}umap/js/components/fragment.js" defer></script>
{% endcompress %}

View file

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
{% load umap_tags compress i18n %} {% load umap_tags i18n %}
{% block head_title %} {% block head_title %}
{{ map.name }} - {{ SITE_NAME }} {{ map.name }} - {{ SITE_NAME }}
{% endblock head_title %} {% endblock head_title %}
@ -7,9 +7,7 @@
map_detail map_detail
{% endblock body_class %} {% endblock body_class %}
{% block extra_head %} {% block extra_head %}
{% compress css %}
{% umap_css %} {% umap_css %}
{% endcompress %}
{% umap_js locale=locale %} {% umap_js locale=locale %}
{% if object.share_status != object.PUBLIC %}<meta name="robots" content="noindex">{% endif %} {% if object.share_status != object.PUBLIC %}<meta name="robots" content="noindex">{% endif %}
{% endblock extra_head %} {% endblock extra_head %}

View file

@ -0,0 +1,43 @@
import re
import shutil
import tempfile
import pytest
from django.core.management import call_command
from django.utils.translation import override
from playwright.sync_api import expect
@pytest.fixture
def staticfiles(settings):
static_root = tempfile.mkdtemp(prefix="test_static")
settings.STATIC_ROOT = static_root
try:
call_command("collectstatic", "--noinput")
yield
finally:
shutil.rmtree(static_root)
def test_javascript_have_been_loaded(
map, live_server, datalayer, page, settings, staticfiles
):
settings.STORAGES["staticfiles"][
"BACKEND"
] = "umap.utils.UmapManifestStaticFilesStorage"
datalayer.settings["displayOnLoad"] = False
datalayer.save()
map.settings["properties"]["defaultView"] = "latest"
map.save()
with override("fr"):
url = f"{live_server.url}{map.get_absolute_url()}"
assert "/fr/" in url
page.goto(url)
# Hash is defined, so map is initialized
expect(page).to_have_url(re.compile(r".*#7/48\..+/13\..+"))
expect(page).to_have_url(re.compile(r".*/fr/"))
# Should be in French, so hashed locale file has been loaded correctly
button = page.get_by_text("Voir les calques")
expect(button).to_be_visible()
layers = page.locator(".umap-browse-datalayers li")
expect(layers).to_have_count(1)

View file

@ -3,9 +3,11 @@ import os
from umap.settings.base import * # pylint: disable=W0614,W0401 from umap.settings.base import * # pylint: disable=W0614,W0401
SECRET_KEY = "justfortests" SECRET_KEY = "justfortests"
COMPRESS_ENABLED = False
FROM_EMAIL = "test@test.org" FROM_EMAIL = "test@test.org"
EMAIL_BACKEND = "django.core.mail.backends.locmem.EmailBackend" EMAIL_BACKEND = "django.core.mail.backends.locmem.EmailBackend"
STORAGES["staticfiles"][
"BACKEND"
] = "django.contrib.staticfiles.storage.StaticFilesStorage"
if os.environ.get("GITHUB_ACTIONS", False) == "true": if os.environ.get("GITHUB_ACTIONS", False) == "true":
DATABASES = { DATABASES = {

View file

@ -2,6 +2,7 @@ import gzip
import os import os
from django.conf import settings from django.conf import settings
from django.contrib.staticfiles.storage import ManifestStaticFilesStorage
from django.urls import URLPattern, URLResolver, get_resolver from django.urls import URLPattern, URLResolver, get_resolver
@ -162,3 +163,53 @@ def merge_features(reference: list, latest: list, incoming: list):
merged.append(item) merged.append(item)
return merged return merged
class UmapManifestStaticFilesStorage(ManifestStaticFilesStorage):
support_js_module_import_aggregation = True
# We remove `;` at the end of all regexps to match our prettier config.
_js_module_import_aggregation_patterns = (
"*.js",
(
(
(
r"""(?P<matched>import(?s:(?P<import>[\s\{].*?))"""
r"""\s*from\s*['"](?P<url>[\.\/].*?)["']\s*)"""
),
'import%(import)s from "%(url)s"\n',
),
(
(
r"""(?P<matched>export(?s:(?P<exports>[\s\{].*?))"""
r"""\s*from\s*["'](?P<url>[\.\/].*?)["']\s*)"""
),
'export%(exports)s from "%(url)s"\n',
),
(
r"""(?P<matched>import\s*['"](?P<url>[\.\/].*?)["']\s*)""",
'import"%(url)s"\n',
),
(
r"""(?P<matched>import\(["'](?P<url>.*?)["']\))""",
"""import("%(url)s")""",
),
),
)
# https://github.com/django/django/blob/0fcee1676c7f14bb08e2cc662898dee56d9cf207↩
# /django/contrib/staticfiles/storage.py#L78C5-L105C6
patterns = (
(
"*.css",
(
r"""(?P<matched>url\(['"]{0,1}\s*(?P<url>.*?)["']{0,1}\))""",
(
r"""(?P<matched>@import\s*["']\s*(?P<url>.*?)["'])""",
"""@import url("%(url)s")""",
),
# Remove CSS source map rewriting
),
),
# Remove JS source map rewriting
)