[![Tests](https://github.com/DataShades/ckanext-comments/actions/workflows/test.yml/badge.svg)](https://github.com/DataShades/ckanext-comments/actions/workflows/test.yml)
# ckanext-comments
Add comment-trees to CKAN pages.
This plugins provides comment threads linked to any of the main CKAN entities:
* datasets
* resources
* groups
* organizations
* users.
All the features are API-first, so anything you can do via UI, can be done via API.
No changes to the WebUI are done by default. One have to include a snippet into
Jinja2 template in order to show the comments on a page.
```jinja2
{# subject_type := package | group | resource | user #}
{% snippet 'comments/snippets/thread.html', subject_id=pkg.id, subject_type='package' %}
```
:info: For the datasets it also can be achieved by enabling
`ckanext.comments.enable_default_dataset_comments` option.
## Requirements
* python >= 3.7
* CKAN >= 2.9
## Installation
To install ckanext-comments:
1. Install python package
```sh
pip install ckanext-comments
```
1. Add `comments` to the `ckan.plugins` setting in your CKAN
config file
1. Apply database migrations
```sh
ckan db upgrade -p comments
```
1. Add `cooments/snippets/thread.html` to your `package/read.html` template, like this:
```jinja2
{% ckan_extends %}
{% block primary_content_inner %}
{{ super() }}
{% snippet 'comments/snippets/thread.html', subject_id=pkg.id, subject_type='package' %}
{% endblock primary_content_inner %}
```
## Config settings
```ini
# Require comment approval in order to make it visible
# (optional, default: true).
ckanext.comments.require_approval = false
# Editor(admin) can edit draft comments
# (optional, default: true).
ckanext.comments.draft_edits = true
# Author can edit own draft comments
# (optional, default: true).
ckanext.comments.draft_edits_by_author = false
# Editor(admin) can edit approved comments
# (optional, default: false).
ckanext.comments.approved_edits = false
# Author can edit own approved comments
# (optional, default: false).
ckanext.comments.approved_edits_by_author = false
# Number of reply levels that are shown on mobile layout
# (optional, default: 3).
ckanext.comments.mobile_depth_threshold = 3
# Include default thread implementation on the dataset page
# (optional, default: false).
ckanext.comments.enable_default_dataset_comments = true
# Register custom getter for a subject by providing a path to a function
# ckanext.comments.subject.{self.subject_type}_getter = path
# The function must accept an ID and return a model object
ckanext.comments.subject.question_getter = ckanext.msf_ask_question.model.question_getter
```
## API
### `comments_thread_create`
Create a thread for the subject.
Args:
* subject_id(str): unique ID of the commented entity
* subject_type(str:package|resource|user|group): type of the commented entity
### `comments_thread_show`
Show the subject's thread.
Args:
* subject_id(str): unique ID of the commented entity
* subject_type(str:package|resource|user|group): type of the commented entity
* init_missing(bool, optional): return an empty thread instead of 404
* include_comments(bool, optional): show comments from the thread
* include_author(bool, optional): show authors of the comments
* combine_comments(bool, optional): combine comments into a tree-structure
* after_date(str:ISO date, optional): show comments only since the given date
### `comments_thread_delete`
Delete the thread.
Args:
* id(str): ID of the thread
### `comments_comment_create`
Add a comment to the thread.
Args:
* subject_id(str): unique ID of the commented entity
* subject_type(str:package|resource|user|group): type of the commented entity
* content(str): comment's message
* reply_to_id(str, optional): reply to the existing comment
* create_thread(bool, optional): create a new thread if it doesn't exist yet
### `comments_comment_show`
Show the details of the comment
Args:
* id(str): ID of the comment
### `comments_comment_approve`
Approve draft comment
Args:
* id(str): ID of the comment
### `comments_comment_delete`
Remove existing comment
Args:
* id(str): ID of the comment
### `comments_comment_update`
Update existing comment
Args:
* id(str): ID of the comment
* content(str): comment's message
## Tests
To run the tests, do:
```sh
pytest
```
## License
[AGPL](https://www.gnu.org/licenses/agpl-3.0.en.html)
Raw data
{
"_id": null,
"home_page": "https://github.com/DataShades/ckanext-comments",
"name": "ckanext-comments",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": "",
"keywords": "CKAN",
"author": "Sergey Motornyuk",
"author_email": "sergey.motornyuk@linkdigital.com.au",
"download_url": "https://files.pythonhosted.org/packages/48/04/54b8d816651fb6ab85d8e9c6bcea92ad80c6a4ff7c64be01e51cbea5a0d7/ckanext-comments-0.3.1.tar.gz",
"platform": null,
"description": "[![Tests](https://github.com/DataShades/ckanext-comments/actions/workflows/test.yml/badge.svg)](https://github.com/DataShades/ckanext-comments/actions/workflows/test.yml)\n\n# ckanext-comments\n\nAdd comment-trees to CKAN pages.\n\nThis plugins provides comment threads linked to any of the main CKAN entities:\n\n* datasets\n* resources\n* groups\n* organizations\n* users.\n\nAll the features are API-first, so anything you can do via UI, can be done via API.\n\nNo changes to the WebUI are done by default. One have to include a snippet into\nJinja2 template in order to show the comments on a page.\n```jinja2\n{# subject_type := package | group | resource | user #}\n{% snippet 'comments/snippets/thread.html', subject_id=pkg.id, subject_type='package' %}\n```\n\n:info: For the datasets it also can be achieved by enabling\n`ckanext.comments.enable_default_dataset_comments` option.\n\n## Requirements\n\n* python >= 3.7\n* CKAN >= 2.9\n\n## Installation\n\nTo install ckanext-comments:\n\n1. Install python package\n ```sh\n pip install ckanext-comments\n ```\n\n1. Add `comments` to the `ckan.plugins` setting in your CKAN\n config file\n\n1. Apply database migrations\n ```sh\n ckan db upgrade -p comments\n ```\n\n1. Add `cooments/snippets/thread.html` to your `package/read.html` template, like this:\n ```jinja2\n {% ckan_extends %}\n\n {% block primary_content_inner %}\n {{ super() }}\n {% snippet 'comments/snippets/thread.html', subject_id=pkg.id, subject_type='package' %}\n {% endblock primary_content_inner %}\n ```\n\n## Config settings\n```ini\n\n# Require comment approval in order to make it visible\n# (optional, default: true).\nckanext.comments.require_approval = false\n\n# Editor(admin) can edit draft comments\n# (optional, default: true).\nckanext.comments.draft_edits = true\n\n# Author can edit own draft comments\n# (optional, default: true).\nckanext.comments.draft_edits_by_author = false\n\n# Editor(admin) can edit approved comments\n# (optional, default: false).\nckanext.comments.approved_edits = false\n\n# Author can edit own approved comments\n# (optional, default: false).\nckanext.comments.approved_edits_by_author = false\n\n# Number of reply levels that are shown on mobile layout\n# (optional, default: 3).\nckanext.comments.mobile_depth_threshold = 3\n\n# Include default thread implementation on the dataset page\n# (optional, default: false).\nckanext.comments.enable_default_dataset_comments = true\n\n# Register custom getter for a subject by providing a path to a function\n# ckanext.comments.subject.{self.subject_type}_getter = path\n# The function must accept an ID and return a model object\nckanext.comments.subject.question_getter = ckanext.msf_ask_question.model.question_getter\n```\n\n\n\n## API\n\n### `comments_thread_create`\nCreate a thread for the subject.\n\nArgs:\n* subject_id(str): unique ID of the commented entity\n* subject_type(str:package|resource|user|group): type of the commented entity\n\n### `comments_thread_show`\nShow the subject's thread.\n\nArgs:\n* subject_id(str): unique ID of the commented entity\n* subject_type(str:package|resource|user|group): type of the commented entity\n* init_missing(bool, optional): return an empty thread instead of 404\n* include_comments(bool, optional): show comments from the thread\n* include_author(bool, optional): show authors of the comments\n* combine_comments(bool, optional): combine comments into a tree-structure\n* after_date(str:ISO date, optional): show comments only since the given date\n\n### `comments_thread_delete`\nDelete the thread.\n\nArgs:\n* id(str): ID of the thread\n\n### `comments_comment_create`\nAdd a comment to the thread.\n\nArgs:\n* subject_id(str): unique ID of the commented entity\n* subject_type(str:package|resource|user|group): type of the commented entity\n* content(str): comment's message\n* reply_to_id(str, optional): reply to the existing comment\n* create_thread(bool, optional): create a new thread if it doesn't exist yet\n\n### `comments_comment_show`\nShow the details of the comment\n\nArgs:\n* id(str): ID of the comment\n\n### `comments_comment_approve`\nApprove draft comment\n\nArgs:\n* id(str): ID of the comment\n\n### `comments_comment_delete`\nRemove existing comment\n\nArgs:\n* id(str): ID of the comment\n\n### `comments_comment_update`\nUpdate existing comment\n\nArgs:\n* id(str): ID of the comment\n* content(str): comment's message\n\n\n## Tests\n\nTo run the tests, do:\n```sh\npytest\n```\n\n\n## License\n\n[AGPL](https://www.gnu.org/licenses/agpl-3.0.en.html)\n",
"bugtrack_url": null,
"license": "AGPL",
"summary": "",
"version": "0.3.1",
"project_urls": {
"Homepage": "https://github.com/DataShades/ckanext-comments"
},
"split_keywords": [
"ckan"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "7b311a12c5a4c7ef2fb15a8a3c0b5f39bcd5ef043508ad6d8f66dde80822d276",
"md5": "03f7e5a899c22da6c89a7bf17b975b7b",
"sha256": "f247fb924cf87e354185c129615e4a0996590b1ab3abd83ee588eeb498a83066"
},
"downloads": -1,
"filename": "ckanext_comments-0.3.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "03f7e5a899c22da6c89a7bf17b975b7b",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 47205,
"upload_time": "2023-10-25T11:34:44",
"upload_time_iso_8601": "2023-10-25T11:34:44.996685Z",
"url": "https://files.pythonhosted.org/packages/7b/31/1a12c5a4c7ef2fb15a8a3c0b5f39bcd5ef043508ad6d8f66dde80822d276/ckanext_comments-0.3.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "480454b8d816651fb6ab85d8e9c6bcea92ad80c6a4ff7c64be01e51cbea5a0d7",
"md5": "f642c3ee1105f270a43df55a5474f82f",
"sha256": "a166b083f9a16de0a6e3b0e3b6853cececcd769366963edf03b1e02d92bf85d8"
},
"downloads": -1,
"filename": "ckanext-comments-0.3.1.tar.gz",
"has_sig": false,
"md5_digest": "f642c3ee1105f270a43df55a5474f82f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 37567,
"upload_time": "2023-10-25T11:34:47",
"upload_time_iso_8601": "2023-10-25T11:34:47.145999Z",
"url": "https://files.pythonhosted.org/packages/48/04/54b8d816651fb6ab85d8e9c6bcea92ad80c6a4ff7c64be01e51cbea5a0d7/ckanext-comments-0.3.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-10-25 11:34:47",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "DataShades",
"github_project": "ckanext-comments",
"travis_ci": false,
"coveralls": true,
"github_actions": true,
"requirements": [],
"lcname": "ckanext-comments"
}