def getColumnTypes(self, column_names=None): text_min_length = 500 # 字符串长度大于多少就识别为text if column_names is None: column_names = self.column_names table_template = self.replaceAttr(self.table_template) columns = [sh.splitAndStrip(c) for c in self._splitTableTemplate(table_template) if all(map(lambda x: not c.lower().startswith(x), ['key ','key(','primary ','unique ']))] columns = [c for c in columns if c[0] in column_names] type_keys = { 'int': ['int', 'tinyint', 'smallint', 'mediumint', 'integer', 'bigint', 'year'], 'str': ['char', 'varchar', 'enum', 'set', ], 'text': ['text', 'blob', 'tinytext', 'tinyblob', 'mediumblob', 'mediumtext', 'longblob', 'longtext', ], 'datetime': ['date', 'datetime', 'timestamp', 'time'], 'float': ['float', 'double', 'real', 'decimal', 'numeric'], } column_types = {} for column in columns: column_name = column[0] for describle in column[1:]: for key, values in type_keys.items(): if describle.partition('(')[0] in values: column_types[column_name] = key length = describle.partition('(')[2].rpartition(')')[0].strip() if key == 'str' and length.isdigit() and int(length) > text_min_length: column_types[column_name] = 'text' break if column_types.has_key(column_name): break else: raise Exception('找不到数据类型:%s' % ' '.join(column)) return column_types
def _changeType(self, dict_config): for k in dict_config.keys(): v = dict_config[k] if k not in ['model', 'url']: default = self.default_menu_config.get(k, None) if isinstance(v, (str, unicode)) and \ isinstance(default, list): dict_config[k] = sh.splitAndStrip(v) return dict_config
def getColumnTypes(self, column_names=None): text_min_length = 500 # 字符串长度大于多少就识别为text if column_names is None: column_names = self.column_names table_template = self.replaceAttr(self.table_template) columns = [ sh.splitAndStrip(c) for c in self._splitTableTemplate(table_template) if all( map(lambda x: not c.lower().startswith(x), ['key ', 'key(', 'primary ', 'unique '])) ] columns = [c for c in columns if c[0] in column_names] type_keys = { 'int': [ 'int', 'tinyint', 'smallint', 'mediumint', 'integer', 'bigint', 'year' ], 'str': [ 'char', 'varchar', 'enum', 'set', ], 'text': [ 'text', 'blob', 'tinytext', 'tinyblob', 'mediumblob', 'mediumtext', 'longblob', 'longtext', ], 'datetime': ['date', 'datetime', 'timestamp', 'time'], 'float': ['float', 'double', 'real', 'decimal', 'numeric'], } column_types = {} for column in columns: column_name = column[0] for describle in column[1:]: for key, values in type_keys.items(): if describle.partition('(')[0] in values: column_types[column_name] = key length = describle.partition('(')[2].rpartition( ')')[0].strip() if key == 'str' and length.isdigit( ) and int(length) > text_min_length: column_types[column_name] = 'text' break if column_types.has_key(column_name): break else: raise Exception('找不到数据类型:%s' % ' '.join(column)) return column_types
def _getEnv(self, model, menu_config): inputs = sh.inputs() env = sh.storage(dict(paging=True)) env.orderby = model.replaceAttr(menu_config.orderby \ if menu_config.orderby else '{$primary_key} desc') if inputs.get('action', '') == 'search': where = [] argvs = [] for query in sh.splitAndStrip(inputs.query): where.append('('+ ' or '.join([c+' like %s' for c in menu_config.search]) +')') argvs += ['%'+query+'%'] * len(menu_config.search) env.where = [' and '.join(where)] + argvs return env
def getMenuConfig(self, menu=None, path=None, ): if not path: path = sh.getEnv('REQUEST_URI').partition('?')[0] if not menu: menu = self._getEditorMenu() menu_config = self.pickPageConfig(menu, path) if menu_config: for k, v in self.default_menu_config.items(): menu_config.setdefault(k, v) if menu_config and menu_config.where: menu_config.where = [c.partition(' ')[::2] for c in sh.splitAndStrip(menu_config.where, '|')] return menu_config
def _getEnv(self, model, menu_config): inputs = sh.inputs() env = sh.storage(dict(paging=True)) env.orderby = model.replaceAttr(menu_config.orderby \ if menu_config.orderby else '{$primary_key} desc') if inputs.get('where', ''): env.where = [sh.unquote(inputs.where)] if inputs.get('action', '') == 'search': where = [] argvs = [] for query in sh.splitAndStrip(inputs.query): where.append( '(' + ' or '.join([c + ' like %s' for c in menu_config.search]) + ')') argvs += ['%' + query + '%'] * len(menu_config.search) env.where = [' and '.join(where)] + argvs return env
def getMenuConfig( self, menu=None, path=None, ): if not path: path = sh.getEnv('REQUEST_URI').partition('?')[0] if not menu: menu = self._getEditorMenu() menu_config = self.pickPageConfig(menu, path) if menu_config: for k, v in self.default_menu_config.items(): menu_config.setdefault(k, v) if menu_config and menu_config.where: menu_config.where = [ c.partition(' ')[::2] for c in sh.splitAndStrip(menu_config.where, '|') ] return menu_config
def getChineseColumnName(self): config = sh.getSiteConfig('editor_column_ch_name') return dict([sh.splitAndStrip(c) for c in config.split('\n') if len(sh.splitAndStrip(c))==2]) \ if config else sh.storage()
def getColumnTypes(self, column_names=None): text_min_length = 500 # 字符串长度大于多少就识别为text if column_names is None: column_names = self.column_names table_template = self.replaceAttr(self.table_template) columns = [sh.splitAndStrip(c) for c in self._splitTableTemplate(table_template) \ if not any(map(lambda x: c.lower().startswith(x), ['key ','key(','primary ','unique ']))] columns = [c for c in columns if c[0] in column_names] type_keys = { 'int': ['int', 'tinyint', 'smallint', 'mediumint', 'integer', 'bigint', 'year'], 'str': ['char', 'varchar', 'set', ], 'text': ['text', 'blob', 'tinytext', 'tinyblob', 'mediumblob', 'mediumtext', 'longblob', 'longtext', ], 'enum': ['enum', ], 'time': ['date', 'datetime', 'timestamp', 'time'], 'float': ['float', 'double', 'real', 'decimal', 'numeric'], } column_types = sh.storage() for column in columns: column_name = column[0] all_describle = column[1:] for index, describle in enumerate(all_describle): for key, values in type_keys.items(): accurate_type = describle.lower().partition('(')[0].lower() if accurate_type in values: ct = sh.storage({'type': key}) type_comment = describle.lower().partition('(')[2].rpartition(')')[0].strip() if type_comment.isdigit(): ct.length = int(type_comment) if key == 'str' and ct.get('length', 0) > text_min_length: ct['type'] = 'text' ct.accurate_type = accurate_type ct.null = not ('null' in all_describle and 'not' in all_describle \ and all_describle.index('null') == all_describle.index('not')+1) if 'default' in all_describle: ct.default = all_describle[all_describle.index('default')+1] if ct.default.isdigit(): ct.default = int(ct.default) elif ct.default == 'current_timestamp': ct.default = '' else: ct.default = ct.default.strip("'") if key == 'int': ct.unsigned = 'unsigned' in all_describle if key == 'enum': ct.options = [] i = index while True: ct.options.append(all_describle[i]) if ')' in all_describle[i]: break i += 1 ct.options = ''.join(ct.options).partition('(')[2].partition(')')[0] ct.options = [o.strip("'") for o in ct.options.split(',')] column_types[column_name] = ct break if column_types.has_key(column_name): break else: raise Exception('找不到数据类型:%s' % ' '.join(column)) column_types['__column_names'] = [c for c in column_names if column_types.has_key(c)] return column_types
def getColumnTypes(self, column_names=None): text_min_length = 500 # 字符串长度大于多少就识别为text if column_names is None: column_names = self.column_names table_template = self.replaceAttr(self.table_template) columns = [sh.splitAndStrip(c) for c in self._splitTableTemplate(table_template) \ if not any(map(lambda x: c.lower().startswith(x), ['key ','key(','primary ','unique ']))] columns = [c for c in columns if c[0] in column_names] type_keys = { 'int': [ 'int', 'tinyint', 'smallint', 'mediumint', 'integer', 'bigint', 'year' ], 'str': [ 'char', 'varchar', 'set', ], 'text': [ 'text', 'blob', 'tinytext', 'tinyblob', 'mediumblob', 'mediumtext', 'longblob', 'longtext', ], 'enum': [ 'enum', ], 'time': ['date', 'datetime', 'timestamp', 'time'], 'float': ['float', 'double', 'real', 'decimal', 'numeric'], } column_types = sh.storage() for column in columns: column_name = column[0] all_describle = column[1:] for index, describle in enumerate(all_describle): for key, values in type_keys.items(): accurate_type = describle.lower().partition('(')[0].lower() if accurate_type in values: ct = sh.storage({'type': key}) type_comment = describle.lower().partition( '(')[2].rpartition(')')[0].strip() if type_comment.isdigit(): ct.length = int(type_comment) if key == 'str' and ct.get('length', 0) > text_min_length: ct['type'] = 'text' ct.accurate_type = accurate_type ct.null = not ('null' in all_describle and 'not' in all_describle \ and all_describle.index('null') == all_describle.index('not')+1) if 'default' in all_describle: ct.default = all_describle[ all_describle.index('default') + 1] if ct.default.isdigit(): ct.default = int(ct.default) elif ct.default == 'current_timestamp': ct.default = '' else: ct.default = ct.default.strip("'") if key == 'int': ct.unsigned = 'unsigned' in all_describle if key == 'enum': ct.options = [] i = index while True: ct.options.append(all_describle[i]) if ')' in all_describle[i]: break i += 1 ct.options = ''.join( ct.options).partition('(')[2].partition(')')[0] ct.options = [ o.strip("'") for o in ct.options.split(',') ] column_types[column_name] = ct break if column_types.has_key(column_name): break else: raise Exception('找不到数据类型:%s' % ' '.join(column)) column_types['__column_names'] = [ c for c in column_names if column_types.has_key(c) ] return column_types