Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
db37082
Add double click blocking and error handling for user creation form s…
rtibbles Dec 1, 2025
0dc4909
First pass, based off of suggestions from AI.
DXCanas Dec 4, 2025
ff6209a
Removing vestigial git module definition
DXCanas Dec 4, 2025
c14ec2b
Removing symlink to prod dockerfile.
DXCanas Dec 4, 2025
840dcad
Clearing out prober code.
DXCanas Dec 4, 2025
aae5494
Moving nginx files out of `deploy` and housing them with other image-…
DXCanas Dec 4, 2025
200f537
WIP: Moving prod dockerfiles out of defunct k8s dir.
DXCanas Dec 5, 2025
1dbd0db
WIP: Flattening out new image structure, following current naming sta…
DXCanas Dec 5, 2025
c4155bf
Removing defunct cloudbuild-pr.yaml
DXCanas Dec 5, 2025
cb8cdfe
Flattening file structure further.
DXCanas Dec 5, 2025
0c39da8
Bringing in temporary symlinks for infra-side CD.
DXCanas Dec 5, 2025
1394aba
Cleaning up more prober code.
DXCanas Dec 5, 2025
57ef5cd
Merge pull request #5596 from DXCanas/studio-infra-file-cleanup
rtibbles Dec 16, 2025
b50bdb9
Configure Celery for graceful shutdown
claude Oct 30, 2025
8ca219b
Update paths for nginx Dockerfile in workflow
rtibbles Dec 17, 2025
502c99e
Merge pull request #5612 from learningequality/rtibbles-patch-1
bjester Dec 17, 2025
f8b957f
Merge pull request #5520 from learningequality/claude/issue-5000-hotf…
rtibbles Dec 18, 2025
19f4152
Merge pull request #5582 from learningequality/claude/fix-submissions…
rtibbles Jan 6, 2026
f05c8e0
Fix sync missing fields: language, provider, aggregator, role_visibility
claude Nov 29, 2025
b6f40a9
Merge pull request #5590 from learningequality/claude/issue-4930-plan…
bjester Jan 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/containerbuild.yml
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ jobs:
with:
skip_after_successful_duplicate: false
github_token: ${{ github.token }}
paths: '["k8s/images/nginx/*", ".github/workflows/containerbuild.yml"]'
paths: '["docker/Dockerfile.nginx.prod", "docker/nginx/*", ".github/workflows/containerbuild.yml"]'

build_nginx:
name: nginx - test build of nginx Docker image
Expand All @@ -100,6 +100,6 @@ jobs:
uses: docker/build-push-action@v6
with:
context: ./
file: ./k8s/images/nginx/Dockerfile
file: ./docker/Dockerfile.nginx.prod
platforms: linux/amd64
push: false
6 changes: 0 additions & 6 deletions .gitmodules

This file was deleted.

6 changes: 1 addition & 5 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -171,11 +171,7 @@ dcbuild:
$(DOCKER_COMPOSE) build

dcup: .docker/minio .docker/postgres
# run all services except for cloudprober
$(DOCKER_COMPOSE) up studio-app celery-worker

dcup-cloudprober: .docker/minio .docker/postgres
# run all services including cloudprober
# run all services
$(DOCKER_COMPOSE) up

dcdown:
Expand Down
102 changes: 0 additions & 102 deletions cloudbuild-pr.yaml

This file was deleted.

99 changes: 0 additions & 99 deletions cloudbuild-production.yaml

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -213,9 +213,10 @@
<KButton
primary
class="mt-5"
:disabled="offline"
:disabled="offline || submitting"
:text="$tr('finishButton')"
type="submit"
data-test="submit-button"
/>
</VForm>
</VLayout>
Expand Down Expand Up @@ -260,6 +261,7 @@
return {
valid: true,
registrationFailed: false,
submitting: false,
form: {
first_name: '',
last_name: '',
Expand Down Expand Up @@ -482,6 +484,12 @@
// We need to check the "acceptedAgreement" here explicitly because it is not a
// Vuetify form field and does not trigger the form validation.
if (this.$refs.form.validate() && this.acceptedAgreement) {
// Prevent double submission
if (this.submitting) {
return Promise.resolve();
}

this.submitting = true;
const cleanedData = this.clean(this.form);
return this.register(cleanedData)
.then(() => {
Expand Down Expand Up @@ -517,6 +525,9 @@
this.registrationFailed = true;
this.valid = false;
}
})
.finally(() => {
this.submitting = false;
});
} else if (this.$refs.top.scrollIntoView) {
this.$refs.top.scrollIntoView({ behavior: 'smooth' });
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -179,4 +179,19 @@ describe('create', () => {
expect(wrapper.vm.registrationFailed).toBe(true);
});
});
describe('double-submit prevention', () => {
it('should prevent multiple API calls on rapid clicks', async () => {
const [wrapper, mocks] = await makeWrapper();

// Click submit multiple times
const p1 = wrapper.vm.submit();
const p2 = wrapper.vm.submit();
const p3 = wrapper.vm.submit();

await Promise.all([p1, p2, p3]);

// Only 1 API call should be made
expect(mocks.register).toHaveBeenCalledTimes(1);
});
});
});
5 changes: 5 additions & 0 deletions contentcuration/contentcuration/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,11 @@ def gettext(s):
"result_serializer": "json",
"result_extended": True,
"worker_send_task_events": True,
# Graceful shutdown: allow 28 seconds for tasks to complete before forced termination
# This is 2 seconds less than Kubernetes terminationGracePeriodSeconds (30s)
"worker_soft_shutdown_timeout": int(
os.getenv("CELERY_WORKER_SOFT_SHUTDOWN_TIMEOUT", "28")
),
}

# When cleaning up orphan nodes, only clean up any that have been last modified
Expand Down
Loading