What is the bug reporter badge?

Oh, sorry, I didn’t look at the context the query was being used in. You’ve currently got something like this:

WHERE category_id = (
  SELECT id FROM categories
  WHERE name IN ('OAuth', 'Developers')
)

Since the inner query is returning multiple rows, you need to change the outer WHERE clause to:

WHERE category_id IN (
  SELECT id FROM categories
  WHERE name IN ('OAuth', 'Developers')
)
1 « J'aime »

Success, thanks!

Would this be too much to run whenever a user acts on a post?

Could it easily be modified to award a badge when a post is ‘marked as a solution’ rather than liked?

edit: Actually, that’s giving me: ‘Contract violation: Query triggers on posts, but does not reference the ‘:post_ids’ array’

I can probably live with update daily though. ¯_(ツ)_/¯

@sam, we’re looking on implementing a similar badge over at Stonehearth. Can you share the current SQL used, as yours is 2+ years old, and there are numerous different versions in this topic?

1 « J'aime »

Bug Reporter

SELECT distinct p.user_id, p.created_at granted_at, p.id post_id
FROM badge_posts p
JOIN topics t ON t.id = p.topic_id
JOIN post_actions pa ON pa.post_id = p.id AND 
      post_action_type_id = (
                SELECT id FROM post_action_types WHERE name_key = 'like'
       ) AND 
       pa.user_id IN (
           SELECT gu.user_id
           FROM group_users gu
           WHERE gu.group_id = ( SELECT id FROM groups WHERE name ilike 'team' ) 
       )
WHERE category_id = (
  SELECT id FROM categories WHERE name ilike 'bug'
) AND p.post_number = 1

Tech Support

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 
            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
)

Tester

SELECT p.user_id, MIN(p.created_at) granted_at
  FROM posts p
  JOIN topics t ON t.id = p.topic_id
 WHERE t.category_id = (SELECT id FROM categories WHERE name ILIKE 'bug')
   AND p.post_number = 1
   AND EXISTS (
         SELECT 1
           FROM post_actions pa
          WHERE pa.post_id = p.id 
            AND pa.post_action_type_id = (SELECT id FROM post_action_types WHERE name_key = 'like') 
            AND pa.user_id IN (SELECT user_id FROM group_users WHERE group_id = (SELECT id FROM groups WHERE name ILIKE 'team'))
       )
 GROUP BY p.user_id
HAVING COUNT(*) >= 10

Senior Tester

SELECT p.user_id, MIN(p.created_at) granted_at
  FROM posts p
  JOIN topics t ON t.id = p.topic_id
 WHERE t.category_id = (SELECT id FROM categories WHERE name ILIKE 'bug')
   AND p.post_number = 1
   AND EXISTS (
         SELECT 1
           FROM post_actions pa
          WHERE pa.post_id = p.id 
            AND pa.post_action_type_id = (SELECT id FROM post_action_types WHERE name_key = 'like') 
            AND pa.user_id IN (SELECT user_id FROM group_users WHERE group_id = (SELECT id FROM groups WHERE name ILIKE 'team'))
       )
 GROUP BY p.user_id
HAVING COUNT(*) >= 20
12 « J'aime »

I was just awarded the Tester badge, but I only have 2 Bug Reporter badges. The text of the Tester badge says this:

grafik

Reported 10 bugs that were liked by the Discourse team

I just checked: One of my bug reports has 10 :heart: likes, but not even those are exclusively by Discourse Team members.

Something seems to be wrong with the badge… :thinking:

2 « J'aime »

There are several old bugs that were deleted as not of future historical interest, but the total isn’t 10.

2 « J'aime »

Thanks, I fixed the queries and updated @sam’s post.

7 « J'aime »

@sam où dois-je exécuter ce code pour que ce badge soit attribué, et devons-nous créer une catégorie pour les rapports de bugs ?

SELECT p.user_id, MIN(p.created_at) granted_at
  FROM posts p
  JOIN topics t ON t.id = p.topic_id
 WHERE t.category_id = (SELECT id FROM categories WHERE name ILIKE 'bug')
   AND p.post_number = 1
   AND EXISTS (
         SELECT 1
           FROM post_actions pa
          WHERE pa.post_id = p.id 
            AND pa.post_action_type_id = (SELECT id FROM post_action_types WHERE name_key = 'like') 
            AND pa.user_id IN (SELECT user_id FROM group_users WHERE group_id = (SELECT id FROM groups WHERE name ILIKE 'team'))
       )
 GROUP BY p.user_id
HAVING COUNT(*) >= 20

Ce badge est spécifique à meta.

Ahhh, nous ne pouvons pas l’utiliser dans le discours ?

1 « J'aime »

Oui, nous pouvons. Mais les noms de catégorie et de groupe doivent être modifiés pour être valides.

3 « J'aime »

Compris, comme cacher l’astuce de catégorie, mais ici je n’ai pas reconnu où exécuter le code sam ; depuis le panneau d’administration ou à l’intérieur du conteneur rails c ?

1 « J'aime »

Vous ne trouvez peut-être pas où ajouter le code car la modification du SQL des badges est maintenant désactivée par défaut. Voir ici :

Je pense donc que le processus serait de :

  1. Activer la modification du SQL des badges (instructions dans le sujet lié)
  2. Créer un nouveau badge dans Admin > Badges (ou modifier un badge existant si vous l’avez déjà créé)
  3. Ajouter votre SQL au badge et enregistrer
  4. Désactiver la modification du SQL des badges

Ensuite, si vous ne l’avez pas déjà fait, d’après les valeurs du SQL que vous avez posté :

  1. Créez une catégorie appelée « bug »
  2. Créez un groupe d’utilisateurs appelé « team »
  3. Ajoutez les utilisateurs qui pourront accepter les rapports de bugs à « team »
5 « J'aime »

Ceci pourrait être une amélioration pour la requête :slight_smile:

WITH LikeActionTypes AS (
    SELECT id 
    FROM post_action_types 
    WHERE name_key = 'like'
),

DiscourseGroup AS (
    SELECT id 
    FROM groups 
    WHERE name ILIKE 'discourse'
),

BugCategory AS (
    SELECT id 
    FROM categories 
    WHERE name ILIKE 'bug'
)

SELECT 
    p.user_id, 
    MIN(p.created_at) AS granted_at, 
    MIN(p.id) AS post_id
FROM badge_posts AS p
LEFT JOIN topics AS t ON t.id = p.topic_id
LEFT JOIN post_actions AS pa ON pa.post_id = p.id 
LEFT JOIN LikeActionTypes AS lat ON pa.post_action_type_id = lat.id
LEFT JOIN group_users AS gu ON pa.user_id = gu.user_id
LEFT JOIN DiscourseGroup AS dg ON gu.group_id = dg.id
LEFT JOIN BugCategory AS bc ON t.category_id = bc.id
WHERE p.post_number = 1
GROUP BY p.user_id;
2 « J'aime »