routes.py 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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 create_content(data, image_data):
  14. new_response = requests.post('{}new_content'.format(PORTAL_SERVER), json=data)
  15. if new_response.status_code == 201:
  16. #flash('新增文章失敗', 'danger')
  17. return "<script>alert('已有重複的標題,請重新設定');history.go(-1);</script>"
  18. if new_response.status_code == 200:
  19. if not image_data == None:
  20. requests.post(
  21. '{}upload/static/img?type={}&filename={}'.format(
  22. PORTAL_SERVER, data.get('type'), image_data.filename), files={'image': image_data})
  23. sleep(1) # sleep for waiting for new_content API generating content successfully.
  24. return redirect(url_for('editor.editor', url='/{}/{}'.format(
  25. data.get('type'), get_trans_title_url_name(data.get('name')))))
  26. else:
  27. flash('新增文章失敗', 'danger')
  28. return redirect(url_for(TYPE_URL_FOR.get(data.get('type'))))
  29. def remove_content():
  30. url = request.args.get('url', type=str)
  31. response = requests.delete('{}contents?url={}'.format(PORTAL_SERVER, url))
  32. if response.status_code == 200:
  33. flash('刪除文章成功', 'success')
  34. else:
  35. flash('刪除文章失敗', 'danger')
  36. def get_trans_title_url_name(title):
  37. tary = translate(title).replace('$','_').replace('&','_').replace('+','_').replace(',','_').replace('/','_').replace(':','_').replace(';','_').replace('=','_').replace('?','_').replace('@','_').replace(' ','_').replace("'",'_').split('_')
  38. while("" in tary) :
  39. tary.remove("")
  40. return ('_'.join(tary))
  41. #return translate(title).replace(' ', '_')
  42. def update_manage_table(data, elements, req_args, files, img_type):
  43. def allow_file(filename):
  44. return '.' in filename and \
  45. filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
  46. ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'webp'}
  47. update_data = defaultdict(list)
  48. for element, value in zip(elements, data):
  49. if element == 'img':
  50. value = eval(value)
  51. elif element == 'yt_video':
  52. value = {'videoid': str(value)}
  53. else:
  54. value = str(value)
  55. update_data[element].append(value)
  56. for idx, f_value in enumerate(files):
  57. if not f_value or f_value.filename == '':
  58. continue
  59. if not allow_file(f_value.filename):
  60. flash('上傳圖片失敗,副檔名必須為:{}'.format(ALLOWED_EXTENSIONS), 'danger')
  61. continue
  62. requests.post(
  63. '{}upload/static/img?type={}&filename={}'.format(
  64. PORTAL_SERVER, img_type, f_value.filename), files={'image': f_value})
  65. update_data['img'][idx]['src'] = path.join(
  66. path.split(update_data['img'][idx]['src'])[0], f_value.filename)
  67. response = requests.post(
  68. '{}manages/data?page={}&section={}'.format(
  69. PORTAL_SERVER, req_args.get('page'), req_args.get('section_class')), json=update_data)
  70. if response.status_code == 200:
  71. sleep(1) # waiting for API upload image successfully.
  72. flash('修改成功', 'success')
  73. else:
  74. flash('修改失敗', 'danger')