Package: ckanext-comments
ckanext-commentsAdd comment-trees to CKAN pages.This plugins provides comment threads linked to any of the main CKAN entities:datasetsresourcesgroupsorganizationsusers.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.{# 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 enablingckanext.comments.enable_default_dataset_commentsoption.Requirementspython >= 3.7CKAN >= 2.9InstallationTo install ckanext-comments:Install python packagepipinstallckanext-commentsAddcommentsto theckan.pluginssetting in your CKAN
config fileApply database migrationsckandbupgrade-pcommentsAddcooments/snippets/thread.htmlto yourpackage/read.htmltemplate, like this:{% 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# 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 objectckanext.comments.subject.question_getter=ckanext.msf_ask_question.model.question_getterAPIcomments_thread_createCreate a thread for the subject.Args:subject_id(str): unique ID of the commented entitysubject_type(str:package|resource|user|group): type of the commented entitycomments_thread_showShow the subject's thread.Args:subject_id(str): unique ID of the commented entitysubject_type(str:package|resource|user|group): type of the commented entityinit_missing(bool, optional): return an empty thread instead of 404include_comments(bool, optional): show comments from the threadinclude_author(bool, optional): show authors of the commentscombine_comments(bool, optional): combine comments into a tree-structureafter_date(str:ISO date, optional): show comments only since the given datecomments_thread_deleteDelete the thread.Args:id(str): ID of the threadcomments_comment_createAdd a comment to the thread.Args:subject_id(str): unique ID of the commented entitysubject_type(str:package|resource|user|group): type of the commented entitycontent(str): comment's messagereply_to_id(str, optional): reply to the existing commentcreate_thread(bool, optional): create a new thread if it doesn't exist yetcomments_comment_showShow the details of the commentArgs:id(str): ID of the commentcomments_comment_approveApprove draft commentArgs:id(str): ID of the commentcomments_comment_deleteRemove existing commentArgs:id(str): ID of the commentcomments_comment_updateUpdate existing commentArgs:id(str): ID of the commentcontent(str): comment's messageTestsTo run the tests, do:pytestLicenseAGPL