def action_add(cls, request, category_list):
        if not category_list.editor.allow_add:
            raise SitecatsSecurityException('`action_add()` is not supported by `%s` category.' % category_list.alias)
        titles = request.POST.get('category_title', '').strip()
        if not titles:
            raise SitecatsSecurityException(
                'Unsupported `category_title` value - `%s` - is passed to `action_add()`.' % titles)
        if category_list.editor.category_separator is None:
            titles = [titles]
        else:
            titles = [
                title.strip() for title in titles.split(category_list.editor.category_separator) if title.strip()
            ]
        def check_max_num(num, max_num, category_title):
            if max_num is not None and num+1 > max_num:
                subcats_str = ungettext_lazy('subcategory', 'subcategories', max_num)
                error_msg = _(
                    'Unable to add "%(target_category)s" category into "%(parent_category)s": '
                    'parent category can have at most %(num)s %(subcats_str)s.'
                ) % {
                    'target_category': category_title,
                    'parent_category': category_list.get_title(),
                    'num': max_num,
                    'subcats_str': subcats_str
                }
                raise SitecatsValidationError(error_msg)
        target_category = None
        for category_title in titles:
            exists = get_cache().find_category(category_list.alias, category_title)
            if exists and category_list.obj is None:
                return exists
            if not exists and not category_list.editor.allow_new:
                error_msg = _(
                    'Unable to create a new "%(new_category)s" category inside of "%(parent_category)s": '
                    'parent category does not support this action.'
                ) % {
                    'new_category': category_title,
                    'parent_category': category_list.get_title()
                }
                raise SitecatsNewCategoryException(error_msg)
            max_num = category_list.editor.max_num
            child_ids = get_cache().get_child_ids(category_list.alias)
            if not exists:
                if category_list.obj is None:
                    check_max_num(len(child_ids), max_num, category_title)
                target_category = get_category_model().add(
                    category_title, request.user, parent=category_list.get_category_model()
                )
            else:
                target_category = exists
            if category_list.obj is not None:
                check_max_num(category_list.obj.get_ties_for_categories_qs(child_ids).count(), max_num, category_title)
                category_list.obj.add_to_category(target_category, request.user)
        return target_category