Projet

Général

Profil

0001-api-add-json-view-of-visualization-data-26847.patch

Frédéric Péters, 05 mars 2019 21:16

Télécharger (6,76 ko)

Voir les différences:

Subject: [PATCH] api: add json view of visualization data (#26847)

 bijoe/visualization/urls.py  |  1 +
 bijoe/visualization/views.py | 64 ++++++++++++++++++++++++++++++++++++
 tests/test_views.py          | 27 +++++++++++++++
 3 files changed, 92 insertions(+)
bijoe/visualization/urls.py
30 30
    url(r'warehouse/(?P<warehouse>[^/]*)/(?P<cube>[^/]*)/save/$',
31 31
        views.create_visualization, name='create-visualization'),
32 32
    url(r'(?P<pk>\d+)/$', views.visualization, name='visualization'),
33
    url(r'(?P<pk>\d+)/json/$', views.visualization_json, name='visualization-json'),
33 34
    url(r'(?P<pk>\d+)/geojson/$', views.visualization_geojson, name='visualization-geojson'),
34 35
    url(r'(?P<pk>\d+)/iframe/$', views.visualization_iframe, name='visualization-iframe'),
35 36
    url(r'(?P<pk>\d+)/ods/$', views.visualization_ods, name='visualization-ods'),
bijoe/visualization/views.py
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
tests/test_views.py
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 django.core.urlresolvers import reverse
18

  
19
from bijoe.visualization.models import Visualization
20

  
17 21
from utils import login
18 22

  
19 23

  
......
29 33
    assert len(resp.json) == 1
30 34
    assert resp.json[0]['slug'] == 'statistics'
31 35
    app.get('/', status=200)
36

  
37

  
38
def test_visualization_json_api(schema1, app, admin):
39
    visualization = Visualization(
40
            name='test',
41
            parameters={
42
                'cube': 'facts1',
43
                'warehouse': 'schema1',
44
                'measure': 'simple_count',
45
                'representation': 'table',
46
                'loop': '',
47
                'filters': {},
48
                'drilldown_x': 'date__yearmonth'})
49
    visualization.save()
50

  
51
    login(app, admin)
52
    resp = app.get(reverse('visualization-json', kwargs={'pk': visualization.id}))
53
    # values from test_schem1/test_yearmonth_drilldown
54
    assert resp.json == {
55
        'axis': {'x_labels': ['01/2017', '02/2017', '03/2017', '04/2017', '05/2017', '06/2017', '07/2017', '08/2017']},
56
        'data': [10, 1, 1, 1, 1, 1, 1, 1],
57
        'format': '1'
58
    }
32
-