def __init__(self, sameFileNamePrompt=None, sameFileHashPrompt=None, load_config=False): if os.path.isfile(CONFIG_FILE) != True: self.create_genesis_configuration() if load_config: et = None try: et = ET.parse(CONFIG_FILE) except: logger.error("Unspecified XML parse error") for tags in et.iter(str("same_file_name_prompt")): if tags.text == "1": self.sameFileNamePrompt = True elif tags.text == "0": self.sameFileNamePrompt = False else: self.sameFileNamePrompt = True for tags in et.iter(str("same_file_hash_prompt")): if tags.text == "1": self.sameFileHashPrompt = True elif tags.text == "0": self.sameFileHashPrompt = False else: self.sameFileHashPrompt = True for tags in et.iter(str("max_chunk_size_for_download")): if tags.text is not None: self.maxDownloadChunkSize = int(tags.text) else: self.maxDownloadChunkSize = 1024
def paint_config_to_ui(self, settings_ui): et = None try: et = ET.parse(CONFIG_FILE) for tags in et.iter(str("max_shard_size")): settings_ui.max_shard_size.setValue(int(tags.text)) for tags in et.iter(str("ownstorj_port")): settings_ui.ownstorj_port.setValue(int(tags.text)) for tags in et.iter(str("max_connections_onetime")): settings_ui.connections_onetime.setValue(int(tags.text)) for tags in et.iter(str("bridge_request_timeout")): settings_ui.bridge_request_timeout.setValue(int(tags.text)) for tags in et.iter(str("crypto_keys_location")): settings_ui.crypto_keys_location.setText(str(tags.text)) for tags in et.iter(str("max_download_bandwidth")): settings_ui.max_download_bandwidth.setText(str(tags.text)) for tags in et.iter(str("max_upload_bandwidth")): settings_ui.max_upload_bandwidth.setText(str(tags.text)) for tags in et.iter(str("default_file_encryption_algorithm")): settings_ui.default_crypto_algorithm.setCurrentIndex(int(tags.text)) for tags in et.iter(str("shard_size_unit")): settings_ui.shard_size_unit.setCurrentIndex(int(tags.text)) for tags in et.iter(str("custom_max_shard_size_enabled")): if int(tags.text) == 1: settings_ui.max_shard_size_enabled_checkBox.setChecked(True) else: settings_ui.max_shard_size_enabled_checkBox.setChecked(False) except Exception as e: logger.error("Unspecified XML parse error" + str(e))
def load_config_from_xml(self): try: et = ET.parse(CONFIG_FILE) for tags in et.iter('password'): output = tags.text except Exception as e: logger.error('Unspecified error, %s' % str(e))
def max_shard_size(self): et = None max_shard_size = DEFAULT_SHARD_SIZE try: et = ET.parse(CONFIG_FILE) shard_size_unit = 2 max_shard_size_sterile = None for tags in et.iter(str("custom_max_shard_size_enabled")): if int(tags.text) == 1: for tags2 in et.iter(str("max_shard_size")): max_shard_size_sterile = int(tags2.text) for tags3 in et.iter(str("shard_size_unit")): shard_size_unit = int(tags3.text) if shard_size_unit == 0: # KB: max_shard_size = (max_shard_size_sterile * 2048) elif shard_size_unit == 1: # MB: max_shard_size = (max_shard_size_sterile * 1024 * 2048) elif shard_size_unit == 2: # GB: max_shard_size = (max_shard_size_sterile * 1024 * 1024 * 2048) elif shard_size_unit == 3: # TB: max_shard_size = (max_shard_size_sterile * 1024 * 1024 * 1024 * 2048) else: max_shard_size = DEFAULT_SHARD_SIZE except Exception as e: logger.error("Unspecified XML parse error" + str(e)) return (max_shard_size)
def user_login_operator(self, info: dict): user_name = info.get('user_name') user_pw = info.get('user_pw') info_time = info.get('time') if not all([user_name, user_pw, info_time]): logger.error('incomplete params') return 'incomplete params', 421 user_check = self.user_collection.find_one({ "user_name": user_name, "user_pw": user_pw, "activate": 1 }) if user_check: self.user_log_collection.insert_one({ 'id': { 'user_id': user_check['_id'] }, 'operator': user_name, 'time': info_time, 'action': 'operator %s login' % user_name }) logger.info("login %s" % user_name) return user_check['type'], 200 else: logger.error("user:%s didn't exist" % user_name) return 'login failed', 421
def load_config_from_xml(self): try: et = ET.parse(CONFIG_FILE) for tags in et.iter('password'): output = tags.text except: logger.error("Unspecified error")
def get_config_parametr_value(self, parametr): output = '' try: et = ET.parse(CONFIG_FILE) for tags in et.iter(str(parametr)): output = tags.text return output except Exception as e: logger.error('Unspecified error, %s' % str(e))
def get_config_parametr_value(self, parametr): output = "" try: et = ET.parse(CONFIG_FILE) for tags in et.iter(str(parametr)): output = tags.text return output except: logger.error("Unspecified error")
def barcode_find(self, info): barcode = info.get('barcode') if not barcode: logger.error('incomplete params') return 'incomplete params', 421 res = self.panel_collection.find_one({'barcode': barcode}, { '_id': 0, 'thresholds': 0 }) return res, 200
def get_user_email(self): email = "" try: et = ET.parse("storj_account_conf.xml") for tags in et.iter('login_email'): email = tags.text except IOError: logger.error("Error in Account Manager get email") logger.error("Credentials file not existing") return email
def get_user_password(self): password = "" try: et = ET.parse("storj_account_conf.xml") for tags in et.iter('password'): password = tags.text except IOError: logger.error("Error in Account Manager get password") logger.error("Credentials file not existing") return password
def gui_config_check(self, info: dict): gui_no = info.get('gui_no') if not gui_no: logger.error('incomplete params') return 'incomplete params', 421, {'Content-Type': 'application/json'} gui_setting_check = self.gui_setting_collection.find_one({'gui_no': gui_no}, {'_id': 0}) if not gui_setting_check: return 'null', 400, {'Content-Type': 'application/json'} logger.info('gui_config_check') return json.dumps(gui_setting_check), 200, {'Content-Type': 'application/json'}
def el_panel_config_check(self, info: dict): el_no = info.get('el_no') if not el_no: logger.error('incomplete params') return 'incomplete params', 421, {'Content-Type': 'application/json'} el_check = self.el_config_collection.find_one({'el_no': el_no}, {'_id': 0}) if not el_check: return 'null', 400, {'Content-Type': 'application/json'} logger.info('el_panel_config_check') return json.dumps(el_check), 200, {'Content-Type': 'application/json'}
def panel_check_last(self, info): barcode = info.get('barcode') create_time = info.get('create_time') if not all([barcode, create_time]): logger.error('incomplete params') return 'incomplete params', 421 res = self.panel_collection.find_one({ 'barcode': barcode, 'create_time': create_time }) return '1' if res else '0'
def join_shards(self, shards_filepath, pattern, destination_file_path): # Based on <http://code.activestate.com/recipes/224800-simple-file-splittercombiner-module/> import re logger.info('Creating file', destination_file_path) bname = (os.path.split(destination_file_path))[1] bname_input = (os.path.split(shards_filepath))[1] bname2_input = bname_input input_directory = (os.path.split(shards_filepath))[0] output_directory = (os.path.split(destination_file_path))[0] # bugfix: if file contains characters like +,.,[] # properly escape them, otherwise re will fail to match. for a, b in zip(['+', '.', '[', ']', '$', '(', ')'], ['\+', '\.', '\[', '\]', '\$', '\(', '\)']): bname2 = bname2_input.replace(a, b) chunkre = re.compile(bname2_input + '-' + '[0-9]+') chunkfiles = [] for f in os.listdir(str(input_directory)): logger.debug(f) if chunkre.match(f): chunkfiles.append(f) logger.info('Number of chunks', len(chunkfiles)) chunkfiles.sort(self.sort_index) logger.info(chunkfiles) data = '' for f in chunkfiles: try: logger.info('Appending chunk', os.path.join(str(input_directory), f)) data += open(str(input_directory) + "/" + str(f), 'rb').read() logger.info(str(input_directory) + "/" + str(f) + "katalog wejsciowy") except (OSError, IOError, EOFError) as e: logger.error(e) continue try: logger.info(str(output_directory) + "katalog wyjsciowy") f = open(str(output_directory) + "/" + str(bname), 'wb') f.write(data) f.close() except (OSError, IOError, EOFError) as e: raise ShardingException(str(e)) logger.info('Wrote file', bname) return 1
def get_max_bridge_request_timeout(self): max_bridge_request_timeout = DEFAULT_MAX_BRIDGE_REQUEST_TIMEOUT et = None try: et = ET.parse(CONFIG_FILE) for tags in et.iter('bridge_request_timeout'): max_bridge_request_timeout = int(tags.text) except Exception as e: logger.error('Unspecified XML parse error %s' % str(e)) return max_bridge_request_timeout
def user_login_admin(self, info: dict): res = dict() user_name = info.get('user_name') user_pw = info.get('user_pw') info_time = info.get('time') admin_url = info.get('admin_url') if not all([user_name, user_pw, info_time, admin_url]): logger.error('incomplete params') return 'incomplete params', 421, { 'Content-Type': 'application/json' } user_check = self.user_collection.find_one({ "user_name": user_name, "user_pw": user_pw, "activate": 1 }) if not user_check: logger.error("user:%s didn't exist" % user_name) return "user didn't exist", 421, { 'Content-Type': 'application/json' } if user_check['type'] == 'operator': return "not admin", 421, {'Content-Type': 'application/json'} self.user_log_collection.insert_one({ 'id': { 'user_id': user_check['_id'] }, 'operator': user_name, 'time': info_time, 'action': "admin %s login" % user_name }) res['type'] = user_check['type'] # pre_url = url.get(admin_url) # res['previous_url'] = user_check.get("previous_url") if user_check.get('previous_url') != pre_url else '' # user_check['previous_url'] = pre_url # self.user_collection.replace_one({'user_name': user_name, 'activate': 1}, user_check) # 这句话是沙雕吧 res['permission_mng'] = list( self.permission_collection.find({}, {'_id': 0})) res['line_setting'] = list( self.el_config_collection.find({}, {'_id': 0})) res['string_setting'] = list( self.el_string_collection.find({}, {'_id': 0})) res['gui_setting'] = list( self.gui_setting_collection.find({}, {'_id': 0})) logger.info("admin_login_%s" % user_name) return json.dumps(res), 200, {'Content-Type': 'application/json'}
def max_shard_size_unit(self): et = None shard_size_unit = 1 try: et = ET.parse(CONFIG_FILE) # max_shard_size_sterile = None for tags in et.iter('custom_max_shard_size_enabled'): if int(tags.text) == 1: for tags3 in et.iter('shard_size_unit'): shard_size_unit = int(tags3.text) except Exception as e: logger.error('Unspecified XML parse error %s' % str(e)) return (shard_size_unit)
def gui_config_modify(self, info: dict): t = time.time() gui_no = info.get('gui_no') admin_name = info.get('admin_name') changed_items = info.get('changed_items') info_time = info.get('time') if not all([gui_no, admin_name, changed_items, info_time]): logger.error('incomplete params') return update(), 400, {'Content-Type': 'application/json'} gui_check = self.gui_setting_collection.find_one({'gui_no': gui_no}) admin_check = self.user_collection.find_one({"user_name": info["admin_name"], "activate": 1}) if not gui_check: logger.error("gui_no:%s didn't exist" % (info["admin_name"])) return update(), 422, {'Content-Type': 'application/json'} try: if gui_check["update_time"] != changed_items["update_time"]: return update(), 422, {'Content-Type': 'application/json'} limit = list(self.el_config_collection.aggregate([ {'$match': {'gui_no': gui_no}}, {'$group': {'_id': '$gui_no', 'limit': {'$sum': 1}}} ])) if limit[0]['limit'] > int(changed_items['el_limit']): return update(), 412, {'Content-Type': 'application/json'} changed_before = dict() changed_after = dict() for key, value in changed_items.items(): if (pre_data := gui_check.get(key)) != value: changed_before[key] = pre_data changed_after[key] = value gui_check[key] = value gui_check['update_time'] = t self.gui_setting_collection.replace_one({"gui_no": gui_no}, gui_check) self.user_log_collection.insert_one({ 'id': { 'admin_id': admin_check['_id'], 'gui_id': gui_check['_id'] }, 'operator': admin_name, 'gui_no': gui_no, 'time': info_time, 'action': "change gui_config", 'changed_before': changed_before, 'changed_after': changed_after }) logger.info('gui_config_modify') return update(), 200, {'Content-Type': 'application/json'}
def max_shard_size_united(self): et = None max_shard_size = DEFAULT_SHARD_SIZE try: et = ET.parse(CONFIG_FILE) max_shard_size_sterile = None for tags in et.iter('custom_max_shard_size_enabled'): if int(tags.text) == 1: for tags2 in et.iter('max_shard_size'): max_shard_size_sterile = int(tags2.text) max_shard_size = max_shard_size_sterile else: max_shard_size = DEFAULT_SHARD_SIZE except Exception as e: logger.error('Unspecified XML parse error %s' % str(e)) return (max_shard_size)
def user_delete(self, info: dict): t = time.time() user_name = info.get('user_name') admin_name = info.get('admin_name') info_time = info.get('time') if not all([user_name, admin_name, info_time]): logger.error('incomplete params') return update(), 400, {'Content-Type': 'application/json'} admin_check = self.user_collection.find_one({ 'user_name': admin_name, 'activate': 1 }) if not admin_check: logger.error("admin user:%s didn't exist" % admin_name) return "admin user didn't exist", 400, { 'Content-Type': 'application/json' } if admin_check['type'] != 'super_admin' and admin_check[ 'type'] != 'yc_admin': logger.error("permission denied %s" % admin_name) return update(), 423, {'Content-Type': 'application/json'} user_check = self.user_collection.find_one({ 'user_name': user_name, 'activate': 1 }) if user_check['type'] == 'super_admin' and admin_check[ 'type'] == 'super_admin': logger.error("permission denied %s" % (info["admin_name"])) return update(), 423, {'Content-Type': 'application/json'} user_check['activate'] = time.time() user_check['update_time'] = t self.user_collection.replace_one( { 'user_name': user_name, 'activate': 1 }, user_check) self.user_log_collection.insert_one({ 'id': { 'user_id': user_check['_id'], 'admin_id': admin_check['_id'] }, 'operator': admin_name, 'user_name': user_name, 'time': info_time, 'action': "%s delete user %s" % (admin_name, user_name) }) logger.info("user_del_%s" % (info["user_name"])) return update(), 200, {'Content-Type': 'application/json'}
def mes_defects_update(self, info): barcode = info.get('barcode') create_time = info.get('create_time') mes_defects = info.get('mes_defects') if not all([barcode, create_time, mes_defects]): logger.error('incomplete params') return 'incomplete params', 421 panel_check = self.panel_collection.find_one({ 'barcode': barcode, 'create_time': create_time }) if not panel_check: return 'no such panel', 422 panel_check['mes_defects'] = mes_defects self.panel_collection.replace_one( { 'barcode': barcode, 'create_time': create_time }, panel_check) logger.info("mes_defects_update{%s}" % barcode) return '1', 200
def repair(self, info): barcode = info.get('barcode') if not barcode: logger.error('incomplete params') return 'incomplete params', 421 res = list( self.panel_collection.aggregate([{ '$match': { "barcode": barcode } }, { '$sort': { 'create_time': -1 } }, { '$project': { '_id': 0, 'defects': '$mes_defects' } }, { '$limit': 1 }]))[0] return json.dumps(res), 200 if res else '0', 400
def __init__(self, sameFileNamePrompt=None, sameFileHashPrompt=None, load_config=False): if os.path.isfile(CONFIG_FILE) is not True: self.create_genesis_configuration() if load_config: et = None try: et = ET.parse(CONFIG_FILE) except Exception as e: logger.error('Unspecified XML parse error, %s' % str(e)) for tags in et.iter('same_file_name_prompt'): if tags.text == '1': self.sameFileNamePrompt = True elif tags.text == '0': self.sameFileNamePrompt = False else: self.sameFileNamePrompt = True for tags in et.iter('same_file_hash_prompt'): if tags.text == '1': self.sameFileHashPrompt = True elif tags.text == '0': self.sameFileHashPrompt = False else: self.sameFileHashPrompt = True for tags in et.iter('max_chunk_size_for_download'): if tags.text is not None: self.maxDownloadChunkSize = int(tags.text) else: self.maxDownloadChunkSize = 1024
def user_add(self, info: dict): t = time.time() user_name = info.get('user_name') user_pw = info.get('user_pw') admin_name = info.get('admin_name') user_type = info.get('type') info_time = info.get('time') if not all([user_name, user_pw, admin_name, user_type, info_time]): logger.error('incomplete params') return update(), 400, {'Content-Type': 'application/json'} admin_check = self.user_collection.find_one({ 'user_name': admin_name, 'activate': 1 }) if not admin_check: logger.error("admin user:%s didn't exist" % admin_name) return "admin user didn't exist", 400, { 'Content-Type': 'application/json' } if admin_check['type'] != 'super_admin' and admin_check[ 'type'] != 'yc_admin': logger.error("permission denied %s" % admin_name) return update(), 423, {'Content-Type': 'application/json'} user_check = self.user_collection.find_one({ 'user_name': user_name, 'activate': 1 }) if user_check: return 'user exists', 413, {'Content-Type': 'application/json'} res = self.user_collection.insert_one({ "user_name": user_name, "user_pw": user_pw, "activate": 1, "type": user_type, "update_time": t }) self.user_log_collection.insert_one({ 'id': { 'admin_id': admin_check["_id"], 'user_id': ObjectId(res.inserted_id) }, 'operator': admin_name, 'user_name': user_name, 'time': info_time, 'action': "%s add user %s" % (admin_name, user_name) }) logger.info("user_add{%s}" % user_name) return update(), 200, {'Content-Type': 'application/json'}
def gen_report(): start_time = request.args.get('start_time', '') end_time = request.args.get('end_time', '') context = dict() if start_time: try: start_time = float(start_time) except Exception as e: logger.error(e) return jsonify(errno=RET.PARAMERR, msg='time type error') context['create_time'] = dict() context['create_time']['$gt'] = start_time if end_time: try: end_time = float(end_time) except Exception as e: logger.error(e) return jsonify(errno=RET.PARAMERR, msg='time type error') if context.get('create_time') is None: context['create_time'] = dict() context['create_time']['$lte'] = end_time if start_time and end_time: try: assert start_time <= end_time except Exception as e: logger.error(e) return jsonify(errno=RET.PARAMERR, msg='date params wrong') res = panel_collection.find( context, { '_id': 0, 'barcode': 1, 'create_time': 1, 'status': 1, 'ap_result': 1, 'el_no': 1, 'mes_res': 1, 'stack_equipment': 1, 'cell_amount': 1, 'defects': 1, 'ap_defects': 1 }) # res.sort('create_time', -1) if not res: return jsonify(errno=RET.NODATA, msg='there is no matching data') res_li = make_report(res) return jsonify(errno=RET.OK, msg=res_li)
def if_logged_in(self): """Return True if user has already logged in with these credentials""" logged_in = "0" try: et = ET.parse("storj_account_conf.xml") for tags in et.iter('logged_in'): logged_in = tags.text except IOError: logged_in = "0" logger.error("Error in Account Manager login") logger.error("Function: if_logged_in") logger.error("Credentials file not existing") return False if logged_in == "1": return True else: return False
def log(): start_time = request.args.get('timeStart', '') end_time = request.args.get('timeEnd', '') el_no = request.args.get('el_no', '') page = request.args.get('page', 1) size = request.args.get('size', 10) context = dict() ''' { 'time': { '$gt': 3213, '$lte': 2344 }, '$or': [ {'el_no': 'prea1'}, {'el_no': 'prea2'} ] } ''' if start_time: try: start_time = float(start_time) except Exception as e: logger.error(e) return jsonify(errno=RET.DATAERR, msg='time type wrong') context['time'] = dict() context['time']['$gt'] = start_time if end_time: try: end_time = float(end_time) except Exception as e: logger.error(e) return jsonify(errno=RET.DATAERR, msg='time type wrong') if context.get('time') is None: context['time'] = dict() context['time']['$lte'] = end_time if start_time and end_time: try: assert start_time <= end_time except Exception as e: logger.error(e) return jsonify(errno=RET.PARAMERR, msg='date params wrong') if el_no: el_no_li = el_no.split() mult_el = [{'el_no': i} for i in el_no_li] context['$or'] = mult_el try: page = int(page) size = int(size) if page < 0 or size < 0: return jsonify(errno=RET.PARAMERR, msg='page or size must be a unsigned integer') except Exception as e: logger.error(e) return jsonify(errno=RET.PARAMERR, msg='page or size must be a integer') res = user_log_collection.find( context, { '_id': 0, 'operator': 1, 'time': 1, 'action': 1, 'el_no': 1, 'changed_before': 1, 'changed_after': 1 }).sort('time', -1).limit(size).skip((page - 1) * size) amount = user_log_collection.count_documents(context) pages = amount // size + 1 if not amount: return jsonify(errno=RET.NODATA, msg='no data') li = list() for i in res: if not i.get('changed_before'): i['changed_before'] = {} if not i.get('changed_after'): i['changed_after'] = {} if i.get('changed_before').get('user_pw'): i['changed_before']['user_pw'] = '******' i['changed_after']['user_pw'] = '******' li.append(i) content = {'data': li, 'pages': pages} return jsonify(errno=RET.OK, msg=content)
def permission_modify(self, info): # TODO: oxxx """ info { "time": 1578900329.842, "admin_name": "yc_user", "changed_items": [ {"type": "super_admin", "user_mng": 1, "line_mng": 1, "gui_mng": 1, "threshold_mng": 1, "shift_mng": 1, "pic_upload": 1, "update_time": 0}, {"type": "quality_admin", "user_mng": 0, "line_mng": 0, "gui_mng": 1, "threshold_mng": 1, "shift_mng": 0, "pic_upload": 1, "update_time": 0}, {"type": "production_admin", "user_mng": 1, "line_mng": 1, "gui_mng": 1, "threshold_mng": 1, "shift_mng": 1, "pic_upload": 1, "update_time": 0} ] } """ t = time.time() admin_name = info.get('admin_name') changed_items = info.get('changed_items') info_time = info.get('time') if not all([admin_name, changed_items, info_time]): logger.error('incomplete params') return update(), 400, {'Content-Type': 'application/json'} admin_check = self.user_collection.find_one({ 'user_name': admin_name, 'activate': 1 }) if admin_check.get('type') != 'yc_admin': return 'permission denied', 423, { 'Content-Type': 'application/json' } for i in changed_items: try: permission_check = self.permission_collection.find_one( {'type': i['type']}) if permission_check['update_time'] != i['update_time']: return update(), 422, {'Content-Type': 'application/json'} changed_before = dict() changed_after = dict() for key, value in i.items(): if (pre_data := permission_check.get(key)) != value: changed_before[key] = pre_data changed_after[key] = value permission_check[key] = value permission_check['update_time'] = t self.permission_collection.replace_one({'type': i['type']}, permission_check) if changed_after: self.user_log_collection.insert_one({ 'id': { 'admin_id': admin_check['_id'] }, 'operator': admin_name, 'type': i['type'], 'time': info_time, 'action': "change permission config", 'changed_before': changed_before, 'changed_after': changed_after }) logger.info('permission_modify') except Exception as e: logger.error(str(e)) return update(), 400, {'Content-Type': 'application/json'}
def user_modify(self, info: dict): t = time.time() admin_name = info.get('admin_name') user_name = info.get('user_name') changed_items: dict = info.get('changed_items') info_time = info.get('time') cg_user_name = changed_items.get('user_name') cg_update_time = changed_items.get('update_time') if not all( [admin_name, user_name, changed_items, info_time, cg_update_time]): logger.error('incomplete params') return update(), 400, {'Content-Type': 'application/json'} admin_check = self.user_collection.find_one({ 'user_name': admin_name, 'activate': 1 }) if not admin_check: logger.error("user:%s didn't exist" % admin_name) return update(), 422, {'Content-Type': 'application/json'} if admin_check['type'] != 'super_admin' and admin_check[ 'type'] != 'yc_admin': logger.error("permission denied %s" % (info["admin_name"])) return update(), 423, {'Content-Type': 'application/json'} user_check = self.user_collection.find_one({ 'user_name': user_name, 'activate': 1 }) if not user_check: logger.error("user:%s didn't exist" % user_name) return update(), 422, {'Content-Type': 'application/json'} if cg_user_name and self.user_collection.find_one({ 'user_name': cg_user_name, 'activate': 1 }): # if change name have be used return update(), 412, {'Content-Type': 'application/json'} changed_before = dict() changed_after = dict() if user_check['update_time'] == cg_update_time: for key, value in changed_items.items(): if (pre_data := user_check.get(key)) != value: changed_before[key] = pre_data changed_after[key] = value user_check[key] = value user_check['update_time'] = t self.user_collection.replace_one( { "_id": user_check["_id"], "activate": 1 }, user_check) self.user_log_collection.insert_one({ 'id': { 'admin_id': admin_check['_id'], 'user_id': user_check['_id'] }, 'operator': admin_name, 'user_name': user_name, 'time': info_time, 'action': "user %s changed" % user_name, 'changed_before': changed_before, 'changed_after': changed_after }) logger.info("user modify %s" % user_name) return update(), 200, {'Content-Type': 'application/json'}