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
14 stars 4 forks source link

Ajastetun jsrunnerin pitäisi huomioida exportdata #2200

Open dezhidki opened 3 years ago

dezhidki commented 3 years ago

In GitLab by @Smibu on Mar 29, 2021, 15:49

Jsrunner voi palauttaa exportdataa, jossa kerrotaan, että mihin kenttiin pitäisi tallentaa mitäkin arvoja.

Tämä toimii käsin ajettaessa jsrunner, muttei ajastuksella, koska ajastus ei nykyisellään katso exportdataa lainkaan.

dezhidki commented 3 years ago

In GitLab by @Smibu on Mar 29, 2021, 16:07

Mää en tiedä ratkeaako tämä mitenkään yksinkertaisesti koska tuo exportdata on jokaiselle komponentille erilainen ja sitten joutuisi sen vastaavan tekemään kaikille myös server-päässä.

Tarkoitatko, että exportdatassa oleva data ei välttämättä ole sellaisessa muodossa, jonka voi suoraan antaa pluginin answer-reittiin? Silloin se on toki ongelmallinen. Kieltämättä vaikuttaisi, että esim. timtablen setData ei sitä lähetä suoraan.

Mutta pitää vähän tarkemmin tutkia jossain vaiheessa.

dezhidki commented 3 years ago

In GitLab by @vesal on Mar 29, 2021, 16:16

Tarkoitatko, että exportdatassa oleva data ei välttämättä ole sellaisessa muodossa, jonka voi suoraan antaa pluginin answer-reittiin? Silloin se on toki ongelmallinen. Kieltämättä vaikuttaisi, että esim. timtablen setData ei sitä lähetä suoraan.

Joo. Jam uistaakseni vielä vähemmän esim chart.js:n kanssa.

Mutta pitää vähän tarkemmin tutkia jossain vaiheessa.

Voisikohan tuollaisen ajaa jotenkin siinä samassa selaimessa missä testit ajetaan? Silloin pitäisi varmaan jotenkin erikseen sanoa jos se seuraava JSRunner on sellainen joka pitäisikin ajaa selaimessa.

dezhidki commented 3 years ago

In GitLab by @Smibu on Mar 29, 2021, 18:41

Voisikohan tuollaisen ajaa jotenkin siinä samassa selaimessa missä testit ajetaan? Silloin pitäisi varmaan jotenkin erikseen sanoa jos se seuraava JSRunner on sellainen joka pitäisikin ajaa selaimessa.

Ei juurikaan hajua; vaatisi kokeilemista. Avoimia kysymyksiä tai muuten miettimistä vaativia asioita ainakin:

Ennen kuin Seleniumin käyttämistä palvelimella rupeaa miettimään, niin voisi tutkia, onko miten realistista kovakoodata tiettyjen pluginien exportdata-käsittely palvelimella, vai onko se JS-logiikka vain niin monimutkaista, että se ei onnistu äärellisessä ajassa. Tai jos saisi edes jonkun jsrunnerilla ajettavan pätkän erotettua selainkoodista, niin voisi samaa pätkää hyödyntää palvelimella.

dezhidki commented 3 years ago

In GitLab by @vesal on Mar 29, 2021, 19:40

Entäs tosiaan niin, että tuo exportdata mikä tuolta lähtee jätettäisiin "cacheen" ja seuraava sivulle tulija "suorittaa" sen. Tuo

https://gitlab.com/tim-jyu/tim/-/blob/master/timApp/modules/jsrunner/client/javascripts/jsrunner.ts

aloittaa kutsumaan ba:n avulla kunkin komponentin JS-koodissa olevaa setData-metodia. Eli muutassa erikoistapauskessa sen setData voisi ehkä koodata palvelimen puolelle, mutta yleisesti aika haastavaa. Tai sitten pitäisi dokumentoida että jos tekee sen setData, niin siitä pitää tehdä aina myös palvelinversio. Nyt esim chart-js osalta se on siellä char js:n javascriptistä mistä sitten save tehdään callbackillä. Tällä hetkellä ehkä noita setData eiole kuin timTable ja chart.js joita hyädynnetään jsrunnerista.

Tai sitten jos Selenium sivulla voisi toimittaa vain tuon exportdata. Mutta totta että se pitäisi useimiten avata teacher-modeen jotta kaikki komponentit näkyvät (voiolla palvelimen puolelta muuten piilotettu).

Tosin tuohon kaatuu osin tuo idea että eka sivulle tuliija suorittaisen sen kesken olevan exportdata, koska jos tullaan view-näkymään, niin kaikkia komponentteja ei välttämättä ole.

TimTablen setDatan pitäisi saada tablen nykyinen sisältö ja sitten yhdistää siihen exportdata. Voisi olla tehtävissä.

chart.js:n osalta tilanne saattaa jopa olla suoraviivaisempi, eli setData saattaa olla lähes sama mitä tallennetaan.

Malliksi mun etenemin sivun exportData:

[{"plugin":"GLO_DemoN","data":{"labels":["d1","d2","d3","d4","d5","d6","d7","d8","d9","d10","d11","d12","läpi"],"data":[306,300,294,283,279,271,260,260,257,248,132,0,0]},"save":true},{"plugin":"GLO_DemoN2","data":{"labels":["d1","d2","d3","d4","d5","d6","d7","d8","d9","d10","d11","d12","läpi"],"data":[306,300,294,283,279,271,260,260,257,248,132]},"save":true},{"plugin":"GLO_DemoN2_old","data":{"labels":["d1","d2","d3","d4","d5","d6","d7","d8","d9","d10","d11","d12","läpi"],"data":[306,300,294,283,279,271,260,260,257,248,132]},"save":true},{"plugin":"GLO_DemoAvg","data":{"labels":["d1","d2","d3","d4","d5","d6","d7","d8","d9","d10","d11","d12","läpi"],"data":[8.62,7.96,7.48,8.54,7.07,7.21,7.89,6.3,6.6,6.56,5.73,0,0]},"save":true},{"plugin":"GLO_ArvosJakauma","data":{"title":"Kurssin
arvosanojen
jakauma","xlabel":"Arvosana","ylabel":"Lukumäärä","data":[0,0,0,0,0,0],"label":"Kpl","labels":[0,1,2,3,4,5]},"save":true},{"plugin":"GLO_stat","data":{"headers":["","n","sum","avg","min","max","sd","'Reference to deleted milestone ],'matrix":[["d1",306,2636.5,8.62,0.3,16,2.27,100],["d2",300,2387.3,7.96,1,14.5,2.2,98],["d3",294,2200.53,7.48,0.5,14,2.42,96.1],["d4",283,2415.91,8.54,0.5,15.5,2.5,92.5],["d5",279,1972.59,7.07,0.01,13.01,2.56,91.2],["d6",271,1952.95,7.21,0.2,22.7,2.67,88.6],["d7",260,2050.9,7.89,2,18.15,2.57,85],["d8",260,1637.25,6.3,0.5,12.5,2.33,85],["d9",257,1697.35,6.6,0.1,12,2.46,84],["d10",248,1626.63,6.56,0.4,11,2.18,81],["d11",132,755.8,5.73,0.5,10.5,2.55,43.1]]},"save":true}]

jota voisi verrata miltä kannassa näyttää vastaavat komponentit.

Hyvää tässä toistaiseksi on se, että nuo exportdatat ovat toistaiseksi enempi tai vähempi visualisointeja, joten opiskelijankannalta tärkein, eli arvot ja kenttien värit tulevat oikein ilmankin tuota.

dezhidki commented 3 years ago

In GitLab by @vesal on Mar 30, 2021, 14:15

Esimerkiksi chart.js:n osalta näyttäisi että exportdata on:

{
    "plugin": "GLO_DemoN2",
    "data": {
        "labels": ["d1","d2","d3","d4","d5","d6","d7","d8","d9","d10","d11","d12","läpi"],
        "data": [306,300,294,283,279,271,260,260,257,248,132]
    },
    "save": true
},

ja tietokannassa oleva sisältö:

{
    "c": {
        "labels": ["d1","d2","d3","d4","d5","d6","d7","d8","d9","d10","d11","d12","läpi"],
        "data": [306,300,294,283,279,271,260,260,257,248,137]
    }
}

eli oletuksena voisi varmaan pitää että jos pluginille ei löydy exportdata konvertteria, niin jos exportdatan save-attribuutti on true, niin data-osa laitetaan c:-attrubuutiksi kantaan.

dezhidki commented 3 years ago

In GitLab by @Smibu on Mar 30, 2021, 14:28

Miltäs siis chart.js:n osalta se answer-reittikutsu näyttää silloin kun tuo GLO_DemoN2 tallennetaan? Onko siinä inputissa vain tuo sama mikä tietokannassa c:ssä?

Eli kaikki ne palvelimella tapahtuvat ajastetut asiat tehdään post_answer_impl-funktiota kutsumalla, koska siellä tehdään tarvittavat oikeustarkistukset.

dezhidki commented 3 years ago

In GitLab by @vesal on Mar 30, 2021, 15:48

abData: {saveTeacher: true, giveCustomPoints: false, userId: 1, teacher: true, saveAnswer: true}
giveCustomPoints: false
saveAnswer: true
saveTeacher: true
teacher: true
userId: 1
input: {c: {labels: ["d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10", "d11", "d12", "läpi"],…},…}
c: {labels: ["d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10", "d11", "d12", "läpi"],…}
type: "jsframe"

Eli:

{"input":{"c":{"labels":["d1","d2","d3","d4","d5","d6","d7","d8","d9","d10","d11","d12","läpi"],"data":[306,300,294,283,279,271,260,260,257,248,138]},"type":"jsframe"},"abData":{"saveTeacher":true,"giveCustomPoints":false,"userId":1,"teacher":true,"saveAnswer":true}}
dezhidki commented 3 years ago

In GitLab by @vesal on Mar 30, 2021, 15:49

Vastaavasti GLO_stat:

{"input":{"answers":{"userdata":{"cells":{"A1":"d1","B1":306,"C1":2636.5,"D1":8.62,"E1":0.3,"F1":16,"G1":2.27,"H1":100,"A2":"d2","B2":300,"C2":2387.3,"D2":7.96,"E2":1,"F2":14.5,"G2":2.2,"H2":98,"A3":"d3","B3":294,"C3":2200.53,"D3":7.48,"E3":0.5,"F3":14,"G3":2.42,"H3":96.1,"A4":"d4","B4":283,"C4":2415.91,"D4":8.54,"E4":0.5,"F4":15.5,"G4":2.5,"H4":92.5,"A5":"d5","B5":279,"C5":1972.59,"D5":7.07,"E5":0.01,"F5":13.01,"G5":2.56,"H5":91.2,"A6":"d6","B6":271,"C6":1952.95,"D6":7.21,"E6":0.2,"F6":22.7,"G6":2.67,"H6":88.6,"A7":"d7","B7":260,"C7":2050.9,"D7":7.89,"E7":2,"F7":18.15,"G7":2.57,"H7":85,"A8":"d8","B8":260,"C8":1637.25,"D8":6.3,"E8":0.5,"F8":12.5,"G8":2.33,"H8":85,"A9":"d9","B9":257,"C9":1697.35,"D9":6.6,"E9":0.1,"F9":12,"G9":2.46,"H9":84,"A10":"d10","B10":248,"C10":1626.63,"D10":6.56,"E10":0.4,"F10":11,"G10":2.18,"H10":81,"A11":"d11","B11":138,"C11":785.3,"D11":5.69,"E11":0.5,"F11":10.5,"G11":2.57,"H11":45.1},"type":"Relative"},"headers":["","n","sum","avg","min","max","sd","'Reference to deleted milestone ],'matrix":[["d1",306,2636.5,8.62,0.3,16,2.27,100],["d2",300,2387.3,7.96,1,14.5,2.2,98],["d3",294,2200.53,7.48,0.5,14,2.42,96.1],["d4",283,2415.91,8.54,0.5,15.5,2.5,92.5],["d5",279,1972.59,7.07,0.01,13.01,2.56,91.2],["d6",271,1952.95,7.21,0.2,22.7,2.67,88.6],["d7",260,2050.9,7.89,2,18.15,2.57,85],["d8",260,1637.25,6.3,0.5,12.5,2.33,85],["d9",257,1697.35,6.6,0.1,12,2.46,84],["d10",248,1626.63,6.56,0.4,11,2.18,81],["d11",138,785.3,5.69,0.5,10.5,2.57,45.1]]}},"abData":{"answer_id":9121849,"saveTeacher":true,"points":null,"giveCustomPoints":false,"userId":1,"teacher":true,"saveAnswer":true}}

Tuossa on redunttia dataa, eli nyt pitäisi katsoa jollakin että onko toinen turhaa. Ja vähän mitä käy väreillä yms jos niitä tuohon laittaa. Mutta ei tuokaan mahdottomalta näytä että joko koodataan rivit kirjain/numero-pareiksi tai sitten käytetään exportdataa lähes sellaisenaan. Tai huonossa lykyssä pitää tehdä molemmat.

Ainakaan käyttöliittymästä asetettu väri ei säily tuolla taulukossa kun tulee uusi laskenta.

Vaikuttaisi että vain userdata otetaan tuolta eli noita koordinaatteja. Mutta voisin kokeilla väkätä sellaisen, että jos userdata puuttuu, niin mahdollinen matrix korvaa sen, jolloin exportdatan saisi suoraan matrix+header ja ei userdataan ollenkaan kantaan. Tämä menisi ihan suoraan timtable.py. Silloin näille kahdelle olisi suht simppeli käsittely exportdatalle.

dezhidki commented 3 years ago

In GitLab by @vesal on Mar 30, 2021, 20:14

Nyt timTablen kohdalla riittää laittaa kantaan tyyliin:

{"headers": ["", "n", "sum", "avg", "min", "max", "sd", "pros"], "matrix": [["d1", 1, 1, 1, 1, 1, 0, 100], ["d2", 1, 2, 2, 2, 2, 0, 100]]}

eli vastaava export data olisi:

{
    "plugin": "GLO_stat",
    "data": {
        "headers": ["","n","sum","avg","min","max","sd","%"],
        "matrix": [
            ["d1", 1, 1, 1, 1, 1, 0, 100],
            ["d2", 1, 2, 2, 2, 2, 0, 100]
        ]
    }
    "save": true
}

ja tuo siis jos on tuo save: true. Jos siis useradta puuttuu kannasta, niin se tuotetaan matrix-sisällöstä timTable.py metodissa matrix_to_cells. Nyt pitää vielä miettiä mihin nämä kaksi muunnosta (eli tämä ja chart.js) laitetaan?

dezhidki commented 3 years ago

In GitLab by @vesal on Mar 31, 2021, 08:31

Ehkä olisi hyvä että jokaiseen pluginiin voisi lisätä oman expordata käsittelijän. Miten tämä tehtäisiin? Lisätäänkö pluginien reittiin joku uusi?

dezhidki commented 3 years ago

In GitLab by @Smibu on Mar 31, 2021, 10:00

Pluginilla voisi olla joku /convertExportData, joka muuntaisi exportdatan answer-reittiin yhteensopivaksi.

Eli ajastusfunktio sitten kutsuisi (kun huomataan, että ajettu plugin palautti exportdataa) ensin pluginin /convertExportData ja sitten post_answer_impl niin, että inputtiin menee se, mitä /convertExportData palautti.

dezhidki commented 3 years ago

In GitLab by @vesal on Mar 31, 2021, 12:25

Onko tuo get, post vai mikä?

dezhidki commented 3 years ago

In GitLab by @Smibu on Mar 31, 2021, 12:34

get olisi tavallaan oikein kun se convert ei mitään dataa tallentele, mutta toisaalta kun konvertoitava datamäärä voi olla isokin, niin post lienee tähän sopivampi.

dezhidki commented 3 years ago

In GitLab by @vesal on Mar 31, 2021, 12:38

Kokeilin tuonne TimTableen nyt tehdä tuollaisen. Masterissa. Katso onko periaattessa oikein. Tuohon ei tarvitse kai mitään oikeuksiakaan. Jätin siitä tuloksesta pois sen matrix, koska sitä ei varmaankaan edes tarvita. Pitää tutkia saisiko sen pois myös normaalista tallennuksesta.

dezhidki commented 3 years ago

In GitLab by @Smibu on Mar 31, 2021, 13:09

Katso onko periaattessa oikein. Tuohon ei tarvitse kai mitään oikeuksiakaan.

Joo, jotain tuollaista kuvittelin. Ei tarvi oikeuksia kun ei tuo reitti tietokantaa käytä mitenkään.

Voisin koittaa tänään integroida sen siihen ajastukseen.

dezhidki commented 3 years ago

In GitLab by @vesal on Mar 31, 2021, 13:15

Mites tuo sama sitten niin että jos ko reittiä ei ole, niin käytetään oletuksena sitä mitä kuvailin chartjs:n osalta.

Tosin tuo on vähän huono, koska csPluginissa voi olla erilaisia tapoja tallentaa. Mutta alkuun sillä pääsisi. Sitten vaan csPluginiin pitäisi tehdä sellainen joka erottelee noita erilaisia toisistaan.

Ja äärihätättilnateita varten sellainen että jsrunnerin tekijä voi itse laittaa vaihtoehtoisen attribuutin

exportsavedata: ...

jolla kertoo miten tallennus tehdään ajastetussa jos on sitä mieltä, että oletus ei tule menemään oikein (esim tekee uudentyypisiä csPlugin jsframe-toteutuksia joissa tallennusa on erilainen). En tiedä kuinka paljon tuo avaisi turva-aukkoja...

dezhidki commented 3 years ago

In GitLab by @Smibu on Apr 1, 2021, 14:47

Timtablen osalta vastaukseen tallennettu headers vaikuttaa myös olevan turha. Taulukossa näkyy otsikkorivi vain, jos se on markuppiin laitettu, eikä vastauksessa oleva headers vaikuta mitenkään, vaikka sitä muuttaa.

Eli muutan tuota timtablen convert-reittiä niin, että se ei sinne tuota headers:ia suotta laita.

Tosin tuo on vähän huono, koska csPluginissa voi olla erilaisia tapoja tallentaa. Mutta alkuun sillä pääsisi.

Voisin tehdä niin, että ajastusfunktio katsoo (convert-reitin puuttuessa), onko kyseessä csplugin, jonka alityyppi on chartjs ja siinä tapauksessa laittaa exportdatan answeriin ilman muunnosta. Muuten lokitetaan virhe ja skipataan. Sitten kun cspluginiin toteuttaa konversion, niin voi tuon kovakoodauksen ottaa pois.

dezhidki commented 3 years ago

In GitLab by @vesal on Apr 1, 2021, 14:51

Timtablen osalta vastaukseen tallennettu headers vaikuttaa myös olevan turha. Taulukossa näkyy otsikkorivi vain, jos se on markuppiin laitettu, eikä vastauksessa oleva headers vaikuta

Tarvitaan se headers ehdottomasti. Sen on tarkoitus muuttaa otsikoita jos ne ovat erilaisia. Myöhemmin voi tulle vielä muitakin attribuutteja joita exportdatan kauta voi muuttaa tilanteesta riippuen.

dezhidki commented 3 years ago

In GitLab by @Smibu on Apr 1, 2021, 15:01

Okei joo, jätän sen sinne.

dezhidki commented 3 years ago

In GitLab by @vesal on Apr 1, 2021, 15:43

Okei joo, jätän sen sinne.

Ihmettelen jos ei toimi, sillä

https://gitlab.com/tim-jyu/tim/-/blob/master/timApp/plugin/timtable/timTable.py#L193

oikein erikseen haetaan se ja lisätään mukaan jos se on pyydetty

https://gitlab.com/tim-jyu/tim/-/blob/master/timApp/plugin/timtable/timTable.py#L197

Jos kokeilit ja sulta puuttui tuo attribuutti saveUserDataHeader?

dezhidki commented 3 years ago

In GitLab by @Smibu on Apr 1, 2021, 16:59

Jos kokeilit ja sulta puuttui tuo attribuutti saveUserDataHeader?

Okei, sitä mulla ei tainnut olla markupissa.

Edit: Joo, tuon kanssa tosiaan toimii.

dezhidki commented 3 years ago

In GitLab by @Smibu on Apr 1, 2021, 17:01

Saan varmaan tänään nämä exportdata-ajastukset tuotantoon. Odottelen gitlabin testit loppuun vaan.

dezhidki commented 3 years ago

In GitLab by @Smibu on Apr 1, 2021, 17:39

Saan varmaan tänään nämä exportdata-ajastukset tuotantoon. Odottelen gitlabin testit loppuun vaan.

Nyt pistin tuotantoon.

dezhidki commented 3 years ago

In GitLab by @vesal on Apr 1, 2021, 17:59

Nyt pistin tuotantoon.

Ajaakos se vanhat nyt sillä että se runneri on olemassa?

Saako runnerin muokkauksen niin että kopsis siitä vanhat tiedot siihen dialogiin ja savella tuhoaisi mahdolisen vanahna ja loisi uuden. Voisiolla usein tarvetta sellaiselle että vaan muuttaa aikaa harvemmaksi ja tiheämmäksi sen mukaan mikä vaihe on demoja menossa. Voiolla ettei jaksa jos pitää aina tehdä uudelleen. Toki pikkuhaaste on että pitäisi mennä ensin oikeaan dokuun, mutta jos Edit-ikonia ei olisi jos on väärässä.

dezhidki commented 3 years ago

In GitLab by @Smibu on Apr 1, 2021, 18:13

Ajaakos se vanhat nyt sillä että se runneri on olemassa?

En tiedä ymmärsinkö kyssäriä, mutta ajastimia siis ei tarvitse luoda uudelleen koodipäivitysten takia. Jos toiminnot näkyvät dialogissa, niin ne on silloin aktiivisia.

dezhidki commented 3 years ago

In GitLab by @vesal on Apr 1, 2021, 18:27

En tiedä ymmärsinkö kyssäriä, mutta ajastimia siis ei tarvitse luoda uudelleen koodipäivitysten takia. Jos toiminnot näkyvät dialogissa, niin ne on silloin aktiivisia.

ok

dezhidki commented 3 years ago

In GitLab by @vesal on Apr 2, 2021, 12:34

Vaikuttaisi ettei toimi tuolla:

https://tim.jyu.fi/teacher/kurssit/tie/ohj2/2021k/eteneminen

Se varsinainen lasku tulee tehtyä, mutta esim tuo taulukko ei muutu. KUn ajan käsin jsdemo niin sitten taulukko muuttuu. Skripti ajetaan 13 yli ja olen useita minuutteja (nyt 12:30) refreshhannut selaimen ja taulukko pysyy samana, mutta kun ajan jsdemo, niin taulukko muuttuu. Jos ajan käsin pääskriptin, niin se kyllä ajaa jsdemo-skirptin ja taulukko muuttuu. Muutosta ei myöskään tullut pelkän jsdemo ajastamisesta taulukkoon. Mutta graafit taisivat muuttua.

dezhidki commented 3 years ago

In GitLab by @Smibu on Apr 9, 2021, 14:49

Vaikuttaisi ettei toimi tuolla:

Joo, tuo vika oli helppo selvittää. Timtablen convert-reitistä puuttuu vain @csrf.exempt, niin siksi se kutsu epäonnistuu. Laitan tuotantoon korjauksen kunhan päivän tentti on ohi.

dezhidki commented 3 years ago

In GitLab by @Smibu on Apr 9, 2021, 17:47

Laitan tuotantoon korjauksen kunhan päivän tentti on ohi.

Laitettu.