76 lines
2.8 KiB
Python
76 lines
2.8 KiB
Python
import logging
|
||
import os
|
||
import shutil
|
||
|
||
from django.core.management.base import BaseCommand
|
||
|
||
logger = logging.getLogger(__name__)
|
||
from application.settings import BASE_DIR
|
||
|
||
|
||
class Command(BaseCommand):
|
||
"""
|
||
创建App命令:
|
||
python manage.py createapp app名
|
||
python manage.py createapp app01 app02 ...
|
||
"""
|
||
|
||
def add_arguments(self, parser):
|
||
parser.add_argument('app_name', nargs='*', type=str, )
|
||
|
||
def handle(self, *args, **options):
|
||
app_name = options.get('app_name')
|
||
for name in app_name:
|
||
app_path = os.path.join(BASE_DIR, "apps", name)
|
||
# 判断app是否存在
|
||
if os.path.exists(app_path):
|
||
print(f"创建失败,App {name} 已存在!")
|
||
break
|
||
source_path = os.path.join(BASE_DIR, "apps", "vadmin", "template")
|
||
target_path = app_path
|
||
if not os.path.exists(target_path):
|
||
# 如果目标路径不存在原文件夹的话就创建
|
||
os.makedirs(target_path)
|
||
if os.path.exists(source_path):
|
||
# 如果目标路径存在原文件夹的话就先删除
|
||
shutil.rmtree(target_path)
|
||
shutil.copytree(source_path, target_path)
|
||
# 修改app中的apps 内容
|
||
content = f"""from django.apps import AppConfig
|
||
|
||
|
||
class {name.capitalize()}Config(AppConfig):
|
||
name = '{name}'
|
||
verbose_name = "{name}App"
|
||
"""
|
||
with open(os.path.join(app_path, "apps.py"), 'w', encoding='UTF-8') as f:
|
||
f.write(content)
|
||
f.close()
|
||
# 注册app到 settings.py 中
|
||
injection(os.path.join(BASE_DIR, "application", "settings.py"), f" 'apps.{name}',\n", "INSTALLED_APPS",
|
||
"]")
|
||
|
||
# 注册app到 urls.py 中
|
||
injection(os.path.join(BASE_DIR, "application", "urls.py"),
|
||
f" re_path(r'^{name}/', include('apps.{name}.urls')),\n", "urlpatterns = [",
|
||
"]")
|
||
|
||
print(f"创建 {name} App成功")
|
||
|
||
|
||
def injection(file_path, insert_content, startswith, endswith):
|
||
with open(file_path, "r+", encoding="utf-8") as f:
|
||
data = f.readlines()
|
||
with open(file_path, 'w', encoding='UTF-8') as f1:
|
||
is_INSTALLED_APPS = False
|
||
is_insert = False
|
||
for content in data:
|
||
# 判断文件是否 INSTALLED_APPS 开头
|
||
if not is_insert and content.startswith(startswith):
|
||
is_INSTALLED_APPS = True
|
||
if not is_insert and content.startswith(endswith) and is_INSTALLED_APPS:
|
||
# 给前一行插入数据
|
||
content = insert_content + content
|
||
is_insert = True
|
||
f1.writelines(content)
|