excel2moodle 0.3.1__py3-none-any.whl → 0.3.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- excel2moodle/__init__.py +18 -4
- excel2moodle/__main__.py +0 -10
- excel2moodle/core/category.py +4 -33
- excel2moodle/core/dataStructure.py +6 -2
- excel2moodle/core/parser.py +59 -67
- excel2moodle/core/question.py +48 -8
- excel2moodle/core/questionValidator.py +18 -0
- excel2moodle/core/stringHelpers.py +8 -1
- excel2moodle/ui/appUi.py +49 -46
- excel2moodle/ui/dialogs.py +2 -2
- excel2moodle/ui/settings.py +5 -4
- excel2moodle/ui/windowMain.py +414 -0
- {excel2moodle-0.3.1.dist-info → excel2moodle-0.3.3.dist-info}/METADATA +4 -4
- excel2moodle-0.3.3.dist-info/RECORD +31 -0
- {excel2moodle-0.3.1.dist-info → excel2moodle-0.3.3.dist-info}/WHEEL +1 -1
- excel2moodle-0.3.1.dist-info/RECORD +0 -30
- {excel2moodle-0.3.1.dist-info → excel2moodle-0.3.3.dist-info}/licenses/LICENSE +0 -0
- {excel2moodle-0.3.1.dist-info → excel2moodle-0.3.3.dist-info}/top_level.txt +0 -0
excel2moodle/ui/appUi.py
CHANGED
@@ -8,6 +8,7 @@ from PySide6 import QtCore
|
|
8
8
|
from PySide6.QtCore import Qt
|
9
9
|
from PySide6 import QtWidgets
|
10
10
|
from pathlib import Path
|
11
|
+
from excel2moodle import e2mMetadata
|
11
12
|
from excel2moodle.ui.windowMain import Ui_MoodleTestGenerator
|
12
13
|
from .windowEquationChecker import Ui_EquationChecker
|
13
14
|
from excel2moodle.ui import windowEquationChecker, dialogs
|
@@ -16,11 +17,8 @@ from excel2moodle.ui.treewidget import QuestionItem, CategoryItem
|
|
16
17
|
from excel2moodle.extra import equationVerification as eqVerif
|
17
18
|
from excel2moodle import qSignalLogger
|
18
19
|
from excel2moodle.ui.settings import Settings
|
19
|
-
from excel2moodle.ui.windowDoc import DocumentationWindow
|
20
20
|
import logging as logging
|
21
21
|
|
22
|
-
from excel2moodle import dirDocumentation
|
23
|
-
|
24
22
|
|
25
23
|
logger = logging.getLogger(__name__)
|
26
24
|
|
@@ -29,25 +27,22 @@ logger = logging.getLogger(__name__)
|
|
29
27
|
class MainWindow(QtWidgets.QMainWindow):
|
30
28
|
def __init__(self, settings:Settings, testDB:QuestionDB)->None:
|
31
29
|
super().__init__()
|
32
|
-
# self.questionGenerator = questionGenerator
|
33
|
-
# self.readSettings()
|
34
30
|
self.settings = settings
|
35
31
|
self.excelPath: Path|None = None
|
36
|
-
if self.excelPath is not None:
|
37
|
-
self.ui.buttonSpreadSheet.setText(self.excelPath.name)
|
38
32
|
self.mainPath = (self.excelPath.parent if self.excelPath is not None else None)
|
39
33
|
self.exportFile = Path()
|
40
34
|
self.testDB = testDB
|
41
35
|
self.ui = Ui_MoodleTestGenerator()
|
42
36
|
self.ui.setupUi(self)
|
43
37
|
|
44
|
-
# self.ui.buttonRefresh.clicked.connect(lambda: self.refreshList(self.test))
|
45
38
|
self.ui.treeWidget.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
|
46
39
|
self.ui.treeWidget.header().setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents)
|
40
|
+
self.ui.checkBoxIncludeCategories.setChecked(self.settings.value("testGen/includeCats", type=bool))
|
47
41
|
|
48
42
|
self.ui.retranslateUi(self)
|
49
43
|
logger.info(f"Settings are stored under: {self.settings.fileName()}")
|
50
44
|
self.ui.pointCounter.setReadOnly(True)
|
45
|
+
self.ui.questionCounter.setReadOnly(True)
|
51
46
|
self.setStatus("Wählen Sie bitte eine Excel Tabelle und einen Export Ordner für die Fragen aus")
|
52
47
|
try:
|
53
48
|
self.resize(self.settings.value("windowSize"))
|
@@ -64,11 +59,11 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
64
59
|
self.ui.checkBoxIncludeCategories.checkStateChanged.connect(self.setIncludeCategoriesSetting)
|
65
60
|
# self.ui.buttonRefresh.clicked.connect(self.refreshList)
|
66
61
|
self.ui.actionParseAll.triggered.connect(self.onParseAll )
|
62
|
+
self.testDB.dataChanged.signal.connect(self.onParseAll)
|
67
63
|
self.ui.buttonSpreadSheet.clicked.connect(self.onButSpreadsheet)
|
68
64
|
self.ui.buttonTestGen.clicked.connect(self.onButGenTest)
|
69
|
-
self.testDB.dataChanged.signal.connect(self.refreshList)
|
70
65
|
self.ui.actionPreviewQ.triggered.connect(self.previewQ)
|
71
|
-
self.ui.
|
66
|
+
self.ui.actionAbout.triggered.connect(self.onAbout)
|
72
67
|
self.settings.shPathChanged.connect(self.onSheetPathChanged)
|
73
68
|
|
74
69
|
|
@@ -77,6 +72,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
77
72
|
logger.debug("Slot, new Spreadsheet triggered")
|
78
73
|
self.spreadSheetPath = sheet
|
79
74
|
self.mainPath = sheet.parent
|
75
|
+
self.ui.buttonSpreadSheet.setText(str(sheet.name))
|
80
76
|
|
81
77
|
def updateLog(self,log)->None:
|
82
78
|
self.ui.loggerWindow.append(log)
|
@@ -84,14 +80,41 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
84
80
|
def setIncludeCategoriesSetting(self):
|
85
81
|
if self.ui.checkBoxIncludeCategories.isChecked():
|
86
82
|
self.settings.set("testGen/includeCats", True)
|
83
|
+
logger.debug("set includeCats to True")
|
87
84
|
else:
|
88
85
|
self.settings.set("testGen/includeCats", False)
|
86
|
+
logger.debug("set includeCats to False")
|
89
87
|
|
90
|
-
@QtCore.Slot()
|
91
|
-
def onOpenDocumentation(self):
|
92
|
-
documentationWindow = DocumentationWindow(dirDocumentation, self)
|
93
|
-
documentationWindow.show()
|
94
88
|
|
89
|
+
@QtCore.Slot()
|
90
|
+
def onAbout(self):
|
91
|
+
aboutMessage: str = f"""
|
92
|
+
<h1> About {e2mMetadata['name']}</h1><br>
|
93
|
+
<p style="text-align:center">
|
94
|
+
|
95
|
+
<b><a href="{e2mMetadata['homepage']}">{e2mMetadata['name']}</a> - {e2mMetadata['description']}</b>
|
96
|
+
</p>
|
97
|
+
<p style="text-align:center">
|
98
|
+
The documentation can be found under <b><a href="{e2mMetadata['documentation']}">{e2mMetadata['documentation']}</a></b>
|
99
|
+
</br>
|
100
|
+
</br>
|
101
|
+
If you encounter any issues please report them under the <a href="{e2mMetadata['issues']}"> repositories issues page</a>
|
102
|
+
</br>
|
103
|
+
</p>
|
104
|
+
<p style="text-align:center">
|
105
|
+
This project is maintained by {e2mMetadata['author']}.
|
106
|
+
<br>
|
107
|
+
Development takes place at <a href="{e2mMetadata['homepage']}">{e2mMetadata['homepage']}</a>
|
108
|
+
Contributions are very welcome
|
109
|
+
<br>
|
110
|
+
</p>
|
111
|
+
<p style="text-align:center">
|
112
|
+
<i>This project is published under {e2mMetadata['license']}, you are welcome, to share, modify and reuse the code.</i>
|
113
|
+
</p>
|
114
|
+
"""
|
115
|
+
QtWidgets.QMessageBox.information(self,
|
116
|
+
f"About {e2mMetadata['name']}",
|
117
|
+
aboutMessage)
|
95
118
|
|
96
119
|
def closeEvent(self, event):
|
97
120
|
self.settings.setValue("windowSize", self.size())
|
@@ -110,22 +133,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
110
133
|
|
111
134
|
logger.info(f'{questions} questions are selected with {count} points')
|
112
135
|
self.ui.pointCounter.setValue(count)
|
113
|
-
|
114
|
-
# val = item.text(2)
|
115
|
-
# if val == "nan":
|
116
|
-
# val = 0
|
117
|
-
# else: val = float(val)
|
118
|
-
# if item.text(0).startswith('KAT'):
|
119
|
-
# logger.debug(f'seems to be a Category, doing nothing\n')
|
120
|
-
# return None
|
121
|
-
# logger.debug(f'Current Item: {item.text(1)}, is Selected? {item.isSelected()}')
|
122
|
-
# if item.isSelected():
|
123
|
-
# count = count + val
|
124
|
-
# logger.debug(f'Selected, Count up: {count}')
|
125
|
-
# else:
|
126
|
-
# count = count - val
|
127
|
-
# logger.debug(f'unselected, Count down: {count}')
|
128
|
-
|
136
|
+
self.ui.questionCounter.setValue(questions)
|
129
137
|
return None
|
130
138
|
|
131
139
|
@QtCore.Slot()
|
@@ -151,19 +159,6 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
151
159
|
self.testDB.appendQuestions(selection, self.exportFile)
|
152
160
|
return None
|
153
161
|
|
154
|
-
@QtCore.Slot()
|
155
|
-
def refreshList(self):
|
156
|
-
logger.info("starting List refresh")
|
157
|
-
cats = self.testDB.categories
|
158
|
-
self.ui.treeWidget.clear()
|
159
|
-
for cat in cats.values():
|
160
|
-
catItem = CategoryItem(self.ui.treeWidget,cat)
|
161
|
-
catItem.setFlags(catItem.flags() & ~Qt.ItemIsSelectable)
|
162
|
-
for q in cat.questions.values():
|
163
|
-
QuestionItem(catItem,q)
|
164
|
-
self.setStatus("[OK] Fragen Liste wurde aktualisiert")
|
165
|
-
self.ui.buttonTestGen.setEnabled(True)
|
166
|
-
|
167
162
|
@QtCore.Slot()
|
168
163
|
def onButSpreadsheet(self):
|
169
164
|
file = QtWidgets.QFileDialog.getOpenFileName(self,
|
@@ -173,8 +168,6 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
173
168
|
selectedFilter=("*.ods"))
|
174
169
|
self.excelPath = Path(file[0]).resolve()
|
175
170
|
self.settings.setSpreadsheet(self.excelPath)
|
176
|
-
self.mainPath = self.excelPath.parent
|
177
|
-
self.ui.buttonSpreadSheet.setText(self.excelPath.name)
|
178
171
|
logger.debug(f'Saved Spreadsheet Path: {self.excelPath}\n')
|
179
172
|
self.setStatus("[OK] Excel Tabelle wurde eingelesen")
|
180
173
|
return None
|
@@ -187,9 +180,19 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
187
180
|
It parses all the Questions found in the spreadsheet and then refreshes the list of questions.
|
188
181
|
If successful it prints out a list of all exported Questions
|
189
182
|
"""
|
183
|
+
self.ui.buttonTestGen.setEnabled(True)
|
190
184
|
self.testDB.parseAll()
|
191
185
|
self.setStatus("[OK] Alle Fragen wurden erfolgreich in XML-Dateien umgewandelt")
|
192
|
-
|
186
|
+
# below is former refres method
|
187
|
+
logger.info("starting List refresh")
|
188
|
+
cats = self.testDB.categories
|
189
|
+
self.ui.treeWidget.clear()
|
190
|
+
for cat in cats.values():
|
191
|
+
catItem = CategoryItem(self.ui.treeWidget,cat)
|
192
|
+
catItem.setFlags(catItem.flags() & ~Qt.ItemIsSelectable)
|
193
|
+
for q in cat.questions.values():
|
194
|
+
QuestionItem(catItem,q)
|
195
|
+
self.setStatus("[OK] Fragen Liste wurde aktualisiert")
|
193
196
|
return None
|
194
197
|
|
195
198
|
@QtCore.Slot()
|
excel2moodle/ui/dialogs.py
CHANGED
@@ -65,9 +65,9 @@ class QuestinoPreviewDialog(QtWidgets.QDialog):
|
|
65
65
|
|
66
66
|
def setText(self)->None:
|
67
67
|
t = []
|
68
|
-
for text in self.question.
|
68
|
+
for text in self.question.qtextParagraphs:
|
69
69
|
t.append(ET.tostring(text, encoding='unicode'))
|
70
|
-
|
70
|
+
t.append(ET.tostring(self.question.bulletList, encoding='unicode'))
|
71
71
|
self.ui.questionText.setText("\n".join(t))
|
72
72
|
|
73
73
|
def setAnswers(self)->None:
|
excel2moodle/ui/settings.py
CHANGED
@@ -5,8 +5,8 @@ class Settings(QSettings):
|
|
5
5
|
shPathChanged = Signal(Path)
|
6
6
|
def __init__(self):
|
7
7
|
super().__init__("jbosse3", "excel2moodle")
|
8
|
-
if self.contains("spreadsheet"):
|
9
|
-
self.sheet = self.value("spreadsheet")
|
8
|
+
if self.contains("core/spreadsheet"):
|
9
|
+
self.sheet = self.value("core/spreadsheet")
|
10
10
|
try:
|
11
11
|
self.sheet.resolve(strict=True)
|
12
12
|
if self.sheet.is_file():
|
@@ -20,7 +20,8 @@ class Settings(QSettings):
|
|
20
20
|
|
21
21
|
|
22
22
|
def get(self, value, default=None):
|
23
|
-
self.value(value, default)
|
23
|
+
return self.value(value, default)
|
24
|
+
|
24
25
|
|
25
26
|
def set(self, setting, value):
|
26
27
|
self.setValue(setting, value)
|
@@ -28,7 +29,7 @@ class Settings(QSettings):
|
|
28
29
|
def setSpreadsheet(self, sheet:Path)->None:
|
29
30
|
if isinstance(sheet, Path):
|
30
31
|
self.sheet = sheet.resolve(strict=True)
|
31
|
-
self.setValue("spreadsheet", self.sheet)
|
32
|
+
self.setValue("core/spreadsheet", self.sheet)
|
32
33
|
self.shPathChanged.emit(sheet)
|
33
34
|
return None
|
34
35
|
|
@@ -0,0 +1,414 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
################################################################################
|
4
|
+
## Form generated from reading UI file 'mainWindow.ui'
|
5
|
+
##
|
6
|
+
## Created by: Qt User Interface Compiler version 6.8.3
|
7
|
+
##
|
8
|
+
## WARNING! All changes made in this file will be lost when recompiling UI file!
|
9
|
+
################################################################################
|
10
|
+
|
11
|
+
from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
|
12
|
+
QMetaObject, QObject, QPoint, QRect,
|
13
|
+
QSize, QTime, QUrl, Qt)
|
14
|
+
from PySide6.QtGui import (QAction, QBrush, QColor, QConicalGradient,
|
15
|
+
QCursor, QFont, QFontDatabase, QGradient,
|
16
|
+
QIcon, QImage, QKeySequence, QLinearGradient,
|
17
|
+
QPainter, QPalette, QPixmap, QRadialGradient,
|
18
|
+
QTransform)
|
19
|
+
from PySide6.QtWidgets import (QAbstractItemView, QAbstractSpinBox, QApplication, QCheckBox,
|
20
|
+
QDoubleSpinBox, QFormLayout, QFrame, QHBoxLayout,
|
21
|
+
QHeaderView, QLabel, QMainWindow, QMenu,
|
22
|
+
QMenuBar, QPushButton, QSizePolicy, QSpacerItem,
|
23
|
+
QSpinBox, QStatusBar, QTextEdit, QToolBar,
|
24
|
+
QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget)
|
25
|
+
|
26
|
+
class Ui_MoodleTestGenerator(object):
|
27
|
+
def setupUi(self, MoodleTestGenerator):
|
28
|
+
if not MoodleTestGenerator.objectName():
|
29
|
+
MoodleTestGenerator.setObjectName(u"MoodleTestGenerator")
|
30
|
+
MoodleTestGenerator.resize(936, 1198)
|
31
|
+
icon = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.DialogQuestion))
|
32
|
+
MoodleTestGenerator.setWindowIcon(icon)
|
33
|
+
self.actionInput_Spreadsheet = QAction(MoodleTestGenerator)
|
34
|
+
self.actionInput_Spreadsheet.setObjectName(u"actionInput_Spreadsheet")
|
35
|
+
icon1 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.DocumentOpen))
|
36
|
+
self.actionInput_Spreadsheet.setIcon(icon1)
|
37
|
+
self.actionOutput_Folder = QAction(MoodleTestGenerator)
|
38
|
+
self.actionOutput_Folder.setObjectName(u"actionOutput_Folder")
|
39
|
+
self.actionEquationChecker = QAction(MoodleTestGenerator)
|
40
|
+
self.actionEquationChecker.setObjectName(u"actionEquationChecker")
|
41
|
+
icon2 = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.ToolsCheckSpelling))
|
42
|
+
self.actionEquationChecker.setIcon(icon2)
|
43
|
+
self.actionParseAll = QAction(MoodleTestGenerator)
|
44
|
+
self.actionParseAll.setObjectName(u"actionParseAll")
|
45
|
+
icon3 = QIcon(QIcon.fromTheme(u"view-refresh"))
|
46
|
+
self.actionParseAll.setIcon(icon3)
|
47
|
+
self.actionPreviewQ = QAction(MoodleTestGenerator)
|
48
|
+
self.actionPreviewQ.setObjectName(u"actionPreviewQ")
|
49
|
+
icon4 = QIcon(QIcon.fromTheme(u"document-print-preview"))
|
50
|
+
self.actionPreviewQ.setIcon(icon4)
|
51
|
+
self.actionAbout = QAction(MoodleTestGenerator)
|
52
|
+
self.actionAbout.setObjectName(u"actionAbout")
|
53
|
+
icon5 = QIcon(QIcon.fromTheme(u"help-about"))
|
54
|
+
self.actionAbout.setIcon(icon5)
|
55
|
+
self.actionDocumentation = QAction(MoodleTestGenerator)
|
56
|
+
self.actionDocumentation.setObjectName(u"actionDocumentation")
|
57
|
+
self.actionDocumentation.setIcon(icon5)
|
58
|
+
self.actionSetting = QAction(MoodleTestGenerator)
|
59
|
+
self.actionSetting.setObjectName(u"actionSetting")
|
60
|
+
icon6 = QIcon(QIcon.fromTheme(u"preferences-system"))
|
61
|
+
self.actionSetting.setIcon(icon6)
|
62
|
+
self.mainWidget = QWidget(MoodleTestGenerator)
|
63
|
+
self.mainWidget.setObjectName(u"mainWidget")
|
64
|
+
self.verticalLayout = QVBoxLayout(self.mainWidget)
|
65
|
+
self.verticalLayout.setObjectName(u"verticalLayout")
|
66
|
+
self.horizontalLayout_2 = QHBoxLayout()
|
67
|
+
self.horizontalLayout_2.setObjectName(u"horizontalLayout_2")
|
68
|
+
self.horizontalLayout_2.setContentsMargins(-1, -1, -1, 14)
|
69
|
+
self.verticalLayout_4 = QVBoxLayout()
|
70
|
+
self.verticalLayout_4.setObjectName(u"verticalLayout_4")
|
71
|
+
self.verticalLayout_4.setContentsMargins(3, -1, -1, -1)
|
72
|
+
self.horizontalLayout = QHBoxLayout()
|
73
|
+
self.horizontalLayout.setObjectName(u"horizontalLayout")
|
74
|
+
self.checkBoxQuestionListSelectAll = QCheckBox(self.mainWidget)
|
75
|
+
self.checkBoxQuestionListSelectAll.setObjectName(u"checkBoxQuestionListSelectAll")
|
76
|
+
|
77
|
+
self.horizontalLayout.addWidget(self.checkBoxQuestionListSelectAll)
|
78
|
+
|
79
|
+
self.horizontalSpacer_4 = QSpacerItem(20, 10, QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Minimum)
|
80
|
+
|
81
|
+
self.horizontalLayout.addItem(self.horizontalSpacer_4)
|
82
|
+
|
83
|
+
self.line_4 = QFrame(self.mainWidget)
|
84
|
+
self.line_4.setObjectName(u"line_4")
|
85
|
+
self.line_4.setFrameShape(QFrame.Shape.VLine)
|
86
|
+
self.line_4.setFrameShadow(QFrame.Shadow.Sunken)
|
87
|
+
|
88
|
+
self.horizontalLayout.addWidget(self.line_4)
|
89
|
+
|
90
|
+
self.label = QLabel(self.mainWidget)
|
91
|
+
self.label.setObjectName(u"label")
|
92
|
+
font = QFont()
|
93
|
+
font.setPointSize(14)
|
94
|
+
self.label.setFont(font)
|
95
|
+
self.label.setLayoutDirection(Qt.LayoutDirection.LeftToRight)
|
96
|
+
|
97
|
+
self.horizontalLayout.addWidget(self.label)
|
98
|
+
|
99
|
+
self.horizontalSpacer = QSpacerItem(20, 40, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum)
|
100
|
+
|
101
|
+
self.horizontalLayout.addItem(self.horizontalSpacer)
|
102
|
+
|
103
|
+
|
104
|
+
self.verticalLayout_4.addLayout(self.horizontalLayout)
|
105
|
+
|
106
|
+
self.treeWidget = QTreeWidget(self.mainWidget)
|
107
|
+
__qtreewidgetitem = QTreeWidgetItem()
|
108
|
+
__qtreewidgetitem.setTextAlignment(2, Qt.AlignLeading|Qt.AlignVCenter);
|
109
|
+
self.treeWidget.setHeaderItem(__qtreewidgetitem)
|
110
|
+
self.treeWidget.setObjectName(u"treeWidget")
|
111
|
+
self.treeWidget.setBaseSize(QSize(0, 60))
|
112
|
+
self.treeWidget.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers)
|
113
|
+
self.treeWidget.header().setCascadingSectionResizes(True)
|
114
|
+
self.treeWidget.header().setMinimumSectionSize(8)
|
115
|
+
|
116
|
+
self.verticalLayout_4.addWidget(self.treeWidget)
|
117
|
+
|
118
|
+
|
119
|
+
self.horizontalLayout_2.addLayout(self.verticalLayout_4)
|
120
|
+
|
121
|
+
self.verticalLayout_2 = QVBoxLayout()
|
122
|
+
self.verticalLayout_2.setObjectName(u"verticalLayout_2")
|
123
|
+
self.label_5 = QLabel(self.mainWidget)
|
124
|
+
self.label_5.setObjectName(u"label_5")
|
125
|
+
font1 = QFont()
|
126
|
+
font1.setPointSize(15)
|
127
|
+
self.label_5.setFont(font1)
|
128
|
+
|
129
|
+
self.verticalLayout_2.addWidget(self.label_5)
|
130
|
+
|
131
|
+
self.formLayout = QFormLayout()
|
132
|
+
self.formLayout.setObjectName(u"formLayout")
|
133
|
+
self.formLayout.setLabelAlignment(Qt.AlignmentFlag.AlignLeading|Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter)
|
134
|
+
self.formLayout.setFormAlignment(Qt.AlignmentFlag.AlignHCenter|Qt.AlignmentFlag.AlignTop)
|
135
|
+
self.formLayout.setContentsMargins(5, 5, 5, 5)
|
136
|
+
self.label_6 = QLabel(self.mainWidget)
|
137
|
+
self.label_6.setObjectName(u"label_6")
|
138
|
+
|
139
|
+
self.formLayout.setWidget(0, QFormLayout.LabelRole, self.label_6)
|
140
|
+
|
141
|
+
self.pointCounter = QDoubleSpinBox(self.mainWidget)
|
142
|
+
self.pointCounter.setObjectName(u"pointCounter")
|
143
|
+
self.pointCounter.setEnabled(True)
|
144
|
+
sizePolicy = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed)
|
145
|
+
sizePolicy.setHorizontalStretch(0)
|
146
|
+
sizePolicy.setVerticalStretch(0)
|
147
|
+
sizePolicy.setHeightForWidth(self.pointCounter.sizePolicy().hasHeightForWidth())
|
148
|
+
self.pointCounter.setSizePolicy(sizePolicy)
|
149
|
+
self.pointCounter.setBaseSize(QSize(190, 0))
|
150
|
+
font2 = QFont()
|
151
|
+
font2.setPointSize(13)
|
152
|
+
self.pointCounter.setFont(font2)
|
153
|
+
self.pointCounter.setAutoFillBackground(False)
|
154
|
+
self.pointCounter.setInputMethodHints(Qt.InputMethodHint.ImhNone)
|
155
|
+
self.pointCounter.setButtonSymbols(QAbstractSpinBox.ButtonSymbols.UpDownArrows)
|
156
|
+
self.pointCounter.setDecimals(1)
|
157
|
+
self.pointCounter.setMaximum(999.899999999999977)
|
158
|
+
|
159
|
+
self.formLayout.setWidget(0, QFormLayout.FieldRole, self.pointCounter)
|
160
|
+
|
161
|
+
self.label_7 = QLabel(self.mainWidget)
|
162
|
+
self.label_7.setObjectName(u"label_7")
|
163
|
+
|
164
|
+
self.formLayout.setWidget(1, QFormLayout.LabelRole, self.label_7)
|
165
|
+
|
166
|
+
self.questionCounter = QDoubleSpinBox(self.mainWidget)
|
167
|
+
self.questionCounter.setObjectName(u"questionCounter")
|
168
|
+
self.questionCounter.setFont(font2)
|
169
|
+
self.questionCounter.setDecimals(0)
|
170
|
+
self.questionCounter.setMaximum(300.000000000000000)
|
171
|
+
|
172
|
+
self.formLayout.setWidget(1, QFormLayout.FieldRole, self.questionCounter)
|
173
|
+
|
174
|
+
self.label_8 = QLabel(self.mainWidget)
|
175
|
+
self.label_8.setObjectName(u"label_8")
|
176
|
+
|
177
|
+
self.formLayout.setWidget(2, QFormLayout.LabelRole, self.label_8)
|
178
|
+
|
179
|
+
self.categoriesCounter = QSpinBox(self.mainWidget)
|
180
|
+
self.categoriesCounter.setObjectName(u"categoriesCounter")
|
181
|
+
self.categoriesCounter.setFont(font2)
|
182
|
+
self.categoriesCounter.setMaximum(999)
|
183
|
+
|
184
|
+
self.formLayout.setWidget(2, QFormLayout.FieldRole, self.categoriesCounter)
|
185
|
+
|
186
|
+
|
187
|
+
self.verticalLayout_2.addLayout(self.formLayout)
|
188
|
+
|
189
|
+
self.line_3 = QFrame(self.mainWidget)
|
190
|
+
self.line_3.setObjectName(u"line_3")
|
191
|
+
self.line_3.setFrameShape(QFrame.Shape.HLine)
|
192
|
+
self.line_3.setFrameShadow(QFrame.Shadow.Sunken)
|
193
|
+
|
194
|
+
self.verticalLayout_2.addWidget(self.line_3)
|
195
|
+
|
196
|
+
self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding)
|
197
|
+
|
198
|
+
self.verticalLayout_2.addItem(self.verticalSpacer)
|
199
|
+
|
200
|
+
self.label_2 = QLabel(self.mainWidget)
|
201
|
+
self.label_2.setObjectName(u"label_2")
|
202
|
+
self.label_2.setFont(font)
|
203
|
+
self.label_2.setLayoutDirection(Qt.LayoutDirection.LeftToRight)
|
204
|
+
|
205
|
+
self.verticalLayout_2.addWidget(self.label_2)
|
206
|
+
|
207
|
+
self.buttonSpreadSheet = QPushButton(self.mainWidget)
|
208
|
+
self.buttonSpreadSheet.setObjectName(u"buttonSpreadSheet")
|
209
|
+
#if QT_CONFIG(tooltip)
|
210
|
+
self.buttonSpreadSheet.setToolTip(u"<html><head/><body><p>Select the Spreadsheet File with all the Questions inside</p></body></html>")
|
211
|
+
#endif // QT_CONFIG(tooltip)
|
212
|
+
|
213
|
+
self.verticalLayout_2.addWidget(self.buttonSpreadSheet)
|
214
|
+
|
215
|
+
self.horizontalSpacer_2 = QSpacerItem(40, 20, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding)
|
216
|
+
|
217
|
+
self.verticalLayout_2.addItem(self.horizontalSpacer_2)
|
218
|
+
|
219
|
+
self.line_2 = QFrame(self.mainWidget)
|
220
|
+
self.line_2.setObjectName(u"line_2")
|
221
|
+
self.line_2.setFrameShape(QFrame.Shape.HLine)
|
222
|
+
self.line_2.setFrameShadow(QFrame.Shadow.Sunken)
|
223
|
+
|
224
|
+
self.verticalLayout_2.addWidget(self.line_2)
|
225
|
+
|
226
|
+
self.label_3 = QLabel(self.mainWidget)
|
227
|
+
self.label_3.setObjectName(u"label_3")
|
228
|
+
self.label_3.setFont(font)
|
229
|
+
|
230
|
+
self.verticalLayout_2.addWidget(self.label_3)
|
231
|
+
|
232
|
+
self.formLayout_2 = QFormLayout()
|
233
|
+
self.formLayout_2.setObjectName(u"formLayout_2")
|
234
|
+
self.formLayout_2.setContentsMargins(5, 5, 5, 5)
|
235
|
+
self.label_9 = QLabel(self.mainWidget)
|
236
|
+
self.label_9.setObjectName(u"label_9")
|
237
|
+
|
238
|
+
self.formLayout_2.setWidget(2, QFormLayout.LabelRole, self.label_9)
|
239
|
+
|
240
|
+
self.checkBoxIncludeCategories = QCheckBox(self.mainWidget)
|
241
|
+
self.checkBoxIncludeCategories.setObjectName(u"checkBoxIncludeCategories")
|
242
|
+
|
243
|
+
self.formLayout_2.setWidget(2, QFormLayout.FieldRole, self.checkBoxIncludeCategories)
|
244
|
+
|
245
|
+
self.spinBoxDefaultQVariant = QSpinBox(self.mainWidget)
|
246
|
+
self.spinBoxDefaultQVariant.setObjectName(u"spinBoxDefaultQVariant")
|
247
|
+
|
248
|
+
self.formLayout_2.setWidget(1, QFormLayout.FieldRole, self.spinBoxDefaultQVariant)
|
249
|
+
|
250
|
+
self.checkBoxUseDefQVariant = QCheckBox(self.mainWidget)
|
251
|
+
self.checkBoxUseDefQVariant.setObjectName(u"checkBoxUseDefQVariant")
|
252
|
+
|
253
|
+
self.formLayout_2.setWidget(0, QFormLayout.FieldRole, self.checkBoxUseDefQVariant)
|
254
|
+
|
255
|
+
self.label_10 = QLabel(self.mainWidget)
|
256
|
+
self.label_10.setObjectName(u"label_10")
|
257
|
+
|
258
|
+
self.formLayout_2.setWidget(1, QFormLayout.LabelRole, self.label_10)
|
259
|
+
|
260
|
+
self.label_11 = QLabel(self.mainWidget)
|
261
|
+
self.label_11.setObjectName(u"label_11")
|
262
|
+
|
263
|
+
self.formLayout_2.setWidget(0, QFormLayout.LabelRole, self.label_11)
|
264
|
+
|
265
|
+
|
266
|
+
self.verticalLayout_2.addLayout(self.formLayout_2)
|
267
|
+
|
268
|
+
self.buttonTestGen = QPushButton(self.mainWidget)
|
269
|
+
self.buttonTestGen.setObjectName(u"buttonTestGen")
|
270
|
+
self.buttonTestGen.setEnabled(False)
|
271
|
+
#if QT_CONFIG(tooltip)
|
272
|
+
self.buttonTestGen.setToolTip(u"<html><head/><body><p>exporst all selected questions to the test File</p></body></html>")
|
273
|
+
#endif // QT_CONFIG(tooltip)
|
274
|
+
|
275
|
+
self.verticalLayout_2.addWidget(self.buttonTestGen)
|
276
|
+
|
277
|
+
self.line = QFrame(self.mainWidget)
|
278
|
+
self.line.setObjectName(u"line")
|
279
|
+
self.line.setFrameShape(QFrame.Shape.VLine)
|
280
|
+
self.line.setFrameShadow(QFrame.Shadow.Sunken)
|
281
|
+
|
282
|
+
self.verticalLayout_2.addWidget(self.line)
|
283
|
+
|
284
|
+
|
285
|
+
self.horizontalLayout_2.addLayout(self.verticalLayout_2)
|
286
|
+
|
287
|
+
|
288
|
+
self.verticalLayout.addLayout(self.horizontalLayout_2)
|
289
|
+
|
290
|
+
self.label_4 = QLabel(self.mainWidget)
|
291
|
+
self.label_4.setObjectName(u"label_4")
|
292
|
+
|
293
|
+
self.verticalLayout.addWidget(self.label_4)
|
294
|
+
|
295
|
+
self.loggerWindow = QTextEdit(self.mainWidget)
|
296
|
+
self.loggerWindow.setObjectName(u"loggerWindow")
|
297
|
+
self.loggerWindow.setMinimumSize(QSize(0, 0))
|
298
|
+
self.loggerWindow.setMaximumSize(QSize(16777215, 373))
|
299
|
+
self.loggerWindow.setBaseSize(QSize(0, 30))
|
300
|
+
self.loggerWindow.setTextInteractionFlags(Qt.TextInteractionFlag.NoTextInteraction)
|
301
|
+
|
302
|
+
self.verticalLayout.addWidget(self.loggerWindow)
|
303
|
+
|
304
|
+
MoodleTestGenerator.setCentralWidget(self.mainWidget)
|
305
|
+
self.menubar = QMenuBar(MoodleTestGenerator)
|
306
|
+
self.menubar.setObjectName(u"menubar")
|
307
|
+
self.menubar.setGeometry(QRect(0, 0, 936, 33))
|
308
|
+
self.menuFile = QMenu(self.menubar)
|
309
|
+
self.menuFile.setObjectName(u"menuFile")
|
310
|
+
self.menuTools = QMenu(self.menubar)
|
311
|
+
self.menuTools.setObjectName(u"menuTools")
|
312
|
+
self.menuHelp = QMenu(self.menubar)
|
313
|
+
self.menuHelp.setObjectName(u"menuHelp")
|
314
|
+
MoodleTestGenerator.setMenuBar(self.menubar)
|
315
|
+
self.statusbar = QStatusBar(MoodleTestGenerator)
|
316
|
+
self.statusbar.setObjectName(u"statusbar")
|
317
|
+
MoodleTestGenerator.setStatusBar(self.statusbar)
|
318
|
+
self.toolBar = QToolBar(MoodleTestGenerator)
|
319
|
+
self.toolBar.setObjectName(u"toolBar")
|
320
|
+
MoodleTestGenerator.addToolBar(Qt.ToolBarArea.TopToolBarArea, self.toolBar)
|
321
|
+
self.toolBar_3 = QToolBar(MoodleTestGenerator)
|
322
|
+
self.toolBar_3.setObjectName(u"toolBar_3")
|
323
|
+
MoodleTestGenerator.addToolBar(Qt.ToolBarArea.TopToolBarArea, self.toolBar_3)
|
324
|
+
self.toolBar_2 = QToolBar(MoodleTestGenerator)
|
325
|
+
self.toolBar_2.setObjectName(u"toolBar_2")
|
326
|
+
MoodleTestGenerator.addToolBar(Qt.ToolBarArea.TopToolBarArea, self.toolBar_2)
|
327
|
+
|
328
|
+
self.menubar.addAction(self.menuFile.menuAction())
|
329
|
+
self.menubar.addAction(self.menuTools.menuAction())
|
330
|
+
self.menubar.addAction(self.menuHelp.menuAction())
|
331
|
+
self.menuFile.addAction(self.actionInput_Spreadsheet)
|
332
|
+
self.menuTools.addAction(self.actionEquationChecker)
|
333
|
+
self.menuTools.addAction(self.actionParseAll)
|
334
|
+
self.menuTools.addAction(self.actionPreviewQ)
|
335
|
+
self.menuTools.addAction(self.actionSetting)
|
336
|
+
self.menuHelp.addAction(self.actionAbout)
|
337
|
+
self.menuHelp.addAction(self.actionDocumentation)
|
338
|
+
self.toolBar.addAction(self.actionInput_Spreadsheet)
|
339
|
+
self.toolBar.addAction(self.actionParseAll)
|
340
|
+
self.toolBar.addSeparator()
|
341
|
+
self.toolBar_3.addAction(self.actionEquationChecker)
|
342
|
+
self.toolBar_3.addAction(self.actionPreviewQ)
|
343
|
+
self.toolBar_2.addAction(self.actionDocumentation)
|
344
|
+
self.toolBar_2.addAction(self.actionSetting)
|
345
|
+
|
346
|
+
self.retranslateUi(MoodleTestGenerator)
|
347
|
+
|
348
|
+
QMetaObject.connectSlotsByName(MoodleTestGenerator)
|
349
|
+
# setupUi
|
350
|
+
|
351
|
+
def retranslateUi(self, MoodleTestGenerator):
|
352
|
+
MoodleTestGenerator.setWindowTitle(QCoreApplication.translate("MoodleTestGenerator", u"excel 2 moodle", None))
|
353
|
+
self.actionInput_Spreadsheet.setText(QCoreApplication.translate("MoodleTestGenerator", u"&Input Spreadsheet", None))
|
354
|
+
#if QT_CONFIG(shortcut)
|
355
|
+
self.actionInput_Spreadsheet.setShortcut(QCoreApplication.translate("MoodleTestGenerator", u"Ctrl+O", None))
|
356
|
+
#endif // QT_CONFIG(shortcut)
|
357
|
+
self.actionOutput_Folder.setText(QCoreApplication.translate("MoodleTestGenerator", u"&Output Folder", None))
|
358
|
+
self.actionEquationChecker.setText(QCoreApplication.translate("MoodleTestGenerator", u"&Equation Checker", None))
|
359
|
+
self.actionParseAll.setText(QCoreApplication.translate("MoodleTestGenerator", u"&Parse all Questions", None))
|
360
|
+
#if QT_CONFIG(tooltip)
|
361
|
+
self.actionParseAll.setToolTip(QCoreApplication.translate("MoodleTestGenerator", u"Parses all questions inside the spreadsheet", None))
|
362
|
+
#endif // QT_CONFIG(tooltip)
|
363
|
+
#if QT_CONFIG(shortcut)
|
364
|
+
self.actionParseAll.setShortcut(QCoreApplication.translate("MoodleTestGenerator", u"Ctrl+R", None))
|
365
|
+
#endif // QT_CONFIG(shortcut)
|
366
|
+
self.actionPreviewQ.setText(QCoreApplication.translate("MoodleTestGenerator", u"Preview Question", None))
|
367
|
+
#if QT_CONFIG(shortcut)
|
368
|
+
self.actionPreviewQ.setShortcut(QCoreApplication.translate("MoodleTestGenerator", u"Ctrl+P", None))
|
369
|
+
#endif // QT_CONFIG(shortcut)
|
370
|
+
self.actionAbout.setText(QCoreApplication.translate("MoodleTestGenerator", u"About", None))
|
371
|
+
self.actionDocumentation.setText(QCoreApplication.translate("MoodleTestGenerator", u"Documentation", None))
|
372
|
+
#if QT_CONFIG(shortcut)
|
373
|
+
self.actionDocumentation.setShortcut(QCoreApplication.translate("MoodleTestGenerator", u"F1", None))
|
374
|
+
#endif // QT_CONFIG(shortcut)
|
375
|
+
self.actionSetting.setText(QCoreApplication.translate("MoodleTestGenerator", u"Settings", None))
|
376
|
+
self.checkBoxQuestionListSelectAll.setText(QCoreApplication.translate("MoodleTestGenerator", u"Select all", None))
|
377
|
+
self.label.setText(QCoreApplication.translate("MoodleTestGenerator", u"Question List", None))
|
378
|
+
___qtreewidgetitem = self.treeWidget.headerItem()
|
379
|
+
___qtreewidgetitem.setText(3, QCoreApplication.translate("MoodleTestGenerator", u"Variant", None));
|
380
|
+
___qtreewidgetitem.setText(2, QCoreApplication.translate("MoodleTestGenerator", u"Points", None));
|
381
|
+
___qtreewidgetitem.setText(1, QCoreApplication.translate("MoodleTestGenerator", u"Description", None));
|
382
|
+
___qtreewidgetitem.setText(0, QCoreApplication.translate("MoodleTestGenerator", u"Question ID", None));
|
383
|
+
self.label_5.setText(QCoreApplication.translate("MoodleTestGenerator", u"Selected:", None))
|
384
|
+
self.label_6.setText(QCoreApplication.translate("MoodleTestGenerator", u"Points", None))
|
385
|
+
self.pointCounter.setPrefix("")
|
386
|
+
self.label_7.setText(QCoreApplication.translate("MoodleTestGenerator", u"Questions", None))
|
387
|
+
self.questionCounter.setPrefix("")
|
388
|
+
self.label_8.setText(QCoreApplication.translate("MoodleTestGenerator", u"Categories", None))
|
389
|
+
self.categoriesCounter.setSuffix("")
|
390
|
+
self.categoriesCounter.setPrefix("")
|
391
|
+
self.label_2.setText(QCoreApplication.translate("MoodleTestGenerator", u"Input", None))
|
392
|
+
self.buttonSpreadSheet.setText(QCoreApplication.translate("MoodleTestGenerator", u"Select spreadsheet", None))
|
393
|
+
self.label_3.setText(QCoreApplication.translate("MoodleTestGenerator", u"Output", None))
|
394
|
+
#if QT_CONFIG(tooltip)
|
395
|
+
self.label_9.setToolTip(QCoreApplication.translate("MoodleTestGenerator", u"If enabled, all questions will be categorized, when importing into moodle. Otherwise they will all be imported into one category", None))
|
396
|
+
#endif // QT_CONFIG(tooltip)
|
397
|
+
self.label_9.setText(QCoreApplication.translate("MoodleTestGenerator", u"Include Questions in Categories", None))
|
398
|
+
self.checkBoxIncludeCategories.setText("")
|
399
|
+
self.checkBoxUseDefQVariant.setText("")
|
400
|
+
self.label_10.setText(QCoreApplication.translate("MoodleTestGenerator", u"Default Question Variant", None))
|
401
|
+
#if QT_CONFIG(tooltip)
|
402
|
+
self.label_11.setToolTip(QCoreApplication.translate("MoodleTestGenerator", u"If enabled it will always use the question variant that is set below. If not, it will ask everytime, which question Variant should be used", None))
|
403
|
+
#endif // QT_CONFIG(tooltip)
|
404
|
+
self.label_11.setText(QCoreApplication.translate("MoodleTestGenerator", u"Use default question Variant", None))
|
405
|
+
self.buttonTestGen.setText(QCoreApplication.translate("MoodleTestGenerator", u"export selected Questions to examfile", None))
|
406
|
+
self.label_4.setText(QCoreApplication.translate("MoodleTestGenerator", u"Logger", None))
|
407
|
+
self.menuFile.setTitle(QCoreApplication.translate("MoodleTestGenerator", u"File", None))
|
408
|
+
self.menuTools.setTitle(QCoreApplication.translate("MoodleTestGenerator", u"Tools", None))
|
409
|
+
self.menuHelp.setTitle(QCoreApplication.translate("MoodleTestGenerator", u"Help", None))
|
410
|
+
self.toolBar.setWindowTitle(QCoreApplication.translate("MoodleTestGenerator", u"toolBar", None))
|
411
|
+
self.toolBar_3.setWindowTitle(QCoreApplication.translate("MoodleTestGenerator", u"toolBar_3", None))
|
412
|
+
self.toolBar_2.setWindowTitle(QCoreApplication.translate("MoodleTestGenerator", u"toolBar_2", None))
|
413
|
+
# retranslateUi
|
414
|
+
|
@@ -1,11 +1,11 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: excel2moodle
|
3
|
-
Version: 0.3.
|
4
|
-
Summary: A
|
3
|
+
Version: 0.3.3
|
4
|
+
Summary: A package for converting questions from a spreadsheet, to valid moodle-xml
|
5
5
|
Author: Jakob Bosse
|
6
6
|
License-Expression: GPL-3.0-or-later
|
7
|
-
Project-URL:
|
8
|
-
Project-URL:
|
7
|
+
Project-URL: Repository, https://gitlab.com/jbosse3/excel2moodle.git
|
8
|
+
Project-URL: Documentation, https://jbosse3.gitlab.io/excel2moodle
|
9
9
|
Keywords: moodle,XML,teaching,question,converter
|
10
10
|
Classifier: Programming Language :: Python :: 3
|
11
11
|
Classifier: Operating System :: OS Independent
|