Jelajahi Sumber

편집 요청 뼈대 제작

https://github.com/openNAMU/openNAMU/issues/2064
잉여개발기 (SPDV) 2 tahun lalu
induk
melakukan
356b33247e

+ 12 - 7
app.py

@@ -515,15 +515,15 @@ app.route('/xref_page/<int:num>/<everything:name>')(view_xref)
 app.route('/xref_this/<everything:name>', defaults = { 'xref_type' : 2 })(view_xref)
 app.route('/xref_this_page/<int:num>/<everything:name>', defaults = { 'xref_type' : 2 })(view_xref)
 
-app.route('/raw/<everything:name>')(view_raw_2)
-app.route('/raw_acl/<everything:name>', defaults = { 'doc_acl' : 1 })(view_raw_2)
-app.route('/raw_rev/<int:num>/<everything:name>')(view_raw_2)
+app.route('/raw/<everything:name>')(view_raw)
+app.route('/raw_acl/<everything:name>', defaults = { 'doc_acl' : 1 })(view_raw)
+app.route('/raw_rev/<int:num>/<everything:name>')(view_raw)
 
 app.route('/diff/<int(signed = True):num_a>/<int(signed = True):num_b>/<everything:name>')(view_diff)
 
 app.route('/down/<everything:name>')(view_down)
 
-app.route('/acl/<everything:name>', methods = ['POST', 'GET'])(view_acl)
+app.route('/acl/<everything:name>', methods = ['POST', 'GET'])(view_set)
 
 # everything 다음에 추가 붙은 경우에 대해서 재검토 필요 (진행중)
 app.route('/w_from/<everything:name>', defaults = { 'do_type' : 'from' })(view_read)
@@ -536,6 +536,11 @@ app.route('/edit/<everything:name>', methods = ['POST', 'GET'])(edit)
 app.route('/edit_from/<everything:name>', methods = ['POST', 'GET'], defaults = { 'do_type' : 'load' })(edit)
 app.route('/edit_section/<int:section>/<everything:name>', methods = ['POST', 'GET'])(edit)
 
+app.route('/edit_request/<everything:name>', methods = ['POST', 'GET'])(edit_request)
+app.route('/edit_request_from/<everything:name>', defaults = { 'do_type' : 'from' }, methods = ['POST', 'GET'])(edit_request)
+
+# app.route('/edit_request_rev/<int:rev>/<everything:name>', methods = ['POST', 'GET'])(edit_request)
+
 app.route('/upload', methods = ['POST', 'GET'])(edit_upload)
 
 # 개편 예정
@@ -567,7 +572,7 @@ app.route('/thread/<int:topic_num>/change', methods = ['POST', 'GET'])(topic_too
 app.route('/thread/<int:topic_num>/comment/<int:num>/tool')(topic_comment_tool)
 app.route('/thread/<int:topic_num>/comment/<int:num>/notice')(topic_comment_notice)
 app.route('/thread/<int:topic_num>/comment/<int:num>/blind')(topic_comment_blind)
-app.route('/thread/<int:topic_num>/comment/<int:num>/raw')(view_raw_2)
+app.route('/thread/<int:topic_num>/comment/<int:num>/raw')(view_raw)
 app.route('/thread/<int:topic_num>/comment/<int:num>/delete', methods = ['POST', 'GET'])(topic_comment_delete)
 
 # Func-user
@@ -657,11 +662,11 @@ app.route('/bbs/w/<int:bbs_num>/<int:post_num>', methods = ['POST', 'GET'])(bbs_
 # app.route('/bbs/blind/<int:bbs_num>/<int:post_num>', methods = ['POST', 'GET'])(bbs_w_hide)
 app.route('/bbs/pinned/<int:bbs_num>/<int:post_num>', methods = ['POST', 'GET'])(bbs_w_pinned)
 app.route('/bbs/delete/<int:bbs_num>/<int:post_num>', methods = ['POST', 'GET'])(bbs_w_delete)
-app.route('/bbs/raw/<int:bbs_num>/<int:post_num>')(view_raw_2)
+app.route('/bbs/raw/<int:bbs_num>/<int:post_num>')(view_raw)
 app.route('/bbs/tool/<int:bbs_num>/<int:post_num>')(bbs_w_tool)
 app.route('/bbs/edit/<int:bbs_num>/<int:post_num>', methods = ['POST', 'GET'])(bbs_w_edit)
 app.route('/bbs/tool/<int:bbs_num>/<int:post_num>/<comment_num>')(bbs_w_comment_tool)
-app.route('/bbs/raw/<int:bbs_num>/<int:post_num>/<comment_num>')(view_raw_2)
+app.route('/bbs/raw/<int:bbs_num>/<int:post_num>/<comment_num>')(view_raw)
 app.route('/bbs/edit/<int:bbs_num>/<int:post_num>/<comment_num>', methods = ['POST', 'GET'])(bbs_w_edit)
 app.route('/bbs/delete/<int:bbs_num>/<int:post_num>/<comment_num>', methods = ['POST', 'GET'])(bbs_w_delete)
 

+ 3 - 2
route/__init__.py

@@ -35,6 +35,7 @@ from route.edit_delete_multiple import edit_delete_multiple
 from route.edit_move import edit_move
 from route.edit_revert import edit_revert
 from route.edit_upload import edit_upload
+from route.edit_request import edit_request
 
 from route.filter_all import filter_all
 from route.filter_all_add import filter_all_add
@@ -155,10 +156,10 @@ from route.user_setting_user_name import user_setting_user_name
 from route.user_watch_list import user_watch_list
 from route.user_watch_list_name import user_watch_list_name
 
-from route.view_acl import view_acl
+from route.view_set import view_set
 from route.view_diff import view_diff
 from route.view_down import view_down
-from route.view_raw import view_raw_2
+from route.view_raw import view_raw
 from route.view_read import view_read
 from route.view_xref import view_xref
 

+ 47 - 26
route/edit.py

@@ -103,15 +103,26 @@ def edit(name = 'Test', section = 0, do_type = ''):
         curs = conn.cursor()
     
         ip = ip_check()
+
+        edit_req_mode = 0
         if acl_check(name, 'document_edit') == 1:
-            return redirect('/raw_acl/' + url_pas(name))
-        
+            edit_req_mode = 1
+            if acl_check(name, 'document_edit_request') == 1:
+                return redirect('/raw_acl/' + url_pas(name))
+            
         if do_title_length_check(name) == 1:
             return re_error('/error/38')
         
         curs.execute(db_change("select id from history where title = ? order by id + 0 desc"), [name])
         doc_ver = curs.fetchall()
         doc_ver = doc_ver[0][0] if doc_ver else '0'
+
+        curs.execute(db_change("select set_data from data_set where doc_name = ? and doc_rev = ? and set_name = 'edit_request_data'"), [name, doc_ver])
+        if curs.fetchall():
+            if edit_req_mode == 0:
+                return redirect('/edit_request_from/' + url_pas(name))
+            else:
+                return redirect('/raw_acl/' + url_pas(name))
         
         section = '' if section == 0 else section
         post_ver = flask.request.form.get('ver', '')
@@ -180,7 +191,6 @@ def edit(name = 'Test', section = 0, do_type = ''):
             curs.execute(db_change("select data from other where name = 'edit_timeout'"))
             db_data_2 = curs.fetchall()
             db_data_2 = number_check(db_data_2[0][0]) if db_data_2 and db_data_2[0][0] != '' else ''
-
             if db_data_2 != '' and platform.system() == 'Linux':
                 timeout = edit_timeout(edit_render_set, (name, content), timeout = int(db_data_2))
             else:
@@ -189,29 +199,39 @@ def edit(name = 'Test', section = 0, do_type = ''):
             if timeout == 1:
                 return re_error('/error/41')
             
-            if db_data:
-                curs.execute(db_change("update data set data = ? where title = ?"), [content, name])
-            else:    
+            if edit_req_mode == 0:
+                # 진짜 기록 부분
+                curs.execute(db_change("delete from data where title = ?"), [name])
                 curs.execute(db_change("insert into data (title, data) values (?, ?)"), [name, content])
-    
-            curs.execute(db_change("select user from scan where title = ? and type = ''"), [name])
-            for scan_user in curs.fetchall():
-                add_alarm(scan_user[0], ip, '<a href="/w/' + url_pas(name) + '">' + html.escape(name) + '</a>')
-                    
-            history_plus(
-                name,
-                content,
-                today,
-                ip,
-                send,
-                leng
-            )
-            
-            render_set(
-                doc_name = name,
-                doc_data = content,
-                data_type = 'backlink'
-            )
+        
+                curs.execute(db_change("select user from scan where title = ? and type = ''"), [name])
+                for scan_user in curs.fetchall():
+                    add_alarm(scan_user[0], ip, '<a href="/w/' + url_pas(name) + '">' + html.escape(name) + '</a>')
+                        
+                history_plus(
+                    name,
+                    content,
+                    today,
+                    ip,
+                    send,
+                    leng
+                )
+                
+                render_set(
+                    doc_name = name,
+                    doc_data = content,
+                    data_type = 'backlink'
+                )
+            else:
+                curs.execute(db_change("insert into data_set (doc_name, doc_rev, set_name, set_data) values (?, ?, 'edit_request_data', ?)"), [name, doc_ver, content])
+                curs.execute(db_change("insert into data_set (doc_name, doc_rev, set_name, set_data) values (?, ?, 'edit_request_user', ?)"), [name, doc_ver, ip])
+                curs.execute(db_change("insert into data_set (doc_name, doc_rev, set_name, set_data) values (?, ?, 'edit_request_date', ?)"), [name, doc_ver, today])
+                curs.execute(db_change("insert into data_set (doc_name, doc_rev, set_name, set_data) values (?, ?, 'edit_request_send', ?)"), [name, doc_ver, send])
+                curs.execute(db_change("insert into data_set (doc_name, doc_rev, set_name, set_data) values (?, ?, 'edit_request_leng', ?)"), [name, doc_ver, leng])
+
+                curs.execute(db_change("select user from scan where title = ? and type = ''"), [name])
+                for scan_user in curs.fetchall():
+                    add_alarm(scan_user[0], ip, '<a href="/edit_request/' + url_pas(name) + '">' + html.escape(name) + '</a> edit_request')
             
             conn.commit()
             
@@ -316,9 +336,10 @@ def edit(name = 'Test', section = 0, do_type = ''):
                 editor_top_text += '<hr class="main_hr">'
 
             sub_menu = ' (' + str(section) + ')' if section != '' else ''
+            sub_title = '(' + load_lang('edit_request') + ')' if edit_req_mode == 1 else '(' + load_lang('edit') + ')'
 
             return easy_minify(flask.render_template(skin_check(), 
-                imp = [name, wiki_set(), wiki_custom(), wiki_css(['(' + load_lang('edit') + ')' + sub_menu, 0])],
+                imp = [name, wiki_set(), wiki_custom(), wiki_css([sub_title + sub_menu, 0])],
                 data = editor_top_text + '''
                     <form method="post">
                         <textarea style="display: none;" name="doc_section_data_where">''' + data_section_where + '''</textarea>

+ 96 - 0
route/edit_request.py

@@ -0,0 +1,96 @@
+from .tool.func import *
+
+from .view_diff import view_diff_do
+
+def edit_request(name = 'Test', do_type = ''):
+    with get_db_connect() as conn:
+        curs = conn.cursor()
+
+        disable = ""
+        if acl_check(name, 'document_edit') == 1:
+            disabled = "disable"
+
+        curs.execute(db_change("select id from history where title = ? order by id + 0 desc"), [name])
+        doc_ver = curs.fetchall()
+        doc_ver = doc_ver[0][0] if doc_ver else '0'
+
+        curs.execute(db_change("select set_data from data_set where doc_name = ? and doc_rev = ? and set_name = 'edit_request_data'"), [name, doc_ver])
+        db_data = curs.fetchall()
+        if not db_data:
+            return redirect('/edit/' + url_pas(name))
+        
+        edit_request_data = db_data[0][0]
+
+        curs.execute(db_change("select set_data from data_set where doc_name = ? and doc_rev = ? and set_name = 'edit_request_user'"), [name, doc_ver])
+        db_data = curs.fetchall()
+        edit_request_user = db_data[0][0] if db_data else ''
+
+        curs.execute(db_change("select set_data from data_set where doc_name = ? and doc_rev = ? and set_name = 'edit_request_date'"), [name, doc_ver])
+        db_data = curs.fetchall()
+        edit_request_date = db_data[0][0] if db_data else ''
+
+        curs.execute(db_change("select set_data from data_set where doc_name = ? and doc_rev = ? and set_name = 'edit_request_send'"), [name, doc_ver])
+        db_data = curs.fetchall()
+        edit_request_send = db_data[0][0] if db_data else ''
+
+        curs.execute(db_change("select set_data from data_set where doc_name = ? and doc_rev = ? and set_name = 'edit_request_leng'"), [name, doc_ver])
+        db_data = curs.fetchall()
+        edit_request_leng = db_data[0][0] if db_data else ''
+
+        if flask.request.method == 'POST':
+            if acl_check(name, 'document_edit') == 1:
+                return redirect('/w/' + url_pas(name))
+            
+            curs.execute(db_change("delete from data where title = ?"), [name])
+            curs.execute(db_change("insert into data (title, data) values (?, ?)"), [name, edit_request_data])
+    
+            curs.execute(db_change("select user from scan where title = ? and type = ''"), [name])
+            for scan_user in curs.fetchall():
+                add_alarm(scan_user[0], edit_request_user, '<a href="/w/' + url_pas(name) + '">' + html.escape(name) + '</a>')
+                    
+            history_plus(
+                name,
+                edit_request_data,
+                edit_request_date,
+                edit_request_user,
+                edit_request_send,
+                edit_request_leng
+            )
+            
+            render_set(
+                doc_name = name,
+                doc_data = edit_request_data,
+                data_type = 'backlink'
+            )
+                
+            if do_type == 'from':
+                return redirect('/edit/' + url_pas(name))
+            else:
+                return redirect('/w/' + url_pas(name))
+        else:
+            curs.execute(db_change("select data from data where title = ?"), [name])
+            db_data = curs.fetchall()
+            old_data = db_data[0][0] if db_data else ''
+
+            result = view_diff_do(old_data, edit_request_data, 'r' + doc_ver, load_lang('edit_req'))
+
+            return easy_minify(flask.render_template(skin_check(), 
+                imp = [name, wiki_set(), wiki_custom(), wiki_css(['(' + load_lang('edit_req_check') + ')', 0])],
+                data = '''
+                    <div id="opennamu_get_user_info">''' + html.escape(edit_request_user) + '''</div>
+                    <hr class="main_hr">
+                    ''' + edit_request_date + '''
+                    <hr class="main_hr">
+                    <input readonly value="''' + html.escape(edit_request_send) + '''">
+                    <hr class="main_hr">
+                    ''' + result + '''
+                    <hr class="main_hr">
+                    <form method="post">
+                        <button id="opennamu_save_button" type="submit" name="check" value="Y">''' + load_lang('approve') + '''</button>
+                        <button id="opennamu_preview_button" type="button" name="check" value="">''' + load_lang('decline') + '''</button>
+                        <hr class="main_hr">
+                        <textarea readonly class="opennamu_textarea_500">''' + html.escape(edit_request_data) + '''</textarea>
+                    </form>
+                ''',
+                menu = 0
+            ))

+ 5 - 1
route/main_setting_acl.py

@@ -17,7 +17,8 @@ def main_setting_acl():
             10 : 'slow_edit_acl',
             11 : 'edit_bottom_compulsion_acl',
             12 : 'recaptcha_pass_acl',
-            13 : 'recaptcha_one_check_five_pass_acl'
+            13 : 'recaptcha_one_check_five_pass_acl',
+            14 : 'document_edit_request_acl'
         }
         default_list = {
             12 : 'user'
@@ -66,6 +67,9 @@ def main_setting_acl():
                         <h3>''' + load_lang('document_edit_acl') + '''</h3>
                         <select ''' + disable + ''' name="document_edit_acl">''' + acl_div[6] + '''</select>
 
+                        <h3>''' + load_lang('document_edit_acl') + '''</h3>
+                        <select ''' + disable + ''' name="document_edit_acl">''' + acl_div[13] + '''</select>
+
                         <h3>''' + load_lang('document_move_acl') + '''</h3>
                         <select ''' + disable + ''' name="document_move_acl">''' + acl_div[7] + '''</select>
 

+ 16 - 5
route/tool/func.py

@@ -752,7 +752,7 @@ def get_acl_list(type_d = 'normal'):
     if type_d == 'user':
         return ['', 'user', 'all']
     else:
-        return ['', 'all', 'user', 'admin', 'owner', '50_edit', 'email', 'ban', 'before', '30_day', 'ban_admin', 'not_all']
+        return ['', 'all', 'user', 'admin', 'owner', '50_edit', 'email', 'ban', 'before', '30_day', 'ban_admin', 'not_all', 'up_to_level_3', 'up_to_level_10']
 
 ## Func-simple-with_DB
 def get_user_title_list(ip = ''):
@@ -1066,10 +1066,8 @@ def wiki_css(data):
         
         # Route JS
         data_css += '<script src="/views/main_css/js/route/editor.js' + data_css_ver + '"></script>'
-        data_css += '<script src="/views/main_css/js/route/editor_sub.js' + data_css_ver + '"></script>'
         data_css += '<script src="/views/main_css/js/route/render.js' + data_css_ver + '"></script>'
         data_css += '<script src="/views/main_css/js/route/topic.js' + data_css_ver + '"></script>'
-        data_css += '<script src="/views/main_css/js/route/topic_sub.js' + data_css_ver + '"></script>'
         
         # Main CSS
         data_css += '<link rel="stylesheet" href="/views/main_css/css/main.css' + data_css_ver + '">'
@@ -1868,7 +1866,7 @@ def acl_check(name = 'test', tool = '', topic_num = '1'):
                     return 0
         
                 return 1
-        elif tool in ['document_edit', 'document_move', 'document_delete']:
+        elif tool in ['document_edit', 'document_edit_request', 'document_move', 'document_delete']:
             if acl_check(name, '') == 1:
                 return 1
         elif tool in ['bbs_edit', 'bbs_comment']:
@@ -1881,7 +1879,7 @@ def acl_check(name = 'test', tool = '', topic_num = '1'):
 
         if tool in ['topic']:
             end = 3
-        elif tool in ['render', 'vote', '', 'document_edit', 'document_move', 'document_delete', 'document_edit', 'bbs_edit', 'bbs_comment']:
+        elif tool in ['render', 'vote', '', 'document_edit', 'document_edit_request', 'document_move', 'document_delete', 'document_edit', 'bbs_edit', 'bbs_comment']:
             end = 2
         else:
             end = 1
@@ -1982,6 +1980,13 @@ def acl_check(name = 'test', tool = '', topic_num = '1'):
                 curs.execute(db_change('select data from other where name = "recaptcha_one_check_five_pass_acl"'))
 
                 num = 'all'
+            elif tool == 'document_edit_request':
+                if i == 0:
+                    curs.execute(db_change("select data from acl where title = ? and type = 'document_edit_request_acl'"), [name])
+                else:
+                    curs.execute(db_change('select data from other where name = "document_edit_request_acl"'))
+
+                num = 5
             else:
                 # tool == 'render'
                 if i == 0:
@@ -2065,6 +2070,12 @@ def acl_check(name = 'test', tool = '', topic_num = '1'):
                         return 0
                 elif acl_data[0][0] == 'not_all':
                     return 1
+                elif acl_data[0][0] == 'up_to_level_3':
+                    if level_check(ip)[0] >= 3:
+                        return 0
+                elif acl_data[0][0] == 'up_to_level_10':
+                    if level_check(ip)[0] >= 10:
+                        return 0
 
                 return 1
             elif i == (end - 1):

+ 64 - 60
route/view_diff.py

@@ -1,5 +1,67 @@
 from .tool.func import *
 
+def view_diff_do(first_raw_data, second_raw_data, first, second):
+    if first_raw_data == second_raw_data:
+        result = ''
+    else:
+        diff_data = diff_match_patch().diff_main(first_raw_data, second_raw_data)
+        diff_data += [[0, '\n']]
+        
+        diff_data_2 = []
+        temp_list = []
+        line = 1
+        line_change = 0
+        for for_a in diff_data:
+            line_split = re.findall(r'(.*\n)|(.+$)', for_a[1])
+            if line_split:
+                for for_b in line_split:
+                    if for_b[0] != '':
+                        if for_a[0] != 0:
+                            line_change = 1
+                        
+                        temp_list += [[line, for_a[0], for_b[0].replace('\n', '')]]
+
+                        if line_change == 1:
+                            diff_data_2 += temp_list
+                        
+                        temp_list = []
+                        line_change = 0
+                        line += 1
+                    else:
+                        if for_a[0] != 0:
+                            line_change = 1
+
+                        temp_list += [[line, for_a[0], for_b[1]]]
+            else:
+                if for_a[0] != 0:
+                    line_change = 1
+
+                temp_list += [[line, for_a[0], for_a[1]]]
+
+        result = '<table style="width: 100%; white-space: pre-wrap;"><tr><td colspan="2">' + first + ' ➤ ' + second + '</td></tr>'
+        result += '<tr><td style="width: 40px; user-select: none;">'
+
+        line = 0
+        for for_a in diff_data_2:
+            if line == 0:
+                line = for_a[0]
+                result += str(line) + '</td><td>'
+            else:
+                if line != for_a[0]:
+                    line = for_a[0]
+                    result += '</td></tr><tr><td style="width: 40px; user-select: none;">' + str(line) + '</td><td>'
+
+            if for_a[1] == 1:
+                result += '<span class="opennamu_diff_green">' + html.escape(for_a[2]) + '</span>'
+            elif for_a[1] == 0:
+                result += html.escape(for_a[2])
+            else:
+                result += '<span class="opennamu_diff_red">' + html.escape(for_a[2]) + '</span>'
+
+        result += '</td></tr></table>'
+
+    return result
+
 def view_diff(name = 'Test', num_a = 1, num_b = 1):
     with get_db_connect() as conn:
         curs = conn.cursor()
@@ -19,70 +81,12 @@ def view_diff(name = 'Test', num_a = 1, num_b = 1):
 
         curs.execute(db_change("select data from history where id = ? and title = ?"), [second, name])
         second_raw_data = curs.fetchall()
+        
         if first_raw_data and second_raw_data:
             first_raw_data = first_raw_data[0][0].replace('\r', '')
             second_raw_data = second_raw_data[0][0].replace('\r', '')
 
-            if first_raw_data == second_raw_data:
-                result = ''
-            else:
-                diff_data = diff_match_patch().diff_main(first_raw_data, second_raw_data)
-                diff_data += [[0, '\n']]
-                
-                diff_data_2 = []
-                temp_list = []
-                line = 1
-                line_change = 0
-                for for_a in diff_data:
-                    line_split = re.findall(r'(.*\n)|(.+$)', for_a[1])
-                    if line_split:
-                        for for_b in line_split:
-                            if for_b[0] != '':
-                                if for_a[0] != 0:
-                                    line_change = 1
-                                
-                                temp_list += [[line, for_a[0], for_b[0].replace('\n', '')]]
-
-                                if line_change == 1:
-                                    diff_data_2 += temp_list
-                                
-                                temp_list = []
-                                line_change = 0
-                                line += 1
-                            else:
-                                if for_a[0] != 0:
-                                    line_change = 1
-
-                                temp_list += [[line, for_a[0], for_b[1]]]
-                    else:
-                        if for_a[0] != 0:
-                            line_change = 1
-
-                        temp_list += [[line, for_a[0], for_a[1]]]
-
-                result = '<table style="width: 100%; white-space: pre-wrap;"><tr><td colspan="2">r' + first + ' ➤ r' + second + '</td></tr>'
-                result += '<tr><td style="width: 40px; user-select: none;">'
-
-                # 개행만 추가된 경우 조정 필요
-                
-                line = 0
-                for for_a in diff_data_2:
-                    if line == 0:
-                        line = for_a[0]
-                        result += str(line) + '</td><td>'
-                    else:
-                        if line != for_a[0]:
-                            line = for_a[0]
-                            result += '</td></tr><tr><td style="width: 40px; user-select: none;">' + str(line) + '</td><td>'
-
-                    if for_a[1] == 1:
-                        result += '<span class="opennamu_diff_green">' + html.escape(for_a[2]) + '</span>'
-                    elif for_a[1] == 0:
-                        result += html.escape(for_a[2])
-                    else:
-                        result += '<span class="opennamu_diff_red">' + html.escape(for_a[2]) + '</span>'
-
-                result += '</td></tr></table>'
+            result = view_diff_do(first_raw_data, second_raw_data, 'r' + first, 'r' + second)
 
             return easy_minify(flask.render_template(skin_check(),
                 imp = [name, wiki_set(), wiki_custom(), wiki_css(['(' + load_lang('compare') + ')', 0])],

+ 19 - 6
route/view_raw.py

@@ -3,7 +3,7 @@ from .tool.func import *
 from .api_bbs_w_post import api_bbs_w_post
 from .api_bbs_w_comment_one import api_bbs_w_comment_one
 
-def view_raw_2(name = None, topic_num = None, num = None, doc_acl = 0, bbs_num = '', post_num = '', comment_num = ''):
+def view_raw(name = '', topic_num = '', num = '', doc_acl = 0, bbs_num = '', post_num = '', comment_num = ''):
     with get_db_connect() as conn:
         curs = conn.cursor()
         
@@ -12,10 +12,10 @@ def view_raw_2(name = None, topic_num = None, num = None, doc_acl = 0, bbs_num =
 
         if bbs_num != '' and post_num != '':
             if acl_check(bbs_num_str, 'bbs_view') == 1:
-                    return re_error('/ban')
+                return re_error('/ban')
                     
             name = ''
-        elif topic_num:
+        elif topic_num != '':
             topic_num = str(topic_num)
             
             if acl_check('', 'topic_view', topic_num) == 1:
@@ -37,7 +37,7 @@ def view_raw_2(name = None, topic_num = None, num = None, doc_acl = 0, bbs_num =
             
             if comment_num != '':
                 sub += ' (' + comment_num + ')'
-        elif not topic_num and num:
+        elif topic_num == '' and num != '':
             curs.execute(db_change("select title from history where title = ? and id = ? and hide = 'O'"), [name, num])
             if curs.fetchall() and admin_check(6) != 1:
                 return re_error('/error/3')
@@ -47,7 +47,7 @@ def view_raw_2(name = None, topic_num = None, num = None, doc_acl = 0, bbs_num =
             sub += ' (r' + num + ')'
 
             menu = [['history_tool/' + url_pas(num) + '/' + url_pas(name), load_lang('return')]]
-        elif topic_num:
+        elif topic_num != '':
             if admin_check(6) != 1:
                 curs.execute(db_change("select data from topic where id = ? and code = ? and block = ''"), [num, topic_num])
             else:
@@ -84,7 +84,20 @@ def view_raw_2(name = None, topic_num = None, num = None, doc_acl = 0, bbs_num =
             data = curs.fetchall()
             
         if data:
-            p_data += '<textarea readonly class="opennamu_textarea_500">' + html.escape(data[0][0]) + '</textarea>'
+            doc_preview = ''
+            if bbs_num == '' and post_num == '' and topic_num == '':
+                doc_preview = '''
+                    <textarea id="opennamu_editor_doc_name" style="display: none;">''' + html.escape(name) + '''</textarea>
+                    <button id="opennamu_preview_button" type="button" onclick="opennamu_do_editor_preview('raw');">''' + load_lang('preview') + '''</button>
+                    <hr class="main_hr">
+                '''
+
+            p_data += '''
+                <div id="opennamu_preview_area">
+                    ''' + doc_preview + '''
+                    <textarea readonly id="opennamu_edit_textarea" class="opennamu_textarea_500">''' + html.escape(data[0][0]) + '''</textarea>
+                </div>
+            '''
             
             if doc_acl == 1:
                 p_data = '' + \

+ 1 - 1
route/view_read.py

@@ -211,7 +211,7 @@ def view_read(name = 'Test', do_type = ''):
 
         curs.execute(db_change("select title from acl where title = ?"), [name])
         acl = 1 if curs.fetchall() else 0
-        menu_acl = 1 if acl_check(name) == 1 else 0
+        menu_acl = 1 if acl_check(name, 'document_edit') == 1 else 0
         if response_data == 404:
             menu += [['edit/' + url_pas(name), load_lang('create'), menu_acl]] 
         else:

+ 5 - 4
route/view_acl.py → route/view_set.py

@@ -1,6 +1,6 @@
 from .tool.func import *
 
-def view_acl(name):
+def view_set(name = 'Test'):
     with get_db_connect() as conn:
         curs = conn.cursor()
 
@@ -34,7 +34,7 @@ def view_acl(name):
                     check_ok = 'disabled'
 
         if flask.request.method == 'POST':
-            acl_data = ['decu', 'document_edit_acl', 'document_move_acl', 'document_delete_acl', 'dis', 'view', 'why']
+            acl_data = ['decu', 'document_edit_acl', 'document_edit_request_acl', 'document_move_acl', 'document_delete_acl', 'dis', 'view', 'why']
 
             for i in acl_data:
                 form_data = flask.request.form.get(i, '')
@@ -93,6 +93,7 @@ def view_acl(name):
                     [load_lang('view_acl'), 'view', '3'],
                     [load_lang('document_acl'), 'decu', '4'],
                     [load_lang('document_edit_acl'), 'document_edit_acl', '5'],
+                    [load_lang('document_edit_request_acl'), 'document_edit_request_acl', '5'],
                     [load_lang('document_move_acl'), 'document_move_acl', '5'],
                     [load_lang('document_delete_acl'), 'document_delete_acl', '5'],
                     [load_lang('discussion_acl'), 'dis', '3'],
@@ -105,7 +106,6 @@ def view_acl(name):
             for i in acl_get_list:
                 data += '' + \
                     '<h' + i[2] + '>' + i[0] + '</h' + i[2] + '>' + \
-                    '<hr class="main_hr">' + \
                     '<select name="' + i[1] + '" ' + check_ok + '>' + \
                 ''
 
@@ -154,8 +154,9 @@ def view_acl(name):
                     <li>ban_admin : ''' + load_lang('ban_admin_acl') + '''</li>
                     <li>not_all : ''' + load_lang('not_all_acl') + '''</li>
                     <li>90_day : ''' + load_lang('90_day_acl') + '''</li>
+                    <li>up_to_level_3 : ''' + load_lang('up_to_level_3') + '''</li>
+                    <li>up_to_level_10 : ''' + load_lang('up_to_level_10') + '''</li>
                 </ul>
-                <hr class="main_hr">
                 <h2>''' + load_lang('markup') + '''</h2>
             '''
 

+ 1 - 1
version.json

@@ -1,6 +1,6 @@
 {
     "beta" : {
-        "r_ver" : "v3.5.0-dev8",
+        "r_ver" : "v3.5.0-dev9",
         "c_ver" : "3500374",
         "s_ver" : "3500113"
     }

+ 2 - 0
views/main_css/js/route/bbs_w_post.js

@@ -1,3 +1,5 @@
+"use strict";
+
 function opennamu_change_comment(get_id) {
     const input = document.querySelector('#opennamu_comment_select');
     if(input !== null) {

+ 53 - 0
views/main_css/js/route/editor.js

@@ -228,4 +228,57 @@ function do_monaco_init(monaco_thema) {
 
         new PlaceholderContentWidget(document.getElementById('opennamu_edit_textarea').placeholder, window.editor);
     });
+}
+
+function opennamu_do_editor_preview(do_type = 'preview') {
+    if(do_type === 'preview') {
+        do_sync_monaco_and_textarea();
+    }
+
+    const input = document.querySelector('#opennamu_edit_textarea');
+    if(input !== null) {
+        let doc_name = 'test';
+
+        const doc_name_input = document.querySelector('#opennamu_editor_doc_name');
+        if(doc_name_input !== null) {
+            doc_name = doc_name_input.value;
+        }
+
+        fetch("/api/render/" + (opennamu_do_url_encode(doc_name)), {
+            method : 'POST',
+            headers : { 'Content-Type': 'application/x-www-form-urlencoded' },
+            body : new URLSearchParams({
+                'data': input.value,
+            })
+        }).then(function(res) {
+            return res.json();
+        }).then(function(text) {
+            const preview = document.querySelector('#opennamu_preview_area');
+            if(preview !== null) {
+                preview.innerHTML = text.data;
+                eval(text.js_data);
+            }
+        });
+    }
+}
+
+function opennamu_do_editor_temp_save() {
+    do_sync_monaco_and_textarea();
+
+    const input = document.querySelector('#opennamu_edit_textarea');
+    if(input !== null) {
+        localStorage.setItem("key", input.value);
+    }
+}
+
+function opennamu_do_editor_temp_save_load() {
+    const data = localStorage.getItem("key");
+    if(data !== null) {
+        const input = document.querySelector('#opennamu_edit_textarea');
+        if(input !== null) {
+            input.value = data;
+        }
+        
+        do_textarea_to_manaco();
+    }
 }

+ 0 - 50
views/main_css/js/route/editor_sub.js

@@ -1,50 +0,0 @@
-function opennamu_do_editor_preview() {
-    do_sync_monaco_and_textarea();
-
-    const input = document.querySelector('#opennamu_edit_textarea');
-    if(input !== null) {
-        let doc_name = 'test';
-
-        const doc_name_input = document.querySelector('#opennamu_editor_doc_name');
-        if(doc_name_input !== null) {
-            doc_name = doc_name_input.value;
-        }
-
-        fetch("/api/render/" + (opennamu_do_url_encode(doc_name)), {
-            method : 'POST',
-            headers : { 'Content-Type': 'application/x-www-form-urlencoded' },
-            body : new URLSearchParams({
-                'data': input.value,
-            })
-        }).then(function(res) {
-            return res.json();
-        }).then(function(text) {
-            const preview = document.querySelector('#opennamu_preview_area');
-            if(preview !== null) {
-                preview.innerHTML = text.data;
-                eval(text.js_data);
-            }
-        });
-    }
-}
-
-function opennamu_do_editor_temp_save() {
-    do_sync_monaco_and_textarea();
-
-    const input = document.querySelector('#opennamu_edit_textarea');
-    if(input !== null) {
-        localStorage.setItem("key", input.value);
-    }
-}
-
-function opennamu_do_editor_temp_save_load() {
-    const data = localStorage.getItem("key");
-    if(data !== null) {
-        const input = document.querySelector('#opennamu_edit_textarea');
-        if(input !== null) {
-            input.value = data;
-        }
-        
-        do_textarea_to_manaco();
-    }
-}

+ 21 - 0
views/main_css/js/route/topic.js

@@ -1,3 +1,5 @@
+"use strict";
+
 function opennamu_do_remove_blind_thread() {
     const style = document.querySelector('#opennamu_remove_blind');
     if(style !== null) {
@@ -11,4 +13,23 @@ function opennamu_do_remove_blind_thread() {
             `;
         }
     }
+}
+
+function opennamu_thread_blind() {
+    let do_true = 0;
+    for(let for_a = 0; for_a < document.getElementsByClassName("opennamu_blind_button").length; for_a++) {
+        let id = document.getElementsByClassName("opennamu_blind_button")[for_a].id;
+        id = id.replace(/^opennamu_blind_/, '');
+        id = id.split('_');
+
+        let checked = document.getElementsByClassName("opennamu_blind_button")[for_a].checked;
+        if(checked) {
+            fetch("/thread/" + id[0] + '/comment/' + id[1] + '/blind', { method : 'GET' });
+            do_true = 1;
+        }
+    }
+
+    if(do_true === 1) {
+        history.go(0);
+    }
 }

+ 0 - 20
views/main_css/js/route/topic_sub.js

@@ -1,20 +0,0 @@
-"use strict";
-
-function opennamu_thread_blind() {
-    let do_true = 0;
-    for(let for_a = 0; for_a < document.getElementsByClassName("opennamu_blind_button").length; for_a++) {
-        let id = document.getElementsByClassName("opennamu_blind_button")[for_a].id;
-        id = id.replace(/^opennamu_blind_/, '');
-        id = id.split('_');
-
-        let checked = document.getElementsByClassName("opennamu_blind_button")[for_a].checked;
-        if(checked) {
-            fetch("/thread/" + id[0] + '/comment/' + id[1] + '/blind', { method : 'GET' });
-            do_true = 1;
-        }
-    }
-
-    if(do_true === 1) {
-        history.go(0);
-    }
-}