diff --git a/ckanext/markdown_view/plugin.py b/ckanext/markdown_view/plugin.py
index 81a5cd3..167900c 100644
--- a/ckanext/markdown_view/plugin.py
+++ b/ckanext/markdown_view/plugin.py
@@ -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']
@@ -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)'))
diff --git a/ckanext/markdown_view/templates/markdown_view.html b/ckanext/markdown_view/templates/markdown_view.html
index 0ae860c..aa886b5 100644
--- a/ckanext/markdown_view/templates/markdown_view.html
+++ b/ckanext/markdown_view/templates/markdown_view.html
@@ -1,2 +1,10 @@
{% asset 'md_view_assets/md_view_js' %}
-
+
+{% set page_url = resource_view.get('page_url') %}
+{% if page_url and page_url.endswith('.md') %}
+
+{% elif resource_url.endswith('.md') %}
+
+{% else %}
+ This Resource cannot be processed by markdown view.
+{% endif %}
diff --git a/ckanext/markdown_view/tests/test_view.py b/ckanext/markdown_view/tests/test_view.py
index abac3ea..831d550 100644
--- a/ckanext/markdown_view/tests/test_view.py
+++ b/ckanext/markdown_view/tests/test_view.py
@@ -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'' 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(
@@ -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'' 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,
+ )