# -*- coding: utf-8 -*- """Иконки и hero-картинки направлений услуг (UF-поля разделов iblock 30).""" import sqlread, io, os, zipfile P = 'db.sql' ZIP = r'C:\Users\naym4\Downloads\public_html.zip' MEDIA_DIR = r'D:\dana\media' OUT = io.open('seed_dir_icons.sql', 'w', encoding='utf-8') MIME = {'.jpg': 'image/jpeg', '.jpeg': 'image/jpeg', '.png': 'image/png', '.gif': 'image/gif', '.svg': 'image/svg+xml', '.webp': 'image/webp'} def esc(s): return "'" + str(s or '').replace("\\", "\\\\").replace("'", "''") + "'" files = {r['ID']: r for r in sqlread.rows(P, 'b_file')} # section id -> CODE (направления услуг) sec_code = {} for r in sqlread.rows(P, 'b_iblock_section'): if r['IBLOCK_ID'] == '30': sec_code[r['ID']] = r.get('CODE') zf = zipfile.ZipFile(ZIP) names = set(zf.namelist()) extracted = {} def ensure(fid): if fid in extracted: return extracted[fid] f = files.get(fid) if not f: return None subdir = (f.get('SUBDIR') or '').strip(); name = (f.get('FILE_NAME') or '').strip() arc = 'public_html/upload/%s/%s' % (subdir, name) if not subdir or not name or arc not in names: return None dd = os.path.join(MEDIA_DIR, subdir.replace('/', os.sep)); os.makedirs(dd, exist_ok=True) with zf.open(arc) as s, open(os.path.join(dd, name), 'wb') as d: d.write(s.read()) web = '/media/%s/%s' % (subdir, name); extracted[fid] = web return web def emit_media(fid, web): f = files[fid]; ext = os.path.splitext(web)[1].lower() mime = MIME.get(ext, 'application/octet-stream') OUT.write("INSERT INTO media (path,mime,size,width,height,alt) VALUES (%s,%s,%s,%s,%s,'') " "ON CONFLICT (path) DO NOTHING;\n" % ( esc(web), esc(mime), f.get('FILE_SIZE') or '0', f.get('WIDTH') or '0', f.get('HEIGHT') or '0')) OUT.write('BEGIN;\n') icons = heroes = 0 for r in sqlread.rows(P, 'b_uts_iblock_30_section'): code = sec_code.get(r['VALUE_ID']) if not code: continue ic = r.get('UF_ICON') if ic and ic not in ('', 'NULL'): web = ensure(ic) if web: emit_media(ic, web) OUT.write("UPDATE services SET icon=%s WHERE path=%s AND parent_id IS NULL;\n" % (esc(web), esc(code))) icons += 1 hero = r.get('UF_TRANSPARENT_PICTURE') if hero and hero not in ('', 'NULL'): web = ensure(hero) if web: emit_media(hero, web) OUT.write("UPDATE services SET image_id=(SELECT id FROM media WHERE path=%s) " "WHERE path=%s AND parent_id IS NULL AND image_id IS NULL;\n" % (esc(web), esc(code))) heroes += 1 OUT.write('COMMIT;\n'); OUT.close() print('direction icons:', icons, 'heroes:', heroes, 'extracted:', len(extracted))