Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 14 additions & 2 deletions ckanext/markdown_view/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,14 @@ def info(self):
'icon': 'file-text-o',
'filterable': False,
'iframed': False,
'schema': {'page_url': [ignore_empty, unicode_safe, url_validator]},
'always_available': True,
'schema': {
'page_url': [unicode_safe, url_validator, url_to_md_file]
},
}

def can_view(self, data_dict):
return data_dict['resource'].get('format', '').lower() in ('text/markdown', 'markdown', 'md')
return data_dict.get('resource', {}).get('format', '').lower() in ('text/markdown', 'markdown', 'md')

def setup_template_variables(self, context, data_dict):
resource = data_dict['resource']
Expand All @@ -44,3 +47,12 @@ def view_template(self, context, data_dict):

def form_template(self, context, data_dict):
return 'markdown_form.html'


def url_to_md_file(value):
if not value:
return None
elif value.endswith('.md'):
return value
else:
raise tk.Invalid(tk._('Url should point to a markdown file (ends with .md)'))
10 changes: 9 additions & 1 deletion ckanext/markdown_view/templates/markdown_view.html
Original file line number Diff line number Diff line change
@@ -1,2 +1,10 @@
{% asset 'md_view_assets/md_view_js' %}
<div id="md_view_html" data-resource-url="{{ resource_view.get('page_url', resource_url) }}"></div>

{% set page_url = resource_view.get('page_url') %}
{% if page_url and page_url.endswith('.md') %}
<div id="md_view_html" data-resource-url="{{ page_url }}"></div>
{% elif resource_url.endswith('.md') %}
<div id="md_view_html" data-resource-url="{{ resource_url }}"></div>
{% else %}
<div class="alert alert-warning" role="alert">This Resource cannot be processed by markdown view.</div>
{% endif %}
105 changes: 94 additions & 11 deletions ckanext/markdown_view/tests/test_view.py
Original file line number Diff line number Diff line change
@@ -1,29 +1,52 @@
# encoding: utf-8
import pytest
import responses
from ckan.tests import factories

import ckan.plugins as p
from ckan.plugins import toolkit as tk
from ckan.logic import ValidationError


def _add_responses_solr_passthru():
responses.add_passthru(tk.config.get('solr_url'))
@pytest.mark.usefixtures('clean_db', 'clean_index', 'with_plugins', 'with_request_context')
@pytest.mark.ckan_config('ckan.plugins', 'markdown_view')
def test_view_create_for_md_resource(app):
org = factories.Organization()
dataset = factories.Dataset(owner_org=org['id'],)
sysadmin = factories.Sysadmin()
resource = factories.Resource(
package_id=dataset['id'],
url='http://some.website.md',
format='md'
)

resource_view = factories.ResourceView(
resource_id=resource['id'],
view_type='Markdown'
)

response = p.toolkit.get_action('resource_view_show')(
{'user': sysadmin.get('name')},
{'id': resource_view.get('id')}
)

assert response.get('view_type') == 'Markdown'
env = {"REMOTE_USER": sysadmin['name'].encode('ascii')}
resp = app.get(f"/dataset/{dataset['id']}/resource/{resource['id']}?view_id={resource_view['id']}",
extra_environ=env)

assert resp.status_code == 200
assert f'<div id="md_view_html" data-resource-url="{resource["url"]}"></div>' in resp.body


@pytest.mark.usefixtures('clean_db', 'clean_index', 'with_plugins', 'with_request_context')
@pytest.mark.ckan_config('ckan.plugins', 'datastore markdown_view')
def test_view_create():
@pytest.mark.ckan_config('ckan.plugins', 'markdown_view')
def test_view_create_for_csv_resource(app):
org = factories.Organization()
dataset = factories.Dataset(owner_org=org['id'],)
sysadmin = factories.Sysadmin()
resource = factories.Resource(
package_id=dataset['id'],
url='http://some.website.html',)

p.toolkit.get_action('datastore_create')(
{'user': sysadmin.get('name')},
{'resource_id': resource.get('id'), 'force': True}
url='http://some.website.csv',
format='csv'
)

resource_view = factories.ResourceView(
Expand All @@ -37,3 +60,63 @@ def test_view_create():
)

assert response.get('view_type') == 'Markdown'

env = {"REMOTE_USER": sysadmin['name'].encode('ascii')}
resp = app.get(f"/dataset/{dataset['id']}/resource/{resource['id']}?view_id={resource_view['id']}", extra_environ=env)

assert resp.status_code == 200
assert 'This Resource cannot be processed by markdown view.' in resp.body


@pytest.mark.usefixtures('clean_db', 'clean_index', 'with_plugins', 'with_request_context')
@pytest.mark.ckan_config('ckan.plugins', 'markdown_view')
def test_view_create_for_csv_resource_with_correct_page_url(app):
org = factories.Organization()
dataset = factories.Dataset(owner_org=org['id'],)
sysadmin = factories.Sysadmin()
resource = factories.Resource(
package_id=dataset['id'],
url='http://some.website.csv',
format='csv'
)
page_url = 'http://some.website.md'

resource_view = factories.ResourceView(
resource_id=resource['id'],
view_type='Markdown',
page_url=page_url,
)

response = p.toolkit.get_action('resource_view_show')(
{'user': sysadmin.get('name')},
{'id': resource_view.get('id')}
)

assert response.get('view_type') == 'Markdown'

env = {"REMOTE_USER": sysadmin['name'].encode('ascii')}
resp = app.get(f"/dataset/{dataset['id']}/resource/{resource['id']}?view_id={resource_view['id']}",
extra_environ=env)

assert resp.status_code == 200
assert f'<div id="md_view_html" data-resource-url="{page_url}"></div>' in resp.body


@pytest.mark.usefixtures('clean_db', 'clean_index', 'with_plugins', 'with_request_context')
@pytest.mark.ckan_config('ckan.plugins', 'markdown_view')
def test_view_create_for_csv_resource_with_incorrect_page_url(app):
org = factories.Organization()
dataset = factories.Dataset(owner_org=org['id'], )
resource = factories.Resource(
package_id=dataset['id'],
url='http://some.website.csv',
format='csv'
)
page_url = 'http://some.website.html'

with pytest.raises(ValidationError):
factories.ResourceView(
resource_id=resource['id'],
view_type='Markdown',
page_url=page_url,
)