-
Notifications
You must be signed in to change notification settings - Fork 125
Expand file tree
/
Copy pathbase.py
More file actions
139 lines (113 loc) · 4.72 KB
/
base.py
File metadata and controls
139 lines (113 loc) · 4.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import json
from django.contrib.gis import forms
from django.contrib.gis.geos import GEOSGeometry
from django.utils.http import urlencode
from mapwidgets.settings import mw_settings
from mapwidgets.widgets.mixins import SettingsMixin
class BasePointFieldInteractiveWidget(SettingsMixin, forms.BaseGeometryWidget):
_settings = None
map_srid = mw_settings.srid
def get_css_paths(self, extra_css=None, minified=False):
extra_css = extra_css or []
media_settings = self.settings.media
return extra_css + (
media_settings.css.minified if minified else media_settings.css.dev
)
def get_js_paths(self, extra_js=None, minified=False):
extra_js = extra_js or []
media_settings = self.settings.media
return extra_js + (
media_settings.js.minified if minified else media_settings.js.dev
)
def _media(self, extra_css=None, extra_js=None):
css_paths = self.get_css_paths(extra_css, minified=not mw_settings.is_dev_mode)
js_paths = self.get_js_paths(extra_js, minified=not mw_settings.is_dev_mode)
return forms.Media(css={"all": css_paths}, js=js_paths)
@property
def media(self):
return self._media()
def geos_to_dict(self, geom: GEOSGeometry):
if geom is None:
return None
geom_dict = {
"srid": geom.srid,
"wkt": str(geom),
"coords": geom.coords,
"geom_type": geom.geom_type,
}
longitude, latitude = geom.coords
# Transform the coordinates for backwards compatibility
geom_dict["lng"] = longitude
geom_dict["lat"] = latitude
return geom_dict
def get_context(self, name, value, attrs):
context = super().get_context(name, value, attrs)
# Django 6.0 removed id and name from context; re-inject them
context["name"] = name
widget_attrs = context.get("widget", {}).get("attrs", {})
context["id"] = widget_attrs.get("id", name)
field_value = context["serialized"]
if field_value:
field_value = self.geos_to_dict(self.deserialize(field_value))
else:
field_value = None
extra_context = {
"options": json.dumps(self.settings),
"field_value": json.dumps(field_value),
}
context.update(extra_context)
return context
class BaseStaticWidget(SettingsMixin, forms.TextInput):
template_name = "mapwidgets/static_widget.html"
_base_url = None
DEFAULT_IMAGE_SIZE = "240x240"
@property
def media(self):
if self.settings.enableMagnificPopup:
return forms.Media(
css={"all": ["mapwidgets/css/magnific-popup.min.css"]},
js=["mapwidgets/js/staticmap/mw_jquery.magnific-popup.min.js"],
)
return forms.Media()
def sign_url(self, url):
"""
Sign url with a secret.
"""
return url
@property
def base_url(self):
if not self._base_url:
raise ValueError("`_base_url` attribute must be set")
return self._base_url
def get_image_url_params(self, coordinates):
raise NotImplementedError(
"subclasses of BaseStaticMapWidget must provide a get_image_url_params method"
)
def get_thumbnail_url_params(self, coordinates):
params = self.get_image_url_params(coordinates)
if self.settings.thumbnailSize:
params["size"] = self.settings.thumbnailSize
return params
def get_image_url(self, coordinates):
return f"{self.base_url}?{urlencode(self.get_image_url_params(coordinates))}"
def get_html_image_tag_attrs(self):
if self.settings.thumbnailSize:
widget, height = self.settings.thumbnailSize.split("x")
elif self.settings.mapParams.size:
widget, height = self.settings.mapParams.size.split("x")
else:
widget, height = self.DEFAULT_IMAGE_SIZE.split("x")
return {"width": widget, "height": height}
def get_thumbnail_url(self, value):
return f"{self.base_url}?{urlencode(self.get_thumbnail_url_params(value))}"
def get_context(self, name, value, attrs):
context = super().get_context(name, value, attrs)
if value:
context["image_url"] = self.sign_url(self.get_image_url(value))
context["is_magnific_popup_enabled"] = self.settings.enableMagnificPopup
context["image_tag_attrs"] = self.get_html_image_tag_attrs()
if self.settings.thumbnailSize:
context["thumbnail_url"] = self.sign_url(self.get_thumbnail_url(value))
else:
context["thumbnail_url"] = context["image_url"]
return context