2du 4 anni fa
parent
commit
194c12b1fa
10 ha cambiato i file con 308 aggiunte e 254 eliminazioni
  1. 10 30
      app.py
  2. 1 1
      route/edit_delete_mutiple.py
  3. 1 3
      route/login_logout.py
  4. 2 1
      route/tool/func.py
  5. 54 13
      route/user_challenge.py
  6. 69 54
      route/vote_add.py
  7. 27 24
      route/vote_close.py
  8. 46 44
      route/vote_end.py
  9. 33 32
      route/vote_list.py
  10. 65 52
      route/vote_select.py

+ 10 - 30
app.py

@@ -658,38 +658,18 @@ app.route('/login/find')(login_find)
 app.route('/login/find/key', methods = ['POST', 'GET'])(login_find_key)
 app.route('/login/find/email', methods = ['POST', 'GET'], defaults = { 'tool' : 'pass_find' })(login_find_email)
 app.route('/login/find/email/check', methods = ['POST', 'GET'], defaults = { 'tool' : 'check_key' })(login_find_email_check)
-
-@app.route('/logout')
-def login_logout():
-    return login_logout_2(load_db.db_get())
+app.route('/logout')(login_logout)
 
 # Func-vote
-@app.route('/vote/<int:num>', methods = ['POST', 'GET'])
-def vote_select(num = 1):
-    return vote_select_2(load_db.db_get(), str(num))
-
-@app.route('/vote/end/<int:num>')
-def vote_end(num = 1):
-    return vote_end_2(load_db.db_get(), str(num))
-
-@app.route('/vote/close/<int:num>')
-def vote_close(num = 1):
-    return vote_close_2(load_db.db_get(), str(num))
-
-@app.route('/vote')
-@app.route('/vote/list')
-@app.route('/vote/list/<int:num>')
-def vote_list(num = 1):
-    return vote_list_2(load_db.db_get(), 'normal', num)
-
-@app.route('/vote/list/close')
-@app.route('/vote/list/close/<int:num>')
-def vote_list_close(num = 1):
-    return vote_list_2(load_db.db_get(), 'close', num)
-
-@app.route('/vote/add', methods = ['POST', 'GET'])
-def vote_add():
-    return vote_add_2(load_db.db_get())
+app.route('/vote/<int:num>', methods = ['POST', 'GET'])(vote_select)
+app.route('/vote/end/<int:num>')(vote_end)
+app.route('/vote/close/<int:num>')(vote_close)
+app.route('/vote', defaults = { 'list_type' : 'normal' })(vote_list)
+app.route('/vote/list', defaults = { 'list_type' : 'normal' })(vote_list)
+app.route('/vote/list/<int:num>', defaults = { 'list_type' : 'normal' })(vote_list)
+app.route('/vote/list/close', defaults = { 'list_type' : 'close' })(vote_list)
+app.route('/vote/list/close/<int:num>', defaults = { 'list_type' : 'close' })(vote_list)
+app.route('/vote/add', methods = ['POST', 'GET'])(vote_add)
 
 # Func-api
 app.route('/api/w/<everything:name>/doc_tool/<tool>/doc_rev/<int(signed = True):rev>')(api_w)

+ 1 - 1
route/edit_delete_mutiple.py

@@ -1,5 +1,5 @@
 from .tool.func import *
-from . import edit_delete
+from edit_delete import edit_delete
 
 def edit_delete_mutiple_2(conn):
     curs = conn.cursor()

+ 1 - 3
route/login_logout.py

@@ -1,8 +1,6 @@
 from .tool.func import *
 
-def login_logout_2(conn):
-    curs = conn.cursor()
-
+def login_logout():
     flask.session.pop('state', None)
     flask.session.pop('id', None)
 

+ 2 - 1
route/tool/func.py

@@ -612,7 +612,8 @@ def get_user_title_list():
     }
     
     # admin
-    user_title['✅'] = '✅ admin'
+    if admin_check('all') == 1:
+        user_title['✅'] = '✅ admin'
     
     return user_title
 

+ 54 - 13
route/user_challenge.py

@@ -30,102 +30,143 @@ def user_challenge():
     with get_db_connect() as conn:
         curs = conn.cursor()
 
-        data_html = ''
         data_html_green = ''
         data_html_red = ''
         
-        data_html += do_make_challenge_design(
+        data_html_green += do_make_challenge_design(
             '🆕',
             load_lang('challenge_title_register'), 
             load_lang('challenge_info_register'),
             1
         )
         
-        curs.execute(db_change('select count(*) from history where id = ?'), [ip])
+        curs.execute(db_change('select count(*) from history where ip = ?'), [ip])
         db_data = curs.fetchall()
         
         disable = 1 if db_data[0][0] >= 1 else 0
-        data_html += do_make_challenge_design(
+        data_html = do_make_challenge_design(
             '✏',
             load_lang('challenge_title_first_contribute'), 
             load_lang('challenge_info_first_contribute'),
             disable
         )
+        if disable == 1:
+            data_html_green += data_html
+        else:
+            data_html_red += data_html
         
         disable = 1 if db_data[0][0] >= 10 else 0
-        data_html += do_make_challenge_design(
+        data_html = do_make_challenge_design(
             '🗊',
             load_lang('challenge_title_tenth_contribute'), 
             load_lang('challenge_info_tenth_contribute'),
             disable
         )
+        if disable == 1:
+            data_html_green += data_html
+        else:
+            data_html_red += data_html
         
         disable = 1 if db_data[0][0] >= 100 else 0
-        data_html += do_make_challenge_design(
+        data_html = do_make_challenge_design(
             '🗀',
             load_lang('challenge_title_hundredth_contribute'), 
             load_lang('challenge_info_hundredth_contribute'),
             disable
         )
+        if disable == 1:
+            data_html_green += data_html
+        else:
+            data_html_red += data_html
         
         disable = 1 if db_data[0][0] >= 1000 else 0
-        data_html += do_make_challenge_design(
+        data_html = do_make_challenge_design(
             '🖪',
             load_lang('challenge_title_thousandth_contribute'), 
             load_lang('challenge_info_thousandth_contribute'),
             disable
         )
+        if disable == 1:
+            data_html_green += data_html
+        else:
+            data_html_red += data_html
         
         disable = 1 if db_data[0][0] >= 10000 else 0
-        data_html += do_make_challenge_design(
+        data_html = do_make_challenge_design(
             '🖴',
             load_lang('challenge_title_tenthousandth_contribute'), 
             load_lang('challenge_info_tenthousandth_contribute'),
             disable
         )
+        if disable == 1:
+            data_html_green += data_html
+        else:
+            data_html_red += data_html
         
         curs.execute(db_change("select count(*) from topic where ip = ?"), [ip])
         db_data = curs.fetchall()
         
         disable = 1 if db_data[0][0] >= 1 else 0
-        data_html += do_make_challenge_design(
+        data_html = do_make_challenge_design(
             '🗨',
             load_lang('challenge_title_first_discussion'), 
             load_lang('challenge_info_first_discussion'),
             disable
         )
+        if disable == 1:
+            data_html_green += data_html
+        else:
+            data_html_red += data_html
         
         disable = 1 if db_data[0][0] >= 10 else 0
-        data_html += do_make_challenge_design(
+        data_html = do_make_challenge_design(
             '🗪',
             load_lang('challenge_title_tenth_discussion'), 
             load_lang('challenge_info_tenth_discussion'),
             disable
         )
+        if disable == 1:
+            data_html_green += data_html
+        else:
+            data_html_red += data_html
         
         disable = 1 if db_data[0][0] >= 100 else 0
-        data_html += do_make_challenge_design(
+        data_html = do_make_challenge_design(
             '🖅',
             load_lang('challenge_title_hundredth_discussion'), 
             load_lang('challenge_info_hundredth_discussion'),
             disable
         )
+        if disable == 1:
+            data_html_green += data_html
+        else:
+            data_html_red += data_html
         
         disable = 1 if db_data[0][0] >= 1000 else 0
-        data_html += do_make_challenge_design(
+        data_html = do_make_challenge_design(
             '☏',
             load_lang('challenge_title_thousandth_discussion'), 
             load_lang('challenge_info_thousandth_discussion'),
             disable
         )
+        if disable == 1:
+            data_html_green += data_html
+        else:
+            data_html_red += data_html
         
         disable = 1 if db_data[0][0] >= 10000 else 0
-        data_html += do_make_challenge_design(
+        data_html = do_make_challenge_design(
             '🖧',
             load_lang('challenge_title_tenthousandth_discussion'), 
             load_lang('challenge_info_tenthousandth_discussion'),
             disable
         )
+        if disable == 1:
+            data_html_green += data_html
+        else:
+            data_html_red += data_html
+            
+        data_html = data_html_green + data_html_red
         
         return easy_minify(flask.render_template(skin_check(),
             imp = [load_lang('challenge'), wiki_set(), wiki_custom(), wiki_css([0, 0])],

+ 69 - 54
route/vote_add.py

@@ -1,62 +1,77 @@
 from .tool.func import *
 
-def vote_add_2(conn):
-    curs = conn.cursor()
+def vote_add():
+    with get_db_connect() as conn:
+        curs = conn.cursor()
 
-    if admin_check() != 1:
-        return re_error('/ban')
-
-    if flask.request.method == 'POST':
-        vote_data = flask.request.form.get('data', 'test\ntest_2')
-        if vote_data.count('\n') < 1:
+        if admin_check() != 1:
             return re_error('/ban')
 
-        curs.execute(db_change('select id from vote order by id + 0 desc limit 1'))
-        id_data = curs.fetchall()
-        id_data = str((int(id_data[0][0]) + 1) if id_data else 1)
+        if flask.request.method == 'POST':
+            vote_data = flask.request.form.get('data', 'test\ntest_2')
+            if vote_data.count('\n') < 1:
+                return re_error('/ban')
+
+            curs.execute(db_change('select id from vote where not type = "option" order by id + 0 desc limit 1'))
+            id_data = curs.fetchall()
+            id_data = str((int(id_data[0][0]) + 1) if id_data else 1)
+
+            admin_check(None, 'add vote ' + id_data)
 
-        admin_check(None, 'add vote ' + id_data)
+            if flask.request.form.get('open_select', 'N') == 'Y':
+                open_data = 'open'
+            else:
+                open_data = 'n_open'
 
-        if flask.request.form.get('open_select', 'N') == 'Y':
-            open_data = 'open'
+            curs.execute(db_change("insert into vote (name, id, subject, data, user, type, acl) values (?, ?, ?, ?, '', ?, ?)"), [
+                flask.request.form.get('name', 'test'),
+                id_data,
+                flask.request.form.get('subject', 'test'),
+                flask.request.form.get('data', 'test'),
+                open_data,
+                flask.request.form.get('acl_select', '')
+            ])
+            
+            time_limitless = flask.request.form.get('limitless', '')
+            if time_limitless == '':
+                time_limit = flask.request.form.get('date', '')
+                if re.search(r'^[0-9]{4}-[0-9]{2}-[0-9]{2}$', time_limit):
+                    curs.execute(db_change("insert into vote (name, id, subject, data, user, type, acl) values ('end_date', ?, '', ?, '', 'option', '')"), [
+                        id_data,
+                        time_limit
+                    ])
+                    
+            conn.commit()
+
+            return redirect('/vote')
         else:
-            open_data = 'n_open'
-
-        curs.execute(db_change("insert into vote (name, id, subject, data, user, type, acl) values (?, ?, ?, ?, '', ?, ?)"), [
-            flask.request.form.get('name', 'test'),
-            id_data,
-            flask.request.form.get('subject', 'test'),
-            flask.request.form.get('data', 'test'),
-            open_data,
-            flask.request.form.get('acl_select', '')
-        ])
-        conn.commit()
-
-        return redirect('/vote')
-    else:
-        acl_data = '<select name="acl_select">'
-        acl_list = get_acl_list()
-        for data_list in acl_list:
-            acl_data += '<option value="' + data_list + '">' + (data_list if data_list != '' else 'normal') + '</option>'
-
-        acl_data += '</select>'
-
-        return easy_minify(flask.render_template(skin_check(),
-            imp = [load_lang('add_vote'), wiki_set(), wiki_custom(), wiki_css([0, 0])],
-            data = '' + \
-                '<form method="post">' + \
-                    '<input name="name" placeholder="' + load_lang('name') + '">' + \
-                    '<hr class="main_hr">' + \
-                    '<textarea rows="3" name="subject" placeholder="' + load_lang('explanation') + '"></textarea>' + \
-                    '<hr class="main_hr">' + \
-                    '<textarea rows="10" name="data" placeholder="' + load_lang('1_line_1_q') + '"></textarea>' + \
-                    '<hr class="main_hr">' + \
-                    '<input type="checkbox" value="Y" name="open_select"> ' + load_lang('open_vote') + \
-                    '<h2>' + load_lang('acl') + '</h2>' + \
-                    acl_data + ' <a href="/acl/TEST#exp">(' + load_lang('explanation') + ')</a>' + \
-                    '<hr class="main_hr">' + \
-                    '<button type="submit">' + load_lang('send') + '</buttom>' + \
-                '</form>' + \
-            '',
-            menu = [['vote', load_lang('return')]]
-        ))
+            acl_data = '<select name="acl_select">'
+            acl_list = get_acl_list()
+            for data_list in acl_list:
+                acl_data += '<option value="' + data_list + '">' + (data_list if data_list != '' else 'normal') + '</option>'
+
+            acl_data += '</select>'
+
+            return easy_minify(flask.render_template(skin_check(),
+                imp = [load_lang('add_vote'), wiki_set(), wiki_custom(), wiki_css([0, 0])],
+                data = '' + \
+                    '<form method="post">' + \
+                        '<input name="name" placeholder="' + load_lang('name') + '">' + \
+                        '<hr class="main_hr">' + \
+                        '<textarea rows="3" name="subject" placeholder="' + load_lang('explanation') + '"></textarea>' + \
+                        '<hr class="main_hr">' + \
+                        '<textarea rows="10" name="data" placeholder="' + load_lang('1_line_1_q') + '"></textarea>' + \
+                        '<hr class="main_hr">' + \
+                        '<input type="checkbox" value="Y" name="open_select"> ' + load_lang('open_vote') + \
+                        '<h2>' + load_lang('period') + '</h2>'
+                        '<input type="date" name="date" pattern="\d{4}-\d{2}-\d{2}">' + \
+                        '<hr class="main_hr">' + \
+                        '<input type="checkbox" value="Y" name="limitless"> ' + load_lang('limitless') + \
+                        '<h2>' + load_lang('acl') + '</h2>' + \
+                        acl_data + ' <a href="/acl/TEST#exp">(' + load_lang('explanation') + ')</a>' + \
+                        '<hr class="main_hr">' + \
+                        '<button type="submit">' + load_lang('send') + '</buttom>' + \
+                    '</form>' + \
+                '',
+                menu = [['vote', load_lang('return')]]
+            ))

+ 27 - 24
route/vote_close.py

@@ -1,29 +1,32 @@
 from .tool.func import *
 
-def vote_close_2(conn, num):
-    curs = conn.cursor()
+def vote_close(num = 1):
+    num = str(num)
+    
+    with get_db_connect() as conn:
+        curs = conn.cursor()
 
-    if admin_check() != 1:
-        return re_error('/ban')
+        if admin_check() != 1:
+            return re_error('/ban')
 
-    curs.execute(db_change('select type from vote where id = ? and user = ""'), [num])
-    data_list = curs.fetchall()
-    if not data_list:
-        return redirect('/vote')
-        
-    if data_list[0][0] == 'close':
-        type_set = 'open'
-    elif data_list[0][0] == 'n_close':
-        type_set = 'n_open'
-    elif data_list[0][0] == 'open':
-        type_set = 'close'
-    else:
-        type_set = 'n_close'
-        
-    curs.execute(db_change("update vote set type = ? where user = '' and id = ?"), [type_set, num])
-    conn.commit()
+        curs.execute(db_change('select type from vote where id = ? and user = ""'), [num])
+        data_list = curs.fetchall()
+        if not data_list:
+            return redirect('/vote')
 
-    if data_list[0][0] == 'close' or data_list[0][0] == 'n_close':
-        return redirect('/vote')
-    else:
-        return redirect('/vote?close=y')
+        if data_list[0][0] == 'close':
+            type_set = 'open'
+        elif data_list[0][0] == 'n_close':
+            type_set = 'n_open'
+        elif data_list[0][0] == 'open':
+            type_set = 'close'
+        else:
+            type_set = 'n_close'
+
+        curs.execute(db_change("update vote set type = ? where user = '' and id = ?"), [type_set, num])
+        conn.commit()
+
+        if data_list[0][0] == 'close' or data_list[0][0] == 'n_close':
+            return redirect('/vote')
+        else:
+            return redirect('/vote/list/close')

+ 46 - 44
route/vote_end.py

@@ -1,47 +1,49 @@
 from .tool.func import *
 
-def vote_end_2(conn, num):
-    curs = conn.cursor()
-
-    curs.execute(db_change('select name, subject, data, type from vote where id = ? and user = ""'), [num])
-    data_list = curs.fetchall()
-    if not data_list:
-        return redirect('/vote')
-
-    data = '' + \
-        '<h2>' + data_list[0][0] + '</h2>' + \
-        '<b>' + data_list[0][1] + '</b>' + \
-    ''
-
-    if admin_check() == 1:
-        if data_list[0][3] == 'open' or data_list[0][3] == 'n_open':
-            data += '' + \
-                '<hr class="main_hr">' + \
-                '<a href="/vote/close/' + num + '">(' + load_lang('close_vote') + ')</a>' + \
-            ''
-        else:
-            data += '' + \
-                '<hr class="main_hr">' + \
-                '<a href="/vote/close/' + num + '">(' + load_lang('re_open_vote') + ')</a>' + \
-            ''
-
-    vote_data = re.findall(r'([^\n]+)', data_list[0][2].replace('\r\n', '\n'))
-    for i in range(0, len(vote_data)):
-        data += '<h2>' + vote_data[i] + '</h2>'
-        data += '<ul class="inside_ul">'
+def vote_end(num = 1):
+    num = str(num)
+    
+    with get_db_connect() as conn:
+        curs = conn.cursor()
+
+        curs.execute(db_change('select name, subject, data, type from vote where id = ? and user = ""'), [num])
+        data_list = curs.fetchall()
+        if not data_list:
+            return redirect('/vote')
         
-        curs.execute(db_change('select user from vote where id = ? and user != "" and data = ?'), [num, str(i)])
-        data_list_2 = curs.fetchall()
-        if data_list[0][3] == 'open' or data_list[0][3] == 'close':
-            all_ip = ip_pas([j[0] for j in data_list_2])
-            for j in data_list_2:
-                data += '<li>' + all_ip[j[0]] + '</li>'
-
-        data += '<li>' + load_lang('result') + ' : ' + str(len(data_list_2)) + '</li>'
-        data += '</ul>'
-
-    return easy_minify(flask.render_template(skin_check(),
-        imp = [load_lang('result_vote'), wiki_set(), wiki_custom(), wiki_css([0, 0])],
-        data = data,
-        menu = [['vote', load_lang('return')]]
-    ))
+        curs.execute(db_change('select data from vote where id = ? and name = "end_date" and type = "option"'), [num])
+        db_data = curs.fetchall()
+        time_limit = ''
+        if db_data:
+            time_limit = db_data[0][0]
+
+        data = '<h2>' + data_list[0][0] + '</h2>'
+        data += '<b>' + data_list[0][1] + '</b><hr class="main_hr">' if data_list[0][1] != '' else ''
+        data += '<span>~ ' + time_limit + '</span><hr class="main_hr">' if time_limit != '' else ''
+
+        if admin_check() == 1:
+            if data_list[0][3] == 'open' or data_list[0][3] == 'n_open':
+                data += '<a href="/vote/close/' + num + '">(' + load_lang('close_vote') + ')</a>'
+            else:
+                data += '<a href="/vote/close/' + num + '">(' + load_lang('re_open_vote') + ')</a>'
+
+        vote_data = re.findall(r'([^\n]+)', data_list[0][2].replace('\r\n', '\n'))
+        for i in range(0, len(vote_data)):
+            data += '<h2>' + vote_data[i] + '</h2>'
+            data += '<ul class="inside_ul">'
+
+            curs.execute(db_change('select user from vote where id = ? and user != "" and data = ?'), [num, str(i)])
+            data_list_2 = curs.fetchall()
+            if data_list[0][3] == 'open' or data_list[0][3] == 'close':
+                all_ip = ip_pas([j[0] for j in data_list_2])
+                for j in data_list_2:
+                    data += '<li>' + all_ip[j[0]] + '</li>'
+
+            data += '<li>' + load_lang('result') + ' : ' + str(len(data_list_2)) + '</li>'
+            data += '</ul>'
+
+        return easy_minify(flask.render_template(skin_check(),
+            imp = [load_lang('result_vote'), wiki_set(), wiki_custom(), wiki_css([0, 0])],
+            data = data,
+            menu = [['vote', load_lang('return')]]
+        ))

+ 33 - 32
route/vote_list.py

@@ -1,40 +1,41 @@
 from .tool.func import *
 
-def vote_list_2(conn, list_type, num):
-    curs = conn.cursor()
+def vote_list(list_type = 'normal', num = 1):    
+    with get_db_connect() as conn:
+        curs = conn.cursor()
 
-    sql_num = (num * 50 - 50) if num * 50 > 0 else 0
+        sql_num = (num * 50 - 50) if num * 50 > 0 else 0
 
-    data = ''
-    if list_type == 'normal':
-        data += '<a href="/vote/list/close">(' + load_lang('close_vote_list') + ')</a>'
-        sub = 0
-        curs.execute(db_change('select name, id, type from vote where type = "open" or type = "n_open" limit ?, 50'), [sql_num])
-    else:
-        data += '<a href="/vote">(' + load_lang('open_vote_list') + ')</a>'
-        sub = '(' + load_lang('closed') + ')'
-        curs.execute(db_change('select name, id, type from vote where type = "close" or type = "n_close" limit ?, 50'), [sql_num])
+        data = ''
+        if list_type == 'normal':
+            data += '<a href="/vote/list/close">(' + load_lang('close_vote_list') + ')</a>'
+            sub = 0
+            curs.execute(db_change('select name, id, type from vote where type = "open" or type = "n_open" limit ?, 50'), [sql_num])
+        else:
+            data += '<a href="/vote">(' + load_lang('open_vote_list') + ')</a>'
+            sub = '(' + load_lang('closed') + ')'
+            curs.execute(db_change('select name, id, type from vote where type = "close" or type = "n_close" limit ?, 50'), [sql_num])
+
+        data += '<ul class="inside_ul">'
 
-    data += '<ul class="inside_ul">'
+        data_list = curs.fetchall()
+        for i in data_list:
+            if list_type == 'normal':
+                open_select = load_lang('open_vote') if i[2] == 'open' else load_lang('not_open_vote')
+            else:
+                open_select = load_lang('open_vote') if i[2] == 'close' else load_lang('not_open_vote')
 
-    data_list = curs.fetchall()
-    for i in data_list:
+            data += '<li><a href="/vote/' + i[1] + '">' + html.escape(i[0]) + '</a> (' + open_select + ')</li>'
+
+        data += '</ul>'
         if list_type == 'normal':
-            open_select = load_lang('open_vote') if i[2] == 'open' else load_lang('not_open_vote')
+            data += ('<a href="/vote/add">(' + load_lang('add_vote') + ')</a>') if admin_check() == 1 else ''
+            data += next_fix('/vote/list/', num, data_list)
         else:
-            open_select = load_lang('open_vote') if i[2] == 'close' else load_lang('not_open_vote')
-
-        data += '<li><a href="/vote/' + i[1] + '">' + html.escape(i[0]) + '</a> (' + open_select + ')</li>'
-
-    data += '</ul>'
-    if list_type == 'normal':
-        data += ('<a href="/vote/add">(' + load_lang('add_vote') + ')</a>') if admin_check() == 1 else ''
-        data += next_fix('/vote/list/', num, data_list)
-    else:
-        data += next_fix('/vote/list/close/', num, data_list)
-
-    return easy_minify(flask.render_template(skin_check(),
-        imp = [load_lang('vote_list'), wiki_set(), wiki_custom(), wiki_css([sub, 0])],
-        data = data,
-        menu = [['other', load_lang('return')]]
-    ))
+            data += next_fix('/vote/list/close/', num, data_list)
+
+        return easy_minify(flask.render_template(skin_check(),
+            imp = [load_lang('vote_list'), wiki_set(), wiki_custom(), wiki_css([sub, 0])],
+            data = data,
+            menu = [['other', load_lang('return')]]
+        ))

+ 65 - 52
route/vote_select.py

@@ -1,66 +1,79 @@
 from .tool.func import *
 
-def vote_select_2(conn, num):
-    curs = conn.cursor()
+def vote_select(num = 1):
+    num = str(num)
+    
+    with get_db_connect() as conn:
+        curs = conn.cursor()
 
-    curs.execute(db_change('select name, subject, data, type from vote where id = ? and user = ""'), [num])
-    data_list = curs.fetchall()
-    if not data_list:
-        return redirect('/vote')
+        curs.execute(db_change('select name, subject, data, type from vote where id = ? and user = ""'), [num])
+        data_list = curs.fetchall()
+        if not data_list:
+            return redirect('/vote')
 
-    if data_list[0][3] == 'close' or data_list[0][3] == 'n_close':
-        return redirect('/vote/end/' + num)
+        if data_list[0][3] == 'close' or data_list[0][3] == 'n_close':
+            return redirect('/vote/end/' + num)
 
-    if acl_check('', 'vote', num) == 1:
-        return redirect('/vote/end/' + num)
+        if acl_check('', 'vote', num) == 1:
+            return redirect('/vote/end/' + num)
 
-    curs.execute(db_change('select user from vote where id = ? and user = ?'), [num, ip_check()])
-    if curs.fetchall():
-        return redirect('/vote/end/' + num)
+        curs.execute(db_change('select user from vote where id = ? and user = ?'), [num, ip_check()])
+        if curs.fetchall():
+            return redirect('/vote/end/' + num)
+        
+        curs.execute(db_change('select data from vote where id = ? and name = "end_date" and type = "option"'), [num])
+        db_data = curs.fetchall()
+        time_limit = ''
+        if db_data:
+            time_limit = db_data[0][0]
+            
+            time_db = int(db_data[0][0].split()[0].replace('-', ''))
+            time_today = int(get_time().split()[0].replace('-', ''))
+            
+            if time_today > time_db:
+                return redirect('/vote/end/' + num)
 
-    vote_data = re.findall(r'([^\n]+)', data_list[0][2].replace('\r\n', '\n'))
+        vote_data = re.findall(r'([^\n]+)', data_list[0][2].replace('\r\n', '\n'))
 
-    if flask.request.method == 'POST':
-        try:
-            vaild_check = int(flask.request.form.get('vote_data', '0'))
-        except:
-            return redirect('/vote/' + num)
+        if flask.request.method == 'POST':
+            try:
+                vaild_check = int(flask.request.form.get('vote_data', '0'))
+            except:
+                return redirect('/vote/' + num)
 
-        if len(vote_data) - 1 < vaild_check:
-            return redirect('/vote/' + num)
+            if len(vote_data) - 1 < vaild_check:
+                return redirect('/vote/' + num)
 
-        curs.execute(db_change("insert into vote (name, id, subject, data, user, type) values ('', ?, '', ?, ?, 'select')"), [
-            num,
-            str(vaild_check),
-            ip_check()
-        ])
-        conn.commit()
+            curs.execute(db_change("insert into vote (name, id, subject, data, user, type) values ('', ?, '', ?, ?, 'select')"), [
+                num,
+                str(vaild_check),
+                ip_check()
+            ])
+            conn.commit()
 
-        return redirect('/vote/end/' + num)
-    else:
-        data = '' + \
-            '<h2>' + data_list[0][0] + '</h2>' + \
-            '<b>' + data_list[0][1] + '</b>' + \
-            '<hr class="main_hr">' + \
-        ''
+            return redirect('/vote/end/' + num)
+        else:
+            data = '<h2>' + data_list[0][0] + '</h2>'
+            data += '<b>' + data_list[0][1] + '</b><hr class="main_hr">' if data_list[0][1] != '' else ''
+            data += '<span>~ ' + time_limit + '</span><hr class="main_hr">' if time_limit != '' else ''
 
-        select_data = '<select name="vote_data">'
-        line_num = 0
-        for i in vote_data:
-            select_data += '<option value="' + str(line_num) + '">' + i + '</option>'
-            line_num += 1
+            select_data = '<select name="vote_data">'
+            line_num = 0
+            for i in vote_data:
+                select_data += '<option value="' + str(line_num) + '">' + i + '</option>'
+                line_num += 1
 
-        select_data += '</select>'
-        data += '' + \
-            '<form method="post">' + \
-                select_data + \
-                '<hr class="main_hr">' + \
-                '<button type="submit">' + load_lang('send') + '</buttom>' + \
-            '</form>' + \
-        ''
+            select_data += '</select>'
+            data += '' + \
+                '<form method="post">' + \
+                    select_data + \
+                    '<hr class="main_hr">' + \
+                    '<button type="submit">' + load_lang('send') + '</buttom>' + \
+                '</form>' + \
+            ''
 
-        return easy_minify(flask.render_template(skin_check(),
-            imp = [load_lang('vote'), wiki_set(), wiki_custom(), wiki_css([0, 0])],
-            data = data,
-            menu = [['vote', load_lang('return')], ['end_vote/' + num, load_lang('result')]]
-        ))
+            return easy_minify(flask.render_template(skin_check(),
+                imp = [load_lang('vote'), wiki_set(), wiki_custom(), wiki_css([0, 0])],
+                data = data,
+                menu = [['vote', load_lang('return')], ['vote/end/' + num, load_lang('result')]]
+            ))