잉여개발기 (SPDV) 3 лет назад
Родитель
Сommit
42bc7661ce

+ 8 - 6
app.py

@@ -589,13 +589,15 @@ app.route('/vote/list/close/<int:num>', defaults = { 'list_type' : 'close' })(vo
 app.route('/vote/add', methods = ['POST', 'GET'])(vote_add)
 app.route('/vote/add', methods = ['POST', 'GET'])(vote_add)
 
 
 # Func-bbs
 # Func-bbs
-# app.route('/bbs/main')
+app.route('/bbs/main')(bbs_main)
+app.route('/bbs/make', methods = ['POST', 'GET'])(bbs_make)
 # app.route('/bbs/main/set')
 # app.route('/bbs/main/set')
-# app.route('/bbs/make')
-# app.route('/bbs/w/<int:bbs_num>')
-# app.route('/bbs/set/<int:bbs_num>')
-# app.route('/bbs/edit/<int:bbs_num>')
-# app.route('/bbs/w/<int:bbs_num>/<int:post_num>')
+app.route('/bbs/w/<int:bbs_num>')(bbs_w)
+app.route('/bbs/set/<int:bbs_num>', methods = ['POST', 'GET'])(bbs_w_set)
+app.route('/bbs/edit/<int:bbs_num>', methods = ['POST', 'GET'])(bbs_edit)
+app.route('/bbs/edit/preview/<int:bbs_num>', methods = ['POST', 'GET'], defaults = { 'do_type' : 'preview' })(bbs_edit)
+app.route('/bbs/w/<int:bbs_num>/<int:post_num>', methods = ['POST', 'GET'])(bbs_w_post)
+app.route('/bbs/w/preview/<int:bbs_num>/<int:post_num>', methods = ['POST'], defaults = { 'do_type' : 'preview' })(bbs_w_post)
 # app.route('/bbs/edit/<int:bbs_num>/<int:post_num>')
 # app.route('/bbs/edit/<int:bbs_num>/<int:post_num>')
 
 
 # Func-api
 # Func-api

+ 115 - 0
route/bbs_edit.py

@@ -0,0 +1,115 @@
+from .tool.func import *
+
+def bbs_edit(bbs_num = '', do_type = ''):
+    with get_db_connect() as conn:
+        curs = conn.cursor()
+
+        bbs_num_str = str(bbs_num)
+        ip = ip_check()
+
+        curs.execute(db_change('select set_id from bbs_set where set_id = ? and set_name = "bbs_name"'), [bbs_num_str])
+        if not curs.fetchall():
+            return redirect('/bbs/main')
+        
+        if acl_check(bbs_num_str, 'bbs_edit') == 1:
+            return redirect('/bbs/set/' + bbs_num_str)
+
+        if flask.request.method == 'POST' and do_type != 'preview':
+            if captcha_post(flask.request.form.get('g-recaptcha-response', flask.request.form.get('g-recaptcha', ''))) == 1:
+                return re_error('/error/13')
+            else:
+                captcha_post('', 0)
+        
+            curs.execute(db_change('select set_code from bbs_data where set_name = "title" and set_id = ? order by set_code + 0 desc'), [bbs_num_str])
+            db_data = curs.fetchall()
+            id_data = str(int(db_data[0][0]) + 1) if db_data else '1'
+
+            title = flask.request.form.get('title', '')
+            data = flask.request.form.get('content', '')
+            date = get_time()
+
+            curs.execute(db_change("insert into bbs_data (set_name, set_code, set_id, set_data) values ('title', ?, ?, ?)"), [id_data, bbs_num_str, title])
+            curs.execute(db_change("insert into bbs_data (set_name, set_code, set_id, set_data) values ('data', ?, ?, ?)"), [id_data, bbs_num_str, data])
+            curs.execute(db_change("insert into bbs_data (set_name, set_code, set_id, set_data) values ('date', ?, ?, ?)"), [id_data, bbs_num_str, date])
+            curs.execute(db_change("insert into bbs_data (set_name, set_code, set_id, set_data) values ('user_id', ?, ?, ?)"), [id_data, bbs_num_str, ip])
+
+            return redirect('/bbs/w/' + bbs_num_str + '/' + id_data)
+        else:
+            if do_type == 'preview':
+                data = flask.request.form.get('content', '')
+                data = data.replace('\r', '')
+
+                data_preview = render_set(
+                    doc_name = '', 
+                    doc_data = data,
+                    data_in = 'from'
+                )
+            else:
+                data = ''
+                data_preview = ''
+            
+            form_action = 'formaction="/bbs/edit/' + bbs_num_str + '"'
+            form_action_preview = 'formaction="/bbs/edit/preview/' + bbs_num_str + '"'
+    
+            editor_top_text = '<a href="/edit_filter">(' + load_lang('edit_filter_rule') + ')</a>'
+            
+            monaco_on = get_main_skin_set(curs, flask.session, 'main_css_monaco', ip)
+            if monaco_on == 'use':
+                editor_display = 'style="display: none;"'
+                monaco_display = ''
+                add_get_file = '''
+                    <link   rel="stylesheet"
+                            data-name="vs/editor/editor.main" 
+                            href="https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.37.1/min/vs/editor/editor.main.min.css">
+                    <script src="https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.37.1/min/vs/loader.min.js"></script>
+                '''
+
+                editor_top_text += ' <a href="javascript:opennamu_edit_turn_off_monaco();">(' + load_lang('turn_off_monaco') + ')</a>'
+                
+                if flask.request.cookies.get('main_css_darkmode', '0') == '1':
+                    monaco_thema = 'vs-dark'
+                else:
+                    monaco_thema = ''
+                
+                add_script = 'do_monaco_init("' + monaco_thema + '");'
+            else:
+                editor_display = ''
+                monaco_display = 'style="display: none;"'
+                add_get_file = ''
+                add_script = 'opennamu_edit_turn_off_monaco();'
+
+            if editor_top_text != '':
+                editor_top_text += '<hr class="main_hr">'
+    
+            return easy_minify(flask.render_template(skin_check(), 
+                imp = [load_lang('bbs_edit'), wiki_set(), wiki_custom(), wiki_css([0, 0])],
+                data =  editor_top_text + add_get_file + '''
+                    <form method="post">
+                        <textarea style="display: none;" id="opennamu_edit_origin" name="doc_data_org"></textarea>
+
+                        <div>''' + edit_button('opennamu_edit_textarea', 'opennamu_monaco_editor') + '''</div>
+                        
+                        <input placeholder="''' + load_lang('bbs_title') + '''" name="title">
+                        <hr class="main_hr">
+
+                        <div id="opennamu_monaco_editor" class="opennamu_textarea_500" ''' + monaco_display + '''></div>
+                        <textarea id="opennamu_edit_textarea" ''' + editor_display + ''' class="opennamu_textarea_500" name="content">''' + html.escape(data) + '''</textarea>
+                        <hr class="main_hr">
+                        
+                        ''' + captcha_get() + ip_warning() + '''
+                        
+                        <button id="opennamu_save_button" type="submit" ''' + form_action + ''' onclick="do_monaco_to_textarea(); do_stop_exit_release();">''' + load_lang('save') + '''</button>
+                        <button id="opennamu_preview_button" type="submit" ''' + form_action_preview + ''' onclick="do_monaco_to_textarea(); do_stop_exit_release();">''' + load_lang('preview') + '''</button>
+                    </form>
+                    
+                    <hr class="main_hr">
+                    <div id="opennamu_preview_area">''' + data_preview + '''</div>
+                    
+                    <script>
+                        do_stop_exit();
+                        do_paste_image('opennamu_edit_textarea', 'opennamu_monaco_editor');
+                        ''' + add_script + '''
+                    </script>
+                ''',
+                menu = [['bbs/w/' + bbs_num_str, load_lang('return')]]
+            ))

+ 32 - 0
route/bbs_main.py

@@ -0,0 +1,32 @@
+from .tool.func import *
+
+def bbs_main():
+    with get_db_connect() as conn:
+        curs = conn.cursor()
+
+        curs.execute(db_change('select set_data, set_id from bbs_set where set_name = "bbs_name"'))
+        db_data = curs.fetchall()
+        
+        data = ''
+
+        if db_data:
+            data += '<ul class="opennamu_ul">'
+            for for_a in db_data:
+                curs.execute(db_change('select set_data from bbs_set where set_name = "bbs_type" and set_id = ?'), [for_a[1]])
+                db_data_2 = curs.fetchall()
+                bbs_type = db_data_2[0][0] if db_data_2 else 'comment'
+
+                data += '<li><a href="/bbs/w/' + for_a[1] + '">' + for_a[0] + ' (' + bbs_type + ')</a></li>'
+
+            data += '</ul>'
+
+        if admin_check() == 1:
+            menu = [['bbs/make', load_lang('add')]]
+        else:
+            menu = []
+
+        return easy_minify(flask.render_template(skin_check(),
+            imp = [load_lang('bbs_main'), wiki_set(), wiki_custom(), wiki_css([0, 0])],
+            data = data,
+            menu = [['other', load_lang('return')]] + menu
+        ))

+ 44 - 0
route/bbs_make.py

@@ -0,0 +1,44 @@
+from .tool.func import *
+
+def bbs_make():   
+    with get_db_connect() as conn:
+        curs = conn.cursor()
+
+        if admin_check() != 1:
+            return re_error('/error/3')
+        
+        if flask.request.method == 'POST':
+            
+            curs.execute(db_change('select set_id from bbs_set where set_name = "bbs_name" order by set_id + 0 desc'))
+            db_data = curs.fetchall()
+
+            bbs_num = str(int(db_data[0][0]) + 1) if db_data else '1'
+            bbs_name = flask.request.form.get('bbs_name', 'test')
+            bbs_type = flask.request.form.get('bbs_type', 'comment')
+            bbs_type = bbs_type if bbs_type in ['comment', 'thread'] else 'comment'
+
+            curs.execute(db_change("insert into bbs_set (set_name, set_code, set_id, set_data) values ('bbs_name', '', ?, ?)"), [bbs_num, bbs_name])
+            curs.execute(db_change("insert into bbs_set (set_name, set_code, set_id, set_data) values ('bbs_type', '', ?, ?)"), [bbs_num, bbs_type])
+
+            conn.commit()
+
+            return redirect('/bbs/main')
+        else:
+            return easy_minify(flask.render_template(skin_check(),
+                imp = [load_lang('bbs_make'), wiki_set(), wiki_custom(), wiki_css([0, 0])],
+                data = '''
+                    <form method="post">
+                        <input placeholder="''' + load_lang('bbs_name') + '''" name="bbs_name">
+                        <hr class="main_hr">
+                        
+                        <select name="bbs_type">
+                            <option value="comment">''' + load_lang('comment') + '''</option>
+                            <option value="thread">''' + load_lang('thread') + '''</option>
+                        </select>
+                        <hr class="main_hr">
+                        
+                        <button type="submit">''' + load_lang('save') + '''</button>
+                    </form>
+                ''',
+                menu = [['bbs/main', load_lang('return')]]
+            ))

+ 53 - 0
route/bbs_w.py

@@ -0,0 +1,53 @@
+from .tool.func import *
+
+def bbs_w(bbs_num = ''):
+    with get_db_connect() as conn:
+        curs = conn.cursor()
+
+        curs.execute(db_change('select set_id from bbs_set where set_id = ? and set_name = "bbs_name"'), [bbs_num])
+        if not curs.fetchall():
+            return redirect('/bbs/main')
+
+        bbs_num_str = str(bbs_num)
+
+        data = ''
+        data += '''
+            <table id="main_table_set">
+                <tr id="main_table_top_tr">
+                    <td id="main_table_width">''' + load_lang('version') + '''</td>
+                    <td id="main_table_width">''' + load_lang('editor') + '''</td>
+                    <td id="main_table_width">''' + load_lang('time') + '''</td>
+                </tr>
+        '''
+        
+        temp_id = ''
+        temp_dict = {}
+
+        curs.execute(db_change('select set_name, set_data, set_code from bbs_data where set_id = ? order by set_code + 0 desc'), [bbs_num])
+        db_data = curs.fetchall()
+        for for_a in db_data + [['', '', '']]:
+            if temp_id != for_a[2]:
+                if temp_id != '':
+                    data += '''
+                        <tr>
+                            <td>''' + temp_dict['code'] + '''</td>
+                            <td>''' + ip_pas(temp_dict['user_id']) + '''</td>
+                            <td>''' + temp_dict['date'] + '''</td>
+                        </tr>
+                        <tr>
+                            <td colspan="3">''' + ('<a href="/bbs/w/' + bbs_num_str + '/' + temp_dict['code'] + '">' + temp_dict['title'] + '</a>') + '''</td>
+                        </tr>
+                    '''
+
+                temp_id = for_a[2]
+                temp_dict['code'] = for_a[2]
+
+            temp_dict[for_a[0]] = for_a[1]
+
+        data += '</table>'
+
+        return easy_minify(flask.render_template(skin_check(),
+            imp = [load_lang('bbs_main'), wiki_set(), wiki_custom(), wiki_css([0, 0])],
+            data = data,
+            menu = [['bbs/main', load_lang('return')], ['bbs/edit/' + bbs_num_str, load_lang('add')], ['bbs/set/' + bbs_num_str, load_lang('setting')]]
+        ))

+ 353 - 0
route/bbs_w_post.py

@@ -0,0 +1,353 @@
+from .tool.func import *
+
+def bbs_w_post_make_thread(user_id, date, data, code, color = '', blind = '', add_style = ''):
+    return '''
+        <table class="opennamu_comment" style="''' + add_style + '''">
+            <tr>
+                <td class="opennamu_comment_color_''' + color + '''">
+                    <a href="#thread_shortcut" id="comment_''' + code + '''">#''' + code + '''</a>
+                    ''' + user_id + '''
+                    <span style="float: right;">''' + date + '''</span>
+                </td>
+            </tr>
+            <tr>
+                <td class="" id="opennamu_comment_data_main">
+                    ''' + data + '''
+                </td>
+            </tr>
+        </table>
+    '''
+
+def bbs_w_post(bbs_num = '', post_num = '', do_type = ''):
+    with get_db_connect() as conn:
+        curs = conn.cursor()
+
+        curs.execute(db_change('select set_name, set_data, set_code from bbs_data where set_id = ? and set_code = ?'), [bbs_num, post_num])
+        db_data = curs.fetchall()
+        if not db_data:
+            return redirect('/bbs/main')
+
+        bbs_num_str = str(bbs_num)
+        post_num_str = str(post_num)
+        bbs_comment_acl = acl_check(bbs_num_str, 'bbs_comment')
+        ip = ip_check()
+        
+        curs.execute(db_change('select set_data from bbs_set where set_id = ? and set_name = "bbs_type"'), [bbs_num])
+        db_data_2 = curs.fetchall()
+        if not db_data_2:
+            return redirect('/bbs/main')
+        elif db_data_2[0][0] == 'thread':
+            if flask.request.method == 'POST' and do_type != 'preview':
+                if bbs_comment_acl == 1:
+                    return redirect('/bbs/set/' + bbs_num_str)
+                
+                if captcha_post(flask.request.form.get('g-recaptcha-response', flask.request.form.get('g-recaptcha', ''))) == 1:
+                    return re_error('/error/13')
+                else:
+                    captcha_post('', 0)
+
+                set_id = bbs_num_str + '-' + post_num_str
+
+                curs.execute(db_change('select set_code from bbs_data where set_name = "comment" and set_id = ? order by set_code + 0 desc'), [set_id])
+                db_data = curs.fetchall()
+                id_data = str(int(db_data[0][0]) + 1) if db_data else '1'
+
+                data = flask.request.form.get('content', '')
+                date = get_time()
+
+                curs.execute(db_change("insert into bbs_data (set_name, set_code, set_id, set_data) values ('comment', ?, ?, ?)"), [id_data, set_id, data])
+                curs.execute(db_change("insert into bbs_data (set_name, set_code, set_id, set_data) values ('comment_date', ?, ?, ?)"), [id_data, set_id, date])
+                curs.execute(db_change("insert into bbs_data (set_name, set_code, set_id, set_data) values ('comment_user_id', ?, ?, ?)"), [id_data, set_id, ip])
+
+                conn.commit()
+
+                return redirect('/bbs/w/' + bbs_num_str + '/' + post_num_str + '#comment_' + str(int(id_data) + 1))
+            else:
+                if do_type == 'preview':
+                    text = flask.request.form.get('content', '')
+                    text = text.replace('\r', '')
+
+                    data_preview = render_set(
+                        doc_name = '', 
+                        doc_data = text,
+                        data_in = 'from'
+                    )
+                else:
+                    text = ''
+                    data_preview = ''
+                
+                temp_id = ''
+                temp_dict = {}
+
+                for for_a in db_data + [['', '', '']]:
+                    if temp_id != for_a[2]:
+                        temp_id = for_a[2]
+                        temp_dict['code'] = for_a[2]
+
+                    temp_dict[for_a[0]] = for_a[1]
+
+                count = 1
+
+                data = ''
+                data += '<h2>' + html.escape(temp_dict['title']) + '</h2>'
+                data += bbs_w_post_make_thread(
+                    ip_pas(temp_dict['user_id']),
+                    temp_dict['date'],
+                    render_set(
+                        doc_name = '', 
+                        doc_data = temp_dict['data'],
+                        data_in = 'from'
+                    ),
+                    '1',
+                    color = 'green'
+                )
+                data += '<hr class="main_hr">'
+
+                user_id = temp_dict['user_id']
+
+                temp_id = ''
+                temp_dict = {}
+
+                curs.execute(db_change('select set_name, set_data, set_code, set_id from bbs_data where (set_name = "comment" or set_name = "comment_date" or set_name = "comment_user_id") and set_id = ? order by set_code + 0 asc'), [bbs_num_str + '-' + post_num_str])
+                db_data = curs.fetchall()
+                for for_a in db_data + [['', '', '']]:
+                    if temp_id == '':
+                        temp_id = for_a[2]
+
+                    if temp_id != for_a[2]:
+                        temp_id = for_a[2]
+                        temp_dict['code'] = for_a[2]
+                        count += 1
+
+                        if user_id == temp_dict['comment_user_id']:
+                            color = 'green'
+                        else:
+                            color = 'default'
+
+                        data += bbs_w_post_make_thread(
+                            ip_pas(temp_dict['comment_user_id']),
+                            temp_dict['comment_date'],
+                            render_set(
+                                doc_name = '', 
+                                doc_data = temp_dict['comment'],
+                                data_in = 'from'
+                            ),
+                            str(count),
+                            color = color
+                        )
+                        data += '<hr class="main_hr">'
+
+                    temp_dict[for_a[0]] = for_a[1]
+
+                bbs_comment_form = ''
+                if bbs_comment_acl == 0:
+                    bbs_comment_form = '''                        
+                        <textarea name="content" id="opennamu_edit_textarea" class="opennamu_textarea_100">''' + html.escape(text) + '''</textarea>
+                        <hr class="main_hr">
+                        
+                        ''' + captcha_get() + ip_warning() + '''
+
+                        <button id="opennamu_save_button" formaction="/bbs/w/''' + bbs_num_str + '''/''' + post_num_str + '''" type="submit">''' + load_lang('send') + '''</button>
+                        <button id="opennamu_preview_button" formaction="/bbs/w/preview/''' + bbs_num_str + '''/''' + post_num_str + '''#opennamu_edit_textarea" type="submit">''' + load_lang('preview') + '''</button>
+                        <hr class="main_hr">
+                    '''
+
+                data += '''
+                    <form method="post">
+                        ''' + bbs_comment_form + '''
+                        ''' + data_preview + '''
+                    </form>
+                '''
+
+                return easy_minify(flask.render_template(skin_check(),
+                    imp = [load_lang('bbs_main'), wiki_set(), wiki_custom(), wiki_css([0, 0])],
+                    data = data,
+                    menu = [['bbs/w/' + bbs_num_str, load_lang('return')], ['bbs/edit/' + bbs_num_str + '/' + post_num_str, load_lang('edit')]]
+                ))
+        else:
+            # db_data_2[0][0] == 'comment'
+            if flask.request.method == 'POST' and do_type != 'preview':
+                if bbs_comment_acl == 1:
+                    return redirect('/bbs/set/' + bbs_num_str)
+                
+                if captcha_post(flask.request.form.get('g-recaptcha-response', flask.request.form.get('g-recaptcha', ''))) == 1:
+                    return re_error('/error/13')
+                else:
+                    captcha_post('', 0)
+                
+                select = flask.request.form.get('comment_select', 'default')
+                select = '' if select == 'default' else select
+                if select != '':
+                    select = select.split('-')
+                    if len(select) < 2:
+                        curs.execute(db_change('select set_code from bbs_data where set_name = "comment" and set_id = ? and set_code = ? limit 1'), [bbs_num_str + '-' + post_num_str, select[0]])
+                        if not curs.fetchall():
+                            return ''
+                        else:
+                            set_id = bbs_num_str + '-' + post_num_str + '-' + select[0]
+                    else:
+                        curs.execute(db_change('select set_code from bbs_data where set_name = "comment" and set_id = ? and set_code = ? limit 1'), [bbs_num_str + '-' + post_num_str + '-' + '-'.join(select[0:len(select) - 1]), select[len(select) - 1]])
+                        if not curs.fetchall():
+                            return ''
+                        else:
+                            set_id = bbs_num_str + '-' + post_num_str + '-' + '-'.join(select)
+                else:
+                    set_id = bbs_num_str + '-' + post_num_str
+
+                curs.execute(db_change('select set_code from bbs_data where set_name = "comment" and set_id = ? order by set_code + 0 desc'), [set_id])
+                db_data = curs.fetchall()
+                id_data = str(int(db_data[0][0]) + 1) if db_data else '1'
+
+                data = flask.request.form.get('content', '')
+                date = get_time()
+
+                curs.execute(db_change("insert into bbs_data (set_name, set_code, set_id, set_data) values ('comment', ?, ?, ?)"), [id_data, set_id, data])
+                curs.execute(db_change("insert into bbs_data (set_name, set_code, set_id, set_data) values ('comment_date', ?, ?, ?)"), [id_data, set_id, date])
+                curs.execute(db_change("insert into bbs_data (set_name, set_code, set_id, set_data) values ('comment_user_id', ?, ?, ?)"), [id_data, set_id, ip])
+
+                conn.commit()
+            
+                if set_id == '':
+                    return redirect('/bbs/w/' + bbs_num_str + '/' + post_num_str + '#comment_' + id_data)
+                else:
+                    set_id = re.sub(r'^[0-9]+-[0-9]+-?', '', set_id)
+                    return redirect('/bbs/w/' + bbs_num_str + '/' + post_num_str + '#comment_' + set_id + '-' + id_data)
+            else:
+                if do_type == 'preview':
+                    text = flask.request.form.get('content', '')
+                    text = text.replace('\r', '')
+
+                    data_preview = render_set(
+                        doc_name = '', 
+                        doc_data = text,
+                        data_in = 'from'
+                    )
+                else:
+                    text = ''
+                    data_preview = ''
+
+                temp_id = ''
+                temp_dict = {}
+
+                for for_a in db_data + [['', '', '']]:
+                    if temp_id != for_a[2]:
+                        temp_id = for_a[2]
+                        temp_dict['code'] = for_a[2]
+
+                    temp_dict[for_a[0]] = for_a[1]
+
+                data = ''
+                data += '<h2>' + html.escape(temp_dict['title']) + '</h2>'
+                data += bbs_w_post_make_thread(
+                    ip_pas(temp_dict['user_id']),
+                    temp_dict['date'],
+                    render_set(
+                        doc_name = '', 
+                        doc_data = temp_dict['data'],
+                        data_in = 'from'
+                    ),
+                    '0',
+                    color = 'red'
+                )
+
+                user_id = temp_dict['user_id']
+                temp_id = ''
+                temp_dict = {}
+                comment_data = ''
+
+                comment_select = '<hr class="main_hr"><select name="comment_select">'
+                comment_select += '<option value="default">' + load_lang('normal') + '</option>'
+
+                curs.execute(db_change('select set_name, set_data, set_code, set_id from bbs_data where (set_name = "comment" or set_name = "comment_date" or set_name = "comment_user_id") and set_id = ? order by set_code + 0 asc'), [bbs_num_str + '-' + post_num_str])
+                db_data = curs.fetchall()
+                if db_data:
+                    data += '<hr class="main_hr"><hr><hr class="main_hr">'
+                else:
+                    db_data = [[]]
+
+                for_a = 0
+                db_data_2 = db_data + [['', '', '', '']]
+                db_data_len = len(db_data_2)
+                comment_count = 0
+                comment_add_count = 0
+                while(for_a < db_data_len):
+                    if temp_id != (db_data_2[for_a][3] + '-' + db_data_2[for_a][2]):
+                        if temp_id != '':
+                            temp_dict['code'] = temp_id
+                            temp_dict['code'] = re.sub(r'^[0-9]+-[0-9]+-', '', temp_dict['code'])
+
+                            if user_id == temp_dict['comment_user_id']:
+                                color = 'green'
+                            else:
+                                color = 'default'
+
+                            margin_count = temp_dict['code'].count('-')
+                            if margin_count == 0:
+                                comment_count += 1
+                            else:
+                                comment_add_count += 1
+
+                            comment_data += '<span style="padding-left: 20px;"></span>' * margin_count
+                            comment_data += bbs_w_post_make_thread(
+                                ip_pas(temp_dict['comment_user_id']),
+                                temp_dict['comment_date'],
+                                render_set(
+                                    doc_name = '', 
+                                    doc_data = temp_dict['comment'],
+                                    data_in = 'from'
+                                ),
+                                temp_dict['code'],
+                                color = color,
+                                add_style = 'width: calc(100% - ' + str(margin_count * 20) + 'px);'
+                            )
+
+                            comment_select += '<option value="' + temp_dict['code'] + '">' + temp_dict['code'] + '</option>'
+
+                            curs.execute(db_change('select set_name, set_data, set_code, set_id from bbs_data where (set_name = "comment" or set_name = "comment_date" or set_name = "comment_user_id") and set_id = ? order by set_code + 0 asc'), [bbs_num_str + '-' + post_num_str + '-' + temp_dict['code']])
+                            db_data = curs.fetchall()
+                            if db_data:
+                                db_data_2 = db_data_2[:for_a] + db_data + db_data_2[for_a:]
+                                db_data_len += len(db_data)
+
+                            if db_data_2[for_a][0] != '':
+                                comment_data += '<hr class="main_hr">'
+
+                        temp_id = db_data_2[for_a][3] + '-' + db_data_2[for_a][2]
+
+                    temp_dict[db_data_2[for_a][0]] = db_data_2[for_a][1]
+                    for_a += 1
+
+                comment_select += '</select>'
+                if comment_data != '':
+                    data += load_lang('comment') + ' : ' + str(comment_count) + '<hr class="main_hr">'
+                    data += load_lang('reply') + ' : ' + str(comment_add_count) + '<hr class="main_hr">'
+                    data += comment_data
+
+                bbs_comment_form = ''
+                if bbs_comment_acl == 0:
+                    bbs_comment_form = '''
+                        ''' + comment_select + '''
+                        <hr class="main_hr">
+                        
+                        <textarea name="content" id="opennamu_edit_textarea" class="opennamu_textarea_100">''' + html.escape(text) + '''</textarea>
+                        <hr class="main_hr">
+                        
+                        ''' + captcha_get() + ip_warning() + '''
+
+                        <button id="opennamu_save_button" formaction="/bbs/w/''' + bbs_num_str + '''/''' + post_num_str + '''" type="submit">''' + load_lang('send') + '''</button>
+                        <button id="opennamu_preview_button" formaction="/bbs/w/preview/''' + bbs_num_str + '''/''' + post_num_str + '''#opennamu_edit_textarea" type="submit">''' + load_lang('preview') + '''</button>
+                        <hr class="main_hr">
+                    '''
+
+                data += '''
+                    <form method="post">
+                        ''' + bbs_comment_form + '''
+                        ''' + data_preview + '''
+                    </form>
+                '''
+
+                return easy_minify(flask.render_template(skin_check(),
+                    imp = [load_lang('bbs_main'), wiki_set(), wiki_custom(), wiki_css([0, 0])],
+                    data = data,
+                    menu = [['bbs/w/' + bbs_num_str, load_lang('return')], ['bbs/edit/' + bbs_num_str + '/' + post_num_str, load_lang('edit')]]
+                ))

+ 94 - 0
route/bbs_w_set.py

@@ -0,0 +1,94 @@
+from .tool.func import *
+
+def bbs_w_set(bbs_num = ''):
+    with get_db_connect() as conn:
+        curs = conn.cursor()
+
+        curs.execute(db_change('select set_id from bbs_set where set_id = ? and set_name = "bbs_name"'), [bbs_num])
+        if not curs.fetchall():
+            return redirect('/bbs/main')
+
+        i_list = {
+            1 : 'bbs_acl',
+            2 : 'bbs_edit_acl',
+            3 : 'bbs_comment_acl',
+            4 : 'bbs_view_acl'
+        }
+        bbs_num_str = str(bbs_num)
+
+        if flask.request.method == 'POST':
+            if admin_check(None, 'bbs_set (acl)') != 1:
+                return re_error('/ban')
+            else:
+                for i in i_list:
+                    curs.execute(db_change("update bbs_set set set_data = ? where set_name = ? and set_id = ?"), [
+                        flask.request.form.get(i_list[i], 'normal'),
+                        i_list[i],
+                        bbs_num
+                    ])
+
+                conn.commit()
+
+                return redirect('/bbs/set/' + bbs_num_str)
+        else:
+            d_list = {}
+
+            if admin_check() != 1:
+                disable = 'disabled'
+            else:
+                disable = ''
+
+            for i in i_list:
+                curs.execute(db_change('select set_data from bbs_set where set_name = ? and set_id = ?'), [i_list[i], bbs_num])
+                sql_d = curs.fetchall()
+                if sql_d:
+                    d_list[i] = sql_d[0][0]
+                else:
+                    curs.execute(db_change('insert into bbs_set (set_name, set_code, set_id, set_data) values (?, "", ?, ?)'), [i_list[i], bbs_num, 'normal'])
+                    d_list[i] = 'normal'
+
+            conn.commit()
+
+            acl_div = []
+            for i in range(0, len(i_list)):
+                acl_div += ['']
+
+            acl_list = get_acl_list()
+            for i in range(0, len(i_list)):
+                for data_list in acl_list:
+                    if data_list == d_list[i + 1]:
+                        check = 'selected="selected"'
+                    else:
+                        check = ''
+
+                    acl_div[i] += '<option value="' + data_list + '" ' + check + '>' + (data_list if data_list != '' else 'normal') + '</option>'
+
+            return easy_minify(flask.render_template(skin_check(),
+                imp = [load_lang('main_acl_setting'), wiki_set(), wiki_custom(), wiki_css([0, 0])],
+                data = render_simple_set('''
+                    <form method="post">
+                        <hr class="main_hr">
+                        <a href="/acl/TEST#exp">(''' + load_lang('reference') + ''')</a>
+                        
+                        <h2>''' + load_lang('acl') + '''</h2>
+                        <h3>''' + load_lang('bbs_view_acl') + '''</h3>
+                        <select ''' + disable + ''' name="bbs_comment_acl">''' + acl_div[3] + '''</select>
+
+                        <h4>''' + load_lang('bbs_acl') + '''</h4>
+                        <select ''' + disable + ''' name="bbs_acl">''' + acl_div[0] + '''</select>
+
+                        <h5>''' + load_lang('bbs_edit_acl') + '''</h5>
+                        <select ''' + disable + ''' name="bbs_edit_acl">''' + acl_div[1] + '''</select>
+
+                        <h5>''' + load_lang('bbs_comment_acl') + '''</h5>
+                        <select ''' + disable + ''' name="bbs_comment_acl">''' + acl_div[2] + '''</select>
+
+                        <h2>''' + load_lang('markup') + '''</h2>
+                        ''' + load_lang('not_working') + '''
+                        
+                        <hr class="main_hr">
+                        <button id="opennamu_save_button" type="submit">''' + load_lang('save') + '''</button>
+                    </form>
+                '''),
+                menu = [['bbs/w/' + bbs_num_str, load_lang('return')]]
+            ))

+ 0 - 1
route/main_setting_acl.py

@@ -46,7 +46,6 @@ def main_setting_acl():
                     d_list[i] = sql_d[0][0]
                     d_list[i] = sql_d[0][0]
                 else:
                 else:
                     curs.execute(db_change('insert into other (name, data, coverage) values (?, ?, "")'), [i_list[i], 'normal'])
                     curs.execute(db_change('insert into other (name, data, coverage) values (?, ?, "")'), [i_list[i], 'normal'])
-
                     d_list[i] = 'normal'
                     d_list[i] = 'normal'
 
 
             conn.commit()
             conn.commit()

+ 0 - 1
route/main_setting_external.py

@@ -43,7 +43,6 @@ def main_setting_external():
                     d_list += [sql_d[0][0]]
                     d_list += [sql_d[0][0]]
                 else:
                 else:
                     curs.execute(db_change('insert into other (name, data, coverage) values (?, ?, "")'), [i, ''])
                     curs.execute(db_change('insert into other (name, data, coverage) values (?, ?, "")'), [i, ''])
-
                     d_list += ['']
                     d_list += ['']
 
 
                 x += 1
                 x += 1

+ 0 - 1
route/main_setting_phrase.py

@@ -52,7 +52,6 @@ def main_setting_phrase():
                     d_list += [sql_d[0][0]]
                     d_list += [sql_d[0][0]]
                 else:
                 else:
                     curs.execute(db_change('insert into other (name, data, coverage) values (?, ?, "")'), [i, ''])
                     curs.execute(db_change('insert into other (name, data, coverage) values (?, ?, "")'), [i, ''])
-
                     d_list += ['']
                     d_list += ['']
 
 
             conn.commit()
             conn.commit()

+ 15 - 1
route/tool/func.py

@@ -1761,7 +1761,7 @@ def acl_check(name = 'test', tool = '', topic_num = '1'):
 
 
     if tool in ['topic']:
     if tool in ['topic']:
         end = 3
         end = 3
-    elif tool in ['render', 'vote', '', 'document_edit', 'document_move', 'document_delete']:
+    elif tool in ['render', 'vote', '', 'document_edit', 'document_move', 'document_delete', 'document_edit', 'bbs_edit', 'bbs_comment']:
         end = 2
         end = 2
     else:
     else:
         end = 1
         end = 1
@@ -1872,6 +1872,20 @@ def acl_check(name = 'test', tool = '', topic_num = '1'):
                 'select data from other where name = "edit_bottom_compulsion_acl"'
                 'select data from other where name = "edit_bottom_compulsion_acl"'
             ))
             ))
 
 
+            num = 'all'
+        elif tool == 'bbs_edit':
+            if i == 0:
+                curs.execute(db_change('select set_data from bbs_set where set_name = "bbs_edit_acl" and set_id = ?'), [name])
+            else:
+                curs.execute(db_change('select set_data from bbs_set where set_name = "bbs_acl" and set_id = ?'), [name])
+
+            num = 'all'
+        elif tool == 'bbs_comment':
+            if i == 0:
+                curs.execute(db_change('select set_data from bbs_set where set_name = "bbs_comment_acl" and set_id = ?'), [name])
+            else:
+                curs.execute(db_change('select set_data from bbs_set where set_name = "bbs_acl" and set_id = ?'), [name])
+
             num = 'all'
             num = 'all'
         else:
         else:
             # tool == 'render'
             # tool == 'render'

+ 0 - 2
route/tool/func_render_namumark.py

@@ -617,8 +617,6 @@ class class_do_render_namumark:
                 link_main = self.get_tool_data_restore(link_main, do_type = 'slash')
                 link_main = self.get_tool_data_restore(link_main, do_type = 'slash')
                 link_main = html.unescape(link_main)
                 link_main = html.unescape(link_main)
 
 
-                print(link_main)
-
                 self.curs.execute(db_change("select set_data from data_set where doc_name = ? and set_name = 'last_edit'"), [link_main])
                 self.curs.execute(db_change("select set_data from data_set where doc_name = ? and set_name = 'last_edit'"), [link_main])
                 db_data = self.curs.fetchall()
                 db_data = self.curs.fetchall()
                 if db_data:
                 if db_data:

+ 1 - 1
version.json

@@ -1,6 +1,6 @@
 {
 {
     "beta" : {
     "beta" : {
-        "r_ver" : "v3.4.6-RC3-dev166",
+        "r_ver" : "v3.4.6-RC3-dev167",
         "c_ver" : "3500361",
         "c_ver" : "3500361",
         "s_ver" : "3500111"
         "s_ver" : "3500111"
     }
     }

+ 4 - 0
views/ringo/index.html

@@ -57,6 +57,10 @@
                             <span class="iconify" data-icon="ic:baseline-how-to-vote" data-inline="true"></span>
                             <span class="iconify" data-icon="ic:baseline-how-to-vote" data-inline="true"></span>
                             {{'vote_list'|load_lang}}
                             {{'vote_list'|load_lang}}
                         </a>
                         </a>
+                        <a href="/bbs/main">
+                            <span class="iconify" data-icon="ic:outline-developer-board" data-inline="true"></span>
+                            {{'bbs_main'|load_lang}}
+                        </a>
                     </div>
                     </div>
                 </div>
                 </div>
                 <div class="top_cel" id="other_cel">
                 <div class="top_cel" id="other_cel">

+ 5 - 0
views/tenshi/index.html

@@ -60,6 +60,11 @@
                                         <span class="iconify" data-icon="ic:baseline-how-to-vote" data-inline="true"></span>
                                         <span class="iconify" data-icon="ic:baseline-how-to-vote" data-inline="true"></span>
                                         {{'vote_list'|load_lang}}
                                         {{'vote_list'|load_lang}}
                                     </a>
                                     </a>
+                                    <hr>
+                                    <a href="/bbs/main">
+                                        <span class="iconify" data-icon="ic:outline-developer-board" data-inline="true"></span>
+                                        {{'bbs_main'|load_lang}}
+                                    </a>
                                 </div>
                                 </div>
                             </div>
                             </div>