Skip to content

Commit f4c2aec

Browse files
committed
[LIB-802] - Add possibility to use template on DataEndpoint - on get()
1 parent a0997f4 commit f4c2aec

File tree

2 files changed

+111
-4
lines changed

2 files changed

+111
-4
lines changed

syncano/models/data_views.py

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import json
22

3+
import six
4+
from syncano.exceptions import SyncanoValueError
5+
from syncano.models.incentives import ResponseTemplate
6+
37
from . import fields
48
from .base import Model, Object
59
from .instances import Instance
@@ -80,7 +84,7 @@ def clear_cache(self):
8084
connection = self._get_connection()
8185
return connection.request(http_method, endpoint)
8286

83-
def get(self, cache_key=None, **kwargs):
87+
def get(self, cache_key=None, response_template=None, **kwargs):
8488
connection = self._get_connection()
8589
properties = self.get_endpoint_data()
8690
query = Object.please._build_query(query_data=kwargs, class_name=self.class_name)
@@ -98,8 +102,28 @@ def get(self, cache_key=None, **kwargs):
98102
if params:
99103
kwargs = {'params': params}
100104

105+
if response_template:
106+
template_name = self._get_response_template_name(response_template)
107+
kwargs['headers'] = {
108+
'X-TEMPLATE-RESPONSE': template_name
109+
}
110+
101111
while endpoint is not None:
102112
response = connection.request(http_method, endpoint, **kwargs)
103-
endpoint = response.get('next')
104-
for obj in response['objects']:
105-
yield obj
113+
if isinstance(response, six.string_types):
114+
endpoint = None
115+
yield response
116+
else:
117+
endpoint = response.get('next')
118+
for obj in response['objects']:
119+
yield obj
120+
121+
def _get_response_template_name(self, response_template):
122+
name = response_template
123+
if isinstance(response_template, ResponseTemplate):
124+
name = response_template.name
125+
if not isinstance(name, six.string_types):
126+
raise SyncanoValueError(
127+
'Invalid response_template. Must be template\'s name or ResponseTemplate object.'
128+
)
129+
return name
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
# -*- coding: utf-8 -*-
2+
import re
3+
4+
from syncano.models import Class, DataEndpoint, Object, ResponseTemplate
5+
from tests.integration_test import InstanceMixin, IntegrationTest
6+
7+
8+
class DataEndpointTest(InstanceMixin, IntegrationTest):
9+
10+
schema = [
11+
{
12+
'name': 'title',
13+
'type': 'string',
14+
'order_index': True,
15+
'filter_index': True
16+
17+
}
18+
]
19+
20+
template_content = '''
21+
{% if action == 'list' %}
22+
{% set objects = response.objects %}
23+
{% elif action == 'retrieve' %}
24+
{% set objects = [response] %}
25+
{% else %}
26+
{% set objects = [] %}
27+
{% endif %}
28+
{% if objects %}
29+
<table{% if table_classes %} class="{{ table_classes }}"{% endif %}>
30+
31+
<tr{% if tr_header_classes %} class="{{ tr_header_classes }}"{% endif %}>
32+
{% for key in objects[0] if key not in fields_to_skip %}
33+
<th{% if th_header_classes %} class="{{ th_header_classes }}"{% endif %}>{{ key }}</th>
34+
{% endfor %}
35+
</tr>
36+
{% for object in objects %}
37+
<tr{% if tr_row_classes %} class="{{ tr_row_classes }}"{% endif %}>
38+
{% for key, value in object.iteritems() if key not in fields_to_skip %}
39+
<td{% if td_row_classes %} class="{{ td_row_classes }}"{% endif %}>{{ value }}</td>
40+
{% endfor %}
41+
</tr>
42+
{% endfor %}
43+
</table>
44+
{% endif %}
45+
'''
46+
47+
template_context = {
48+
"tr_header_classes": "",
49+
"th_header_classes": "",
50+
"tr_row_classes": "",
51+
"table_classes": "",
52+
"td_row_classes": "",
53+
"fields_to_skip": [
54+
"id",
55+
"channel",
56+
"channel_room",
57+
"group",
58+
"links",
59+
"group_permissions",
60+
"owner_permissions",
61+
"other_permissions",
62+
"owner",
63+
"revision",
64+
"updated_at",
65+
"created_at"
66+
]
67+
}
68+
69+
def test_template_response(self):
70+
Class(name='test_class', schema=self.schema).save()
71+
Object(class_name='test_class', title='test_title').save()
72+
template = ResponseTemplate(
73+
name='test_template',
74+
content=self.template_content,
75+
content_type='text/html',
76+
context=self.template_context
77+
).save()
78+
data_endpoint = DataEndpoint(name='test_endpoint', class_name='test_class').save()
79+
80+
response = list(data_endpoint.get(response_template=template))
81+
self.assertEqual(len(response), 1, 'Data endpoint should return 1 element if queried with response_template.')
82+
data = re.sub('[\s+]', '', response[0])
83+
self.assertEqual(data, '<table><tr><th>title</th></tr><tr><td>test_title</td></tr></table>')

0 commit comments

Comments
 (0)