We’ve found that our users like to add new comments on very old topics, often only tangentially related to their problem. I would like to set all categories to auto-close topics some time after the last post (7 days – just for the sake of argument!).
I have found this thread on how to apply a new auto-close configuration to existing topics, but I can’t find any way to adjust the auto-close configuration for all categories. I don’t especially want to do this by hand for two dozen (sub-)categories or so.
Perhaps it’d be safe to UPDATE categories SET auto_close_hours = 168, auto_close_based_on_last_post = true; if I had access to the database?
My colleague Nimrod came up with the following script to do this:
#!/usr/bin/env python3
import os
import requests
if __name__ == '__main__':
username = os.environ['DISCOURSE_API_USERNAME']
key = os.environ['DISCOURSE_API_KEY']
s = requests.session()
s.headers.update({'Accept': 'application/json'})
s.params.update({'api_key': key, 'api_username': username})
base = 'https://community.endlessos.com/'
update = {'auto_close_hours': '168', 'auto_close_based_on_last_post': True}
parents = s.get(base + 'categories').json()['category_list']['categories']
for p in parents:
p.update(update)
r = s.put(base + 'categories/' + str(p['id']), params=p)
assert r.ok
categories = s.get(base + 'categories', params={'parent_category_id': p['id']}).json()['category_list']['categories']
for c in categories:
c.update(update)
r = s.put(base + 'categories/' + str(c['id']), params=c)
assert r.ok
It seemed to work fine – now that I look at it, if categories can be nested more than one level deep, it will miss third- and subsequent-level categories. On our instance we only have one level of nesting, and I don’t know whether it’s possible to go further in general.