Initial
This commit is contained in:
		
						commit
						30059dd43a
					
				
							
								
								
									
										16
									
								
								docker-compose.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								docker-compose.yml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
version: '3'
 | 
			
		||||
 | 
			
		||||
services:
 | 
			
		||||
    gtfs2qr:
 | 
			
		||||
      build:
 | 
			
		||||
        context: ./gtfs2qr
 | 
			
		||||
      container_name: gtfs2qr
 | 
			
		||||
      environment:
 | 
			
		||||
        - DB_HOST=localhost
 | 
			
		||||
        - DB_PORT=3304
 | 
			
		||||
        - DB_NAME=gtfs
 | 
			
		||||
        - DB_USER=default
 | 
			
		||||
        - DB_PASS=secret
 | 
			
		||||
        - FTP_HOST=localhost
 | 
			
		||||
        - FTP_USER=user
 | 
			
		||||
        - FTP_PASS=secret
 | 
			
		||||
							
								
								
									
										19
									
								
								gtfs2qr/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								gtfs2qr/Dockerfile
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,19 @@
 | 
			
		||||
FROM python:3.8
 | 
			
		||||
 | 
			
		||||
ENV TZ=Europe/Moscow
 | 
			
		||||
ENV TERM=xterm-color
 | 
			
		||||
 | 
			
		||||
RUN apt-get update && \
 | 
			
		||||
  apt-get install -y --no-install-recommends cron python3-pymysql python3-qrcode p7zip && \
 | 
			
		||||
  rm -rf /var/lib/apt/lists/*
 | 
			
		||||
 | 
			
		||||
RUN \
 | 
			
		||||
  cp /usr/share/zoneinfo/${TZ} /etc/localtime && \
 | 
			
		||||
  echo "${TZ}" > /etc/timezone && date
 | 
			
		||||
 | 
			
		||||
COPY cron /etc/cron.d/gtfs2qr
 | 
			
		||||
RUN chmod 0755 /etc/cron.d/gtfs2qr && crontab /etc/cron.d/gtfs2qr
 | 
			
		||||
 | 
			
		||||
COPY gtfs2qr /opt/gtfs2qr
 | 
			
		||||
 | 
			
		||||
CMD ["cron", "-f"]
 | 
			
		||||
							
								
								
									
										1
									
								
								gtfs2qr/cron
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								gtfs2qr/cron
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
* * * * * root python3 /opt/gtfs2qr/gtfs2qr.py > /opt/gtfs2qr/logs.log 2>&1
 | 
			
		||||
							
								
								
									
										120
									
								
								gtfs2qr/gtfs2qr/gtfs2qr.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								gtfs2qr/gtfs2qr/gtfs2qr.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,120 @@
 | 
			
		||||
#!/usr/bin/env python3
 | 
			
		||||
 | 
			
		||||
import ftplib
 | 
			
		||||
import os
 | 
			
		||||
import os.path as op
 | 
			
		||||
import re
 | 
			
		||||
import shutil
 | 
			
		||||
import subprocess
 | 
			
		||||
from ftplib import FTP
 | 
			
		||||
 | 
			
		||||
import pymysql
 | 
			
		||||
import qrcode
 | 
			
		||||
from PIL import ImageFont, ImageDraw
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
DB_HOST = os.getenv('DB_HOST', 'default')
 | 
			
		||||
DB_PORT = os.getenv('DB_PORT', 'default')
 | 
			
		||||
DB_NAME = os.getenv('DB_NAME', 'default')
 | 
			
		||||
DB_USER = os.getenv('DB_USER', 'default')
 | 
			
		||||
DB_PASS = os.getenv('DB_PASS', 'default')
 | 
			
		||||
 | 
			
		||||
URL_TEMPLATE = 'http://rasp.orgp.spb.ru/%i'
 | 
			
		||||
 | 
			
		||||
FTP_HOST = os.getenv('FTP_HOST', 'default')
 | 
			
		||||
FTP_USER = os.getenv('FTP_USER', 'default')
 | 
			
		||||
FTP_PASS = os.getenv('FTP_PASS', 'default')
 | 
			
		||||
 | 
			
		||||
transport_type = {
 | 
			
		||||
    'bus': 'Автобус',
 | 
			
		||||
    'trolley': 'Троллейбус',
 | 
			
		||||
    'tram': 'Трамвай',
 | 
			
		||||
    'ship': 'Теплоход',
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def main():
 | 
			
		||||
 | 
			
		||||
    qr = qrcode.QRCode(
 | 
			
		||||
        version=3,
 | 
			
		||||
        error_correction=qrcode.constants.ERROR_CORRECT_L,
 | 
			
		||||
        box_size=10,
 | 
			
		||||
        border=4,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    conn = pymysql.connect(
 | 
			
		||||
        host=DB_HOST,
 | 
			
		||||
        port=DB_PORT,
 | 
			
		||||
        user=DB_USER,
 | 
			
		||||
        password=DB_PASS,
 | 
			
		||||
        db=DB_NAME,
 | 
			
		||||
        charset='utf8mb4',
 | 
			
		||||
        cursorclass=pymysql.cursors.DictCursor
 | 
			
		||||
    )
 | 
			
		||||
    cursor = conn.cursor()
 | 
			
		||||
 | 
			
		||||
    if op.exists('codes.7z'):
 | 
			
		||||
        os.unlink('codes.7z')
 | 
			
		||||
 | 
			
		||||
    shutil.rmtree('codes', ignore_errors=True)
 | 
			
		||||
 | 
			
		||||
    cursor.execute('SELECT * FROM routes ORDER BY route_short_name;')
 | 
			
		||||
    for route in cursor.fetchall():
 | 
			
		||||
        for d in (0, 1):
 | 
			
		||||
            route_path = op.join(
 | 
			
		||||
                'codes',
 | 
			
		||||
                transport_type[route['transport_type']],
 | 
			
		||||
                route['route_short_name'],
 | 
			
		||||
                'туда' if d == 0 else 'обратно'
 | 
			
		||||
            )
 | 
			
		||||
            print(route_path, flush=True)
 | 
			
		||||
            cursor.execute(
 | 
			
		||||
                'SELECT * FROM route_stops WHERE route_id=%s AND direction_id=%s ORDER BY stop_sequence;',
 | 
			
		||||
                (route['route_id'], d)
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
            stops = cursor.fetchall()
 | 
			
		||||
            if len(stops) == 0:
 | 
			
		||||
                print('<empty>', flush=True)
 | 
			
		||||
                continue
 | 
			
		||||
 | 
			
		||||
            for stop in stops:
 | 
			
		||||
                os.makedirs(route_path, exist_ok=True)
 | 
			
		||||
                stop_name = re.sub(r'\s+', ' ', stop['stop_name'].strip())
 | 
			
		||||
                code_name = [
 | 
			
		||||
                    str(stop['stop_sequence']),
 | 
			
		||||
                    re.sub(r'[\?\"/\\<>*|:~]+', '', stop_name),
 | 
			
		||||
                    route['route_short_name'],
 | 
			
		||||
                    transport_type[route['transport_type']],
 | 
			
		||||
                    str(stop['stop_id']),
 | 
			
		||||
                ]
 | 
			
		||||
                image_path = op.join(route_path, '-'.join(code_name) + '.jpeg')
 | 
			
		||||
 | 
			
		||||
                qr.add_data(URL_TEMPLATE % stop['stop_id'])
 | 
			
		||||
                qr.make(fit=True)
 | 
			
		||||
 | 
			
		||||
                img = qr.make_image(fill_color="black", back_color="white")
 | 
			
		||||
 | 
			
		||||
                draw = ImageDraw.Draw(img)
 | 
			
		||||
                font = ImageFont.truetype("Verdana.ttf", 12)
 | 
			
		||||
                stop_name += ' (%i)' % stop['stop_id']
 | 
			
		||||
                text_size = font.getsize(stop_name)
 | 
			
		||||
                draw.text(((img.size[0] - text_size[0]) / 2, img.size[1] - 25), stop_name, font=font)
 | 
			
		||||
 | 
			
		||||
                with open(image_path, 'wb') as dest:
 | 
			
		||||
                    img.save(dest)
 | 
			
		||||
 | 
			
		||||
                qr.clear()
 | 
			
		||||
 | 
			
		||||
    subprocess.run(['7za', 'a', 'codes', 'codes'], check=True)
 | 
			
		||||
 | 
			
		||||
    with ftplib.FTP(host=FTP_HOST, user=FTP_USER, passwd=FTP_PASS) as ftp:
 | 
			
		||||
        if 'codes.7z' in ftp.nlst():
 | 
			
		||||
            ftp.delete('codes.7z')
 | 
			
		||||
 | 
			
		||||
        with open('codes.7z', 'rb') as arch:
 | 
			
		||||
            ftp.storbinary('STOR codes.7z', arch)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    main()
 | 
			
		||||
							
								
								
									
										0
									
								
								gtfs2qr/gtfs2qr/logs.log
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								gtfs2qr/gtfs2qr/logs.log
									
									
									
									
									
										Normal file
									
								
							
		Loading…
	
		Reference in New Issue
	
	Block a user