Change default auto-close on all categories

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 = ''
    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:
        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:
            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.


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