|
# -*- coding: utf-8 -*-
import errno
import glob
import os
import sqlite3
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from tornado.options import define, options
from tornado.web import Application, RequestHandler, StaticFileHandler
define('host', default='127.0.0.1', help='run on the given host', type=str)
define('port', default=8001, help='run on the given port', type=int)
options.parse_command_line()
ROOT_PATH = '/tmp/minipai2'
# Create Table SQL
CREATE_TABLE_STMT = """
CREATE TABLE IF NOT EXISTS photoinfo (
id integer primary key,
lensman varchar(20),
session varchar(20),
name varchar(13)
);"""
# Create Index SQL
CREATE_INDEX1 = 'CREATE INDEX IF NOT EXISTS idx_lensman ON photoinfo (lensman);'
CREATE_INDEX2 = 'CREATE INDEX IF NOT EXISTS idx_session ON photoinfo (session);'
# Insert Record SQL
INSERT_RECORD_STMT = 'INSERT INTO photoinfo VALUES (NULL, ?, ?, ?);'
# Delete Record SQL
DELETE_RECORD_STMT = 'DELETE FROM photoinfo WHERE lensman = ? and session = ? and name = ?;'
# Query Max(name) SQL
SELECT_RECORD_STMT = 'SELECT MAX(name) FROM photoinfo WHERE lensman = ? and session = ?;'
conn = sqlite3.connect('minipai2.db')
cur = conn.cursor()
# 执行语句
cur.execute(CREATE_TABLE_STMT)
cur.execute(CREATE_INDEX1)
cur.execute(CREATE_INDEX2)
conn.commit()
# FILE OPERATE
def silent_makdirs(path):
try:
os.makedirs(path)
except OSError as e:
if e.errno != errno.EEXIST:
raise
def silent_remove(path):
try:
os.remove(path)
except OSError as e:
if e.errno != errno.ENOENT:
raise
def get_session_root(lensman, session):
return '{}/{}'.format(ROOT_PATH, session)
def get_session_dir(lensman, session):
session_root = get_session_root(lensman, session)
return '{}/{}'.format(session_root, 'origin'), '{}/{}'.format(session_root, 'thumbnail')
def create_session_dir(lensman, session):
for path in get_session_dir(lensman, session):
silent_makdirs(path)
def get_last_timestamp(lensman, session):
cur.execute(SELECT_RECORD_STMT, (lensman, session))
result = cur.fetchall()
return int(result[0][0] or 0)
def insert_session_file(lensman, session, name):
cur.execute(INSERT_RECORD_STMT, (lensman, session, name))
conn.commit()
def delete_session_file(lensman, session, name):
cur.execute(DELETE_RECORD_STMT, (lensman, session, name))
conn.commit()
def get_new_files(lensman, session, maxt):
_, thumb = get_session_dir(lensman, session)
files = glob.iglob('{}/*'.format(thumb))
news = []
for file in files:
filename = file.split('/')[-1]
name = filename.split('.')[0]
if int(name) > maxt:
insert_session_file(lensman, session, name)
news.append({
'id': name,
'name': filename,
'path': file.strip(ROOT_PATH),
})
return news
def print_qrcode(lensman, session):
# Call ``C`` to Connect Printer
# Param
# :: session
pass
class HelloHandler(RequestHandler):
def get(self):
self.write('Hello Tornado')
class SessionStartHandler(RequestHandler):
def post(self):
lensman = self.get_argument('lensman', '')
session = self.get_argument('session', '')
# Create Session Dir
create_session_dir(lensman, session)
# Change Mode to 0777
os.chmod(get_session_root(lensman, session), 0777)
self.write({
'status': 200,
})
class SessionEndHandler(RequestHandler):
def post(self):
lensman = self.get_argument('lensman', '')
session = self.get_argument('session', '')
# Change Mode to 0700
os.chmod(get_session_root(lensman, session), 0700)
# Print QRCode
print_qrcode(lensman, session)
self.write({
'status': 200,
})
class FetchThumbnailHandler(RequestHandler):
def post(self):
lensman = self.get_argument('lensman', '')
session = self.get_argument('session', '')
maxt = get_last_timestamp(lensman, session)
files = get_new_files(lensman, session, maxt)
self.write({
'status': 200,
'data': {
'files': files
}
})
class FetchOriginHandler(RequestHandler):
def post(self):
lensman = self.get_argument('lensman', '')
session = self.get_argument('session', '')
name = self.get_argument('name', '')
origin, _ = get_session_dir(lensman, session)
self.write({
'status': 200,
'data': {
'path': '{}/{}'.format(origin, name).strip(ROOT_PATH)
}
})
class DeletePhotoHandler(RequestHandler):
def post(self):
lensman = self.get_argument('lensman', '')
session = self.get_argument('session', '')
id_ = self.get_argument('id', '')
name = self.get_argument('name', '')
path = self.get_argument('path', '')
# Delete Record from Sqlite3
delete_session_file(lensman, session, id_)
# Delete Photo from Disk
origin, thumb = get_session_dir(lensman, session)
# Delete Thumbnail
silent_remove('{}/{}'.format(thumb, name))
# Delete Origin
silent_remove('{}/{}'.format(origin, name))
self.write({
'status': 200,
})
class PrintQRCodeHandler(RequestHandler):
def post(self):
lensman = self.get_argument('lensman', '')
session = self.get_argument('session', '')
# Print QRCode
print_qrcode(lensman, session)
self.write({
'status': 200,
})
handlers = [
(r'/', HelloHandler),
(r'/session_start', SessionStartHandler),
(r'/session_end', SessionEndHandler),
(r'/fetch_thumbnail', FetchThumbnailHandler),
(r'/fetch_origin', FetchOriginHandler),
(r'/delete_photo', DeletePhotoHandler),
(r'/print_qrcode', PrintQRCodeHandler),
(r'/static/(.*)', StaticFileHandler, {'path': ROOT_PATH}),
]
def main():
app = Application(handlers=handlers, default_host=options.host)
server = HTTPServer(app)
server.listen(options.port)
IOLoop.current().start()
if __name__ == '__main__':
main()
|