Skip to content

Commit f561516

Browse files
authored
Merge branch 'main' into main
2 parents c34931a + 0b40954 commit f561516

36 files changed

Lines changed: 300 additions & 204 deletions

File tree

CHANGELOG.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,35 @@
11
# ChangeLog
22

3+
## Updates since last changelog entry (2026-02-12 → 2026-02-20)
4+
5+
Coverage: commits from **2026-02-12** through **2026-02-20** (i.e., changes after the prior cutoff on 2026-02-11).
6+
7+
### Highlights
8+
9+
- **Peer chat cleanup + reliability:** merged fixes to clean up the peer A/B chat experience and to ensure students can still send messages during synchronous chat.
10+
- **Interactive evaluation UX:** added a new `showEval` capability for interactives.
11+
- **Assessment data correctness:** fixed a shortanswer issue by correcting the underlying answers table name.
12+
- **Verbal discussion improvements:** updated the verbal discussion UI to show who a student is grouped with.
13+
- **Scratch ActiveCode layout polish:** adjusted Scratch ActiveCode positioning / CSS.
14+
- **Ops/config + dependency updates:** multiple internal updates (logging, course OpenAI key plumbing, fernet secret handling) plus package/version bumps.
15+
16+
### Commit notes (for reference)
17+
18+
- 6d5383df Merge PR #1153 (peer A/B chat cleanup)
19+
- 3efce80b new showEval for use with interactives
20+
- 8d56fcaa Fix: correct the table name for shortanswer answers
21+
- b2dfc2f1 Updated the verbal discussion to show who students are in a group with
22+
- 6a40b256 Merge PR #1147 (Scratch AC CSS update)
23+
- 36c319a3 Update packages
24+
- 0ccdc6e5 Merge PR #10 (fastapi-peer-llm)
25+
- dea3f13d ensure students can send message during sync chat
26+
- 90b2636f update logging
27+
- de3fa2a7 update get course openai key
28+
- 21f64240 update fernet secret
29+
- b6134724 new version
30+
31+
---
32+
333
## Updates since last changelog entry (2026-02-07 → 2026-02-11)
434

535
Coverage: commits from **2026-02-07** through **2026-02-11** (since the prior cutoff of 2026-02-06).

bases/rsptx/admin_server_api/routers/instructor.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1255,9 +1255,7 @@ async def post_create_course_page(
12551255

12561256
# if invoice is true then we need to create an invoice for the course
12571257
if invoice == "true":
1258-
res = await create_invoice_request(
1259-
user.username, projectname, 0.0, user.email
1260-
)
1258+
await create_invoice_request(user.username, projectname, 0.0, user.email)
12611259
# Copy attributes from base course
12621260
bc = await fetch_course(coursetype)
12631261
attrs = await fetch_all_course_attributes(bc.id)

bases/rsptx/assignment_server_api/assignment_builder/src/components/routes/AssignmentBuilder/MathJaxWrapper.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ export const mathJaxConfig = {
1313
},
1414
tex: {
1515
inlineMath: [
16-
["$", "$"],
17-
["\\(", "\\)"]
16+
["\\(", "\\)"],
17+
["$", "$"]
1818
],
1919
displayMath: [
20-
["$$", "$$"],
21-
["\\[", "\\]"]
20+
["\\[", "\\]"],
21+
["$$", "$$"]
2222
],
2323
processEscapes: true,
2424
packages: {
@@ -64,7 +64,7 @@ export const mathJaxConfig = {
6464
"code",
6565
"annotation",
6666
"annotation-xml"
67-
],
67+
]
6868
}
6969
};
7070

bases/rsptx/assignment_server_api/assignment_builder/src/components/routes/AssignmentBuilder/components/exercises/components/CreateExercise/components/ClickableAreaExercise/ClickableAreaEditor.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ export const ClickableAreaEditor: FC<ClickableAreaEditorProps> = ({
185185
}
186186
}),
187187
MathExtension.configure({
188-
delimiters: "dollar",
188+
delimiters: "bracket",
189189
katexOptions: {
190190
throwOnError: false,
191191
strict: false,

bases/rsptx/assignment_server_api/assignment_builder/src/components/routes/AssignmentBuilder/components/exercises/components/TipTap/Editor.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ export const Editor = ({
198198
}
199199
}),
200200
MathExtension.configure({
201-
delimiters: "dollar",
201+
delimiters: "bracket",
202202
katexOptions: {
203203
throwOnError: false,
204204
strict: false,

bases/rsptx/assignment_server_api/assignment_builder/src/components/routes/AssignmentBuilder/components/exercises/components/TipTap/TipTapDocModal.tsx

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -100,60 +100,64 @@ export const TipTapDocModal: FC<TipTapDocModalProps> = ({ visible, onHide }) =>
100100
<section className={styles.section}>
101101
<h3>Math Expressions</h3>
102102
<p>
103-
<strong>All math must be wrapped in dollar signs!</strong> Use LaTeX syntax for
104-
mathematical expressions:
103+
<strong>
104+
All math must be wrapped in <code>\(</code> and <code>\)</code> delimiters!
105+
</strong>{" "}
106+
Use LaTeX syntax for mathematical expressions:
105107
</p>
106108
<ul>
107109
<li>
108-
<strong>Inline math:</strong> <code>$x^2 + y^2 = z^2$</code> (single dollar signs)
110+
<strong>Inline math:</strong> <code>\(x^2 + y^2 = z^2\)</code> (backslash-parentheses)
109111
</li>
110112
<li>
111-
<strong>Block math:</strong> <code>$$\int_0^1 x^2 dx$$</code> (double dollar signs for
113+
<strong>Block math:</strong> <code>\[\int_0^1 x^2 dx\]</code> (backslash-brackets for
112114
centered display)
113115
</li>
114116
</ul>
115117
<p>
116-
<strong>Quick tip:</strong> Type <code>$\alpha$</code> to get α, <code>$\beta$</code> to
117-
get β, etc.
118+
<strong>Quick tip:</strong> Type <code>\(\alpha\)</code> to get α,{" "}
119+
<code>\(\beta\)</code> to get β, etc.
118120
</p>
119121
<p>
120-
<strong>Important:</strong> All LaTeX symbols must be wrapped in dollar signs ($).
122+
<strong>Important:</strong> All LaTeX symbols must be wrapped in <code>\(</code> and{" "}
123+
<code>\)</code> delimiters.
121124
</p>
122125
<p>Common symbols and usage:</p>
123126
<ul>
124127
<li>
125128
<strong>Greek letters:</strong>{" "}
126129
<code>
127-
$\alpha$, $\beta$, $\gamma$, $\delta$, $\epsilon$, $\theta$, $\lambda$, $\mu$,
128-
$\pi$, $\sigma$, $\phi$, $\omega$
130+
\(\alpha\), \(\beta\), \(\gamma\), \(\delta\), \(\epsilon\), \(\theta\),
131+
\(\lambda\), \(\mu\), \(\pi\), \(\sigma\), \(\phi\), \(\omega\)
129132
</code>
130133
</li>
131134
<li>
132135
<strong>Fractions:</strong>{" "}
133136
<code>
134-
$\frac{"{numerator}"}
135-
{"{denominator}"}$
137+
\(\frac{"{numerator}"}
138+
{"{denominator}"}\)
136139
</code>
137140
</li>
138141
<li>
139-
<strong>Superscripts:</strong> <code>$x^{"{superscript}"}$</code> or{" "}
140-
<code>$x^2$</code>
142+
<strong>Superscripts:</strong> <code>\(x^{"{superscript}"}\)</code> or{" "}
143+
<code>\(x^2\)</code>
141144
</li>
142145
<li>
143-
<strong>Subscripts:</strong> <code>$x_{"{subscript}"}$</code> or <code>$x_1$</code>
146+
<strong>Subscripts:</strong> <code>\(x_{"{subscript}"}\)</code> or{" "}
147+
<code>\(x_1\)</code>
144148
</li>
145149
<li>
146-
<strong>Square root:</strong> <code>$\sqrt{"{x}"}$</code> or{" "}
147-
<code>$\sqrt[n]{"{x}"}$</code>
150+
<strong>Square root:</strong> <code>\(\sqrt{"{x}"}\)</code> or{" "}
151+
<code>\(\sqrt[n]{"{x}"}\)</code>
148152
</li>
149153
<li>
150-
<strong>Integrals:</strong> <code>$\int$, $\sum$, $\prod$</code>
154+
<strong>Integrals:</strong> <code>\(\int\), \(\sum\), \(\prod\)</code>
151155
</li>
152156
<li>
153157
<strong>Number sets (with shortcuts):</strong>{" "}
154158
<code>
155-
$\R$, $\N$, $\Z$, $\Q$, $\C$ (shortcuts for $\mathbb{"{R}"}$, $\mathbb{"{N}"}$,
156-
etc.)
159+
\(\R\), \(\N\), \(\Z\), \(\Q\), \(\C\) (shortcuts for \(\mathbb{"{R}"}\), \(\mathbb
160+
{"{N}"}\), etc.)
157161
</code>
158162
</li>
159163
</ul>
@@ -162,36 +166,36 @@ export const TipTapDocModal: FC<TipTapDocModalProps> = ({ visible, onHide }) =>
162166
</p>
163167
<ul>
164168
<li>
165-
<code>$\alpha + \beta = \gamma$</code> → α + β = γ
169+
<code>\(\alpha + \beta = \gamma\)</code> → α + β = γ
166170
</li>
167171
<li>
168172
<code>
169-
$\frac{"{1}"}
173+
\(\frac{"{1}"}
170174
{"{2}"} + \frac{"{1}"}
171175
{"{3}"} = \frac{"{5}"}
172-
{"{6}"}$
176+
{"{6}"}\)
173177
</code>{" "}
174178
→ ½ + ⅓ = ⅚
175179
</li>
176180
<li>
177181
<code>
178-
$\int_0^1 x^2 dx = \frac{"{1}"}
179-
{"{3}"}$
182+
\(\int_0^1 x^2 dx = \frac{"{1}"}
183+
{"{3}"}\)
180184
</code>{" "}
181185
→ ∫₀¹ x² dx = ⅓
182186
</li>
183187
<li>
184-
<code>$x^2 + y^2 = r^2$</code> → x² + y² = r²
188+
<code>\(x^2 + y^2 = r^2\)</code> → x² + y² = r²
185189
</li>
186190
<li>
187191
<code>
188-
$\sum_{"{i=1}"}^n i = \frac{"{n(n+1)}"}
189-
{"{2}"}$
192+
\(\sum_{"{i=1}"}^n i = \frac{"{n(n+1)}"}
193+
{"{2}"}\)
190194
</code>{" "}
191195
→ Σᵢ₌₁ⁿ i = n(n+1)/2
192196
</li>
193197
<li>
194-
<code>$\R \subseteq \C$ and $\alpha \in \R$</code> → ℝ ⊆ ℂ and α ∈ ℝ
198+
<code>\(\R \subseteq \C\) and \(\alpha \in \R\)</code> → ℝ ⊆ ℂ and α ∈ ℝ
195199
</li>
196200
</ul>
197201
</section>

bases/rsptx/assignment_server_api/assignment_builder/src/components/routes/AssignmentBuilder/components/reading/AssignmentReadingsTable.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ export const AssignmentReadingsTable = ({
4848
const getNumQuestionsOrDefault = (numQuestions: Nullable<number>): number => {
4949
const defaultNumQuestions = 1;
5050

51-
return numQuestions ?? defaultNumQuestions;
51+
return Math.max(numQuestions ?? 0, defaultNumQuestions);
5252
};
5353

5454
return (

bases/rsptx/assignment_server_api/assignment_builder/src/components/routes/AssignmentBuilder/components/reading/components/ActivitiesRequiredCell.tsx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,20 @@ interface ActivitiesRequiredCellProps {
1111
itemId: number;
1212
}
1313

14+
const MIN_ACTIVITIES = 1;
15+
1416
export const ActivitiesRequiredCell = ({
1517
value,
1618
exercise,
1719
onUpdate,
1820
itemId
1921
}: ActivitiesRequiredCellProps) => {
2022
const { showToast } = useToastContext();
21-
const [currentValue, setCurrentValue] = useState(value || 0);
23+
const [currentValue, setCurrentValue] = useState(value || MIN_ACTIVITIES);
2224

2325
const handleValueChange = (newValue: number | null | undefined) => {
24-
const numValue = newValue ?? 0;
25-
const activityCount = exercise.numQuestions || 0;
26+
const numValue = newValue ?? MIN_ACTIVITIES;
27+
const activityCount = Math.max(exercise.numQuestions ?? 0, MIN_ACTIVITIES);
2628

2729
if (numValue > activityCount) {
2830
showToast({
@@ -31,7 +33,7 @@ export const ActivitiesRequiredCell = ({
3133
detail: `# required (${numValue}) must not exceed the activity count (${activityCount}).`
3234
});
3335

34-
setCurrentValue(value || 0);
36+
setCurrentValue(value || MIN_ACTIVITIES);
3537
return;
3638
}
3739

@@ -43,8 +45,8 @@ export const ActivitiesRequiredCell = ({
4345
<InputNumber
4446
value={currentValue}
4547
onValueChange={(e) => handleValueChange(e.value)}
46-
min={0}
47-
max={exercise.numQuestions || 0}
48+
min={MIN_ACTIVITIES}
49+
max={Math.max(exercise.numQuestions ?? 0, MIN_ACTIVITIES)}
4850
showButtons={false}
4951
style={{
5052
width: "100%",

bases/rsptx/assignment_server_api/core.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
from .routers import student
2323
from .routers import instructor
2424
from .routers import peer
25-
from rsptx.configuration import settings
2625
from rsptx.exceptions.core import add_exception_handlers
2726
from rsptx.logging import rslogger
2827
from rsptx.templates import template_folder

bases/rsptx/assignment_server_api/routers/assignment_summary.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,11 @@ def create_assignment_summary(assignment_id, course, dburl):
141141
]
142142
try:
143143
merged.iloc[0, 3:] = merged.iloc[0, 3:].apply(
144-
lambda x: "{:.2f}".format(float(x.split("(")[0]))
145-
if type(x) is str and "(" in x
146-
else "{:.2f}".format(float(x))
144+
lambda x: (
145+
"{:.2f}".format(float(x.split("(")[0]))
146+
if type(x) is str and "(" in x
147+
else "{:.2f}".format(float(x))
148+
)
147149
)
148150
except Exception as e:
149151
print(

0 commit comments

Comments
 (0)