routes.py 5.7 KB

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