Explorar o código

Merge pull request #234 from 2DU/master

Master
ect (or 2du) %!s(int64=8) %!d(string=hai) anos
pai
achega
c9831f83eb
Modificáronse 3 ficheiros con 188 adicións e 263 borrados
  1. 171 262
      app.py
  2. 16 0
      func.py
  3. 1 1
      version.md

+ 171 - 262
app.py

@@ -53,21 +53,10 @@ from func import *
 
 BaseRequest.MEMFILE_MAX = 1000 ** 4
 
-r_ver = '2.4.1c'
+r_ver = '2.4.3'
 
 # 스킨 불러오기 부분
-try:
-    curs.execute('select data from other where name = "skin"')
-    skin_exist = curs.fetchall()
-    if(skin_exist):
-        if(os.path.exists(os.path.abspath('./views/' + skin_exist[0][0] + '/index.tpl')) == 1):
-            TEMPLATE_PATH.insert(0, './views/' + skin_exist[0][0] + '/')
-        else:
-            TEMPLATE_PATH.insert(0, './views/acme/')
-    else:
-        TEMPLATE_PATH.insert(0, './views/acme/')
-except:
-    TEMPLATE_PATH.insert(0, './views/acme/')
+TEMPLATE_PATH.insert(0, skin_check())
 
 # 테이블 생성 부분
 try:
@@ -377,6 +366,7 @@ def edit_set(num = 0):
             curs.execute("update other set data = ? where name = 'back_up'", [request.forms.back_up])
             conn.commit()
 
+            TEMPLATE_PATH.insert(0, skin_check())
             return(redirect('/edit_set/1'))
         else:
             i_list = ['name', 'logo', 'frontpage', 'license', 'upload', 'skin', 'edit', 'reg', 'ip_view', 'back_up']
@@ -455,7 +445,7 @@ def edit_set(num = 0):
                                     <input placeholder="파일 용량 한도" type="text" name="upload" value="' + html.escape(d_list[4]) + '"> \
                                     <br> \
                                     <br> \
-                                    <span>스킨 (재시작 필요)</span> \
+                                    <span>스킨</span> \
                                     <br> \
                                     <br> \
                                     <input placeholder="스킨" type="text" name="skin" value="' + html.escape(d_list[5]) + '"> \
@@ -611,7 +601,6 @@ def edit_set(num = 0):
 @route('/not_close_topic')
 def not_close_topic():
     div = '<ul>'
-    i = 1
 
     curs.execute('select title, sub from rd order by date desc')
     n_list = curs.fetchall()
@@ -619,8 +608,7 @@ def not_close_topic():
         curs.execute('select * from stop where title = ? and sub = ? and close = "O"', [data[0], data[1]])
         is_close = curs.fetchall()
         if(not is_close):
-            div += '<li>' + str(i) + '. <a href="/topic/' + url_pas(data[0]) + '/sub/' + url_pas(data[1]) + '">' + data[0] + ' (' + data[1] + ')</a></li>'
-            i += 1
+            div += '<li><a href="/topic/' + url_pas(data[0]) + '/sub/' + url_pas(data[1]) + '">' + data[0] + ' (' + data[1] + ')</a></li>'
             
     div += '</ul>'
 
@@ -644,20 +632,17 @@ def static(name = None):
 @route('/acl_list')
 def acl_list():
     div = '<ul>'
-    i = 0
 
     curs.execute("select title, acl from data where acl = 'admin' or acl = 'user' order by acl desc")
     list_data = curs.fetchall()
     for data in list_data:
-        if(not re.search('^사용자:', data[0])):
+        if(not re.search('^사용자:', data[0]) and not re.search('^파일:', data[0])):
             if(data[1] == 'admin'):
                 acl = '관리자'
             else:
                 acl = '가입자'
 
-            div += '<li>' + str(i + 1) + '. <a href="/w/' + url_pas(data[0]) + '">' + data[0] + '</a> (' + acl + ')</li>'
-            
-            i += 1
+            div += '<li><a href="/w/' + url_pas(data[0]) + '">' + data[0] + '</a> (' + acl + ')</li>'
         
     div += '</ul>'
     
@@ -670,52 +655,13 @@ def acl_list():
             )
         )
     )
-    
-@route('/list_acl')
-def list_acl():
-    div = '<ul>'
-    i = 0
-
-    curs.execute("select name, acl from alist order by name desc")
-    list_data = curs.fetchall()
-    for data in list_data:
-        if(data[1] == 'ban'):
-            acl = '차단'
-        elif(data[1] == 'mdel'):
-            acl = '많은 문서 삭제'
-        elif(data[1] == 'toron'):
-            acl = '토론 관리'
-        elif(data[1] == 'check'):
-            acl = '사용자 검사'
-        elif(data[1] == 'acl'):
-            acl = '문서 ACL'
-        elif(data[1] == 'hidel'):
-            acl = '역사 숨김'
-        elif(data[1] == 'owner'):
-            acl = '소유자'
-            
-        div += '<li>' + str(i + 1) + '. <a href="/admin_plus/' + url_pas(data[0]) + '">' + data[0] + '</a> (' + acl + ')</li>'
-        
-        i += 1
-    
-    div += '</ul><br><a href="/manager/8">(생성)</a>'
-
-    return(
-        html_minify(
-            template('index',    
-                imp = ['ACL 목록', wiki_set(1), custom(), other2([0, 0])],
-                data = re.sub('^<ul></ul><br>', '', div),
-                menu = [['manager', '관리자']]
-            )
-        )
-    )
 
 @route('/admin_plus/<name:path>', method=['POST', 'GET'])
 def admin_plus(name = None):
-    if(admin_check(None, 'admin_plus (' + name + ')') != 1):
-        return(re_error('/error/3'))
-
     if(request.method == 'POST'):
+        if(admin_check(None, 'admin_plus (' + name + ')') != 1):
+            return(re_error('/error/3'))
+
         curs.execute("delete from alist where name = ?", [name])
         
         if(request.forms.ban):
@@ -736,6 +682,9 @@ def admin_plus(name = None):
         if(request.forms.hidel):
             curs.execute("insert into alist (name, acl) values (?, 'hidel')", [name])
 
+        if(request.forms.give):
+            curs.execute("insert into alist (name, acl) values (?, 'give')", [name])
+
         if(request.forms.owner):
             curs.execute("insert into alist (name, acl) values (?, 'owner')", [name])
             
@@ -744,12 +693,12 @@ def admin_plus(name = None):
         return(redirect('/admin_plus/' + url_pas(name)))
     else:
         curs.execute('select acl from alist where name = ?', [name])
-        test = curs.fetchall()
+        acl_list = curs.fetchall()
         
         data = '<ul>'
-        exist_list = ['', '', '', '', '', '', '']
+        exist_list = ['', '', '', '', '', '', '', '']
 
-        for go in test:
+        for go in acl_list:
             if(go[0] == 'ban'):
                 exist_list[0] = 'checked="checked"'
             elif(go[0] == 'mdel'):
@@ -762,16 +711,24 @@ def admin_plus(name = None):
                 exist_list[4] = 'checked="checked"'
             elif(go[0] == 'hidel'):
                 exist_list[5] = 'checked="checked"'
-            elif(go[0] == 'owner'):
+            elif(go[0] == 'give'):
                 exist_list[6] = 'checked="checked"'
+            elif(go[0] == 'owner'):
+                exist_list[7] = 'checked="checked"'
+
+        if(admin_check(None, None) != 1):
+            state = 'disabled'
+        else:
+            state = ''
 
-        data += '<li><input type="checkbox" name="ban" ' + exist_list[0] + '> 차단</li>'
-        data += '<li><input type="checkbox" name="mdel" ' + exist_list[1] + '> 많은 문서 삭제</li>'
-        data += '<li><input type="checkbox" name="toron" ' + exist_list[2] + '> 토론 관리</li>'
-        data += '<li><input type="checkbox" name="check" ' + exist_list[3] + '> 사용자 검사</li>'
-        data += '<li><input type="checkbox" name="acl" ' + exist_list[4] + '> 문서 ACL</li>'
-        data += '<li><input type="checkbox" name="hidel" ' + exist_list[5] + '> 역사 숨김</li>'
-        data += '<li><input type="checkbox" name="owner" ' + exist_list[6] + '> 소유자</li></ul>'
+        data += '<li><input type="checkbox" ' + state +  ' name="ban" ' + exist_list[0] + '> 차단</li>'
+        data += '<li><input type="checkbox" ' + state +  ' name="mdel" ' + exist_list[1] + '> 많은 문서 삭제</li>'
+        data += '<li><input type="checkbox" ' + state +  ' name="toron" ' + exist_list[2] + '> 토론 관리</li>'
+        data += '<li><input type="checkbox" ' + state +  ' name="check" ' + exist_list[3] + '> 사용자 검사</li>'
+        data += '<li><input type="checkbox" ' + state +  ' name="acl" ' + exist_list[4] + '> 문서 ACL</li>'
+        data += '<li><input type="checkbox" ' + state +  ' name="hidel" ' + exist_list[5] + '> 역사 숨김</li>'
+        data += '<li><input type="checkbox" ' + state +  ' name="give" ' + exist_list[6] + '> 권한 부여</li>'
+        data += '<li><input type="checkbox" ' + state +  ' name="owner" ' + exist_list[7] + '> 소유자</li></ul>'
 
         return(
             html_minify(
@@ -780,7 +737,7 @@ def admin_plus(name = None):
                     data = '<form method="post">' \
                                 + data + \
                                 '<div class="form-actions"> \
-                                    <button class="btn btn-primary" type="submit">저장</button> \
+                                    <button ' + state +  ' class="btn btn-primary" type="submit">저장</button> \
                                 </div> \
                             </form>',
                     menu = [['manager', '관리자']]
@@ -790,18 +747,14 @@ def admin_plus(name = None):
         
 @route('/admin_list')
 def admin_list():
-    i = 1
     div = '<ul>'
     
     curs.execute("select id, acl from user where not acl = 'user'")
     user_data = curs.fetchall()
 
     for data in user_data:
-        name = ip_pas(data[0]) + ' (' + data[1] + ')'
-
-        div += '<li>' + str(i) + '. ' + name + '</li>'
-        
-        i += 1
+        name = ip_pas(data[0]) + ' (<a href="/admin_plus/' + url_pas(data[1]) + '">' + data[1] + '</a>)'
+        div += '<li>' + name + '</li>'
         
     div += '</ul>'
                 
@@ -832,16 +785,14 @@ def recent_changes(name = None, num = 1):
                     </tr>'
     
     if(name):
-        if(num * 50 <= 0):
-            v = 50
+        if(num * 50 > 0):
+            sql_num = num * 50 - 50
         else:
-            v = num * 50
-            
-        i = v - 50
+            sql_num = 0            
 
         div = '<a href="/user/' + url_pas(name) + '/topic">(토론 기록)</a><br><br>' + div
 
-        curs.execute("select id, title, date, ip, send, leng from history where ip = ? order by date desc limit ?, ?", [name, str(i), str(v)])
+        curs.execute("select id, title, date, ip, send, leng from history where ip = ? order by date desc limit ?, '50'", [name, str(sql_num)])
     else:
         curs.execute("select id, title, date, ip, send, leng from history where not date = 'Dump' order by date desc limit 50")
 
@@ -949,19 +900,18 @@ def history_hidden(name = None, num = None):
 @route('/user_log')
 @route('/user_log/n/<num:int>')
 def user_log(num = 1):
-    if(num * 50 <= 0):
-         i = 50
+    if(num * 50 > 0):
+        sql_num = num * 50 - 50
     else:
-        i = num * 50
+        sql_num = 0
         
-    j = i - 50
     list_data = '<ul>'
-    ydmin = admin_check(1, None)
+    admin_one = admin_check(1, None)
     
-    curs.execute("select id from user limit ?, ?", [str(j), str(i)])
+    curs.execute("select id from user limit ?, '50'", [str(sql_num)])
     user_list = curs.fetchall()
     for data in user_list:
-        if(ydmin == 1):
+        if(admin_one == 1):
             curs.execute("select block from ban where block = ?", [data[0]])
             ban_exist = curs.fetchall()
             if(ban_exist):
@@ -972,10 +922,7 @@ def user_log(num = 1):
             ban_button = ''
             
         ip = ip_pas(data[0])
-            
-        list_data += '<li>' + str(j + 1) + '. ' + ip + ban_button + '</li>'
-        
-        j += 1
+        list_data += '<li>' + ip + ban_button + '</li>'
     else:
         list_data += '</ul><br><a href="/user_log/n/' + str(num - 1) + '">(이전)</a> <a href="/user_log/n/' + str(num + 1) + '">(이후)</a>'
 
@@ -992,28 +939,21 @@ def user_log(num = 1):
 @route('/admin_log')
 @route('/admin_log/n/<num:int>')
 def user_log(num = 1):
-    if(num * 50 <= 0):
-         i = 50
+    if(num * 50 > 0):
+        sql_num = num * 50 - 50
     else:
-        i = num * 50
-        
-    j = i - 50
+        sql_num = 0
+
     list_data = '<ul>'
     
-    curs.execute("select who, what, time from re_admin order by time desc limit ?, ?", [str(j), str(i)])
+    curs.execute("select who, what, time from re_admin order by time desc limit ?, '50'", [str(sql_num)])
     get_list = curs.fetchall()
     for data in get_list:            
         ip = ip_pas(data[0])
-            
-        list_data += '<li>' + str(j + 1) + '. ' + ip + ' / ' + data[1] + ' / ' + data[2] + '</li>'
-        
-        j += 1
-    else:
-        list_data +=    '</ul><br> \
-                        <span>주의 : 권한 사용 안하고 열람만 해도 기록되는 경우도 있습니다.</span> \
-                        <br> \
-                        <br> \
-                        <a href="/admin_log/n/' + str(num - 1) + '">(이전)</a> <a href="/admin_log/n/' + str(num + 1) + '">(이후)</a>'
+        list_data += '<li>' + ip + ' / ' + data[1] + ' / ' + data[2] + '</li>'
+
+    list_data += '</ul><br><span>주의 : 권한 사용 안하고 열람만 해도 기록되는 경우도 있습니다.</span><br><br>'
+    list_data += '<a href="/admin_log/n/' + str(num - 1) + '">(이전)</a> <a href="/admin_log/n/' + str(num + 1) + '">(이후)</a>'
 
     return(
         html_minify(
@@ -1028,42 +968,24 @@ def user_log(num = 1):
 @route('/give_log')
 @route('/give_log/n/<num:int>')
 def give_log(num = 1):
-    if(num * 50 <= 0):
-         i = 50
+    if(num * 50 > 0):
+        sql_num = num * 50 - 50
     else:
-        i = num * 50
+        sql_num = 0
         
-    j = i - 50
     list_data = '<ul>'
     back = ''
 
-    curs.execute("select name, acl from alist order by name asc limit ?, ?", [str(j), str(i)])
+    curs.execute("select distinct name from alist order by name asc limit ?, '50'", [str(sql_num)])
     get_list = curs.fetchall()
     for data in get_list:                      
         if(back != data[0]):
             back = data[0]
-            j += 1
-
-        list_data += '<li>' + str(j) + '. ' + data[0] + ' ('
-        
-        if(data[1] == 'ban'):
-            d = '차단'
-        elif(data[1] == 'mdel'):
-            d = '많은 문서 삭제'
-        elif(data[1] == 'toron'):
-            d = '토론'
-        elif(data[1] == 'check'):
-            d = '사용자 검사'
-        elif(data[1] == 'acl'):
-            d = 'ACL'
-        elif(data[1] == 'hidel'):
-            d = '역사 가리기'
-        else:
-            d = '소유자'
-            
-        list_data += d + ')</li>'
-    else:
-        list_data += '</ul><br><a href="/give_log/n/' + str(num - 1) + '">(이전)</a> <a href="/give_log/n/' + str(num + 1) + '">(이후)</a>'
+
+        list_data += '<li><a href="/admin_plus/' + url_pas(data[0]) + '">' + data[0] + '</a></li>'
+    
+    list_data += '</ul><a href="/manager/8">(생성)</a>'
+    list_data += '<br><br><a href="/give_log/n/' + str(num - 1) + '">(이전)</a> <a href="/give_log/n/' + str(num + 1) + '">(이후)</a>'
 
     return(
         html_minify(
@@ -1100,27 +1022,26 @@ def indexing():
 @route('/xref/<name:path>')
 @route('/xref/<name:path>/n/<num:int>')
 def xref(name = None, num = 1):
-    if(num * 50 <= 0):
-        v = 50
+    if(num * 50 > 0):
+        sql_num = num * 50 - 50
     else:
-        v = num * 50
+        sql_num = 0
         
-    i = v - 50
     div = '<ul>'
     
-    curs.execute("select link, type from back where title = ? and not type = 'cat' and not type = 'no' order by link asc limit ?, ?", [name, str(i), str(v)])
+    curs.execute("select link, type from back where title = ? and not type = 'cat' and not type = 'no' order by link asc limit ?, '50'", [name, str(sql_num)])
     for data in curs.fetchall():
         div += '<li><a href="/w/' + url_pas(data[0]) + '">' + data[0] + '</a>'
         
         if(data[1]):
             if(data[1] == 'include'):
-                d = '포함'
+                side = '포함'
             elif(data[1] == 'file'):
-                d = '파일'
+                side = '파일'
             else:
-                d = '넘겨주기'
+                side = '넘겨주기'
                 
-            div += ' (' + d + ')'
+            div += ' (' + side + ')'
         
         div += '</li>'
         
@@ -1142,21 +1063,18 @@ def xref(name = None, num = 1):
 @route('/please')
 @route('/please/<num:int>')
 def please(num = 1):
-    if(num * 50 <= 0):
-        v = 50
+    if(num * 50 > 0):
+        sql_num = num * 50 - 50
     else:
-        v = num * 50
+        sql_num = 0
         
-    i = v - 50
     div = '<ul>'
     var = ''
     
-    i += 1
-    curs.execute("select distinct title from back where type = 'no' order by title asc limit ?, ?", [str(i), str(v)])
+    curs.execute("select distinct title from back where type = 'no' order by title asc limit ?, '50'", [str(sql_num)])
     for data in curs.fetchall():
         if(var != data[0]):
-            div += '<li>' + str(i) + '. <a class="not_thing" href="/w/' + url_pas(data[0]) + '">' + data[0] + '</a></li>'        
-            i += 1
+            div += '<li><a class="not_thing" href="/w/' + url_pas(data[0]) + '">' + data[0] + '</a></li>'        
             var = data[0]
         
     div += '</ul><br><a href="/please/' + str(num - 1) + '">(이전)</a> <a href="/please/' + str(num + 1) + '">(이후)</a>'
@@ -1234,12 +1152,11 @@ def recent_discuss(tools = 'normal'):
 @route('/block_log')
 @route('/block_log/n/<num:int>')
 def block_log(num = 1):
-    if(num * 50 <= 0):
-        v = 50
+    if(num * 50 > 0):
+        sql_num = num * 50 - 50
     else:
-        v = num * 50
+        sql_num = 0
     
-    i = v - 50
     div =   '<table style="width: 100%; text-align: center;"> \
                 <tbody> \
                     <tr> \
@@ -1252,7 +1169,7 @@ def block_log(num = 1):
                         <td>시간</td> \
                     </tr>'
     
-    curs.execute("select why, block, blocker, end, today from rb order by today desc limit ?, ?", [str(i), str(v)])
+    curs.execute("select why, block, blocker, end, today from rb order by today desc limit ?, '50'", [str(sql_num)])
     for data in curs.fetchall():
         why = html.escape(data[0])
         
@@ -1299,12 +1216,10 @@ def history_view(name = None, num = 1):
         return(redirect('/w/' + url_pas(name) + '/r/' + request.forms.b + '/diff/' + request.forms.a))
     else:
         select = ''
-        if(num * 50 <= 0):
-            i = 50
+        if(num * 50 > 0):
+            sql_num = num * 50 - 50
         else:
-            i = num * 50
-            
-        j = i - 50
+            sql_num = 0
  
         admin1 = admin_check(1, None)
         admin2 = admin_check(6, None)
@@ -1317,7 +1232,7 @@ def history_view(name = None, num = 1):
                             <td style="width: 33.3%;">시간</td> \
                         </tr>'
         
-        curs.execute("select send, leng, ip, date, title, id from history where title = ? order by id + 0 desc limit ?, ?", [name, str(j), str(i)])
+        curs.execute("select send, leng, ip, date, title, id from history where title = ? order by id + 0 desc limit ?, '50'", [name, str(sql_num)])
         all_data = curs.fetchall()
         for data in all_data:
             select += '<option value="' + data[5] + '">' + data[5] + '</option>'
@@ -1396,7 +1311,7 @@ def history_view(name = None, num = 1):
                         ' + select + ' \
                     </select> \
                     <button class="btn btn-primary" type="submit">비교</button> \
-                </form>' + div
+                </form><br>' + div
 
         return(
             html_minify(
@@ -1424,22 +1339,17 @@ def goto():
 @route('/search/<name:path>')
 @route('/search/<name:path>/n/<num:int>')
 def deep_search(name = None, num = 1):
-    if(num * 50 <= 0):
-        v = num * 50
+    if(num * 50 > 0):
+        sql_num = num * 50 - 50
     else:
-        v = 50
-
-    i = v - 50
+        sql_num = 0
 
     div = '<ul>'
     div_plus = ''
-    end = ''
+    no = 0
 
-    curs.execute("select title from data where title like ?", ['%' + name + '%'])
-    title_list = curs.fetchall()
-
-    curs.execute("select title from data where data like ?", ['%' + name + '%'])
-    data_list = curs.fetchall()
+    curs.execute("select distinct title from data where title like ? or data like ? order by case when title like ? then 1 else 2 end limit ?, '50'", ['%' + name + '%', '%' + name + '%', '%' + name + '%', str(sql_num)])
+    all_list = curs.fetchall()
 
     curs.execute("select title from data where title = ?", [name])
     exist = curs.fetchall()
@@ -1447,24 +1357,9 @@ def deep_search(name = None, num = 1):
         div = '<ul><li>문서로 <a href="/w/' + url_pas(name) + '">바로가기</a></li><br><br>'
     else:
         div = '<ul><li>문서가 없습니다. <a class="not_thing" href="/w/' + url_pas(name) + '">바로가기</a></li><br><br>'
-
-    if(title_list):
-        no = 0
-
-        if(data_list):
-            all_list = title_list + data_list
-        else:
-            all_list = title_list
-    else:
-        if(data_list):
-            no = 1
-
-            all_list = data_list
-        else:
-            all_list = ''
     
-    start = 0
-    if(all_list != ''):
+    start = 2
+    if(all_list):
         for data in all_list:
             try:
                 var_re = re.search(name, data[0])
@@ -1473,25 +1368,23 @@ def deep_search(name = None, num = 1):
                 
             if(var_re):
                 if(no == 0):
-                    div += '<li><a href="/w/' + url_pas(data[0]) + '">' + data[0] + '</a> (제목)</li>'
+                    div_plus += '<li><a href="/w/' + url_pas(data[0]) + '">' + data[0] + '</a> (제목)</li>'
+                    start = 0
                 else:
-                    if(start == 0):
+                    if(start == 0 and div_plus != ''):
                         start = 1
                         div_plus += '<hr>'
                     div_plus += '<li><a href="/w/' + url_pas(data[0]) + '">' + data[0] + '</a> (내용)</li>'
             else:
                 no = 1
-                if(start == 0):
+                if(start == 0 and div_plus != ''):
                     start = 1
                     div_plus += '<hr>'
                 div_plus += '<li><a href="/w/' + url_pas(data[0]) + '">' + data[0] + '</a> (내용)</li>'
-
-            
     else:
         div += '<li>검색 결과 없음</li>'
 
-    div += div_plus + end
-
+    div += div_plus
     div += '</ul><br><a href="/search/' + url_pas(name) + '/n/' + str(num - 1) + '">(이전)</a> <a href="/search/' + url_pas(name) + '/n/' + str(num + 1) + '">(이후)</a>'
     
     return(
@@ -1895,30 +1788,32 @@ def delete(name = None):
         )            
             
 @route('/move_data/<name:path>')
-@route('/move_data/<name:path>/<n:int>')
-def move_data(name = None, n = 1):
-    if(n > 0):
-        i = n
-    else:
-        i = 1
-       
-    j = i * 50
-    da = '<ul>'
+@route('/move_data/<name:path>/<num:int>')
+def move_data(name = None, num = 1):
+    if(num * 50 > 0):
+        sql_num = num * 50 - 50
+    else:
+        sql_num = 0
+
+    data = '<ul>'
     
-    curs.execute("select origin, new, date, who, send from move where origin = ? or new = ? order by date desc limit ?, ?", [name, name, j - 50, j])
-    for d in curs.fetchall():
-        if(d[4] == ''):
-            sn = '(없음)'
+    curs.execute("select origin, new, date, who, send from move where origin = ? or new = ? order by date desc limit ?, '50'", [name, name, str(sql_num)])
+    for for_data in curs.fetchall():
+        if(for_data[4] == ''):
+            side = '(없음)'
         else:
-            sn = d[4]
-        da += '<li><a href="/move_data/' + url_pas(d[0]) + '">' + d[0] + '</a> - <a href="/move_data/' + url_pas(d[1]) + '">' + d[1] + '</a> / ' + d[2] + ' / ' + d[3] + ' / ' + sn + '</li>'
-    da += '</ul><br><a href="/move_data/' + name + '/' + str(n - 1) + '">(이전)</a> <a href="/move_data/' + name + '/' + str(n + 1) + '">(이후)</a>'
+            side = for_data[4]
+
+        data += '<li><a href="/move_data/' + url_pas(for_data[0]) + '">' + for_data[0] + '</a> - <a href="/move_data/' + url_pas(for_data[1]) + '">' + for_data[1] + '</a>'
+        data += '/ ' + for_data[2] + ' / ' + for_data[3] + ' / ' + side + '</li>'
+    
+    data += '</ul><br><a href="/move_data/' + url_pas(name) + '/' + str(num - 1) + '">(이전)</a> <a href="/move_data/' + url_pas(name) + '/' + str(num + 1) + '">(이후)</a>'
     
     return(
         html_minify(
             template('index', 
                 imp = [name, wiki_set(1), custom(), other2([' (이동)', 0])],
-                data = da,
+                data = data,
                 menu = [['w/' + url_pas(name), '문서']]
             )
         )
@@ -2271,22 +2166,22 @@ def json_in():
 @route('/title_index')
 @route('/title_index/<num:int>/<page:int>')
 def title_index(num = 1000, page = 1):
-    if(page > 0):
-        v_page = page * num
+    if(page * num > 0):
+        sql_num = page * num - page
     else:
-        v_page = 1 * num
+        sql_num = 1 * num - page
 
     if(num != 0):
-        i = [v_page - num + 1]
+        all_list = [sql_num + 1, 0, 0, 0, 0, 0]
     else:
-        i = [1, 0, 0, 0, 0, 0]
+        all_list = [1, 0, 0, 0, 0, 0]
 
     data = '<ul><a href="/title_index/0/1">(전체)</a> <a href="/title_index/500/1">(500)</a> <a href="/title_index/5000/1">(5000개)</a> <a href="/title_index/10000/1">(10000개)</a> <a href="/title_index/50000/1">(50000개)</a><br><br>'
 
     if(num == 0):
         curs.execute("select title from data order by title asc")
     else:
-        curs.execute("select title from data order by title asc limit ?, ?", [str(v_page - num), str(num)])
+        curs.execute("select title from data order by title asc limit ?, '50'", [str(sql_num)])
     title_list = curs.fetchall()
 
     for list_data in title_list:
@@ -2294,26 +2189,26 @@ def title_index(num = 1000, page = 1):
 
         if(num == 0):
             if(re.search('^분류:', list_data[0])):
-                i[1] += 1
+                all_list[1] += 1
             elif(re.search('^사용자:', list_data[0])):
-                i[2] += 1
+                all_list[2] += 1
             elif(re.search('^틀:', list_data[0])):
-                i[3] += 1
+                all_list[3] += 1
             elif(re.search('^파일:', list_data[0])):
-                i[4] += 1
+                all_list[4] += 1
             else:
-                i[5] += 1
+                all_list[5] += 1
         
-        i[0] += 1
+        all_list[0] += 1
 
     if(num == 0):
         if(title_list):        
-            data += '<br><br><li>이 위키에는 총 ' + str(i[0]) + '개의 문서가 있습니다.</li><br><br> \
-                    <li>틀 문서는 총 ' + str(i[3]) + '개의 문서가 있습니다.</li> \
-                    <li>분류 문서는 총 ' + str(i[1]) + '개의 문서가 있습니다.</li> \
-                    <li>사용자 문서는 총 ' + str(i[2]) + '개의 문서가 있습니다.</li> \
-                    <li>파일 문서는 총 ' + str(i[4]) + '개의 문서가 있습니다.</li> \
-                    <li>나머지 문서는 총 ' + str(i[5]) + '개의 문서가 있습니다.</li>'
+            data += '<br><br><li>이 위키에는 총 ' + str(all_list[0]) + '개의 문서가 있습니다.</li><br><br> \
+                    <li>틀 문서는 총 ' + str(all_list[3]) + '개의 문서가 있습니다.</li> \
+                    <li>분류 문서는 총 ' + str(all_list[1]) + '개의 문서가 있습니다.</li> \
+                    <li>사용자 문서는 총 ' + str(all_list[2]) + '개의 문서가 있습니다.</li> \
+                    <li>파일 문서는 총 ' + str(all_list[4]) + '개의 문서가 있습니다.</li> \
+                    <li>나머지 문서는 총 ' + str(all_list[5]) + '개의 문서가 있습니다.</li>'
     else:
         data += '</ul><br><a href="/title_index/' + str(num) + '/' + str(page - 1) + '">(이전)</a> <a href="/title_index/' + str(num) + '/' + str(page + 1) + '">(이후)</a>'
     
@@ -3281,10 +3176,29 @@ def acl(name = None):
             
 @route('/admin/<name:path>', method=['POST', 'GET'])
 def user_admin(name = None):
+    owner = admin_check(None, None)
+
+    curs.execute("select acl from user where id = ?", [name])
+    user = curs.fetchall()
+    if(not user):
+        return(re_error('/error/5'))
+    else:
+        if(owner != 1):
+            curs.execute('select name from alist where name = ? and acl = "owner"', [user[0][0]])
+            if(curs.fetchall()):
+                return(re_error('/error/3'))
+
+            if(ip_check() == name):
+                return(re_error('/error/3'))
+
     if(request.method == 'POST'):
-        if(admin_check(None, 'admin (' + name + ')') != 1):
+        if(admin_check(7, 'admin (' + name + ')') != 1):
             return(re_error('/error/3'))
 
+            curs.execute('select name from alist where name = ? and acl = "owner"', [request.forms.select])
+            if(curs.fetchall()):
+                return(re_error('/error/3'))
+
         if(request.forms.select == 'X'):
             curs.execute("update user set acl = 'user' where id = ?", [name])
         else:
@@ -3293,26 +3207,24 @@ def user_admin(name = None):
         
         return(redirect('/admin/' + url_pas(name)))            
     else:
-        if(admin_check(None, None) != 1):
-            return(re_error('/error/3'))
-
-        curs.execute("select acl from user where id = ?", [name])
-        user = curs.fetchall()
-        if(not user):
-            return(re_error('/error/5'))
+        if(admin_check(7, None) != 1):
+            return(re_error('/error/3'))            
 
         div = '<option value="X">X</option>'
             
-        curs.execute('select name from alist order by name asc')
+        curs.execute('select distinct name from alist order by name asc')
         get_alist = curs.fetchall()
         if(get_alist):
             i = 0
             name_rem = ''
             for data in get_alist:
-                if(name_rem != data[0]):
-                    name_rem = data[0]
-                    if(user[0][0] == data[0]):
-                        div += '<option value="' + data[0] + '" selected="selected">' + data[0] + '</option>'
+                if(user[0][0] == data[0]):
+                    div += '<option value="' + data[0] + '" selected="selected">' + data[0] + '</option>'
+                else:
+                    if(owner != 1):
+                        curs.execute('select name from alist where name = ? and acl = "owner"', [data[0]])
+                        if(not curs.fetchall()):
+                            div += '<option value="' + data[0] + '">' + data[0] + '</option>'
                     else:
                         div += '<option value="' + data[0] + '">' + data[0] + '</option>'
         
@@ -3376,11 +3288,9 @@ def down(name = None):
     under = curs.fetchall()
     
     div = '<ul>'
-    i = 0
 
     for data in under:
-        div += '<li>' + str(i + 1) + '. <a href="/w/' + url_pas(data[0]) + '">' + data[0] + '</a></li>'
-        i += 1
+        div += '<li><a href="/w/' + url_pas(data[0]) + '">' + data[0] + '</a></li>'
         
     div += '</ul>'
     
@@ -3563,12 +3473,11 @@ def read_view(name = None, num = None, redirect = None):
 @route('/user/<name:path>/topic')
 @route('/user/<name:path>/topic/<num:int>')
 def user_topic_list(name = None, num = 1):
-    if(num * 50 <= 0):
-        v = 50
+    if(num * 50 > 0):
+        sql_num = num * 50 - 50
     else:
-        v = num * 50
+        sql_num = 0
     
-    i = v - 50
     ydmin = admin_check(1, None)
     div =   '<table style="width: 100%; text-align: center;"> \
                 <tbody> \
@@ -3580,7 +3489,7 @@ def user_topic_list(name = None, num = 1):
 
     div = '<a href="/record/' + url_pas(name) + '">(기여 기록)</a><br><br>' + div
     
-    curs.execute("select title, id, sub, ip, date from topic where ip = ? order by date desc limit ?, ?", [name, str(i), str(v)])
+    curs.execute("select title, id, sub, ip, date from topic where ip = ? order by date desc limit ?, '50'", [name, str(sql_num)])
     for data in curs.fetchall():
         title = html.escape(data[0])
         sub = html.escape(data[2])

+ 16 - 0
func.py

@@ -8,6 +8,7 @@ import re
 import html
 from css_html_js_minify import html_minify, js_minify, css_minify
 import time
+import os
 
 json_data = open('set.json').read()
 set_data = json.loads(json_data)
@@ -29,6 +30,19 @@ def get_time():
 
     return(date)
 
+def skin_check():
+    skin = './views/acme/'
+    try:
+        curs.execute('select data from other where name = "skin"')
+        skin_exist = curs.fetchall()
+        if(skin_exist):
+            if(os.path.exists(os.path.abspath('./views/' + skin_exist[0][0] + '/index.tpl')) == 1):
+                skin = './views/' + skin_exist[0][0] + '/'
+    except:
+        pass
+
+    return(skin)
+
 def sha224(data):
     return(hashlib.sha224(bytes(data, 'utf-8')).hexdigest())
     
@@ -151,6 +165,8 @@ def admin_check(num, what):
                 check = 'acl'
             elif(num == 6 and reset == 0):
                 check = 'hidel'
+            elif(num == 7 and reset == 0):
+                check = 'give'
             else:
                 check = 'owner'
 

+ 1 - 1
version.md

@@ -142,7 +142,7 @@
 
 ----
 ## 기타
- * 현재 버전 - v2.4.1c
+ * 현재 버전 - v2.4.3
 
 ----
 ## 개발 이념