Manage Script

在初始化 Project 時,我們需要 "新增" 課程類別到 Database 裡面,因此我們必須撰寫 Script ,利用特定的格式來引入課程類別。

同時,前端要利用我們產生的課程類別 JSON 去搜尋課程或是創建課程(下拉式選單)。


這個 JSON 將會產生在/ShareClass/shareclass/static/dist/file/category.json 會以 static file 的方式利用 nginx 提供給 client,並且都要重新執行 django 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
  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