From 3931a1f24e037a3e266883b3e6f4db084b21cffe Mon Sep 17 00:00:00 2001 From: anggoro dwi Date: Tue, 16 May 2023 00:26:33 +0700 Subject: [PATCH] bugfix moodle xml file in curent dokumen file, test file, and migrate to showprogress bar --- Scripts/Python/Library/gquiz.py | 7 ++- Scripts/Python/Library/moodleQuiz.py | 6 +- Scripts/Python/migration_gdrive_link.py | 64 ++++++++++++++++++++++ Scripts/Python/quiz_generator.py | 48 +++++++++------- Scripts/Python/test_gquiz.py | 29 ++++++++++ Scripts/Python/test_quiz.py | 33 ----------- myedu.ods | Bin 42128 -> 42341 bytes secret/place_the_client_secretes_here.txt | 13 ++++- 8 files changed, 143 insertions(+), 57 deletions(-) create mode 100644 Scripts/Python/migration_gdrive_link.py create mode 100644 Scripts/Python/test_gquiz.py delete mode 100644 Scripts/Python/test_quiz.py diff --git a/Scripts/Python/Library/gquiz.py b/Scripts/Python/Library/gquiz.py index cde4489..b32022d 100644 --- a/Scripts/Python/Library/gquiz.py +++ b/Scripts/Python/Library/gquiz.py @@ -26,6 +26,7 @@ class gquiz: self.infoPrint = self._defaultPrint self.progress = -1 self.resultUri = "" + self.savePath = './' self.submition["requests"].append({ "updateSettings": { @@ -40,6 +41,10 @@ class gquiz: def setProgress(self, i : int): self.progress = i + + def setSavePath(self, path): + self.savePath = path + def AttachProcessInfo(self, callback): self.infoPrint = callback @@ -71,7 +76,7 @@ class gquiz: self.infoPrint("refresh token",self.progress) else: flow = InstalledAppFlow.from_client_secrets_file( - './secret/client_secrets.json', SCOPES) + self.savePath+'/secret/client_secrets.json', SCOPES) creds = flow.run_local_server(port=0) self.infoPrint("generate token",self.progress) # Save the credentials for the next run diff --git a/Scripts/Python/Library/moodleQuiz.py b/Scripts/Python/Library/moodleQuiz.py index 850821c..c8152f2 100644 --- a/Scripts/Python/Library/moodleQuiz.py +++ b/Scripts/Python/Library/moodleQuiz.py @@ -9,6 +9,10 @@ class moodleQuiz: self.progress = -1 self.resultUri = "" self.data = ET.Element('quiz') + self.savePath = '.' + + def setSavePath(self, path): + self.savePath = path def setProgress(self, i : int): self.progress = i @@ -82,6 +86,6 @@ class moodleQuiz: def update(self): ET.indent(self.data) print(ET.tostring(self.data)) - ET.ElementTree(self.data).write("./moodleXMLMultichoiceQuestion.xml") + ET.ElementTree(self.data).write("{}/{}".format(self.savePath, "moodleXMLMultichoiceQuestion.xml")) diff --git a/Scripts/Python/migration_gdrive_link.py b/Scripts/Python/migration_gdrive_link.py new file mode 100644 index 0000000..aede89f --- /dev/null +++ b/Scripts/Python/migration_gdrive_link.py @@ -0,0 +1,64 @@ +# coding: utf-8 +from __future__ import unicode_literals +import sys, os +import requests +import importlib + +# to run separatly from soffice +# $ soffice --calc --accept="socket,host=localhost,port=2002;urp;StarOffice.ServiceManager" + +sys.path.append("/lib64/libreoffice/program/") + +from scriptforge import ScriptForge, CreateScriptService +from unohelper import fileUrlToSystemPath + +sys.path.insert(0, '{}/{}'.format(os.getcwd(),'Library')) +ScriptForge(hostname='localhost', port=2002) + +from gquiz import gquiz + +ui = CreateScriptService("UI") +doc = CreateScriptService("Calc") +bas = CreateScriptService("Basic") + +q = gquiz() +q.generateService() + +def get_file_id_from_link(link): + # Find the starting index of the file ID + start_index = -1 + if "/d/" in link: + start_index = link.index("/d/") + 3 + elif "id=" in link: + start_index = link.index("id=") + 3 + elif "rs/" in link: + start_index = link.index("rs/") + 3 + + if start_index != -1: + # Find the ending index of the file ID + end_index = link.index("/", start_index) + if end_index == -1: + # If there is no trailing "/", use the end of the string + end_index = len(link) + + # Extract the file ID + file_id = link[start_index:end_index] + return file_id + else: + # Return None if no file ID is found + return None + +cells = doc.getValue("") + +for col in range(0, len(cells)): + for row in range(0, len(cells[0])): + if(str(cells[col][row]).startswith("https://")): + print("found the culprit!!") + url = cells[col][row] + print(url) + Id=get_file_id_from_link(url) + file = q.drive_service.files().get(fileId=Id).execute() + newCell = "/asset/{newname}".format(newname=file["name"]) + print("{new} <- {old}".format(new=newCell, old=cells[col][row])) + doc.setValue(doc.Offset("A1",col,row),newCell) + diff --git a/Scripts/Python/quiz_generator.py b/Scripts/Python/quiz_generator.py index e087768..2cf2580 100644 --- a/Scripts/Python/quiz_generator.py +++ b/Scripts/Python/quiz_generator.py @@ -13,27 +13,26 @@ import importlib from scriptforge import ScriptForge, CreateScriptService from unohelper import fileUrlToSystemPath -#[start] comment for run separatly from soffice -if (not 'gquiz' in sys.modules) or (not 'moodleQuiz' in sys.modules): - doc = XSCRIPTCONTEXT.getDocument() - url = fileUrlToSystemPath('{}/{}'.format(doc.URL,'Scripts/python/Library')) - sys.path.insert(0, url) -else: - importlib.reload(gquiz) - importlib.reload(moodleQuiz) - -#[end] -#[start] uncomemnt for run separatly from soffice -#sys.path.insert(0, '{}/{}'.format(os.getcwd(),'Library')) -#ScriptForge(hostname='localhost', port=2002) -#[end] - -from gquiz import gquiz -from moodleQuiz import moodleQuiz - ui = CreateScriptService("UI") doc = CreateScriptService("Calc") bas = CreateScriptService("Basic") +url = fileUrlToSystemPath(XSCRIPTCONTEXT.getDocument().URL ) +curpath = '/'.join([url.split('/')[x] for x in range(0,len(url.split('/'))-1)]) +if not ui.Activate(url) : + bas.MsgBox("Error no window active",bas.MB_OK) + +def _load_module(): + #[start] comment for run embeded module + if (not 'gquiz' in sys.modules) or (not 'moodleQuiz' in sys.modules): + doc = XSCRIPTCONTEXT.getDocument() + urlem = '{}/{}'.format(url,'/Scripts/python/Library') + sys.path.insert(0, urlem) + _statusBarInfoUpdate("Load embedded modul link form {}".format(url),0) + #[end] + #[start] uncomemnt for run separatly from soffice + #sys.path.insert(0, '{}/{}'.format(os.getcwd(),'Library')) + #ScriptForge(hostname='localhost', port=2002) + #[end] def MakeTemplate(): doc.SetArray(doc.CurrentSelection, \ @@ -45,11 +44,11 @@ def MakeTemplate(): "", "", "", ),)) def _statusBarInfoUpdate(text : str, progress : int): - ui.SetStatusbar("{}% {}".format(progress,text), progress) + ui.ShowProgressBar("loading...", "{}% {}".format(progress,text), progress) def _updateQuestion(q): selctedCell = doc.CurrentSelection - cwd = os.getcwd() + cwd = curpath maxRow = doc.LastRow(selctedCell)+1-doc.FirstRow(selctedCell) for nrow in range(0, maxRow): q.setProgress(int(((nrow+1)/maxRow)*100)) @@ -82,21 +81,28 @@ def _updateQuestion(q): q.update() def GoogleQuiz(): + _load_module() + from gquiz import gquiz q = gquiz() + q.setSavePath(curpath) q.AttachProcessInfo(_statusBarInfoUpdate) q.setProgress(0) q.generateService() q.createForm("Demo Soal") _updateQuestion(q) ui.SetStatusbar("creating google form quiz done!") + _statusBarInfoUpdate("Finish!!",100) bas.InputBox("Open link to edit your form:","Your Google Form Quiz, done!", "{}".format(q.resultUri)) def MoodleQuiz(): + _load_module() + from moodleQuiz import moodleQuiz q = moodleQuiz() + q.setSavePath(curpath) q.AttachProcessInfo(_statusBarInfoUpdate) q.setProgress(0) _updateQuestion(q) ui.SetStatusbar("Done!") - bas.MsgBox("Check *.xml file in curent folder!") + _statusBarInfoUpdate("Check *.xml file in curent folder!",100) g_exportedScripts = (MakeTemplate, GoogleQuiz, MoodleQuiz) diff --git a/Scripts/Python/test_gquiz.py b/Scripts/Python/test_gquiz.py new file mode 100644 index 0000000..c36fdc9 --- /dev/null +++ b/Scripts/Python/test_gquiz.py @@ -0,0 +1,29 @@ +# coding: utf-8 +from __future__ import unicode_literals + +import sys, requests +from unohelper import fileUrlToSystemPath + +def gquiz_test(): + if not 'gquiz' in sys.modules: + doc = XSCRIPTCONTEXT.getDocument() + url = fileUrlToSystemPath('{}/{}'.format(doc.URL,'Scripts/python/Library')) + sys.path.insert(0, url) + from gquiz import gquiz + + q = gquiz() + + q.generateService() + + q.copyFile("16-rh3W-NwYzdKVBZJmi574sTWe_rMIdE-FQSw_33qXI", "Soal Masuk Penjara") + opt = [ q.createOption("A.","./asset/option1.png"), + q.createOption("B.","./asset/option2.png"), + q.createOption("C.","./asset/option3.png"), + q.createOption("D.","./asset/option4.png"), + q.createOption("E.","./asset/option5.png") ] + + qq = q.createQuestion(title = "Soal No 1",\ + description = "Dari gambar dibawah ini, ada bagian gambar yang hilang. Dari pilihan dibawah, manakah gambar yang benar?",\ + indexAnswer = 4, options = opt, itemImage='./asset/test_image.png') + q.submitQuestion(0,qq) + q.update() diff --git a/Scripts/Python/test_quiz.py b/Scripts/Python/test_quiz.py deleted file mode 100644 index 6db6933..0000000 --- a/Scripts/Python/test_quiz.py +++ /dev/null @@ -1,33 +0,0 @@ -# coding: utf-8 -from __future__ import unicode_literals - -import sys, requests, os -from unohelper import fileUrlToSystemPath - -sys.path.insert(0, "{}/{}".format(os.getcwd(),"Library")) -from gquiz import gquiz -from moodleQuiz import moodleQuiz - -def test(q): - opt = [ q.createOption("A.","./asset/option1.png"), - q.createOption("B.","./asset/option2.png"), - q.createOption("C.","./asset/option3.png"), - q.createOption("D.","./asset/option4.png"), - q.createOption("E.","./asset/option5.png") ] - qq = q.createQuestion(title = "Soal No 1",\ - description = "Dari gambar dibawah ini, ada bagian gambar yang hilang. Dari pilihan dibawah, manakah gambar yang benar?",\ - indexAnswer = 4, options = opt, itemImage='./asset/test_image.png') - q.submitQuestion(0,qq) - q.update() - -os.system("mkdir asset && mkdir secret") -os.system("cp ../../asset/* ./asset") -os.system("cp ../../secret/client_secrets.json ./secret") - -q = moodleQuiz() -test(q) - -q = gquiz() -q.generateService() -q.createForm("test") -test(q) diff --git a/myedu.ods b/myedu.ods index eea97892730d73fa479dd11b85eedd95d7ac6c33..6328a25616f92d4d19abceeee7d6fc0a8307b97c 100644 GIT binary patch delta 6096 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 abur^#8H55$kygb_;KO?=Vv+YJMgIfH!tNyi delta 5927 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 aA9ATs+@<(ne3WP@9RJ;Y&1UodBL82Dc8Hk( diff --git a/secret/place_the_client_secretes_here.txt b/secret/place_the_client_secretes_here.txt index 9766475..ecc68a2 100644 --- a/secret/place_the_client_secretes_here.txt +++ b/secret/place_the_client_secretes_here.txt @@ -1 +1,12 @@ -ok +Authorize credentials for a desktop application +To authenticate as an end user and access user data in your app, you need to create one or more OAuth 2.0 Client IDs. A client ID is used to identify a single app to Google's OAuth servers. If your app runs on multiple platforms, you must create a separate client ID for each platform. + + In the Google Cloud console, go to Menu menu > APIs & Services > Credentials. + + Go to Credentials + Click Create Credentials > OAuth client ID. + Click Application type > Desktop app. + In the Name field, type a name for the credential. This name is only shown in the Google Cloud console. + Click Create. The OAuth client created screen appears, showing your new Client ID and Client secret. + Click OK. The newly created credential appears under OAuth 2.0 Client IDs. + Save the downloaded JSON file as credentials.json, and move the file to your working directory.