update
This commit is contained in:
@@ -57,6 +57,7 @@ class Framework:
|
||||
|
||||
|
||||
def __initialize(self):
|
||||
os.environ["PYTHONUNBUFFERED"] = "1"
|
||||
os.environ['FF'] = "true"
|
||||
self.__config_initialize("first")
|
||||
self.__make_default_dir()
|
||||
@@ -118,7 +119,9 @@ class Framework:
|
||||
for package_name in plugins:
|
||||
db_path = os.path.join(self.config['path_data'], 'db', f'{package_name}.db')
|
||||
self.app.config['SQLALCHEMY_BINDS'][package_name] = f'sqlite:///{db_path}'
|
||||
self.db = SQLAlchemy(self.app, session_options={"autoflush": False})
|
||||
self.db = SQLAlchemy(self.app, session_options={"autoflush": False, "expire_on_commit": False})
|
||||
#with self.app.app_context():
|
||||
# self.db.session.expunge_all()
|
||||
|
||||
|
||||
def __init_celery(self):
|
||||
@@ -222,6 +225,7 @@ class Framework:
|
||||
from . import init_route, log_viewer
|
||||
|
||||
self.__make_default_logger()
|
||||
self.__config_initialize("last")
|
||||
self.logger.info('### LAST')
|
||||
self.logger.info(f"### PORT: {self.config.get('port')}")
|
||||
self.logger.info('### Now you can access App by webbrowser!!')
|
||||
@@ -266,6 +270,18 @@ class Framework:
|
||||
self.app.config['JSON_AS_ASCII'] = False
|
||||
elif mode == 'system_loading_after':
|
||||
pass
|
||||
elif mode == 'last':
|
||||
db_foder = os.path.join(self.config['path_data'], 'db')
|
||||
for name in os.listdir(db_foder):
|
||||
if name.endswith('.db'):
|
||||
db_filepath = os.path.join(db_foder, name)
|
||||
try:
|
||||
if os.stat(db_filepath).st_size == 0:
|
||||
os.remove(db_filepath)
|
||||
self.logger.debug(f"REMOVE {db_filepath}")
|
||||
except:
|
||||
pass
|
||||
|
||||
|
||||
|
||||
def __init_define(self):
|
||||
@@ -372,7 +388,7 @@ class Framework:
|
||||
###################################################
|
||||
# 로그
|
||||
###################################################
|
||||
def get_logger(self, name):
|
||||
def get_logger(self, name, from_command=False):
|
||||
logger = logging.getLogger(name)
|
||||
if not logger.handlers:
|
||||
level = logging.DEBUG
|
||||
@@ -396,25 +412,26 @@ class Framework:
|
||||
except:
|
||||
pass
|
||||
logger.setLevel(level)
|
||||
file_formatter = logging.Formatter(u'[%(asctime)s|%(levelname)s|%(filename)s:%(lineno)s] %(message)s')
|
||||
def customTime(*args):
|
||||
utc_dt = utc.localize(datetime.utcnow())
|
||||
my_tz = timezone("Asia/Seoul")
|
||||
converted = utc_dt.astimezone(my_tz)
|
||||
return converted.timetuple()
|
||||
|
||||
if from_command == False:
|
||||
file_formatter = logging.Formatter(u'[%(asctime)s|%(levelname)s|%(filename)s:%(lineno)s] %(message)s')
|
||||
else:
|
||||
file_formatter = logging.Formatter(u'[%(asctime)s] %(message)s')
|
||||
|
||||
file_formatter.converter = customTime
|
||||
file_max_bytes = 1 * 1024 * 1024
|
||||
fileHandler = logging.handlers.RotatingFileHandler(filename=os.path.join(self.path_data, 'log', f'{name}.log'), maxBytes=file_max_bytes, backupCount=5, encoding='utf8', delay=True)
|
||||
streamHandler = logging.StreamHandler()
|
||||
|
||||
# handler에 fommater 세팅
|
||||
fileHandler.setFormatter(file_formatter)
|
||||
streamHandler.setFormatter(CustomFormatter())
|
||||
|
||||
# Handler를 logging에 추가
|
||||
logger.addHandler(fileHandler)
|
||||
logger.addHandler(streamHandler)
|
||||
if from_command == False:
|
||||
streamHandler = logging.StreamHandler()
|
||||
streamHandler.setFormatter(CustomFormatter())
|
||||
logger.addHandler(streamHandler)
|
||||
return logger
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import os
|
||||
import shutil
|
||||
|
||||
from support import SupportYaml
|
||||
from support import SupportYaml, d
|
||||
|
||||
from framework import F
|
||||
|
||||
@@ -89,4 +89,5 @@ class MenuManager:
|
||||
|
||||
@classmethod
|
||||
def get_menu_map(cls):
|
||||
#F.logger.warning(d(cls.menu_map))
|
||||
return cls.menu_map
|
||||
|
||||
@@ -128,4 +128,3 @@ def videojs():
|
||||
def connect():
|
||||
pass
|
||||
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@ $.notify({
|
||||
},
|
||||
offset: 20,
|
||||
spacing: 10,
|
||||
z_index: 1031,
|
||||
z_index: 3000,
|
||||
delay: 10000,
|
||||
timer: 1000,
|
||||
url_target: '_blank',
|
||||
@@ -81,7 +81,7 @@ $.notify({
|
||||
|
||||
|
||||
function notify(msg, type) {
|
||||
$.notify('<strong>' + msg + '</strong>', {type: type});
|
||||
$.notify('<strong>' + msg + '</strong>', {type: type, z_index: 3000});
|
||||
}
|
||||
|
||||
// 메뉴 제거
|
||||
@@ -289,8 +289,8 @@ $.extend(
|
||||
{
|
||||
var form = '';
|
||||
$.each( args, function( key, value ) {
|
||||
//console.log(key);
|
||||
//console.log(value);
|
||||
console.log(key);
|
||||
console.log(value);
|
||||
value = value.split('"').join('\"')
|
||||
form += '<input type="hidden" name="'+key+'" value="'+value+'">';
|
||||
});
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// global socketio
|
||||
$(document).ready(function(){
|
||||
ResizeTextArea();
|
||||
});
|
||||
|
||||
$(document).ready(function(){
|
||||
@@ -23,6 +24,7 @@ frameSocket.on('notify', function(data){
|
||||
target: '_self'
|
||||
},{
|
||||
type: data['type'],
|
||||
z_index: 2000,
|
||||
});
|
||||
});
|
||||
|
||||
@@ -317,5 +319,17 @@ $("body").on('click', '#command_modal_input_btn', function(e) {
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
$(window).resize(function() {
|
||||
ResizeTextArea();
|
||||
});
|
||||
|
||||
|
||||
function ResizeTextArea() {
|
||||
ClientHeight = window.innerHeight
|
||||
$("#command_modal").height(ClientHeight-100);
|
||||
$("#command_modal_textarea").height(ClientHeight-380);
|
||||
}
|
||||
|
||||
///////////////////////////////////////
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
function m_button_group(h) {
|
||||
function j_button_group(h) {
|
||||
var str = '<div class="btn-group btn-group-sm flex-wrap mr-2" role="group">';
|
||||
str += h
|
||||
str += '</div>';
|
||||
@@ -6,7 +6,7 @@ function m_button_group(h) {
|
||||
}
|
||||
|
||||
// primary, secondary, success, danger, warning, info, light, dark, white
|
||||
function m_button(id, text, data={}, color='success', outline=true, small=false) {
|
||||
function j_button(id, text, data={}, color='success', outline=true, small=false) {
|
||||
var str = '<button id="'+id+'" name="'+id+'" class="btn btn-sm btn';
|
||||
if (outline) {
|
||||
str += '-outline';
|
||||
@@ -24,18 +24,48 @@ function m_button(id, text, data={}, color='success', outline=true, small=false)
|
||||
return str;
|
||||
}
|
||||
|
||||
function m_button_small(id, text, data={}, color='success', outline=true) {
|
||||
return m_button(id, text, data, color, outline, true);
|
||||
function j_button_small(id, text, data={}, color='success', outline=true) {
|
||||
return j_button(id, text, data, color, outline, true);
|
||||
}
|
||||
|
||||
|
||||
|
||||
function j_row_start(padding='10', align='center') {
|
||||
var str = '<div class="row" style="padding-top: '+padding+'px; padding-bottom:'+padding+'px; align-items:'+align+';">';
|
||||
return str;
|
||||
}
|
||||
function j_col(w, h, align='left') {
|
||||
var str = '<div class="col-sm-' + w + ' " style="text-align: '+align+'; word-break:break-all;">';
|
||||
str += h;
|
||||
str += '</div>';
|
||||
return str;
|
||||
}
|
||||
|
||||
function j_col_wide(w, h, align='left') {
|
||||
var str = '<div class="col-sm-' + w + ' " style="padding:0px; margin:0px; text-align: '+align+'; word-break:break-all;">';
|
||||
str += h;
|
||||
str += '</div>';
|
||||
return str;
|
||||
}
|
||||
|
||||
function j_row_end() {
|
||||
var str = '</div>';
|
||||
return str;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function j_hr(margin='5') {
|
||||
var str = '<hr style="width: 100%; margin:'+margin+'px;" />';
|
||||
return str;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
function j_hr_black() {
|
||||
var str = '<hr style="width: 100%; color: black; height: 2px; background-color:black;" />';
|
||||
return str;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -119,10 +149,9 @@ function m_table(id, heads) {
|
||||
|
||||
|
||||
|
||||
function m_row_start(padding='10', align='center') {
|
||||
var str = '<div class="row" style="padding-top: '+padding+'px; padding-bottom:'+padding+'px; align-items:'+align+';">';
|
||||
return str;
|
||||
}
|
||||
|
||||
|
||||
|
||||
function m_row_start_hover(padding='10', align='center') {
|
||||
var str = '<div class="row my_hover" style="padding-top: '+padding+'px; padding-bottom:'+padding+'px; align-items:'+align+';">';
|
||||
return str;
|
||||
@@ -139,39 +168,17 @@ function m_row_start_color2(padding='10', align='center') {
|
||||
return str;
|
||||
}
|
||||
|
||||
function m_row_end() {
|
||||
var str = '</div>';
|
||||
return str;
|
||||
}
|
||||
|
||||
|
||||
//border
|
||||
function m_col(w, h, align='left') {
|
||||
var str = '<div class="col-sm-' + w + ' " style="text-align: '+align+'; word-break:break-all;">';
|
||||
str += h
|
||||
str += '</div>';
|
||||
return str
|
||||
}
|
||||
|
||||
function m_col_wide(w, h, align='left') {
|
||||
var str = '<div class="col-sm-' + w + ' " style="padding:0px; margin:0px; text-align: '+align+'; word-break:break-all;">';
|
||||
str += h
|
||||
str += '</div>';
|
||||
return str
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function m_hr(margin='5') {
|
||||
var str = '<hr style="width: 100%; margin:'+margin+'px;" />';
|
||||
return str;
|
||||
}
|
||||
|
||||
function m_hr_black() {
|
||||
var str = '<hr style="width: 100%; color: black; height: 2px; background-color:black;" />';
|
||||
return str;
|
||||
}
|
||||
|
||||
|
||||
// 체크박스는 자바로 하면 on/off 스크립트가 안먹힘.
|
||||
|
||||
|
||||
|
||||
@@ -11,14 +11,7 @@ function m_row_start_hover(padding='10', align='center') {
|
||||
function m_row_start_top(padding='10') {
|
||||
return m_row_start(padding, 'top');
|
||||
}
|
||||
function m_row_start_color(padding='10', align='center', color='') {
|
||||
var str = '<div class="row" style="padding-top: '+padding+'px; padding-bottom:'+padding+'px; align-items:'+align+'; background-color:'+color+'">';
|
||||
return str;
|
||||
}
|
||||
function m_row_start_color2(padding='10', align='center') {
|
||||
var str = '<div class="row bg-dark text-white" style="padding-top: '+padding+'px; padding-bottom:'+padding+'px; align-items:'+align+';">';
|
||||
return str;
|
||||
}
|
||||
|
||||
|
||||
function m_row_end() {
|
||||
var str = '</div>';
|
||||
|
||||
@@ -36,17 +36,17 @@
|
||||
$(document).ready(function() {
|
||||
setWide();
|
||||
$('#loading').show();
|
||||
ResizeTextArea()
|
||||
ResizeTextAreaLog()
|
||||
})
|
||||
|
||||
function ResizeTextArea() {
|
||||
function ResizeTextAreaLog() {
|
||||
ClientHeight = window.innerHeight
|
||||
$("#log").height(ClientHeight-240);
|
||||
$("#add").height(ClientHeight-260);
|
||||
}
|
||||
|
||||
$(window).resize(function() {
|
||||
ResizeTextArea();
|
||||
ResizeTextAreaLog();
|
||||
});
|
||||
|
||||
|
||||
|
||||
@@ -140,6 +140,65 @@
|
||||
{{ setting_bottom(desc) }}
|
||||
{% endmacro %}
|
||||
|
||||
{% macro setting_input_textarea_wide(id, left, value='', col='12', row='3', desc='', disabled=False, padding='10') %}
|
||||
<div class='row' style="padding-top: {{padding}}px; padding-bottom:{{padding}}px; align-items: center;">
|
||||
<div class='col-sm-12'>
|
||||
{% if left != '' %}
|
||||
<div class="input-group col-sm-{{col}}">
|
||||
<strong>{{ left }}</strong>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="input-group col-sm-{{col}}">
|
||||
<textarea id="{{id}}" name="{{id}}" class="col-md-12" rows="{{row}}"
|
||||
{% if disabled %}
|
||||
disabled
|
||||
{% endif %}
|
||||
>{{ value }}</textarea>
|
||||
</div>
|
||||
{% if desc is not none %}
|
||||
<div style="padding-left:20px; padding-top:{{padding_top}}}px;">
|
||||
<em>
|
||||
{% if desc is string %}
|
||||
{{ desc }}
|
||||
{% elif desc is iterable %}
|
||||
{% for d in desc %}
|
||||
{{ d }}<br>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</em>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endmacro %}
|
||||
|
||||
|
||||
{% macro setting_input_textarea_and_buttons(id, left, buttons, value='', col='9', row='3', desc='', disabled=False) %}
|
||||
{{ setting_top(left) }}
|
||||
<div class="input-group col-sm-{{col}}">
|
||||
<textarea id="{{id}}" name="{{id}}" class="col-md-12" rows="{{row}}"
|
||||
{% if disabled %}
|
||||
disabled
|
||||
{% endif %}
|
||||
>{{ value }}</textarea>
|
||||
<div class="btn-group btn-group-sm flex-wrap mr-2" role="group" style="padding-left:5px; padding-top:0px">
|
||||
{% for b in buttons %}
|
||||
<button id="{{b[0]}}" class="btn btn-sm btn-outline-primary"
|
||||
{% if b|length > 2 %}
|
||||
{% for d in b[2] %}
|
||||
data-{{d[0]}}="{{d[1]}}""
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
>{{b[1]}}</button>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{{ setting_bottom(desc) }}
|
||||
{% endmacro %}
|
||||
<!-- TEXTAREA -->
|
||||
|
||||
|
||||
|
||||
<!-- 라디오버튼 -->
|
||||
{% macro setting_radio_with_value(id, title, radios, value=None, desc=None, disabled=False) %}
|
||||
{{ setting_top(title) }}
|
||||
@@ -635,62 +694,8 @@ macros.setting_button_with_info([['toggle_btn', 'Toggle', [{'key':'category', 'v
|
||||
|
||||
|
||||
|
||||
{% macro setting_input_textarea_wide(id, left, value='', col='12', row='3', desc='', disabled=False, padding='10') %}
|
||||
<div class='row' style="padding-top: {{padding}}px; padding-bottom:{{padding}}px; align-items: center;">
|
||||
<div class='col-sm-12'>
|
||||
{% if left != '' %}
|
||||
<div class="input-group col-sm-{{col}}">
|
||||
<strong>{{ left }}</strong>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="input-group col-sm-{{col}}">
|
||||
<textarea id="{{id}}" name="{{id}}" class="col-md-12" rows="{{row}}"
|
||||
{% if disabled %}
|
||||
disabled
|
||||
{% endif %}
|
||||
>{{ value }}</textarea>
|
||||
</div>
|
||||
{% if desc is not none %}
|
||||
<div style="padding-left:20px; padding-top:{{padding_top}}}px;">
|
||||
<em>
|
||||
{% if desc is string %}
|
||||
{{ desc }}
|
||||
{% elif desc is iterable %}
|
||||
{% for d in desc %}
|
||||
{{ d }}<br>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</em>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endmacro %}
|
||||
|
||||
|
||||
{% macro setting_input_textarea_and_buttons(id, left, buttons, value='', col='9', row='3', desc='', disabled=False) %}
|
||||
{{ setting_top(left) }}
|
||||
<div class="input-group col-sm-{{col}}">
|
||||
<textarea id="{{id}}" name="{{id}}" class="col-md-12" rows="{{row}}"
|
||||
{% if disabled %}
|
||||
disabled
|
||||
{% endif %}
|
||||
>{{ value }}</textarea>
|
||||
<div class="btn-group btn-group-sm flex-wrap mr-2" role="group" style="padding-left:5px; padding-top:0px">
|
||||
{% for b in buttons %}
|
||||
<button id="{{b[0]}}" class="btn btn-sm btn-outline-primary"
|
||||
{% if b|length > 2 %}
|
||||
{% for d in b[2] %}
|
||||
data-{{d[0]}}="{{d[1]}}""
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
>{{b[1]}}</button>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{{ setting_bottom(desc) }}
|
||||
{% endmacro %}
|
||||
|
||||
|
||||
|
||||
<!--progress-bar-striped progress-bar-animated-->
|
||||
|
||||
@@ -18,6 +18,8 @@
|
||||
{% for category in menu_map %}
|
||||
{% if 'uri' in category and category['uri'].startswith('http') %}
|
||||
<li class="nav-item"> <a class="nav-link" href="{{ category['uri']}}" target="_blank">{{category['name']}}</a></li>
|
||||
{% elif 'uri' in category and category['uri'].startswith('http') == False %}
|
||||
<li class="nav-item"> <a class="nav-link" href="{{ category['uri']}}">{{category['name']}}</a></li>
|
||||
{% else %}
|
||||
<!--{{ category }}-->
|
||||
<li class="nav-item dropdown">
|
||||
|
||||
@@ -1 +1 @@
|
||||
VERSION="4.0.26"
|
||||
VERSION="4.0.27"
|
||||
Reference in New Issue
Block a user