123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- from flask import request, Blueprint
- from flask_restful import Resource, Api
- from os import path, makedirs
- import logging
- from bs4 import BeautifulSoup
- from models.config import CONTENT_DIR
- from models.utils import read_line_md, gen_md_file_dirs, translate, get_now_time
- from models.store_locations.templates import store_location_template, amp_img_template
- from models.store_locations import STORE_CONTENT_DIR
- from models.statics.routes import get_static_imgs_src
- store_locations_app = Blueprint('store_locations', __name__)
- logger = logging.getLogger(__name__)
- api = Api(store_locations_app)
- class StoreLocations(Resource):
- def __init__(self):
- self.exist_img_file_src = []
- def get_file_data(self, f_dir):
- result = {}
- is_amp_img = False
- for line in read_line_md(f_dir):
- if 'title: ' in line:
- result['title'] = line.split('title: ')[-1].replace('"', '').replace('\n', '')
- elif 'type: ' in line:
- result['type'] = line.split('type: ')[-1].replace('"', '').replace('\n', '')
- elif '<amp-img' in line:
- is_amp_img = True
- elif 'h2 class="mb-4"' in line:
- result['store'] = BeautifulSoup(line, 'html.parser').h2.string
- elif '營業時間 | ' in line:
- result['hour'] = line.split('營業時間 | ')[-1].replace('\n', '')
- elif '門市電話 | ' in line:
- result['phone'] = BeautifulSoup(line, 'html.parser').a.string
- elif '門市地點 | ' in line:
- result['location'] = BeautifulSoup(line, 'html.parser').a.string
- elif '停車資訊 | ' in line:
- result['parking'] = line.split('停車資訊 | ')[-1].replace('\n', '')
- if is_amp_img:
- if 'src=' in line:
- img_src = line.split('src=')[-1].replace('"', '').replace('\n', '')
- if img_src in self.exist_img_file_src:
- result.setdefault('imgs', []).append(img_src)
- if '</amp-img':
- is_amp_img = False
- return result
- def _get_district_name(self, title):
- return translate(title.replace('門市', '')).lower().replace(' ', '_')
- def _get_amp_img_md(self, imgs, title):
- result = ''
- for img_src in imgs:
- amp_img_md = amp_img_template.format(src=img_src, title=title)
- result += amp_img_md + '\n'
- return result
- def get(self):
- result = {}
- for zone, dir_ in STORE_CONTENT_DIR.items():
- self.exist_img_file_src = get_static_imgs_src('store_{}'.format(zone))
- for f_dir in gen_md_file_dirs(dir_):
- result.setdefault(zone, []).append(self.get_file_data(f_dir))
- return result
- def post(self):
- def get_store_dir():
- DISTRICT_STORES = {'store_north': '北部門市',
- 'store_central': '中部門市',
- 'store_south': '南部門市',
- 'store_east': '東部門市'}
- return path.join(CONTENT_DIR,
- store_data.get('type'),
- DISTRICT_STORES.get(store_data.get('type'), '中部門市'),
- store_data.get('title').replace('門市', ''))
- update_md = []
- for store_data in request.json:
- store_location_md = store_location_template.format(
- title=store_data.get('title'),
- date=get_now_time(),
- type=store_data.get('type'),
- district=self._get_district_name(store_data.get('title')),
- amp_imgs=self._get_amp_img_md(store_data.get('imgs'), store_data.get('title')),
- store=store_data.get('store'),
- hour=store_data.get('hour'),
- phone_without_dash=store_data.get('phone').replace('-', ''),
- phone=store_data.get('phone'),
- location=store_data.get('location'),
- parking=store_data.get('parking'))
- store_dir = get_store_dir()
- makedirs(store_dir, exist_ok=True)
- with open(path.join(store_dir, 'index.md'), 'w') as md:
- md.write(store_location_md)
- update_md.append(store_location_md)
- return update_md
- api.add_resource(StoreLocations, '/api/store_locations')
|