Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,14 @@ CHANGELOG
8.14.4+dev (XXXX-XX-XX)
-----------------------

**Improvements**

- Better language and translation management even if language is valid but not supported by django

**Bug fixes**

- In some cases default settings values can't be overridden.


8.14.4 (2025-09-25)
-----------------------
Expand Down Expand Up @@ -38,7 +46,7 @@ CHANGELOG

**Warning**

- Some component has been changed. User menu items, actions buttons in list, actions and download buttons in details views. Please test and update your templates before upgrading.
- Some components have been changed. User menu items, actions buttons in list, actions and download buttons in details views. Please test and update your templates before upgrading.

**Improvements**

Expand Down
82 changes: 40 additions & 42 deletions mapentity/settings.py
Original file line number Diff line number Diff line change
@@ -1,32 +1,12 @@
from collections import OrderedDict
from copy import deepcopy

from deepmerge import always_merger
from django.conf import settings
from django.contrib.messages import constants as messages

API_SRID = 4326

_DEFAULT_MAP_STYLES = {
"detail": {
"weight": 5,
"opacity": 1,
"color": "yellow",
"arrowColor": "#FF5E00",
"arrowSize": 8,
},
"others": {"opacity": 0.9, "fillOpacity": 0.7, "color": "yellow"},
"filelayer": {
"color": "red",
"opacity": 1.0,
"fillOpacity": 0.9,
"weight": 2,
"radius": 5,
},
"draw": {"color": "#35FF00", "opacity": 0.8, "weight": 3},
"print": {},
}

app_settings = dict(
_default_app_settings = dict(
{
"TITLE": "Mapentity",
"HISTORY_ITEMS_MAX": 5,
Expand Down Expand Up @@ -55,22 +35,36 @@
"SENDFILE_HTTP_HEADER": None,
"DRF_API_URL_PREFIX": r"^api/",
"MAPENTITY_WEASYPRINT": False,
"MAP_STYLES": _DEFAULT_MAP_STYLES,
"MAP_STYLES": {
"detail": {
"weight": 5,
"opacity": 1,
"color": "yellow",
"arrowColor": "#FF5E00",
"arrowSize": 8,
},
"others": {"opacity": 0.9, "fillOpacity": 0.7, "color": "yellow"},
"filelayer": {
"color": "red",
"opacity": 1.0,
"fillOpacity": 0.9,
"weight": 2,
"radius": 5,
},
"draw": {"color": "#35FF00", "opacity": 0.8, "weight": 3},
"print": {},
},
"REGEX_PATH_ATTACHMENTS": r"\.\d+x\d+_q\d+(_crop)?\.(jpg|png|jpeg|bmp|webp)$",
"MAX_CHARACTERS": None,
"MAX_CHARACTERS_BY_FIELD": {},
},
**getattr(settings, "MAPENTITY_CONFIG", {}),
}
)
_project_settings = getattr(settings, "MAPENTITY_CONFIG", {})

# default MAP_STYLES should not be replaced but updated by MAPENTITY_CONFIG
_MAP_STYLES = deepcopy(_DEFAULT_MAP_STYLES)
_MAP_STYLES.update(app_settings["MAP_STYLES"])
app_settings["MAP_STYLES"] = _MAP_STYLES
app_settings = always_merger.merge(_default_app_settings, _project_settings)

CRISPY_TEMPLATE_PACK = "bootstrap4"

TINYMCE_DEFAULT_CONFIG = {
_tinymce_default_config = {
"theme": "silver",
"height": 500,
"menubar": False,
Expand All @@ -96,11 +90,15 @@
),
"setup": "tinyMceInit",
}
TINYMCE_DEFAULT_CONFIG.update(getattr(settings, "TINYMCE_DEFAULT_CONFIG", {}))
_tinymce_project_config = getattr(settings, "TINYMCE_DEFAULT_CONFIG", {})

TINYMCE_DEFAULT_CONFIG = always_merger.merge(
_tinymce_default_config, _tinymce_project_config
)
setattr(settings, "TINYMCE_DEFAULT_CONFIG", TINYMCE_DEFAULT_CONFIG)


REST_FRAMEWORK_DEFAULT_CONFIG = {
_rest_framework_default_config = {
# Use Django's standard `django.contrib.auth` permissions,
# or allow read-only access for unauthenticated users.
"DEFAULT_PERMISSION_CLASSES": ["mapentity.models.MapEntityRestPermissions"],
Expand All @@ -109,14 +107,11 @@
"mapentity.renderers.GeoJSONRenderer",
],
}
REST_FRAMEWORK_DEFAULT_CONFIG.update(getattr(settings, "REST_FRAMEWORK", {}))
setattr(settings, "REST_FRAMEWORK", REST_FRAMEWORK_DEFAULT_CONFIG)

for name, override in getattr(settings, "MAP_STYLES", {}).items():
# fallback old settings MAP_STYLES
merged = app_settings["MAP_STYLES"].get(name, {})
merged.update(override)
app_settings["MAP_STYLES"][name] = merged
_rest_framework_project_config = getattr(settings, "REST_FRAMEWORK", {})
REST_FRAMEWORK = always_merger.merge(
_rest_framework_default_config, _rest_framework_project_config
)
setattr(settings, "REST_FRAMEWORK", REST_FRAMEWORK)

_LEAFLET_PLUGINS = OrderedDict(
[
Expand Down Expand Up @@ -207,10 +202,11 @@
_MODELTRANSLATION_LANGUAGES = getattr(
settings, "MODELTRANSLATION_LANGUAGES", tuple(x[0] for x in settings.LANGUAGES)
)
setattr(settings, "MODELTRANSLATION_LANGUAGES", _MODELTRANSLATION_LANGUAGES)

_MODELTRANSLATION_DEFAULT_LANGUAGE = getattr(
settings, "MODELTRANSLATION_DEFAULT_LANGUAGE", _MODELTRANSLATION_LANGUAGES[0]
)
setattr(settings, "MODELTRANSLATION_LANGUAGES", _MODELTRANSLATION_LANGUAGES)
setattr(
settings, "MODELTRANSLATION_DEFAULT_LANGUAGE", _MODELTRANSLATION_DEFAULT_LANGUAGE
)
Expand All @@ -230,6 +226,8 @@

setattr(settings, "MESSAGE_TAGS", _MESSAGE_TAGS)

CRISPY_TEMPLATE_PACK = "bootstrap4"

# crispy form default config with bootstrap4
_CRISPY_ALLOWED_TEMPLATE_PACKS = getattr(
settings, "CRISPY_ALLOWED_TEMPLATE_PACKS", ("bootstrap4",)
Expand Down
9 changes: 4 additions & 5 deletions mapentity/templates/mapentity/_base_navbar.html
Original file line number Diff line number Diff line change
Expand Up @@ -94,13 +94,12 @@ <h6 class="dropdown-header">
</h6>
{% get_current_language as LANGUAGE_CODE %}
{% get_available_languages as LANGUAGES %}
{% get_language_info_list for LANGUAGES as languages %}
<form action="{% url 'set_language' %}" method="post">{% csrf_token %}
<input name="next" type="hidden" value="{{ redirect_to }}">
{% for language in languages %}
<button class="dropdown-item" type="submit" name="language" value="{{ language.code }}" title="{{ language.code }}"
class="btn btn-light m-0 language-menu-item {% if language.code == LANGUAGE_CODE %}active{% endif %}">
{{ language.name_local|title }}
{% for language in LANGUAGES %}
<button class="dropdown-item" type="submit" name="language" value="{{ language.0 }}" title="{{ language.0 }}"
class="btn btn-light m-0 language-menu-item {% if language.0 == LANGUAGE_CODE %}active{% endif %}">
{{ language.1|title }}
</button>
{% endfor %}
</form>
Expand Down
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
'paperclip',
'requests',
'weasyprint',
'deepmerge',
],
extras_require={
'dev': [
Expand Down
12 changes: 6 additions & 6 deletions test_project/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


def _(s):
return s


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/

Expand Down Expand Up @@ -112,8 +116,8 @@
# https://docs.djangoproject.com/en/1.8/topics/i18n/

LANGUAGES = (
("en", "English"),
("fr", "French"),
("en", f"🇬🇧 {_('English')}"),
("fr", f"🇫🇷 {_('French')}"),
)

LANGUAGE_CODE = "en-us"
Expand Down Expand Up @@ -147,10 +151,6 @@
COMPRESS_ENABLED = False
TEST = True

MAPENTITY_CONFIG = {
"SENDFILE_HTTP_HEADER": "X-Accel-Redirect",
}

PAPERCLIP_FILETYPE_MODEL = "test_app.FileType"
PAPERCLIP_LICENSE_MODEL = "test_app.License"
PAPERCLIP_ATTACHMENT_MODEL = "test_app.Attachment"
Expand Down