The Discourse Solved plugin allows users to accept solutions on topics in designated categories.
Discourse stable, beta or tests-passed
hooks: after_code: - exec: cd: $home/plugins cmd: - mkdir -p plugins - git clone https://github.com/discourse/docker_manager.git - git clone https://github.com/discourse/discourse-solved.git
And then rebuild the container:
./launcher rebuild app
Edit category you wish to enable accepted answers on:
As the OP (topic creator) you will have a button that allows you to accept an answer
Accepted answers are highlighted in the topic list:
Accepted answers are highlighted on the initial topic:
Enable the empty box on unsolved setting to display an empty box next to unsolved topics
It is possible allow users to select solutions on all topics, regardless of the category, by enabling the site setting
allow solved on all topics
You can enable filter dropdown in topic list pages using the site setting
show filter by solved status (Requires Discourse 2.3.0.beta5 or above).
Also you can filter by solved/unsolved topics by adding a parameter to the URL. For example:
These links could be added above a specific category list by following the instructions here
As it stands our plugin system has no clean way of shipping badges and removing them when plugin is removed. While this is being solved you can add badges to your liking via the badge interface.
A badge for first accepted answer:
SELECT p.user_id, p.id post_id, p.updated_at granted_at FROM badge_posts p WHERE p.post_number > 1 AND p.id IN ( SELECT post_id FROM ( SELECT pc.post_id, row_number() OVER (PARTITION BY p1.user_id ORDER BY pc.created_at) as rnum FROM post_custom_fields pc JOIN badge_posts p1 ON p1.id = pc.post_id JOIN topics t1 ON p1.topic_id = t1.id WHERE name = 'is_accepted_answer' AND value IS NOT NULL AND p1.user_id <> t1.user_id AND ( :backfill OR p1.user_id IN ( select user_id from posts where p1.id IN (:post_ids) ) ) ) X WHERE rnum = 1)
For example: Helpdesk badge on Discourse Meta
A badge for 10 accepted answers
SELECT id user_id, current_timestamp granted_at FROM users WHERE id IN ( SELECT p1.user_id FROM post_custom_fields pc JOIN badge_posts p1 ON p1.id = pc.post_id JOIN topics t1 ON p1.topic_id = t1.id WHERE p1.user_id <> t1.user_id AND name = 'is_accepted_answer' AND value IS NOT NULL AND p1.user_id IN ( SELECT user_id FROM posts WHERE :backfill OR p1.id IN (:post_ids) ) GROUP BY p1.user_id HAVING COUNT(*) > 9 )
Data Explorer Queries
To list each individual “solved” event:
SELECT acting_user_id, target_topic_id, target_post_id, created_at FROM user_actions WHERE action_type=15 ORDER BY created_at DESC
To produce a list with stats per-user: (with variable for time interval, defaults to 1 year):
-- [params] -- string :interval = 1 year SELECT ua.acting_user_id, count(case t.user_id when ua.acting_user_id then 1 else null end) as is_op, count(case t.user_id when ua.acting_user_id then null else 1 end) as not_op, count(*) as total FROM user_actions ua LEFT JOIN topics t ON target_topic_id = t.id WHERE action_type=15 AND ua.created_at >= CURRENT_DATE - INTERVAL :interval GROUP BY ua.acting_user_id ORDER BY total DESC
Original spec discussion
This is an official plugin, we plan to ship it to all our customers. Thank you to Western Digital for funding the development of this plugin!