routes.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. from flask import flash, request, redirect, url_for, Response,Blueprint
  2. from flask_restful import Resource, Api
  3. import requests
  4. from time import sleep
  5. from backstage.utils import translate
  6. from collections import defaultdict
  7. from os import path
  8. from backstage.config import PORTAL_SERVER
  9. contents_app = Blueprint('contents', __name__)
  10. api = Api(contents_app)
  11. TYPE_URL_FOR = {'collection': 'collections.collection_list',
  12. 'blog': 'blogs.blog_list'}
  13. def checktype(articletype):
  14. if articletype == 'blog':
  15. return 'blog'
  16. return articletype
  17. def create_content(data, image_data):
  18. new_response = requests.post('{}new_content'.format(PORTAL_SERVER), json=data)
  19. print("Request returned " + str(new_response.status_code))
  20. if new_response.status_code == 201:
  21. #flash('新增文章失敗', 'danger')
  22. return "<script>alert('已有重複的標題,請重新設定');history.go(-1);</script>"
  23. if new_response.status_code == 200:
  24. if not image_data == None:
  25. requests.post(
  26. '{}upload/static/img?type={}&filename={}'.format(
  27. PORTAL_SERVER, checktype(data.get('type')), image_data.filename), files={'image': image_data})
  28. sleep(1) # sleep for waiting for new_content API generating content successfully.
  29. return redirect(url_for('editor.editor', url='/{}/{}'.format(
  30. checktype(data.get('type')), get_trans_title_url_name(data.get('name')))))
  31. else:
  32. flash('新增文章失敗', 'danger')
  33. print(url_for(TYPE_URL_FOR.get(data.get('type'))))
  34. return redirect(url_for(TYPE_URL_FOR.get(data.get('type'))))
  35. def create_collection_content(data, img, coverimg, csliderimg, commentimg, ownerimg): #exclusive for collection
  36. new_response = requests.post('{}new_content'.format(PORTAL_SERVER), json=data)
  37. if new_response.status_code == 201:
  38. #flash('新增文章失敗', 'danger')
  39. return "<script>alert('已有重複的標題,請重新設定');history.go(-1);</script>"
  40. if new_response.status_code == 200:
  41. if not img == None:
  42. requests.post(
  43. '{}upload/static/img?type={}&filename={}'.format(
  44. PORTAL_SERVER, checktype(data.get('type')), img.filename), files={'image': img})
  45. requests.post(
  46. '{}upload/static/img?type={}&filename={}'.format(
  47. PORTAL_SERVER, checktype(data.get('type')), coverimg.filename), files={'image': coverimg})
  48. sleep(1) # sleep for waiting for new_content API generating content successfully.
  49. requests.post(
  50. '{}upload/img_to_dir?url={}&filename={}'.format(
  51. PORTAL_SERVER, data.get('dest'), commentimg.filename), files={'image': commentimg})
  52. requests.post(
  53. '{}upload/img_to_dir?url={}&filename={}'.format(
  54. PORTAL_SERVER, data.get('dest'), ownerimg.filename), files={'image': ownerimg})
  55. sleep(1)
  56. # reserved for slider img wheel
  57. return redirect(url_for('editor.editor', url='/{}/{}'.format(
  58. checktype(data.get('type')), get_trans_title_url_name(data.get('name')))))
  59. else:
  60. flash('新增文章失敗', 'danger')
  61. return redirect(url_for(TYPE_URL_FOR.get(data.get('type'))))
  62. def upload_slider_img(data, image_data): #for uploading slider images, currently unused
  63. if (data.type == 'collection'):
  64. print("This is a collection article.") #debug use
  65. if not image_data == None: #just in case
  66. requests.post(
  67. '{}upload/static/img/?type={}&filename={}'.format(
  68. PORTAL_SERVER, checktype(data.get('type')), image_data.filename), files={'image': data.get('csliderimg')}, type='csliderimg', dest=data.get('dest'))
  69. sleep(1) # sleep for waiting for new_content API generating content successfully.
  70. def remove_content():
  71. url = request.args.get('url', type=str)
  72. response = requests.delete('{}contents?url={}'.format(PORTAL_SERVER, url))
  73. if response.status_code == 200:
  74. flash('刪除文章成功', 'success')
  75. else:
  76. flash('刪除文章失敗', 'danger')
  77. def get_trans_title_url_name(title):
  78. title = title.replace('「','').replace('」','').replace('%','_percent')
  79. tary = translate(title).replace('$','_').replace('&','_').replace('+','_').replace(',','_').replace('/','_').replace(':','_').replace(';','_').replace('=','_').replace('?','_').replace('@','_').replace(' ','_').replace("'",'_').replace('?','').replace('!','').split('_')
  80. while("" in tary) :
  81. tary.remove("")
  82. return ('_'.join(tary))
  83. #return translate(title).replace(' ', '_')
  84. def update_manage_table(data, elements, req_args, files, img_type):
  85. def allow_file(filename):
  86. return '.' in filename and \
  87. filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
  88. ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'webp'}
  89. update_data = defaultdict(list)
  90. for element, value in zip(elements, data):
  91. if element == 'img':
  92. value = eval(value)
  93. elif element == 'yt_video':
  94. value = {'videoid': str(value)}
  95. else:
  96. value = str(value)
  97. update_data[element].append(value)
  98. for idx, f_value in enumerate(files):
  99. if not f_value or f_value.filename == '':
  100. continue
  101. if not allow_file(f_value.filename):
  102. flash('上傳圖片失敗,副檔名必須為:{}'.format(ALLOWED_EXTENSIONS), 'danger')
  103. continue
  104. requests.post(
  105. '{}upload/static/img?type={}&filename={}'.format(
  106. PORTAL_SERVER, img_type, f_value.filename), files={'image': f_value})
  107. update_data['img'][idx]['src'] = path.join(
  108. path.split(update_data['img'][idx]['src'])[0], f_value.filename)
  109. response = requests.post(
  110. '{}manages/data?page={}&section={}'.format(
  111. PORTAL_SERVER, req_args.get('page'), req_args.get('section_class')), json=update_data)
  112. if response.status_code == 200:
  113. sleep(1) # waiting for API upload image successfully.
  114. flash('修改成功', 'success')
  115. else:
  116. flash('修改失敗', 'danger')