Tagged: Python

Process finished with exit code -1073740940 (0xC0000374)

问题重现

最近将系统升级到了Windows LTSC 2019,且使用了较新的Python(3.7.3),在调试Odoo12的时候,Pycharm直接抛出错误"Process finished with exit code -1073740940 (0xC0000374)",经过各方查证,发现问题是由于locale这个包引起的。

Locale

解决方法

控制面板—>区域

区域
设置

到此,重启计算机,问题修复。

参考来源:https://youtrack.jetbrains.com/issue/PY-33045

Python Django Vue PostgreSQL搭建前后端分离项目

准备工作

npm install -g webpack
npm install -g @vue/cli
npm install -g @vue/cli-service-global

创建Django项目

django-admin startproject ServerList

创建成功后的目录如下

.
├── manage.py
└── pc_admin
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

进入项目根目录,创建一个APP作为项目后端

cd ServerList
python manage.py startapp backend //backend乃App名称

成功后目录如下

.
├── backend
│   ├── __init__.py
│   ├── admin.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
└── ServerList
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

创建前端项目

使用vue-cli在根目录创建一个frontend的Vue.js项目作为项目前端。

# 创建项目
vue create frontend

# Project setup
npm install

# Compiles and hot-reloads for development
npm run serve

# Compiles and minifies for production
npm run build

# Run your tests
npm run test

# Lints and fixes files
npm run lint

如果你确实不想使用命令行来处理这些事情,那么你可以使用Vue提供的图形化界面来创建和管理项目。

vue ui
Vue UI

配置数据源及前端模板

# 数据库设定
DATABASES = {
    'default': {
        # 'ENGINE': 'django.db.backends.sqlite3',
        # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'odam',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': '127.0.0.1',
        'PORT': '5432'
    }
}
# 模版设定
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # 'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'DIRS': ['frontend/dist'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

# Add for Vue.js
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "frontend/dist/static"),
]

结束

python manage.py runserver

Python 转数字为Excel列,转列为数字

def convent_column_to_char(column):
	"""
	将数字转换为Excel列
	1 => A, 2 => B, ......, 27 => AA
	:param column: int
	:return: str
	"""
	if not isinstance(column, int):
		return column
	tStr = str()
	while column != 0:
		res = column % 26
		if res == 0:
			res = 26
			column -= 26
		tStr = chr(ord('A') + res - 1) + tStr
		column = column // 26
	return tStr


def colname_to_num(colname):
	if not isinstance(colname, str):
		return colname
	col = 0
	power = 1

	for i in range(len(colname) - 1, -1, -1):
		ch = colname[i]
		col += (ord(ch) - ord('A') + 1) * power
		power *= 26
	return col


if __name__ == "__main__":
    l = list()
    n = list()
    for a in range(1, 1001):
        l.append(convent_column_to_char(a))
    print(l)
    for a in l:
        n.append(colname_to_num(a))
    print(n)

Odoo 使用 ir.sequence 生成序列号

在Odoo里面,默认提供了ir.sequence这样一个模块,他的作用就是一个序号生成器。在这次的项目中刚好用到了,这里就记录一下。

创建序号

打开 data/data.xml 写入如下代码:

<?xml version="1.0" encoding="utf-8"?>
<odoo>
   <data noupdate="True">
      <record id="contract_number" model="ir.sequence">
         <field name="name">预算编号</field>
         <field name="code">budget.number</field>
         <field name="prefix">HT%(year)s%(month)s%(day)s</field>
         <field name="suffix">号</field>
         <field name="padding">1</field>
      </record>
   </data>
</odoo>

参数说明:

  • name - 名字,随便叫什么都行
  • code - 调用生成编码的 Key,需保证唯一性
  • prefix - 前缀,可以是固定的字面量也可以是组合参数
  • padding - 序列递增的位数

调用

将data/data.xml加入到__manifest__.py的data列表中。

budget_num = fields.Char(string=u'预算编号', copy=False, readonly=True, default=lambda x: _('New'))

@api.model
def create(self, vals):
	""" 保存方法重写 """
	if not vals.get('name', False) or vals['name'] == _('New'):
		vals['budget_num'] = self.env['ir.sequence'].next_by_code('budget.number')
	return super(Budget, self).create(vals)

Archives