TIM-JYU / TIM

TIM (The Interactive Material) is an open-source cloud-based platform for creating interactive learning documents.
https://tim.education/view/about/en-US
MIT License
13 stars 4 forks source link

Admin CLI: Komento, jolla kansio/dokumentti poistetaan ikuisesti #3670

Closed dezhidki closed 1 week ago

dezhidki commented 1 week ago

Admin CLI:hin (esim. timApp.admin.item_cli) tulee lisätä komento, jolla kansiot ja dokumentit voi poistaa TIMista kokonaan.

Aivan alkuun riittää, että PostgreSQL-kantaan jää merkintä dokumentin/kansion olemassaolosta, mutta siihen ei kukaan pääse. Sitten ajan mukaan tähän voi liittää muiden tietojen poisto, kuten velppien, vastausten jne. Sen sijaan varsinaisesta dokumenttikannasta dokumentin sisältö poistetaan kokonaan.

Alustava ajatus algoritmille (kokeilin käsin lokaalisti, näytti toimivan):

Syöte: ID

  1. Hae Block-taulusta kohde ID:llä ID
  2. Tarkista, onko haetun rivi Block.type_id joko BlockType.Document.value tai BlockType.Folder.value
    • Jos ei kumpikaan, älä toistaiseksi salli poisto (TODOna)
  3. Aseta Block.description muotoon deleted_ID, missä ID on poistettava ID
  4. Poista BlockAccess-taulusta kaikki rivit, jossa BlockAccess.block_id on ID
    • Pitäisi onnistua tyhjentämällä Block.accesses (dict)
    • Varmuudeksi aseta omistajaksi Admin-ryhmä (TODO: tarvitaanko)
  5. Käsittele poisto alla olevalla tavalla riippuen tyypistä

Dokumentti

  1. Poista DocEntry-taulusta kaikki rivit, jossa DocEntry.id on ID (tämä poistaa aliakset)
  2. Lisää DocEntry-tauluun rivi, jossa seuraavat tiedot
    • name: roskis/$deleted_ID, jossa ID on poistetun kohteen ID
    • id: ID
    • public: false
  3. Mene polkuun get_files_path() (importtaa timApp.timdb.dbaccess) ja poista lohkot sekä dokumentti
    • get_files_path() / "pars" / ID sisältää poistettavan dokumentin lohkot -> koko kansio voi poistaa
    • get_files_path() / "docs" / ID sisältää dokumentin versiot ja muutoslokin -> koko kansio voi poistaa
  4. Varmuudeksi, tee tyhjä dokumentti kantaan: Document(ID).create() (import timApp.document.document.Document)
    • TODO: Tarvitaanko tämä? Meneekö mitään rikki jos ei tehdä?
  5. Hae Translation-taulusta kaikki rivit, jossa Translation.src_docid on ID
    • Kerää kaikki käännösten ID:t talteen ja poista ne kutsumalla tämä poistometodi rekursiivisesti

Kansio

  1. Etsi Folder-taulusta rivi, jossa Folder.id on ID
  2. Kerää ylös kaikki kansiot ja dokumentit, jotka ovat kansion sisällä
    • Tässä voi käyttää valmista get_documents-metodia (import timApp.document.docentry) sekä Folder.get_all_in_path-metodia (import timApp.folder.folder.Folder)
    • Ei kannata tässä rekursoida, vaan etsi kaikki kansiot/dokumentit tässä kansiossa
  3. Aseta Folder.name muotoon "$deleted_ID", missä ID on poistettava ID ja Folder.location muotoon "roskis" (TRASH_FOLDER_PATH)
  4. Poista kaikki dokumentit kansiosta kutsumalla tämä algoritmi rekursiivisesti
  5. Poista kaikki kansiot kansiosta kutsumalla tämä algorimti rekursiivisesti
saviit commented 1 week ago

Varmuudeksi, tee tyhjä dokumentti kantaan: Document(ID).create() (import timApp.document.document.Document)

Document.create() luo tiedostojärjestelmään hakemiston, tätä ei varmaan haluta tehdä koska juurihan se poistettiin? Document-luokkaa ei myöskään ole määritetty kantaan.

dezhidki commented 1 week ago

Minusta se kannattaa tehdä tiedostojärjestelmään, jotta meillä on ainakin toimiva dokumentti. Eli jos jostain syystä haluttaisiin tehdä jotain dokumentille, niin ainakaan mikään koodi ei mene rikki oletukseen, että dokumentti kannassa tarkoittaa, että se on myös tiedostojärjestelmässä.

Mutta kannattaa testata, meneekö mitään rikki jos dokumenttia ei ole tiedostojärjestelmässä ja sitten esim. ylläpito yrittää avata dokumentin ID:llä.

Document-luokkaa ei ole peruskannassa, sillä se on dokumentin esitys tiedostojärjestelmässä.