0001-misc-allow-picking-a-custom-view-on-card-cell-58878.patch
combo/apps/wcs/forms.py | ||
---|---|---|
96 | 96 |
initial = kwargs.pop('initial', {}) |
97 | 97 |
initial['with_user'] = not instance.without_user |
98 | 98 |
super().__init__(initial=initial, *args, **kwargs) |
99 |
card_models = get_wcs_options('/api/cards/@list') |
|
99 |
card_models = get_wcs_options('/api/cards/@list', include_custom_views=True)
|
|
100 | 100 |
self.fields['carddef_reference'].widget = forms.Select(choices=card_models) |
101 | 101 |
if self.instance.custom_schema: |
102 | 102 |
self.initial['customize_display'] = True |
combo/apps/wcs/models.py | ||
---|---|---|
782 | 782 |
def card_slug(self): |
783 | 783 |
return self.carddef_reference.split(':')[1] |
784 | 784 | |
785 |
@property |
|
786 |
def card_custom_view(self): |
|
787 |
try: |
|
788 |
return self.carddef_reference.split(':')[2] |
|
789 |
except IndexError: |
|
790 |
return None |
|
791 | ||
785 | 792 |
def get_additional_label(self): |
786 | 793 |
if not self.cached_title: |
787 | 794 |
return |
... | ... | |
948 | 955 | |
949 | 956 |
def populate_cache(): |
950 | 957 |
if self.carddef_reference: |
951 |
wcs_key, card_slug = self.carddef_reference.split(':') |
|
958 |
parts = self.carddef_reference.split(':') |
|
959 |
wcs_key, card_slug = parts[:2] |
|
952 | 960 |
wcs_site = get_wcs_services().get(wcs_key) |
953 | 961 |
card_schema = get_wcs_json(wcs_site, 'api/cards/%s/@schema' % card_slug, log_errors='warn') |
954 | 962 | |
... | ... | |
996 | 1004 | |
997 | 1005 |
def get_card_data(self, card_slug, card_id, context, synchronous=False): |
998 | 1006 |
api_url = '/api/cards/%s/%s/?include-files-content=off' % (card_slug, card_id) |
1007 |
if self.card_custom_view: |
|
1008 |
api_url = '/api/cards/%s/%s/%s/?include-files-content=off' % ( |
|
1009 |
card_slug, |
|
1010 |
self.card_custom_view, |
|
1011 |
card_id, |
|
1012 |
) |
|
1013 |
user = self.get_concerned_user(context) |
|
1014 |
if user: |
|
1015 |
user_name_id = user.get_name_id() |
|
1016 |
if user_name_id: |
|
1017 |
api_url += '&filter-user-uuid=%s' % user_name_id |
|
999 | 1018 |
if not synchronous: |
1000 | 1019 |
synchronous = bool(context.get('synchronous')) |
1001 | 1020 |
wcs_site = get_wcs_services().get(self.wcs_site) |
... | ... | |
1011 | 1030 |
) |
1012 | 1031 |
response.raise_for_status() |
1013 | 1032 |
except RequestException: |
1033 |
if self.card_custom_view: |
|
1034 |
# if there's a custom view consider the error is a 404 because |
|
1035 |
# the card was not found in that view, and mark it so. |
|
1036 |
context['card_not_found'] = True |
|
1014 | 1037 |
return {} |
1015 | 1038 | |
1016 | 1039 |
if response.status_code == 200: |
tests/test_wcs.py | ||
---|---|---|
417 | 417 |
return [d for d in WCS_CARDS_DATA[m_card.group(1)] if d['id'] == int(m_card.group(2))][0] |
418 | 418 |
except IndexError: |
419 | 419 |
return {} |
420 |
m_card = re.match(r'/api/cards/([a-z0-9_]+)/([a-z0-9_]+)/(\d+)/', url) # model/custom-view/id |
|
421 |
if m_card: |
|
422 |
try: |
|
423 |
return [d for d in WCS_CARDS_DATA[m_card.group(1)] if d['id'] == int(m_card.group(3))][0] |
|
424 |
except IndexError: |
|
425 |
return {} |
|
420 | 426 |
if 'api/cards/card_model_1/list/foo' in url: |
421 | 427 |
return WCS_CARDS_CUSTOM_VIEW_DATA |
422 | 428 |
m_list = re.match(r'/api/cards/([a-z0-9_]+)/list', url) |
... | ... | |
1861 | 1867 |
form = form_class(instance=cell) |
1862 | 1868 |
assert form.fields['carddef_reference'].widget.choices == [ |
1863 | 1869 |
('default:card_model_1', 'test : Card Model 1'), |
1870 |
('default:card_model_1:foo', 'test : Card Model 1 - bar'), |
|
1864 | 1871 |
('default:card_model_2', 'test : Card Model 2'), |
1865 | 1872 |
('default:card_model_3', 'test : Card Model 3'), |
1866 | 1873 |
('default:card_a', 'test : Card A'), |
... | ... | |
1869 | 1876 |
('default:card_d', 'test : Card D'), |
1870 | 1877 |
('default:card_e', 'test : Card E'), |
1871 | 1878 |
('other:card_model_1', 'test2 : Card Model 1'), |
1879 |
('other:card_model_1:foo', 'test2 : Card Model 1 - bar'), |
|
1872 | 1880 |
('other:card_model_2', 'test2 : Card Model 2'), |
1873 | 1881 |
('other:card_model_3', 'test2 : Card Model 3'), |
1874 | 1882 |
('other:card_a', 'test2 : Card A'), |
... | ... | |
1892 | 1900 |
assert 'customize_display' not in form.initial |
1893 | 1901 |
assert form.initial['custom_schema'] == {} |
1894 | 1902 | |
1903 |
cell.carddef_reference = 'default:card_model_1:foo' |
|
1904 |
cell.save() |
|
1905 |
form = form_class(instance=cell) |
|
1906 |
assert 'customize_display' in form.fields |
|
1907 |
assert 'custom_schema' in form.fields |
|
1908 |
assert 'customize_display' not in form.initial |
|
1909 |
assert form.initial['custom_schema'] == {} |
|
1910 | ||
1911 |
cell.carddef_reference = 'default:card_model_1' |
|
1912 |
cell.save() |
|
1913 | ||
1895 | 1914 |
cell.custom_schema = {'cells': [{'varname': 'foo', 'display_mode': 'value'}]} |
1896 | 1915 |
cell.save() |
1897 | 1916 |
form = form_class(instance=cell) |
... | ... | |
2475 | 2494 |
for i in range(0, 3): |
2476 | 2495 |
assert '<h2>Foo bar X%sY</h2>' % i in resp |
2477 | 2496 | |
2497 |
# using custom view |
|
2498 |
cell.carddef_reference = 'default:card_model_1:foo' |
|
2499 |
cell.save() |
|
2500 |
result = cell.render(context) |
|
2501 |
assert 'Foo bar X0Y' in result |
|
2502 | ||
2503 |
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get: |
|
2504 |
mock_resp = Response() |
|
2505 |
mock_resp.status_code = 404 |
|
2506 |
requests_get.return_value = mock_resp |
|
2507 |
result = cell.render(context) |
|
2508 | ||
2509 |
# nothing, hide cell |
|
2510 |
assert not result.strip() |
|
2511 | ||
2478 | 2512 | |
2479 | 2513 |
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send) |
2480 | 2514 |
def test_card_cell_render_text_field(mock_send, context): |
2481 |
- |