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.
Files changed (89) hide show
  1. fake/common/djangoapps/student/__init__.py +0 -0
  2. fake/common/djangoapps/student/models.py +15 -0
  3. fake/course/__init__.py +0 -0
  4. requirements/base.txt +25 -0
  5. requirements/flake8.txt +1 -0
  6. requirements/setup.txt +3 -0
  7. requirements/test.txt +19 -0
  8. samples/hot/sample-template.yaml +427 -0
  9. src/pip-delete-this-directory.txt +5 -0
  10. stackamole/__init__.py +8 -0
  11. stackamole/admin.py +130 -0
  12. stackamole/common.py +423 -0
  13. stackamole/jobs.py +211 -0
  14. stackamole/locale/config.yaml +14 -0
  15. stackamole/locale/de_DE/LC_MESSAGES/django.po +109 -0
  16. stackamole/locale/de_DE/LC_MESSAGES/djangojs.po +68 -0
  17. stackamole/locale/el/LC_MESSAGES/django.po +113 -0
  18. stackamole/locale/el/LC_MESSAGES/djangojs.po +77 -0
  19. stackamole/locale/en/LC_MESSAGES/django.po +107 -0
  20. stackamole/locale/en/LC_MESSAGES/djangojs.po +68 -0
  21. stackamole/locale/es_419/LC_MESSAGES/django.po +109 -0
  22. stackamole/locale/es_419/LC_MESSAGES/djangojs.po +68 -0
  23. stackamole/locale/et_EE/LC_MESSAGES/django.po +110 -0
  24. stackamole/locale/et_EE/LC_MESSAGES/djangojs.po +68 -0
  25. stackamole/locale/hi/LC_MESSAGES/django.po +111 -0
  26. stackamole/locale/hi/LC_MESSAGES/djangojs.po +72 -0
  27. stackamole/management/__init__.py +0 -0
  28. stackamole/management/commands/__init__.py +0 -0
  29. stackamole/management/commands/reaper.py +21 -0
  30. stackamole/management/commands/suspender.py +20 -0
  31. stackamole/migrations/0001_initial.py +43 -0
  32. stackamole/migrations/0002_stacklog.py +47 -0
  33. stackamole/migrations/0003_blanks.py +84 -0
  34. stackamole/migrations/0004_auto_20190715_1053.py +24 -0
  35. stackamole/migrations/0005_auto_20190811_1555.py +56 -0
  36. stackamole/migrations/0006_auto_20200107_1332.py +44 -0
  37. stackamole/migrations/0007_add_delete_by_and_delete_age.py +34 -0
  38. stackamole/migrations/0008_add_database_defaults_for_stack_key_and_password.py +23 -0
  39. stackamole/migrations/0009_add_null_true_for_key_and_password.py +23 -0
  40. stackamole/migrations/0010_add_user_foreign_key.py +52 -0
  41. stackamole/migrations/0011_allow_null_for_learner.py +29 -0
  42. stackamole/migrations/0012_add_suspend_by.py +21 -0
  43. stackamole/migrations/0013_migrate_app_label.py +71 -0
  44. stackamole/migrations/__init__.py +0 -0
  45. stackamole/models.py +106 -0
  46. stackamole/openstack.py +132 -0
  47. stackamole/provider.py +437 -0
  48. stackamole/public/css/main.css +203 -0
  49. stackamole/public/js/client.js +269 -0
  50. stackamole/public/js/guacamole-common-js/0.9.13-incubating-all.min.js +1 -0
  51. stackamole/public/js/guacamole-common-js/1.4.0-all.min.js +155 -0
  52. stackamole/public/js/guacamole-common-js/1.5.2-all.min.js +161 -0
  53. stackamole/public/js/guacamole-common-js/1.5.4-all.min.js +161 -0
  54. stackamole/public/js/guacamole-common-js/1.5.5-all.min.js +161 -0
  55. stackamole/public/js/main.js +492 -0
  56. stackamole/public/js/plugins.js +95 -0
  57. stackamole/stackamole.py +1226 -0
  58. stackamole/static/html/lab.html +88 -0
  59. stackamole/static/html/main.html +93 -0
  60. stackamole/tasks.py +947 -0
  61. stackamole_guacamole_client/__init__.py +0 -0
  62. stackamole_guacamole_client/asgi.py +26 -0
  63. stackamole_guacamole_client/consumers.py +95 -0
  64. stackamole_guacamole_client/settings.py +87 -0
  65. stackamole_xblock-9.4.0.dist-info/METADATA +647 -0
  66. stackamole_xblock-9.4.0.dist-info/RECORD +89 -0
  67. stackamole_xblock-9.4.0.dist-info/WHEEL +5 -0
  68. stackamole_xblock-9.4.0.dist-info/entry_points.txt +3 -0
  69. stackamole_xblock-9.4.0.dist-info/licenses/LICENSE +661 -0
  70. stackamole_xblock-9.4.0.dist-info/top_level.txt +7 -0
  71. tests/__init__.py +0 -0
  72. tests/resources/course/stackamole/fake_lab_1.xml +9 -0
  73. tests/resources/course/stackamole/fake_lab_2.xml +9 -0
  74. tests/resources/course/stackamole/fake_lab_hook_events_1.xml +4 -0
  75. tests/resources/course/stackamole/fake_lab_hook_events_2.xml +3 -0
  76. tests/resources/course/stackamole/fake_lab_no_port_name.xml +3 -0
  77. tests/resources/course/stackamole/fake_lab_no_port_number.xml +3 -0
  78. tests/resources/course/stackamole/fake_lab_no_provider_capacity.xml +5 -0
  79. tests/resources/course/stackamole/fake_lab_no_provider_name.xml +3 -0
  80. tests/unit/__init__.py +0 -0
  81. tests/unit/test_admin.py +170 -0
  82. tests/unit/test_commands.py +31 -0
  83. tests/unit/test_common.py +307 -0
  84. tests/unit/test_jobs.py +649 -0
  85. tests/unit/test_models.py +72 -0
  86. tests/unit/test_openstack.py +149 -0
  87. tests/unit/test_provider.py +847 -0
  88. tests/unit/test_stackamole.py +1664 -0
  89. 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
+ ]