stackamole-xblock 9.4.0__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.
- fake/common/djangoapps/student/__init__.py +0 -0
- fake/common/djangoapps/student/models.py +15 -0
- fake/course/__init__.py +0 -0
- requirements/base.txt +25 -0
- requirements/flake8.txt +1 -0
- requirements/setup.txt +3 -0
- requirements/test.txt +19 -0
- samples/hot/sample-template.yaml +427 -0
- src/pip-delete-this-directory.txt +5 -0
- stackamole/__init__.py +8 -0
- stackamole/admin.py +130 -0
- stackamole/common.py +423 -0
- stackamole/jobs.py +211 -0
- stackamole/locale/config.yaml +14 -0
- stackamole/locale/de_DE/LC_MESSAGES/django.po +109 -0
- stackamole/locale/de_DE/LC_MESSAGES/djangojs.po +68 -0
- stackamole/locale/el/LC_MESSAGES/django.po +113 -0
- stackamole/locale/el/LC_MESSAGES/djangojs.po +77 -0
- stackamole/locale/en/LC_MESSAGES/django.po +107 -0
- stackamole/locale/en/LC_MESSAGES/djangojs.po +68 -0
- stackamole/locale/es_419/LC_MESSAGES/django.po +109 -0
- stackamole/locale/es_419/LC_MESSAGES/djangojs.po +68 -0
- stackamole/locale/et_EE/LC_MESSAGES/django.po +110 -0
- stackamole/locale/et_EE/LC_MESSAGES/djangojs.po +68 -0
- stackamole/locale/hi/LC_MESSAGES/django.po +111 -0
- stackamole/locale/hi/LC_MESSAGES/djangojs.po +72 -0
- stackamole/management/__init__.py +0 -0
- stackamole/management/commands/__init__.py +0 -0
- stackamole/management/commands/reaper.py +21 -0
- stackamole/management/commands/suspender.py +20 -0
- stackamole/migrations/0001_initial.py +43 -0
- stackamole/migrations/0002_stacklog.py +47 -0
- stackamole/migrations/0003_blanks.py +84 -0
- stackamole/migrations/0004_auto_20190715_1053.py +24 -0
- stackamole/migrations/0005_auto_20190811_1555.py +56 -0
- stackamole/migrations/0006_auto_20200107_1332.py +44 -0
- stackamole/migrations/0007_add_delete_by_and_delete_age.py +34 -0
- stackamole/migrations/0008_add_database_defaults_for_stack_key_and_password.py +23 -0
- stackamole/migrations/0009_add_null_true_for_key_and_password.py +23 -0
- stackamole/migrations/0010_add_user_foreign_key.py +52 -0
- stackamole/migrations/0011_allow_null_for_learner.py +29 -0
- stackamole/migrations/0012_add_suspend_by.py +21 -0
- stackamole/migrations/0013_migrate_app_label.py +71 -0
- stackamole/migrations/__init__.py +0 -0
- stackamole/models.py +106 -0
- stackamole/openstack.py +132 -0
- stackamole/provider.py +437 -0
- stackamole/public/css/main.css +203 -0
- stackamole/public/js/client.js +269 -0
- stackamole/public/js/guacamole-common-js/0.9.13-incubating-all.min.js +1 -0
- stackamole/public/js/guacamole-common-js/1.4.0-all.min.js +155 -0
- stackamole/public/js/guacamole-common-js/1.5.2-all.min.js +161 -0
- stackamole/public/js/guacamole-common-js/1.5.4-all.min.js +161 -0
- stackamole/public/js/guacamole-common-js/1.5.5-all.min.js +161 -0
- stackamole/public/js/main.js +492 -0
- stackamole/public/js/plugins.js +95 -0
- stackamole/stackamole.py +1226 -0
- stackamole/static/html/lab.html +88 -0
- stackamole/static/html/main.html +93 -0
- stackamole/tasks.py +947 -0
- stackamole_guacamole_client/__init__.py +0 -0
- stackamole_guacamole_client/asgi.py +26 -0
- stackamole_guacamole_client/consumers.py +95 -0
- stackamole_guacamole_client/settings.py +87 -0
- stackamole_xblock-9.4.0.dist-info/METADATA +647 -0
- stackamole_xblock-9.4.0.dist-info/RECORD +89 -0
- stackamole_xblock-9.4.0.dist-info/WHEEL +5 -0
- stackamole_xblock-9.4.0.dist-info/entry_points.txt +3 -0
- stackamole_xblock-9.4.0.dist-info/licenses/LICENSE +661 -0
- stackamole_xblock-9.4.0.dist-info/top_level.txt +7 -0
- tests/__init__.py +0 -0
- tests/resources/course/stackamole/fake_lab_1.xml +9 -0
- tests/resources/course/stackamole/fake_lab_2.xml +9 -0
- tests/resources/course/stackamole/fake_lab_hook_events_1.xml +4 -0
- tests/resources/course/stackamole/fake_lab_hook_events_2.xml +3 -0
- tests/resources/course/stackamole/fake_lab_no_port_name.xml +3 -0
- tests/resources/course/stackamole/fake_lab_no_port_number.xml +3 -0
- tests/resources/course/stackamole/fake_lab_no_provider_capacity.xml +5 -0
- tests/resources/course/stackamole/fake_lab_no_provider_name.xml +3 -0
- tests/unit/__init__.py +0 -0
- tests/unit/test_admin.py +170 -0
- tests/unit/test_commands.py +31 -0
- tests/unit/test_common.py +307 -0
- tests/unit/test_jobs.py +649 -0
- tests/unit/test_models.py +72 -0
- tests/unit/test_openstack.py +149 -0
- tests/unit/test_provider.py +847 -0
- tests/unit/test_stackamole.py +1664 -0
- tests/unit/test_tasks.py +2324 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# edX translation file.
|
|
2
|
+
# Copyright (C) 2026 EdX
|
|
3
|
+
# This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE.
|
|
4
|
+
# EdX Team <info@edx.org>, 2026.
|
|
5
|
+
#
|
|
6
|
+
msgid ""
|
|
7
|
+
msgstr ""
|
|
8
|
+
"Project-Id-Version: 0.1a\n"
|
|
9
|
+
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
|
|
10
|
+
"POT-Creation-Date: 2023-06-13 08:00+0000\n"
|
|
11
|
+
"PO-Revision-Date: 2023-06-13 09:00+0000\n"
|
|
12
|
+
"Last-Translator: \n"
|
|
13
|
+
"Language-Team: openedx-translation <openedx-translation@googlegroups.com>\n"
|
|
14
|
+
"Language: en\n"
|
|
15
|
+
"MIME-Version: 1.0\n"
|
|
16
|
+
"Content-Type: text/plain; charset=UTF-8\n"
|
|
17
|
+
"Content-Transfer-Encoding: 8bit\n"
|
|
18
|
+
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
19
|
+
|
|
20
|
+
#: public/js/main.js:115
|
|
21
|
+
msgid ""
|
|
22
|
+
"Could not connect to your lab environment. The client detected an unexpected"
|
|
23
|
+
" error. The server's error message was:"
|
|
24
|
+
msgstr "No se pudo conectar a su entorno de laboratorio. El cliente detectó un error inesperado. El mensaje de error del servidor fue:"
|
|
25
|
+
|
|
26
|
+
#: public/js/main.js:127
|
|
27
|
+
msgid "Lost connection to your lab environment."
|
|
28
|
+
msgstr "Pérdida de conexión con su entorno de laboratorio."
|
|
29
|
+
|
|
30
|
+
#: public/js/main.js:129
|
|
31
|
+
msgid ""
|
|
32
|
+
"The remote server unexpectedly disconnected. You can try closing your "
|
|
33
|
+
"browser window, and returning to this page in a few minutes."
|
|
34
|
+
msgstr "El servidor remoto se desconectó inesperadamente. Puede intentar cerrar la ventana de su navegador y regresar a esta página en unos minutos."
|
|
35
|
+
|
|
36
|
+
#: public/js/main.js:151
|
|
37
|
+
msgid "Your lab is currently active in a separate window."
|
|
38
|
+
msgstr "Su laboratorio está actualmente activo en una ventana separada."
|
|
39
|
+
|
|
40
|
+
#: public/js/main.js:292
|
|
41
|
+
msgid "Attention!"
|
|
42
|
+
msgstr "¡Atención!"
|
|
43
|
+
|
|
44
|
+
#: public/js/main.js:307
|
|
45
|
+
msgid "Could not connect to your lab environment:"
|
|
46
|
+
msgstr "No se pudo conectar al entorno de su laboratorio."
|
|
47
|
+
|
|
48
|
+
#: public/js/main.js:332
|
|
49
|
+
msgid "Your lab environment is undergoing maintenance"
|
|
50
|
+
msgstr "Su entorno de laboratorio está en mantenimiento"
|
|
51
|
+
|
|
52
|
+
#: public/js/main.js:334
|
|
53
|
+
msgid ""
|
|
54
|
+
"Your lab environment is undergoing automatic maintenance. Please try again "
|
|
55
|
+
"in a few minutes."
|
|
56
|
+
msgstr "Su entorno de laboratorio está en mantenimiento automático. Vuelve a intentarlo en unos minutos."
|
|
57
|
+
|
|
58
|
+
#: public/js/main.js:349
|
|
59
|
+
msgid "There was a problem preparing your lab environment:"
|
|
60
|
+
msgstr "Hubo un problema al preparar su entorno de laboratorio:"
|
|
61
|
+
|
|
62
|
+
#: public/js/main.js:394
|
|
63
|
+
msgid "You completed {passed} out of {total} tasks."
|
|
64
|
+
msgstr "Has completado {passed} de {total} tareas."
|
|
65
|
+
|
|
66
|
+
#: public/js/main.js:448
|
|
67
|
+
msgid "Type {code} to reset your lab."
|
|
68
|
+
msgstr "Escribe {code} para reiniciar tu laboratorio."
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# SOME DESCRIPTIVE TITLE.
|
|
2
|
+
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
|
3
|
+
# This file is distributed under the same license as the PACKAGE package.
|
|
4
|
+
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
|
5
|
+
#
|
|
6
|
+
#, fuzzy
|
|
7
|
+
msgid ""
|
|
8
|
+
msgstr ""
|
|
9
|
+
"Project-Id-Version: PACKAGE VERSION\n"
|
|
10
|
+
"Report-Msgid-Bugs-To: \n"
|
|
11
|
+
"POT-Creation-Date: 2023-12-11 13:29+0100\n"
|
|
12
|
+
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
|
13
|
+
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
|
14
|
+
"Language-Team: LANGUAGE <LL@li.org>\n"
|
|
15
|
+
"Language: \n"
|
|
16
|
+
"MIME-Version: 1.0\n"
|
|
17
|
+
"Content-Type: text/plain; charset=UTF-8\n"
|
|
18
|
+
"Content-Transfer-Encoding: 8bit\n"
|
|
19
|
+
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
20
|
+
|
|
21
|
+
#: stackamole.py:989
|
|
22
|
+
msgid "Timeout when launching stack."
|
|
23
|
+
msgstr "Keskkonna loomiseks seatud ajalimiit täis."
|
|
24
|
+
|
|
25
|
+
#: stackamole.py:1115
|
|
26
|
+
msgid "Unexpected result: "
|
|
27
|
+
msgstr "Ootamatu tulemus: "
|
|
28
|
+
|
|
29
|
+
#: stackamole.py:1144
|
|
30
|
+
msgid "Timeout when checking progress."
|
|
31
|
+
msgstr "Tulemuste kontrollimiseks seatud ajalimiit täis."
|
|
32
|
+
|
|
33
|
+
#: static/html/main.html:18 static/html/main.html:36
|
|
34
|
+
msgid "Please wait"
|
|
35
|
+
msgstr "Palun oota"
|
|
36
|
+
|
|
37
|
+
#: static/html/main.html:19
|
|
38
|
+
msgid "We're preparing your lab environment."
|
|
39
|
+
msgstr "Valmistame sinu laborikeskkonda."
|
|
40
|
+
|
|
41
|
+
#: static/html/main.html:20
|
|
42
|
+
msgid "Don't panic! It may take a few minutes."
|
|
43
|
+
msgstr "Ole mureta! Siin võib mõni minut aega minna."
|
|
44
|
+
|
|
45
|
+
#: static/html/main.html:25 static/html/main.html:53
|
|
46
|
+
msgid "Sorry!"
|
|
47
|
+
msgstr "Vabandust!"
|
|
48
|
+
|
|
49
|
+
#: static/html/main.html:37
|
|
50
|
+
msgid "Working"
|
|
51
|
+
msgstr "Töö käib"
|
|
52
|
+
|
|
53
|
+
#: static/html/main.html:42
|
|
54
|
+
msgid "Progress check result"
|
|
55
|
+
msgstr "Kontrollitud tulemus"
|
|
56
|
+
|
|
57
|
+
#: static/html/main.html:44
|
|
58
|
+
msgid "Hints"
|
|
59
|
+
msgstr "Vihjed"
|
|
60
|
+
|
|
61
|
+
#: static/html/main.html:54
|
|
62
|
+
msgid "There was a problem checking your progress:"
|
|
63
|
+
msgstr "Tulemuste kontolli käigus esines tõrge:"
|
|
64
|
+
|
|
65
|
+
#: static/html/main.html:64
|
|
66
|
+
msgid "We think you're busy elsewhere."
|
|
67
|
+
msgstr "Arvame, et oled mujal hõivatud."
|
|
68
|
+
|
|
69
|
+
#: static/html/main.html:65
|
|
70
|
+
msgid ""
|
|
71
|
+
"You've been inactive here for a while, so we paused your lab environment."
|
|
72
|
+
msgstr "Oled siin juba mõnda aega mitteaktiivne olnud seetõttu peatasime sinu laborikeskkonna."
|
|
73
|
+
|
|
74
|
+
#: static/html/main.html:66
|
|
75
|
+
msgid "Click 'OK' to return to your terminal in this window."
|
|
76
|
+
msgstr "Vajuta 'OK', et naaseda oma laborikeskkonda selles aknas."
|
|
77
|
+
|
|
78
|
+
#: static/html/main.html:74
|
|
79
|
+
msgid "Are you sure?"
|
|
80
|
+
msgstr "Kas oled kindel?"
|
|
81
|
+
|
|
82
|
+
#: static/html/main.html:76
|
|
83
|
+
msgid "Resetting will return your lab environment to a pristine state."
|
|
84
|
+
msgstr "Taastamine viib sinu laborikeskkonna tagasi algsesse seisu."
|
|
85
|
+
|
|
86
|
+
#: static/html/main.html:78
|
|
87
|
+
msgid "This may take several minutes to complete."
|
|
88
|
+
msgstr "See võib mõni minut aega võtta."
|
|
89
|
+
|
|
90
|
+
#: static/html/main.html:80
|
|
91
|
+
msgid ""
|
|
92
|
+
"In a timed exam, the timer will continue to run while your environment is "
|
|
93
|
+
"being reset."
|
|
94
|
+
msgstr "Ajastatud eksami käigus, taimer töötab keskkonna taastamise ajal edasi."
|
|
95
|
+
|
|
96
|
+
#: static/html/main.html:82
|
|
97
|
+
msgid ""
|
|
98
|
+
"After you reset, you will need to retrace your steps up to this point. This "
|
|
99
|
+
"includes redoing any previous labs you have already completed."
|
|
100
|
+
msgstr ""
|
|
101
|
+
"Peale taastamist pead kõik oma senised sammud kuni praeguseni uuesti läbima. See "
|
|
102
|
+
"hõlmab ka kõigi juba varasemalt sooritatud laborite kordamist."
|
|
103
|
+
|
|
104
|
+
#: static/html/main.html:84
|
|
105
|
+
msgid "You cannot undo this action."
|
|
106
|
+
msgstr "Seda toimingut ei saa tagasi võtta."
|
|
107
|
+
|
|
108
|
+
#: tasks.py:194
|
|
109
|
+
msgid "You've reached the time limit allocated to you for using labs."
|
|
110
|
+
msgstr "Oled jõudnud sinule laborite kasutamiseks määratud ajalimiidini."
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# edX translation file.
|
|
2
|
+
# Copyright (C) 2026 EdX
|
|
3
|
+
# This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE.
|
|
4
|
+
# EdX Team <info@edx.org>, 2026.
|
|
5
|
+
#
|
|
6
|
+
msgid ""
|
|
7
|
+
msgstr ""
|
|
8
|
+
"Project-Id-Version: 0.1a\n"
|
|
9
|
+
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
|
|
10
|
+
"POT-Creation-Date: 2023-06-13 08:00+0000\n"
|
|
11
|
+
"PO-Revision-Date: 2023-06-13 09:00+0000\n"
|
|
12
|
+
"Last-Translator: \n"
|
|
13
|
+
"Language-Team: openedx-translation <openedx-translation@googlegroups.com>\n"
|
|
14
|
+
"Language: en\n"
|
|
15
|
+
"MIME-Version: 1.0\n"
|
|
16
|
+
"Content-Type: text/plain; charset=UTF-8\n"
|
|
17
|
+
"Content-Transfer-Encoding: 8bit\n"
|
|
18
|
+
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
19
|
+
|
|
20
|
+
#: public/js/main.js:115
|
|
21
|
+
msgid ""
|
|
22
|
+
"Could not connect to your lab environment. The client detected an unexpected"
|
|
23
|
+
" error. The server's error message was:"
|
|
24
|
+
msgstr "Laborikeskkonnaga ei õnnestunud ühendust luua. Klient tuvastas ootamatu vea. Serveri veateade oli:"
|
|
25
|
+
|
|
26
|
+
#: public/js/main.js:127
|
|
27
|
+
msgid "Lost connection to your lab environment."
|
|
28
|
+
msgstr "Ühendus sinu laborikeskkonnaga katkes."
|
|
29
|
+
|
|
30
|
+
#: public/js/main.js:129
|
|
31
|
+
msgid ""
|
|
32
|
+
"The remote server unexpectedly disconnected. You can try closing your "
|
|
33
|
+
"browser window, and returning to this page in a few minutes."
|
|
34
|
+
msgstr "Kaugserver katkestas ootamatult ühenduse. Võite proovida brauseriakna sulgeda ja mõne minuti pärast sellele lehele naasta."
|
|
35
|
+
|
|
36
|
+
#: public/js/main.js:151
|
|
37
|
+
msgid "Your lab is currently active in a separate window."
|
|
38
|
+
msgstr "Sinu laborikeskkond on hetkel aktiivne teises aknas."
|
|
39
|
+
|
|
40
|
+
#: public/js/main.js:292
|
|
41
|
+
msgid "Attention!"
|
|
42
|
+
msgstr "Tähelepanu!"
|
|
43
|
+
|
|
44
|
+
#: public/js/main.js:307
|
|
45
|
+
msgid "Could not connect to your lab environment:"
|
|
46
|
+
msgstr "Laborikeskkonnaga ei ōnnestunud ühendust luua."
|
|
47
|
+
|
|
48
|
+
#: public/js/main.js:332
|
|
49
|
+
msgid "Your lab environment is undergoing maintenance"
|
|
50
|
+
msgstr "Teie laborikeskkond on hetkel hoolduses"
|
|
51
|
+
|
|
52
|
+
#: public/js/main.js:334
|
|
53
|
+
msgid ""
|
|
54
|
+
"Your lab environment is undergoing automatic maintenance. Please try again "
|
|
55
|
+
"in a few minutes."
|
|
56
|
+
msgstr "Teie laborikeskkond on hetkel automaatsel hooldusel. Palun proovi mõne minuti pärast uuesti."
|
|
57
|
+
|
|
58
|
+
#: public/js/main.js:349
|
|
59
|
+
msgid "There was a problem preparing your lab environment:"
|
|
60
|
+
msgstr "Sinu laborikeskkonna ettevalmistamisel esines tõrge:"
|
|
61
|
+
|
|
62
|
+
#: public/js/main.js:394
|
|
63
|
+
msgid "You completed {passed} out of {total} tasks."
|
|
64
|
+
msgstr "Läbisid edukalt {passed} ülesannet {total}-st."
|
|
65
|
+
|
|
66
|
+
#: public/js/main.js:448
|
|
67
|
+
msgid "Type {code} to reset your lab."
|
|
68
|
+
msgstr "Trüki {code} laborikeskkonna taastamiseks."
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# SOME DESCRIPTIVE TITLE.
|
|
2
|
+
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
|
3
|
+
# This file is distributed under the same license as the PACKAGE package.
|
|
4
|
+
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
|
5
|
+
#
|
|
6
|
+
#, fuzzy
|
|
7
|
+
msgid ""
|
|
8
|
+
msgstr ""
|
|
9
|
+
"Project-Id-Version: PACKAGE VERSION\n"
|
|
10
|
+
"Report-Msgid-Bugs-To: \n"
|
|
11
|
+
"POT-Creation-Date: 2023-12-11 13:29+0100\n"
|
|
12
|
+
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
|
13
|
+
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
|
14
|
+
"Language-Team: LANGUAGE <LL@li.org>\n"
|
|
15
|
+
"Language: \n"
|
|
16
|
+
"MIME-Version: 1.0\n"
|
|
17
|
+
"Content-Type: text/plain; charset=UTF-8\n"
|
|
18
|
+
"Content-Transfer-Encoding: 8bit\n"
|
|
19
|
+
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
20
|
+
|
|
21
|
+
#: stackamole.py:989
|
|
22
|
+
msgid "Timeout when launching stack."
|
|
23
|
+
msgstr "स्टैक लॉन्च करते समय टाइमआउट।"
|
|
24
|
+
|
|
25
|
+
#: stackamole.py:1115
|
|
26
|
+
msgid "Unexpected result: "
|
|
27
|
+
msgstr "अनपेक्षित परिणाम:"
|
|
28
|
+
|
|
29
|
+
#: stackamole.py:1144
|
|
30
|
+
msgid "Timeout when checking progress."
|
|
31
|
+
msgstr "प्रगति की जाँच करते समय समयबाह्य।"
|
|
32
|
+
|
|
33
|
+
#: static/html/main.html:18 static/html/main.html:36
|
|
34
|
+
msgid "Please wait"
|
|
35
|
+
msgstr "कृपया प्रतीक्षा करें"
|
|
36
|
+
|
|
37
|
+
#: static/html/main.html:19
|
|
38
|
+
msgid "We're preparing your lab environment."
|
|
39
|
+
msgstr "हम आपका प्रयोगशाला वातावरण तैयार कर रहे हैं।"
|
|
40
|
+
|
|
41
|
+
#: static/html/main.html:20
|
|
42
|
+
msgid "Don't panic! It may take a few minutes."
|
|
43
|
+
msgstr "घबड़ाएं नहीं! इसमें कुछ मिनट लग सकते हैं।"
|
|
44
|
+
|
|
45
|
+
#: static/html/main.html:25 static/html/main.html:53
|
|
46
|
+
msgid "Sorry!"
|
|
47
|
+
msgstr "माफ़ करना!"
|
|
48
|
+
|
|
49
|
+
#: static/html/main.html:37
|
|
50
|
+
msgid "Working"
|
|
51
|
+
msgstr "कार्यरत"
|
|
52
|
+
|
|
53
|
+
#: static/html/main.html:42
|
|
54
|
+
msgid "Progress check result"
|
|
55
|
+
msgstr "प्रगति जांच परिणाम"
|
|
56
|
+
|
|
57
|
+
#: static/html/main.html:44
|
|
58
|
+
msgid "Hints"
|
|
59
|
+
msgstr "संकेत"
|
|
60
|
+
|
|
61
|
+
#: static/html/main.html:54
|
|
62
|
+
msgid "There was a problem checking your progress:"
|
|
63
|
+
msgstr "आपकी प्रगति की जाँच करने में समस्या हुई:"
|
|
64
|
+
|
|
65
|
+
#: static/html/main.html:64
|
|
66
|
+
msgid "We think you're busy elsewhere."
|
|
67
|
+
msgstr "हमें लगता है कि आप कहीं और व्यस्त हैं।"
|
|
68
|
+
|
|
69
|
+
#: static/html/main.html:65
|
|
70
|
+
msgid ""
|
|
71
|
+
"You've been inactive here for a while, so we paused your lab environment."
|
|
72
|
+
msgstr "आप यहां कुछ समय से निष्क्रिय हैं, इसलिए हमने आपके प्रयोगशाला परिवेश को रोक दिया है।"
|
|
73
|
+
|
|
74
|
+
#: static/html/main.html:66
|
|
75
|
+
msgid "Click 'OK' to return to your terminal in this window."
|
|
76
|
+
msgstr "इस विंडो में अपने टर्मिनल पर लौटने के लिए 'ओके' पर क्लिक करें।"
|
|
77
|
+
|
|
78
|
+
#: static/html/main.html:74
|
|
79
|
+
msgid "Are you sure?"
|
|
80
|
+
msgstr "क्या आपको यकीन है?"
|
|
81
|
+
|
|
82
|
+
#: static/html/main.html:76
|
|
83
|
+
msgid "Resetting will return your lab environment to a pristine state."
|
|
84
|
+
msgstr "रीसेट करने से आपका लैब वातावरण एक पुरानी स्थिति में वापस आ जाएगा।"
|
|
85
|
+
|
|
86
|
+
#: static/html/main.html:78
|
|
87
|
+
msgid "This may take several minutes to complete."
|
|
88
|
+
msgstr "इसे पूरा होने में कई मिनट लग सकते हैं।"
|
|
89
|
+
|
|
90
|
+
#: static/html/main.html:80
|
|
91
|
+
msgid ""
|
|
92
|
+
"In a timed exam, the timer will continue to run while your environment is "
|
|
93
|
+
"being reset."
|
|
94
|
+
msgstr "एक समयबद्ध परीक्षा में, टाइमर तब तक चलता रहेगा जब तक कि आपका वातावरण "
|
|
95
|
+
"रीसेट किया जा रहा है।"
|
|
96
|
+
|
|
97
|
+
#: static/html/main.html:82
|
|
98
|
+
msgid ""
|
|
99
|
+
"After you reset, you will need to retrace your steps up to this point. This "
|
|
100
|
+
"includes redoing any previous labs you have already completed."
|
|
101
|
+
msgstr ""
|
|
102
|
+
"रीसेट करने के बाद, आपको यहाँ तक पहुँचने के सभी चरण फिर से पूरे करने होंगे। "
|
|
103
|
+
"इसमें वे सभी पिछली प्रयोगशालाएँ भी शामिल हैं जो आप पहले ही पूरी कर चुके हैं। "
|
|
104
|
+
|
|
105
|
+
#: static/html/main.html:84
|
|
106
|
+
msgid "You cannot undo this action."
|
|
107
|
+
msgstr "आप इस क्रिया को पूर्ववत नहीं कर सकते।"
|
|
108
|
+
|
|
109
|
+
#: tasks.py:194
|
|
110
|
+
msgid "You've reached the time limit allocated to you for using labs."
|
|
111
|
+
msgstr "आप प्रयोगशालाओं का उपयोग करने के लिए आपको आवंटित समय सीमा तक पहुँच चुके हैं।"
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# edX translation file.
|
|
2
|
+
# Copyright (C) 2026 EdX
|
|
3
|
+
# This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE.
|
|
4
|
+
# EdX Team <info@edx.org>, 2026.
|
|
5
|
+
#
|
|
6
|
+
msgid ""
|
|
7
|
+
msgstr ""
|
|
8
|
+
"Project-Id-Version: 0.1a\n"
|
|
9
|
+
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
|
|
10
|
+
"POT-Creation-Date: 2023-06-13 08:00+0000\n"
|
|
11
|
+
"PO-Revision-Date: 2023-06-13 09:00+0000\n"
|
|
12
|
+
"Last-Translator: \n"
|
|
13
|
+
"Language-Team: openedx-translation <openedx-translation@googlegroups.com>\n"
|
|
14
|
+
"Language: en\n"
|
|
15
|
+
"MIME-Version: 1.0\n"
|
|
16
|
+
"Content-Type: text/plain; charset=UTF-8\n"
|
|
17
|
+
"Content-Transfer-Encoding: 8bit\n"
|
|
18
|
+
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
19
|
+
|
|
20
|
+
#: public/js/main.js:115
|
|
21
|
+
msgid ""
|
|
22
|
+
"Could not connect to your lab environment. The client detected an unexpected"
|
|
23
|
+
" error. The server's error message was:"
|
|
24
|
+
msgstr "सर्वर का त्रुटि संदेश था:"
|
|
25
|
+
|
|
26
|
+
#: public/js/main.js:127
|
|
27
|
+
msgid "Lost connection to your lab environment."
|
|
28
|
+
msgstr "आपके प्रयोगशाला वातावरण से संबंध टूट गया।"
|
|
29
|
+
|
|
30
|
+
#: public/js/main.js:129
|
|
31
|
+
msgid ""
|
|
32
|
+
"The remote server unexpectedly disconnected. You can try closing your "
|
|
33
|
+
"browser window, and returning to this page in a few minutes."
|
|
34
|
+
msgstr ""
|
|
35
|
+
"दूरस्थ सर्वर अनपेक्षित रूप से डिस्कनेक्ट हो गया. आप अपनी "
|
|
36
|
+
"ब्राउज़र विंडो' को बंद करने और कुछ ही मिनटों में इस पृष्ठ पर लौटने का प्रयास कर सकते हैं।"
|
|
37
|
+
|
|
38
|
+
#: public/js/main.js:151
|
|
39
|
+
msgid "Your lab is currently active in a separate window."
|
|
40
|
+
msgstr "आपकी प्रयोगशाला वर्तमान में एक अलग विंडो में सक्रिय है।"
|
|
41
|
+
|
|
42
|
+
#: public/js/main.js:292
|
|
43
|
+
msgid "Attention!"
|
|
44
|
+
msgstr "ध्यान!"
|
|
45
|
+
|
|
46
|
+
#: public/js/main.js:307
|
|
47
|
+
msgid "Could not connect to your lab environment:"
|
|
48
|
+
msgstr "आपके प्रयोगशाला परिवेश से कनेक्ट नहीं हो सका:"
|
|
49
|
+
|
|
50
|
+
#: public/js/main.js:332
|
|
51
|
+
msgid "Your lab environment is undergoing maintenance"
|
|
52
|
+
msgstr "आपके प्रयोगशाला वातावरण का रखरखाव किया जा रहा है"
|
|
53
|
+
|
|
54
|
+
#: public/js/main.js:334
|
|
55
|
+
msgid ""
|
|
56
|
+
"Your lab environment is undergoing automatic maintenance. Please try again "
|
|
57
|
+
"in a few minutes."
|
|
58
|
+
msgstr ""
|
|
59
|
+
"आपका प्रयोगशाला वातावरण स्वचालित रखरखाव के दौर से गुजर रहा है। कृपया पुन: प्रयास करें "
|
|
60
|
+
"कुछ मिनटों में।"
|
|
61
|
+
|
|
62
|
+
#: public/js/main.js:349
|
|
63
|
+
msgid "There was a problem preparing your lab environment:"
|
|
64
|
+
msgstr "आपकी प्रयोगशाला के वातावरण को तैयार करने में कोई समस्या थी:"
|
|
65
|
+
|
|
66
|
+
#: public/js/main.js:394
|
|
67
|
+
msgid "You completed {passed} out of {total} tasks."
|
|
68
|
+
msgstr "आपने {passed} कार्यों में से {total} कर लिए हैं।"
|
|
69
|
+
|
|
70
|
+
#: public/js/main.js:448
|
|
71
|
+
msgid "Type {code} to reset your lab."
|
|
72
|
+
msgstr "अपनी प्रयोगशाला रीसेट करने के लिए {code} टाइप करें।"
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from django.core.management.base import BaseCommand
|
|
2
|
+
from apscheduler.schedulers.blocking import BlockingScheduler
|
|
3
|
+
|
|
4
|
+
from stackamole.common import get_xblock_settings
|
|
5
|
+
from stackamole.jobs import ReaperJob
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Command(BaseCommand):
|
|
9
|
+
help = """Automates the deletion of stale stacks, i.e. those that have not
|
|
10
|
+
been resumed in a configurable time period"""
|
|
11
|
+
|
|
12
|
+
def handle(self, *args, **options):
|
|
13
|
+
# Get configuration
|
|
14
|
+
settings = get_xblock_settings()
|
|
15
|
+
|
|
16
|
+
# Schedule
|
|
17
|
+
scheduler = BlockingScheduler()
|
|
18
|
+
job = ReaperJob(settings)
|
|
19
|
+
interval = settings.get("delete_interval", 3600)
|
|
20
|
+
scheduler.add_job(job.run, 'interval', seconds=interval)
|
|
21
|
+
scheduler.start()
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from django.core.management.base import BaseCommand
|
|
2
|
+
from apscheduler.schedulers.blocking import BlockingScheduler
|
|
3
|
+
|
|
4
|
+
from stackamole.common import get_xblock_settings
|
|
5
|
+
from stackamole.jobs import SuspenderJob
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Command(BaseCommand):
|
|
9
|
+
help = 'Suspends stacks automatically'
|
|
10
|
+
|
|
11
|
+
def handle(self, *args, **options):
|
|
12
|
+
# Get configuration
|
|
13
|
+
settings = get_xblock_settings()
|
|
14
|
+
|
|
15
|
+
# Schedule
|
|
16
|
+
scheduler = BlockingScheduler()
|
|
17
|
+
suspender = SuspenderJob(settings)
|
|
18
|
+
interval = settings.get("suspend_interval", 60)
|
|
19
|
+
scheduler.add_job(suspender.run, 'interval', seconds=interval)
|
|
20
|
+
scheduler.start()
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
from __future__ import unicode_literals
|
|
3
|
+
|
|
4
|
+
from django.db import migrations, models
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Migration(migrations.Migration):
|
|
8
|
+
|
|
9
|
+
dependencies = [
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
operations = [
|
|
13
|
+
migrations.CreateModel(
|
|
14
|
+
name='Stack',
|
|
15
|
+
fields=[
|
|
16
|
+
('id', models.AutoField(verbose_name='ID', serialize=False,
|
|
17
|
+
auto_created=True, primary_key=True)),
|
|
18
|
+
('name', models.CharField(max_length=64, db_index=True)),
|
|
19
|
+
('student_id', models.CharField(max_length=40, db_index=True)),
|
|
20
|
+
('course_id', models.CharField(max_length=50, db_index=True)),
|
|
21
|
+
('provider', models.CharField(max_length=32)),
|
|
22
|
+
('protocol', models.CharField(max_length=32)),
|
|
23
|
+
('port', models.IntegerField(null=True)),
|
|
24
|
+
('status', models.CharField(max_length=32, db_index=True)),
|
|
25
|
+
('error_msg', models.CharField(max_length=256)),
|
|
26
|
+
('ip', models.GenericIPAddressField(null=True)),
|
|
27
|
+
('user', models.CharField(max_length=32)),
|
|
28
|
+
('key', models.TextField()),
|
|
29
|
+
('password', models.CharField(max_length=128)),
|
|
30
|
+
('launch_task_id', models.CharField(max_length=40)),
|
|
31
|
+
('launch_timestamp', models.DateTimeField(null=True,
|
|
32
|
+
db_index=True)),
|
|
33
|
+
('suspend_timestamp', models.DateTimeField(null=True,
|
|
34
|
+
db_index=True)),
|
|
35
|
+
('created_on', models.DateTimeField(auto_now_add=True,
|
|
36
|
+
db_index=True)),
|
|
37
|
+
],
|
|
38
|
+
),
|
|
39
|
+
migrations.AlterUniqueTogether(
|
|
40
|
+
name='stack',
|
|
41
|
+
unique_together=set([('student_id', 'course_id', 'name')]),
|
|
42
|
+
),
|
|
43
|
+
]
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
from __future__ import unicode_literals
|
|
3
|
+
|
|
4
|
+
from django.db import migrations, models
|
|
5
|
+
import django.db.models.deletion
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Migration(migrations.Migration):
|
|
9
|
+
|
|
10
|
+
dependencies = [
|
|
11
|
+
('stackamole', '0001_initial'),
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
operations = [
|
|
15
|
+
migrations.CreateModel(
|
|
16
|
+
name='StackLog',
|
|
17
|
+
fields=[
|
|
18
|
+
('id', models.AutoField(verbose_name='ID', serialize=False,
|
|
19
|
+
auto_created=True, primary_key=True)),
|
|
20
|
+
('name', models.CharField(max_length=64, db_index=True)),
|
|
21
|
+
('student_id', models.CharField(max_length=40,
|
|
22
|
+
db_index=True)),
|
|
23
|
+
('course_id', models.CharField(max_length=50, db_index=True)),
|
|
24
|
+
('provider', models.CharField(max_length=32)),
|
|
25
|
+
('protocol', models.CharField(max_length=32)),
|
|
26
|
+
('port', models.IntegerField(null=True)),
|
|
27
|
+
('status', models.CharField(max_length=32, db_index=True)),
|
|
28
|
+
('error_msg', models.CharField(max_length=256)),
|
|
29
|
+
('ip', models.GenericIPAddressField(null=True)),
|
|
30
|
+
('user', models.CharField(max_length=32)),
|
|
31
|
+
('launch_task_id', models.CharField(max_length=40)),
|
|
32
|
+
('launch_timestamp', models.DateTimeField(null=True,
|
|
33
|
+
db_index=True)),
|
|
34
|
+
('suspend_timestamp', models.DateTimeField(null=True,
|
|
35
|
+
db_index=True)),
|
|
36
|
+
('created_on', models.DateTimeField(auto_now_add=True,
|
|
37
|
+
db_index=True)),
|
|
38
|
+
('stack', models.ForeignKey(
|
|
39
|
+
on_delete=django.db.models.deletion.SET_NULL,
|
|
40
|
+
to='stackamole.Stack', null=True)
|
|
41
|
+
),
|
|
42
|
+
],
|
|
43
|
+
options={
|
|
44
|
+
'abstract': False,
|
|
45
|
+
},
|
|
46
|
+
),
|
|
47
|
+
]
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
from __future__ import unicode_literals
|
|
3
|
+
|
|
4
|
+
from django.db import migrations, models
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Migration(migrations.Migration):
|
|
8
|
+
|
|
9
|
+
dependencies = [
|
|
10
|
+
('stackamole', '0002_stacklog'),
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
operations = [
|
|
14
|
+
migrations.AlterField(
|
|
15
|
+
model_name='stack',
|
|
16
|
+
name='error_msg',
|
|
17
|
+
field=models.CharField(max_length=256, blank=True),
|
|
18
|
+
),
|
|
19
|
+
migrations.AlterField(
|
|
20
|
+
model_name='stack',
|
|
21
|
+
name='key',
|
|
22
|
+
field=models.TextField(blank=True),
|
|
23
|
+
),
|
|
24
|
+
migrations.AlterField(
|
|
25
|
+
model_name='stack',
|
|
26
|
+
name='launch_task_id',
|
|
27
|
+
field=models.CharField(max_length=40, blank=True),
|
|
28
|
+
),
|
|
29
|
+
migrations.AlterField(
|
|
30
|
+
model_name='stack',
|
|
31
|
+
name='password',
|
|
32
|
+
field=models.CharField(max_length=128, blank=True),
|
|
33
|
+
),
|
|
34
|
+
migrations.AlterField(
|
|
35
|
+
model_name='stack',
|
|
36
|
+
name='protocol',
|
|
37
|
+
field=models.CharField(max_length=32, blank=True),
|
|
38
|
+
),
|
|
39
|
+
migrations.AlterField(
|
|
40
|
+
model_name='stack',
|
|
41
|
+
name='provider',
|
|
42
|
+
field=models.CharField(max_length=32, blank=True),
|
|
43
|
+
),
|
|
44
|
+
migrations.AlterField(
|
|
45
|
+
model_name='stack',
|
|
46
|
+
name='status',
|
|
47
|
+
field=models.CharField(db_index=True, max_length=32, blank=True),
|
|
48
|
+
),
|
|
49
|
+
migrations.AlterField(
|
|
50
|
+
model_name='stack',
|
|
51
|
+
name='user',
|
|
52
|
+
field=models.CharField(max_length=32, blank=True),
|
|
53
|
+
),
|
|
54
|
+
migrations.AlterField(
|
|
55
|
+
model_name='stacklog',
|
|
56
|
+
name='error_msg',
|
|
57
|
+
field=models.CharField(max_length=256, blank=True),
|
|
58
|
+
),
|
|
59
|
+
migrations.AlterField(
|
|
60
|
+
model_name='stacklog',
|
|
61
|
+
name='launch_task_id',
|
|
62
|
+
field=models.CharField(max_length=40, blank=True),
|
|
63
|
+
),
|
|
64
|
+
migrations.AlterField(
|
|
65
|
+
model_name='stacklog',
|
|
66
|
+
name='protocol',
|
|
67
|
+
field=models.CharField(max_length=32, blank=True),
|
|
68
|
+
),
|
|
69
|
+
migrations.AlterField(
|
|
70
|
+
model_name='stacklog',
|
|
71
|
+
name='provider',
|
|
72
|
+
field=models.CharField(max_length=32, blank=True),
|
|
73
|
+
),
|
|
74
|
+
migrations.AlterField(
|
|
75
|
+
model_name='stacklog',
|
|
76
|
+
name='status',
|
|
77
|
+
field=models.CharField(db_index=True, max_length=32, blank=True),
|
|
78
|
+
),
|
|
79
|
+
migrations.AlterField(
|
|
80
|
+
model_name='stacklog',
|
|
81
|
+
name='user',
|
|
82
|
+
field=models.CharField(max_length=32, blank=True),
|
|
83
|
+
),
|
|
84
|
+
]
|