This commit is contained in:
flaskfarm
2022-10-19 16:40:29 +09:00
parent 97b1f6bf48
commit c146e03cf1
26 changed files with 965 additions and 246 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -128,4 +128,3 @@ def videojs():
def connect():
pass

View File

@@ -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+'">';
});

View File

@@ -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);
}
///////////////////////////////////////

View File

@@ -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 스크립트가 안먹힘.

View File

@@ -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>';

View File

@@ -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();
});

View File

@@ -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-->

View File

@@ -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">

View File

@@ -1 +1 @@
VERSION="4.0.26"
VERSION="4.0.27"