• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

makinacorpus / django-leaflet / 9059661178

13 May 2024 08:24AM UTC coverage: 83.661% (+0.3%) from 83.401%
9059661178

push

github

web-flow
Make django-leaflet compatible with CSP (#371)

* Set style css in script

* leaflet-container class to external css

* Set i18n variables into external js

* Further remove inline scripts

* Move custom css into leaflet.extras.css

* Don't modify leaflet.css

* Optionally add nonce to inline style and script in widget

* Maybe fix the whole thing?

* Revert mistaken deletions

* Add nonce to leaflet_map tag

* Quote the nonce

* Fix remaining inlines

---------

Co-authored-by: Rodolfo Valentín Becerra García <rodolvbg@gmail.com>
Co-authored-by: Rodolfo Becerra <rodolvbg@divineslns.com>

14 of 15 new or added lines in 4 files covered. (93.33%)

2 existing lines in 1 file now uncovered.

425 of 508 relevant lines covered (83.66%)

13.37 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

88.89
/leaflet/admin.py
1
from django.contrib.admin import ModelAdmin
16✔
2
from django.core.exceptions import ImproperlyConfigured
16✔
3
from django.forms import Media
16✔
4

5
try:
16✔
6
    from djgeojson.fields import GeoJSONField
16✔
7
except ImportError:
16✔
8
    GeoJSONField = type(object)
16✔
9
try:
16✔
10
    from django.contrib.gis.db.models import GeometryField
16✔
11
except (ImportError, ImproperlyConfigured):
×
12
    # When GEOS is not installed
13
    GeometryField = type(object)
×
14

15
from .forms.widgets import LeafletWidget
16✔
16

17

18
class LeafletAdminWidget(LeafletWidget):
16✔
19
    include_media = True
16✔
20

21
    @property
16✔
22
    def media(self):
14✔
23
        return super().media + Media(css={'screen': ['leaflet/leaflet_django.css']})
16✔
24

25

26
class LeafletGeoAdminMixin:
16✔
27
    widget = LeafletAdminWidget
16✔
28
    map_template = 'leaflet/admin/widget.html'
16✔
29
    modifiable = True
16✔
30
    display_raw = False
16✔
31
    settings_overrides = {}
16✔
32

33
    def formfield_for_dbfield(self, db_field, request=None, **kwargs):
16✔
34
        """
35
        Overloaded from ModelAdmin to set Leaflet widget
36
        in form field init params.
37
        """
38
        is_geometry = isinstance(db_field, (GeometryField, GeoJSONField))
16✔
39
        is_editable = is_geometry and (db_field.dim < 3 or
16✔
40
                                       self.widget.supports_3d)
41

42
        if is_editable:
16✔
43
            # Setting the widget with the newly defined widget.
44
            widget = self.widget
16✔
45
            if 'widget' in kwargs and issubclass(kwargs['widget'], LeafletWidget):
16✔
46
                # If the widget is already a LeafletWidget of some kind
47
                # Then use it rather than a blank one.
48
                widget = kwargs['widget']
×
49

50
            kwargs['widget'] = self._get_map_widget(db_field, widget)
16✔
51

52
            if request is not None:
16✔
NEW
53
                kwargs['widget'].csp_nonce = getattr(request, "csp_nonce", None)
×
54

55
            return db_field.formfield(**kwargs)
16✔
56
        else:
57
            return super().formfield_for_dbfield(db_field, request, **kwargs)
×
58

59
    def _get_map_widget(self, db_field, widget):
16✔
60
        """
61
        Overriden LeafletWidget with LeafletGeoAdmin params.
62
        """
63
        class LeafletMap(widget):
16✔
64
            template_name = self.map_template
16✔
65
            geom_type = db_field.geom_type
16✔
66
            modifiable = self.modifiable
16✔
67
            display_raw = self.display_raw
16✔
68
            settings_overrides = self.settings_overrides
16✔
69
        return LeafletMap
16✔
70

71

72
class LeafletGeoAdmin(LeafletGeoAdminMixin, ModelAdmin):
16✔
73
    pass
16✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc