Example #1
0
File: Model.py Project: ajiexw/note
    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
Example #2
0
 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
Example #3
0
 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
Example #4
0
    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
Example #5
0
    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
Example #6
0
    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
Example #7
0
    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
Example #8
0
    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
Example #9
0
 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()
Example #10
0
    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
Example #11
0
 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()
Example #12
0
    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