# Выдать пользовательский значок после прочтения Условий использования

**URL:** https://meta.discourse.org/t/grant-custom-badge-upon-reading-tos/368259
**Category:** Data & reporting
**Tags:** sql-triggered-badge
**Created:** [30.Май.2025 15:10:18 UTC](https://meta.discourse.org/t/grant-custom-badge-upon-reading-tos/368259 "2025-05-30T15:10:18Z")
**Posts on this page:** 9
**Page:** 1

<div class="post-metadata">

### Author: ![TempAccount](https://avatars.discourse-cdn.com/v4/letter/t/a9a28c/32.png) [@TempAccount](https://meta.discourse.org/u/TempAccount)
#### Post date: [30.Май.2025 15:10:18 UTC](https://meta.discourse.org/t/grant-custom-badge-upon-reading-tos/368259/1 "2025-05-30T15:10:18Z")

</div>

Продолжаем обсуждение из темы [Как работают значки «Прочитал правила»?](https://meta.discourse.org/t/how-does-the-reader-read-guideline-badges-work/26264):

Как можно адаптировать это для пользовательского значка, который будет автоматически выдаваться пользователю после прочтения условий?

* * *

### Найдены ресурсы:

Это для значка «Прочитал правила»:

> [@The default badge queries](https://meta.discourse.org/t/the-default-badge-queries/276812#p-1354278-h-3rd_place_medal-read-guidelines-25):
>
> This is a reference guide for the SQL queries of the default badges, and their trigger information (where available). Core Badges 2nd_place_medal Anniversary (This one has some extra backend magic in to choose the dates, but I’ll include it anyway) start\_date = start\_date.iso8601(6) end\_date = end\_date.iso8601(6) SELECT u.id FROM users AS u JOIN posts AS p ON p.user\_id = u.id JOIN topics AS t ON p.topic\_id = t.id WHERE u.id \> 0 AND u.acti…

а также это… хотя я не знаю, куда вставлять SQL-запрос для значка:

> [@Badge for reading a topic?](https://meta.discourse.org/t/badge-for-reading-a-topic/281534/2):
>
> I think this should be possible with something like: SELECT user\_id, CURRENT\_TIMESTAMP AS granted\_at FROM topic\_users WHERE topic\_id = 281534 AND total\_msecs\_viewed/60000 \>= 5 -- min number of minutes viewed

…а также возникает основной вопрос: считается ли страница `/tos` темой, если пользователи могут видеть её только через вкладки:

 ![image](https://global.discourse-cdn.com/meta/original/4X/5/4/7/547c2e6c492dfc6f8325a876d41b0add095a18b7.png)

---

<div class="post-metadata">

### Author: ![NateDhaliwal](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/natedhaliwal/32/313494_2.png) [@NateDhaliwal](https://meta.discourse.org/u/NateDhaliwal)
#### Post date: [30.Май.2025 15:12:23 UTC](https://meta.discourse.org/t/grant-custom-badge-upon-reading-tos/368259/2 "2025-05-30T15:12:23Z")

</div>

> [@TempAccount](#):
>
> Не знаю, куда вставить SQL-запрос для значка.

Это поможет?

> [@Creating triggered custom badge queries](https://meta.discourse.org/t/creating-triggered-custom-badge-queries/19336):
>
> bookmark This guide explains how to create triggered custom badge queries in Discourse, including the types of badges, constraints for triggered badges, and an example query. person_raising_hand Required user level: Administrator warning This feature is disabled by default. To enable it, follow [this guide](https://meta.discourse.org/t/badge-sql-can-no-longer-be-edited-by-default/47894). When defining badges in Discourse, you’ll encounter a “Trigger” option with the following choices: Update daily When a user acts on post When a user edits or creates a post When…

---

<div class="post-metadata">

### Author: ![TempAccount](https://avatars.discourse-cdn.com/v4/letter/t/a9a28c/32.png) [@TempAccount](https://meta.discourse.org/u/TempAccount)
#### Post date: [30.Май.2025 15:13:21 UTC](https://meta.discourse.org/t/grant-custom-badge-upon-reading-tos/368259/3 "2025-05-30T15:13:21Z")

</div>

О, похоже, это поможет или направит меня в правильном направлении!  
Спасибо!

---

<div class="post-metadata">

### Author: ![JammyDodger](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jammydodger/32/254611_2.png) [@JammyDodger](https://meta.discourse.org/u/JammyDodger)
#### Post date: [30.Май.2025 15:28:34 UTC](https://meta.discourse.org/t/grant-custom-badge-upon-reading-tos/368259/4 "2025-05-30T15:28:34Z")

</div>

Не уверен, что можно аналогичным образом связать похожий документ с Условиями использования (ToS). 🤔 Ссылка «Правила чтения» работает за счёт того, что в таблице `user_stats` фиксируется запись `read_faq`, а на данный момент механизма для аналогичной фиксации по Условиям использования не предусмотрено.

Поскольку версия для просмотра пользователем не является самой темой, я полагаю, что факт просмотра этой страницы нигде не фиксируется (например, в `topic_views` и т. п.).

---

<div class="post-metadata">

### Author: ![TempAccount](https://avatars.discourse-cdn.com/v4/letter/t/a9a28c/32.png) [@TempAccount](https://meta.discourse.org/u/TempAccount)
#### Post date: [30.Май.2025 19:23:53 UTC](https://meta.discourse.org/t/grant-custom-badge-upon-reading-tos/368259/5 "2025-05-30T19:23:53Z")

</div>

Возможно ли изменить базу данных/таблицы, чтобы добавить новое поле `read_tos`?

* * *

Существует потенциально неуклюжее решение…  
…публикация темы как опубликованной страницы вместо использования бесшовной интеграции, как в разделах FAQ и О нас. Не знаю, сработает ли это на самом деле…

Тестирование и результаты:

- SQL-запрос возвращает пользователей, которые прочитали тему, и они _должны_ получить значок, но я не получил это уведомление.

- Могу подтвердить, что посещения `/pub/slug` без прямого перехода к теме обновляют счётчик просмотров темы… однако даже при крайне малом времени чтения значок автоматически не был выдан.

- Также стоит отметить, что сама тема по-прежнему помечается как новая и непрочитанная для пользователя.

- …

- Дальнейшее изолированное тестирование показывает, что SQL-запрос подразумевает, что пользователи должны перейти к теме напрямую, чтобы считаться прочитавшими её. Подтвердить или опровергнуть это я не могу, так как значок не был выдан, но это наиболее вероятно.

Когда срабатывает триггер «обновлять ежедневно»?

---

<div class="post-metadata">

### Author: ![Heliosurge](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/heliosurge/32/571810_2.png) [@Heliosurge](https://meta.discourse.org/u/Heliosurge)
#### Post date: [30.Май.2025 19:31:43 UTC](https://meta.discourse.org/t/grant-custom-badge-upon-reading-tos/368259/6 "2025-05-30T19:31:43Z")

</div>

Вы случайно не знаете, что именно сделала команда при обновлении Условий использования, когда нам нужно было подтвердить, что мы их ознакомились? Хотя это и не бейдж, не это ли был плагин Policy?

---

<div class="post-metadata">

### Author: ![JammyDodger](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jammydodger/32/254611_2.png) [@JammyDodger](https://meta.discourse.org/u/JammyDodger)
#### Post date: [30.Май.2025 19:37:49 UTC](https://meta.discourse.org/t/grant-custom-badge-upon-reading-tos/368259/7 "2025-05-30T19:37:49Z")

</div>

> [@TempAccount](#):
>
> Когда срабатывает триггер «обновлять ежедневно»?

Вы можете ускорить этот процесс, вручную запустив `jobs::BadgeGrant` со страницы `/sidekiq/scheduler` (для тех, у кого есть доступ). У меня оно сработало 3 часа назад, но время может отличаться от сайта к сайту.

Если бы вас устраивало размещение информации в обычной теме, вы могли бы создать новую тему и добавить ссылку на неё в настройку `tos url` в панели администратора, чтобы она отображалась во вкладках. Затем можно было бы легко выдать значок на основе просмотра этой темы (хотя ваши эксперименты с опубликованными страницами также могут принести плоды 🤞).

По-моему, чтобы реализовать это так же, как с «Прочитать правила», вам потребуется создать плагин, воспроизводящий поведение для Условий использования (хотя это не моя сильная сторона, так что воспринимайте это с долей скептицизма 🙂).

> [@Heliosurge](#):
>
> Вы случайно не знаете, что сделала команда при обновлении Условий использования, когда нам нужно было подтвердить, что мы их прочитали? Хотя это и не значок, возможно, это был плагин Policy?

Это [необязательное пользовательское поле](https://meta.discourse.org/t/creating-and-configuring-custom-user-fields/113192), которое, на мой взгляд, отлично подходит для этой цели. Хотя вы лишь подтверждаете, что прочитали их, а не факт прочтения, поэтому всё зависит от основной цели выдачи значка.

---

<div class="post-metadata">

### Author: ![TempAccount](https://avatars.discourse-cdn.com/v4/letter/t/a9a28c/32.png) [@TempAccount](https://meta.discourse.org/u/TempAccount)
#### Post date: [31.Май.2025 03:18:38 UTC](https://meta.discourse.org/t/grant-custom-badge-upon-reading-tos/368259/8 "2025-05-31T03:18:38Z")

</div>

> [@JammyDodger](#):
>
> Если бы вас не смущало размещение их в обычной теме, вы могли бы создать новую тему и добавить ссылку на неё в настройку администратора `tos url`, чтобы она всё ещё отображалась во вкладках. Затем вы могли бы довольно легко выдать значок пользователям, просмотревшим эту тему.

Подождите, это на самом деле гениально!

Вы также могли бы закрыть эту тему и исключить её из списка, чтобы на неё нельзя было отвечать, и доступ к ней был возможен только по прямой ссылке.

> [@JammyDodger](#):
>
> (хотя ваши эксперименты с опубликованными страницами тоже могут принести плоды 🤞)

К сожалению, это не будет работать так же просто, как описано выше.

---

<div class="post-metadata">

### Author: ![system](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/system/32/443519_2.png) [@system](https://meta.discourse.org/u/system)
#### Post date: [30.Июнь.2025 03:18:56 UTC](https://meta.discourse.org/t/grant-custom-badge-upon-reading-tos/368259/9 "2025-06-30T03:18:56Z")

</div>

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.
