bbs_w_post.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. from .tool.func import *
  2. def bbs_w_post_make_thread(user_id, date, data, code, color = '', blind = '', add_style = ''):
  3. return '''
  4. <table class="opennamu_comment" style="''' + add_style + '''">
  5. <tr>
  6. <td class="opennamu_comment_color_''' + color + '''">
  7. <a href="#thread_shortcut" id="comment_''' + code + '''">#''' + code + '''</a>
  8. ''' + user_id + '''
  9. <span style="float: right;">''' + date + '''</span>
  10. </td>
  11. </tr>
  12. <tr>
  13. <td class="" id="opennamu_comment_data_main">
  14. ''' + data + '''
  15. </td>
  16. </tr>
  17. </table>
  18. '''
  19. def bbs_w_post(bbs_num = '', post_num = '', do_type = ''):
  20. with get_db_connect() as conn:
  21. curs = conn.cursor()
  22. curs.execute(db_change('select set_name, set_data, set_code from bbs_data where set_id = ? and set_code = ?'), [bbs_num, post_num])
  23. db_data = curs.fetchall()
  24. if not db_data:
  25. return redirect('/bbs/main')
  26. bbs_num_str = str(bbs_num)
  27. post_num_str = str(post_num)
  28. bbs_comment_acl = acl_check(bbs_num_str, 'bbs_comment')
  29. ip = ip_check()
  30. curs.execute(db_change('select set_data from bbs_set where set_id = ? and set_name = "bbs_type"'), [bbs_num])
  31. db_data_2 = curs.fetchall()
  32. if not db_data_2:
  33. return redirect('/bbs/main')
  34. elif db_data_2[0][0] == 'thread':
  35. if flask.request.method == 'POST' and do_type != 'preview':
  36. if bbs_comment_acl == 1:
  37. return redirect('/bbs/set/' + bbs_num_str)
  38. if captcha_post(flask.request.form.get('g-recaptcha-response', flask.request.form.get('g-recaptcha', ''))) == 1:
  39. return re_error('/error/13')
  40. else:
  41. captcha_post('', 0)
  42. set_id = bbs_num_str + '-' + post_num_str
  43. curs.execute(db_change('select set_code from bbs_data where set_name = "comment" and set_id = ? order by set_code + 0 desc'), [set_id])
  44. db_data = curs.fetchall()
  45. id_data = str(int(db_data[0][0]) + 1) if db_data else '1'
  46. data = flask.request.form.get('content', '')
  47. if data == '':
  48. # re_error로 대체 예정
  49. return redirect('/bbs/w/' + bbs_num_str + '/' + post_num_str)
  50. date = get_time()
  51. curs.execute(db_change("insert into bbs_data (set_name, set_code, set_id, set_data) values ('comment', ?, ?, ?)"), [id_data, set_id, data])
  52. curs.execute(db_change("insert into bbs_data (set_name, set_code, set_id, set_data) values ('comment_date', ?, ?, ?)"), [id_data, set_id, date])
  53. curs.execute(db_change("insert into bbs_data (set_name, set_code, set_id, set_data) values ('comment_user_id', ?, ?, ?)"), [id_data, set_id, ip])
  54. conn.commit()
  55. return redirect('/bbs/w/' + bbs_num_str + '/' + post_num_str + '#comment_' + str(int(id_data) + 1))
  56. else:
  57. if do_type == 'preview':
  58. text = flask.request.form.get('content', '')
  59. text = text.replace('\r', '')
  60. data_preview = render_set(
  61. doc_name = '',
  62. doc_data = text,
  63. data_in = 'from'
  64. )
  65. else:
  66. text = ''
  67. data_preview = ''
  68. temp_id = ''
  69. temp_dict = {}
  70. for for_a in db_data + [['', '', '']]:
  71. if temp_id != for_a[2]:
  72. temp_id = for_a[2]
  73. temp_dict['code'] = for_a[2]
  74. temp_dict[for_a[0]] = for_a[1]
  75. count = 1
  76. data = ''
  77. data += '<h2>' + html.escape(temp_dict['title']) + '</h2>'
  78. data += bbs_w_post_make_thread(
  79. ip_pas(temp_dict['user_id']),
  80. temp_dict['date'],
  81. render_set(
  82. doc_name = '',
  83. doc_data = temp_dict['data'],
  84. data_in = 'from'
  85. ),
  86. '1',
  87. color = 'green'
  88. )
  89. data += '<hr class="main_hr">'
  90. user_id = temp_dict['user_id']
  91. temp_id = ''
  92. temp_dict = {}
  93. curs.execute(db_change('select set_name, set_data, set_code, set_id from bbs_data where (set_name = "comment" or set_name = "comment_date" or set_name = "comment_user_id") and set_id = ? order by set_code + 0 asc'), [bbs_num_str + '-' + post_num_str])
  94. db_data = curs.fetchall()
  95. for for_a in db_data + [['', '', '']]:
  96. if temp_id == '':
  97. temp_id = for_a[2]
  98. if temp_id != for_a[2]:
  99. temp_id = for_a[2]
  100. temp_dict['code'] = for_a[2]
  101. count += 1
  102. if user_id == temp_dict['comment_user_id']:
  103. color = 'green'
  104. else:
  105. color = 'default'
  106. data += bbs_w_post_make_thread(
  107. ip_pas(temp_dict['comment_user_id']),
  108. temp_dict['comment_date'],
  109. render_set(
  110. doc_name = '',
  111. doc_data = temp_dict['comment'],
  112. data_in = 'from'
  113. ),
  114. str(count),
  115. color = color
  116. )
  117. data += '<hr class="main_hr">'
  118. temp_dict[for_a[0]] = for_a[1]
  119. bbs_comment_form = ''
  120. if bbs_comment_acl == 0:
  121. bbs_comment_form = '''
  122. <textarea name="content" id="opennamu_edit_textarea" class="opennamu_textarea_100">''' + html.escape(text) + '''</textarea>
  123. <hr class="main_hr">
  124. ''' + captcha_get() + ip_warning() + '''
  125. <button id="opennamu_save_button" formaction="/bbs/w/''' + bbs_num_str + '''/''' + post_num_str + '''" type="submit">''' + load_lang('send') + '''</button>
  126. <button id="opennamu_preview_button" formaction="/bbs/w/preview/''' + bbs_num_str + '''/''' + post_num_str + '''#opennamu_edit_textarea" type="submit">''' + load_lang('preview') + '''</button>
  127. <hr class="main_hr">
  128. '''
  129. data += '''
  130. <form method="post">
  131. ''' + bbs_comment_form + '''
  132. ''' + data_preview + '''
  133. </form>
  134. '''
  135. return easy_minify(flask.render_template(skin_check(),
  136. imp = [load_lang('bbs_main'), wiki_set(), wiki_custom(), wiki_css([0, 0])],
  137. data = data,
  138. menu = [['bbs/w/' + bbs_num_str, load_lang('return')], ['bbs/edit/' + bbs_num_str + '/' + post_num_str, load_lang('edit')]]
  139. ))
  140. else:
  141. # db_data_2[0][0] == 'comment'
  142. if flask.request.method == 'POST' and do_type != 'preview':
  143. if bbs_comment_acl == 1:
  144. return redirect('/bbs/set/' + bbs_num_str)
  145. if captcha_post(flask.request.form.get('g-recaptcha-response', flask.request.form.get('g-recaptcha', ''))) == 1:
  146. return re_error('/error/13')
  147. else:
  148. captcha_post('', 0)
  149. select = flask.request.form.get('comment_select', 'default')
  150. select = '' if select == 'default' else select
  151. if select != '':
  152. select = select.split('-')
  153. if len(select) < 2:
  154. curs.execute(db_change('select set_code from bbs_data where set_name = "comment" and set_id = ? and set_code = ? limit 1'), [bbs_num_str + '-' + post_num_str, select[0]])
  155. if not curs.fetchall():
  156. return ''
  157. else:
  158. set_id = bbs_num_str + '-' + post_num_str + '-' + select[0]
  159. else:
  160. curs.execute(db_change('select set_code from bbs_data where set_name = "comment" and set_id = ? and set_code = ? limit 1'), [bbs_num_str + '-' + post_num_str + '-' + '-'.join(select[0:len(select) - 1]), select[len(select) - 1]])
  161. if not curs.fetchall():
  162. return ''
  163. else:
  164. set_id = bbs_num_str + '-' + post_num_str + '-' + '-'.join(select)
  165. else:
  166. set_id = bbs_num_str + '-' + post_num_str
  167. curs.execute(db_change('select set_code from bbs_data where set_name = "comment" and set_id = ? order by set_code + 0 desc'), [set_id])
  168. db_data = curs.fetchall()
  169. id_data = str(int(db_data[0][0]) + 1) if db_data else '1'
  170. data = flask.request.form.get('content', '')
  171. if data == '':
  172. # re_error로 대체 예정
  173. return redirect('/bbs/w/' + bbs_num_str + '/' + post_num_str)
  174. date = get_time()
  175. curs.execute(db_change("insert into bbs_data (set_name, set_code, set_id, set_data) values ('comment', ?, ?, ?)"), [id_data, set_id, data])
  176. curs.execute(db_change("insert into bbs_data (set_name, set_code, set_id, set_data) values ('comment_date', ?, ?, ?)"), [id_data, set_id, date])
  177. curs.execute(db_change("insert into bbs_data (set_name, set_code, set_id, set_data) values ('comment_user_id', ?, ?, ?)"), [id_data, set_id, ip])
  178. conn.commit()
  179. if set_id == '':
  180. return redirect('/bbs/w/' + bbs_num_str + '/' + post_num_str + '#comment_' + id_data)
  181. else:
  182. set_id = re.sub(r'^[0-9]+-[0-9]+-?', '', set_id)
  183. return redirect('/bbs/w/' + bbs_num_str + '/' + post_num_str + '#comment_' + set_id + '-' + id_data)
  184. else:
  185. if do_type == 'preview':
  186. text = flask.request.form.get('content', '')
  187. text = text.replace('\r', '')
  188. data_preview = render_set(
  189. doc_name = '',
  190. doc_data = text,
  191. data_in = 'from'
  192. )
  193. else:
  194. text = ''
  195. data_preview = ''
  196. temp_id = ''
  197. temp_dict = {}
  198. for for_a in db_data + [['', '', '']]:
  199. if temp_id != for_a[2]:
  200. temp_id = for_a[2]
  201. temp_dict['code'] = for_a[2]
  202. temp_dict[for_a[0]] = for_a[1]
  203. data = ''
  204. data += '<h2>' + html.escape(temp_dict['title']) + '</h2>'
  205. data += bbs_w_post_make_thread(
  206. ip_pas(temp_dict['user_id']),
  207. temp_dict['date'],
  208. render_set(
  209. doc_name = '',
  210. doc_data = temp_dict['data'],
  211. data_in = 'from'
  212. ),
  213. '0',
  214. color = 'red'
  215. )
  216. user_id = temp_dict['user_id']
  217. temp_id = ''
  218. temp_dict = {}
  219. comment_data = ''
  220. comment_select = '<hr class="main_hr"><select name="comment_select">'
  221. comment_select += '<option value="default">' + load_lang('normal') + '</option>'
  222. curs.execute(db_change('select set_name, set_data, set_code, set_id from bbs_data where (set_name = "comment" or set_name = "comment_date" or set_name = "comment_user_id") and set_id = ? order by set_code + 0 asc'), [bbs_num_str + '-' + post_num_str])
  223. db_data = curs.fetchall()
  224. if db_data:
  225. data += '<hr class="main_hr"><hr>'
  226. else:
  227. db_data = []
  228. for_a = 0
  229. db_data_2 = db_data + [['', '', '', '']]
  230. db_data_len = len(db_data_2)
  231. comment_count = 0
  232. comment_add_count = 0
  233. while(for_a < db_data_len):
  234. if temp_id != (db_data_2[for_a][3] + '-' + db_data_2[for_a][2]):
  235. if temp_id != '':
  236. temp_dict['code'] = temp_id
  237. temp_dict['code'] = re.sub(r'^[0-9]+-[0-9]+-', '', temp_dict['code'])
  238. if user_id == temp_dict['comment_user_id']:
  239. color = 'green'
  240. else:
  241. color = 'default'
  242. margin_count = temp_dict['code'].count('-')
  243. if margin_count == 0:
  244. comment_count += 1
  245. else:
  246. comment_add_count += 1
  247. comment_data += '<span style="padding-left: 20px;"></span>' * margin_count
  248. comment_data += bbs_w_post_make_thread(
  249. ip_pas(temp_dict['comment_user_id']),
  250. temp_dict['comment_date'],
  251. render_set(
  252. doc_name = '',
  253. doc_data = temp_dict['comment'],
  254. data_in = 'from'
  255. ),
  256. temp_dict['code'],
  257. color = color,
  258. add_style = 'width: calc(100% - ' + str(margin_count * 20) + 'px);'
  259. )
  260. comment_select += '<option value="' + temp_dict['code'] + '">' + temp_dict['code'] + '</option>'
  261. curs.execute(db_change('select set_name, set_data, set_code, set_id from bbs_data where (set_name = "comment" or set_name = "comment_date" or set_name = "comment_user_id") and set_id = ? order by set_code + 0 asc'), [bbs_num_str + '-' + post_num_str + '-' + temp_dict['code']])
  262. db_data = curs.fetchall()
  263. if db_data:
  264. db_data_2 = db_data_2[:for_a] + db_data + db_data_2[for_a:]
  265. db_data_len += len(db_data)
  266. if db_data_2[for_a][0] != '':
  267. comment_data += '<hr class="main_hr">'
  268. temp_id = db_data_2[for_a][3] + '-' + db_data_2[for_a][2]
  269. temp_dict[db_data_2[for_a][0]] = db_data_2[for_a][1]
  270. for_a += 1
  271. comment_select += '</select>'
  272. if comment_data != '':
  273. data += load_lang('comment') + ' : ' + str(comment_count) + '<hr class="main_hr">'
  274. data += load_lang('reply') + ' : ' + str(comment_add_count) + '<hr class="main_hr">'
  275. data += comment_data
  276. bbs_comment_form = ''
  277. if bbs_comment_acl == 0:
  278. bbs_comment_form = '''
  279. ''' + comment_select + '''
  280. <hr class="main_hr">
  281. <textarea name="content" id="opennamu_edit_textarea" class="opennamu_textarea_100">''' + html.escape(text) + '''</textarea>
  282. <hr class="main_hr">
  283. ''' + captcha_get() + ip_warning() + '''
  284. <button id="opennamu_save_button" formaction="/bbs/w/''' + bbs_num_str + '''/''' + post_num_str + '''" type="submit">''' + load_lang('send') + '''</button>
  285. <button id="opennamu_preview_button" formaction="/bbs/w/preview/''' + bbs_num_str + '''/''' + post_num_str + '''#opennamu_edit_textarea" type="submit">''' + load_lang('preview') + '''</button>
  286. <hr class="main_hr">
  287. '''
  288. data += '''
  289. <form method="post">
  290. ''' + bbs_comment_form + '''
  291. ''' + data_preview + '''
  292. </form>
  293. '''
  294. return easy_minify(flask.render_template(skin_check(),
  295. imp = [load_lang('bbs_main'), wiki_set(), wiki_custom(), wiki_css([0, 0])],
  296. data = data,
  297. menu = [['bbs/w/' + bbs_num_str, load_lang('return')], ['bbs/edit/' + bbs_num_str + '/' + post_num_str, load_lang('edit')]]
  298. ))