# Manage Script 在初始化 Project 時,我們需要 "新增" 課程類別到 Database 裡面,因此我們必須撰寫 Script ,利用特定的格式來引入課程類別。 同時,前端要利用我們產生的課程類別 JSON 去搜尋課程或是創建課程(下拉式選單)。   這個 JSON 將會產生在`/ShareClass/shareclass/static/dist/file/category.json` 會以 static file 的方式利用 nginx 提供給 client,並且都要重新執行 [django collectstatic 的指令](https://docs.djangoproject.com/en/1.11/ref/contrib/staticfiles/#collectstatic)將 static file 生成給 nginx 使用。 !!!注意: 如果我們使用多台 Application Server 的時候,就必須要將這個 JSON 分離,產生在 AWS S3,利用 S3 的功能管理 static file!!! ## 檔案結構 - auto_generate_course_category/ - README.md: 簡易的說明,目前不會比這篇來的更清楚。 - generate.py: 用來 import 課程架構的 script。 - course_cateogry_list.txt: demo 用,用來表示課程架構文件應該長怎麼樣。 - junyi.txt: 之前均一教育基金會提供的一種課程類別。 - books_version.txt: 之前 slack 上提供的擁有出版社的一種課程類別版本。 - generate_course_structure_from_DB/ - README.md: 簡易的介紹 - generate_category_json.py: 第一種產生 json 格式的 script - generate_category_json2.py: 第二種產生 json 格式的 script (**目前使用的**) ## 撰寫想法 我們將 import 課程類別的 script 命為: - auto_generate_course_category - generate.py 這個 script 本身寫的不是很精簡,當時覺得只要達成目的即可。對應到 Course Category 這個 Model(位於 course/models.py): ``` class CourseCategory(models.Model): name = models.CharField(blank=False, max_length=20) name_path = models.CharField(blank=True, max_length=50) slug = models.SlugField(blank=True, max_length=50, allow_unicode=True) description = models.TextField(blank=True) parent_category = models.ForeignKey("self", blank=True, null=True, related_name="subcategory") level = models.PositiveSmallIntegerField(blank=True) # 用來標記階層等級 ``` 我們設計用來自動產生 CourseCategory Object 的 script 要能夠填上 `name`, `name_path`, `parent_categry`, `level` 這幾個欄位。對於 `description` 欄位來說,是保留用的,目前沒有用到。對於 `slug` 來說,物件在創建的時候,會根據他的 `name` 做 slugify 的處理而自動產生,因此我們也不需要做這部分。 `name_path` 以及 `level` 是方便我們查看以及定位物件使用。 產生出來的類別物件在後台看起來會是這樣:  - generate_course_structure_from_DB - generate_category_json.py - generate_category_json2.py 這是利用 DB 中 CourseCategory object 來產生 JSON 的 script。之所以會有兩種產生 json 的 script 是因為歷史沿革,當初技術不足。第一種產生 json 的 script 是以 list 的方式產生下拉選單。第二種產生 json 的 script 是以 key-value 的方式來產生下拉選單。因為目前是使用第二種,所以也因此導致我們課程的下拉選單沒辦法照引入順序排序。詳細的檔案格式請拉到最下方見**附錄** 要改善下拉選單的順序性,主要是可以朝兩個方向: 1. 單純改善產出 JSON 的格式。可以額外寫一個 script 對應未來要調整的架構,並到 DB 找尋對應的 primary key 即可。 2. 改善課程類別 Model 新增額外的資訊,再利用類似第一種的 script 產出。 ## 使用方式 - 引入課程類別 目前因為不是寫成 django command 的形式,所以只能用將 script code 貼到 django shell 的方式。因此,要引入的類別檔案也必須 hard-code 在 script code 裡面,這是不方便的地方。 步驟: 1. 開啟 django shell `$ ./manage.py shell` 2. 複製 generate.py 的程式碼,貼到 django shell 等待引入完成。 - 產生課程類別 JSON 步驟: 1. 開啟 django shell `$ ./manage.py shell` 2. 複製 generate_category_json2.py 的程式碼,貼到 django shell 等待引入完成。 - 更新網頁 static 檔(這在 local 端測試時不需要這個步驟,使用到 nginx 才需要) 更新 staticfile: `$ ./manage.py collectstatic` Restart nginx: `$ sudo service nginx restart` ## TODO List 1. 將 Script 改成 [Django Manage Command](https://docs.djangoproject.com/en/1.11/howto/custom-management-commands/) 2. 將 `/auto_generate_course_category/generate.py` 改成支援參數的方式,以參數來指定引入的課程架構文件。 3. 改善下拉選單的順序性 ## 附錄 1. generate_category_json.py 產生的 json 檔案格式 https://gist.github.com/JIElite/c9a54351e5aa5bab05dcf7833f9bd70b 2. generate_category_json2.py 產生的 json 檔案格式 https://gist.github.com/JIElite/b94f005d20127cd30e22dde92f4861fe
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up