14 |
14 |
# You should have received a copy of the GNU Affero General Public License
|
15 |
15 |
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
16 |
16 |
|
|
17 |
from collections import OrderedDict
|
17 |
18 |
import hashlib
|
18 |
19 |
import json
|
19 |
20 |
|
... | ... | |
212 |
213 |
path = reverse('visualization-iframe', kwargs={'pk': visualization.pk})
|
213 |
214 |
sig = hashlib.sha1(path + settings.SECRET_KEY).hexdigest()
|
214 |
215 |
path += '?signature=' + sig
|
|
216 |
data_uri = reverse('visualization-json', kwargs={'pk': visualization.pk})
|
215 |
217 |
data.append({
|
216 |
218 |
'name': visualization.name,
|
217 |
219 |
'path': request.build_absolute_uri(path),
|
|
220 |
'data-url': request.build_absolute_uri(data_uri),
|
218 |
221 |
})
|
219 |
222 |
response = HttpResponse(content_type='application/json')
|
220 |
223 |
response.write(json.dumps(data))
|
... | ... | |
263 |
266 |
return Response(geojson)
|
264 |
267 |
|
265 |
268 |
|
|
269 |
class VisualizationJSONView(generics.GenericAPIView):
|
|
270 |
permission_classes = ()
|
|
271 |
queryset = models.Visualization.objects.all()
|
|
272 |
|
|
273 |
def get(self, request, pk, format=None):
|
|
274 |
instance = self.get_object()
|
|
275 |
loop = []
|
|
276 |
all_visualizations = Visualization.from_json(instance.parameters, request=request)
|
|
277 |
for visualization in all_visualizations:
|
|
278 |
drilldowns = visualization.drilldown
|
|
279 |
if len(drilldowns) == 2:
|
|
280 |
x_labels = [x.label for x in visualization.drilldown_x.members]
|
|
281 |
y_labels = [y.label for y in visualization.drilldown_y.members]
|
|
282 |
used_x_labels = OrderedDict()
|
|
283 |
used_y_labels = OrderedDict()
|
|
284 |
default = 0
|
|
285 |
grid = {(x, y): default for x in x_labels for y in y_labels}
|
|
286 |
|
|
287 |
for row in visualization.data():
|
|
288 |
x_label = unicode(row[0]['value'])
|
|
289 |
y_label = unicode(row[1]['value'])
|
|
290 |
used_x_labels[x_label] = True
|
|
291 |
used_y_labels[y_label] = True
|
|
292 |
grid[(x_label, y_label)] = row[2]['value']
|
|
293 |
|
|
294 |
data = []
|
|
295 |
for y in used_y_labels.keys():
|
|
296 |
data.append([grid[(x, y)] for x in used_x_labels.keys()])
|
|
297 |
axis = {
|
|
298 |
'x_labels': [x.strip() for x in used_x_labels.keys()],
|
|
299 |
'y_labels': [x.strip() for x in used_y_labels.keys()]
|
|
300 |
}
|
|
301 |
elif len(drilldowns) == 1:
|
|
302 |
table = list(visualization.data())
|
|
303 |
axis_data = [x[0]['value'].strip() for x in table]
|
|
304 |
data = [x[1]['value'] for x in table]
|
|
305 |
if visualization.drilldown_x:
|
|
306 |
axis = {'x_labels': axis_data}
|
|
307 |
else:
|
|
308 |
axis = {'y_labels': axis_data}
|
|
309 |
elif len(drilldowns) == 0:
|
|
310 |
data = list(list(visualization.data())[0])[0]['value']
|
|
311 |
axis = {}
|
|
312 |
loop.append({'data': data, 'axis': axis})
|
|
313 |
|
|
314 |
if not all_visualizations.loop:
|
|
315 |
data = loop[0]['data']
|
|
316 |
axis = loop[0]['axis']
|
|
317 |
else:
|
|
318 |
axis = loop[0]['axis']
|
|
319 |
axis['loop'] = [x.label for x in all_visualizations.loop.members]
|
|
320 |
data = [x['data'] for x in loop]
|
|
321 |
|
|
322 |
return Response({
|
|
323 |
'data': data,
|
|
324 |
'axis': axis,
|
|
325 |
'format': '1',
|
|
326 |
})
|
|
327 |
|
|
328 |
|
266 |
329 |
warehouse = WarehouseView.as_view()
|
267 |
330 |
cube = CubeView.as_view()
|
268 |
331 |
cube_iframe = xframe_options_exempt(CubeIframeView.as_view())
|
... | ... | |
275 |
338 |
visualization_iframe = xframe_options_exempt(VisualizationIframeView.as_view())
|
276 |
339 |
visualization_geojson = VisualizationGeoJSONView.as_view()
|
277 |
340 |
visualization_ods = VisualizationODSView.as_view()
|
|
341 |
visualization_json = VisualizationJSONView.as_view()
|
278 |
342 |
|
279 |
343 |
cube_iframe.mellon_no_passive = True
|
280 |
344 |
visualization_iframe.mellon_no_passive = True
|