from flask import flash, request, redirect, url_for, Response,Blueprint from flask_restful import Resource, Api import requests from time import sleep from backstage.utils import translate from collections import defaultdict from os import path from backstage.config import PORTAL_SERVER contents_app = Blueprint('contents', __name__) api = Api(contents_app) TYPE_URL_FOR = {'collection': 'collections.collection_list', 'blog': 'blogs.blog_list'} def checktype(articletype): if articletype == 'blog': return 'blog' return articletype def create_content(data, image_data): new_response = requests.post('{}new_content'.format(PORTAL_SERVER), json=data) print("Request returned " + str(new_response.status_code)) if new_response.status_code == 201: #flash('新增文章失敗', 'danger') return "" if new_response.status_code == 200: if not image_data == None: requests.post( '{}upload/static/img?type={}&filename={}'.format( PORTAL_SERVER, checktype(data.get('type')), image_data.filename), files={'image': image_data}) sleep(1) # sleep for waiting for new_content API generating content successfully. return redirect(url_for('editor.editor', url='/{}/{}'.format( checktype(data.get('type')), get_trans_title_url_name(data.get('name'))))) else: flash('新增文章失敗', 'danger') print(url_for(TYPE_URL_FOR.get(data.get('type')))) return redirect(url_for(TYPE_URL_FOR.get(data.get('type')))) def create_collection_content(data, img, coverimg, csliderimg, commentimg, ownerimg): #exclusive for collection new_response = requests.post('{}new_content'.format(PORTAL_SERVER), json=data) if new_response.status_code == 201: #flash('新增文章失敗', 'danger') return "" if new_response.status_code == 200: if not img == None: requests.post( '{}upload/static/img?type={}&filename={}'.format( PORTAL_SERVER, checktype(data.get('type')), img.filename), files={'image': img}) requests.post( '{}upload/static/img?type={}&filename={}'.format( PORTAL_SERVER, checktype(data.get('type')), coverimg.filename), files={'image': coverimg}) sleep(1) # sleep for waiting for new_content API generating content successfully. if not commentimg == None: requests.post( '{}upload/img_to_dir?url={}&filename={}'.format( PORTAL_SERVER, data.get('dest'), commentimg.filename), files={'image': commentimg}) sleep(1) if not ownerimg == None: requests.post( '{}upload/img_to_dir?url={}&filename={}'.format( PORTAL_SERVER, data.get('dest'), ownerimg.filename), files={'image': ownerimg}) sleep(1) # reserved for slider img wheel return redirect(url_for('editor.editor', url='/{}/{}'.format( checktype(data.get('type')), get_trans_title_url_name(data.get('name'))))) else: flash('新增文章失敗', 'danger') return redirect(url_for(TYPE_URL_FOR.get(data.get('type')))) def upload_slider_img(data, image_data): #for uploading slider images, currently unused if (data.type == 'collection'): print("This is a collection article.") #debug use if not image_data == None: #just in case requests.post( '{}upload/static/img/?type={}&filename={}'.format( PORTAL_SERVER, checktype(data.get('type')), image_data.filename), files={'image': data.get('csliderimg')}, type='csliderimg', dest=data.get('dest')) sleep(1) # sleep for waiting for new_content API generating content successfully. def remove_content(): url = request.args.get('url', type=str) response = requests.delete('{}contents?url={}'.format(PORTAL_SERVER, url)) if response.status_code == 200: flash('刪除文章成功', 'success') else: flash('刪除文章失敗', 'danger') def get_trans_title_url_name(title): title = title.replace('「','').replace('」','').replace('%','_percent') tary = translate(title).replace('$','_').replace('&','_').replace('+','_').replace(',','_').replace('/','_').replace(':','_').replace(';','_').replace('=','_').replace('?','_').replace('@','_').replace(' ','_').replace("'",'_').replace('?','').replace('!','').split('_') while("" in tary) : tary.remove("") return ('_'.join(tary)) #return translate(title).replace(' ', '_') def update_manage_table(data, elements, req_args, files, img_type): def allow_file(filename): return '.' in filename and \ filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'webp'} update_data = defaultdict(list) for element, value in zip(elements, data): if element == 'img': value = eval(value) elif element == 'yt_video': value = {'videoid': str(value)} else: value = str(value) update_data[element].append(value) for idx, f_value in enumerate(files): if not f_value or f_value.filename == '': continue if not allow_file(f_value.filename): flash('上傳圖片失敗,副檔名必須為:{}'.format(ALLOWED_EXTENSIONS), 'danger') continue requests.post( '{}upload/static/img?type={}&filename={}'.format( PORTAL_SERVER, img_type, f_value.filename), files={'image': f_value}) update_data['img'][idx]['src'] = path.join( path.split(update_data['img'][idx]['src'])[0], f_value.filename) response = requests.post( '{}manages/data?page={}§ion={}'.format( PORTAL_SERVER, req_args.get('page'), req_args.get('section_class')), json=update_data) if response.status_code == 200: sleep(1) # waiting for API upload image successfully. flash('修改成功', 'success') else: flash('修改失敗', 'danger')