phpBB3.0.X导入版面的Python脚本

关联的数据表

在phpBB3.0中导入版面时, 需要处理的有两张表, 一个是 forums, 一个是 acl_groups.

如果是干净的论坛, 可以不保留安装时填入的默认分区和版面, 直接用以下语句初始化:

-- 清空 forums 表
TRUNCATE phpbb_forums;
-- 清空 acl_groups 表
TRUNCATE phpbb3015.phpbb_acl_groups;
-- 填入初始化权限
INSERT INTO `phpbb_acl_groups` VALUES (1,0,85,0,1),(1,0,93,0,1),(1,0,111,0,1),(5,0,0,5,0),(5,0,0,1,0),(2,0,0,6,0),(3,0,0,6,0),(4,0,0,5,0),(4,0,0,10,0),(7,0,0,23,0);

如果是已经存在版面, 并且需要保留版面的论坛, 则仅需要记下当前的最大right_id

SELECT MAX(right_id) FROM phpbb_forums

.

需要的最小数据集

需要的最小字段为 `forum_id`, `parent_id`, `left_id`, `right_id`, `forum_name`, `forum_type`

构造版面数据

phpBB3.0的版面为单个父节点的树状结构, 使用了parent_id, left_id, right_id 来标识版面间的层级关系以及排序顺序. 在构造版面数据时, 需要的就是采集最小数据集, 并正确生成parent_id, left_id和right_id. 下面的例子使用的版面, 原数据是分区 + 版面的结构, 分区有层级关系, 版面有层级关系, 分区的ID与版面的ID有重叠, 并且分区与版面之间存在多个父节点的情况. 需要在生成中进行调整.

创建一个可用的ID序列, 用于将分区ID映射到可用ID序列上

数量不大的话, 这一步可以通过手工完成, 根据分区的数量, 观察版面的ID序列, 列出可用的ID做成list

availableIds = [3, 8, 11, 12, 13, 27, 30, ...]

将分区加入版面列表

遍历分区, 将旧ID映射到新ID上, 需要两次遍历, 第二次遍历时构造父子关系, children变量用于在最后生成left_id和right_id

boardsDict = {} # The mapping between Id => board

# Build the section map
allSections = rbcommon.tb_section.find({}).sort(‘rank‘, 1)
boards = [] # Record all boards
topBoards = [] # the root board Ids

sectionMap = {} # The mapping between old section Id => new board Id, for assigning new Ids for the sections
cusor = 0
for section in allSections:
    sectionMap[str(section[‘_id‘])] = availableIds[cusor]
    newId = availableIds[cusor]
    board = {
        ‘oid‘: section[‘_id‘], ‘oldPid‘: section[‘parentId‘],
        ‘_id‘: newId, ‘name2‘: section[‘name2‘], ‘is_folder‘: ‘true‘,
        ‘desc‘: section[‘desc‘],
        ‘children‘: []
    }
    boards.append(board)
    boardsDict[board[‘_id‘]] = board
    cusor += 1

for board in boards:
    if (board[‘oldPid‘] != 0):
        board[‘parentId‘] = sectionMap[str(board[‘oldPid‘])]
        parent = boardsDict[board[‘parentId‘]]
        parent[‘children‘].append(board[‘_id‘])
    else:
        board[‘parentId‘] = 0
        topBoards.append(board[‘_id‘])

for board in boards:
    print(‘oid:{}, oldPid:{}, _id:{}, parentId:{}, children:{}‘.format(board[‘oid‘], board[‘oldPid‘], board[‘_id‘], board[‘parentId‘], board[‘children‘]))

将版面加入列表

# Build the boards
mongoBoards = rbcommon.tb_board.find({})
for mongoBoard in mongoBoards:
    board = {
        ‘oid‘: mongoBoard[‘_id‘], ‘oldPid‘: 0, ‘parentId‘: 0,
        ‘_id‘: mongoBoard[‘_id‘], ‘name2‘: mongoBoard[‘name2‘], ‘is_folder‘: mongoBoard[‘is_folder‘],
        ‘desc‘: mongoBoard[‘name‘],
        ‘children‘: []
    }
    boards.append(board)
    if (board[‘_id‘] in boardsDict.keys()):
        print(‘Error: {}‘.format(board[‘_id‘]))
        exit
    boardsDict[board[‘_id‘]] = board

完善版面层级关系

# Build the boards tree
allSectionToBoards = rbcommon.tb_section_to_board.find({})
for s2b in allSectionToBoards:
    if (s2b[‘parentId‘] == 0):
        # parent is section
        parentId = sectionMap[str(s2b[‘sectionId‘])]
        parent = boardsDict[parentId]
        board = boardsDict[s2b[‘boardId‘]]
        # avoid the multiple parent
        if (board[‘parentId‘] > 0):
            print(‘Duplicate {} for {}, board:{}‘.format(parentId, board[‘parentId‘], s2b[‘boardId‘]))
            continue
        board[‘parentId‘] = parentId
        parent[‘children‘].append(s2b[‘boardId‘])
    else:
        # parent is board
        parent = boardsDict[s2b[‘parentId‘]]
        board = boardsDict[s2b[‘boardId‘]]
        # avoid the multiple parent
        if (board[‘parentId‘] > 0):
            print(‘Duplicate {} for {}, board:{}‘.format(s2b[‘parentId‘], board[‘parentId‘], s2b[‘boardId‘]))
            continue
        board[‘parentId‘] = s2b[‘parentId‘]
        parent[‘children‘].append(s2b[‘boardId‘])

print("All boards:")
for board in boards:
    print(‘oid:{}, oldPid:{}, _id:{}, parentId:{}, folder:{}, children:{}‘.format(
        board[‘oid‘], board[‘oldPid‘], board[‘_id‘], board[‘parentId‘], board[‘is_folder‘], board[‘children‘]))

使用递归填充left_id和right_id

其中counter的取值, 如果是干净的论坛并且前面已经执行了truncate, 就将counter设成1, 否则设成前面得到的right_id最大值 + 1. 这样新导入的分区和版面都会出现在原有分区和版面的下方

# Build the leftId and rightId
markLeftAndRight(topBoards)
print("Marked boards:")
for board in boards:
    print(‘_id:{}, parentId:{}, left:{}, right:{}, folder:{}, children:{}‘.format(
        board[‘_id‘], board[‘parentId‘], board[‘leftId‘], board[‘rightId‘], board[‘is_folder‘], board[‘children‘]))

# 用于递归的方法
def markLeftAndRight(idList):
    global counter
    for id in idList:
        board = boardsDict[id]
        if (‘leftId‘ in board):
            print(‘Error: {}‘.format(id))
            exit
        board[‘leftId‘] = counter
        counter += 1
        if (len(board[‘children‘]) > 0):
            markLeftAndRight(board[‘children‘])
        board[‘rightId‘] = counter
        counter += 1

.

写入MySQL

用pymsql写入mysql, 每写入一个版面, 同时写入对应的权限, 注意分区和版面的默认权限数据是不一样的.

# Write it to MySQL
for board in boards:
    try:
        with rbcommon.mysqlclient.cursor() as cursor:
            # insert forum
            sql = ‘‘‘INSERT INTO `phpbb_forums` (`forum_id`, `parent_id`, `left_id`, `right_id`, `forum_parents`, `forum_name`, `forum_desc`,
                `forum_rules`, `forum_type`)
                VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)‘‘‘
            cursor.execute(sql, (
                board[‘_id‘],
                board[‘parentId‘],
                board[‘leftId‘],
                board[‘rightId‘],
                ‘‘,
                board[‘name2‘],
                board[‘desc‘],
                ‘‘,
                0 if (board[‘is_folder‘] == ‘true‘) else 1))
            rbcommon.mysqlclient.commit()
            # insert acl_group
            if (board[‘is_folder‘] == ‘true‘):
                sql = ‘INSERT INTO `phpbb_acl_groups` VALUES (1,%s,0,17,0),(2,%s,0,17,0),(3,%s,0,17,0),(6,%s,0,17,0)‘
                cursor.execute(sql, (
                    board[‘_id‘], board[‘_id‘], board[‘_id‘], board[‘_id‘]))
                rbcommon.mysqlclient.commit()
            else:
                sql = ‘INSERT INTO `phpbb_acl_groups` VALUES (1,%s,0,17,0),(2,%s,0,15,0),(3,%s,0,15,0),(4,%s,0,21,0),(5,%s,0,14,0),(5,%s,0,10,0),(6,%s,0,19,0),(7,%s,0,24,0)‘
                cursor.execute(sql, (
                    board[‘_id‘], board[‘_id‘], board[‘_id‘], board[‘_id‘], board[‘_id‘], board[‘_id‘], board[‘_id‘], board[‘_id‘]))
                rbcommon.mysqlclient.commit()

    except Exception as e:
        print(e)

.

数据导入后, 使用管理员帐号先在后台清空缓存, 再查看和编辑版面  

原文地址:https://www.cnblogs.com/milton/p/10257400.html

时间: 2024-11-13 03:53:50

phpBB3.0.X导入版面的Python脚本的相关文章

phpBB3导入用户的Python脚本

关联的数据表 在phpBB3中导入用户时, 需要处理的有两张表, 一个是 users, 一个是 user_group. 如果是新安装的论坛, 在每次导入之前, 用以下语句初始化: DELETE FROM phpbb_users WHERE user_id > 47; alter table phpbb_users auto_increment = 48; DELETE FROM phpbb_user_group where user_id > 48; DELETE FROM phpbb_use

phpBB3导入帖子的Python脚本

关联的数据表 在phpBB3中导入用户时, 需要处理的有两张表, 一个是 topics, 一个是 posts.为了方便与原数据关联, 需要在这两个表上新增一个字段并建立唯一索引 ALTER TABLE `topics` ADD COLUMN `ori_id` VARCHAR(32) NOT NULL DEFAULT '' AFTER `poll_vote_change`; ALTER TABLE `posts` ADD COLUMN `ori_id` VARCHAR(32) NOT NULL D

C#调用python脚本

只尝试了两种调用方式,第一种只适用于python脚本中不包含第三方模块的情况,第二种针对的是python脚本中包含第三方模块的情况.不管哪种方式,首先都需要安装IronPython.可以在官网下载安装包自行安装后添加引用即可. C#代码 using IronPython.Hosting; using Microsoft.Scripting.Hosting; using System; namespace CSharpCallPython { class Program { static void

Zabbix3.0.2使用外部python脚本实现邮件报警

1,找到默认存放脚本的路径(我是在默认路径下面放着,如果想换别的路径,修改zabbix_server.conf配置文件) /usr/local/zabbix-server/share/zabbix/alertscripts 脚本存放路径 2,在目录新建一个mail.py的文件,脚本参考: cd /usr/local/zabbix-server/share/zabbix/alertscripts vim mail.py #!/usr/bin/python #coding:utf-8 #author

Python脚本调用C#代码数据交互示例(hello world)

原地址: http://www.djangochina.cn/forum.php?mod=viewthread&tid=247 随着项目的逐渐收尾, 对IronPython脚本也越来越熟悉,这里为IronPython脚本感兴趣但不入门的朋友写几篇使用心得,这是第一个:最简单的hello world程序.        首先,我们必须有一个IronPython脚本引擎库(IronPython.dll),我用的版本是V1.0,你可以在网上直接下到相关源码,编译后即生成IronPython.dll.1

(转)Python_如何把Python脚本导出为exe程序

原文地址:https://www.cnblogs.com/robinunix/p/8426832.html 一.pyinstaller简介 Python是一个脚本语言,被解释器解释执行.它的发布方式: .py文件:对于开源项目或者源码没那么重要的,直接提供源码,需要使用者自行安装Python并且安装依赖的各种库.(Python官方的各种安装包就是这样做的) .pyc文件:有些公司或个人因为机密或者各种原因,不愿意源码被运行者看到,可以使用pyc文件发布,pyc文件是Python解释器可以识别的二

用 Python 脚本实现对 Linux 服务器的监控

hon 分享到:8 原文出处: 曹江华 目前 Linux 下有一些使用 Python 语言编写的 Linux 系统监控工具 比如 inotify-sync(文件系统安全监控软件).glances(资源监控工具)在实际工作中,Linux 系统管理员可以根据自己使用的服务器的具体情况编写一下简单实用的脚本实现对 Linux 服务器的监控. 本文介绍一下使用 Python 脚本实现对 Linux 服务器 CPU 内存 网络的监控脚本的编写. Python 版本说明 Python 是由 Guido va

2. 蛤蟆Python脚本学习笔记二基本命令畅玩

2. 蛤蟆Python脚本学习笔记二基本命令畅玩 本篇名言:"成功源于发现细节,没有细节就没有机遇,留心细节意味着创造机遇.一件司空见惯的小事或许就可能是打开机遇宝库的钥匙!" 下班回家,咱先来看下一些常用的基本命令. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/48092873 1.  数字和表达式 看下图1一就能说明很多问题: 加法,整除,浮点除,取模,幂乘方等.是不是很直接也很粗暴. 关于上限,蛤蟆不太清楚

使用python脚本监控指定域名解析

python脚本:                                                                                                                  21,0-1        All #!/usr/bin/python # -*- coding: utf-8 -*- #此脚本用于检测域名解析是否正常 import os namelist = {'www.51cto.com':'218.11.0.91