Files
youtube-dl/lib/plugin/model_base.py

174 lines
6.3 KiB
Python
Raw Normal View History

2022-10-02 20:18:05 +09:00
import traceback
2022-10-25 12:12:04 +09:00
from datetime import datetime, timedelta
2022-10-02 20:18:05 +09:00
2022-10-11 16:46:05 +09:00
from framework import F
2022-10-26 03:25:39 +09:00
from sqlalchemy import desc, or_
2022-10-02 20:18:05 +09:00
2022-10-11 16:46:05 +09:00
class ModelBase(F.db.Model):
2022-10-02 20:18:05 +09:00
__abstract__ = True
__table_args__ = {'mysql_collate': 'utf8_general_ci'}
2022-10-25 12:12:04 +09:00
P = None
2022-10-02 20:18:05 +09:00
def __repr__(self):
return repr(self.as_dict())
def as_dict(self):
return {x.name: getattr(self, x.name).strftime('%m-%d %H:%M:%S') if isinstance(getattr(self, x.name), datetime) else getattr(self, x.name) for x in self.__table__.columns}
def save(self):
try:
2022-10-19 16:40:29 +09:00
with F.app.app_context():
F.db.session.add(self)
F.db.session.commit()
return self
2022-10-02 20:18:05 +09:00
except Exception as e:
2022-10-25 12:12:04 +09:00
self.P.logger.error(f'Exception:{str(e)}')
self.P.logger.error(traceback.format_exc())
2022-10-02 20:18:05 +09:00
@classmethod
def get_paging_info(cls, count, current_page, page_size):
try:
paging = {}
paging['prev_page'] = True
paging['next_page'] = True
if current_page <= 10:
paging['prev_page'] = False
paging['total_page'] = int(count / page_size) + 1
if count % page_size == 0:
paging['total_page'] -= 1
paging['start_page'] = int((current_page-1)/10) * 10 + 1
paging['last_page'] = paging['total_page'] if paging['start_page'] + 9 > paging['total_page'] else paging['start_page'] + 9
if paging['last_page'] == paging['total_page']:
paging['next_page'] = False
paging['current_page'] = current_page
paging['count'] = count
2022-10-19 16:40:29 +09:00
F.logger.debug('paging : c:%s %s %s %s %s %s', count, paging['total_page'], paging['prev_page'], paging['next_page'] , paging['start_page'], paging['last_page'])
2022-10-02 20:18:05 +09:00
return paging
except Exception as e:
2022-10-25 12:12:04 +09:00
cls.P.logger.error(f'Exception:{str(e)}')
cls.P.logger.error(traceback.format_exc())
2022-10-02 20:18:05 +09:00
@classmethod
def get_by_id(cls, id):
try:
2022-10-19 16:40:29 +09:00
with F.app.app_context():
return F.db.session.query(cls).filter_by(id=int(id)).first()
2022-10-02 20:18:05 +09:00
except Exception as e:
2022-10-25 12:12:04 +09:00
cls.P.logger.error(f'Exception:{str(e)}')
cls.P.logger.error(traceback.format_exc())
2022-10-02 20:18:05 +09:00
@classmethod
def get_list(cls, by_dict=False):
try:
2022-10-19 16:40:29 +09:00
with F.app.app_context():
tmp = F.db.session.query(cls).all()
if by_dict:
tmp = [x.as_dict() for x in tmp]
return tmp
2022-10-02 20:18:05 +09:00
except Exception as e:
2022-10-25 12:12:04 +09:00
cls.P.logger.error(f'Exception:{str(e)}')
cls.P.logger.error(traceback.format_exc())
2022-10-02 20:18:05 +09:00
@classmethod
def delete_by_id(cls, id):
try:
2022-10-19 16:40:29 +09:00
with F.app.app_context():
F.db.session.query(cls).filter_by(id=int(id)).delete()
F.db.session.commit()
return True
2022-10-02 20:18:05 +09:00
except Exception as e:
2022-10-25 12:12:04 +09:00
cls.P.logger.error(f'Exception:{str(e)}')
cls.P.logger.error(traceback.format_exc())
2022-10-02 20:18:05 +09:00
return False
@classmethod
2022-10-25 12:12:04 +09:00
def delete_all(cls, days=None):
2022-10-02 20:18:05 +09:00
try:
2022-10-19 16:40:29 +09:00
with F.app.app_context():
2022-10-25 12:12:04 +09:00
if days == None:
F.db.session.query(cls).delete()
F.db.session.commit()
else:
2022-10-26 03:25:39 +09:00
now = datetime.now()
ago = now - timedelta(days=int(days))
#ago.hour = 0
#ago.minute = 0
2022-10-26 04:26:09 +09:00
count = F.db.session.query(cls).filter(cls.created_time > ago).delete()
cls.P.logger.info(f"delete_all {days=} {count=}")
2022-10-19 16:40:29 +09:00
return True
2022-10-02 20:18:05 +09:00
except Exception as e:
2022-10-25 12:12:04 +09:00
cls.P.logger.error(f'Exception:{str(e)}')
cls.P.logger.error(traceback.format_exc())
2022-10-02 20:18:05 +09:00
return False
@classmethod
def web_list(cls, req):
try:
ret = {}
page = 1
page_size = 30
search = ''
if 'page' in req.form:
page = int(req.form['page'])
if 'keyword' in req.form:
2022-10-25 12:12:04 +09:00
search = req.form['keyword'].strip()
2022-10-02 20:18:05 +09:00
option1 = req.form.get('option1', 'all')
option2 = req.form.get('option2', 'all')
order = req.form['order'] if 'order' in req.form else 'desc'
2022-10-25 12:12:04 +09:00
query = cls.make_query(req, order=order, search=search, option1=option1, option2=option2)
2022-10-02 20:18:05 +09:00
count = query.count()
query = query.limit(page_size).offset((page-1)*page_size)
2022-10-26 03:25:39 +09:00
#F.logger.debug('cls count:%s', count)
2022-10-02 20:18:05 +09:00
lists = query.all()
ret['list'] = [item.as_dict() for item in lists]
ret['paging'] = cls.get_paging_info(count, page, page_size)
try:
2022-10-25 12:12:04 +09:00
if cls.P.ModelSetting is not None and cls.__tablename__ is not None:
cls.P.ModelSetting.set(f'{cls.__tablename__}_last_list_option', f'{order}|{page}|{search}|{option1}|{option2}')
2022-10-02 20:18:05 +09:00
except Exception as e:
2022-10-19 16:40:29 +09:00
F.logger.error('Exception:%s', e)
F.logger.error(traceback.format_exc())
F.logger.error(f'{cls.__tablename__}_last_list_option ERROR!' )
2022-10-02 20:18:05 +09:00
return ret
except Exception as e:
2022-10-25 12:12:04 +09:00
cls.P.logger.error('Exception:%s', e)
cls.P.logger.error(traceback.format_exc())
2022-10-02 20:18:05 +09:00
# 오버라이딩
@classmethod
2022-10-25 12:12:04 +09:00
def make_query(cls, req, order='desc', search='', option1='all', option2='all'):
2022-10-19 16:40:29 +09:00
with F.app.app_context():
query = F.db.session.query(cls)
return query
2022-10-26 03:25:39 +09:00
@classmethod
def make_query_search(cls, query, search, field):
if search is not None and search != '':
if search.find('|') != -1:
tmp = search.split('|')
conditions = []
for tt in tmp:
if tt != '':
conditions.append(field.like('%'+tt.strip()+'%') )
query = query.filter(or_(*conditions))
elif search.find(',') != -1:
tmp = search.split(',')
for tt in tmp:
if tt != '':
query = query.filter(field.like('%'+tt.strip()+'%'))
else:
query = query.filter(field.like('%'+search+'%'))
#query = query1.union(query2)
return query