OSZIMT Klausur Moodlequiz import

Fügt eine Importfunktion für Moodlequiz Ergebnisse hinzu.

  1. // ==UserScript==
  2. // @name OSZIMT Klausur Moodlequiz import
  3. // @namespace http://tampermonkey.net/
  4. // @version 250128
  5. // @description Fügt eine Importfunktion für Moodlequiz Ergebnisse hinzu.
  6. // @author Steffen Trutz
  7. // @match https://lehrer.oszimt.de/service/klausur.php
  8. // @grant none
  9. // @license GNU GPLv3
  10. // ==/UserScript==
  11.  
  12. (function() {
  13. 'use strict';
  14.  
  15. // Füge Moodle Quiz Import hinzu
  16. // Funktion, die ausgeführt wird, wenn das DOM vollständig geladen ist
  17. function moodleExamImportOnDOMContentLoaded() {
  18. // Finde das erste Element mit der Klasse "oszKlausurContainer"
  19. var container = document.querySelector('article');
  20.  
  21. // Erstelle ein neues Textfeld
  22. var textField = document.createElement('div');
  23. textField.type = 'text';
  24. textField.innerHTML = "<div style='padding: 15px; margin-top: 15px; background-color: white; border: lightgray 1px solid; border-radius: 10px; float: left; align-items: center;'>" +
  25. "<h4>Moodle Quiz Import</h4>" +
  26. "Geben Sie pro Zeile einen Link zu einer Moodlequiz ein. Wenn Sie mehrere Links angeben, werden alle Abgaben der Quizze addiert.<br>" +
  27. "<textarea id='importMoodleExamLinks' style='width: 100%'></textarea><br>" +
  28. "<button id='importMoodleExamButton'>Importiere Moodle Quiz Ergebnisse</button>" +
  29. "<div id='importMoodleExamError' style='color: red'></div>" +
  30. "</div>";
  31.  
  32.  
  33. // Füge das Textfeld dem Container hinzu
  34. container.appendChild(textField);
  35.  
  36. // Füge einen EventListener zum Button hinzu
  37. var button = document.getElementById('importMoodleExamButton');
  38. button.addEventListener('click', moodleExamImportButtonClicked);
  39. }
  40.  
  41. function moodleExamImportShowMessageRaw(message, error = true) {
  42. console.error(message);
  43. var errorDiv = document.getElementById('importMoodleExamError');
  44. errorDiv.innerHTML = message;
  45.  
  46. if (error) {
  47. errorDiv.style.color = 'red';
  48. } else {
  49. errorDiv.style.color = 'green';
  50. }
  51. }
  52.  
  53. function moodleExamImportShowMessage(data) {
  54. console.error(data);
  55. var errorDiv = document.getElementById('importMoodleExamError');
  56. let message = "??";
  57.  
  58. if (data.status == 'error') {
  59. errorDiv.style.color = 'red';
  60. message = 'Fehler: '+data.message;
  61. } else {
  62. if (data.status == 'warn') {
  63. errorDiv.style.color = 'orange';
  64. message = 'Hinweis: '+data.message;
  65. } else {
  66. errorDiv.style.color = 'green';
  67. message = 'Erfolgreich: '+data.message;
  68. }
  69. }
  70.  
  71. errorDiv.innerHTML = message;
  72. }
  73.  
  74. function moodleExamImportFillFormId(formId, value) {
  75. const element = document.getElementById(formId);
  76. element.value = value;
  77. }
  78.  
  79. // Buttonclick Funktion
  80. async function moodleExamImportButtonClicked() {
  81. try {
  82. // URL, an die die POST-Anfrage gesendet werden soll
  83. //const url = '/moodleExamImport.php';
  84. const url = 'https://moodle.oszimt.de/grade_export_lehrerbereich.php';
  85. moodleExamImportShowMessageRaw(`Parse und sende Anfrage. Bitte warten...`);
  86.  
  87. // Finde Lehrer Name
  88. const links = document.getElementById('importMoodleExamLinks').value.split('\n')
  89. const teacher = document.getElementsByClassName('oszAccountData')[0].querySelector('span').textContent;
  90. const klasse = document.getElementById('klasse').value;
  91.  
  92. // Daten, die im Body der POST-Anfrage gesendet werden sollen
  93. const requestData = {
  94. links: links,
  95. teacher: teacher,
  96. klasse: klasse
  97. };
  98.  
  99. try {
  100. // Sende die POST-Anfrage mit den JSON-Daten
  101. const response = await fetch(url, {
  102. method: 'POST',
  103. headers: {
  104. 'Content-Type': 'application/json'
  105. },
  106. body: JSON.stringify(requestData)
  107. });
  108.  
  109. // Überprüfe, ob die Anfrage erfolgreich war
  110. if (!response.ok) {
  111. throw new Error(`Netzwerkantwort war nicht ok: ${response.status} ${response.statusText}`);
  112. }
  113.  
  114. // Parst die JSON-Antwort
  115. const responseText = await response.text();
  116. const responseData = JSON.parse(responseText);
  117.  
  118. if (responseData.status == 'error'){
  119. moodleExamImportShowMessage(responseData);
  120. return;
  121. }
  122.  
  123. // Daten in die Formulare eintragen
  124. moodleExamImportFillFormId('datum', responseData.examDate);
  125. moodleExamImportFillFormId('dauer', responseData.examTime);
  126.  
  127. //run over all grades
  128. for (var i = 0; i < responseData.grades.length; i++) {
  129. const element = document.getElementsByName('noten')[i];
  130. element.value = responseData.grades[i];
  131. }
  132. updateNoten();
  133.  
  134. // Ausgabe der empfangenen JSON-Daten
  135. moodleExamImportShowMessage(responseData);
  136. } catch (error) {
  137. moodleExamImportShowMessageRaw('Es gab ein Problem mit der Fetch-Operation:'+ error, true);
  138. throw error;
  139. }
  140.  
  141. } catch (error) {
  142. moodleExamImportShowMessageRaw('Es gab ein Problem mit der Fetch-Operation:' + error);
  143. throw error;
  144. }
  145.  
  146. }
  147.  
  148. // Event-Listener für DOMContentLoaded hinzufügen
  149. document.addEventListener('DOMContentLoaded', moodleExamImportOnDOMContentLoaded);
  150.  
  151. // Fallback, falls das DOM bereits geladen ist
  152. if (document.readyState === 'complete' || document.readyState === 'interactive') {
  153. moodleExamImportOnDOMContentLoaded();
  154. }
  155. })();