Skip to content

Commit

Permalink
Merge pull request #167 from c-3lab/improve_integration_in_download_m…
Browse files Browse the repository at this point in the history
…odule

downloadモジュールの外部プラグイン連携強化
  • Loading branch information
ryo-ma committed May 16, 2024
2 parents 7b87958 + b539d0e commit 36ff4ec
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 2 deletions.
19 changes: 17 additions & 2 deletions ckanext/feedback/controllers/download.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,28 @@
from ckan.views.resource import download
import logging

import ckan.views.resource as resource
from flask import request

from ckanext.feedback.services.common import config as feedback_config
from ckanext.feedback.services.download.summary import increment_resource_downloads

log = logging.getLogger(__name__)


class DownloadController:
# extend default download function to count when a resource is downloaded
@staticmethod
def extended_download(package_type, id, resource_id, filename=None):
if request.headers.get('Sec-Fetch-Dest') == 'document':
increment_resource_downloads(resource_id)
return download(package_type, id, resource_id, filename=filename)

handler = feedback_config.download_handler()
if not handler:
log.debug('Use default CKAN callback for resource.download')
handler = resource.download
return handler(
package_type=package_type,
id=id,
resource_id=resource_id,
filename=filename,
)
19 changes: 19 additions & 0 deletions ckanext/feedback/services/common/config.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,26 @@
import logging

from ckan.model.group import Group
from ckan.plugins import toolkit
from werkzeug.utils import import_string

from ckanext.feedback.models.session import session

log = logging.getLogger(__name__)

CONFIG_HANDLER_PATH = 'ckan.feedback.download_handler'


def get_organization(org_id=None):
return session.query(Group.name.label('name')).filter(Group.id == org_id).first()


def download_handler():
handler_path = toolkit.config.get(CONFIG_HANDLER_PATH)
if handler_path:
handler = import_string(handler_path, silent=True)
else:
handler = None
log.warning(f'Missing {CONFIG_HANDLER_PATH} config option.')

return handler
24 changes: 24 additions & 0 deletions ckanext/feedback/views/download.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
import logging

import ckan.views.resource as resource
from ckan.common import config
from flask import Blueprint

from ckanext.feedback.controllers.download import DownloadController
from ckanext.feedback.services.common import config as feedback_config
from ckanext.feedback.views.error_handler import add_error_handler

log = logging.getLogger(__name__)

blueprint = Blueprint(
'download',
__name__,
Expand All @@ -22,3 +29,20 @@
@add_error_handler
def get_download_blueprint():
return blueprint


# Handler to Use When Called from External Extensions
def download(package_type, id, resource_id, filename=None):
if config.get('ckan.feedback.downloads.enable', True):
handler = DownloadController.extended_download
else:
handler = feedback_config.download_handler()
if not handler:
log.debug('Use default CKAN callback for resource.download')
handler = resource.download
return handler(
package_type=package_type,
id=id,
resource_id=resource_id,
filename=filename,
)
22 changes: 22 additions & 0 deletions docs/ja/switch_function.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,25 @@

3. テーブル作成(まだの方のみ)
* [feedbackコマンド](./feedback_command.md)```-modules```オプションを参考に**オンにするモジュール**のテーブル作成を行なってください

## downloadモジュールを外部プラグインと連携する場合

リソースがダウンロードされると、downloadモジュールはダウンロード数のカウント処理を行った後、デフォルトのダウンロードコールバックである`ckan.views.resource:download`を呼び出します。</br>
しかし、そのコールバックを他Extensionの関数(例:[googleanalytics](https://github.com/ckan/ckanext-googleanalytics) のdonwload関数)に変更したい場合があります。</br>
その場合ckan.ini内の設定変数ckan.feedback.download_handlerへ対象の関数を指定することで置き換えることも可能です。

例:ckanext-googleanalytics の場合

```bash
ckan.feedback.download_handler = ckanext.googleanalytics.views:download
```

また、逆に外部ハンドラを設定できる他のExtensionのコールバックとしてckanext-feedbackのdownloadモジュールを指定したい場合は、`ckanext.feedback.views.download:download`を使用できます。

例:ckanext-googleanalytics の場合

```bash
googleanalytics.download_handler = ckanext.feedback.views.download:download
```

これらの連携方法は、複数のextensionを使用する際に`/download`などのパスが競合してしまう場合に役立ちます。

0 comments on commit 36ff4ec

Please sign in to comment.