From 10fdd0a4247e8c4a7ea2a27d97894d2de8ba3759 Mon Sep 17 00:00:00 2001 From: Ryan Karyadiputera Date: Sun, 16 May 2021 13:46:19 +0700 Subject: [PATCH] test3 --- new/.dockerignore | 9 - new/.gitignore | 260 - new/.gitlab-ci.yml | 40 - new/Dockerfile | 19 - new/Procfile | 2 - new/README.md | 62 - new/api_tester.py | 197 - new/authentication/__init__.py | 0 new/authentication/admin.py | 61 - new/authentication/apps.py | 6 - new/authentication/cas_wrapper.py | 88 - new/authentication/manualSSO.py | 58 - new/authentication/migrations/0001_initial.py | 121 - new/authentication/migrations/0002_config.py | 25 - .../migrations/0003_auto_20201113_0949.py | 20 - .../migrations/0004_delete_user.py | 16 - new/authentication/migrations/__init__.py | 0 new/authentication/models.py | 178 - new/authentication/role.py | 9 - new/authentication/serializers.py | 263 - new/authentication/static/sso/kodoru.json | 3857 ------ new/authentication/tests.py | 1031 -- new/authentication/urls.py | 24 - new/authentication/views.py | 304 - new/core/__init__.py | 0 new/core/admin.py | 3 - new/core/apps.py | 5 - new/core/errors/views.py | 22 - new/core/migrations/__init__.py | 0 new/core/models.py | 3 - new/core/tests.py | 3 - new/core/views.py | 16 - new/db.json | 1 - new/db2.json | 1 - new/docker-compose.yml | 31 - new/docker-entrypoint.sh | 7 - new/fixtures.json | 1 - new/laporan_praktikum/__init__.py | 0 new/laporan_praktikum/admin.py | 41 - new/laporan_praktikum/apps.py | 5 - .../custom_module/__init__.py | 0 .../custom_module/parse_time.py | 8 - .../error_message/__init__.py | 0 .../error_message/error_message.py | 9 - .../migrations/0001_initial.py | 113 - .../migrations/0002_auto_20200603_1450.py | 29 - .../migrations/0003_auto_20200603_1451.py | 47 - .../migrations/0004_auto_20200603_1455.py | 32 - .../migrations/0005_auto_20200603_1944.py | 29 - new/laporan_praktikum/migrations/__init__.py | 0 new/laporan_praktikum/models.py | 155 - new/laporan_praktikum/serializers.py | 474 - .../supervisor_lembaga/__init__.py | 0 .../supervisor_lembaga/views_supv_lembaga.py | 199 - .../supervisor_sekolah/__init__.py | 0 .../supervisor_sekolah/views.py | 178 - new/laporan_praktikum/tests/__init__.py | 0 new/laporan_praktikum/tests/test_model.py | 380 - .../tests/test_serializers.py | 0 new/laporan_praktikum/tests/test_views.py | 1195 -- new/laporan_praktikum/urls.py | 286 - new/laporan_praktikum/views.py | 2718 ---- new/laporan_praktikum/views_riwayat.py | 764 -- new/lembaga/__init__.py | 0 new/lembaga/admin.py | 8 - new/lembaga/apps.py | 7 - new/lembaga/migrations/0001_initial.py | 45 - .../migrations/0002_auto_20200604_0324.py | 23 - new/lembaga/migrations/0003_carousel.py | 20 - .../migrations/0004_auto_20201105_2133.py | 20 - new/lembaga/migrations/0005_errormessage.py | 19 - .../migrations/0006_auto_20210425_2225.py | 11 - new/lembaga/migrations/__init__.py | 0 new/lembaga/models.py | 46 - new/lembaga/serializers.py | 104 - new/lembaga/tests.py | 270 - new/lembaga/urls.py | 12 - new/lembaga/views.py | 74 - new/manage.py | 21 - new/migrate.sh | 3 - new/requirements.txt | 98 - new/seeder_dev.py | 493 - new/seeder_staging.py | 484 - new/server-setup.sh | 39 - new/setup.cfg | 4 - new/sip/__init__.py | 0 new/sip/asgi.py | 16 - new/sip/settings/.env.example | 10 - new/sip/settings/dev.py | 235 - new/sip/settings/production.py | 237 - new/sip/settings/staging.py | 250 - .../static/admin/css/autocomplete.css | 260 - new/sip/settings/static/admin/css/base.css | 966 -- .../settings/static/admin/css/changelists.css | 354 - .../settings/static/admin/css/dashboard.css | 26 - new/sip/settings/static/admin/css/fonts.css | 20 - new/sip/settings/static/admin/css/forms.css | 527 - new/sip/settings/static/admin/css/login.css | 79 - .../settings/static/admin/css/nav_sidebar.css | 119 - .../settings/static/admin/css/responsive.css | 1004 -- .../static/admin/css/responsive_rtl.css | 80 - new/sip/settings/static/admin/css/rtl.css | 249 - .../css/vendor/select2/LICENSE-SELECT2.md | 21 - .../admin/css/vendor/select2/select2.css | 481 - .../admin/css/vendor/select2/select2.min.css | 1 - new/sip/settings/static/admin/css/widgets.css | 574 - .../settings/static/admin/fonts/LICENSE.txt | 202 - .../settings/static/admin/fonts/README.txt | 3 - .../admin/fonts/Roboto-Bold-webfont.woff | Bin 86184 -> 0 bytes .../admin/fonts/Roboto-Light-webfont.woff | Bin 85692 -> 0 bytes .../admin/fonts/Roboto-Regular-webfont.woff | Bin 85876 -> 0 bytes new/sip/settings/static/admin/img/LICENSE | 20 - new/sip/settings/static/admin/img/README.txt | 7 - .../static/admin/img/calendar-icons.svg | 14 - .../static/admin/img/gis/move_vertex_off.svg | 1 - .../static/admin/img/gis/move_vertex_on.svg | 1 - .../static/admin/img/icon-addlink.svg | 3 - .../settings/static/admin/img/icon-alert.svg | 3 - .../static/admin/img/icon-calendar.svg | 9 - .../static/admin/img/icon-changelink.svg | 3 - .../settings/static/admin/img/icon-clock.svg | 9 - .../static/admin/img/icon-deletelink.svg | 3 - new/sip/settings/static/admin/img/icon-no.svg | 3 - .../static/admin/img/icon-unknown-alt.svg | 3 - .../static/admin/img/icon-unknown.svg | 3 - .../static/admin/img/icon-viewlink.svg | 3 - .../settings/static/admin/img/icon-yes.svg | 3 - .../static/admin/img/inline-delete.svg | 3 - new/sip/settings/static/admin/img/search.svg | 3 - .../static/admin/img/selector-icons.svg | 34 - .../static/admin/img/sorting-icons.svg | 19 - .../settings/static/admin/img/tooltag-add.svg | 3 - .../static/admin/img/tooltag-arrowright.svg | 3 - new/sip/settings/static/admin/js/SelectBox.js | 110 - .../settings/static/admin/js/SelectFilter2.js | 236 - new/sip/settings/static/admin/js/actions.js | 154 - .../settings/static/admin/js/actions.min.js | 7 - .../admin/js/admin/DateTimeShortcuts.js | 417 - .../admin/js/admin/RelatedObjectLookups.js | 159 - .../settings/static/admin/js/autocomplete.js | 38 - new/sip/settings/static/admin/js/calendar.js | 207 - new/sip/settings/static/admin/js/cancel.js | 28 - .../settings/static/admin/js/change_form.js | 16 - new/sip/settings/static/admin/js/collapse.js | 43 - .../settings/static/admin/js/collapse.min.js | 2 - new/sip/settings/static/admin/js/core.js | 163 - new/sip/settings/static/admin/js/inlines.js | 348 - .../settings/static/admin/js/inlines.min.js | 11 - .../settings/static/admin/js/jquery.init.js | 8 - .../settings/static/admin/js/nav_sidebar.js | 39 - .../static/admin/js/popup_response.js | 16 - .../settings/static/admin/js/prepopulate.js | 43 - .../static/admin/js/prepopulate.min.js | 1 - .../static/admin/js/prepopulate_init.js | 11 - new/sip/settings/static/admin/js/urlify.js | 185 - .../static/admin/js/vendor/jquery/LICENSE.txt | 20 - .../static/admin/js/vendor/jquery/jquery.js | 10872 ---------------- .../admin/js/vendor/jquery/jquery.min.js | 2 - .../static/admin/js/vendor/select2/LICENSE.md | 21 - .../static/admin/js/vendor/select2/i18n/af.js | 3 - .../static/admin/js/vendor/select2/i18n/ar.js | 3 - .../static/admin/js/vendor/select2/i18n/az.js | 3 - .../static/admin/js/vendor/select2/i18n/bg.js | 3 - .../static/admin/js/vendor/select2/i18n/bn.js | 3 - .../static/admin/js/vendor/select2/i18n/bs.js | 3 - .../static/admin/js/vendor/select2/i18n/ca.js | 3 - .../static/admin/js/vendor/select2/i18n/cs.js | 3 - .../static/admin/js/vendor/select2/i18n/da.js | 3 - .../static/admin/js/vendor/select2/i18n/de.js | 3 - .../admin/js/vendor/select2/i18n/dsb.js | 3 - .../static/admin/js/vendor/select2/i18n/el.js | 3 - .../static/admin/js/vendor/select2/i18n/en.js | 3 - .../static/admin/js/vendor/select2/i18n/es.js | 3 - .../static/admin/js/vendor/select2/i18n/et.js | 3 - .../static/admin/js/vendor/select2/i18n/eu.js | 3 - .../static/admin/js/vendor/select2/i18n/fa.js | 3 - .../static/admin/js/vendor/select2/i18n/fi.js | 3 - .../static/admin/js/vendor/select2/i18n/fr.js | 3 - .../static/admin/js/vendor/select2/i18n/gl.js | 3 - .../static/admin/js/vendor/select2/i18n/he.js | 3 - .../static/admin/js/vendor/select2/i18n/hi.js | 3 - .../static/admin/js/vendor/select2/i18n/hr.js | 3 - .../admin/js/vendor/select2/i18n/hsb.js | 3 - .../static/admin/js/vendor/select2/i18n/hu.js | 3 - .../static/admin/js/vendor/select2/i18n/hy.js | 3 - .../static/admin/js/vendor/select2/i18n/id.js | 3 - .../static/admin/js/vendor/select2/i18n/is.js | 3 - .../static/admin/js/vendor/select2/i18n/it.js | 3 - .../static/admin/js/vendor/select2/i18n/ja.js | 3 - .../static/admin/js/vendor/select2/i18n/ka.js | 3 - .../static/admin/js/vendor/select2/i18n/km.js | 3 - .../static/admin/js/vendor/select2/i18n/ko.js | 3 - .../static/admin/js/vendor/select2/i18n/lt.js | 3 - .../static/admin/js/vendor/select2/i18n/lv.js | 3 - .../static/admin/js/vendor/select2/i18n/mk.js | 3 - .../static/admin/js/vendor/select2/i18n/ms.js | 3 - .../static/admin/js/vendor/select2/i18n/nb.js | 3 - .../static/admin/js/vendor/select2/i18n/ne.js | 3 - .../static/admin/js/vendor/select2/i18n/nl.js | 3 - .../static/admin/js/vendor/select2/i18n/pl.js | 3 - .../static/admin/js/vendor/select2/i18n/ps.js | 3 - .../admin/js/vendor/select2/i18n/pt-BR.js | 3 - .../static/admin/js/vendor/select2/i18n/pt.js | 3 - .../static/admin/js/vendor/select2/i18n/ro.js | 3 - .../static/admin/js/vendor/select2/i18n/ru.js | 3 - .../static/admin/js/vendor/select2/i18n/sk.js | 3 - .../static/admin/js/vendor/select2/i18n/sl.js | 3 - .../static/admin/js/vendor/select2/i18n/sq.js | 3 - .../admin/js/vendor/select2/i18n/sr-Cyrl.js | 3 - .../static/admin/js/vendor/select2/i18n/sr.js | 3 - .../static/admin/js/vendor/select2/i18n/sv.js | 3 - .../static/admin/js/vendor/select2/i18n/th.js | 3 - .../static/admin/js/vendor/select2/i18n/tk.js | 3 - .../static/admin/js/vendor/select2/i18n/tr.js | 3 - .../static/admin/js/vendor/select2/i18n/uk.js | 3 - .../static/admin/js/vendor/select2/i18n/vi.js | 3 - .../admin/js/vendor/select2/i18n/zh-CN.js | 3 - .../admin/js/vendor/select2/i18n/zh-TW.js | 3 - .../admin/js/vendor/select2/select2.full.js | 6820 ---------- .../js/vendor/select2/select2.full.min.js | 2 - .../admin/js/vendor/xregexp/LICENSE.txt | 21 - .../static/admin/js/vendor/xregexp/xregexp.js | 4652 ------- .../admin/js/vendor/xregexp/xregexp.min.js | 160 - .../settings/static/drf-yasg/immutable.min.js | 34 - new/sip/settings/static/drf-yasg/insQ.min.js | 4 - .../settings/static/drf-yasg/redoc-init.js | 67 - .../static/drf-yasg/redoc-old/redoc.min.js | 8 - .../static/drf-yasg/redoc/redoc-logo.png | Bin 4969 -> 0 bytes .../static/drf-yasg/redoc/redoc.min.js | 137 - new/sip/settings/static/drf-yasg/style.css | 73 - .../drf-yasg/swagger-ui-dist/absolute-path.js | 14 - .../swagger-ui-dist/favicon-32x32.png | Bin 628 -> 0 bytes .../static/drf-yasg/swagger-ui-dist/index.js | 17 - .../swagger-ui-dist/oauth2-redirect.html | 67 - .../swagger-ui-dist/swagger-ui-bundle.js | 134 - .../swagger-ui-standalone-preset.js | 22 - .../drf-yasg/swagger-ui-dist/swagger-ui.css | 4 - .../static/drf-yasg/swagger-ui-init.js | 385 - .../static/drf-yasg/url-polyfill.min.js | 1 - .../settings/static/makara-ui-fasilkom.png | Bin 26603 -> 0 bytes .../css/bootstrap-theme.min.css | 6 - .../rest_framework/css/bootstrap-tweaks.css | 233 - .../rest_framework/css/bootstrap.min.css | 6 - .../static/rest_framework/css/default.css | 82 - .../rest_framework/css/font-awesome-4.0.3.css | 1338 -- .../static/rest_framework/css/prettify.css | 30 - .../static/rest_framework/docs/css/base.css | 359 - .../rest_framework/docs/css/highlight.css | 125 - .../docs/css/jquery.json-view.min.css | 11 - .../rest_framework/docs/img/favicon.ico | Bin 5430 -> 0 bytes .../static/rest_framework/docs/img/grid.png | Bin 1458 -> 0 bytes .../static/rest_framework/docs/js/api.js | 321 - .../rest_framework/docs/js/highlight.pack.js | 2 - .../docs/js/jquery.json-view.min.js | 7 - .../fonts/fontawesome-webfont.eot | Bin 38205 -> 0 bytes .../fonts/fontawesome-webfont.svg | 414 - .../fonts/fontawesome-webfont.ttf | Bin 80652 -> 0 bytes .../fonts/fontawesome-webfont.woff | Bin 44432 -> 0 bytes .../fonts/glyphicons-halflings-regular.eot | Bin 20127 -> 0 bytes .../fonts/glyphicons-halflings-regular.svg | 288 - .../fonts/glyphicons-halflings-regular.ttf | Bin 45404 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 23424 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 18028 -> 0 bytes .../img/glyphicons-halflings-white.png | Bin 8777 -> 0 bytes .../img/glyphicons-halflings.png | Bin 12762 -> 0 bytes .../static/rest_framework/img/grid.png | Bin 1458 -> 0 bytes .../static/rest_framework/js/ajax-form.js | 127 - .../static/rest_framework/js/bootstrap.min.js | 6 - .../static/rest_framework/js/coreapi-0.1.1.js | 2043 --- .../settings/static/rest_framework/js/csrf.js | 52 - .../static/rest_framework/js/default.js | 47 - .../rest_framework/js/jquery-3.4.1.min.js | 2 - .../static/rest_framework/js/prettify-min.js | 28 - new/sip/settings/static/sso/kodoru.json | 3857 ------ new/sip/settings/storage_backends.py | 6 - new/sip/static/.gitkeep | 1 - new/sip/urls.py | 58 - new/sip/wsgi.py | 16 - new/sonar-project.properties | 31 - new/static/makara-ui-fasilkom.png | Bin 26603 -> 0 bytes new/test.json | 1 - new/testad.json | 102 - old/.dockerignore | 9 - old/.gitignore | 260 - old/.gitlab-ci.yml | 104 - old/Dockerfile | 19 - old/Procfile | 2 - old/README.md | 58 - old/authentication/__init__.py | 0 old/authentication/admin.py | 61 - old/authentication/apps.py | 6 - old/authentication/cas_wrapper.py | 88 - old/authentication/manualSSO.py | 58 - old/authentication/migrations/0001_initial.py | 121 - old/authentication/migrations/0002_config.py | 25 - .../migrations/0003_auto_20201113_0949.py | 20 - .../migrations/0004_delete_user.py | 16 - old/authentication/migrations/__init__.py | 0 old/authentication/models.py | 177 - old/authentication/role.py | 9 - old/authentication/serializers.py | 263 - old/authentication/static/sso/kodoru.json | 3857 ------ old/authentication/tests.py | 1054 -- old/authentication/urls.py | 23 - old/authentication/views.py | 294 - old/core/__init__.py | 0 old/core/admin.py | 3 - old/core/apps.py | 5 - old/core/errors/views.py | 22 - old/core/migrations/__init__.py | 0 old/core/models.py | 3 - old/core/tests.py | 3 - old/core/views.py | 16 - old/db.json | 1 - old/db2.json | 1 - old/docker-compose.yml | 31 - old/docker-entrypoint.sh | 7 - old/fixtures.json | 1 - old/laporan_praktikum/__init__.py | 0 old/laporan_praktikum/admin.py | 41 - old/laporan_praktikum/apps.py | 5 - .../custom_module/__init__.py | 0 .../custom_module/parse_time.py | 8 - .../error_message/__init__.py | 0 .../error_message/error_message.py | 9 - .../migrations/0001_initial.py | 113 - .../migrations/0002_auto_20200603_1450.py | 29 - .../migrations/0003_auto_20200603_1451.py | 47 - .../migrations/0004_auto_20200603_1455.py | 32 - .../migrations/0005_auto_20200603_1944.py | 29 - old/laporan_praktikum/migrations/__init__.py | 0 old/laporan_praktikum/models.py | 155 - old/laporan_praktikum/serializers.py | 474 - .../supervisor_lembaga/__init__.py | 0 .../supervisor_lembaga/views_supv_lembaga.py | 199 - .../supervisor_sekolah/__init__.py | 0 .../supervisor_sekolah/views.py | 178 - old/laporan_praktikum/tests/__init__.py | 0 old/laporan_praktikum/tests/test_model.py | 382 - .../tests/test_serializers.py | 0 old/laporan_praktikum/tests/test_views.py | 1201 -- old/laporan_praktikum/urls.py | 286 - old/laporan_praktikum/views.py | 2710 ---- old/laporan_praktikum/views_riwayat.py | 764 -- old/lembaga/__init__.py | 0 old/lembaga/admin.py | 8 - old/lembaga/apps.py | 7 - old/lembaga/migrations/0001_initial.py | 53 - .../migrations/0002_auto_20200604_0324.py | 28 - old/lembaga/migrations/0003_carousel.py | 20 - .../migrations/0004_auto_20201105_2133.py | 20 - old/lembaga/migrations/__init__.py | 0 old/lembaga/models.py | 49 - old/lembaga/serializers.py | 138 - old/lembaga/tests.py | 301 - old/lembaga/urls.py | 13 - old/lembaga/views.py | 83 - old/manage.py | 21 - old/migrate.sh | 3 - old/new/.dockerignore | 9 - old/new/.gitignore | 260 - old/new/.gitlab-ci.yml | 40 - old/new/Dockerfile | 19 - old/new/Procfile | 1 - old/new/README.md | 62 - old/new/authentication/__init__.py | 0 old/new/authentication/admin.py | 61 - old/new/authentication/apps.py | 6 - old/new/authentication/cas_wrapper.py | 88 - old/new/authentication/manualSSO.py | 58 - old/new/authentication/models.py | 177 - old/new/authentication/role.py | 9 - old/new/authentication/serializers.py | 263 - old/new/authentication/static/sso/kodoru.json | 3857 ------ old/new/authentication/tests.py | 1048 -- old/new/authentication/urls.py | 24 - old/new/authentication/views.py | 304 - old/new/core/__init__.py | 0 old/new/core/admin.py | 3 - old/new/core/apps.py | 5 - old/new/core/errors/views.py | 22 - old/new/core/models.py | 3 - old/new/core/tests.py | 3 - old/new/core/views.py | 16 - old/new/db.json | 1 - old/new/db2.json | 1 - old/new/docker-compose.yml | 31 - old/new/docker-entrypoint.sh | 7 - old/new/fixtures.json | 1 - old/new/laporan_praktikum/__init__.py | 0 old/new/laporan_praktikum/admin.py | 41 - old/new/laporan_praktikum/apps.py | 5 - .../custom_module/__init__.py | 0 .../custom_module/parse_time.py | 8 - .../error_message/__init__.py | 0 .../error_message/error_message.py | 9 - old/new/laporan_praktikum/models.py | 155 - old/new/laporan_praktikum/serializers.py | 474 - .../supervisor_lembaga/__init__.py | 0 .../supervisor_lembaga/views_supv_lembaga.py | 199 - .../supervisor_sekolah/__init__.py | 0 .../supervisor_sekolah/views.py | 178 - old/new/laporan_praktikum/tests/__init__.py | 0 old/new/laporan_praktikum/tests/test_model.py | 382 - .../tests/test_serializers.py | 0 old/new/laporan_praktikum/tests/test_views.py | 1201 -- old/new/laporan_praktikum/urls.py | 286 - old/new/laporan_praktikum/views.py | 2718 ---- old/new/laporan_praktikum/views_riwayat.py | 764 -- old/new/lembaga/__init__.py | 0 old/new/lembaga/admin.py | 9 - old/new/lembaga/apps.py | 7 - old/new/lembaga/models.py | 55 - old/new/lembaga/serializers.py | 142 - old/new/lembaga/tests.py | 301 - old/new/lembaga/urls.py | 13 - old/new/lembaga/views.py | 83 - old/new/manage.py | 21 - old/new/requirements.txt | 98 - old/new/seeder_dev.py | 506 - old/new/seeder_staging.py | 496 - old/new/server-setup.sh | 39 - old/new/setup.cfg | 4 - old/new/sip/__init__.py | 0 old/new/sip/asgi.py | 16 - old/new/sip/settings/.env.example | 10 - old/new/sip/settings/dev.py | 235 - old/new/sip/settings/production.py | 237 - old/new/sip/settings/staging.py | 250 - .../static/admin/css/autocomplete.css | 260 - .../sip/settings/static/admin/css/base.css | 966 -- .../settings/static/admin/css/changelists.css | 354 - .../settings/static/admin/css/dashboard.css | 26 - .../sip/settings/static/admin/css/fonts.css | 20 - .../sip/settings/static/admin/css/forms.css | 527 - .../sip/settings/static/admin/css/login.css | 79 - .../settings/static/admin/css/nav_sidebar.css | 119 - .../settings/static/admin/css/responsive.css | 1004 -- .../static/admin/css/responsive_rtl.css | 80 - old/new/sip/settings/static/admin/css/rtl.css | 249 - .../css/vendor/select2/LICENSE-SELECT2.md | 21 - .../admin/css/vendor/select2/select2.css | 481 - .../admin/css/vendor/select2/select2.min.css | 1 - .../sip/settings/static/admin/css/widgets.css | 574 - .../settings/static/admin/fonts/LICENSE.txt | 202 - .../settings/static/admin/fonts/README.txt | 3 - .../admin/fonts/Roboto-Bold-webfont.woff | Bin 86184 -> 0 bytes .../admin/fonts/Roboto-Light-webfont.woff | Bin 85692 -> 0 bytes .../admin/fonts/Roboto-Regular-webfont.woff | Bin 85876 -> 0 bytes old/new/sip/settings/static/admin/img/LICENSE | 20 - .../sip/settings/static/admin/img/README.txt | 7 - .../static/admin/img/calendar-icons.svg | 14 - .../static/admin/img/gis/move_vertex_off.svg | 1 - .../static/admin/img/gis/move_vertex_on.svg | 1 - .../static/admin/img/icon-addlink.svg | 3 - .../settings/static/admin/img/icon-alert.svg | 3 - .../static/admin/img/icon-calendar.svg | 9 - .../static/admin/img/icon-changelink.svg | 3 - .../settings/static/admin/img/icon-clock.svg | 9 - .../static/admin/img/icon-deletelink.svg | 3 - .../sip/settings/static/admin/img/icon-no.svg | 3 - .../static/admin/img/icon-unknown-alt.svg | 3 - .../static/admin/img/icon-unknown.svg | 3 - .../static/admin/img/icon-viewlink.svg | 3 - .../settings/static/admin/img/icon-yes.svg | 3 - .../static/admin/img/inline-delete.svg | 3 - .../sip/settings/static/admin/img/search.svg | 3 - .../static/admin/img/selector-icons.svg | 34 - .../static/admin/img/sorting-icons.svg | 19 - .../settings/static/admin/img/tooltag-add.svg | 3 - .../static/admin/img/tooltag-arrowright.svg | 3 - .../sip/settings/static/admin/js/SelectBox.js | 110 - .../settings/static/admin/js/SelectFilter2.js | 236 - .../sip/settings/static/admin/js/actions.js | 154 - .../settings/static/admin/js/actions.min.js | 7 - .../admin/js/admin/DateTimeShortcuts.js | 417 - .../admin/js/admin/RelatedObjectLookups.js | 159 - .../settings/static/admin/js/autocomplete.js | 38 - .../sip/settings/static/admin/js/calendar.js | 207 - .../sip/settings/static/admin/js/cancel.js | 28 - .../settings/static/admin/js/change_form.js | 16 - .../sip/settings/static/admin/js/collapse.js | 43 - .../settings/static/admin/js/collapse.min.js | 2 - old/new/sip/settings/static/admin/js/core.js | 163 - .../sip/settings/static/admin/js/inlines.js | 348 - .../settings/static/admin/js/inlines.min.js | 11 - .../settings/static/admin/js/jquery.init.js | 8 - .../settings/static/admin/js/nav_sidebar.js | 39 - .../static/admin/js/popup_response.js | 16 - .../settings/static/admin/js/prepopulate.js | 43 - .../static/admin/js/prepopulate.min.js | 1 - .../static/admin/js/prepopulate_init.js | 11 - .../sip/settings/static/admin/js/urlify.js | 185 - .../static/admin/js/vendor/jquery/LICENSE.txt | 20 - .../static/admin/js/vendor/jquery/jquery.js | 10872 ---------------- .../admin/js/vendor/jquery/jquery.min.js | 2 - .../static/admin/js/vendor/select2/LICENSE.md | 21 - .../static/admin/js/vendor/select2/i18n/af.js | 3 - .../static/admin/js/vendor/select2/i18n/ar.js | 3 - .../static/admin/js/vendor/select2/i18n/az.js | 3 - .../static/admin/js/vendor/select2/i18n/bg.js | 3 - .../static/admin/js/vendor/select2/i18n/bn.js | 3 - .../static/admin/js/vendor/select2/i18n/bs.js | 3 - .../static/admin/js/vendor/select2/i18n/ca.js | 3 - .../static/admin/js/vendor/select2/i18n/cs.js | 3 - .../static/admin/js/vendor/select2/i18n/da.js | 3 - .../static/admin/js/vendor/select2/i18n/de.js | 3 - .../admin/js/vendor/select2/i18n/dsb.js | 3 - .../static/admin/js/vendor/select2/i18n/el.js | 3 - .../static/admin/js/vendor/select2/i18n/en.js | 3 - .../static/admin/js/vendor/select2/i18n/es.js | 3 - .../static/admin/js/vendor/select2/i18n/et.js | 3 - .../static/admin/js/vendor/select2/i18n/eu.js | 3 - .../static/admin/js/vendor/select2/i18n/fa.js | 3 - .../static/admin/js/vendor/select2/i18n/fi.js | 3 - .../static/admin/js/vendor/select2/i18n/fr.js | 3 - .../static/admin/js/vendor/select2/i18n/gl.js | 3 - .../static/admin/js/vendor/select2/i18n/he.js | 3 - .../static/admin/js/vendor/select2/i18n/hi.js | 3 - .../static/admin/js/vendor/select2/i18n/hr.js | 3 - .../admin/js/vendor/select2/i18n/hsb.js | 3 - .../static/admin/js/vendor/select2/i18n/hu.js | 3 - .../static/admin/js/vendor/select2/i18n/hy.js | 3 - .../static/admin/js/vendor/select2/i18n/id.js | 3 - .../static/admin/js/vendor/select2/i18n/is.js | 3 - .../static/admin/js/vendor/select2/i18n/it.js | 3 - .../static/admin/js/vendor/select2/i18n/ja.js | 3 - .../static/admin/js/vendor/select2/i18n/ka.js | 3 - .../static/admin/js/vendor/select2/i18n/km.js | 3 - .../static/admin/js/vendor/select2/i18n/ko.js | 3 - .../static/admin/js/vendor/select2/i18n/lt.js | 3 - .../static/admin/js/vendor/select2/i18n/lv.js | 3 - .../static/admin/js/vendor/select2/i18n/mk.js | 3 - .../static/admin/js/vendor/select2/i18n/ms.js | 3 - .../static/admin/js/vendor/select2/i18n/nb.js | 3 - .../static/admin/js/vendor/select2/i18n/ne.js | 3 - .../static/admin/js/vendor/select2/i18n/nl.js | 3 - .../static/admin/js/vendor/select2/i18n/pl.js | 3 - .../static/admin/js/vendor/select2/i18n/ps.js | 3 - .../admin/js/vendor/select2/i18n/pt-BR.js | 3 - .../static/admin/js/vendor/select2/i18n/pt.js | 3 - .../static/admin/js/vendor/select2/i18n/ro.js | 3 - .../static/admin/js/vendor/select2/i18n/ru.js | 3 - .../static/admin/js/vendor/select2/i18n/sk.js | 3 - .../static/admin/js/vendor/select2/i18n/sl.js | 3 - .../static/admin/js/vendor/select2/i18n/sq.js | 3 - .../admin/js/vendor/select2/i18n/sr-Cyrl.js | 3 - .../static/admin/js/vendor/select2/i18n/sr.js | 3 - .../static/admin/js/vendor/select2/i18n/sv.js | 3 - .../static/admin/js/vendor/select2/i18n/th.js | 3 - .../static/admin/js/vendor/select2/i18n/tk.js | 3 - .../static/admin/js/vendor/select2/i18n/tr.js | 3 - .../static/admin/js/vendor/select2/i18n/uk.js | 3 - .../static/admin/js/vendor/select2/i18n/vi.js | 3 - .../admin/js/vendor/select2/i18n/zh-CN.js | 3 - .../admin/js/vendor/select2/i18n/zh-TW.js | 3 - .../admin/js/vendor/select2/select2.full.js | 6820 ---------- .../js/vendor/select2/select2.full.min.js | 2 - .../admin/js/vendor/xregexp/LICENSE.txt | 21 - .../static/admin/js/vendor/xregexp/xregexp.js | 4652 ------- .../admin/js/vendor/xregexp/xregexp.min.js | 160 - .../settings/static/drf-yasg/immutable.min.js | 34 - .../sip/settings/static/drf-yasg/insQ.min.js | 4 - .../settings/static/drf-yasg/redoc-init.js | 67 - .../static/drf-yasg/redoc-old/redoc.min.js | 8 - .../static/drf-yasg/redoc/redoc-logo.png | Bin 4969 -> 0 bytes .../static/drf-yasg/redoc/redoc.min.js | 137 - .../sip/settings/static/drf-yasg/style.css | 73 - .../drf-yasg/swagger-ui-dist/absolute-path.js | 14 - .../swagger-ui-dist/favicon-32x32.png | Bin 628 -> 0 bytes .../static/drf-yasg/swagger-ui-dist/index.js | 17 - .../swagger-ui-dist/oauth2-redirect.html | 67 - .../swagger-ui-dist/swagger-ui-bundle.js | 134 - .../swagger-ui-standalone-preset.js | 22 - .../drf-yasg/swagger-ui-dist/swagger-ui.css | 4 - .../static/drf-yasg/swagger-ui-init.js | 385 - .../static/drf-yasg/url-polyfill.min.js | 1 - .../settings/static/makara-ui-fasilkom.png | Bin 26603 -> 0 bytes .../css/bootstrap-theme.min.css | 6 - .../rest_framework/css/bootstrap-tweaks.css | 233 - .../rest_framework/css/bootstrap.min.css | 6 - .../static/rest_framework/css/default.css | 82 - .../rest_framework/css/font-awesome-4.0.3.css | 1338 -- .../static/rest_framework/css/prettify.css | 30 - .../static/rest_framework/docs/css/base.css | 359 - .../rest_framework/docs/css/highlight.css | 125 - .../docs/css/jquery.json-view.min.css | 11 - .../rest_framework/docs/img/favicon.ico | Bin 5430 -> 0 bytes .../static/rest_framework/docs/img/grid.png | Bin 1458 -> 0 bytes .../static/rest_framework/docs/js/api.js | 321 - .../rest_framework/docs/js/highlight.pack.js | 2 - .../docs/js/jquery.json-view.min.js | 7 - .../fonts/fontawesome-webfont.eot | Bin 38205 -> 0 bytes .../fonts/fontawesome-webfont.svg | 414 - .../fonts/fontawesome-webfont.ttf | Bin 80652 -> 0 bytes .../fonts/fontawesome-webfont.woff | Bin 44432 -> 0 bytes .../fonts/glyphicons-halflings-regular.eot | Bin 20127 -> 0 bytes .../fonts/glyphicons-halflings-regular.svg | 288 - .../fonts/glyphicons-halflings-regular.ttf | Bin 45404 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 23424 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 18028 -> 0 bytes .../img/glyphicons-halflings-white.png | Bin 8777 -> 0 bytes .../img/glyphicons-halflings.png | Bin 12762 -> 0 bytes .../static/rest_framework/img/grid.png | Bin 1458 -> 0 bytes .../static/rest_framework/js/ajax-form.js | 127 - .../static/rest_framework/js/bootstrap.min.js | 6 - .../static/rest_framework/js/coreapi-0.1.1.js | 2043 --- .../settings/static/rest_framework/js/csrf.js | 52 - .../static/rest_framework/js/default.js | 47 - .../rest_framework/js/jquery-3.4.1.min.js | 2 - .../static/rest_framework/js/prettify-min.js | 28 - old/new/sip/settings/static/sso/kodoru.json | 3857 ------ old/new/sip/settings/storage_backends.py | 6 - old/new/sip/static/.gitkeep | 1 - old/new/sip/urls.py | 58 - old/new/sip/wsgi.py | 16 - old/new/sonar-project.properties | 31 - old/new/static/makara-ui-fasilkom.png | Bin 26603 -> 0 bytes old/new/test.json | 1 - old/old/.dockerignore | 9 - old/old/.gitignore | 260 - old/old/.gitlab-ci.yml | 104 - old/old/Dockerfile | 25 - old/old/Procfile | 1 - old/old/README.md | 58 - old/old/authentication/__init__.py | 0 old/old/authentication/admin.py | 61 - old/old/authentication/apps.py | 6 - old/old/authentication/cas_wrapper.py | 88 - old/old/authentication/manualSSO.py | 58 - old/old/authentication/models.py | 177 - old/old/authentication/role.py | 9 - old/old/authentication/serializers.py | 263 - old/old/authentication/static/sso/kodoru.json | 3857 ------ old/old/authentication/tests.py | 1048 -- old/old/authentication/urls.py | 24 - old/old/authentication/views.py | 304 - old/old/core/__init__.py | 0 old/old/core/admin.py | 3 - old/old/core/apps.py | 5 - old/old/core/errors/views.py | 22 - old/old/core/models.py | 3 - old/old/core/tests.py | 3 - old/old/core/views.py | 16 - old/old/db.json | 1 - old/old/db2.json | 1 - old/old/docker-compose.yml | 31 - old/old/docker-entrypoint.sh | 7 - old/old/fixtures.json | 1 - old/old/laporan_praktikum/__init__.py | 0 old/old/laporan_praktikum/admin.py | 41 - old/old/laporan_praktikum/apps.py | 5 - .../custom_module/__init__.py | 0 .../custom_module/parse_time.py | 8 - .../error_message/__init__.py | 0 .../error_message/error_message.py | 9 - old/old/laporan_praktikum/models.py | 155 - old/old/laporan_praktikum/serializers.py | 474 - .../supervisor_lembaga/__init__.py | 0 .../supervisor_lembaga/views_supv_lembaga.py | 199 - .../supervisor_sekolah/__init__.py | 0 .../supervisor_sekolah/views.py | 178 - old/old/laporan_praktikum/tests/__init__.py | 0 old/old/laporan_praktikum/tests/test_model.py | 382 - .../tests/test_serializers.py | 0 old/old/laporan_praktikum/tests/test_views.py | 1201 -- old/old/laporan_praktikum/urls.py | 286 - old/old/laporan_praktikum/views.py | 2718 ---- old/old/laporan_praktikum/views_riwayat.py | 764 -- old/old/lembaga/__init__.py | 0 old/old/lembaga/admin.py | 8 - old/old/lembaga/apps.py | 7 - old/old/lembaga/models.py | 49 - old/old/lembaga/serializers.py | 138 - old/old/lembaga/tests.py | 301 - old/old/lembaga/urls.py | 13 - old/old/lembaga/views.py | 83 - old/old/manage.py | 21 - old/old/requirements.txt | 99 - old/old/seeder_dev.py | 506 - old/old/seeder_staging.py | 496 - old/old/server-setup.sh | 39 - old/old/setup.cfg | 4 - old/old/sip/__init__.py | 0 old/old/sip/asgi.py | 16 - old/old/sip/settings/.env.example | 4 - old/old/sip/settings/dev.py | 233 - old/old/sip/settings/production.py | 233 - old/old/sip/settings/staging.py | 246 - .../static/admin/css/autocomplete.css | 260 - .../sip/settings/static/admin/css/base.css | 966 -- .../settings/static/admin/css/changelists.css | 354 - .../settings/static/admin/css/dashboard.css | 26 - .../sip/settings/static/admin/css/fonts.css | 20 - .../sip/settings/static/admin/css/forms.css | 527 - .../sip/settings/static/admin/css/login.css | 79 - .../settings/static/admin/css/nav_sidebar.css | 119 - .../settings/static/admin/css/responsive.css | 1004 -- .../static/admin/css/responsive_rtl.css | 80 - old/old/sip/settings/static/admin/css/rtl.css | 249 - .../css/vendor/select2/LICENSE-SELECT2.md | 21 - .../admin/css/vendor/select2/select2.css | 481 - .../admin/css/vendor/select2/select2.min.css | 1 - .../sip/settings/static/admin/css/widgets.css | 574 - .../settings/static/admin/fonts/LICENSE.txt | 202 - .../settings/static/admin/fonts/README.txt | 3 - .../admin/fonts/Roboto-Bold-webfont.woff | Bin 86184 -> 0 bytes .../admin/fonts/Roboto-Light-webfont.woff | Bin 85692 -> 0 bytes .../admin/fonts/Roboto-Regular-webfont.woff | Bin 85876 -> 0 bytes old/old/sip/settings/static/admin/img/LICENSE | 20 - .../sip/settings/static/admin/img/README.txt | 7 - .../static/admin/img/calendar-icons.svg | 14 - .../static/admin/img/gis/move_vertex_off.svg | 1 - .../static/admin/img/gis/move_vertex_on.svg | 1 - .../static/admin/img/icon-addlink.svg | 3 - .../settings/static/admin/img/icon-alert.svg | 3 - .../static/admin/img/icon-calendar.svg | 9 - .../static/admin/img/icon-changelink.svg | 3 - .../settings/static/admin/img/icon-clock.svg | 9 - .../static/admin/img/icon-deletelink.svg | 3 - .../sip/settings/static/admin/img/icon-no.svg | 3 - .../static/admin/img/icon-unknown-alt.svg | 3 - .../static/admin/img/icon-unknown.svg | 3 - .../static/admin/img/icon-viewlink.svg | 3 - .../settings/static/admin/img/icon-yes.svg | 3 - .../static/admin/img/inline-delete.svg | 3 - .../sip/settings/static/admin/img/search.svg | 3 - .../static/admin/img/selector-icons.svg | 34 - .../static/admin/img/sorting-icons.svg | 19 - .../settings/static/admin/img/tooltag-add.svg | 3 - .../static/admin/img/tooltag-arrowright.svg | 3 - .../sip/settings/static/admin/js/SelectBox.js | 110 - .../settings/static/admin/js/SelectFilter2.js | 236 - .../sip/settings/static/admin/js/actions.js | 154 - .../settings/static/admin/js/actions.min.js | 7 - .../admin/js/admin/DateTimeShortcuts.js | 417 - .../admin/js/admin/RelatedObjectLookups.js | 159 - .../settings/static/admin/js/autocomplete.js | 38 - .../sip/settings/static/admin/js/calendar.js | 207 - .../sip/settings/static/admin/js/cancel.js | 28 - .../settings/static/admin/js/change_form.js | 16 - .../sip/settings/static/admin/js/collapse.js | 43 - .../settings/static/admin/js/collapse.min.js | 2 - old/old/sip/settings/static/admin/js/core.js | 163 - .../sip/settings/static/admin/js/inlines.js | 348 - .../settings/static/admin/js/inlines.min.js | 11 - .../settings/static/admin/js/jquery.init.js | 8 - .../settings/static/admin/js/nav_sidebar.js | 39 - .../static/admin/js/popup_response.js | 16 - .../settings/static/admin/js/prepopulate.js | 43 - .../static/admin/js/prepopulate.min.js | 1 - .../static/admin/js/prepopulate_init.js | 11 - .../sip/settings/static/admin/js/urlify.js | 185 - .../static/admin/js/vendor/jquery/LICENSE.txt | 20 - .../static/admin/js/vendor/jquery/jquery.js | 10872 ---------------- .../admin/js/vendor/jquery/jquery.min.js | 2 - .../static/admin/js/vendor/select2/LICENSE.md | 21 - .../static/admin/js/vendor/select2/i18n/af.js | 3 - .../static/admin/js/vendor/select2/i18n/ar.js | 3 - .../static/admin/js/vendor/select2/i18n/az.js | 3 - .../static/admin/js/vendor/select2/i18n/bg.js | 3 - .../static/admin/js/vendor/select2/i18n/bn.js | 3 - .../static/admin/js/vendor/select2/i18n/bs.js | 3 - .../static/admin/js/vendor/select2/i18n/ca.js | 3 - .../static/admin/js/vendor/select2/i18n/cs.js | 3 - .../static/admin/js/vendor/select2/i18n/da.js | 3 - .../static/admin/js/vendor/select2/i18n/de.js | 3 - .../admin/js/vendor/select2/i18n/dsb.js | 3 - .../static/admin/js/vendor/select2/i18n/el.js | 3 - .../static/admin/js/vendor/select2/i18n/en.js | 3 - .../static/admin/js/vendor/select2/i18n/es.js | 3 - .../static/admin/js/vendor/select2/i18n/et.js | 3 - .../static/admin/js/vendor/select2/i18n/eu.js | 3 - .../static/admin/js/vendor/select2/i18n/fa.js | 3 - .../static/admin/js/vendor/select2/i18n/fi.js | 3 - .../static/admin/js/vendor/select2/i18n/fr.js | 3 - .../static/admin/js/vendor/select2/i18n/gl.js | 3 - .../static/admin/js/vendor/select2/i18n/he.js | 3 - .../static/admin/js/vendor/select2/i18n/hi.js | 3 - .../static/admin/js/vendor/select2/i18n/hr.js | 3 - .../admin/js/vendor/select2/i18n/hsb.js | 3 - .../static/admin/js/vendor/select2/i18n/hu.js | 3 - .../static/admin/js/vendor/select2/i18n/hy.js | 3 - .../static/admin/js/vendor/select2/i18n/id.js | 3 - .../static/admin/js/vendor/select2/i18n/is.js | 3 - .../static/admin/js/vendor/select2/i18n/it.js | 3 - .../static/admin/js/vendor/select2/i18n/ja.js | 3 - .../static/admin/js/vendor/select2/i18n/ka.js | 3 - .../static/admin/js/vendor/select2/i18n/km.js | 3 - .../static/admin/js/vendor/select2/i18n/ko.js | 3 - .../static/admin/js/vendor/select2/i18n/lt.js | 3 - .../static/admin/js/vendor/select2/i18n/lv.js | 3 - .../static/admin/js/vendor/select2/i18n/mk.js | 3 - .../static/admin/js/vendor/select2/i18n/ms.js | 3 - .../static/admin/js/vendor/select2/i18n/nb.js | 3 - .../static/admin/js/vendor/select2/i18n/ne.js | 3 - .../static/admin/js/vendor/select2/i18n/nl.js | 3 - .../static/admin/js/vendor/select2/i18n/pl.js | 3 - .../static/admin/js/vendor/select2/i18n/ps.js | 3 - .../admin/js/vendor/select2/i18n/pt-BR.js | 3 - .../static/admin/js/vendor/select2/i18n/pt.js | 3 - .../static/admin/js/vendor/select2/i18n/ro.js | 3 - .../static/admin/js/vendor/select2/i18n/ru.js | 3 - .../static/admin/js/vendor/select2/i18n/sk.js | 3 - .../static/admin/js/vendor/select2/i18n/sl.js | 3 - .../static/admin/js/vendor/select2/i18n/sq.js | 3 - .../admin/js/vendor/select2/i18n/sr-Cyrl.js | 3 - .../static/admin/js/vendor/select2/i18n/sr.js | 3 - .../static/admin/js/vendor/select2/i18n/sv.js | 3 - .../static/admin/js/vendor/select2/i18n/th.js | 3 - .../static/admin/js/vendor/select2/i18n/tk.js | 3 - .../static/admin/js/vendor/select2/i18n/tr.js | 3 - .../static/admin/js/vendor/select2/i18n/uk.js | 3 - .../static/admin/js/vendor/select2/i18n/vi.js | 3 - .../admin/js/vendor/select2/i18n/zh-CN.js | 3 - .../admin/js/vendor/select2/i18n/zh-TW.js | 3 - .../admin/js/vendor/select2/select2.full.js | 6820 ---------- .../js/vendor/select2/select2.full.min.js | 2 - .../admin/js/vendor/xregexp/LICENSE.txt | 21 - .../static/admin/js/vendor/xregexp/xregexp.js | 4652 ------- .../admin/js/vendor/xregexp/xregexp.min.js | 160 - .../settings/static/drf-yasg/immutable.min.js | 34 - .../sip/settings/static/drf-yasg/insQ.min.js | 4 - .../settings/static/drf-yasg/redoc-init.js | 67 - .../static/drf-yasg/redoc-old/redoc.min.js | 8 - .../static/drf-yasg/redoc/redoc-logo.png | Bin 4969 -> 0 bytes .../static/drf-yasg/redoc/redoc.min.js | 137 - .../sip/settings/static/drf-yasg/style.css | 73 - .../drf-yasg/swagger-ui-dist/absolute-path.js | 14 - .../swagger-ui-dist/favicon-32x32.png | Bin 628 -> 0 bytes .../static/drf-yasg/swagger-ui-dist/index.js | 17 - .../swagger-ui-dist/oauth2-redirect.html | 67 - .../swagger-ui-dist/swagger-ui-bundle.js | 134 - .../swagger-ui-standalone-preset.js | 22 - .../drf-yasg/swagger-ui-dist/swagger-ui.css | 4 - .../static/drf-yasg/swagger-ui-init.js | 385 - .../static/drf-yasg/url-polyfill.min.js | 1 - .../settings/static/makara-ui-fasilkom.png | Bin 26603 -> 0 bytes .../css/bootstrap-theme.min.css | 6 - .../rest_framework/css/bootstrap-tweaks.css | 233 - .../rest_framework/css/bootstrap.min.css | 6 - .../static/rest_framework/css/default.css | 82 - .../rest_framework/css/font-awesome-4.0.3.css | 1338 -- .../static/rest_framework/css/prettify.css | 30 - .../static/rest_framework/docs/css/base.css | 359 - .../rest_framework/docs/css/highlight.css | 125 - .../docs/css/jquery.json-view.min.css | 11 - .../rest_framework/docs/img/favicon.ico | Bin 5430 -> 0 bytes .../static/rest_framework/docs/img/grid.png | Bin 1458 -> 0 bytes .../static/rest_framework/docs/js/api.js | 321 - .../rest_framework/docs/js/highlight.pack.js | 2 - .../docs/js/jquery.json-view.min.js | 7 - .../fonts/fontawesome-webfont.eot | Bin 38205 -> 0 bytes .../fonts/fontawesome-webfont.svg | 414 - .../fonts/fontawesome-webfont.ttf | Bin 80652 -> 0 bytes .../fonts/fontawesome-webfont.woff | Bin 44432 -> 0 bytes .../fonts/glyphicons-halflings-regular.eot | Bin 20127 -> 0 bytes .../fonts/glyphicons-halflings-regular.svg | 288 - .../fonts/glyphicons-halflings-regular.ttf | Bin 45404 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 23424 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 18028 -> 0 bytes .../img/glyphicons-halflings-white.png | Bin 8777 -> 0 bytes .../img/glyphicons-halflings.png | Bin 12762 -> 0 bytes .../static/rest_framework/img/grid.png | Bin 1458 -> 0 bytes .../static/rest_framework/js/ajax-form.js | 127 - .../static/rest_framework/js/bootstrap.min.js | 6 - .../static/rest_framework/js/coreapi-0.1.1.js | 2043 --- .../settings/static/rest_framework/js/csrf.js | 52 - .../static/rest_framework/js/default.js | 47 - .../rest_framework/js/jquery-3.4.1.min.js | 2 - .../static/rest_framework/js/prettify-min.js | 28 - old/old/sip/settings/static/sso/kodoru.json | 3857 ------ old/old/sip/settings/storage_backends.py | 6 - old/old/sip/static/.gitkeep | 1 - old/old/sip/urls.py | 58 - old/old/sip/wsgi.py | 16 - old/old/sonar-project.properties | 31 - old/old/static/makara-ui-fasilkom.png | Bin 26603 -> 0 bytes old/old/test.json | 1 - old/requirements.txt | 98 - old/seeder_dev.py | 506 - old/seeder_staging.py | 496 - old/server-setup.sh | 39 - old/setup.cfg | 4 - old/sip/__init__.py | 0 old/sip/asgi.py | 16 - old/sip/settings/.env.example | 10 - old/sip/settings/dev.py | 235 - old/sip/settings/production.py | 239 - old/sip/settings/staging.py | 250 - .../static/admin/css/autocomplete.css | 260 - old/sip/settings/static/admin/css/base.css | 966 -- .../settings/static/admin/css/changelists.css | 354 - .../settings/static/admin/css/dashboard.css | 26 - old/sip/settings/static/admin/css/fonts.css | 20 - old/sip/settings/static/admin/css/forms.css | 527 - old/sip/settings/static/admin/css/login.css | 79 - .../settings/static/admin/css/nav_sidebar.css | 119 - .../settings/static/admin/css/responsive.css | 1004 -- .../static/admin/css/responsive_rtl.css | 80 - old/sip/settings/static/admin/css/rtl.css | 249 - .../css/vendor/select2/LICENSE-SELECT2.md | 21 - .../admin/css/vendor/select2/select2.css | 481 - .../admin/css/vendor/select2/select2.min.css | 1 - old/sip/settings/static/admin/css/widgets.css | 574 - .../settings/static/admin/fonts/LICENSE.txt | 202 - .../settings/static/admin/fonts/README.txt | 3 - .../admin/fonts/Roboto-Bold-webfont.woff | Bin 86184 -> 0 bytes .../admin/fonts/Roboto-Light-webfont.woff | Bin 85692 -> 0 bytes .../admin/fonts/Roboto-Regular-webfont.woff | Bin 85876 -> 0 bytes old/sip/settings/static/admin/img/LICENSE | 20 - old/sip/settings/static/admin/img/README.txt | 7 - .../static/admin/img/calendar-icons.svg | 14 - .../static/admin/img/gis/move_vertex_off.svg | 1 - .../static/admin/img/gis/move_vertex_on.svg | 1 - .../static/admin/img/icon-addlink.svg | 3 - .../settings/static/admin/img/icon-alert.svg | 3 - .../static/admin/img/icon-calendar.svg | 9 - .../static/admin/img/icon-changelink.svg | 3 - .../settings/static/admin/img/icon-clock.svg | 9 - .../static/admin/img/icon-deletelink.svg | 3 - old/sip/settings/static/admin/img/icon-no.svg | 3 - .../static/admin/img/icon-unknown-alt.svg | 3 - .../static/admin/img/icon-unknown.svg | 3 - .../static/admin/img/icon-viewlink.svg | 3 - .../settings/static/admin/img/icon-yes.svg | 3 - .../static/admin/img/inline-delete.svg | 3 - old/sip/settings/static/admin/img/search.svg | 3 - .../static/admin/img/selector-icons.svg | 34 - .../static/admin/img/sorting-icons.svg | 19 - .../settings/static/admin/img/tooltag-add.svg | 3 - .../static/admin/img/tooltag-arrowright.svg | 3 - old/sip/settings/static/admin/js/SelectBox.js | 110 - .../settings/static/admin/js/SelectFilter2.js | 236 - old/sip/settings/static/admin/js/actions.js | 154 - .../settings/static/admin/js/actions.min.js | 7 - .../admin/js/admin/DateTimeShortcuts.js | 417 - .../admin/js/admin/RelatedObjectLookups.js | 159 - .../settings/static/admin/js/autocomplete.js | 38 - old/sip/settings/static/admin/js/calendar.js | 207 - old/sip/settings/static/admin/js/cancel.js | 28 - .../settings/static/admin/js/change_form.js | 16 - old/sip/settings/static/admin/js/collapse.js | 43 - .../settings/static/admin/js/collapse.min.js | 2 - old/sip/settings/static/admin/js/core.js | 163 - old/sip/settings/static/admin/js/inlines.js | 348 - .../settings/static/admin/js/inlines.min.js | 11 - .../settings/static/admin/js/jquery.init.js | 8 - .../settings/static/admin/js/nav_sidebar.js | 39 - .../static/admin/js/popup_response.js | 16 - .../settings/static/admin/js/prepopulate.js | 43 - .../static/admin/js/prepopulate.min.js | 1 - .../static/admin/js/prepopulate_init.js | 11 - old/sip/settings/static/admin/js/urlify.js | 185 - .../static/admin/js/vendor/jquery/LICENSE.txt | 20 - .../static/admin/js/vendor/jquery/jquery.js | 10872 ---------------- .../admin/js/vendor/jquery/jquery.min.js | 2 - .../static/admin/js/vendor/select2/LICENSE.md | 21 - .../static/admin/js/vendor/select2/i18n/af.js | 3 - .../static/admin/js/vendor/select2/i18n/ar.js | 3 - .../static/admin/js/vendor/select2/i18n/az.js | 3 - .../static/admin/js/vendor/select2/i18n/bg.js | 3 - .../static/admin/js/vendor/select2/i18n/bn.js | 3 - .../static/admin/js/vendor/select2/i18n/bs.js | 3 - .../static/admin/js/vendor/select2/i18n/ca.js | 3 - .../static/admin/js/vendor/select2/i18n/cs.js | 3 - .../static/admin/js/vendor/select2/i18n/da.js | 3 - .../static/admin/js/vendor/select2/i18n/de.js | 3 - .../admin/js/vendor/select2/i18n/dsb.js | 3 - .../static/admin/js/vendor/select2/i18n/el.js | 3 - .../static/admin/js/vendor/select2/i18n/en.js | 3 - .../static/admin/js/vendor/select2/i18n/es.js | 3 - .../static/admin/js/vendor/select2/i18n/et.js | 3 - .../static/admin/js/vendor/select2/i18n/eu.js | 3 - .../static/admin/js/vendor/select2/i18n/fa.js | 3 - .../static/admin/js/vendor/select2/i18n/fi.js | 3 - .../static/admin/js/vendor/select2/i18n/fr.js | 3 - .../static/admin/js/vendor/select2/i18n/gl.js | 3 - .../static/admin/js/vendor/select2/i18n/he.js | 3 - .../static/admin/js/vendor/select2/i18n/hi.js | 3 - .../static/admin/js/vendor/select2/i18n/hr.js | 3 - .../admin/js/vendor/select2/i18n/hsb.js | 3 - .../static/admin/js/vendor/select2/i18n/hu.js | 3 - .../static/admin/js/vendor/select2/i18n/hy.js | 3 - .../static/admin/js/vendor/select2/i18n/id.js | 3 - .../static/admin/js/vendor/select2/i18n/is.js | 3 - .../static/admin/js/vendor/select2/i18n/it.js | 3 - .../static/admin/js/vendor/select2/i18n/ja.js | 3 - .../static/admin/js/vendor/select2/i18n/ka.js | 3 - .../static/admin/js/vendor/select2/i18n/km.js | 3 - .../static/admin/js/vendor/select2/i18n/ko.js | 3 - .../static/admin/js/vendor/select2/i18n/lt.js | 3 - .../static/admin/js/vendor/select2/i18n/lv.js | 3 - .../static/admin/js/vendor/select2/i18n/mk.js | 3 - .../static/admin/js/vendor/select2/i18n/ms.js | 3 - .../static/admin/js/vendor/select2/i18n/nb.js | 3 - .../static/admin/js/vendor/select2/i18n/ne.js | 3 - .../static/admin/js/vendor/select2/i18n/nl.js | 3 - .../static/admin/js/vendor/select2/i18n/pl.js | 3 - .../static/admin/js/vendor/select2/i18n/ps.js | 3 - .../admin/js/vendor/select2/i18n/pt-BR.js | 3 - .../static/admin/js/vendor/select2/i18n/pt.js | 3 - .../static/admin/js/vendor/select2/i18n/ro.js | 3 - .../static/admin/js/vendor/select2/i18n/ru.js | 3 - .../static/admin/js/vendor/select2/i18n/sk.js | 3 - .../static/admin/js/vendor/select2/i18n/sl.js | 3 - .../static/admin/js/vendor/select2/i18n/sq.js | 3 - .../admin/js/vendor/select2/i18n/sr-Cyrl.js | 3 - .../static/admin/js/vendor/select2/i18n/sr.js | 3 - .../static/admin/js/vendor/select2/i18n/sv.js | 3 - .../static/admin/js/vendor/select2/i18n/th.js | 3 - .../static/admin/js/vendor/select2/i18n/tk.js | 3 - .../static/admin/js/vendor/select2/i18n/tr.js | 3 - .../static/admin/js/vendor/select2/i18n/uk.js | 3 - .../static/admin/js/vendor/select2/i18n/vi.js | 3 - .../admin/js/vendor/select2/i18n/zh-CN.js | 3 - .../admin/js/vendor/select2/i18n/zh-TW.js | 3 - .../admin/js/vendor/select2/select2.full.js | 6820 ---------- .../js/vendor/select2/select2.full.min.js | 2 - .../admin/js/vendor/xregexp/LICENSE.txt | 21 - .../static/admin/js/vendor/xregexp/xregexp.js | 4652 ------- .../admin/js/vendor/xregexp/xregexp.min.js | 160 - .../settings/static/drf-yasg/immutable.min.js | 34 - old/sip/settings/static/drf-yasg/insQ.min.js | 4 - .../settings/static/drf-yasg/redoc-init.js | 67 - .../static/drf-yasg/redoc-old/redoc.min.js | 8 - .../static/drf-yasg/redoc/redoc-logo.png | Bin 4969 -> 0 bytes .../static/drf-yasg/redoc/redoc.min.js | 137 - old/sip/settings/static/drf-yasg/style.css | 73 - .../drf-yasg/swagger-ui-dist/absolute-path.js | 14 - .../swagger-ui-dist/favicon-32x32.png | Bin 628 -> 0 bytes .../static/drf-yasg/swagger-ui-dist/index.js | 17 - .../swagger-ui-dist/oauth2-redirect.html | 67 - .../swagger-ui-dist/swagger-ui-bundle.js | 134 - .../swagger-ui-standalone-preset.js | 22 - .../drf-yasg/swagger-ui-dist/swagger-ui.css | 4 - .../static/drf-yasg/swagger-ui-init.js | 385 - .../static/drf-yasg/url-polyfill.min.js | 1 - .../settings/static/makara-ui-fasilkom.png | Bin 26603 -> 0 bytes .../css/bootstrap-theme.min.css | 6 - .../rest_framework/css/bootstrap-tweaks.css | 233 - .../rest_framework/css/bootstrap.min.css | 6 - .../static/rest_framework/css/default.css | 82 - .../rest_framework/css/font-awesome-4.0.3.css | 1338 -- .../static/rest_framework/css/prettify.css | 30 - .../static/rest_framework/docs/css/base.css | 359 - .../rest_framework/docs/css/highlight.css | 125 - .../docs/css/jquery.json-view.min.css | 11 - .../rest_framework/docs/img/favicon.ico | Bin 5430 -> 0 bytes .../static/rest_framework/docs/img/grid.png | Bin 1458 -> 0 bytes .../static/rest_framework/docs/js/api.js | 321 - .../rest_framework/docs/js/highlight.pack.js | 2 - .../docs/js/jquery.json-view.min.js | 7 - .../fonts/fontawesome-webfont.eot | Bin 38205 -> 0 bytes .../fonts/fontawesome-webfont.svg | 414 - .../fonts/fontawesome-webfont.ttf | Bin 80652 -> 0 bytes .../fonts/fontawesome-webfont.woff | Bin 44432 -> 0 bytes .../fonts/glyphicons-halflings-regular.eot | Bin 20127 -> 0 bytes .../fonts/glyphicons-halflings-regular.svg | 288 - .../fonts/glyphicons-halflings-regular.ttf | Bin 45404 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 23424 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 18028 -> 0 bytes .../img/glyphicons-halflings-white.png | Bin 8777 -> 0 bytes .../img/glyphicons-halflings.png | Bin 12762 -> 0 bytes .../static/rest_framework/img/grid.png | Bin 1458 -> 0 bytes .../static/rest_framework/js/ajax-form.js | 127 - .../static/rest_framework/js/bootstrap.min.js | 6 - .../static/rest_framework/js/coreapi-0.1.1.js | 2043 --- .../settings/static/rest_framework/js/csrf.js | 52 - .../static/rest_framework/js/default.js | 47 - .../rest_framework/js/jquery-3.4.1.min.js | 2 - .../static/rest_framework/js/prettify-min.js | 28 - old/sip/settings/static/sso/kodoru.json | 3857 ------ old/sip/settings/storage_backends.py | 6 - old/sip/static/.gitkeep | 1 - old/sip/urls.py | 58 - old/sip/wsgi.py | 16 - old/sonar-project.properties | 31 - old/static/makara-ui-fasilkom.png | Bin 26603 -> 0 bytes old/test.json | 1 - 1080 files changed, 224942 deletions(-) delete mode 100644 new/.dockerignore delete mode 100644 new/.gitignore delete mode 100644 new/.gitlab-ci.yml delete mode 100644 new/Dockerfile delete mode 100644 new/Procfile delete mode 100644 new/README.md delete mode 100644 new/api_tester.py delete mode 100644 new/authentication/__init__.py delete mode 100644 new/authentication/admin.py delete mode 100644 new/authentication/apps.py delete mode 100644 new/authentication/cas_wrapper.py delete mode 100644 new/authentication/manualSSO.py delete mode 100644 new/authentication/migrations/0001_initial.py delete mode 100644 new/authentication/migrations/0002_config.py delete mode 100644 new/authentication/migrations/0003_auto_20201113_0949.py delete mode 100644 new/authentication/migrations/0004_delete_user.py delete mode 100644 new/authentication/migrations/__init__.py delete mode 100644 new/authentication/models.py delete mode 100644 new/authentication/role.py delete mode 100644 new/authentication/serializers.py delete mode 100644 new/authentication/static/sso/kodoru.json delete mode 100644 new/authentication/tests.py delete mode 100644 new/authentication/urls.py delete mode 100644 new/authentication/views.py delete mode 100644 new/core/__init__.py delete mode 100644 new/core/admin.py delete mode 100644 new/core/apps.py delete mode 100644 new/core/errors/views.py delete mode 100644 new/core/migrations/__init__.py delete mode 100644 new/core/models.py delete mode 100644 new/core/tests.py delete mode 100644 new/core/views.py delete mode 100644 new/db.json delete mode 100644 new/db2.json delete mode 100644 new/docker-compose.yml delete mode 100644 new/docker-entrypoint.sh delete mode 100644 new/fixtures.json delete mode 100644 new/laporan_praktikum/__init__.py delete mode 100644 new/laporan_praktikum/admin.py delete mode 100644 new/laporan_praktikum/apps.py delete mode 100644 new/laporan_praktikum/custom_module/__init__.py delete mode 100644 new/laporan_praktikum/custom_module/parse_time.py delete mode 100644 new/laporan_praktikum/error_message/__init__.py delete mode 100644 new/laporan_praktikum/error_message/error_message.py delete mode 100644 new/laporan_praktikum/migrations/0001_initial.py delete mode 100644 new/laporan_praktikum/migrations/0002_auto_20200603_1450.py delete mode 100644 new/laporan_praktikum/migrations/0003_auto_20200603_1451.py delete mode 100644 new/laporan_praktikum/migrations/0004_auto_20200603_1455.py delete mode 100644 new/laporan_praktikum/migrations/0005_auto_20200603_1944.py delete mode 100644 new/laporan_praktikum/migrations/__init__.py delete mode 100644 new/laporan_praktikum/models.py delete mode 100644 new/laporan_praktikum/serializers.py delete mode 100644 new/laporan_praktikum/supervisor_lembaga/__init__.py delete mode 100644 new/laporan_praktikum/supervisor_lembaga/views_supv_lembaga.py delete mode 100644 new/laporan_praktikum/supervisor_sekolah/__init__.py delete mode 100644 new/laporan_praktikum/supervisor_sekolah/views.py delete mode 100644 new/laporan_praktikum/tests/__init__.py delete mode 100644 new/laporan_praktikum/tests/test_model.py delete mode 100644 new/laporan_praktikum/tests/test_serializers.py delete mode 100644 new/laporan_praktikum/tests/test_views.py delete mode 100644 new/laporan_praktikum/urls.py delete mode 100644 new/laporan_praktikum/views.py delete mode 100644 new/laporan_praktikum/views_riwayat.py delete mode 100644 new/lembaga/__init__.py delete mode 100644 new/lembaga/admin.py delete mode 100644 new/lembaga/apps.py delete mode 100644 new/lembaga/migrations/0001_initial.py delete mode 100644 new/lembaga/migrations/0002_auto_20200604_0324.py delete mode 100644 new/lembaga/migrations/0003_carousel.py delete mode 100644 new/lembaga/migrations/0004_auto_20201105_2133.py delete mode 100644 new/lembaga/migrations/0005_errormessage.py delete mode 100644 new/lembaga/migrations/0006_auto_20210425_2225.py delete mode 100644 new/lembaga/migrations/__init__.py delete mode 100644 new/lembaga/models.py delete mode 100644 new/lembaga/serializers.py delete mode 100644 new/lembaga/tests.py delete mode 100644 new/lembaga/urls.py delete mode 100644 new/lembaga/views.py delete mode 100644 new/manage.py delete mode 100644 new/migrate.sh delete mode 100644 new/requirements.txt delete mode 100644 new/seeder_dev.py delete mode 100644 new/seeder_staging.py delete mode 100644 new/server-setup.sh delete mode 100644 new/setup.cfg delete mode 100644 new/sip/__init__.py delete mode 100644 new/sip/asgi.py delete mode 100644 new/sip/settings/.env.example delete mode 100644 new/sip/settings/dev.py delete mode 100644 new/sip/settings/production.py delete mode 100644 new/sip/settings/staging.py delete mode 100644 new/sip/settings/static/admin/css/autocomplete.css delete mode 100644 new/sip/settings/static/admin/css/base.css delete mode 100644 new/sip/settings/static/admin/css/changelists.css delete mode 100644 new/sip/settings/static/admin/css/dashboard.css delete mode 100644 new/sip/settings/static/admin/css/fonts.css delete mode 100644 new/sip/settings/static/admin/css/forms.css delete mode 100644 new/sip/settings/static/admin/css/login.css delete mode 100644 new/sip/settings/static/admin/css/nav_sidebar.css delete mode 100644 new/sip/settings/static/admin/css/responsive.css delete mode 100644 new/sip/settings/static/admin/css/responsive_rtl.css delete mode 100644 new/sip/settings/static/admin/css/rtl.css delete mode 100644 new/sip/settings/static/admin/css/vendor/select2/LICENSE-SELECT2.md delete mode 100644 new/sip/settings/static/admin/css/vendor/select2/select2.css delete mode 100644 new/sip/settings/static/admin/css/vendor/select2/select2.min.css delete mode 100644 new/sip/settings/static/admin/css/widgets.css delete mode 100644 new/sip/settings/static/admin/fonts/LICENSE.txt delete mode 100644 new/sip/settings/static/admin/fonts/README.txt delete mode 100644 new/sip/settings/static/admin/fonts/Roboto-Bold-webfont.woff delete mode 100644 new/sip/settings/static/admin/fonts/Roboto-Light-webfont.woff delete mode 100644 new/sip/settings/static/admin/fonts/Roboto-Regular-webfont.woff delete mode 100644 new/sip/settings/static/admin/img/LICENSE delete mode 100644 new/sip/settings/static/admin/img/README.txt delete mode 100644 new/sip/settings/static/admin/img/calendar-icons.svg delete mode 100644 new/sip/settings/static/admin/img/gis/move_vertex_off.svg delete mode 100644 new/sip/settings/static/admin/img/gis/move_vertex_on.svg delete mode 100644 new/sip/settings/static/admin/img/icon-addlink.svg delete mode 100644 new/sip/settings/static/admin/img/icon-alert.svg delete mode 100644 new/sip/settings/static/admin/img/icon-calendar.svg delete mode 100644 new/sip/settings/static/admin/img/icon-changelink.svg delete mode 100644 new/sip/settings/static/admin/img/icon-clock.svg delete mode 100644 new/sip/settings/static/admin/img/icon-deletelink.svg delete mode 100644 new/sip/settings/static/admin/img/icon-no.svg delete mode 100644 new/sip/settings/static/admin/img/icon-unknown-alt.svg delete mode 100644 new/sip/settings/static/admin/img/icon-unknown.svg delete mode 100644 new/sip/settings/static/admin/img/icon-viewlink.svg delete mode 100644 new/sip/settings/static/admin/img/icon-yes.svg delete mode 100644 new/sip/settings/static/admin/img/inline-delete.svg delete mode 100644 new/sip/settings/static/admin/img/search.svg delete mode 100644 new/sip/settings/static/admin/img/selector-icons.svg delete mode 100644 new/sip/settings/static/admin/img/sorting-icons.svg delete mode 100644 new/sip/settings/static/admin/img/tooltag-add.svg delete mode 100644 new/sip/settings/static/admin/img/tooltag-arrowright.svg delete mode 100644 new/sip/settings/static/admin/js/SelectBox.js delete mode 100644 new/sip/settings/static/admin/js/SelectFilter2.js delete mode 100644 new/sip/settings/static/admin/js/actions.js delete mode 100644 new/sip/settings/static/admin/js/actions.min.js delete mode 100644 new/sip/settings/static/admin/js/admin/DateTimeShortcuts.js delete mode 100644 new/sip/settings/static/admin/js/admin/RelatedObjectLookups.js delete mode 100644 new/sip/settings/static/admin/js/autocomplete.js delete mode 100644 new/sip/settings/static/admin/js/calendar.js delete mode 100644 new/sip/settings/static/admin/js/cancel.js delete mode 100644 new/sip/settings/static/admin/js/change_form.js delete mode 100644 new/sip/settings/static/admin/js/collapse.js delete mode 100644 new/sip/settings/static/admin/js/collapse.min.js delete mode 100644 new/sip/settings/static/admin/js/core.js delete mode 100644 new/sip/settings/static/admin/js/inlines.js delete mode 100644 new/sip/settings/static/admin/js/inlines.min.js delete mode 100644 new/sip/settings/static/admin/js/jquery.init.js delete mode 100644 new/sip/settings/static/admin/js/nav_sidebar.js delete mode 100644 new/sip/settings/static/admin/js/popup_response.js delete mode 100644 new/sip/settings/static/admin/js/prepopulate.js delete mode 100644 new/sip/settings/static/admin/js/prepopulate.min.js delete mode 100644 new/sip/settings/static/admin/js/prepopulate_init.js delete mode 100644 new/sip/settings/static/admin/js/urlify.js delete mode 100644 new/sip/settings/static/admin/js/vendor/jquery/LICENSE.txt delete mode 100644 new/sip/settings/static/admin/js/vendor/jquery/jquery.js delete mode 100644 new/sip/settings/static/admin/js/vendor/jquery/jquery.min.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/LICENSE.md delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/af.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/ar.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/az.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/bg.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/bn.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/bs.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/ca.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/cs.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/da.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/de.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/dsb.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/el.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/en.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/es.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/et.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/eu.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/fa.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/fi.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/fr.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/gl.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/he.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/hi.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/hr.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/hsb.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/hu.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/hy.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/id.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/is.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/it.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/ja.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/ka.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/km.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/ko.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/lt.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/lv.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/mk.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/ms.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/nb.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/ne.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/nl.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/pl.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/ps.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/pt-BR.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/pt.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/ro.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/ru.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/sk.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/sl.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/sq.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/sr-Cyrl.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/sr.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/sv.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/th.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/tk.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/tr.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/uk.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/vi.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/zh-CN.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/i18n/zh-TW.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/select2.full.js delete mode 100644 new/sip/settings/static/admin/js/vendor/select2/select2.full.min.js delete mode 100644 new/sip/settings/static/admin/js/vendor/xregexp/LICENSE.txt delete mode 100644 new/sip/settings/static/admin/js/vendor/xregexp/xregexp.js delete mode 100644 new/sip/settings/static/admin/js/vendor/xregexp/xregexp.min.js delete mode 100644 new/sip/settings/static/drf-yasg/immutable.min.js delete mode 100644 new/sip/settings/static/drf-yasg/insQ.min.js delete mode 100644 new/sip/settings/static/drf-yasg/redoc-init.js delete mode 100644 new/sip/settings/static/drf-yasg/redoc-old/redoc.min.js delete mode 100644 new/sip/settings/static/drf-yasg/redoc/redoc-logo.png delete mode 100644 new/sip/settings/static/drf-yasg/redoc/redoc.min.js delete mode 100644 new/sip/settings/static/drf-yasg/style.css delete mode 100644 new/sip/settings/static/drf-yasg/swagger-ui-dist/absolute-path.js delete mode 100644 new/sip/settings/static/drf-yasg/swagger-ui-dist/favicon-32x32.png delete mode 100644 new/sip/settings/static/drf-yasg/swagger-ui-dist/index.js delete mode 100644 new/sip/settings/static/drf-yasg/swagger-ui-dist/oauth2-redirect.html delete mode 100644 new/sip/settings/static/drf-yasg/swagger-ui-dist/swagger-ui-bundle.js delete mode 100644 new/sip/settings/static/drf-yasg/swagger-ui-dist/swagger-ui-standalone-preset.js delete mode 100644 new/sip/settings/static/drf-yasg/swagger-ui-dist/swagger-ui.css delete mode 100644 new/sip/settings/static/drf-yasg/swagger-ui-init.js delete mode 100644 new/sip/settings/static/drf-yasg/url-polyfill.min.js delete mode 100644 new/sip/settings/static/makara-ui-fasilkom.png delete mode 100644 new/sip/settings/static/rest_framework/css/bootstrap-theme.min.css delete mode 100644 new/sip/settings/static/rest_framework/css/bootstrap-tweaks.css delete mode 100644 new/sip/settings/static/rest_framework/css/bootstrap.min.css delete mode 100644 new/sip/settings/static/rest_framework/css/default.css delete mode 100644 new/sip/settings/static/rest_framework/css/font-awesome-4.0.3.css delete mode 100644 new/sip/settings/static/rest_framework/css/prettify.css delete mode 100644 new/sip/settings/static/rest_framework/docs/css/base.css delete mode 100644 new/sip/settings/static/rest_framework/docs/css/highlight.css delete mode 100644 new/sip/settings/static/rest_framework/docs/css/jquery.json-view.min.css delete mode 100644 new/sip/settings/static/rest_framework/docs/img/favicon.ico delete mode 100644 new/sip/settings/static/rest_framework/docs/img/grid.png delete mode 100644 new/sip/settings/static/rest_framework/docs/js/api.js delete mode 100644 new/sip/settings/static/rest_framework/docs/js/highlight.pack.js delete mode 100644 new/sip/settings/static/rest_framework/docs/js/jquery.json-view.min.js delete mode 100644 new/sip/settings/static/rest_framework/fonts/fontawesome-webfont.eot delete mode 100644 new/sip/settings/static/rest_framework/fonts/fontawesome-webfont.svg delete mode 100644 new/sip/settings/static/rest_framework/fonts/fontawesome-webfont.ttf delete mode 100644 new/sip/settings/static/rest_framework/fonts/fontawesome-webfont.woff delete mode 100644 new/sip/settings/static/rest_framework/fonts/glyphicons-halflings-regular.eot delete mode 100644 new/sip/settings/static/rest_framework/fonts/glyphicons-halflings-regular.svg delete mode 100644 new/sip/settings/static/rest_framework/fonts/glyphicons-halflings-regular.ttf delete mode 100644 new/sip/settings/static/rest_framework/fonts/glyphicons-halflings-regular.woff delete mode 100644 new/sip/settings/static/rest_framework/fonts/glyphicons-halflings-regular.woff2 delete mode 100644 new/sip/settings/static/rest_framework/img/glyphicons-halflings-white.png delete mode 100644 new/sip/settings/static/rest_framework/img/glyphicons-halflings.png delete mode 100644 new/sip/settings/static/rest_framework/img/grid.png delete mode 100644 new/sip/settings/static/rest_framework/js/ajax-form.js delete mode 100644 new/sip/settings/static/rest_framework/js/bootstrap.min.js delete mode 100644 new/sip/settings/static/rest_framework/js/coreapi-0.1.1.js delete mode 100644 new/sip/settings/static/rest_framework/js/csrf.js delete mode 100644 new/sip/settings/static/rest_framework/js/default.js delete mode 100644 new/sip/settings/static/rest_framework/js/jquery-3.4.1.min.js delete mode 100644 new/sip/settings/static/rest_framework/js/prettify-min.js delete mode 100644 new/sip/settings/static/sso/kodoru.json delete mode 100644 new/sip/settings/storage_backends.py delete mode 100644 new/sip/static/.gitkeep delete mode 100644 new/sip/urls.py delete mode 100644 new/sip/wsgi.py delete mode 100644 new/sonar-project.properties delete mode 100644 new/static/makara-ui-fasilkom.png delete mode 100644 new/test.json delete mode 100644 new/testad.json delete mode 100644 old/.dockerignore delete mode 100644 old/.gitignore delete mode 100644 old/.gitlab-ci.yml delete mode 100644 old/Dockerfile delete mode 100644 old/Procfile delete mode 100644 old/README.md delete mode 100644 old/authentication/__init__.py delete mode 100644 old/authentication/admin.py delete mode 100644 old/authentication/apps.py delete mode 100644 old/authentication/cas_wrapper.py delete mode 100644 old/authentication/manualSSO.py delete mode 100644 old/authentication/migrations/0001_initial.py delete mode 100644 old/authentication/migrations/0002_config.py delete mode 100644 old/authentication/migrations/0003_auto_20201113_0949.py delete mode 100644 old/authentication/migrations/0004_delete_user.py delete mode 100644 old/authentication/migrations/__init__.py delete mode 100644 old/authentication/models.py delete mode 100644 old/authentication/role.py delete mode 100644 old/authentication/serializers.py delete mode 100644 old/authentication/static/sso/kodoru.json delete mode 100644 old/authentication/tests.py delete mode 100644 old/authentication/urls.py delete mode 100644 old/authentication/views.py delete mode 100644 old/core/__init__.py delete mode 100644 old/core/admin.py delete mode 100644 old/core/apps.py delete mode 100644 old/core/errors/views.py delete mode 100644 old/core/migrations/__init__.py delete mode 100644 old/core/models.py delete mode 100644 old/core/tests.py delete mode 100644 old/core/views.py delete mode 100644 old/db.json delete mode 100644 old/db2.json delete mode 100644 old/docker-compose.yml delete mode 100644 old/docker-entrypoint.sh delete mode 100644 old/fixtures.json delete mode 100644 old/laporan_praktikum/__init__.py delete mode 100644 old/laporan_praktikum/admin.py delete mode 100644 old/laporan_praktikum/apps.py delete mode 100644 old/laporan_praktikum/custom_module/__init__.py delete mode 100644 old/laporan_praktikum/custom_module/parse_time.py delete mode 100644 old/laporan_praktikum/error_message/__init__.py delete mode 100644 old/laporan_praktikum/error_message/error_message.py delete mode 100644 old/laporan_praktikum/migrations/0001_initial.py delete mode 100644 old/laporan_praktikum/migrations/0002_auto_20200603_1450.py delete mode 100644 old/laporan_praktikum/migrations/0003_auto_20200603_1451.py delete mode 100644 old/laporan_praktikum/migrations/0004_auto_20200603_1455.py delete mode 100644 old/laporan_praktikum/migrations/0005_auto_20200603_1944.py delete mode 100644 old/laporan_praktikum/migrations/__init__.py delete mode 100644 old/laporan_praktikum/models.py delete mode 100644 old/laporan_praktikum/serializers.py delete mode 100644 old/laporan_praktikum/supervisor_lembaga/__init__.py delete mode 100644 old/laporan_praktikum/supervisor_lembaga/views_supv_lembaga.py delete mode 100644 old/laporan_praktikum/supervisor_sekolah/__init__.py delete mode 100644 old/laporan_praktikum/supervisor_sekolah/views.py delete mode 100644 old/laporan_praktikum/tests/__init__.py delete mode 100644 old/laporan_praktikum/tests/test_model.py delete mode 100644 old/laporan_praktikum/tests/test_serializers.py delete mode 100644 old/laporan_praktikum/tests/test_views.py delete mode 100644 old/laporan_praktikum/urls.py delete mode 100644 old/laporan_praktikum/views.py delete mode 100644 old/laporan_praktikum/views_riwayat.py delete mode 100644 old/lembaga/__init__.py delete mode 100644 old/lembaga/admin.py delete mode 100644 old/lembaga/apps.py delete mode 100644 old/lembaga/migrations/0001_initial.py delete mode 100644 old/lembaga/migrations/0002_auto_20200604_0324.py delete mode 100644 old/lembaga/migrations/0003_carousel.py delete mode 100644 old/lembaga/migrations/0004_auto_20201105_2133.py delete mode 100644 old/lembaga/migrations/__init__.py delete mode 100644 old/lembaga/models.py delete mode 100644 old/lembaga/serializers.py delete mode 100644 old/lembaga/tests.py delete mode 100644 old/lembaga/urls.py delete mode 100644 old/lembaga/views.py delete mode 100644 old/manage.py delete mode 100644 old/migrate.sh delete mode 100644 old/new/.dockerignore delete mode 100644 old/new/.gitignore delete mode 100644 old/new/.gitlab-ci.yml delete mode 100644 old/new/Dockerfile delete mode 100644 old/new/Procfile delete mode 100644 old/new/README.md delete mode 100644 old/new/authentication/__init__.py delete mode 100644 old/new/authentication/admin.py delete mode 100644 old/new/authentication/apps.py delete mode 100644 old/new/authentication/cas_wrapper.py delete mode 100644 old/new/authentication/manualSSO.py delete mode 100644 old/new/authentication/models.py delete mode 100644 old/new/authentication/role.py delete mode 100644 old/new/authentication/serializers.py delete mode 100644 old/new/authentication/static/sso/kodoru.json delete mode 100644 old/new/authentication/tests.py delete mode 100644 old/new/authentication/urls.py delete mode 100644 old/new/authentication/views.py delete mode 100644 old/new/core/__init__.py delete mode 100644 old/new/core/admin.py delete mode 100644 old/new/core/apps.py delete mode 100644 old/new/core/errors/views.py delete mode 100644 old/new/core/models.py delete mode 100644 old/new/core/tests.py delete mode 100644 old/new/core/views.py delete mode 100644 old/new/db.json delete mode 100644 old/new/db2.json delete mode 100644 old/new/docker-compose.yml delete mode 100644 old/new/docker-entrypoint.sh delete mode 100644 old/new/fixtures.json delete mode 100644 old/new/laporan_praktikum/__init__.py delete mode 100644 old/new/laporan_praktikum/admin.py delete mode 100644 old/new/laporan_praktikum/apps.py delete mode 100644 old/new/laporan_praktikum/custom_module/__init__.py delete mode 100644 old/new/laporan_praktikum/custom_module/parse_time.py delete mode 100644 old/new/laporan_praktikum/error_message/__init__.py delete mode 100644 old/new/laporan_praktikum/error_message/error_message.py delete mode 100644 old/new/laporan_praktikum/models.py delete mode 100644 old/new/laporan_praktikum/serializers.py delete mode 100644 old/new/laporan_praktikum/supervisor_lembaga/__init__.py delete mode 100644 old/new/laporan_praktikum/supervisor_lembaga/views_supv_lembaga.py delete mode 100644 old/new/laporan_praktikum/supervisor_sekolah/__init__.py delete mode 100644 old/new/laporan_praktikum/supervisor_sekolah/views.py delete mode 100644 old/new/laporan_praktikum/tests/__init__.py delete mode 100644 old/new/laporan_praktikum/tests/test_model.py delete mode 100644 old/new/laporan_praktikum/tests/test_serializers.py delete mode 100644 old/new/laporan_praktikum/tests/test_views.py delete mode 100644 old/new/laporan_praktikum/urls.py delete mode 100644 old/new/laporan_praktikum/views.py delete mode 100644 old/new/laporan_praktikum/views_riwayat.py delete mode 100644 old/new/lembaga/__init__.py delete mode 100644 old/new/lembaga/admin.py delete mode 100644 old/new/lembaga/apps.py delete mode 100644 old/new/lembaga/models.py delete mode 100644 old/new/lembaga/serializers.py delete mode 100644 old/new/lembaga/tests.py delete mode 100644 old/new/lembaga/urls.py delete mode 100644 old/new/lembaga/views.py delete mode 100644 old/new/manage.py delete mode 100644 old/new/requirements.txt delete mode 100644 old/new/seeder_dev.py delete mode 100644 old/new/seeder_staging.py delete mode 100644 old/new/server-setup.sh delete mode 100644 old/new/setup.cfg delete mode 100644 old/new/sip/__init__.py delete mode 100644 old/new/sip/asgi.py delete mode 100644 old/new/sip/settings/.env.example delete mode 100644 old/new/sip/settings/dev.py delete mode 100644 old/new/sip/settings/production.py delete mode 100644 old/new/sip/settings/staging.py delete mode 100644 old/new/sip/settings/static/admin/css/autocomplete.css delete mode 100644 old/new/sip/settings/static/admin/css/base.css delete mode 100644 old/new/sip/settings/static/admin/css/changelists.css delete mode 100644 old/new/sip/settings/static/admin/css/dashboard.css delete mode 100644 old/new/sip/settings/static/admin/css/fonts.css delete mode 100644 old/new/sip/settings/static/admin/css/forms.css delete mode 100644 old/new/sip/settings/static/admin/css/login.css delete mode 100644 old/new/sip/settings/static/admin/css/nav_sidebar.css delete mode 100644 old/new/sip/settings/static/admin/css/responsive.css delete mode 100644 old/new/sip/settings/static/admin/css/responsive_rtl.css delete mode 100644 old/new/sip/settings/static/admin/css/rtl.css delete mode 100644 old/new/sip/settings/static/admin/css/vendor/select2/LICENSE-SELECT2.md delete mode 100644 old/new/sip/settings/static/admin/css/vendor/select2/select2.css delete mode 100644 old/new/sip/settings/static/admin/css/vendor/select2/select2.min.css delete mode 100644 old/new/sip/settings/static/admin/css/widgets.css delete mode 100644 old/new/sip/settings/static/admin/fonts/LICENSE.txt delete mode 100644 old/new/sip/settings/static/admin/fonts/README.txt delete mode 100644 old/new/sip/settings/static/admin/fonts/Roboto-Bold-webfont.woff delete mode 100644 old/new/sip/settings/static/admin/fonts/Roboto-Light-webfont.woff delete mode 100644 old/new/sip/settings/static/admin/fonts/Roboto-Regular-webfont.woff delete mode 100644 old/new/sip/settings/static/admin/img/LICENSE delete mode 100644 old/new/sip/settings/static/admin/img/README.txt delete mode 100644 old/new/sip/settings/static/admin/img/calendar-icons.svg delete mode 100644 old/new/sip/settings/static/admin/img/gis/move_vertex_off.svg delete mode 100644 old/new/sip/settings/static/admin/img/gis/move_vertex_on.svg delete mode 100644 old/new/sip/settings/static/admin/img/icon-addlink.svg delete mode 100644 old/new/sip/settings/static/admin/img/icon-alert.svg delete mode 100644 old/new/sip/settings/static/admin/img/icon-calendar.svg delete mode 100644 old/new/sip/settings/static/admin/img/icon-changelink.svg delete mode 100644 old/new/sip/settings/static/admin/img/icon-clock.svg delete mode 100644 old/new/sip/settings/static/admin/img/icon-deletelink.svg delete mode 100644 old/new/sip/settings/static/admin/img/icon-no.svg delete mode 100644 old/new/sip/settings/static/admin/img/icon-unknown-alt.svg delete mode 100644 old/new/sip/settings/static/admin/img/icon-unknown.svg delete mode 100644 old/new/sip/settings/static/admin/img/icon-viewlink.svg delete mode 100644 old/new/sip/settings/static/admin/img/icon-yes.svg delete mode 100644 old/new/sip/settings/static/admin/img/inline-delete.svg delete mode 100644 old/new/sip/settings/static/admin/img/search.svg delete mode 100644 old/new/sip/settings/static/admin/img/selector-icons.svg delete mode 100644 old/new/sip/settings/static/admin/img/sorting-icons.svg delete mode 100644 old/new/sip/settings/static/admin/img/tooltag-add.svg delete mode 100644 old/new/sip/settings/static/admin/img/tooltag-arrowright.svg delete mode 100644 old/new/sip/settings/static/admin/js/SelectBox.js delete mode 100644 old/new/sip/settings/static/admin/js/SelectFilter2.js delete mode 100644 old/new/sip/settings/static/admin/js/actions.js delete mode 100644 old/new/sip/settings/static/admin/js/actions.min.js delete mode 100644 old/new/sip/settings/static/admin/js/admin/DateTimeShortcuts.js delete mode 100644 old/new/sip/settings/static/admin/js/admin/RelatedObjectLookups.js delete mode 100644 old/new/sip/settings/static/admin/js/autocomplete.js delete mode 100644 old/new/sip/settings/static/admin/js/calendar.js delete mode 100644 old/new/sip/settings/static/admin/js/cancel.js delete mode 100644 old/new/sip/settings/static/admin/js/change_form.js delete mode 100644 old/new/sip/settings/static/admin/js/collapse.js delete mode 100644 old/new/sip/settings/static/admin/js/collapse.min.js delete mode 100644 old/new/sip/settings/static/admin/js/core.js delete mode 100644 old/new/sip/settings/static/admin/js/inlines.js delete mode 100644 old/new/sip/settings/static/admin/js/inlines.min.js delete mode 100644 old/new/sip/settings/static/admin/js/jquery.init.js delete mode 100644 old/new/sip/settings/static/admin/js/nav_sidebar.js delete mode 100644 old/new/sip/settings/static/admin/js/popup_response.js delete mode 100644 old/new/sip/settings/static/admin/js/prepopulate.js delete mode 100644 old/new/sip/settings/static/admin/js/prepopulate.min.js delete mode 100644 old/new/sip/settings/static/admin/js/prepopulate_init.js delete mode 100644 old/new/sip/settings/static/admin/js/urlify.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/jquery/LICENSE.txt delete mode 100644 old/new/sip/settings/static/admin/js/vendor/jquery/jquery.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/jquery/jquery.min.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/LICENSE.md delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/af.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/ar.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/az.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/bg.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/bn.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/bs.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/ca.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/cs.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/da.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/de.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/dsb.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/el.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/en.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/es.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/et.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/eu.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/fa.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/fi.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/fr.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/gl.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/he.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/hi.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/hr.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/hsb.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/hu.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/hy.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/id.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/is.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/it.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/ja.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/ka.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/km.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/ko.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/lt.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/lv.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/mk.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/ms.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/nb.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/ne.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/nl.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/pl.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/ps.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/pt-BR.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/pt.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/ro.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/ru.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/sk.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/sl.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/sq.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/sr-Cyrl.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/sr.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/sv.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/th.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/tk.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/tr.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/uk.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/vi.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/zh-CN.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/i18n/zh-TW.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/select2.full.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/select2/select2.full.min.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/xregexp/LICENSE.txt delete mode 100644 old/new/sip/settings/static/admin/js/vendor/xregexp/xregexp.js delete mode 100644 old/new/sip/settings/static/admin/js/vendor/xregexp/xregexp.min.js delete mode 100644 old/new/sip/settings/static/drf-yasg/immutable.min.js delete mode 100644 old/new/sip/settings/static/drf-yasg/insQ.min.js delete mode 100644 old/new/sip/settings/static/drf-yasg/redoc-init.js delete mode 100644 old/new/sip/settings/static/drf-yasg/redoc-old/redoc.min.js delete mode 100644 old/new/sip/settings/static/drf-yasg/redoc/redoc-logo.png delete mode 100644 old/new/sip/settings/static/drf-yasg/redoc/redoc.min.js delete mode 100644 old/new/sip/settings/static/drf-yasg/style.css delete mode 100644 old/new/sip/settings/static/drf-yasg/swagger-ui-dist/absolute-path.js delete mode 100644 old/new/sip/settings/static/drf-yasg/swagger-ui-dist/favicon-32x32.png delete mode 100644 old/new/sip/settings/static/drf-yasg/swagger-ui-dist/index.js delete mode 100644 old/new/sip/settings/static/drf-yasg/swagger-ui-dist/oauth2-redirect.html delete mode 100644 old/new/sip/settings/static/drf-yasg/swagger-ui-dist/swagger-ui-bundle.js delete mode 100644 old/new/sip/settings/static/drf-yasg/swagger-ui-dist/swagger-ui-standalone-preset.js delete mode 100644 old/new/sip/settings/static/drf-yasg/swagger-ui-dist/swagger-ui.css delete mode 100644 old/new/sip/settings/static/drf-yasg/swagger-ui-init.js delete mode 100644 old/new/sip/settings/static/drf-yasg/url-polyfill.min.js delete mode 100644 old/new/sip/settings/static/makara-ui-fasilkom.png delete mode 100644 old/new/sip/settings/static/rest_framework/css/bootstrap-theme.min.css delete mode 100644 old/new/sip/settings/static/rest_framework/css/bootstrap-tweaks.css delete mode 100644 old/new/sip/settings/static/rest_framework/css/bootstrap.min.css delete mode 100644 old/new/sip/settings/static/rest_framework/css/default.css delete mode 100644 old/new/sip/settings/static/rest_framework/css/font-awesome-4.0.3.css delete mode 100644 old/new/sip/settings/static/rest_framework/css/prettify.css delete mode 100644 old/new/sip/settings/static/rest_framework/docs/css/base.css delete mode 100644 old/new/sip/settings/static/rest_framework/docs/css/highlight.css delete mode 100644 old/new/sip/settings/static/rest_framework/docs/css/jquery.json-view.min.css delete mode 100644 old/new/sip/settings/static/rest_framework/docs/img/favicon.ico delete mode 100644 old/new/sip/settings/static/rest_framework/docs/img/grid.png delete mode 100644 old/new/sip/settings/static/rest_framework/docs/js/api.js delete mode 100644 old/new/sip/settings/static/rest_framework/docs/js/highlight.pack.js delete mode 100644 old/new/sip/settings/static/rest_framework/docs/js/jquery.json-view.min.js delete mode 100644 old/new/sip/settings/static/rest_framework/fonts/fontawesome-webfont.eot delete mode 100644 old/new/sip/settings/static/rest_framework/fonts/fontawesome-webfont.svg delete mode 100644 old/new/sip/settings/static/rest_framework/fonts/fontawesome-webfont.ttf delete mode 100644 old/new/sip/settings/static/rest_framework/fonts/fontawesome-webfont.woff delete mode 100644 old/new/sip/settings/static/rest_framework/fonts/glyphicons-halflings-regular.eot delete mode 100644 old/new/sip/settings/static/rest_framework/fonts/glyphicons-halflings-regular.svg delete mode 100644 old/new/sip/settings/static/rest_framework/fonts/glyphicons-halflings-regular.ttf delete mode 100644 old/new/sip/settings/static/rest_framework/fonts/glyphicons-halflings-regular.woff delete mode 100644 old/new/sip/settings/static/rest_framework/fonts/glyphicons-halflings-regular.woff2 delete mode 100644 old/new/sip/settings/static/rest_framework/img/glyphicons-halflings-white.png delete mode 100644 old/new/sip/settings/static/rest_framework/img/glyphicons-halflings.png delete mode 100644 old/new/sip/settings/static/rest_framework/img/grid.png delete mode 100644 old/new/sip/settings/static/rest_framework/js/ajax-form.js delete mode 100644 old/new/sip/settings/static/rest_framework/js/bootstrap.min.js delete mode 100644 old/new/sip/settings/static/rest_framework/js/coreapi-0.1.1.js delete mode 100644 old/new/sip/settings/static/rest_framework/js/csrf.js delete mode 100644 old/new/sip/settings/static/rest_framework/js/default.js delete mode 100644 old/new/sip/settings/static/rest_framework/js/jquery-3.4.1.min.js delete mode 100644 old/new/sip/settings/static/rest_framework/js/prettify-min.js delete mode 100644 old/new/sip/settings/static/sso/kodoru.json delete mode 100644 old/new/sip/settings/storage_backends.py delete mode 100644 old/new/sip/static/.gitkeep delete mode 100644 old/new/sip/urls.py delete mode 100644 old/new/sip/wsgi.py delete mode 100644 old/new/sonar-project.properties delete mode 100644 old/new/static/makara-ui-fasilkom.png delete mode 100644 old/new/test.json delete mode 100644 old/old/.dockerignore delete mode 100644 old/old/.gitignore delete mode 100644 old/old/.gitlab-ci.yml delete mode 100644 old/old/Dockerfile delete mode 100644 old/old/Procfile delete mode 100644 old/old/README.md delete mode 100644 old/old/authentication/__init__.py delete mode 100644 old/old/authentication/admin.py delete mode 100644 old/old/authentication/apps.py delete mode 100644 old/old/authentication/cas_wrapper.py delete mode 100644 old/old/authentication/manualSSO.py delete mode 100644 old/old/authentication/models.py delete mode 100644 old/old/authentication/role.py delete mode 100644 old/old/authentication/serializers.py delete mode 100644 old/old/authentication/static/sso/kodoru.json delete mode 100644 old/old/authentication/tests.py delete mode 100644 old/old/authentication/urls.py delete mode 100644 old/old/authentication/views.py delete mode 100644 old/old/core/__init__.py delete mode 100644 old/old/core/admin.py delete mode 100644 old/old/core/apps.py delete mode 100644 old/old/core/errors/views.py delete mode 100644 old/old/core/models.py delete mode 100644 old/old/core/tests.py delete mode 100644 old/old/core/views.py delete mode 100644 old/old/db.json delete mode 100644 old/old/db2.json delete mode 100644 old/old/docker-compose.yml delete mode 100644 old/old/docker-entrypoint.sh delete mode 100644 old/old/fixtures.json delete mode 100644 old/old/laporan_praktikum/__init__.py delete mode 100644 old/old/laporan_praktikum/admin.py delete mode 100644 old/old/laporan_praktikum/apps.py delete mode 100644 old/old/laporan_praktikum/custom_module/__init__.py delete mode 100644 old/old/laporan_praktikum/custom_module/parse_time.py delete mode 100644 old/old/laporan_praktikum/error_message/__init__.py delete mode 100644 old/old/laporan_praktikum/error_message/error_message.py delete mode 100644 old/old/laporan_praktikum/models.py delete mode 100644 old/old/laporan_praktikum/serializers.py delete mode 100644 old/old/laporan_praktikum/supervisor_lembaga/__init__.py delete mode 100644 old/old/laporan_praktikum/supervisor_lembaga/views_supv_lembaga.py delete mode 100644 old/old/laporan_praktikum/supervisor_sekolah/__init__.py delete mode 100644 old/old/laporan_praktikum/supervisor_sekolah/views.py delete mode 100644 old/old/laporan_praktikum/tests/__init__.py delete mode 100644 old/old/laporan_praktikum/tests/test_model.py delete mode 100644 old/old/laporan_praktikum/tests/test_serializers.py delete mode 100644 old/old/laporan_praktikum/tests/test_views.py delete mode 100644 old/old/laporan_praktikum/urls.py delete mode 100644 old/old/laporan_praktikum/views.py delete mode 100644 old/old/laporan_praktikum/views_riwayat.py delete mode 100644 old/old/lembaga/__init__.py delete mode 100644 old/old/lembaga/admin.py delete mode 100644 old/old/lembaga/apps.py delete mode 100644 old/old/lembaga/models.py delete mode 100644 old/old/lembaga/serializers.py delete mode 100644 old/old/lembaga/tests.py delete mode 100644 old/old/lembaga/urls.py delete mode 100644 old/old/lembaga/views.py delete mode 100644 old/old/manage.py delete mode 100644 old/old/requirements.txt delete mode 100644 old/old/seeder_dev.py delete mode 100644 old/old/seeder_staging.py delete mode 100644 old/old/server-setup.sh delete mode 100644 old/old/setup.cfg delete mode 100644 old/old/sip/__init__.py delete mode 100644 old/old/sip/asgi.py delete mode 100644 old/old/sip/settings/.env.example delete mode 100644 old/old/sip/settings/dev.py delete mode 100644 old/old/sip/settings/production.py delete mode 100644 old/old/sip/settings/staging.py delete mode 100644 old/old/sip/settings/static/admin/css/autocomplete.css delete mode 100644 old/old/sip/settings/static/admin/css/base.css delete mode 100644 old/old/sip/settings/static/admin/css/changelists.css delete mode 100644 old/old/sip/settings/static/admin/css/dashboard.css delete mode 100644 old/old/sip/settings/static/admin/css/fonts.css delete mode 100644 old/old/sip/settings/static/admin/css/forms.css delete mode 100644 old/old/sip/settings/static/admin/css/login.css delete mode 100644 old/old/sip/settings/static/admin/css/nav_sidebar.css delete mode 100644 old/old/sip/settings/static/admin/css/responsive.css delete mode 100644 old/old/sip/settings/static/admin/css/responsive_rtl.css delete mode 100644 old/old/sip/settings/static/admin/css/rtl.css delete mode 100644 old/old/sip/settings/static/admin/css/vendor/select2/LICENSE-SELECT2.md delete mode 100644 old/old/sip/settings/static/admin/css/vendor/select2/select2.css delete mode 100644 old/old/sip/settings/static/admin/css/vendor/select2/select2.min.css delete mode 100644 old/old/sip/settings/static/admin/css/widgets.css delete mode 100644 old/old/sip/settings/static/admin/fonts/LICENSE.txt delete mode 100644 old/old/sip/settings/static/admin/fonts/README.txt delete mode 100644 old/old/sip/settings/static/admin/fonts/Roboto-Bold-webfont.woff delete mode 100644 old/old/sip/settings/static/admin/fonts/Roboto-Light-webfont.woff delete mode 100644 old/old/sip/settings/static/admin/fonts/Roboto-Regular-webfont.woff delete mode 100644 old/old/sip/settings/static/admin/img/LICENSE delete mode 100644 old/old/sip/settings/static/admin/img/README.txt delete mode 100644 old/old/sip/settings/static/admin/img/calendar-icons.svg delete mode 100644 old/old/sip/settings/static/admin/img/gis/move_vertex_off.svg delete mode 100644 old/old/sip/settings/static/admin/img/gis/move_vertex_on.svg delete mode 100644 old/old/sip/settings/static/admin/img/icon-addlink.svg delete mode 100644 old/old/sip/settings/static/admin/img/icon-alert.svg delete mode 100644 old/old/sip/settings/static/admin/img/icon-calendar.svg delete mode 100644 old/old/sip/settings/static/admin/img/icon-changelink.svg delete mode 100644 old/old/sip/settings/static/admin/img/icon-clock.svg delete mode 100644 old/old/sip/settings/static/admin/img/icon-deletelink.svg delete mode 100644 old/old/sip/settings/static/admin/img/icon-no.svg delete mode 100644 old/old/sip/settings/static/admin/img/icon-unknown-alt.svg delete mode 100644 old/old/sip/settings/static/admin/img/icon-unknown.svg delete mode 100644 old/old/sip/settings/static/admin/img/icon-viewlink.svg delete mode 100644 old/old/sip/settings/static/admin/img/icon-yes.svg delete mode 100644 old/old/sip/settings/static/admin/img/inline-delete.svg delete mode 100644 old/old/sip/settings/static/admin/img/search.svg delete mode 100644 old/old/sip/settings/static/admin/img/selector-icons.svg delete mode 100644 old/old/sip/settings/static/admin/img/sorting-icons.svg delete mode 100644 old/old/sip/settings/static/admin/img/tooltag-add.svg delete mode 100644 old/old/sip/settings/static/admin/img/tooltag-arrowright.svg delete mode 100644 old/old/sip/settings/static/admin/js/SelectBox.js delete mode 100644 old/old/sip/settings/static/admin/js/SelectFilter2.js delete mode 100644 old/old/sip/settings/static/admin/js/actions.js delete mode 100644 old/old/sip/settings/static/admin/js/actions.min.js delete mode 100644 old/old/sip/settings/static/admin/js/admin/DateTimeShortcuts.js delete mode 100644 old/old/sip/settings/static/admin/js/admin/RelatedObjectLookups.js delete mode 100644 old/old/sip/settings/static/admin/js/autocomplete.js delete mode 100644 old/old/sip/settings/static/admin/js/calendar.js delete mode 100644 old/old/sip/settings/static/admin/js/cancel.js delete mode 100644 old/old/sip/settings/static/admin/js/change_form.js delete mode 100644 old/old/sip/settings/static/admin/js/collapse.js delete mode 100644 old/old/sip/settings/static/admin/js/collapse.min.js delete mode 100644 old/old/sip/settings/static/admin/js/core.js delete mode 100644 old/old/sip/settings/static/admin/js/inlines.js delete mode 100644 old/old/sip/settings/static/admin/js/inlines.min.js delete mode 100644 old/old/sip/settings/static/admin/js/jquery.init.js delete mode 100644 old/old/sip/settings/static/admin/js/nav_sidebar.js delete mode 100644 old/old/sip/settings/static/admin/js/popup_response.js delete mode 100644 old/old/sip/settings/static/admin/js/prepopulate.js delete mode 100644 old/old/sip/settings/static/admin/js/prepopulate.min.js delete mode 100644 old/old/sip/settings/static/admin/js/prepopulate_init.js delete mode 100644 old/old/sip/settings/static/admin/js/urlify.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/jquery/LICENSE.txt delete mode 100644 old/old/sip/settings/static/admin/js/vendor/jquery/jquery.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/jquery/jquery.min.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/LICENSE.md delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/af.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/ar.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/az.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/bg.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/bn.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/bs.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/ca.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/cs.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/da.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/de.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/dsb.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/el.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/en.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/es.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/et.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/eu.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/fa.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/fi.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/fr.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/gl.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/he.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/hi.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/hr.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/hsb.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/hu.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/hy.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/id.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/is.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/it.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/ja.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/ka.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/km.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/ko.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/lt.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/lv.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/mk.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/ms.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/nb.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/ne.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/nl.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/pl.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/ps.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/pt-BR.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/pt.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/ro.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/ru.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/sk.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/sl.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/sq.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/sr-Cyrl.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/sr.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/sv.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/th.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/tk.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/tr.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/uk.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/vi.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/zh-CN.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/i18n/zh-TW.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/select2.full.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/select2/select2.full.min.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/xregexp/LICENSE.txt delete mode 100644 old/old/sip/settings/static/admin/js/vendor/xregexp/xregexp.js delete mode 100644 old/old/sip/settings/static/admin/js/vendor/xregexp/xregexp.min.js delete mode 100644 old/old/sip/settings/static/drf-yasg/immutable.min.js delete mode 100644 old/old/sip/settings/static/drf-yasg/insQ.min.js delete mode 100644 old/old/sip/settings/static/drf-yasg/redoc-init.js delete mode 100644 old/old/sip/settings/static/drf-yasg/redoc-old/redoc.min.js delete mode 100644 old/old/sip/settings/static/drf-yasg/redoc/redoc-logo.png delete mode 100644 old/old/sip/settings/static/drf-yasg/redoc/redoc.min.js delete mode 100644 old/old/sip/settings/static/drf-yasg/style.css delete mode 100644 old/old/sip/settings/static/drf-yasg/swagger-ui-dist/absolute-path.js delete mode 100644 old/old/sip/settings/static/drf-yasg/swagger-ui-dist/favicon-32x32.png delete mode 100644 old/old/sip/settings/static/drf-yasg/swagger-ui-dist/index.js delete mode 100644 old/old/sip/settings/static/drf-yasg/swagger-ui-dist/oauth2-redirect.html delete mode 100644 old/old/sip/settings/static/drf-yasg/swagger-ui-dist/swagger-ui-bundle.js delete mode 100644 old/old/sip/settings/static/drf-yasg/swagger-ui-dist/swagger-ui-standalone-preset.js delete mode 100644 old/old/sip/settings/static/drf-yasg/swagger-ui-dist/swagger-ui.css delete mode 100644 old/old/sip/settings/static/drf-yasg/swagger-ui-init.js delete mode 100644 old/old/sip/settings/static/drf-yasg/url-polyfill.min.js delete mode 100644 old/old/sip/settings/static/makara-ui-fasilkom.png delete mode 100644 old/old/sip/settings/static/rest_framework/css/bootstrap-theme.min.css delete mode 100644 old/old/sip/settings/static/rest_framework/css/bootstrap-tweaks.css delete mode 100644 old/old/sip/settings/static/rest_framework/css/bootstrap.min.css delete mode 100644 old/old/sip/settings/static/rest_framework/css/default.css delete mode 100644 old/old/sip/settings/static/rest_framework/css/font-awesome-4.0.3.css delete mode 100644 old/old/sip/settings/static/rest_framework/css/prettify.css delete mode 100644 old/old/sip/settings/static/rest_framework/docs/css/base.css delete mode 100644 old/old/sip/settings/static/rest_framework/docs/css/highlight.css delete mode 100644 old/old/sip/settings/static/rest_framework/docs/css/jquery.json-view.min.css delete mode 100644 old/old/sip/settings/static/rest_framework/docs/img/favicon.ico delete mode 100644 old/old/sip/settings/static/rest_framework/docs/img/grid.png delete mode 100644 old/old/sip/settings/static/rest_framework/docs/js/api.js delete mode 100644 old/old/sip/settings/static/rest_framework/docs/js/highlight.pack.js delete mode 100644 old/old/sip/settings/static/rest_framework/docs/js/jquery.json-view.min.js delete mode 100644 old/old/sip/settings/static/rest_framework/fonts/fontawesome-webfont.eot delete mode 100644 old/old/sip/settings/static/rest_framework/fonts/fontawesome-webfont.svg delete mode 100644 old/old/sip/settings/static/rest_framework/fonts/fontawesome-webfont.ttf delete mode 100644 old/old/sip/settings/static/rest_framework/fonts/fontawesome-webfont.woff delete mode 100644 old/old/sip/settings/static/rest_framework/fonts/glyphicons-halflings-regular.eot delete mode 100644 old/old/sip/settings/static/rest_framework/fonts/glyphicons-halflings-regular.svg delete mode 100644 old/old/sip/settings/static/rest_framework/fonts/glyphicons-halflings-regular.ttf delete mode 100644 old/old/sip/settings/static/rest_framework/fonts/glyphicons-halflings-regular.woff delete mode 100644 old/old/sip/settings/static/rest_framework/fonts/glyphicons-halflings-regular.woff2 delete mode 100644 old/old/sip/settings/static/rest_framework/img/glyphicons-halflings-white.png delete mode 100644 old/old/sip/settings/static/rest_framework/img/glyphicons-halflings.png delete mode 100644 old/old/sip/settings/static/rest_framework/img/grid.png delete mode 100644 old/old/sip/settings/static/rest_framework/js/ajax-form.js delete mode 100644 old/old/sip/settings/static/rest_framework/js/bootstrap.min.js delete mode 100644 old/old/sip/settings/static/rest_framework/js/coreapi-0.1.1.js delete mode 100644 old/old/sip/settings/static/rest_framework/js/csrf.js delete mode 100644 old/old/sip/settings/static/rest_framework/js/default.js delete mode 100644 old/old/sip/settings/static/rest_framework/js/jquery-3.4.1.min.js delete mode 100644 old/old/sip/settings/static/rest_framework/js/prettify-min.js delete mode 100644 old/old/sip/settings/static/sso/kodoru.json delete mode 100644 old/old/sip/settings/storage_backends.py delete mode 100644 old/old/sip/static/.gitkeep delete mode 100644 old/old/sip/urls.py delete mode 100644 old/old/sip/wsgi.py delete mode 100644 old/old/sonar-project.properties delete mode 100644 old/old/static/makara-ui-fasilkom.png delete mode 100644 old/old/test.json delete mode 100644 old/requirements.txt delete mode 100644 old/seeder_dev.py delete mode 100644 old/seeder_staging.py delete mode 100644 old/server-setup.sh delete mode 100644 old/setup.cfg delete mode 100644 old/sip/__init__.py delete mode 100644 old/sip/asgi.py delete mode 100644 old/sip/settings/.env.example delete mode 100644 old/sip/settings/dev.py delete mode 100644 old/sip/settings/production.py delete mode 100644 old/sip/settings/staging.py delete mode 100644 old/sip/settings/static/admin/css/autocomplete.css delete mode 100644 old/sip/settings/static/admin/css/base.css delete mode 100644 old/sip/settings/static/admin/css/changelists.css delete mode 100644 old/sip/settings/static/admin/css/dashboard.css delete mode 100644 old/sip/settings/static/admin/css/fonts.css delete mode 100644 old/sip/settings/static/admin/css/forms.css delete mode 100644 old/sip/settings/static/admin/css/login.css delete mode 100644 old/sip/settings/static/admin/css/nav_sidebar.css delete mode 100644 old/sip/settings/static/admin/css/responsive.css delete mode 100644 old/sip/settings/static/admin/css/responsive_rtl.css delete mode 100644 old/sip/settings/static/admin/css/rtl.css delete mode 100644 old/sip/settings/static/admin/css/vendor/select2/LICENSE-SELECT2.md delete mode 100644 old/sip/settings/static/admin/css/vendor/select2/select2.css delete mode 100644 old/sip/settings/static/admin/css/vendor/select2/select2.min.css delete mode 100644 old/sip/settings/static/admin/css/widgets.css delete mode 100644 old/sip/settings/static/admin/fonts/LICENSE.txt delete mode 100644 old/sip/settings/static/admin/fonts/README.txt delete mode 100644 old/sip/settings/static/admin/fonts/Roboto-Bold-webfont.woff delete mode 100644 old/sip/settings/static/admin/fonts/Roboto-Light-webfont.woff delete mode 100644 old/sip/settings/static/admin/fonts/Roboto-Regular-webfont.woff delete mode 100644 old/sip/settings/static/admin/img/LICENSE delete mode 100644 old/sip/settings/static/admin/img/README.txt delete mode 100644 old/sip/settings/static/admin/img/calendar-icons.svg delete mode 100644 old/sip/settings/static/admin/img/gis/move_vertex_off.svg delete mode 100644 old/sip/settings/static/admin/img/gis/move_vertex_on.svg delete mode 100644 old/sip/settings/static/admin/img/icon-addlink.svg delete mode 100644 old/sip/settings/static/admin/img/icon-alert.svg delete mode 100644 old/sip/settings/static/admin/img/icon-calendar.svg delete mode 100644 old/sip/settings/static/admin/img/icon-changelink.svg delete mode 100644 old/sip/settings/static/admin/img/icon-clock.svg delete mode 100644 old/sip/settings/static/admin/img/icon-deletelink.svg delete mode 100644 old/sip/settings/static/admin/img/icon-no.svg delete mode 100644 old/sip/settings/static/admin/img/icon-unknown-alt.svg delete mode 100644 old/sip/settings/static/admin/img/icon-unknown.svg delete mode 100644 old/sip/settings/static/admin/img/icon-viewlink.svg delete mode 100644 old/sip/settings/static/admin/img/icon-yes.svg delete mode 100644 old/sip/settings/static/admin/img/inline-delete.svg delete mode 100644 old/sip/settings/static/admin/img/search.svg delete mode 100644 old/sip/settings/static/admin/img/selector-icons.svg delete mode 100644 old/sip/settings/static/admin/img/sorting-icons.svg delete mode 100644 old/sip/settings/static/admin/img/tooltag-add.svg delete mode 100644 old/sip/settings/static/admin/img/tooltag-arrowright.svg delete mode 100644 old/sip/settings/static/admin/js/SelectBox.js delete mode 100644 old/sip/settings/static/admin/js/SelectFilter2.js delete mode 100644 old/sip/settings/static/admin/js/actions.js delete mode 100644 old/sip/settings/static/admin/js/actions.min.js delete mode 100644 old/sip/settings/static/admin/js/admin/DateTimeShortcuts.js delete mode 100644 old/sip/settings/static/admin/js/admin/RelatedObjectLookups.js delete mode 100644 old/sip/settings/static/admin/js/autocomplete.js delete mode 100644 old/sip/settings/static/admin/js/calendar.js delete mode 100644 old/sip/settings/static/admin/js/cancel.js delete mode 100644 old/sip/settings/static/admin/js/change_form.js delete mode 100644 old/sip/settings/static/admin/js/collapse.js delete mode 100644 old/sip/settings/static/admin/js/collapse.min.js delete mode 100644 old/sip/settings/static/admin/js/core.js delete mode 100644 old/sip/settings/static/admin/js/inlines.js delete mode 100644 old/sip/settings/static/admin/js/inlines.min.js delete mode 100644 old/sip/settings/static/admin/js/jquery.init.js delete mode 100644 old/sip/settings/static/admin/js/nav_sidebar.js delete mode 100644 old/sip/settings/static/admin/js/popup_response.js delete mode 100644 old/sip/settings/static/admin/js/prepopulate.js delete mode 100644 old/sip/settings/static/admin/js/prepopulate.min.js delete mode 100644 old/sip/settings/static/admin/js/prepopulate_init.js delete mode 100644 old/sip/settings/static/admin/js/urlify.js delete mode 100644 old/sip/settings/static/admin/js/vendor/jquery/LICENSE.txt delete mode 100644 old/sip/settings/static/admin/js/vendor/jquery/jquery.js delete mode 100644 old/sip/settings/static/admin/js/vendor/jquery/jquery.min.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/LICENSE.md delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/af.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/ar.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/az.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/bg.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/bn.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/bs.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/ca.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/cs.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/da.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/de.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/dsb.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/el.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/en.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/es.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/et.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/eu.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/fa.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/fi.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/fr.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/gl.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/he.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/hi.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/hr.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/hsb.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/hu.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/hy.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/id.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/is.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/it.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/ja.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/ka.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/km.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/ko.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/lt.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/lv.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/mk.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/ms.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/nb.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/ne.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/nl.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/pl.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/ps.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/pt-BR.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/pt.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/ro.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/ru.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/sk.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/sl.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/sq.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/sr-Cyrl.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/sr.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/sv.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/th.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/tk.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/tr.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/uk.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/vi.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/zh-CN.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/i18n/zh-TW.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/select2.full.js delete mode 100644 old/sip/settings/static/admin/js/vendor/select2/select2.full.min.js delete mode 100644 old/sip/settings/static/admin/js/vendor/xregexp/LICENSE.txt delete mode 100644 old/sip/settings/static/admin/js/vendor/xregexp/xregexp.js delete mode 100644 old/sip/settings/static/admin/js/vendor/xregexp/xregexp.min.js delete mode 100644 old/sip/settings/static/drf-yasg/immutable.min.js delete mode 100644 old/sip/settings/static/drf-yasg/insQ.min.js delete mode 100644 old/sip/settings/static/drf-yasg/redoc-init.js delete mode 100644 old/sip/settings/static/drf-yasg/redoc-old/redoc.min.js delete mode 100644 old/sip/settings/static/drf-yasg/redoc/redoc-logo.png delete mode 100644 old/sip/settings/static/drf-yasg/redoc/redoc.min.js delete mode 100644 old/sip/settings/static/drf-yasg/style.css delete mode 100644 old/sip/settings/static/drf-yasg/swagger-ui-dist/absolute-path.js delete mode 100644 old/sip/settings/static/drf-yasg/swagger-ui-dist/favicon-32x32.png delete mode 100644 old/sip/settings/static/drf-yasg/swagger-ui-dist/index.js delete mode 100644 old/sip/settings/static/drf-yasg/swagger-ui-dist/oauth2-redirect.html delete mode 100644 old/sip/settings/static/drf-yasg/swagger-ui-dist/swagger-ui-bundle.js delete mode 100644 old/sip/settings/static/drf-yasg/swagger-ui-dist/swagger-ui-standalone-preset.js delete mode 100644 old/sip/settings/static/drf-yasg/swagger-ui-dist/swagger-ui.css delete mode 100644 old/sip/settings/static/drf-yasg/swagger-ui-init.js delete mode 100644 old/sip/settings/static/drf-yasg/url-polyfill.min.js delete mode 100644 old/sip/settings/static/makara-ui-fasilkom.png delete mode 100644 old/sip/settings/static/rest_framework/css/bootstrap-theme.min.css delete mode 100644 old/sip/settings/static/rest_framework/css/bootstrap-tweaks.css delete mode 100644 old/sip/settings/static/rest_framework/css/bootstrap.min.css delete mode 100644 old/sip/settings/static/rest_framework/css/default.css delete mode 100644 old/sip/settings/static/rest_framework/css/font-awesome-4.0.3.css delete mode 100644 old/sip/settings/static/rest_framework/css/prettify.css delete mode 100644 old/sip/settings/static/rest_framework/docs/css/base.css delete mode 100644 old/sip/settings/static/rest_framework/docs/css/highlight.css delete mode 100644 old/sip/settings/static/rest_framework/docs/css/jquery.json-view.min.css delete mode 100644 old/sip/settings/static/rest_framework/docs/img/favicon.ico delete mode 100644 old/sip/settings/static/rest_framework/docs/img/grid.png delete mode 100644 old/sip/settings/static/rest_framework/docs/js/api.js delete mode 100644 old/sip/settings/static/rest_framework/docs/js/highlight.pack.js delete mode 100644 old/sip/settings/static/rest_framework/docs/js/jquery.json-view.min.js delete mode 100644 old/sip/settings/static/rest_framework/fonts/fontawesome-webfont.eot delete mode 100644 old/sip/settings/static/rest_framework/fonts/fontawesome-webfont.svg delete mode 100644 old/sip/settings/static/rest_framework/fonts/fontawesome-webfont.ttf delete mode 100644 old/sip/settings/static/rest_framework/fonts/fontawesome-webfont.woff delete mode 100644 old/sip/settings/static/rest_framework/fonts/glyphicons-halflings-regular.eot delete mode 100644 old/sip/settings/static/rest_framework/fonts/glyphicons-halflings-regular.svg delete mode 100644 old/sip/settings/static/rest_framework/fonts/glyphicons-halflings-regular.ttf delete mode 100644 old/sip/settings/static/rest_framework/fonts/glyphicons-halflings-regular.woff delete mode 100644 old/sip/settings/static/rest_framework/fonts/glyphicons-halflings-regular.woff2 delete mode 100644 old/sip/settings/static/rest_framework/img/glyphicons-halflings-white.png delete mode 100644 old/sip/settings/static/rest_framework/img/glyphicons-halflings.png delete mode 100644 old/sip/settings/static/rest_framework/img/grid.png delete mode 100644 old/sip/settings/static/rest_framework/js/ajax-form.js delete mode 100644 old/sip/settings/static/rest_framework/js/bootstrap.min.js delete mode 100644 old/sip/settings/static/rest_framework/js/coreapi-0.1.1.js delete mode 100644 old/sip/settings/static/rest_framework/js/csrf.js delete mode 100644 old/sip/settings/static/rest_framework/js/default.js delete mode 100644 old/sip/settings/static/rest_framework/js/jquery-3.4.1.min.js delete mode 100644 old/sip/settings/static/rest_framework/js/prettify-min.js delete mode 100644 old/sip/settings/static/sso/kodoru.json delete mode 100644 old/sip/settings/storage_backends.py delete mode 100644 old/sip/static/.gitkeep delete mode 100644 old/sip/urls.py delete mode 100644 old/sip/wsgi.py delete mode 100644 old/sonar-project.properties delete mode 100644 old/static/makara-ui-fasilkom.png delete mode 100644 old/test.json diff --git a/new/.dockerignore b/new/.dockerignore deleted file mode 100644 index e817883..0000000 --- a/new/.dockerignore +++ /dev/null @@ -1,9 +0,0 @@ -venv -env -__pycache__/ -*.pyc -.example.env.dev -.example.env.production -.example.env.staging -sip/settings/dev.py -sip/settings/production.py \ No newline at end of file diff --git a/new/.gitignore b/new/.gitignore deleted file mode 100644 index d07d45f..0000000 --- a/new/.gitignore +++ /dev/null @@ -1,260 +0,0 @@ -# Created by https://www.toptal.com/developers/gitignore/api/python,django,vscode,sonarqube,sonar -# Edit at https://www.toptal.com/developers/gitignore?templates=python,django,vscode,sonarqube,sonar - -### Quick Push Script -push.py -push.cmd - -### Quick Coverage Check Script -coverage.cmd - -### Django ### -*.log -*.pot -*.pyc -__pycache__/ -local_settings.py -db.sqlite3 -sip/db.sqlite3 -db.sqlite3-journal -media - -# If your build process includes running collectstatic, then you probably don't need or want to include staticfiles/ -# in your Git repository. Update and uncomment the following line accordingly. -# /staticfiles/ - -### Django.Python Stack ### -# Byte-compiled / optimized / DLL files -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -pip-wheel-metadata/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ -pytestdebug.log - -# Translations -*.mo - -# Django stuff: - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ -doc/_build/ - -# PyBuilder -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -.python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ -pythonenv* - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# profiling data -.prof - -### Python ### -# Byte-compiled / optimized / DLL files - -# C extensions - -# Distribution / packaging - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. - -# Installer logs - -# Unit test / coverage reports - -# Translations - -# Django stuff: - -# Flask stuff: - -# Scrapy stuff: - -# Sphinx documentation - -# PyBuilder - -# Jupyter Notebook - -# IPython - -# pyenv - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow - -# Celery stuff - -# SageMath parsed files - -# Environments - -# Spyder project settings - -# Rope project settings - -# mkdocs documentation - -# mypy - -# Pyre type checker - -# pytype static type analyzer - -# profiling data - -### Sonar ### -#Sonar generated dir -/.sonar/ - -### SonarQube ### -# SonarQube ignore files. -# -# https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner -# Sonar Scanner working directories -.sonar/ -.scannerwork/ - -# http://www.sonarlint.org/commandline/ -# SonarLint working directories, configuration files (including credentials) -.sonarlint/ - -### vscode ### -.vscode/* -.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -*.code-workspace - -# End of https://www.toptal.com/developers/gitignore/api/python,django,vscode,sonarqube,sonar - -# Data seed -data_seed/lembaga* -data_seed_v2 - - -# Script bash -migrate.local -check-code.sh -serve.sh -credentials -**/media/ - -# Backend database -db_backend/ diff --git a/new/.gitlab-ci.yml b/new/.gitlab-ci.yml deleted file mode 100644 index 319e752..0000000 --- a/new/.gitlab-ci.yml +++ /dev/null @@ -1,40 +0,0 @@ -stages: - - flake8 - - build - - deploy - -variables: - PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip" - -image: python:latest - -cache: - key: test - paths: - - .cache/pip - - venv/ - -before_script: - - python3 -V - - pip3 install virtualenv - - virtualenv venv - - source venv/bin/activate - - pip3 install -r requirements.txt - - echo "DJANGO_SECRET_KEY=$DJANGO_SECRET_KEY" > sip/settings/.env - - echo "AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID" >> sip/settings/.env - - echo "AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY" >> sip/settings/.env - - echo "AWS_STORAGE_BUCKET_NAME=$AWS_STORAGE_BUCKET_NAME" >> sip/settings/.env - -heroku-deploy: - image: ruby:2.4 - stage: deploy - cache: {} - before_script: - - gem install dpl - - wget -qO- https://cli-assets.heroku.com/install-ubuntu.sh | sh - script: - - dpl --provider=heroku --app=$HEROKU_APPNAME --api-key=$HEROKU_APIKEY - - export HEROKU_API_KEY=$HEROKU_APIKEY - only: - - staging - - /^.*URGENT-.*$/ diff --git a/new/Dockerfile b/new/Dockerfile deleted file mode 100644 index 3e33fdf..0000000 --- a/new/Dockerfile +++ /dev/null @@ -1,19 +0,0 @@ -# pull official base image -FROM python:3.9.1-alpine - -# set work directory -WORKDIR /usr/src/app - -# set environment variables -ENV PYTHONDONTWRITEBYTECODE 1 -ENV PYTHONUNBUFFERED 1 - -# install dependencies -RUN pip install --upgrade pip -COPY ./requirements.txt . -RUN pip install -r requirements.txt - -# copy project -COPY . . - -CMD [ "gunicorn", "sip.wsgi:application", "--bind", "0.0.0.0:8000" ] \ No newline at end of file diff --git a/new/Procfile b/new/Procfile deleted file mode 100644 index 86a84b1..0000000 --- a/new/Procfile +++ /dev/null @@ -1,2 +0,0 @@ -web: DJANGO_SETTINGS_MODULE=sip.settings.staging gunicorn sip.wsgi --log-file - -release: chmod 777 migrate.sh && ./migrate.sh \ No newline at end of file diff --git a/new/README.md b/new/README.md deleted file mode 100644 index 86988eb..0000000 --- a/new/README.md +++ /dev/null @@ -1,62 +0,0 @@ -# MKPPL-SI Penilaian dan Evaluasi Praktikum - - - -## __Getting Started__ -Pastikan **python3** dan **git** sudah terinstall pada laptop/komputer Anda. -```bash -git clone https://gitlab.cs.ui.ac.id/ppl-fasilkom-ui/2020/mkppl-si-penilaian-dan-evaluasi-praktikum.git -cd mkppl-si-penilaian-dan-evaluasi-praktikum -python3 -m venv venv -source venv/bin/activate -pip install -r requirements.txt -``` - -## __Setup Local__ - -### Settings Directory Tree -``` -... -+-- sip -| +-- settings -| | +-- static (generated) -| | +-- dev.py (for local) -| | +-- production.py (for production) -| | +-- staging.py (for staging) -| -... -``` -### __Environment Variables__ -Contoh bentuk file `.env.dev`, ini akan di-*load* pada `settings/dev.py` -***Catatan: file ini dapat berubah menyesuaikan flow, ini hanya contoh.*** -``` -SECRET_KEY="sm1l3_sw33t_s1st3r_sUrpr1s3_s3rvc1c3" -DB_NAME=db_name -DB_USER=admin -DB_PASS=db_password -DB_HOST=db -DB_PORT=5432 -POSTGRES_USER=postgres -POSTGRES_PASSWORD=postgres_password -POSTGRES_DB=postgres_db_name -``` - -### __How To Run on Local Development__ -1. Buat .env di folder sip/settings/ dengan secret key-nya. Tambahin line ini di file-nya: - ```bash - DJANGO_SECRET_KEY="s3cr3t_k3y_c4nn0t_h4ck3d_by_l33t_1337" - ``` -2. Lakukan makemigrations dan migrate - ```bash - python manage.py makemigrations --settings=sip.settings.dev - python manage.py migrate --settings=sip.settings.dev - ``` -3. Jalankan aplikasi menggunakan `manage.py runserver` pada port 8000, spesifikasi settings yang digunakan adalah `dev` atau local. - ```bash - python manage.py runserver 8000 --settings=.sip.settings.dev - ``` - -### __Pipelines and Coverage__ -[![pipeline status](https://gitlab.cs.ui.ac.id/ppl-fasilkom-ui/2021/BB/departemen-ilmu-kesejahteraan-sosial-ui-sistem-informasi-penilaian-dan-database-praktikum-i-dan-ii/praktikum-backend/badges/staging/pipeline.svg)](https://gitlab.cs.ui.ac.id/ppl-fasilkom-ui/2021/BB/departemen-ilmu-kesejahteraan-sosial-ui-sistem-informasi-penilaian-dan-database-praktikum-i-dan-ii/praktikum-backend/commits/staging/) -[![coverage report](https://gitlab.cs.ui.ac.id/ppl-fasilkom-ui/2021/BB/departemen-ilmu-kesejahteraan-sosial-ui-sistem-informasi-penilaian-dan-database-praktikum-i-dan-ii/praktikum-backend/badges/staging/coverage.svg)](https://gitlab.cs.ui.ac.id/ppl-fasilkom-ui/2021/BB/departemen-ilmu-kesejahteraan-sosial-ui-sistem-informasi-penilaian-dan-database-praktikum-i-dan-ii/praktikum-backend/commits/staging/) - diff --git a/new/api_tester.py b/new/api_tester.py deleted file mode 100644 index 62a6690..0000000 --- a/new/api_tester.py +++ /dev/null @@ -1,197 +0,0 @@ - -# -# Automated API request -# -# Python version : >= 3 -# -# Tutorial : Gw ga make teori-teori segala kayak clean code, maklumin kalo kode-nya jelek. Ini contoh basic cara make toolnya: -# -# 1. Jalanin "python api_tester.py default" -# 2. Login dengan masukin username, password, sama role -# 3. kasih api yang mau dipake habis selesai login, contoh /auth/profile/mahasiwa (Kalo login jadi mahasiswa) -# 4. Masukin data yang perlu make json, kalo ga perlu data pas request ke api-nya, teken enter aja -# 5. Liat response-nya -# 6. Kalo mau keluar dari programnya, teken CTRL-C aja -# -# Note yang penting : urllib.request setau gw cuman bisa nebak method GET sama POST buat http kalo ga dispecify tipe requestnya, kalo make method lain kayak PUT buat upload file nanti gw bikin socket manual buat itu. -# - -import sys -import json -import getpass -import urllib.request - -invalid_login_flag = True - -def banner(): - print("") - print(" (`\ .-') /` ('-. _ (`-. ('-. _ (`-. _ (`-. ") - print(" `.( OO ),' ( OO ).-. ( (OO ) _( OO) ( (OO ) ( (OO ) ") - print(" ,----. ,--./ .--. .-----. / . --. /_.` \(,------. _.` \ _.` \ ,--. ") - print(" ' .-./-') | | | ' .--./ | \-. \(__...--'' | .---' (__...--''(__...--'' | |.-') ") - print(" | |_( O- )| | | |, | |('-..-'-' | || / | | | | | / | | | / | | | | OO ) ") - print(" | | .--, \| |.'.| |_) /_) |OO )\| |_.' || |_.' |(| '--. | |_.' | | |_.' | | |`-' | ") - print("(| | '. (_/| | || |`-'| | .-. || .___.' | .--' | .___.' | .___.'(| '---.' ") - print(" | '--' | | ,'. | (_' '--'\ | | | || | | `---. | | | | | | ") - print(" `------' '--' '--' `-----' `--' `--'`--' `------' `--' `--' `------' ") - print("") - -def list_command(): - print("[*] List command yang tersedia (buat sesi awal doang) : ") - print("\tapi , langsung akses api tanpa login") - print("\tbanner , buat nge-print banner") - print("\tcommands , buat buka tulisan list command ini") - print("\tlogin , biar login dulu baru langsung akses api\n") - -def api_req(api_obj): - global invalid_login_flag - while True: - print("[NOTE] Pastiin awalan alamat api-nya pake '/' (ex: /api/v1/mahasiswa)") - api = input("api_tester.py >> Alamat API (kalo mau keluar dari sesi api masukin 'exit', kalo mau liat tokennya masukin 'token') : ") - if api == "exit": - if invalid_login_flag == False: - invalid_login_flag = True - break - if invalid_login_flag: - break - elif api == "token": - try: - print("Token : " + api_obj.get_token() + "\n") - except: - print("[-] Tidak ada token\n") - elif api == "banner": - banner() - else: - api_obj.set_api(api) - print("Berikut bakal nanya data, kalo api-nya gaperlu data teken enter aja\n") - data_json = input("api_tester.py >> Data (dalem bentuk json) : ") - api_obj.set_data(data_json) - api_obj.request() - return - -class APITester: - def __init__(self, domain): - self.domain = domain - def set_api(self, api): - self.api = api - def set_data(self, data): - self.data = data - def get_token(self): - return self.token - def login(self): - global invalid_login_flag - tipe_ = int(input("[*] Tipe akun (1 buat SSO, 2 buat django admin) : ")) - if tipe_ == 1: - self.api = "/auth/login/sso/" - elif tipe_ == 2: - self.api = "/auth/login/supervisor-lembaga/" - else: - print("[*] Tipe akun invalid") - return - username = input("[*] Username : ") - passwd = input("[*] Password (tidak ke-echo, pastiin passwordnya bener) : ") - role = int(input("[*] Role ( 1 untuk Mahasiswa, 2 untuk Spv Sekolah, 3 untuk Koor Kuliah, 4 untuk Spv Lembaga, 5 untuk Admin) : ")) - if role == 1: - self.data = "{\"username\":\""+username.replace("\"", "\\\"")+"\",\"password\":\""+passwd.replace("\"", "\\\"")+"\",\"role\":\"Mahasiswa\"}" - elif role == 2: - self.data = "{\"username\":\""+username.replace("\"", "\\\"")+"\",\"password\":\""+passwd.replace("\"", "\\\"")+"\",\"role\":\"Supervisor Sekolah\"}" - elif role == 3: - self.data = "{\"username\":\""+username.replace("\"", "\\\"")+"\",\"password\":\""+passwd.replace("\"", "\\\"")+"\",\"role\":\"Koordinator Kuliah\"}" - elif role == 4: - self.data = "{\"username\":\""+username.replace("\"", "\\\"")+"\",\"password\":\""+passwd.replace("\"", "\\\"")+"\",\"role\":\"Supervisor Lembaga\"}" - elif role == 5: - self.data = "{\"username\":\""+username.replace("\"", "\\\"")+"\",\"password\":\""+passwd.replace("\"", "\\\"")+"\",\"role\":\"Administrator\"}" - else: - print("[-] Role tidak valid") - print("[-] Mohon coba lagi dari awal") - return False - # Request ke API-nya - header = { - "User-Agent" : "Mozilla/5.0", - "Accept" : "*/*", - "Accept-Encoding" : "text/plain,application/json", - "Content-Type" : "application/json", - "Content-Length" : str(len(self.data)), - } - req = urllib.request.Request(self.domain+self.api, self.data.encode("ascii"), header) - try: - res = urllib.request.urlopen(req) - resData = res.read().decode("ascii") - apiRes = json.loads(resData) - self.token = apiRes["token"] - print("[+] Login berhasil") - print("[+] Token : " + str(self.token)[:15] + "...\n") - invalid_login_flag = False - return True - except urllib.error.HTTPError: - print("[-] Gagal Login") - print("[*] Mohon coba lagi") - return False - def request(self): - print("[*] Mengirim request ke " + self.api) - header = { - "User-Agent" : "Mozilla/5.0", - "Accept" : "*/*", - "Accept-Encoding" : "text/plain,application/json", - "Content-Type" : "application/json", - "Content-Length" : str(len(self.data)), - } - try: - if self.token: - header["Authorization"] = "Bearer "+self.token - except: - print("[*] Tidak ada token") - if self.data == "": - req = urllib.request.Request(self.domain+self.api, headers=header) - else: - req = urllib.request.Request(self.domain+self.api, self.data.encode("ascii"), header) - try: - res = urllib.request.urlopen(req) - resData = res.read().decode("ascii") - apiRes = json.loads(resData) - print("\n+ - Response - +\n\n" + str(apiRes) + "\n\n+ - Response - +\n") - except urllib.error.HTTPError as e: - if "404" in str(e): - print("[-] API tidak ditemukan") - else: - print("[-] Terjadi suatu kesalahan") - print(str(e)+"\n") - -if __name__ == "__main__": - - if len(sys.argv) < 2: - banner() - print("[Cara make] python api_tester.py (domain)") - print("[Catatan] Kasih 'default' di bagian 'domain' buat konek ke ppl-berkah-backend.herokuapp.com") - else: - try: - if sys.argv[1] == "default": - domain = "https://ppl-berkah-backend.herokuapp.com" - else: - domain = sys.argv[1] - banner() - list_command() - api_obj = APITester(domain) - while True: - cmd = input(sys.argv[0]+" > ") - if cmd == "login": - print("[*] Login terlebih dahulu") - while invalid_login_flag: - result = api_obj.login() - if result: - api_req(api_obj) - print("[*] Sesi login selesai\n") - break - elif cmd == "api": - api_req(api_obj) - elif cmd == "banner": - banner() - elif cmd == "commands": - list_command() - elif cmd == "exit": - sys.exit() - else: - print("[-] Command invalid\n") - except KeyboardInterrupt: - print("\n\n[-] CTRL-C keteken\n") - sys.exit() \ No newline at end of file diff --git a/new/authentication/__init__.py b/new/authentication/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/new/authentication/admin.py b/new/authentication/admin.py deleted file mode 100644 index e68e951..0000000 --- a/new/authentication/admin.py +++ /dev/null @@ -1,61 +0,0 @@ -from .models import ( - Mahasiswa, - SupervisorSekolah, - SupervisorLembaga, - KoordinatorKuliah, - Administrator, - User, - Periode, - Config -) -from django.contrib import admin - - -"""Profile model admin class.""" - - -@admin.register(Mahasiswa) -class MahasiswaAdmin(admin.ModelAdmin): - pass - - -"""Profile model admin class.""" - - -@admin.register(SupervisorSekolah) -class SupervisorSekolahAdmin(admin.ModelAdmin): - pass - - -"""Profile model admin class.""" - - -@admin.register(KoordinatorKuliah) -class KoordinatorKuliahAdmin(admin.ModelAdmin): - pass - - -"""Profile model admin class.""" - - -@admin.register(SupervisorLembaga) -class SupervisorLembagaAdmin(admin.ModelAdmin): - pass - - -"""Profile model admin class.""" - - -@admin.register(Administrator) -class AdministratorAdmin(admin.ModelAdmin): - pass - - -@admin.register(Periode) -class PeriodeAdmin(admin.ModelAdmin): - pass - - -@admin.register(Config) -class ConfigAdmin(admin.ModelAdmin): - pass diff --git a/new/authentication/apps.py b/new/authentication/apps.py deleted file mode 100644 index dd26d3e..0000000 --- a/new/authentication/apps.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.apps import AppConfig - - -class AuthenticationConfig(AppConfig): - name = 'authentication' - verbose_name = "Authentication" diff --git a/new/authentication/cas_wrapper.py b/new/authentication/cas_wrapper.py deleted file mode 100644 index 40f9672..0000000 --- a/new/authentication/cas_wrapper.py +++ /dev/null @@ -1,88 +0,0 @@ -from django_cas_ng import views as cas_views -from django_cas_ng.models import ProxyGrantingTicket, SessionTicket -from django_cas_ng.utils import get_protocol, get_redirect_url, get_cas_client -from django_cas_ng.signals import cas_user_logout -from django.http import JsonResponse, HttpRequest, HttpResponse, HttpResponseRedirect -from django.conf import settings -from django.contrib.auth import authenticate, login as auth_login, logout as auth_logout -from urllib import parse as urllib_parse -from rest_framework.response import Response -from rest_framework_jwt.settings import api_settings -from django.contrib.auth.models import update_last_login -from .models import User - -JWT_PAYLOAD_HANDLER = api_settings.JWT_PAYLOAD_HANDLER -JWT_ENCODE_HANDLER = api_settings.JWT_ENCODE_HANDLER - - -class APILoginView(cas_views.LoginView): - - def successful_login(self, request: HttpRequest, next_page: str) -> HttpResponse: - """ - This method is called on successful login. Override this method for - custom post-auth actions (i.e, to add a cookie with a token). - - :param request: - :param next_page: - :return: - """ - try: - user = User.objects.get(email=f'{request.user.email}@ui.ac.id') - except User.DoesNotExist: - user = request.user - - new_next_page = next_page - - if user.email == "": - new_next_page = settings.SUCCESS_SSO_AUTH_REDIRECT + 'not-login/' - user.delete() - elif not user.is_active: - new_next_page = settings.SUCCESS_SSO_AUTH_REDIRECT + 'not-login/' - else: - payload = JWT_PAYLOAD_HANDLER(user) - jwt_token = JWT_ENCODE_HANDLER(payload) - update_last_login(None, user) - - new_next_page = settings.SUCCESS_SSO_AUTH_REDIRECT + 'login-sivitas/' + jwt_token - - return HttpResponseRedirect(new_next_page) - - -class APILogoutView(cas_views.LogoutView): - - def get(self, request: HttpRequest) -> HttpResponse: - """ - Redirects to CAS logout page - - :param request: - :return: - """ - next_page = settings.SUCCESS_SSO_AUTH_REDIRECT - - # try to find the ticket matching current session for logout signal - try: - st = SessionTicket.objects.get(session_key=request.session.session_key) - ticket = st.ticket - except SessionTicket.DoesNotExist: - ticket = None - # send logout signal - cas_user_logout.send( - sender="manual", - user=request.user, - session=request.session, - ticket=ticket, - ) - - # clean current session ProxyGrantingTicket and SessionTicket - ProxyGrantingTicket.objects.filter(session_key=request.session.session_key).delete() - SessionTicket.objects.filter(session_key=request.session.session_key).delete() - auth_logout(request) - - next_page = next_page or get_redirect_url(request) - if settings.CAS_LOGOUT_COMPLETELY: - client = get_cas_client(request=request) - return HttpResponseRedirect(client.get_logout_url(next_page)) - - # This is in most cases pointless if not CAS_RENEW is set. The user will - # simply be logged in again on next request requiring authorization. - return HttpResponseRedirect(next_page) diff --git a/new/authentication/manualSSO.py b/new/authentication/manualSSO.py deleted file mode 100644 index 1e1a713..0000000 --- a/new/authentication/manualSSO.py +++ /dev/null @@ -1,58 +0,0 @@ -import re -import base64 -import requests - - -class SSOClass: - - def __init__(self, username, password): - self.username = username - self.password = password - self.resultText = "" - - def login(self): - # First, ask the session - sso_result = requests.get(url="https://sso.ui.ac.id/cas/login", headers={ - "Connection": "close", - "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36", - "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", - "Accept-Encoding": "gzip, deflate", - "Accept-Language": "en-US,en;q=0.9", - "Sec-Fetch-Site": "none", - "Sec-Fetch-Mode": "navigate", - "Sec-Fetch-User": "?1", - "Sec-Fetch-Dest": "document", }).text - # List of regex - - session_regex = re.compile(base64.b64decode("anNlc3Npb25pZFw9W0EtWjAtOV0r".encode("utf-8")).decode("utf-8")) - lt_regex = re.compile(base64.b64decode("dmFsdWVcPSJMVFtcLTAtOWEtekEtWl0r".encode("utf-8")).decode("utf-8")) - # Parse the values - start, end = re.search(session_regex, sso_result).span() - session_value = sso_result[start + 11:end] - start, end = re.search(lt_regex, sso_result).span() - lt_value = sso_result[start + 7:end] - # Create the POST data - login_data = { - "username": self.username, - "password": self.password, - "lt": lt_value, - "execution": "e1s1", - "_eventId": "submit" - } - # Second, include the session - self.resultText = requests.post(url="https://sso.ui.ac.id/cas/login;jsessionid=" + session_value, headers={ - "Connection": "close", - "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36", - "Origin": "https://sso.ui.ac.id", - "Content-Type": "application/x-www-form-urlencoded", - "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", - "Accept-Encoding": "gzip, deflate", - "Accept-Language": "en-US,en;q=0.9", - "Sec-Fetch-Site": "same-origin", - "Sec-Fetch-Mode": "navigate", - "Sec-Fetch-User": "?1", - "Sec-Fetch-Dest": "document", - "Referer": "https://sso.ui.ac.id/cas/login"}, data=login_data, cookies={"JSESSIONID": session_value}).text - - def checkLogin(self): - return "Log In Successful" in self.resultText diff --git a/new/authentication/migrations/0001_initial.py b/new/authentication/migrations/0001_initial.py deleted file mode 100644 index e39fce2..0000000 --- a/new/authentication/migrations/0001_initial.py +++ /dev/null @@ -1,121 +0,0 @@ -# Generated by Django 3.0.3 on 2020-06-03 12:43 - -from django.conf import settings -import django.contrib.auth.validators -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('lembaga', '0001_initial'), - ('auth', '0011_update_proxy_permissions'), - ] - - operations = [ - migrations.CreateModel( - name='User', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('password', models.CharField(max_length=128, verbose_name='password')), - ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), - ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), - ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), - ('full_name', models.CharField(max_length=150, verbose_name='full name')), - ('role', models.CharField(max_length=50, verbose_name='role')), - ('email', models.EmailField(error_messages={'unique': 'A user with that email already exists.'}, max_length=254, unique=True, verbose_name='email address')), - ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), - ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), - ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), - ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')), - ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')), - ], - options={ - 'verbose_name': 'user', - 'verbose_name_plural': 'users', - }, - ), - migrations.CreateModel( - name='Periode', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('nama', models.CharField(max_length=50, verbose_name='nama')), - ], - options={ - 'verbose_name': 'periode', - 'verbose_name_plural': 'periode', - }, - ), - migrations.CreateModel( - name='SupervisorSekolah', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('nip', models.CharField(blank=True, max_length=12, verbose_name='nip')), - ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='supervisor_sekolah', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'verbose_name': 'supervisor_sekolah', - 'verbose_name_plural': 'supervisor_sekolah', - }, - ), - migrations.CreateModel( - name='SupervisorLembaga', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('jabatan', models.CharField(max_length=150, verbose_name='jabatan')), - ('lembaga', models.ForeignKey(default='Tidak ada lembaga', on_delete=django.db.models.deletion.CASCADE, related_name='supervisor_lembaga', to='lembaga.Lembaga')), - ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='supervisor_lembaga', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'verbose_name': 'supervisor_lembaga', - 'verbose_name_plural': 'supervisor_lembaga', - }, - ), - migrations.CreateModel( - name='Mahasiswa', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('org_code', models.CharField(blank=True, max_length=11, verbose_name='organization_code')), - ('npm', models.CharField(blank=True, max_length=10, verbose_name='npm')), - ('faculty', models.CharField(blank=True, max_length=128, verbose_name='faculty')), - ('major', models.CharField(blank=True, max_length=128, verbose_name='major')), - ('program', models.CharField(blank=True, max_length=128, verbose_name='program')), - ('periode', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='periode', to='authentication.Periode')), - ('supervisor_lembaga', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='mahasiswa', to='authentication.SupervisorLembaga', to_field='user')), - ('supervisor_sekolah', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='mahasiswa', to='authentication.SupervisorSekolah', to_field='user')), - ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='mahasiswa', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'verbose_name': 'mahasiswa', - 'verbose_name_plural': 'mahasiswa', - }, - ), - migrations.CreateModel( - name='KoordinatorKuliah', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('nip', models.CharField(max_length=12, verbose_name='nip')), - ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='koordinator_kuliah', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'verbose_name': 'koordinator_kuliah', - 'verbose_name_plural': 'koordinator_kuliah', - }, - ), - migrations.CreateModel( - name='Administrator', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('nip', models.CharField(max_length=12, verbose_name='nip')), - ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='administrator', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'verbose_name': 'administrator', - 'verbose_name_plural': 'administrator', - }, - ), - ] diff --git a/new/authentication/migrations/0002_config.py b/new/authentication/migrations/0002_config.py deleted file mode 100644 index a3e66de..0000000 --- a/new/authentication/migrations/0002_config.py +++ /dev/null @@ -1,25 +0,0 @@ -# Generated by Django 3.0.3 on 2020-06-07 21:16 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('authentication', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='Config', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('key', models.CharField(max_length=200, verbose_name='key')), - ('value', models.CharField(max_length=200, verbose_name='key')), - ], - options={ - 'verbose_name': 'config', - 'verbose_name_plural': 'configs', - }, - ), - ] diff --git a/new/authentication/migrations/0003_auto_20201113_0949.py b/new/authentication/migrations/0003_auto_20201113_0949.py deleted file mode 100644 index 959b9c2..0000000 --- a/new/authentication/migrations/0003_auto_20201113_0949.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 3.1.3 on 2020-11-13 09:49 - -import django.contrib.auth.models -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('authentication', '0002_config'), - ] - - operations = [ - migrations.AlterModelManagers( - name='user', - managers=[ - ('objects', django.contrib.auth.models.UserManager()), - ], - ), - ] diff --git a/new/authentication/migrations/0004_delete_user.py b/new/authentication/migrations/0004_delete_user.py deleted file mode 100644 index 9cfb8c2..0000000 --- a/new/authentication/migrations/0004_delete_user.py +++ /dev/null @@ -1,16 +0,0 @@ -# Generated by Django 3.1.3 on 2020-11-13 10:06 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('authentication', '0003_auto_20201113_0949'), - ] - - operations = [ - migrations.DeleteModel( - name='User', - ), - ] diff --git a/new/authentication/migrations/__init__.py b/new/authentication/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/new/authentication/models.py b/new/authentication/models.py deleted file mode 100644 index d5b2258..0000000 --- a/new/authentication/models.py +++ /dev/null @@ -1,178 +0,0 @@ -from django.conf import settings -from django.db import models -from django.dispatch import receiver -from django_cas_ng.signals import cas_user_authenticated -from django.utils import timezone -from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager, UserManager, User -from django.contrib.auth.validators import UnicodeUsernameValidator -from .role import Role -from django.http import HttpResponseRedirect - -from lembaga.models import Lembaga - -import json -import random - -LANG = settings.SSO_UI_ORG_DETAIL_LANG -ORG_CODE = {} -with open(settings.SSO_UI_ORG_DETAIL_FILE_PATH, 'r') as ORG_CODE_FILE: - ORG_CODE.update(json.load(ORG_CODE_FILE)) - - -class SupervisorSekolah(models.Model): - """User Profile Supervisor Sekolah model.""" - - user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='supervisor_sekolah') - nip = models.CharField('nip', max_length=12, blank=True) - - class Meta: - verbose_name = 'supervisor_sekolah' - verbose_name_plural = 'supervisor_sekolah' - - def __str__(self): - """Return username of the user.""" - return self.user.username - - -class SupervisorLembaga(models.Model): - """User Profile Supervisor Lembaga model.""" - - user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='supervisor_lembaga') - lembaga = models.ForeignKey(Lembaga, related_name="supervisor_lembaga", \ - on_delete=models.CASCADE, default="Tidak ada lembaga") - jabatan = models.CharField('jabatan', max_length=150, blank=False) - - class Meta: - verbose_name = 'supervisor_lembaga' - verbose_name_plural = 'supervisor_lembaga' - - def __str__(self): - """Return username of the user.""" - return self.user.username - - -class Administrator(models.Model): - """User Profile Supervisor Sekolah model.""" - - user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='administrator') - nip = models.CharField('nip', max_length=12, blank=False) - - class Meta: - verbose_name = 'administrator' - verbose_name_plural = 'administrator' - - def __str__(self): - """Return username of the user.""" - return self.user.username - - -class Periode(models.Model): - """Periode model for Mahasiswa model.""" - - nama = models.CharField('nama', max_length=50, blank=False) - - class Meta: - verbose_name = 'periode' - verbose_name_plural = 'periode' - - def __str__(self): - """Return periode's name of the periode.""" - return self.nama - - -class Mahasiswa(models.Model): - """User Profile Mahasiswa model.""" - - user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='mahasiswa') - org_code = models.CharField('organization_code', max_length=11, blank=True) - npm = models.CharField('npm', max_length=10, blank=True) - faculty = models.CharField('faculty', max_length=128, blank=True) - major = models.CharField('major', max_length=128, blank=True) - program = models.CharField('program', max_length=128, blank=True) - lastLogin = models.CharField('last login', max_length=128, blank=True) - periode = models.ForeignKey(Periode, related_name="periode", on_delete=models.CASCADE, null=True, blank=True) - supervisor_sekolah = models.ForeignKey(SupervisorSekolah, related_name='mahasiswa', \ - to_field='user', on_delete=models.CASCADE, null=True, blank=True) - supervisor_lembaga = models.ForeignKey(SupervisorLembaga, related_name='mahasiswa',\ - to_field='user', on_delete=models.CASCADE, null=True, blank=True) - - class Meta: - verbose_name = 'mahasiswa' - verbose_name_plural = 'mahasiswa' - - def __str__(self): - """Return username of the user.""" - return self.user.username - - -class KoordinatorKuliah(models.Model): - """User Profile Kordinator Kuliah model.""" - - user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='koordinator_kuliah') - nip = models.CharField('nip', max_length=12, blank=False) - - class Meta: - verbose_name = 'koordinator_kuliah' - verbose_name_plural = 'koordinator_kuliah' - - def __str__(self): - """Return username of the user.""" - return self.user.username - - -class Config(models.Model): - """User Profile Kordinator Kuliah model.""" - - key = models.CharField('key', max_length=200, blank=False) - value = models.CharField('key', max_length=200) - - class Meta: - verbose_name = 'config' - verbose_name_plural = 'configs' - - def __str__(self): - """Return username of the user.""" - return self.key - - -# @receiver(cas_user_authenticated) -# def save_user_attributes(username, attributes, **kwargs): -# """Save user attributes from CAS into user and profile objects.""" - -# try: -# user = User.objects.get(email=f'{username}@ui.ac.id') - -# user.email = f'{username}@ui.ac.id' -# user.username = username -# user.full_name = attributes['nama'] -# user.save() - -# if user.role == Role.MHS.value: -# org_code = attributes['kd_org'] -# record = ORG_CODE[LANG][org_code] - -# mahasiswa = Mahasiswa.objects.get(user=user) -# mahasiswa.npm = attributes['npm'] -# mahasiswa.org_code = org_code -# mahasiswa.faculty = record['faculty'] -# mahasiswa.major = record['study_program'] -# mahasiswa.program = record['educational_program'] -# mahasiswa.save() - -# elif user.role == Role.SSK.value: -# supervisor_sekolah = SupervisorSekolah.objects.get(user=user) -# supervisor_sekolah.nip = attributes['nip'] -# supervisor_sekolah.save() - -# elif user.role == Role.KKL.value: -# koordinator_kuliah = KoordinatorKuliah.objects.get(user=user) -# koordinator_kuliah.nip = attributes['nip'] -# koordinator_kuliah.save() - -# elif user.role == Role.ADM.value: -# administrator = Administrator.objects.get(user=user) -# administrator.nip = attributes['nip'] -# administrator.save() - -# except User.DoesNotExist: -# return HttpResponseRedirect(settings.SUCCESS_SSO_AUTH_REDIRECT + 'not-login/') diff --git a/new/authentication/role.py b/new/authentication/role.py deleted file mode 100644 index 4f05fb5..0000000 --- a/new/authentication/role.py +++ /dev/null @@ -1,9 +0,0 @@ -from enum import Enum - - -class Role(Enum): - MHS = "Mahasiswa" - SSK = "Supervisor Sekolah" - SLB = "Supervisor Lembaga" - KKL = "Koordinator Kuliah" - ADM = "Administrator" diff --git a/new/authentication/serializers.py b/new/authentication/serializers.py deleted file mode 100644 index ef57330..0000000 --- a/new/authentication/serializers.py +++ /dev/null @@ -1,263 +0,0 @@ -from rest_framework import serializers -from django.contrib.auth.models import update_last_login -from .models import ( - User, - Mahasiswa, - SupervisorLembaga, - SupervisorSekolah, - KoordinatorKuliah, - Administrator, - Periode, - Config -) -from .manualSSO import SSOClass -from lembaga.models import Lembaga -from lembaga.serializers import LembagaSerializer -from rest_framework_jwt.settings import api_settings -from django.contrib.auth import authenticate - -JWT_PAYLOAD_HANDLER = api_settings.JWT_PAYLOAD_HANDLER -JWT_ENCODE_HANDLER = api_settings.JWT_ENCODE_HANDLER - - -class PeriodeSerializer(serializers.ModelSerializer): - """Periode serializer json field.""" - - class Meta: - model = Periode - fields = ['id', 'nama'] - - -class ConfigSerializer(serializers.ModelSerializer): - """Periode serializer json field.""" - - class Meta: - model = Config - fields = ['key', 'value'] - - -class UserSerializer(serializers.ModelSerializer): - """User serializer json field.""" - - full_name = serializers.CharField(source='get_full_name') - - class Meta: - model = User - fields = ['username', 'email', 'full_name'] - - -class AdministratorSerializer(serializers.ModelSerializer): - """Administrator serializer json field.""" - - user = UserSerializer() - - class Meta: - model = Administrator - fields = ['user', 'nip'] - - -class KoordinatorKuliahSerializer(serializers.ModelSerializer): - """Koordinator Kuliah serializer json field.""" - - user = UserSerializer() - - class Meta: - model = KoordinatorKuliah - fields = ['user', 'nip'] - - -class SupervisorSekolahSerializer(serializers.ModelSerializer): - """Supervisor Sekolah serializer json field.""" - - user = UserSerializer() - - class Meta: - model = SupervisorSekolah - fields = ['user', 'nip'] - - -class SupervisorLembagaSerializer(serializers.ModelSerializer): - """Supervisor Lembaga serializer json field.""" - - user = UserSerializer() - lembaga = LembagaSerializer() - - class Meta: - model = SupervisorLembaga - fields = ['user', 'lembaga', 'jabatan'] - - -class MahasiswaSerializer(serializers.ModelSerializer): - """Mahasiswa serializer json field.""" - - user = UserSerializer() - supervisor_sekolah = SupervisorSekolahSerializer() - supervisor_lembaga = SupervisorLembagaSerializer() - periode = PeriodeSerializer() - - class Meta: - model = Mahasiswa - fields = [ - 'user', - 'org_code', - 'npm', - 'periode', - 'faculty', - 'major', - 'program', - 'supervisor_sekolah', - 'supervisor_lembaga' - ] - - -class LembagaProfileSerializer(serializers.ModelSerializer): - """Lembaga Profile serializer json field.""" - - class Meta: - model = SupervisorLembaga - fields = ['lembaga', 'jabatan'] - - -class SupervisorLembagaRegistrationSerializer(serializers.ModelSerializer): - """Serializer json field for registration.""" - - profile = LembagaProfileSerializer(required=False) - full_name = serializers.CharField(source='get_full_name') - - class Meta: - model = User - fields = ['username', 'full_name', 'email', 'password', 'profile'] - extra_kwargs = {'password': {'write_only': True}} - - def create(self, validated_data): # pragma: no cover - profile_data = validated_data.pop('profile') - try: - lembaga = Lembaga.objects.get(nama=profile_data['lembaga']) - user = User.objects.create_user(**validated_data) - user.save() - SupervisorLembaga.objects.create( - user=user, - lembaga=lembaga, - jabatan=profile_data['jabatan'] - ) - return user - except Lembaga.DoesNotExist: - raise serializers.ValidationError( - 'Lembaga tidak ditemukan' - ) - - -class UserLoginSerializer(serializers.Serializer): - """Serializer json field for login.""" - - username = serializers.CharField(max_length=255) - password = serializers.CharField(max_length=128, write_only=True) - token = serializers.CharField(max_length=255, read_only=True) - - def validate(self, data): - username = data.get("username", None) - password = data.get("password", None) - try: - user = authenticate(username=username, password=password) - if user is None: - raise serializers.ValidationError( - 'User with given email and password does not exists' - ) - payload = JWT_PAYLOAD_HANDLER(user) - jwt_token = JWT_ENCODE_HANDLER(payload) - update_last_login(None, user) - username = user.username - return { - 'username': user.username, - 'token': jwt_token - } - except User.DoesNotExist: - raise serializers.ValidationError( - 'User with given email and password does not exists' - ) - - -class AdministratorLoginSerializer(serializers.Serializer): - """Serializer json field for login.""" - - username = serializers.CharField(max_length=255) - password = serializers.CharField(max_length=128, write_only=True) - token = serializers.CharField(max_length=255, read_only=True) - - def validate(self, data): - username = data.get("username", None) - password = data.get("password", None) - try: - user = authenticate(username=username, password=password) - Administrator.objects.get(user=User.objects.get(username=username).id) - if user is None: - raise serializers.ValidationError( - 'User with given email and password does not exists' - ) - payload = JWT_PAYLOAD_HANDLER(user) - jwt_token = JWT_ENCODE_HANDLER(payload) - update_last_login(None, user) - username = user.username - return { - 'username': user.username, - 'token': jwt_token - } - except Administrator.DoesNotExist: - raise serializers.ValidationError( - 'User with given email and password does not exists' - ) - except User.DoesNotExist: - raise serializers.ValidationError( - 'User with given email and password does not exists' - ) - - -class ManualSSOLoginSerializer(serializers.Serializer): - """Serializer json field for login.""" - - role = serializers.CharField(max_length=255) - username = serializers.CharField(max_length=255) - password = serializers.CharField(max_length=128, write_only=True) - token = serializers.CharField(max_length=255, read_only=True) - - def validate(self, data): - username = data.get("username", None) - password = data.get("password", None) - role = data.get("role", None) - ssoLogin = SSOClass(username, password) - ssoLogin.login() - if ssoLogin.checkLogin(): - user = User.objects.get(username=username) - if user is None: - raise serializers.ValidationError( - 'User with the given username / password does not exists' - ) - try: - if role == "Supervisor Sekolah": - if SupervisorSekolah.objects.get(user=user): - role = "Supervisor" - elif role == "Mahasiswa": - if Mahasiswa.objects.get(user=user): - role = "Mahasiswa" - elif role == "Koordinator Kuliah": - if KoordinatorKuliah.objects.get(user=user): - role = "Koordinator Kuliah" - else: - raise serializers.ValidationError('Invalid role') - except Mahasiswa.DoesNotExist: - raise serializers.ValidationError('You are not Mahasiswa') - except SupervisorSekolah.DoesNotExist: - raise serializers.ValidationError('You are not Supervisor Sekolah') - except KoordinatorKuliah.DoesNotExist: - raise serializers.ValidationError('You are not Koordinator Kuliah') - payload = JWT_PAYLOAD_HANDLER(user) - jwt_token = JWT_ENCODE_HANDLER(payload) - update_last_login(None, user) - username = user.username - return { - 'username': user.username, - 'token': jwt_token, - 'role': role - } - else: - raise serializers.ValidationError('Username / Password SSO is not valid') diff --git a/new/authentication/static/sso/kodoru.json b/new/authentication/static/sso/kodoru.json deleted file mode 100644 index b3e988f..0000000 --- a/new/authentication/static/sso/kodoru.json +++ /dev/null @@ -1,3857 +0,0 @@ -{ - "id": { - "37.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Fisioterapi", - "educational_program": "D3" - }, - "38.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Okupasi Terapi", - "educational_program": "D3" - }, - "01.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Perumahsakitan", - "educational_program": "D3" - }, - "02.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Rehabilitasi Medik", - "educational_program": "D3" - }, - "03.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Ilmu Gizi", - "educational_program": "D4" - }, - "04.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Pendidikan Dokter", - "educational_program": "S1 Reguler" - }, - "05.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Pendidikan Dokter", - "educational_program": "S1 Kls Internasional" - }, - "06.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Profesi Dokter", - "educational_program": "Profesi" - }, - "42.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Pendidikan Dokter", - "educational_program": "Profesi Kls Internasional" - }, - "47.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Akupunktur Medik", - "educational_program": "Spesialis 1" - }, - "13.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Anestesiologi", - "educational_program": "Spesialis 1" - }, - "41.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Bedah Toraks Kardiovaskular", - "educational_program": "Spesialis 1" - }, - "21.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Dermatologi dan Venereologi", - "educational_program": "Spesialis 1" - }, - "36.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Farmakologi Klinik", - "educational_program": "Spesialis 1" - }, - "14.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Ilmu Bedah", - "educational_program": "Spesialis 1" - }, - "29.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Ilmu Bedah Orthopaedi", - "educational_program": "Spesialis 1" - }, - "33.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Ilmu Bedah Plastik", - "educational_program": "Spesialis 1" - }, - "31.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Ilmu Bedah Saraf", - "educational_program": "Spesialis 1" - }, - "45.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Ilmu Gizi Klinik", - "educational_program": "Spesialis 1" - }, - "32.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Ilmu Kedokteran Fisik dan Rehabilitasi", - "educational_program": "Spesialis 1" - }, - "26.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Ilmu Kedokteran Forensik dan Medikolegal", - "educational_program": "Spesialis 1" - }, - "19.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Ilmu Kedokteran Jiwa", - "educational_program": "Spesialis 1" - }, - "34.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Ilmu Kedokteran Olah Raga", - "educational_program": "Spesialis 1" - }, - "16.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Ilmu Kesehatan Anak", - "educational_program": "Spesialis 1" - }, - "20.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Ilmu Kesehatan Mata", - "educational_program": "Spesialis 1" - }, - "15.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Ilmu Penyakit Dalam", - "educational_program": "Spesialis 1" - }, - "23.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Ilmu Penyakit Jantung dan Pembuluh Darah", - "educational_program": "Spesialis 1" - }, - "18.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Ilmu Penyakit Saraf", - "educational_program": "Spesialis 1" - }, - "22.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Ilmu Penyakit Telinga, Hidung dan Tenggorok", - "educational_program": "Spesialis 1" - }, - "39.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Kedokteran Okupasi", - "educational_program": "Spesialis 1" - }, - "44.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Kedokteran Penerbangan", - "educational_program": "Spesialis 1" - }, - "35.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Mikrobiologi Klinik", - "educational_program": "Spesialis 1" - }, - "17.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Obstetri dan Ginekologi", - "educational_program": "Spesialis 1" - }, - "43.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Onkologi Radiasi", - "educational_program": "Spesialis 1" - }, - "46.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Parasitologi Klinik", - "educational_program": "Spesialis 1" - }, - "27.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Patologi Anatomik", - "educational_program": "Spesialis 1" - }, - "28.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Patologi Klinik", - "educational_program": "Spesialis 1" - }, - "24.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Pulmonologi dan Ilmu Kedokteran Respirasi", - "educational_program": "Spesialis 1" - }, - "25.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Radiologi", - "educational_program": "Spesialis 1" - }, - "30.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Urologi", - "educational_program": "Spesialis 1" - }, - "54.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Anestesiologi dan Terapi Intensif", - "educational_program": "Spesialis 2" - }, - "51.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Ilmu Bedah", - "educational_program": "Spesialis 2" - }, - "50.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Ilmu Kesehatan Anak", - "educational_program": "Spesialis 2" - }, - "48.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Ilmu Penyakit Dalam", - "educational_program": "Spesialis 2" - }, - "53.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Kedokteran Jiwa", - "educational_program": "Spesialis 2" - }, - "52.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Obstetri dan Ginekologi", - "educational_program": "Spesialis 2" - }, - "07.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Ilmu Biomedik", - "educational_program": "S2" - }, - "08.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Ilmu Gizi", - "educational_program": "S2" - }, - "09.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Kedokteran Kerja", - "educational_program": "S2" - }, - "49.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Kedokteran Klinis", - "educational_program": "S2" - }, - "40.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Pendidikan Kedokteran", - "educational_program": "S2" - }, - "10.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Ilmu Biomedik", - "educational_program": "S3" - }, - "11.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Ilmu Gizi", - "educational_program": "S3" - }, - "12.00.01.01": { - "faculty": "Kedokteran", - "study_program": "Ilmu Kedokteran", - "educational_program": "S3" - }, - "01.00.02.01": { - "faculty": "Kedokteran Gigi", - "study_program": "Pendidikan Dokter Gigi", - "educational_program": "S1 Reguler" - }, - "13.00.02.01": { - "faculty": "Kedokteran Gigi", - "study_program": "Pendidikan Dokter Gigi", - "educational_program": "S1 Reguler" - }, - "02.00.02.01": { - "faculty": "Kedokteran Gigi", - "study_program": "Pendidikan Dokter Gigi", - "educational_program": "Profesi" - }, - "06.00.02.01": { - "faculty": "Kedokteran Gigi", - "study_program": "Ilmu Bedah Mulut", - "educational_program": "Spesialis 1" - }, - "07.00.02.01": { - "faculty": "Kedokteran Gigi", - "study_program": "Ilmu Kedokteran Gigi Anak", - "educational_program": "Spesialis 1" - }, - "08.00.02.01": { - "faculty": "Kedokteran Gigi", - "study_program": "Ilmu Konservasi Gigi", - "educational_program": "Spesialis 1" - }, - "09.00.02.01": { - "faculty": "Kedokteran Gigi", - "study_program": "Ilmu Penyakit Mulut", - "educational_program": "Spesialis 1" - }, - "10.00.02.01": { - "faculty": "Kedokteran Gigi", - "study_program": "Ortodonsia", - "educational_program": "Spesialis 1" - }, - "11.00.02.01": { - "faculty": "Kedokteran Gigi", - "study_program": "Periodonsia", - "educational_program": "Spesialis 1" - }, - "12.00.02.01": { - "faculty": "Kedokteran Gigi", - "study_program": "Prostodonsia", - "educational_program": "Spesialis 1" - }, - "03.00.02.01": { - "faculty": "Kedokteran Gigi", - "study_program": "Ilmu Kedokteran Gigi Dasar", - "educational_program": "S2" - }, - "04.00.02.01": { - "faculty": "Kedokteran Gigi", - "study_program": "Ilmu Kedokteran Gigi Komunitas", - "educational_program": "S2" - }, - "05.00.02.01": { - "faculty": "Kedokteran Gigi", - "study_program": "Ilmu Kedokteran Gigi", - "educational_program": "S3" - }, - "01.05.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Farmasi Rumah Sakit dan Distribusi Pemasaran", - "educational_program": "D3" - }, - "01.02.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Fisika Instrumentasi", - "educational_program": "D3" - }, - "01.03.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Kimia Terapan", - "educational_program": "D3" - }, - "01.04.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Biologi", - "educational_program": "S1 Reguler" - }, - "02.05.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Farmasi", - "educational_program": "S1 Reguler" - }, - "02.02.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Fisika", - "educational_program": "S1 Reguler" - }, - "06.02.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Geofisika", - "educational_program": "S1 Reguler" - }, - "01.06.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Geografi", - "educational_program": "S1 Reguler" - }, - "07.02.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Geologi", - "educational_program": "S1 Reguler" - }, - "05.01.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Ilmu Aktuaria", - "educational_program": "S1 Reguler" - }, - "02.03.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Kimia", - "educational_program": "S1 Reguler" - }, - "01.01.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Matematika", - "educational_program": "S1 Reguler" - }, - "04.01.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Statistika", - "educational_program": "S1 Reguler" - }, - "05.04.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Biologi", - "educational_program": "S1 Paralel" - }, - "06.05.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Farmasi", - "educational_program": "S1 Paralel" - }, - "05.02.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Fisika", - "educational_program": "S1 Paralel" - }, - "09.02.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Geofisika", - "educational_program": "S1 Paralel" - }, - "05.06.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Geografi", - "educational_program": "S1 Paralel" - }, - "10.02.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Geologi", - "educational_program": "S1 Paralel" - }, - "06.03.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Kimia", - "educational_program": "S1 Paralel" - }, - "03.01.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Matematika", - "educational_program": "S1 Paralel" - }, - "06.01.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Statistika", - "educational_program": "S1 Paralel" - }, - "03.05.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Farmasi - Ekstensi", - "educational_program": "S1 Ekstensi" - }, - "03.02.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Fisika - Ekstensi", - "educational_program": "S1 Ekstensi" - }, - "03.03.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Kimia - Ekstensi", - "educational_program": "S1 Ekstensi" - }, - "04.05.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Apoteker", - "educational_program": "Profesi" - }, - "02.04.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Biologi", - "educational_program": "S2" - }, - "02.06.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Geografi", - "educational_program": "S2" - }, - "08.05.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Herbal", - "educational_program": "S2" - }, - "03.06.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Ilmu Bahan-bahan/Material", - "educational_program": "S2" - }, - "04.02.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Ilmu Fisika", - "educational_program": "S2" - }, - "05.05.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Ilmu Kefarmasian", - "educational_program": "S2" - }, - "03.04.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Ilmu Kelautan", - "educational_program": "S2" - }, - "04.03.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Ilmu Kimia", - "educational_program": "S2" - }, - "02.01.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Matematika", - "educational_program": "S2" - }, - "04.04.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Biologi", - "educational_program": "S3" - }, - "04.06.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Ilmu Bahan-bahan/Material", - "educational_program": "S3" - }, - "07.05.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Ilmu Farmasi", - "educational_program": "S3" - }, - "08.02.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Ilmu Fisika", - "educational_program": "S3" - }, - "05.03.03.01": { - "faculty": "Matematika dan Ilmu Pengetahuan Alam", - "study_program": "Ilmu Kimia", - "educational_program": "S3" - }, - "01.05.04.01": { - "faculty": "Teknik", - "study_program": "Arsitektur", - "educational_program": "S1 Reguler" - }, - "05.05.04.01": { - "faculty": "Teknik", - "study_program": "Arsitektur Interior", - "educational_program": "S1 Reguler" - }, - "12.03.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Biomedik", - "educational_program": "S1 Reguler" - }, - "01.03.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Elektro", - "educational_program": "S1 Reguler" - }, - "01.07.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Industri", - "educational_program": "S1 Reguler" - }, - "01.06.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Kimia", - "educational_program": "S1 Reguler" - }, - "02.03.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Komputer", - "educational_program": "S1 Reguler" - }, - "02.01.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Lingkungan", - "educational_program": "S1 Reguler" - }, - "01.02.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Mesin", - "educational_program": "S1 Reguler" - }, - "01.04.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Metalurgi dan Material", - "educational_program": "S1 Reguler" - }, - "02.02.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Perkapalan", - "educational_program": "S1 Reguler" - }, - "01.01.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Sipil", - "educational_program": "S1 Reguler" - }, - "06.06.04.01": { - "faculty": "Teknik", - "study_program": "Teknologi Bioproses", - "educational_program": "S1 Reguler" - }, - "04.05.04.01": { - "faculty": "Teknik", - "study_program": "Arsitektur - Intl", - "educational_program": "S1 Kls Internasional" - }, - "04.03.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Elektro", - "educational_program": "S1 Kls Internasional" - }, - "06.07.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Industri", - "educational_program": "S1 Kls Internasional" - }, - "03.06.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Kimia", - "educational_program": "S1 Kls Internasional" - }, - "04.02.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Mesin", - "educational_program": "S1 Kls Internasional" - }, - "03.04.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Metalurgi dan Material", - "educational_program": "S1 Kls Internasional" - }, - "04.01.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Sipil", - "educational_program": "S1 Kls Internasional" - }, - "08.05.04.01": { - "faculty": "Teknik", - "study_program": "Arsitektur", - "educational_program": "S1 Paralel" - }, - "10.03.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Elektro", - "educational_program": "S1 Paralel" - }, - "04.07.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Industri", - "educational_program": "S1 Paralel" - }, - "07.06.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Kimia", - "educational_program": "S1 Paralel" - }, - "08.01.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Lingkungan", - "educational_program": "S1 Paralel" - }, - "07.02.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Mesin", - "educational_program": "S1 Paralel" - }, - "06.04.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Metalurgi dan Material", - "educational_program": "S1 Paralel" - }, - "07.01.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Sipil", - "educational_program": "S1 Paralel" - }, - "02.05.04.01": { - "faculty": "Teknik", - "study_program": "Arsitektur", - "educational_program": "S1 Ekstensi" - }, - "03.03.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Elektro - Ekstensi", - "educational_program": "S1 Ekstensi" - }, - "02.07.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Industri - Ekstensi", - "educational_program": "S1 Ekstensi" - }, - "02.06.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Kimia - Ekstensi", - "educational_program": "S1 Ekstensi" - }, - "03.02.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Mesin ", - "educational_program": "S1 Ekstensi" - }, - "02.04.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Metalurgi dan Material - Ekstensi", - "educational_program": "S1 Ekstensi" - }, - "03.01.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Sipil - Ekstensi", - "educational_program": "S1 Ekstensi" - }, - "07.05.04.01": { - "faculty": "Teknik", - "study_program": "Arsitek", - "educational_program": "Profesi" - }, - "01.00.04.01": { - "faculty": "Teknik", - "study_program": "Insinyur", - "educational_program": "Profesi" - }, - "03.05.04.01": { - "faculty": "Teknik", - "study_program": "Arsitektur", - "educational_program": "S2" - }, - "06.03.04.01": { - "faculty": "Teknik", - "study_program": "Opto Elektroteknika dan Aplikasi Laser", - "educational_program": "S2" - }, - "05.03.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Elektro", - "educational_program": "S2" - }, - "03.07.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Industri", - "educational_program": "S2" - }, - "04.06.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Kimia", - "educational_program": "S2" - }, - "05.02.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Mesin", - "educational_program": "S2" - }, - "04.04.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Metalurgi dan Material", - "educational_program": "S2" - }, - "05.01.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Sipil", - "educational_program": "S2" - }, - "02.00.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Sistem Energi", - "educational_program": "S2" - }, - "11.03.04.01": { - "faculty": "Teknik", - "study_program": "Teknologi Biomedis", - "educational_program": "S2" - }, - "09.03.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Elektro", - "educational_program": "S2 Kls Internasional" - }, - "06.05.04.01": { - "faculty": "Teknik", - "study_program": "Arsitektur", - "educational_program": "S3" - }, - "07.03.04.01": { - "faculty": "Teknik", - "study_program": "Opto Elektroteknika dan Aplikasi Laser", - "educational_program": "S3" - }, - "08.03.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Elektro", - "educational_program": "S3" - }, - "05.07.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Industri", - "educational_program": "S3" - }, - "05.06.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Kimia", - "educational_program": "S3" - }, - "06.02.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Mesin", - "educational_program": "S3" - }, - "05.04.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Metalurgi dan Material", - "educational_program": "S3" - }, - "06.01.04.01": { - "faculty": "Teknik", - "study_program": "Teknik Sipil", - "educational_program": "S3" - }, - "01.00.05.01": { - "faculty": "Hukum", - "study_program": "Ilmu Hukum", - "educational_program": "S1 Reguler" - }, - "07.00.05.01": { - "faculty": "Hukum", - "study_program": "Ilmu Hukum", - "educational_program": "S1 Kls Internasional" - }, - "06.00.05.01": { - "faculty": "Hukum", - "study_program": "Ilmu Hukum", - "educational_program": "S1 Paralel" - }, - "02.00.05.01": { - "faculty": "Hukum", - "study_program": "Ilmu Hukum - Ekstensi", - "educational_program": "S1 Ekstensi" - }, - "03.00.05.01": { - "faculty": "Hukum", - "study_program": "Ilmu Hukum", - "educational_program": "S2" - }, - "04.00.05.01": { - "faculty": "Hukum", - "study_program": "Kenotariatan", - "educational_program": "S2" - }, - "05.00.05.01": { - "faculty": "Hukum", - "study_program": "Ilmu Hukum", - "educational_program": "S3" - }, - "01.03.06.01": { - "faculty": "Ekonomi dan Bisnis", - "study_program": "Akuntansi", - "educational_program": "D3" - }, - "02.03.06.01": { - "faculty": "Ekonomi dan Bisnis", - "study_program": "Akuntansi", - "educational_program": "S1 Reguler" - }, - "08.01.06.01": { - "faculty": "Ekonomi dan Bisnis", - "study_program": "Bisnis Islam", - "educational_program": "S1 Reguler" - }, - "01.01.06.01": { - "faculty": "Ekonomi dan Bisnis", - "study_program": "Ilmu Ekonomi", - "educational_program": "S1 Reguler" - }, - "07.01.06.01": { - "faculty": "Ekonomi dan Bisnis", - "study_program": "Ilmu Ekonomi Islam", - "educational_program": "S1 Reguler" - }, - "01.02.06.01": { - "faculty": "Ekonomi dan Bisnis", - "study_program": "Manajemen", - "educational_program": "S1 Reguler" - }, - "04.03.06.01": { - "faculty": "Ekonomi dan Bisnis", - "study_program": "Akuntansi", - "educational_program": "S1 Kls Internasional" - }, - "02.01.06.01": { - "faculty": "Ekonomi dan Bisnis", - "study_program": "Ilmu Ekonomi", - "educational_program": "S1 Kls Internasional" - }, - "02.02.06.01": { - "faculty": "Ekonomi dan Bisnis", - "study_program": "Manajemen", - "educational_program": "S1 Kls Internasional" - }, - "10.03.06.01": { - "faculty": "Ekonomi dan Bisnis", - "study_program": "Akuntansi", - "educational_program": "S1 Paralel" - }, - "03.03.06.01": { - "faculty": "Ekonomi dan Bisnis", - "study_program": "Akuntansi", - "educational_program": "S1 Ekstensi" - }, - "03.02.06.01": { - "faculty": "Ekonomi dan Bisnis", - "study_program": "Manajemen", - "educational_program": "S1 Ekstensi" - }, - "05.03.06.01": { - "faculty": "Ekonomi dan Bisnis", - "study_program": "Akuntansi", - "educational_program": "Profesi" - }, - "07.03.06.01": { - "faculty": "Ekonomi dan Bisnis", - "study_program": "Ilmu Akuntansi", - "educational_program": "S2" - }, - "03.01.06.01": { - "faculty": "Ekonomi dan Bisnis", - "study_program": "Ilmu Ekonomi", - "educational_program": "S2" - }, - "04.02.06.01": { - "faculty": "Ekonomi dan Bisnis", - "study_program": "Ilmu Manajemen", - "educational_program": "S2" - }, - "09.03.06.01": { - "faculty": "Ekonomi dan Bisnis", - "study_program": "Magister Akuntansi", - "educational_program": "S2" - }, - "06.03.06.01": { - "faculty": "Ekonomi dan Bisnis", - "study_program": "Magister Akuntansi", - "educational_program": "S2" - }, - "09.01.06.01": { - "faculty": "Ekonomi dan Bisnis", - "study_program": "Magister Ekonomi Kependudukan dan Ketenagakerjaan", - "educational_program": "S2" - }, - "05.02.06.01": { - "faculty": "Ekonomi dan Bisnis", - "study_program": "Magister Manajemen", - "educational_program": "S2" - }, - "07.02.06.01": { - "faculty": "Ekonomi dan Bisnis", - "study_program": "Magister Manajemen", - "educational_program": "S2" - }, - "04.01.06.01": { - "faculty": "Ekonomi dan Bisnis", - "study_program": "Magister Perencanaan dan Kebijakan Publik", - "educational_program": "S2" - }, - "06.01.06.01": { - "faculty": "Ekonomi dan Bisnis", - "study_program": "Ilmu Ekonomi", - "educational_program": "S2 Kls Internasional" - }, - "08.03.06.01": { - "faculty": "Ekonomi dan Bisnis", - "study_program": "Ilmu Akuntansi", - "educational_program": "S3" - }, - "05.01.06.01": { - "faculty": "Ekonomi dan Bisnis", - "study_program": "Ilmu Ekonomi", - "educational_program": "S3" - }, - "06.02.06.01": { - "faculty": "Ekonomi dan Bisnis", - "study_program": "Ilmu Manajemen", - "educational_program": "S3" - }, - "02.00.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Bahasa Arab", - "educational_program": "D3" - }, - "07.00.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Bahasa Belanda", - "educational_program": "D3" - }, - "01.00.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Bahasa Cina", - "educational_program": "D3" - }, - "04.00.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Bahasa Inggris", - "educational_program": "D3" - }, - "03.00.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Bahasa Jepang", - "educational_program": "D3" - }, - "06.00.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Bahasa Jerman", - "educational_program": "D3" - }, - "05.00.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Bahasa Perancis", - "educational_program": "D3" - }, - "01.03.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Manajemen Informasi dan Dokumen", - "educational_program": "D3" - }, - "01.01.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Arkeologi", - "educational_program": "S1 Reguler" - }, - "18.00.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Bahasa dan Kebudayaan Korea", - "educational_program": "S1 Reguler" - }, - "01.02.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Ilmu Filsafat", - "educational_program": "S1 Reguler" - }, - "02.03.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Ilmu Perpustakaan", - "educational_program": "S1 Reguler" - }, - "01.06.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Ilmu Sejarah", - "educational_program": "S1 Reguler" - }, - "08.00.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Sastra Arab", - "educational_program": "S1 Reguler" - }, - "17.00.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Sastra Belanda", - "educational_program": "S1 Reguler" - }, - "11.00.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Sastra Cina", - "educational_program": "S1 Reguler" - }, - "10.00.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Sastra Daerah untuk Sastra Jawa", - "educational_program": "S1 Reguler" - }, - "09.00.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Sastra Indonesia", - "educational_program": "S1 Reguler" - }, - "13.00.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Sastra Inggris", - "educational_program": "S1 Reguler" - }, - "12.00.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Sastra Jepang", - "educational_program": "S1 Reguler" - }, - "15.00.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Sastra Jerman", - "educational_program": "S1 Reguler" - }, - "14.00.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Sastra Perancis", - "educational_program": "S1 Reguler" - }, - "16.00.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Sastra Rusia", - "educational_program": "S1 Reguler" - }, - "27.00.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Bahasa dan Kebudayaan Korea", - "educational_program": "S1 Paralel" - }, - "05.03.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Ilmu Perpustakaan", - "educational_program": "S1 Paralel" - }, - "20.00.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Sastra Arab", - "educational_program": "S1 Paralel" - }, - "26.00.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Sastra Belanda", - "educational_program": "S1 Paralel" - }, - "19.00.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Sastra Cina", - "educational_program": "S1 Paralel" - }, - "22.00.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Sastra Inggris", - "educational_program": "S1 Paralel" - }, - "21.00.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Sastra Jepang", - "educational_program": "S1 Paralel" - }, - "24.00.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Sastra Jerman", - "educational_program": "S1 Paralel" - }, - "23.00.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Sastra Perancis", - "educational_program": "S1 Paralel" - }, - "04.03.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Ilmu Perpustakaan", - "educational_program": "S1 Ekstensi" - }, - "01.04.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Penerjemahan Bahasa Arab", - "educational_program": "Spesialis 1" - }, - "02.04.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Penerjemahan Bahasa Inggris", - "educational_program": "Spesialis 1" - }, - "03.04.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Penerjemahan Bahasa Perancis", - "educational_program": "Spesialis 1" - }, - "02.01.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Arkeologi", - "educational_program": "S2" - }, - "28.00.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Asia Tenggara", - "educational_program": "S2" - }, - "02.02.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Filsafat", - "educational_program": "S2" - }, - "04.04.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Ilmu Linguistik", - "educational_program": "S2" - }, - "03.03.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Ilmu Perpustakaan", - "educational_program": "S2" - }, - "02.06.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Ilmu Sejarah", - "educational_program": "S2" - }, - "01.05.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Ilmu Susastra", - "educational_program": "S2" - }, - "03.01.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Arkeologi", - "educational_program": "S3" - }, - "03.02.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Ilmu Filsafat", - "educational_program": "S3" - }, - "05.04.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Ilmu Linguistik", - "educational_program": "S3" - }, - "03.06.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Ilmu Sejarah", - "educational_program": "S3" - }, - "02.05.07.01": { - "faculty": "Ilmu Pengetahuan Budaya", - "study_program": "Ilmu Susastra", - "educational_program": "S3" - }, - "01.00.08.01": { - "faculty": "Psikologi", - "study_program": "Psikologi", - "educational_program": "S1 Reguler" - }, - "02.00.08.01": { - "faculty": "Psikologi", - "study_program": "Psikologi", - "educational_program": "S1 Kls Internasional" - }, - "07.00.08.01": { - "faculty": "Psikologi", - "study_program": "Psikologi", - "educational_program": "S1 Paralel" - }, - "03.00.08.01": { - "faculty": "Psikologi", - "study_program": "Psikologi", - "educational_program": "S1 Ekstensi" - }, - "04.00.08.01": { - "faculty": "Psikologi", - "study_program": "Ilmu Psikologi", - "educational_program": "S2" - }, - "06.00.08.01": { - "faculty": "Psikologi", - "study_program": "Psikologi Profesi", - "educational_program": "S2" - }, - "08.00.08.01": { - "faculty": "Psikologi", - "study_program": "Psikologi Terapan", - "educational_program": "S2" - }, - "05.00.08.01": { - "faculty": "Psikologi", - "study_program": "Psikologi", - "educational_program": "S3" - }, - "01.03.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Administrasi Asuransi dan Aktuaria", - "educational_program": "D3" - }, - "02.03.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Administrasi Keuangan dan Perbankan", - "educational_program": "D3" - }, - "03.03.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Administrasi Perkantoran dan Sekretaris", - "educational_program": "D3" - }, - "04.03.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Administrasi Perpajakan", - "educational_program": "D3" - }, - "01.01.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Komunikasi", - "educational_program": "D3" - }, - "01.07.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Pariwisata", - "educational_program": "D3" - }, - "02.07.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Antropologi Sosial", - "educational_program": "S1 Reguler" - }, - "05.03.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Ilmu Administrasi Fiskal", - "educational_program": "S1 Reguler" - }, - "06.03.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Ilmu Administrasi Negara", - "educational_program": "S1 Reguler" - }, - "07.03.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Ilmu Administrasi Niaga", - "educational_program": "S1 Reguler" - }, - "01.08.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Ilmu Hubungan Internasional", - "educational_program": "S1 Reguler" - }, - "01.06.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Ilmu Kesejahteraan Sosial", - "educational_program": "S1 Reguler" - }, - "02.01.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Ilmu Komunikasi", - "educational_program": "S1 Reguler" - }, - "01.02.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Ilmu Politik", - "educational_program": "S1 Reguler" - }, - "01.05.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Kriminologi", - "educational_program": "S1 Reguler" - }, - "01.04.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Sosiologi", - "educational_program": "S1 Reguler" - }, - "07.01.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Ilmu Komunikasi", - "educational_program": "S1 Kls Internasional" - }, - "13.03.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Ilmu Administrasi Fiskal", - "educational_program": "S1 Paralel" - }, - "14.03.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Ilmu Administrasi Negara", - "educational_program": "S1 Paralel" - }, - "15.03.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Ilmu Administrasi Niaga", - "educational_program": "S1 Paralel" - }, - "06.01.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Ilmu Komunikasi", - "educational_program": "S1 Paralel" - }, - "05.02.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Ilmu Politik", - "educational_program": "S1 Paralel" - }, - "05.05.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Kriminologi", - "educational_program": "S1 Paralel" - }, - "08.03.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Ilmu Administrasi Fiskal - Ekstensi", - "educational_program": "S1 Ekstensi" - }, - "09.03.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Ilmu Administrasi Negara - Ekstensi", - "educational_program": "S1 Ekstensi" - }, - "10.03.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Ilmu Administrasi Niaga - Ekstensi", - "educational_program": "S1 Ekstensi" - }, - "03.01.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Ilmu Komunikasi - Ekstensi", - "educational_program": "S1 Ekstensi" - }, - "02.02.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Ilmu Politik ", - "educational_program": "S1 Ekstensi" - }, - "02.05.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Kriminologi - Ekstensi", - "educational_program": "S1 Ekstensi" - }, - "03.07.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Antropologi", - "educational_program": "S2" - }, - "11.03.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Ilmu Administrasi", - "educational_program": "S2" - }, - "02.08.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Ilmu Hubungan Internasional", - "educational_program": "S2" - }, - "02.06.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Ilmu Kesejahteraan Sosial", - "educational_program": "S2" - }, - "04.01.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Ilmu Komunikasi", - "educational_program": "S2" - }, - "03.02.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Ilmu Politik", - "educational_program": "S2" - }, - "03.08.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Kajian Terorisme dalam Keamanan Internasional", - "educational_program": "S2" - }, - "03.05.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Kriminologi", - "educational_program": "S2" - }, - "02.04.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Sosiologi", - "educational_program": "S2" - }, - "04.07.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Antropologi", - "educational_program": "S3" - }, - "12.03.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Ilmu Administrasi", - "educational_program": "S3" - }, - "03.06.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Ilmu Kesejahteraan Sosial", - "educational_program": "S3" - }, - "05.01.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Ilmu Komunikasi", - "educational_program": "S3" - }, - "04.02.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Ilmu Politik", - "educational_program": "S3" - }, - "04.05.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Kriminologi", - "educational_program": "S3" - }, - "03.04.09.01": { - "faculty": "Ilmu Sosial dan Ilmu Politik", - "study_program": "Sosiologi", - "educational_program": "S3" - }, - "01.01.10.01": { - "faculty": "Kesehatan Masyarakat", - "study_program": "Asuransi Kesehatan", - "educational_program": "D3" - }, - "01.07.10.01": { - "faculty": "Kesehatan Masyarakat", - "study_program": "Kehumasan Pelayanan Kesehatan", - "educational_program": "D3" - }, - "01.06.10.01": { - "faculty": "Kesehatan Masyarakat", - "study_program": "Keselamatan dan Kesehatan Kerja", - "educational_program": "D3" - }, - "02.01.10.01": { - "faculty": "Kesehatan Masyarakat", - "study_program": "Manajemen Informasi Kesehatan dan Rekam Medis", - "educational_program": "D3" - }, - "03.01.10.01": { - "faculty": "Kesehatan Masyarakat", - "study_program": "Manajemen Pelayanan Rumah Sakit", - "educational_program": "D3" - }, - "02.07.10.01": { - "faculty": "Kesehatan Masyarakat", - "study_program": "Promosi dan Pendidikan Kesehatan", - "educational_program": "D3" - }, - "06.00.10.01": { - "faculty": "Kesehatan Masyarakat", - "study_program": "Kesehatan Lingkungan", - "educational_program": "S1 Reguler" - }, - "01.00.10.01": { - "faculty": "Kesehatan Masyarakat", - "study_program": "Kesehatan Masyarakat", - "educational_program": "S1 Reguler" - }, - "03.06.10.01": { - "faculty": "Kesehatan Masyarakat", - "study_program": "Keselamatan dan Kesehatan Kerja", - "educational_program": "S1 Reguler" - }, - "01.04.10.01": { - "faculty": "Kesehatan Masyarakat", - "study_program": "Studi Gizi", - "educational_program": "S1 Reguler" - }, - "02.00.10.01": { - "faculty": "Kesehatan Masyarakat", - "study_program": "Kesehatan Masyarakat - Ekstensi", - "educational_program": "S1 Ekstensi" - }, - "04.01.10.01": { - "faculty": "Kesehatan Masyarakat", - "study_program": "Administrasi Rumah Sakit", - "educational_program": "S2" - }, - "01.03.10.01": { - "faculty": "Kesehatan Masyarakat", - "study_program": "Epidemiologi", - "educational_program": "S2" - }, - "03.00.10.01": { - "faculty": "Kesehatan Masyarakat", - "study_program": "Ilmu Kesehatan Masyarakat", - "educational_program": "S2" - }, - "02.06.10.01": { - "faculty": "Kesehatan Masyarakat", - "study_program": "Keselamatan dan Kesehatan Kerja", - "educational_program": "S2" - }, - "04.00.10.01": { - "faculty": "Kesehatan Masyarakat", - "study_program": "Ilmu Kesehatan Masyarakat", - "educational_program": "S2 Kls Internasional" - }, - "02.03.10.01": { - "faculty": "Kesehatan Masyarakat", - "study_program": "Epidemiologi", - "educational_program": "S3" - }, - "05.00.10.01": { - "faculty": "Kesehatan Masyarakat", - "study_program": "Ilmu Kesehatan Masyarakat", - "educational_program": "S3" - }, - "01.00.12.01": { - "faculty": "Ilmu Komputer", - "study_program": "Ilmu Komputer", - "educational_program": "S1 Reguler" - }, - "06.00.12.01": { - "faculty": "Ilmu Komputer", - "study_program": "Sistem Informasi", - "educational_program": "S1 Reguler" - }, - "02.00.12.01": { - "faculty": "Ilmu Komputer", - "study_program": "Ilmu Komputer", - "educational_program": "S1 Kls Internasional" - }, - "09.00.12.01": { - "faculty": "Ilmu Komputer", - "study_program": "Ilmu Komputer", - "educational_program": "S1 Paralel" - }, - "08.00.12.01": { - "faculty": "Ilmu Komputer", - "study_program": "Sistem Informasi", - "educational_program": "S1 Paralel" - }, - "07.00.12.01": { - "faculty": "Ilmu Komputer", - "study_program": "Sistem Informasi - Ekstensi", - "educational_program": "S1 Ekstensi" - }, - "03.00.12.01": { - "faculty": "Ilmu Komputer", - "study_program": "Ilmu Komputer", - "educational_program": "S2" - }, - "04.00.12.01": { - "faculty": "Ilmu Komputer", - "study_program": "Teknologi Informasi", - "educational_program": "S2" - }, - "05.00.12.01": { - "faculty": "Ilmu Komputer", - "study_program": "Ilmu Komputer", - "educational_program": "S3" - }, - "01.00.13.01": { - "faculty": "Ilmu Keperawatan", - "study_program": "Ilmu Keperawatan", - "educational_program": "S1 Reguler" - }, - "02.00.13.01": { - "faculty": "Ilmu Keperawatan", - "study_program": "Ilmu Keperawatan - Ekstensi", - "educational_program": "S1 Ekstensi" - }, - "03.00.13.01": { - "faculty": "Ilmu Keperawatan", - "study_program": "Profesi Keperawatan", - "educational_program": "Profesi" - }, - "10.00.13.01": { - "faculty": "Ilmu Keperawatan", - "study_program": "Spesialis Keperawatan Anak", - "educational_program": "Spesialis 1" - }, - "08.00.13.01": { - "faculty": "Ilmu Keperawatan", - "study_program": "Spesialis Keperawatan Jiwa", - "educational_program": "Spesialis 1" - }, - "05.00.13.01": { - "faculty": "Ilmu Keperawatan", - "study_program": "Spesialis Keperawatan Komunitas", - "educational_program": "Spesialis 1" - }, - "06.00.13.01": { - "faculty": "Ilmu Keperawatan", - "study_program": "Spesialis Keperawatan Maternitas", - "educational_program": "Spesialis 1" - }, - "07.00.13.01": { - "faculty": "Ilmu Keperawatan", - "study_program": "Spesialis Keperawatan Medikal Bedah", - "educational_program": "Spesialis 1" - }, - "04.00.13.01": { - "faculty": "Ilmu Keperawatan", - "study_program": "Ilmu Keperawatan", - "educational_program": "S2" - }, - "09.00.13.01": { - "faculty": "Ilmu Keperawatan", - "study_program": "Ilmu Keperawatan", - "educational_program": "S3" - }, - "06.00.14.01": { - "faculty": "Pascasarjana", - "study_program": "Kajian Gender", - "educational_program": "S2" - }, - "01.00.14.01": { - "faculty": "Pascasarjana", - "study_program": "Kajian Ilmu Kepolisian", - "educational_program": "S2" - }, - "02.00.14.01": { - "faculty": "Pascasarjana", - "study_program": "Kajian Ilmu Lingkungan", - "educational_program": "S2" - }, - "03.00.14.01": { - "faculty": "Pascasarjana", - "study_program": "Kajian Kependudukan dan Ketenagakerjaan", - "educational_program": "S2" - }, - "04.00.14.01": { - "faculty": "Pascasarjana", - "study_program": "Kajian Ketahanan Nasional", - "educational_program": "S2" - }, - "05.00.14.01": { - "faculty": "Pascasarjana", - "study_program": "Kajian Pengembangan Perkotaan", - "educational_program": "S2" - }, - "07.00.14.01": { - "faculty": "Pascasarjana", - "study_program": "Kajian Wilayah Amerika", - "educational_program": "S2" - }, - "08.00.14.01": { - "faculty": "Pascasarjana", - "study_program": "Kajian Wilayah Eropa", - "educational_program": "S2" - }, - "09.00.14.01": { - "faculty": "Pascasarjana", - "study_program": "Kajian Wilayah Jepang", - "educational_program": "S2" - }, - "10.00.14.01": { - "faculty": "Pascasarjana", - "study_program": "Kajian Wilayah Timur Tengah Islam", - "educational_program": "S2" - }, - "12.00.14.01": { - "faculty": "Pascasarjana", - "study_program": "Teknologi Biomedis", - "educational_program": "S2" - }, - "11.00.14.01": { - "faculty": "Pascasarjana", - "study_program": "Ilmu Lingkungan", - "educational_program": "S3" - }, - "07.00.15.01": { - "faculty": "Pendidikan Vokasi", - "study_program": "Administrasi Asuransi dan Aktuaria", - "educational_program": "D3" - }, - "08.00.15.01": { - "faculty": "Pendidikan Vokasi", - "study_program": "Administrasi Keuangan dan Perbankan", - "educational_program": "D3" - }, - "09.00.15.01": { - "faculty": "Pendidikan Vokasi", - "study_program": "Administrasi Perkantoran dan Sekretari", - "educational_program": "D3" - }, - "10.00.15.01": { - "faculty": "Pendidikan Vokasi", - "study_program": "Administrasi Perpajakan", - "educational_program": "D3" - }, - "04.00.15.01": { - "faculty": "Pendidikan Vokasi", - "study_program": "Akuntansi", - "educational_program": "D3" - }, - "02.00.15.01": { - "faculty": "Pendidikan Vokasi", - "study_program": "Fisioterapi", - "educational_program": "D3" - }, - "06.00.15.01": { - "faculty": "Pendidikan Vokasi", - "study_program": "Komunikasi", - "educational_program": "D3" - }, - "05.00.15.01": { - "faculty": "Pendidikan Vokasi", - "study_program": "Manajemen Informasi dan Dokumen", - "educational_program": "D3" - }, - "03.00.15.01": { - "faculty": "Pendidikan Vokasi", - "study_program": "Okupasi Terapi", - "educational_program": "D3" - }, - "11.00.15.01": { - "faculty": "Pendidikan Vokasi", - "study_program": "Pariwisata", - "educational_program": "D3" - }, - "01.00.15.01": { - "faculty": "Pendidikan Vokasi", - "study_program": "Perumahsakitan", - "educational_program": "D3" - }, - "01.00.17.01": { - "faculty": "Farmasi", - "study_program": "Farmasi", - "educational_program": "S1 Reguler" - }, - "02.00.17.01": { - "faculty": "Farmasi", - "study_program": "Farmasi", - "educational_program": "S1 Paralel" - }, - "03.00.17.01": { - "faculty": "Farmasi", - "study_program": "Apoteker", - "educational_program": "Profesi" - }, - "04.00.17.01": { - "faculty": "Farmasi", - "study_program": "Farmasi", - "educational_program": "S2" - }, - "05.00.17.01": { - "faculty": "Farmasi", - "study_program": "Herbal", - "educational_program": "S2" - }, - "06.00.17.01": { - "faculty": "Farmasi", - "study_program": "Ilmu Farmasi", - "educational_program": "S3" - }, - "01.00.18.01": { - "faculty": "Ilmu Administrasi", - "study_program": "Ilmu Administrasi Fiskal", - "educational_program": "S1 Reguler" - }, - "02.00.18.01": { - "faculty": "Ilmu Administrasi", - "study_program": "Ilmu Administrasi Negara", - "educational_program": "S1 Reguler" - }, - "03.00.18.01": { - "faculty": "Ilmu Administrasi", - "study_program": "Ilmu Administrasi Niaga", - "educational_program": "S1 Reguler" - }, - "04.00.18.01": { - "faculty": "Ilmu Administrasi", - "study_program": "Ilmu Administrasi Fiskal", - "educational_program": "S1 Paralel" - }, - "05.00.18.01": { - "faculty": "Ilmu Administrasi", - "study_program": "Ilmu Administrasi Negara", - "educational_program": "S1 Paralel" - }, - "06.00.18.01": { - "faculty": "Ilmu Administrasi", - "study_program": "Ilmu Administrasi Niaga", - "educational_program": "S1 Paralel" - }, - "07.00.18.01": { - "faculty": "Ilmu Administrasi", - "study_program": "Ilmu Administrasi Fiskal", - "educational_program": "S1 Ekstensi" - }, - "08.00.18.01": { - "faculty": "Ilmu Administrasi", - "study_program": "Ilmu Administrasi Negara", - "educational_program": "S1 Ekstensi" - }, - "09.00.18.01": { - "faculty": "Ilmu Administrasi", - "study_program": "Ilmu Administrasi Niaga", - "educational_program": "S1 Ekstensi" - }, - "10.00.18.01": { - "faculty": "Ilmu Administrasi", - "study_program": "Ilmu Administrasi", - "educational_program": "S2" - }, - "11.00.18.01": { - "faculty": "Ilmu Administrasi", - "study_program": "Ilmu Administrasi", - "educational_program": "S3" - }, - "01.00.19.01": { - "faculty": "Ilmu Lingkungan", - "study_program": "Ilmu Lingkungan", - "educational_program": "S2" - }, - "02.00.19.01": { - "faculty": "Ilmu Lingkungan", - "study_program": "Ilmu Lingkungan", - "educational_program": "S3" - }, - "03.00.20.01": { - "faculty": "Kajian Stratejik dan Global", - "study_program": "Kajian Gender", - "educational_program": "S2" - }, - "02.00.20.01": { - "faculty": "Kajian Stratejik dan Global", - "study_program": "Kajian Ilmu Kepolisian", - "educational_program": "S2" - }, - "01.00.20.01": { - "faculty": "Kajian Stratejik dan Global", - "study_program": "Kajian Ketahanan Nasional", - "educational_program": "S2" - }, - "08.00.20.01": { - "faculty": "Kajian Stratejik dan Global", - "study_program": "Kajian Pengembangan Perkotaan", - "educational_program": "S2" - }, - "09.00.20.01": { - "faculty": "Kajian Stratejik dan Global", - "study_program": "Kajian Terorisme", - "educational_program": "S2" - }, - "04.00.20.01": { - "faculty": "Kajian Stratejik dan Global", - "study_program": "Kajian Wilayah Amerika", - "educational_program": "S2" - }, - "05.00.20.01": { - "faculty": "Kajian Stratejik dan Global", - "study_program": "Kajian Wilayah Eropa", - "educational_program": "S2" - }, - "06.00.20.01": { - "faculty": "Kajian Stratejik dan Global", - "study_program": "Kajian Wilayah Jepang", - "educational_program": "S2" - }, - "07.00.20.01": { - "faculty": "Kajian Stratejik dan Global", - "study_program": "Kajian Wilayah Timur Tengah dan Islam", - "educational_program": "S2" - } - }, - "en": { - "37.00.01.01": { - "faculty": "Medicine", - "study_program": "Physiotherapy", - "educational_program": "Diploma III" - }, - "38.00.01.01": { - "faculty": "Medicine", - "study_program": "Occupational Therapy", - "educational_program": "Diploma III" - }, - "01.00.01.01": { - "faculty": "Medicine", - "study_program": "Hospital Management", - "educational_program": "Diploma III" - }, - "02.00.01.01": { - "faculty": "Medicine", - "study_program": "", - "educational_program": "Diploma III" - }, - "03.00.01.01": { - "faculty": "Medicine", - "study_program": "", - "educational_program": "Diploma IV" - }, - "04.00.01.01": { - "faculty": "Medicine", - "study_program": "Medical Science", - "educational_program": "Undergraduate" - }, - "05.00.01.01": { - "faculty": "Medicine", - "study_program": "Medical Science", - "educational_program": "Intl. Class Undergraduate" - }, - "06.00.01.01": { - "faculty": "Medicine", - "study_program": "Medical Doctor", - "educational_program": "Profession" - }, - "42.00.01.01": { - "faculty": "Medicine", - "study_program": "Medical Doctor", - "educational_program": "Intl. Class Profession" - }, - "47.00.01.01": { - "faculty": "Medicine", - "study_program": "Acupuncture Medic", - "educational_program": "Specialist I" - }, - "13.00.01.01": { - "faculty": "Medicine", - "study_program": "Anesthesiology", - "educational_program": "Specialist I" - }, - "41.00.01.01": { - "faculty": "Medicine", - "study_program": "Cardiovascular and Thoracic Surgery", - "educational_program": "Specialist I" - }, - "21.00.01.01": { - "faculty": "Medicine", - "study_program": "Dermatology and Venereology", - "educational_program": "Specialist I" - }, - "36.00.01.01": { - "faculty": "Medicine", - "study_program": "Clinical Pharmacology", - "educational_program": "Specialist I" - }, - "14.00.01.01": { - "faculty": "Medicine", - "study_program": "Surgery", - "educational_program": "Specialist I" - }, - "29.00.01.01": { - "faculty": "Medicine", - "study_program": "Orthopaedic and Traumatology Surgery", - "educational_program": "Specialist I" - }, - "33.00.01.01": { - "faculty": "Medicine", - "study_program": "Plastic Surgery", - "educational_program": "Specialist I" - }, - "31.00.01.01": { - "faculty": "Medicine", - "study_program": "Neurosurgery", - "educational_program": "Specialist I" - }, - "45.00.01.01": { - "faculty": "Medicine", - "study_program": "Clinical Nutrition", - "educational_program": "Specialist I" - }, - "32.00.01.01": { - "faculty": "Medicine", - "study_program": "Physical Medicine and Rehabilitation", - "educational_program": "Specialist I" - }, - "26.00.01.01": { - "faculty": "Medicine", - "study_program": "Forensic Medicine", - "educational_program": "Specialist I" - }, - "19.00.01.01": { - "faculty": "Medicine", - "study_program": "Psychiatry", - "educational_program": "Specialist I" - }, - "34.00.01.01": { - "faculty": "Medicine", - "study_program": "Sports Medicine", - "educational_program": "Specialist I" - }, - "16.00.01.01": { - "faculty": "Medicine", - "study_program": "Pediatrics", - "educational_program": "Specialist I" - }, - "20.00.01.01": { - "faculty": "Medicine", - "study_program": "Ophthalmology", - "educational_program": "Specialist I" - }, - "15.00.01.01": { - "faculty": "Medicine", - "study_program": "Internal Medicine", - "educational_program": "Specialist I" - }, - "23.00.01.01": { - "faculty": "Medicine", - "study_program": "Cardiovascular Medicine", - "educational_program": "Specialist I" - }, - "18.00.01.01": { - "faculty": "Medicine", - "study_program": "Neurology", - "educational_program": "Specialist I" - }, - "22.00.01.01": { - "faculty": "Medicine", - "study_program": "Otorhinolaryngology", - "educational_program": "Specialist I" - }, - "39.00.01.01": { - "faculty": "Medicine", - "study_program": "Occupational Medicine", - "educational_program": "Specialist I" - }, - "44.00.01.01": { - "faculty": "Medicine", - "study_program": "Aviation Medicine", - "educational_program": "Specialist I" - }, - "35.00.01.01": { - "faculty": "Medicine", - "study_program": "Clinical Microbiology", - "educational_program": "Specialist I" - }, - "17.00.01.01": { - "faculty": "Medicine", - "study_program": "Obstetrics and Gynecology", - "educational_program": "Specialist I" - }, - "43.00.01.01": { - "faculty": "Medicine", - "study_program": "Radiation Oncology", - "educational_program": "Specialist I" - }, - "46.00.01.01": { - "faculty": "Medicine", - "study_program": "Clinical Parasitology", - "educational_program": "Specialist I" - }, - "27.00.01.01": { - "faculty": "Medicine", - "study_program": "Anatomical Pathology", - "educational_program": "Specialist I" - }, - "28.00.01.01": { - "faculty": "Medicine", - "study_program": "Clinical Pathology", - "educational_program": "Specialist I" - }, - "24.00.01.01": { - "faculty": "Medicine", - "study_program": "Respiratory", - "educational_program": "Specialist I" - }, - "25.00.01.01": { - "faculty": "Medicine", - "study_program": "Radiology", - "educational_program": "Specialist I" - }, - "30.00.01.01": { - "faculty": "Medicine", - "study_program": "Urology", - "educational_program": "Specialist I" - }, - "54.00.01.01": { - "faculty": "Medicine", - "study_program": "Anesthesiology and Intensive Theraphy", - "educational_program": "Specialist II" - }, - "51.00.01.01": { - "faculty": "Medicine", - "study_program": "Surgery", - "educational_program": "Specialist II" - }, - "50.00.01.01": { - "faculty": "Medicine", - "study_program": "Pediatrics", - "educational_program": "Specialist II" - }, - "48.00.01.01": { - "faculty": "Medicine", - "study_program": "Internal Medicine", - "educational_program": "Specialist II" - }, - "53.00.01.01": { - "faculty": "Medicine", - "study_program": "Psychiatry", - "educational_program": "Specialist II" - }, - "52.00.01.01": { - "faculty": "Medicine", - "study_program": "Obstetrics and Gynecology", - "educational_program": "Specialist II" - }, - "07.00.01.01": { - "faculty": "Medicine", - "study_program": "Biomedical Sciences", - "educational_program": "Graduate" - }, - "08.00.01.01": { - "faculty": "Medicine", - "study_program": "Nutrition", - "educational_program": "Graduate" - }, - "09.00.01.01": { - "faculty": "Medicine", - "study_program": "Occupational Medicine", - "educational_program": "Graduate" - }, - "49.00.01.01": { - "faculty": "Medicine", - "study_program": "Clinical Medicine", - "educational_program": "Graduate" - }, - "40.00.01.01": { - "faculty": "Medicine", - "study_program": "Medical Education", - "educational_program": "Graduate" - }, - "10.00.01.01": { - "faculty": "Medicine", - "study_program": "Biomedical Sciences", - "educational_program": "Doctoral" - }, - "11.00.01.01": { - "faculty": "Medicine", - "study_program": "Nutrition", - "educational_program": "Doctoral" - }, - "12.00.01.01": { - "faculty": "Medicine", - "study_program": "Medical Science", - "educational_program": "Doctoral" - }, - "01.00.02.01": { - "faculty": "Dentistry", - "study_program": "Dental Education", - "educational_program": "Undergraduate" - }, - "13.00.02.01": { - "faculty": "Dentistry", - "study_program": "Dental Education", - "educational_program": "Undergraduate" - }, - "02.00.02.01": { - "faculty": "Dentistry", - "study_program": "Dentistry", - "educational_program": "Profession" - }, - "06.00.02.01": { - "faculty": "Dentistry", - "study_program": "Oral and Maxillo Facial Surgery", - "educational_program": "Specialist I" - }, - "07.00.02.01": { - "faculty": "Dentistry", - "study_program": "Pediatric Dentistry", - "educational_program": "Specialist I" - }, - "08.00.02.01": { - "faculty": "Dentistry", - "study_program": "Conservative Dentistry", - "educational_program": "Specialist I" - }, - "09.00.02.01": { - "faculty": "Dentistry", - "study_program": "Oral Medicine", - "educational_program": "Specialist I" - }, - "10.00.02.01": { - "faculty": "Dentistry", - "study_program": "Orthodontics", - "educational_program": "Specialist I" - }, - "11.00.02.01": { - "faculty": "Dentistry", - "study_program": "Periodontology", - "educational_program": "Specialist I" - }, - "12.00.02.01": { - "faculty": "Dentistry", - "study_program": "Prosthetic Dentistry", - "educational_program": "Specialist I" - }, - "03.00.02.01": { - "faculty": "Dentistry", - "study_program": "Basic Dental Science", - "educational_program": "Graduate" - }, - "04.00.02.01": { - "faculty": "Dentistry", - "study_program": "Community Dental Science", - "educational_program": "Graduate" - }, - "05.00.02.01": { - "faculty": "Dentistry", - "study_program": "Dental Science", - "educational_program": "Doctoral" - }, - "01.05.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Hospital Pharmacy and Marketing Distribution", - "educational_program": "Diploma III" - }, - "01.02.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Instrumentation Physics", - "educational_program": "Diploma III" - }, - "01.03.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Applied Chemistry", - "educational_program": "Diploma III" - }, - "01.04.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Biology", - "educational_program": "Undergraduate" - }, - "02.05.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Pharmacy", - "educational_program": "Undergraduate" - }, - "02.02.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Physics", - "educational_program": "Undergraduate" - }, - "06.02.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Geophysics", - "educational_program": "Undergraduate" - }, - "01.06.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Geography", - "educational_program": "Undergraduate" - }, - "07.02.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Geology", - "educational_program": "Undergraduate" - }, - "05.01.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Actuarial Science", - "educational_program": "Undergraduate" - }, - "02.03.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Chemistry", - "educational_program": "Undergraduate" - }, - "01.01.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Mathematics", - "educational_program": "Undergraduate" - }, - "04.01.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Statistics", - "educational_program": "Undergraduate" - }, - "05.04.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Biology", - "educational_program": "Parallel Undergraduate" - }, - "06.05.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Pharmacy", - "educational_program": "Parallel Undergraduate" - }, - "05.02.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Physics", - "educational_program": "Parallel Undergraduate" - }, - "09.02.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Geophysics", - "educational_program": "Parallel Undergraduate" - }, - "05.06.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Geography", - "educational_program": "Parallel Undergraduate" - }, - "10.02.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Geology", - "educational_program": "Parallel Undergraduate" - }, - "06.03.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Chemistry", - "educational_program": "Parallel Undergraduate" - }, - "03.01.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Mathematics", - "educational_program": "Parallel Undergraduate" - }, - "06.01.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Statistics", - "educational_program": "Parallel Undergraduate" - }, - "03.05.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Pharmacy - Ext", - "educational_program": "Extended Undergraduate" - }, - "03.02.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Physics - Ext", - "educational_program": "Extended Undergraduate" - }, - "03.03.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Chemistry - Ext", - "educational_program": "Extended Undergraduate" - }, - "04.05.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Apothecary", - "educational_program": "Profession" - }, - "02.04.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Biology", - "educational_program": "Graduate" - }, - "02.06.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Geography Science", - "educational_program": "Graduate" - }, - "08.05.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Herbal", - "educational_program": "Graduate" - }, - "03.06.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Material Science", - "educational_program": "Graduate" - }, - "04.02.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Physics Science", - "educational_program": "Graduate" - }, - "05.05.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Pharmaceutical Science", - "educational_program": "Graduate" - }, - "03.04.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Marine Science", - "educational_program": "Graduate" - }, - "04.03.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Chemistry Science", - "educational_program": "Graduate" - }, - "02.01.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Mathematics", - "educational_program": "Graduate" - }, - "04.04.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Biology", - "educational_program": "Doctoral" - }, - "04.06.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Material Science", - "educational_program": "Doctoral" - }, - "07.05.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Pharmacy", - "educational_program": "Doctoral" - }, - "08.02.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Physics Science", - "educational_program": "Doctoral" - }, - "05.03.03.01": { - "faculty": "Mathematics and Natural Science", - "study_program": "Chemistry Science", - "educational_program": "Doctoral" - }, - "01.05.04.01": { - "faculty": "Engineering", - "study_program": "Architecture", - "educational_program": "Undergraduate" - }, - "05.05.04.01": { - "faculty": "Engineering", - "study_program": "Interior Architechture", - "educational_program": "Undergraduate" - }, - "12.03.04.01": { - "faculty": "Engineering", - "study_program": "Biomedic Engineering", - "educational_program": "Undergraduate" - }, - "01.03.04.01": { - "faculty": "Engineering", - "study_program": "Electrical Engineering", - "educational_program": "Undergraduate" - }, - "01.07.04.01": { - "faculty": "Engineering", - "study_program": "Industrial Engineering", - "educational_program": "Undergraduate" - }, - "01.06.04.01": { - "faculty": "Engineering", - "study_program": "Chemical Engineering", - "educational_program": "Undergraduate" - }, - "02.03.04.01": { - "faculty": "Engineering", - "study_program": "Computer Engineering", - "educational_program": "Undergraduate" - }, - "02.01.04.01": { - "faculty": "Engineering", - "study_program": "Environment Engineering", - "educational_program": "Undergraduate" - }, - "01.02.04.01": { - "faculty": "Engineering", - "study_program": "Mechanical Engineering", - "educational_program": "Undergraduate" - }, - "01.04.04.01": { - "faculty": "Engineering", - "study_program": "Metalurgy and Material Engineering", - "educational_program": "Undergraduate" - }, - "02.02.04.01": { - "faculty": "Engineering", - "study_program": "Naval Engineering", - "educational_program": "Undergraduate" - }, - "01.01.04.01": { - "faculty": "Engineering", - "study_program": "Civil Engineering", - "educational_program": "Undergraduate" - }, - "06.06.04.01": { - "faculty": "Engineering", - "study_program": "Bioprocess Technology", - "educational_program": "Undergraduate" - }, - "04.05.04.01": { - "faculty": "Engineering", - "study_program": "Architecture - Intl", - "educational_program": "Intl. Class Undergraduate" - }, - "04.03.04.01": { - "faculty": "Engineering", - "study_program": "Electrical Engineering", - "educational_program": "Intl. Class Undergraduate" - }, - "06.07.04.01": { - "faculty": "Engineering", - "study_program": "Industrial Engineering", - "educational_program": "Intl. Class Undergraduate" - }, - "03.06.04.01": { - "faculty": "Engineering", - "study_program": "Chemical Engineering", - "educational_program": "Intl. Class Undergraduate" - }, - "04.02.04.01": { - "faculty": "Engineering", - "study_program": "Mechanical Engineering", - "educational_program": "Intl. Class Undergraduate" - }, - "03.04.04.01": { - "faculty": "Engineering", - "study_program": "Metalurgy Engineering", - "educational_program": "Intl. Class Undergraduate" - }, - "04.01.04.01": { - "faculty": "Engineering", - "study_program": "Civil Engineering", - "educational_program": "Intl. Class Undergraduate" - }, - "08.05.04.01": { - "faculty": "Engineering", - "study_program": "Architecture", - "educational_program": "Parallel Undergraduate" - }, - "10.03.04.01": { - "faculty": "Engineering", - "study_program": "Electrical Engineering", - "educational_program": "Parallel Undergraduate" - }, - "04.07.04.01": { - "faculty": "Engineering", - "study_program": "Industrial Engineering", - "educational_program": "Parallel Undergraduate" - }, - "07.06.04.01": { - "faculty": "Engineering", - "study_program": "Chemical Engineering", - "educational_program": "Parallel Undergraduate" - }, - "08.01.04.01": { - "faculty": "Engineering", - "study_program": "Environment Engineering", - "educational_program": "Parallel Undergraduate" - }, - "07.02.04.01": { - "faculty": "Engineering", - "study_program": "Mechanical Engineering", - "educational_program": "Parallel Undergraduate" - }, - "06.04.04.01": { - "faculty": "Engineering", - "study_program": "Metalurgy and Material Engineering", - "educational_program": "Parallel Undergraduate" - }, - "07.01.04.01": { - "faculty": "Engineering", - "study_program": "Civil Engineering", - "educational_program": "Parallel Undergraduate" - }, - "02.05.04.01": { - "faculty": "Engineering", - "study_program": "Architecture", - "educational_program": "Extended Undergraduate" - }, - "03.03.04.01": { - "faculty": "Engineering", - "study_program": "Electrical Engineering - Ext", - "educational_program": "Extended Undergraduate" - }, - "02.07.04.01": { - "faculty": "Engineering", - "study_program": "Industrial Engineering - Ext", - "educational_program": "Extended Undergraduate" - }, - "02.06.04.01": { - "faculty": "Engineering", - "study_program": "Chemical Engineering - Ext", - "educational_program": "Extended Undergraduate" - }, - "03.02.04.01": { - "faculty": "Engineering", - "study_program": "Mechanical Engineering", - "educational_program": "Extended Undergraduate" - }, - "02.04.04.01": { - "faculty": "Engineering", - "study_program": "Metalurgy and Material Engineering - Ext", - "educational_program": "Extended Undergraduate" - }, - "03.01.04.01": { - "faculty": "Engineering", - "study_program": "Civil Engineering - Ext", - "educational_program": "Extended Undergraduate" - }, - "07.05.04.01": { - "faculty": "Engineering", - "study_program": "Architect", - "educational_program": "Profession" - }, - "01.00.04.01": { - "faculty": "Engineering", - "study_program": "Engineer", - "educational_program": "Profession" - }, - "03.05.04.01": { - "faculty": "Engineering", - "study_program": "Architecture", - "educational_program": "Graduate" - }, - "06.03.04.01": { - "faculty": "Engineering", - "study_program": "Optoelectronics and Laser Application", - "educational_program": "Graduate" - }, - "05.03.04.01": { - "faculty": "Engineering", - "study_program": "Electrical Engineering", - "educational_program": "Graduate" - }, - "03.07.04.01": { - "faculty": "Engineering", - "study_program": "Industrial Engineering", - "educational_program": "Graduate" - }, - "04.06.04.01": { - "faculty": "Engineering", - "study_program": "Chemical Engineering", - "educational_program": "Graduate" - }, - "05.02.04.01": { - "faculty": "Engineering", - "study_program": "Mechanical Engineering", - "educational_program": "Graduate" - }, - "04.04.04.01": { - "faculty": "Engineering", - "study_program": "Metalurgy and Material Engineering", - "educational_program": "Graduate" - }, - "05.01.04.01": { - "faculty": "Engineering", - "study_program": "Civil Engineering", - "educational_program": "Graduate" - }, - "02.00.04.01": { - "faculty": "Engineering", - "study_program": "Energy System Engineering", - "educational_program": "Graduate" - }, - "11.03.04.01": { - "faculty": "Engineering", - "study_program": "Biomedical Engineering", - "educational_program": "Graduate" - }, - "09.03.04.01": { - "faculty": "Engineering", - "study_program": "Electrical Engineering", - "educational_program": "Intl. Class Graduate" - }, - "06.05.04.01": { - "faculty": "Engineering", - "study_program": "Architecture", - "educational_program": "Doctoral" - }, - "07.03.04.01": { - "faculty": "Engineering", - "study_program": "Optoelectronics and Laser Application", - "educational_program": "Doctoral" - }, - "08.03.04.01": { - "faculty": "Engineering", - "study_program": "Electrical Engineering", - "educational_program": "Doctoral" - }, - "05.07.04.01": { - "faculty": "Engineering", - "study_program": "Industrial Engineering", - "educational_program": "Doctoral" - }, - "05.06.04.01": { - "faculty": "Engineering", - "study_program": "Chemical Engineering", - "educational_program": "Doctoral" - }, - "06.02.04.01": { - "faculty": "Engineering", - "study_program": "Mechanical Engineering", - "educational_program": "Doctoral" - }, - "05.04.04.01": { - "faculty": "Engineering", - "study_program": "Metalurgy and Material Engineering", - "educational_program": "Doctoral" - }, - "06.01.04.01": { - "faculty": "Engineering", - "study_program": "Civil Engineering", - "educational_program": "Doctoral" - }, - "01.00.05.01": { - "faculty": "Law", - "study_program": "Law", - "educational_program": "Undergraduate" - }, - "07.00.05.01": { - "faculty": "Law", - "study_program": "Law ", - "educational_program": "Intl. Class Undergraduate" - }, - "06.00.05.01": { - "faculty": "Law", - "study_program": "Law", - "educational_program": "Parallel Undergraduate" - }, - "02.00.05.01": { - "faculty": "Law", - "study_program": "Law", - "educational_program": "Extended Undergraduate" - }, - "03.00.05.01": { - "faculty": "Law", - "study_program": "Law", - "educational_program": "Graduate" - }, - "04.00.05.01": { - "faculty": "Law", - "study_program": "Notary", - "educational_program": "Graduate" - }, - "05.00.05.01": { - "faculty": "Law", - "study_program": "Law", - "educational_program": "Doctoral" - }, - "01.03.06.01": { - "faculty": "Economics and Business", - "study_program": "Accounting", - "educational_program": "Diploma III" - }, - "02.03.06.01": { - "faculty": "Economics and Business", - "study_program": "Accounting", - "educational_program": "Undergraduate" - }, - "08.01.06.01": { - "faculty": "Economics and Business", - "study_program": "Islamic Business", - "educational_program": "Undergraduate" - }, - "01.01.06.01": { - "faculty": "Economics and Business", - "study_program": "Economics", - "educational_program": "Undergraduate" - }, - "07.01.06.01": { - "faculty": "Economics and Business", - "study_program": "Islamic Economics", - "educational_program": "Undergraduate" - }, - "01.02.06.01": { - "faculty": "Economics and Business", - "study_program": "Management", - "educational_program": "Undergraduate" - }, - "04.03.06.01": { - "faculty": "Economics and Business", - "study_program": "Accounting", - "educational_program": "Intl. Class Undergraduate" - }, - "02.01.06.01": { - "faculty": "Economics and Business", - "study_program": "Economics International", - "educational_program": "Intl. Class Undergraduate" - }, - "02.02.06.01": { - "faculty": "Economics and Business", - "study_program": "Management", - "educational_program": "Intl. Class Undergraduate" - }, - "10.03.06.01": { - "faculty": "Economics and Business", - "study_program": "Accounting", - "educational_program": "Parallel Undergraduate" - }, - "03.03.06.01": { - "faculty": "Economics and Business", - "study_program": "Accounting", - "educational_program": "Extended Undergraduate" - }, - "03.02.06.01": { - "faculty": "Economics and Business", - "study_program": "Management", - "educational_program": "Extended Undergraduate" - }, - "05.03.06.01": { - "faculty": "Economics and Business", - "study_program": "Accounting", - "educational_program": "Profession" - }, - "07.03.06.01": { - "faculty": "Economics and Business", - "study_program": "Accounting", - "educational_program": "Graduate" - }, - "03.01.06.01": { - "faculty": "Economics and Business", - "study_program": "Economics", - "educational_program": "Graduate" - }, - "04.02.06.01": { - "faculty": "Economics and Business", - "study_program": "Management", - "educational_program": "Graduate" - }, - "09.03.06.01": { - "faculty": "Economics and Business", - "study_program": "Master of Accounting Program", - "educational_program": "Graduate" - }, - "06.03.06.01": { - "faculty": "Economics and Business", - "study_program": "Master Of Accounting Program", - "educational_program": "Graduate" - }, - "09.01.06.01": { - "faculty": "Economics and Business", - "study_program": "Master in Economics of Population and Labor", - "educational_program": "Graduate" - }, - "05.02.06.01": { - "faculty": "Economics and Business", - "study_program": "Master of Management", - "educational_program": "Graduate" - }, - "07.02.06.01": { - "faculty": "Economics and Business", - "study_program": "Master of Management", - "educational_program": "Graduate" - }, - "04.01.06.01": { - "faculty": "Economics and Business", - "study_program": "Planning and Public Policy", - "educational_program": "Graduate" - }, - "06.01.06.01": { - "faculty": "Economics and Business", - "study_program": "", - "educational_program": "Intl. Class Graduate" - }, - "08.03.06.01": { - "faculty": "Economics and Business", - "study_program": "Accounting", - "educational_program": "Doctoral" - }, - "05.01.06.01": { - "faculty": "Economics and Business", - "study_program": "Economics", - "educational_program": "Doctoral" - }, - "06.02.06.01": { - "faculty": "Economics and Business", - "study_program": "Management", - "educational_program": "Doctoral" - }, - "02.00.07.01": { - "faculty": "Humanities", - "study_program": "Arabic", - "educational_program": "Diploma III" - }, - "07.00.07.01": { - "faculty": "Humanities", - "study_program": "Dutch", - "educational_program": "Diploma III" - }, - "01.00.07.01": { - "faculty": "Humanities", - "study_program": "Chinese", - "educational_program": "Diploma III" - }, - "04.00.07.01": { - "faculty": "Humanities", - "study_program": "English", - "educational_program": "Diploma III" - }, - "03.00.07.01": { - "faculty": "Humanities", - "study_program": "Japanese", - "educational_program": "Diploma III" - }, - "06.00.07.01": { - "faculty": "Humanities", - "study_program": "German", - "educational_program": "Diploma III" - }, - "05.00.07.01": { - "faculty": "Humanities", - "study_program": "French", - "educational_program": "Diploma III" - }, - "01.03.07.01": { - "faculty": "Humanities", - "study_program": "Management of Information and Document", - "educational_program": "Diploma III" - }, - "01.01.07.01": { - "faculty": "Humanities", - "study_program": "Archaeology", - "educational_program": "Undergraduate" - }, - "18.00.07.01": { - "faculty": "Humanities", - "study_program": "Korean", - "educational_program": "Undergraduate" - }, - "01.02.07.01": { - "faculty": "Humanities", - "study_program": "Philosophy", - "educational_program": "Undergraduate" - }, - "02.03.07.01": { - "faculty": "Humanities", - "study_program": "Library Science", - "educational_program": "Undergraduate" - }, - "01.06.07.01": { - "faculty": "Humanities", - "study_program": "History", - "educational_program": "Undergraduate" - }, - "08.00.07.01": { - "faculty": "Humanities", - "study_program": "Arabic", - "educational_program": "Undergraduate" - }, - "17.00.07.01": { - "faculty": "Humanities", - "study_program": "Dutch", - "educational_program": "Undergraduate" - }, - "11.00.07.01": { - "faculty": "Humanities", - "study_program": "Chinese", - "educational_program": "Undergraduate" - }, - "10.00.07.01": { - "faculty": "Humanities", - "study_program": "Javanese", - "educational_program": "Undergraduate" - }, - "09.00.07.01": { - "faculty": "Humanities", - "study_program": "Indonesian", - "educational_program": "Undergraduate" - }, - "13.00.07.01": { - "faculty": "Humanities", - "study_program": "English", - "educational_program": "Undergraduate" - }, - "12.00.07.01": { - "faculty": "Humanities", - "study_program": "Japanese", - "educational_program": "Undergraduate" - }, - "15.00.07.01": { - "faculty": "Humanities", - "study_program": "German", - "educational_program": "Undergraduate" - }, - "14.00.07.01": { - "faculty": "Humanities", - "study_program": "French", - "educational_program": "Undergraduate" - }, - "16.00.07.01": { - "faculty": "Humanities", - "study_program": "Russian", - "educational_program": "Undergraduate" - }, - "27.00.07.01": { - "faculty": "Humanities", - "study_program": "Korean", - "educational_program": "Parallel Undergraduate" - }, - "05.03.07.01": { - "faculty": "Humanities", - "study_program": "Library Science", - "educational_program": "Parallel Undergraduate" - }, - "20.00.07.01": { - "faculty": "Humanities", - "study_program": "Arabic", - "educational_program": "Parallel Undergraduate" - }, - "26.00.07.01": { - "faculty": "Humanities", - "study_program": "Dutch", - "educational_program": "Parallel Undergraduate" - }, - "19.00.07.01": { - "faculty": "Humanities", - "study_program": "Chinese", - "educational_program": "Parallel Undergraduate" - }, - "22.00.07.01": { - "faculty": "Humanities", - "study_program": "English", - "educational_program": "Parallel Undergraduate" - }, - "21.00.07.01": { - "faculty": "Humanities", - "study_program": "Japanese", - "educational_program": "Parallel Undergraduate" - }, - "24.00.07.01": { - "faculty": "Humanities", - "study_program": "German", - "educational_program": "Parallel Undergraduate" - }, - "23.00.07.01": { - "faculty": "Humanities", - "study_program": "French", - "educational_program": "Parallel Undergraduate" - }, - "04.03.07.01": { - "faculty": "Humanities", - "study_program": "Library Science", - "educational_program": "Extended Undergraduate" - }, - "01.04.07.01": { - "faculty": "Humanities", - "study_program": "Arabic Translation", - "educational_program": "Specialist I" - }, - "02.04.07.01": { - "faculty": "Humanities", - "study_program": "English Translation", - "educational_program": "Specialist I" - }, - "03.04.07.01": { - "faculty": "Humanities", - "study_program": "French Translation", - "educational_program": "Specialist I" - }, - "02.01.07.01": { - "faculty": "Humanities", - "study_program": "Archaeology", - "educational_program": "Graduate" - }, - "28.00.07.01": { - "faculty": "Humanities", - "study_program": "South East Asia", - "educational_program": "Graduate" - }, - "02.02.07.01": { - "faculty": "Humanities", - "study_program": "Philosophy", - "educational_program": "Graduate" - }, - "04.04.07.01": { - "faculty": "Humanities", - "study_program": "Linguistics", - "educational_program": "Graduate" - }, - "03.03.07.01": { - "faculty": "Humanities", - "study_program": "Library Science", - "educational_program": "Graduate" - }, - "02.06.07.01": { - "faculty": "Humanities", - "study_program": "History Science - Graduate", - "educational_program": "Graduate" - }, - "01.05.07.01": { - "faculty": "Humanities", - "study_program": "Literature", - "educational_program": "Graduate" - }, - "03.01.07.01": { - "faculty": "Humanities", - "study_program": "Archaeology", - "educational_program": "Doctoral" - }, - "03.02.07.01": { - "faculty": "Humanities", - "study_program": "Philosophy", - "educational_program": "Doctoral" - }, - "05.04.07.01": { - "faculty": "Humanities", - "study_program": "Linguistics", - "educational_program": "Doctoral" - }, - "03.06.07.01": { - "faculty": "Humanities", - "study_program": "History", - "educational_program": "Doctoral" - }, - "02.05.07.01": { - "faculty": "Humanities", - "study_program": "Literature", - "educational_program": "Doctoral" - }, - "01.00.08.01": { - "faculty": "Psychology", - "study_program": "Psychology", - "educational_program": "Undergraduate" - }, - "02.00.08.01": { - "faculty": "Psychology", - "study_program": "Psychology", - "educational_program": "Intl. Class Undergraduate" - }, - "07.00.08.01": { - "faculty": "Psychology", - "study_program": "Psychology", - "educational_program": "Parallel Undergraduate" - }, - "03.00.08.01": { - "faculty": "Psychology", - "study_program": "Psychology ", - "educational_program": "Extended Undergraduate" - }, - "04.00.08.01": { - "faculty": "Psychology", - "study_program": "Psychology", - "educational_program": "Graduate" - }, - "06.00.08.01": { - "faculty": "Psychology", - "study_program": "Psychology", - "educational_program": "Graduate" - }, - "08.00.08.01": { - "faculty": "Psychology", - "study_program": "Applied Psychology", - "educational_program": "Graduate" - }, - "05.00.08.01": { - "faculty": "Psychology", - "study_program": "Psychology", - "educational_program": "Doctoral" - }, - "01.03.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Insurance and Actuarial Program", - "educational_program": "Diploma III" - }, - "02.03.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Finance and Banking Program", - "educational_program": "Diploma III" - }, - "03.03.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Office and Secretarial Program", - "educational_program": "Diploma III" - }, - "04.03.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Taxation Program", - "educational_program": "Diploma III" - }, - "01.01.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Communication", - "educational_program": "Diploma III" - }, - "01.07.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Cultural Tourism", - "educational_program": "Diploma III" - }, - "02.07.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Social Anthropology", - "educational_program": "Undergraduate" - }, - "05.03.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Fiscal Administration", - "educational_program": "Undergraduate" - }, - "06.03.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Public Administration", - "educational_program": "Undergraduate" - }, - "07.03.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Business Administration", - "educational_program": "Undergraduate" - }, - "01.08.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "International Relations", - "educational_program": "Undergraduate" - }, - "01.06.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Social Welfare", - "educational_program": "Undergraduate" - }, - "02.01.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Communication", - "educational_program": "Undergraduate" - }, - "01.02.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Political Science", - "educational_program": "Undergraduate" - }, - "01.05.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Criminology", - "educational_program": "Undergraduate" - }, - "01.04.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Sociology", - "educational_program": "Undergraduate" - }, - "07.01.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Communication", - "educational_program": "Intl. Class Undergraduate" - }, - "13.03.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Fiscal Administration", - "educational_program": "Parallel Undergraduate" - }, - "14.03.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Public Administration", - "educational_program": "Parallel Undergraduate" - }, - "15.03.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Business Administration ", - "educational_program": "Parallel Undergraduate" - }, - "06.01.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Communication", - "educational_program": "Parallel Undergraduate" - }, - "05.02.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Political Science", - "educational_program": "Parallel Undergraduate" - }, - "05.05.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Criminology", - "educational_program": "Parallel Undergraduate" - }, - "08.03.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Fiscal Administration - Ext", - "educational_program": "Extended Undergraduate" - }, - "09.03.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Public Administration - Ext", - "educational_program": "Extended Undergraduate" - }, - "10.03.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Business Administration - Ext", - "educational_program": "Extended Undergraduate" - }, - "03.01.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Communication - Ext", - "educational_program": "Extended Undergraduate" - }, - "02.02.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Political Science ", - "educational_program": "Extended Undergraduate" - }, - "02.05.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Criminology - Ext", - "educational_program": "Extended Undergraduate" - }, - "03.07.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Anthropology", - "educational_program": "Graduate" - }, - "11.03.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Administration", - "educational_program": "Graduate" - }, - "02.08.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "International Relations", - "educational_program": "Graduate" - }, - "02.06.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Social Welfare", - "educational_program": "Graduate" - }, - "04.01.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Communication", - "educational_program": "Graduate" - }, - "03.02.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Political Science", - "educational_program": "Graduate" - }, - "03.08.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Terrorism in International Security", - "educational_program": "Graduate" - }, - "03.05.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Criminology", - "educational_program": "Graduate" - }, - "02.04.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Sociology", - "educational_program": "Graduate" - }, - "04.07.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Anthropology", - "educational_program": "Doctoral" - }, - "12.03.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Administration", - "educational_program": "Doctoral" - }, - "03.06.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Social Welfare", - "educational_program": "Doctoral" - }, - "05.01.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Communication", - "educational_program": "Doctoral" - }, - "04.02.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Political Science", - "educational_program": "Doctoral" - }, - "04.05.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Criminology", - "educational_program": "Doctoral" - }, - "03.04.09.01": { - "faculty": "Social and Political Sciences", - "study_program": "Sociology", - "educational_program": "Doctoral" - }, - "01.01.10.01": { - "faculty": "Public Health", - "study_program": "Health Insurance", - "educational_program": "Diploma III" - }, - "01.07.10.01": { - "faculty": "Public Health", - "study_program": "Public Relation in Health Care", - "educational_program": "Diploma III" - }, - "01.06.10.01": { - "faculty": "Public Health", - "study_program": "Occupational Health and Safety", - "educational_program": "Diploma III" - }, - "02.01.10.01": { - "faculty": "Public Health", - "study_program": "Health Information Management and Medical Record", - "educational_program": "Diploma III" - }, - "03.01.10.01": { - "faculty": "Public Health", - "study_program": "Hospital Services Management", - "educational_program": "Diploma III" - }, - "02.07.10.01": { - "faculty": "Public Health", - "study_program": "Health Education and Promotion", - "educational_program": "Diploma III" - }, - "06.00.10.01": { - "faculty": "Public Health", - "study_program": "Environmental Health", - "educational_program": "Undergraduate" - }, - "01.00.10.01": { - "faculty": "Public Health", - "study_program": "Public Health", - "educational_program": "Undergraduate" - }, - "03.06.10.01": { - "faculty": "Public Health", - "study_program": "Occupational Health and Safety", - "educational_program": "Undergraduate" - }, - "01.04.10.01": { - "faculty": "Public Health", - "study_program": "", - "educational_program": "Undergraduate" - }, - "02.00.10.01": { - "faculty": "Public Health", - "study_program": "Public Health", - "educational_program": "Extended Undergraduate" - }, - "04.01.10.01": { - "faculty": "Public Health", - "study_program": "Hospital Administration", - "educational_program": "Graduate" - }, - "01.03.10.01": { - "faculty": "Public Health", - "study_program": "Epidemiology", - "educational_program": "Graduate" - }, - "03.00.10.01": { - "faculty": "Public Health", - "study_program": "Public Health Science", - "educational_program": "Graduate" - }, - "02.06.10.01": { - "faculty": "Public Health", - "study_program": "Occupational Health and Safety", - "educational_program": "Graduate" - }, - "04.00.10.01": { - "faculty": "Public Health", - "study_program": "Public Health Science", - "educational_program": "Intl. Class Graduate" - }, - "02.03.10.01": { - "faculty": "Public Health", - "study_program": "Epidemiology", - "educational_program": "Doctoral" - }, - "05.00.10.01": { - "faculty": "Public Health", - "study_program": "Public Health Science", - "educational_program": "Doctoral" - }, - "01.00.12.01": { - "faculty": "Computer Science", - "study_program": "Computer Science", - "educational_program": "Undergraduate" - }, - "06.00.12.01": { - "faculty": "Computer Science", - "study_program": "Information System", - "educational_program": "Undergraduate" - }, - "02.00.12.01": { - "faculty": "Computer Science", - "study_program": "Computer Science ", - "educational_program": "Intl. Class Undergraduate" - }, - "09.00.12.01": { - "faculty": "Computer Science", - "study_program": "Computer Science", - "educational_program": "Parallel Undergraduate" - }, - "08.00.12.01": { - "faculty": "Computer Science", - "study_program": "Information System", - "educational_program": "Parallel Undergraduate" - }, - "07.00.12.01": { - "faculty": "Computer Science", - "study_program": "Information Systems - Ext", - "educational_program": "Extended Undergraduate" - }, - "03.00.12.01": { - "faculty": "Computer Science", - "study_program": "Computer Science", - "educational_program": "Graduate" - }, - "04.00.12.01": { - "faculty": "Computer Science", - "study_program": "Information Technology", - "educational_program": "Graduate" - }, - "05.00.12.01": { - "faculty": "Computer Science", - "study_program": "Computer Science", - "educational_program": "Doctoral" - }, - "01.00.13.01": { - "faculty": "Nursing", - "study_program": "Nursing Science", - "educational_program": "Undergraduate" - }, - "02.00.13.01": { - "faculty": "Nursing", - "study_program": "Nursing Science - Ext", - "educational_program": "Extended Undergraduate" - }, - "03.00.13.01": { - "faculty": "Nursing", - "study_program": "Bachelor of Nursing", - "educational_program": "Profession" - }, - "10.00.13.01": { - "faculty": "Nursing", - "study_program": "Child Nursing Specialist", - "educational_program": "Specialist I" - }, - "08.00.13.01": { - "faculty": "Nursing", - "study_program": "Mental Care Nursing Spesialist", - "educational_program": "Specialist I" - }, - "05.00.13.01": { - "faculty": "Nursing", - "study_program": "Community Nursing Spesialist", - "educational_program": "Specialist I" - }, - "06.00.13.01": { - "faculty": "Nursing", - "study_program": "Maternity Nursing Spesialist", - "educational_program": "Specialist I" - }, - "07.00.13.01": { - "faculty": "Nursing", - "study_program": "Surgery Medical Nursing Spesialist", - "educational_program": "Specialist I" - }, - "04.00.13.01": { - "faculty": "Nursing", - "study_program": "Nursing", - "educational_program": "Graduate" - }, - "09.00.13.01": { - "faculty": "Nursing", - "study_program": "Nursing", - "educational_program": "Doctoral" - }, - "06.00.14.01": { - "faculty": "Graduate School", - "study_program": "Gender Studies", - "educational_program": "Graduate" - }, - "01.00.14.01": { - "faculty": "Graduate School", - "study_program": "Police Studies", - "educational_program": "Graduate" - }, - "02.00.14.01": { - "faculty": "Graduate School", - "study_program": "Environmental Studies", - "educational_program": "Graduate" - }, - "03.00.14.01": { - "faculty": "Graduate School", - "study_program": "Population and Manpower Studies", - "educational_program": "Graduate" - }, - "04.00.14.01": { - "faculty": "Graduate School", - "study_program": "National Resilience", - "educational_program": "Graduate" - }, - "05.00.14.01": { - "faculty": "Graduate School", - "study_program": "Urban Studies", - "educational_program": "Graduate" - }, - "07.00.14.01": { - "faculty": "Graduate School", - "study_program": "American Studies", - "educational_program": "Graduate" - }, - "08.00.14.01": { - "faculty": "Graduate School", - "study_program": "European Studies", - "educational_program": "Graduate" - }, - "09.00.14.01": { - "faculty": "Graduate School", - "study_program": "Japanese Studies", - "educational_program": "Graduate" - }, - "10.00.14.01": { - "faculty": "Graduate School", - "study_program": "Islamics & Middle Eastern Studies", - "educational_program": "Graduate" - }, - "12.00.14.01": { - "faculty": "Graduate School", - "study_program": "Biomedical Engineering", - "educational_program": "Graduate" - }, - "11.00.14.01": { - "faculty": "Graduate School", - "study_program": "Environmental Studies", - "educational_program": "Doctoral" - }, - "07.00.15.01": { - "faculty": "Vocational Education", - "study_program": "Insurance and Actuarial Program", - "educational_program": "Diploma III" - }, - "08.00.15.01": { - "faculty": "Vocational Education", - "study_program": "Finance and Banking Program", - "educational_program": "Diploma III" - }, - "09.00.15.01": { - "faculty": "Vocational Education", - "study_program": "Office and Secretarial Program", - "educational_program": "Diploma III" - }, - "10.00.15.01": { - "faculty": "Vocational Education", - "study_program": "Taxation Program", - "educational_program": "Diploma III" - }, - "04.00.15.01": { - "faculty": "Vocational Education", - "study_program": "Accounting", - "educational_program": "Diploma III" - }, - "02.00.15.01": { - "faculty": "Vocational Education", - "study_program": "Physiotherapy", - "educational_program": "Diploma III" - }, - "06.00.15.01": { - "faculty": "Vocational Education", - "study_program": "Communication", - "educational_program": "Diploma III" - }, - "05.00.15.01": { - "faculty": "Vocational Education", - "study_program": "Management of Information and Document", - "educational_program": "Diploma III" - }, - "03.00.15.01": { - "faculty": "Vocational Education", - "study_program": "Occupational Therapy", - "educational_program": "Diploma III" - }, - "11.00.15.01": { - "faculty": "Vocational Education", - "study_program": "Cultural Tourism", - "educational_program": "Diploma III" - }, - "01.00.15.01": { - "faculty": "Vocational Education", - "study_program": "Hospital Management", - "educational_program": "Diploma III" - }, - "01.00.17.01": { - "faculty": "Pharmacy", - "study_program": "Pharmacy", - "educational_program": "Undergraduate" - }, - "02.00.17.01": { - "faculty": "Pharmacy", - "study_program": "Pharmacy", - "educational_program": "Parallel Undergraduate" - }, - "03.00.17.01": { - "faculty": "Pharmacy", - "study_program": "Apothecary", - "educational_program": "Profession" - }, - "04.00.17.01": { - "faculty": "Pharmacy", - "study_program": "Pharmaceutical Science", - "educational_program": "Graduate" - }, - "05.00.17.01": { - "faculty": "Pharmacy", - "study_program": "Herbal", - "educational_program": "Graduate" - }, - "06.00.17.01": { - "faculty": "Pharmacy", - "study_program": "Pharmacy", - "educational_program": "Doctoral" - }, - "01.00.18.01": { - "faculty": "Administration Science", - "study_program": "Fiscal Administration", - "educational_program": "Undergraduate" - }, - "02.00.18.01": { - "faculty": "Administration Science", - "study_program": "Public Administration", - "educational_program": "Undergraduate" - }, - "03.00.18.01": { - "faculty": "Administration Science", - "study_program": "Business Administration", - "educational_program": "Undergraduate" - }, - "04.00.18.01": { - "faculty": "Administration Science", - "study_program": "Fiscal Administration", - "educational_program": "Parallel Undergraduate" - }, - "05.00.18.01": { - "faculty": "Administration Science", - "study_program": "Public Administration", - "educational_program": "Parallel Undergraduate" - }, - "06.00.18.01": { - "faculty": "Administration Science", - "study_program": "Business Administration", - "educational_program": "Parallel Undergraduate" - }, - "07.00.18.01": { - "faculty": "Administration Science", - "study_program": "Fiscal Administration", - "educational_program": "Extended Undergraduate" - }, - "08.00.18.01": { - "faculty": "Administration Science", - "study_program": "Public Administration", - "educational_program": "Extended Undergraduate" - }, - "09.00.18.01": { - "faculty": "Administration Science", - "study_program": "Business Administration", - "educational_program": "Extended Undergraduate" - }, - "10.00.18.01": { - "faculty": "Administration Science", - "study_program": "Administration", - "educational_program": "Graduate" - }, - "11.00.18.01": { - "faculty": "Administration Science", - "study_program": "Administration", - "educational_program": "Doctoral" - }, - "01.00.19.01": { - "faculty": "Environmental Science", - "study_program": "Environmental Science Studies", - "educational_program": "Graduate" - }, - "02.00.19.01": { - "faculty": "Environmental Science", - "study_program": "Environmental Science", - "educational_program": "Doctoral" - }, - "03.00.20.01": { - "faculty": "Strategic and Global Studies", - "study_program": "Gender Studies", - "educational_program": "Graduate" - }, - "02.00.20.01": { - "faculty": "Strategic and Global Studies", - "study_program": "Police Studies", - "educational_program": "Graduate" - }, - "01.00.20.01": { - "faculty": "Strategic and Global Studies", - "study_program": "National Resilience", - "educational_program": "Graduate" - }, - "08.00.20.01": { - "faculty": "Strategic and Global Studies", - "study_program": "Urban Studies", - "educational_program": "Graduate" - }, - "09.00.20.01": { - "faculty": "Strategic and Global Studies", - "study_program": "Terrorism Studies", - "educational_program": "Graduate" - }, - "04.00.20.01": { - "faculty": "Strategic and Global Studies", - "study_program": "American Studies", - "educational_program": "Graduate" - }, - "05.00.20.01": { - "faculty": "Strategic and Global Studies", - "study_program": "European Studies", - "educational_program": "Graduate" - }, - "06.00.20.01": { - "faculty": "Strategic and Global Studies", - "study_program": "Japanese Studies", - "educational_program": "Graduate" - }, - "07.00.20.01": { - "faculty": "Strategic and Global Studies", - "study_program": "Islamics and Eastern Studies", - "educational_program": "Graduate" - } - } - } - \ No newline at end of file diff --git a/new/authentication/tests.py b/new/authentication/tests.py deleted file mode 100644 index 9191400..0000000 --- a/new/authentication/tests.py +++ /dev/null @@ -1,1031 +0,0 @@ -from .models import ( - ORG_CODE, - User, - Mahasiswa, - SupervisorLembaga, - SupervisorSekolah, - KoordinatorKuliah, - Administrator, - Periode -) -from lembaga.models import ( - Institusi, - Tema, - Lembaga, -) -from .serializers import ( - UserSerializer, - LembagaProfileSerializer, - SupervisorLembagaRegistrationSerializer, - UserLoginSerializer, - MahasiswaSerializer, - SupervisorLembagaSerializer, - SupervisorSekolahSerializer, - KoordinatorKuliahSerializer, - AdministratorSerializer, -) -from django.conf import settings -from django.test import TestCase -from django.urls import reverse -from django_cas_ng.signals import cas_user_authenticated -from rest_framework import serializers -from rest_framework import status -from rest_framework.test import APITestCase -import json -from .role import Role -from rest_framework_jwt.settings import api_settings -from django.core.files import File -from io import BytesIO -from PIL import Image -import base64 - - -class ModelsTest(TestCase): - '''Test Module for model''' - - def get_image_file(self, name='test.png', ext='png', size=(50, 50), color=(256, 0, 0)): - '''Mock image''' - file_obj = BytesIO() - image = Image.new("RGBA", size=size, color=color) - image.save(file_obj, ext) - file_obj.seek(0) - return File(file_obj, name=name) - - def setUp(self): - ''' Create object to test based on models''' - - user_mahasiswa = User.objects.create_user( - username="username1", - email="username1@email.com", - password="password", - first_name="User", - last_name="Name1" - ) - - user_supervisor_sekolah = User.objects.create_user( - username="username2", - email="username2@email.com", - password="password", - first_name="User", - last_name="Name2" - ) - - user_supervisor_lembaga = User.objects.create_user( - username="username3", - email="username3@email.com", - password="password", - first_name="User", - last_name="Name3" - ) - - user_koordinator_kuliah = User.objects.create_user( - username="username4", - email="username4@email.com", - password="password", - first_name="User", - last_name="Name4" - ) - - user_administrator = User.objects.create_user( - username="username5", - email="username5@email.com", - password="password", - first_name="User", - last_name="Name5" - ) - - User.objects.create_superuser( - username="admin", - email="username6@email.com", - password="password" - ) - - institusi = Institusi.objects.create( - nama="testing" - ) - - tema = Tema.objects.create( - nama="testing" - ) - self.lembaga = Lembaga.objects.create( - nama="testing", - jenis_pelayanan="testing", - institusi=institusi, - tema=tema, - deskripsi_singkat="testing", - praktikum_ke=1, - alamat="test_alamat", - beneficaries="test_beneficaries" - ) - - self.lembaga.gambar = self.get_image_file() - self.lembaga.save() - - supervisor_lembaga = SupervisorLembaga.objects.create( - user=user_supervisor_lembaga, - lembaga=self.lembaga, - jabatan="jabatan" - ) - - supervisor_sekolah = SupervisorSekolah.objects.create( - user=user_supervisor_sekolah, - nip="nip" - ) - - periode = Periode.objects.create( - nama="periode" - ) - - Mahasiswa.objects.create( - user=user_mahasiswa, - npm="npm", - org_code="org_code", - faculty="faculty", - major="major", - program="program", - periode=periode, - supervisor_lembaga=supervisor_lembaga, - supervisor_sekolah=supervisor_sekolah - ) - - KoordinatorKuliah.objects.create( - user=user_koordinator_kuliah, - nip="nip" - ) - - Administrator.objects.create( - user=user_administrator, - nip="nip" - ) - - def test_model_user_return_str(self): - ''' Test model user return true if the result is string type''' - - user_mahasiswa_data = User.objects.get(username="username1") - self.assertEqual(user_mahasiswa_data.username, "username1") - self.assertEqual(user_mahasiswa_data.email, "username1@email.com") - self.assertEqual(user_mahasiswa_data.get_full_name(), "User Name1") - self.assertEqual(type(user_mahasiswa_data.__str__()), str) - - user_supervisor_sekolah_data = User.objects.get(username="username2") - self.assertEqual(user_supervisor_sekolah_data.username, "username2") - self.assertEqual(user_supervisor_sekolah_data.email, "username2@email.com") - self.assertEqual(user_supervisor_sekolah_data.get_full_name(), "User Name2") - self.assertEqual(type(user_supervisor_sekolah_data.__str__()), str) - - user_supervisor_lembaga_data = User.objects.get(username="username3") - self.assertEqual(user_supervisor_lembaga_data.username, "username3") - self.assertEqual(user_supervisor_lembaga_data.email, "username3@email.com") - self.assertEqual(user_supervisor_lembaga_data.get_full_name(), "User Name3") - self.assertEqual(type(user_supervisor_lembaga_data.__str__()), str) - - user_koordinator_kuliah_data = User.objects.get(username="username4") - self.assertEqual(user_koordinator_kuliah_data.username, "username4") - self.assertEqual(user_koordinator_kuliah_data.email, "username4@email.com") - self.assertEqual(user_koordinator_kuliah_data.get_full_name(), "User Name4") - self.assertEqual(type(user_koordinator_kuliah_data.__str__()), str) - - user_administrator_data = User.objects.get(username="username5") - self.assertEqual(user_administrator_data.username, "username5") - self.assertEqual(user_administrator_data.email, "username5@email.com") - self.assertEqual(user_administrator_data.get_full_name(), "User Name5") - self.assertEqual(type(user_administrator_data.__str__()), str) - - super_user_data = User.objects.get(username="admin") - self.assertEqual(super_user_data.username, "admin") - self.assertEqual(super_user_data.email, "username6@email.com") - self.assertEqual(super_user_data.get_full_name(), "") - self.assertEqual(type(super_user_data.__str__()), str) - - def test_model_profile_return_str(self): - ''' Test model profile return true if the result is string type''' - - user_mahasiswa_data = User.objects.get(username="username1") - user_supervisor_sekolah_data = User.objects.get(username="username2") - user_supervisor_lembaga_data = User.objects.get(username="username3") - user_koordinator_kuliah_data = User.objects.get(username="username4") - user_administrator_data = User.objects.get(username="username5") - - profile_mahasiswa_data = Mahasiswa.objects.get(user=user_mahasiswa_data) - self.assertEqual(profile_mahasiswa_data.org_code, "org_code") - self.assertEqual(profile_mahasiswa_data.npm, "npm") - self.assertEqual(profile_mahasiswa_data.faculty, "faculty") - self.assertEqual(profile_mahasiswa_data.major, "major") - self.assertEqual(profile_mahasiswa_data.program, "program") - self.assertEqual(profile_mahasiswa_data.supervisor_lembaga.user, user_supervisor_lembaga_data) - self.assertEqual(profile_mahasiswa_data.supervisor_sekolah.user, user_supervisor_sekolah_data) - self.assertEqual(type(profile_mahasiswa_data.__str__()), str) - - profile_supervisor_lembaga_data = SupervisorLembaga.objects.get(user=user_supervisor_lembaga_data) - self.assertEqual(profile_supervisor_lembaga_data.lembaga, self.lembaga) - self.assertEqual(profile_supervisor_lembaga_data.jabatan, "jabatan") - self.assertEqual(type(profile_supervisor_lembaga_data.__str__()), str) - - profile_supervisor_sekolah_data = SupervisorSekolah.objects.get(user=user_supervisor_sekolah_data) - self.assertEqual(profile_supervisor_sekolah_data.nip, "nip") - self.assertEqual(type(profile_supervisor_sekolah_data.__str__()), str) - - profile_koordinator_kuliah_data = KoordinatorKuliah.objects.get(user=user_koordinator_kuliah_data) - self.assertEqual(profile_koordinator_kuliah_data.nip, "nip") - self.assertEqual(type(profile_koordinator_kuliah_data.__str__()), str) - - profile_administrator_data = Administrator.objects.get(user=user_administrator_data) - self.assertEqual(profile_administrator_data.nip, "nip") - self.assertEqual(type(profile_administrator_data.__str__()), str) - - -class SerializersTest(TestCase): - - def get_image_file(self, name='test.png', ext='png', size=(50, 50), color=(256, 0, 0)): - '''Mock image''' - file_obj = BytesIO() - image = Image.new("RGBA", size=size, color=color) - image.save(file_obj, ext) - file_obj.seek(0) - return File(file_obj, name=name) - - def setUp(self): - user_mahasiswa = User.objects.create_user( - username="username1", - email="username1@email.com", - password="password", - first_name="User", - last_name="Name1" - ) - - user_supervisor_sekolah = User.objects.create_user( - username="username2", - email="username2@email.com", - password="password", - first_name="User", - last_name="Name2" - ) - - user_supervisor_lembaga = User.objects.create_user( - username="username3", - email="username3@email.com", - password="password", - first_name="User", - last_name="Name3" - ) - - user_koordinator_kuliah = User.objects.create_user( - username="username4", - email="username4@email.com", - password="password", - first_name="User", - last_name="Name4" - ) - - user_administrator = User.objects.create_user( - username="username5", - email="username5@email.com", - password="password", - first_name="User", - last_name="Name5" - ) - - institusi = Institusi.objects.create( - nama="testing" - ) - - tema = Tema.objects.create( - nama="testing" - ) - - self.lembaga = Lembaga.objects.create( - nama="testing", - jenis_pelayanan="testing", - institusi=institusi, - tema=tema, - deskripsi_singkat="testing", - praktikum_ke=1, - beneficaries="test_beneficaries", - alamat="test_alamat" - ) - - self.lembaga.gambar = self.get_image_file() - self.lembaga.save() - - profile_supervisor_lembaga = SupervisorLembaga.objects.create( - user=user_supervisor_lembaga, - lembaga=self.lembaga, - jabatan="jabatan" - ) - - profile_supervisor_sekolah = SupervisorSekolah.objects.create( - user=user_supervisor_sekolah, - nip="nip" - ) - - periode = Periode.objects.create( - nama="periode" - ) - - profile_mahasiswa = Mahasiswa.objects.create( - user=user_mahasiswa, - npm="npm", - org_code="org_code", - faculty="faculty", - major="major", - program="program", - periode=periode, - supervisor_lembaga=profile_supervisor_lembaga, - supervisor_sekolah=profile_supervisor_sekolah - ) - - profile_koordinator_kuliah = KoordinatorKuliah.objects.create( - user=user_koordinator_kuliah, - nip="nip" - ) - - profile_administrator = Administrator.objects.create( - user=user_administrator, - nip="nip" - ) - - self.user_serializer = UserSerializer(user_mahasiswa) - self.mahasiswa_serializer = MahasiswaSerializer(profile_mahasiswa) - self.supervisor_lembaga_serializer = SupervisorLembagaSerializer(profile_supervisor_lembaga) - self.supervisor_sekolah_serializer = SupervisorSekolahSerializer(profile_supervisor_sekolah) - self.koordinator_kuliah_serializer = KoordinatorKuliahSerializer(profile_koordinator_kuliah) - self.administrator_serializer = AdministratorSerializer(profile_administrator) - self.lembaga_profile_serializer = LembagaProfileSerializer(profile_supervisor_lembaga) - self.user_registration_serializer = SupervisorLembagaRegistrationSerializer(user_supervisor_lembaga) - self.user_login_serializer = UserLoginSerializer(user_supervisor_lembaga) - - self.registration_data = { - "username": "dhafin", - "full_name": "Razaqa Dhafin", - "email": "dhafin@test.com", - "password": "1234567", - "profile": { - "lembaga": self.lembaga.id, - "jabatan": "Test Jabatan" - } - } - - self.registration_data_invalid_lembaga = { - "username": "dhafin", - "full_name": "Razaqa Dhafin", - "email": "dhafin@test.com", - "password": "1234567", - "profile": { - "lembaga": "fake", - "jabatan": "Test Jabatan" - } - } - - self.login_data_invalid = { - "username": "dhafin", - "password": "1234567" - } - - self.login_data_valid = { - "username": "username2", - "password": "password" - } - - def test_user_serializer_contains_valid_data(self): - data = self.user_serializer.data - self.assertEqual( - set(data), - set(['username', 'email', 'full_name']) - ) - - def test_profile_mahasiswa_serializer_contains_valid_data(self): - data = self.mahasiswa_serializer.data - self.assertEqual( - set(data), - set([ - 'user', - 'org_code', - 'npm', - 'faculty', - 'major', - 'program', - 'periode', - 'supervisor_lembaga', - 'supervisor_sekolah' - ]) - ) - - def test_profile_supervisor_sekolah_serializer_contains_valid_data(self): - data = self.supervisor_sekolah_serializer.data - self.assertEqual( - set(data), - set(['user', 'nip']) - ) - - def test_profile_koordinator_kuliah_serializer_contains_valid_data(self): - data = self.koordinator_kuliah_serializer.data - self.assertEqual( - set(data), - set(['user', 'nip']) - ) - - def test_profile_supervisor_lembaga_serializer_contains_valid_data(self): - data = self.supervisor_lembaga_serializer.data - self.assertEqual( - set(data), - set(['user', 'lembaga', 'jabatan']) - ) - - def test_profile_administrator_serializer_contains_valid_data(self): - data = self.administrator_serializer.data - self.assertEqual( - set(data), - set(['user', 'nip']) - ) - - def test_lembaga_profile_serializer_contains_valid_data(self): - data = self.lembaga_profile_serializer.data - self.assertEqual( - set(data), - set(['lembaga', 'jabatan']) - ) - - def test_user_registration_serializer_contains_valid_data(self): - data = self.user_registration_serializer.data - self.assertEqual( - set(data), - set(['username', 'full_name', 'email']) - ) - - def test_user_login_serializer_contains_valid_data(self): - data = self.user_login_serializer.data - self.assertEqual( - set(data), - set(['username']) - ) - - def test_user_login_serializer_validate_with_valid_data_return_user_data(self): - data = self.user_login_serializer - self.assertEqual( - data.validate(self.login_data_valid).get("username"), - "username2" - ) - - def test_user_login_serializer_validate_with_invalid_data(self): - data = self.user_login_serializer - with self.assertRaises(serializers.ValidationError): - data.validate(self.login_data_invalid).get("username") - - def test_user_register_serializer_validate_with_invalid_lembaga(self): - data = self.user_registration_serializer - with self.assertRaises(serializers.ValidationError): - data.create(self.registration_data_invalid_lembaga) - - -class SSOUITest(TestCase): - """Test SSO UI app.""" - - ATTRIBUTES_MAHASISWA = { - "nama": "Ice Bear", - "peran_user": "mahasiswa", - "npm": "1706123123", - "kd_org": "01.00.12.01" - } - - ATTRIBUTES_STAFF = { - "nama": "Ice Bear", - "peran_user": "staff", - "nip": "1706123123" - } - - ATTRIBUTES_OTHER = { - "nama": "Ice Bear", - "peran_user": "pegawai", - "nip": "1706123123" - } - - def setUp(self): - """Set up test.""" - self.user_mahasiswa = User.objects.create_user( - username='username1', - password='password', - email='username1@ui.ac.id', - first_name="Ice", - last_name="Bear" - ) - self.user_staff = User.objects.create_user( - username='username2', - password='password', - email='username2@ui.ac.id', - first_name="Ice", - last_name="Bear" - ) - self.user_other = User.objects.create_user( - username='username3', - password='password', - email='username3@ui.ac.id', - first_name="Ice", - last_name="Bear" - ) - - SupervisorSekolah.objects.create( - user=self.user_staff, - nip="1706123123" - ) - - Administrator.objects.create( - user=self.user_other, - nip="1706123123" - ) - - Mahasiswa.objects.create( - user=self.user_mahasiswa, - npm="1706123123", - org_code="01.00.12.01", - faculty="faculty", - major="major", - program="program", - periode=None, - supervisor_lembaga=None, - supervisor_sekolah=None - ) - - # def test_login_url_exists(self): - # """Test if login url exists and redirects to CAS server (response code 302).""" - # response = self.client.get(reverse('authentication:login-sivitas')) - # self.assertEqual(response.status_code, 302) - # self.assertTrue(response.url.startswith(settings.CAS_SERVER_URL)) - - # def test_profile_can_save_attributes_if_user_mahasiswa_not_yet_registered(self): - # """Test if Profile Mahasiswa model can save the attributes from CAS.""" - # cas_user_authenticated.send( - # sender=self, - # user=self.user_mahasiswa, - # username=self.user_mahasiswa.username, - # created=False, - # attributes=SSOUITest.ATTRIBUTES_MAHASISWA - # ) - # self.profile = Mahasiswa.objects.get(user=self.user_mahasiswa) - # self.assertJSONEqual( - # json.dumps({ - # "nama": self.user_mahasiswa.get_full_name(), - # "peran_user": "mahasiswa", - # "npm": self.profile.npm, - # "kd_org": self.profile.org_code - # }), - # SSOUITest.ATTRIBUTES_MAHASISWA - # ) - # self.assertJSONEqual( - # json.dumps({ - # "faculty": self.profile.faculty, - # "study_program": self.profile.major, - # "educational_program": self.profile.program - # }), - # ORG_CODE['id'][SSOUITest.ATTRIBUTES_MAHASISWA['kd_org']] - # ) - # self.assertEqual(self.user_mahasiswa.email, f"{self.user_mahasiswa.username}@ui.ac.id") - # self.assertEqual(self.user_mahasiswa.get_full_name(), "Ice Bear") - - def test_profile_can_save_attributes_if_user_staff_not_yet_registered(self): - """Test if Profile Staff model can save the attributes from CAS.""" - cas_user_authenticated.send( - sender=self, - user=self.user_staff, - username=self.user_staff.username, - created=False, - attributes=SSOUITest.ATTRIBUTES_STAFF - ) - self.profile = SupervisorSekolah.objects.get(user=self.user_staff) - self.assertJSONEqual( - json.dumps({ - "nama": self.user_staff.get_full_name(), - "peran_user": "staff", - "nip": self.profile.nip - }), - SSOUITest.ATTRIBUTES_STAFF - ) - self.assertEqual(self.user_staff.email, f"{self.user_staff.username}@ui.ac.id") - self.assertEqual(self.user_staff.get_full_name(), "Ice Bear") - - def test_profile_can_save_attributes_if_user_other_not_yet_registered(self): - """Test if Profile Other model can save the attributes from CAS.""" - cas_user_authenticated.send( - sender=self, - user=self.user_other, - username=self.user_other.username, - created=False, - attributes=SSOUITest.ATTRIBUTES_OTHER - ) - self.profile = Administrator.objects.get(user=self.user_other) - self.assertJSONEqual( - json.dumps({ - "nama": self.user_other.get_full_name(), - "peran_user": "pegawai", - "nip": self.profile.nip - }), - SSOUITest.ATTRIBUTES_OTHER - ) - self.assertEqual(self.user_other.email, f"{self.user_other.username}@ui.ac.id") - self.assertEqual(self.user_other.get_full_name(), "Ice Bear") - - -class AuthenticationJSONWebTokenTest(APITestCase): - - def get_image_file(self, name='test.png', ext='png', size=(50, 50), color=(256, 0, 0)): - '''Mock image''' - file_obj = BytesIO() - image = Image.new("RGBA", size=size, color=color) - image.save(file_obj, ext) - file_obj.seek(0) - return File(file_obj, name=name) - - def setUp(self): - self.JWT_PAYLOAD_HANDLER = api_settings.JWT_PAYLOAD_HANDLER - self.JWT_ENCODE_HANDLER = api_settings.JWT_ENCODE_HANDLER - ''' - self.registration_data = { - "username": "user1", - "full_name": "User Name1", - "email": "user1@test.com", - "password": "1234567", - "profile": { - "lembaga": 0, - "jabatan": "jabatan1" - } - } - - self.registration_data_unknown_lembaga = { - "username": "dhafin", - "full_name": "Razaqa Dhafin", - "email": "dhafin@test.com", - "password": "1234567", - "profile": { - "lembaga": "fake", - "jabatan": "Test Jabatan" - } - } - ''' - self.user_mahasiswa = User.objects.create_user( - username="username2", - email="username2@email.com", - password="password", - first_name="User", - last_name="Name2" - ) - - self.user_supervisor_sekolah = User.objects.create_user( - username="username3", - email="username3@email.com", - password="password", - first_name="User", - last_name="Name3" - ) - - self.user_supervisor_lembaga = User.objects.create_user( - username="username4", - email="username4@email.com", - password="password", - first_name="User", - last_name="Name4" - ) - - self.user_koordinator_kuliah = User.objects.create_user( - username="username5", - email="username5@email.com", - password="password", - first_name="User", - last_name="Name5" - ) - - self.user_administrator = User.objects.create_user( - username="username6", - email="username6@email.com", - password="password", - first_name="User", - last_name="Name6" - ) - - institusi = Institusi.objects.create( - nama="testing" - ) - - tema = Tema.objects.create( - nama="testing" - ) - - self.lembaga = Lembaga.objects.create( - nama="testing", - jenis_pelayanan="testing", - institusi=institusi, - tema=tema, - deskripsi_singkat="testing", - praktikum_ke=1, - beneficaries="test_beneficaries", - alamat="test_alamat" - ) - - self.lembaga.gambar = self.get_image_file() - self.lembaga.save() - - supervisor_lembaga = SupervisorLembaga.objects.create( - user=self.user_supervisor_lembaga, - lembaga=self.lembaga, - jabatan="jabatan" - ) - - supervisor_sekolah = SupervisorSekolah.objects.create( - user=self.user_supervisor_sekolah, - nip="nip" - ) - - KoordinatorKuliah.objects.create( - user=self.user_koordinator_kuliah, - nip="nip" - ) - - Administrator.objects.create( - user=self.user_administrator, - nip="nip" - ) - - periode = Periode.objects.create( - nama="periode" - ) - - Mahasiswa.objects.create( - user=self.user_mahasiswa, - npm="npm", - org_code="org_code", - faculty="faculty", - major="major", - program="program", - periode=periode, - supervisor_lembaga=supervisor_lembaga, - supervisor_sekolah=supervisor_sekolah - ) - - self.registration_data = { - "username": "usernamevalid1", - "full_name": "User Name1", - "email": "usernamevalid1@test.com", - "password": "123456789", - "profile": { - "lembaga": "testing", - "jabatan": "jabatan1" - } - } - - self.registration_data_unknown_lembaga = { - "username": "dhafin", - "full_name": "Razaqa Dhafin", - "email": "dhafin@test.com", - "password": "1234567", - "profile": { - "lembaga": "fake", - "jabatan": "Test Jabatan" - } - } - - self.login_data_mahasiswa_valid = { - "username": "username2", - "password": "password" - } - - self.login_data_supervisor_sekolah_valid = { - "username": "username3", - "password": "password" - } - - self.login_data_supervisor_lembaga_valid = { - "username": "username4", - "password": "password" - } - - self.login_data_supervisor_lembaga_invalid_wrong_password = { - "username": "username4", - "password": "wrong" - } - - self.login_data_koordinator_kuliah_valid = { - "username": "username5", - "password": "password" - } - - self.login_data_administrator_valid = { - "username": "username6", - "password": "password" - } - - self.login_data_invalid = { - "username": "username10", - "password": "password" - } - - def test_can_not_register_user_if_lembaga_does_not_exist(self): - response = self.client.post(reverse('authentication:register-supervisor-lembaga'), self.registration_data_unknown_lembaga) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - - def test_can_not_register_same_user_twice(self): - self.client.post(reverse('authentication:register-supervisor-lembaga'), self.registration_data) - response = self.client.post(reverse('authentication:register-supervisor-lembaga'), self.registration_data) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - - # Mahasiswa - - def test_can_see_profile_mahasiswa_after_login(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_mahasiswa) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION='Bearer ' + token) - response = self.client.get(reverse('authentication:profile-mahasiswa'), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_can_not_see_profile_mahasiswa_before_login(self): - self.client.credentials(HTTP_AUTHORIZATION='Bearer ' + 'falsetoken') - response = self.client.get(reverse('authentication:profile-mahasiswa'), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) - - def test_can_not_see_profile_other_role_in_login_mahasiswa(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_administrator) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION='Bearer ' + token) - response = self.client.get(reverse('authentication:profile-mahasiswa'), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_invalid_manual_sso_login_for_mahasiswa_without_role(self): - response = self.client.post(reverse('authentication:login-sso'), {"username": "test", "password": "test"}) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - - def test_invalid_manual_sso_login_for_mahasiswa_with_invalid_role(self): - response = self.client.post(reverse('authentication:login-sso'), {"username": "test", "password": "test", "role": "Supervisor Sekolah"}) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - - def test_invalid_manual_sso_login_for_mahasiswa_with_valid_role(self): - response = self.client.post(reverse('authentication:login-sso'), {"username": "test", "password": "test", "role": "Mahasiswa"}) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - - # Supervisor Sekolah - - def test_supervisor_sekolah_can_login_in_web_login_not_sso(self): - response = self.client.post(reverse('authentication:login-supervisor-sekolah'), self.login_data_supervisor_lembaga_valid) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_can_see_profile_supervisor_sekolah_after_login(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_supervisor_sekolah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION='Bearer ' + token) - response = self.client.get(reverse('authentication:profile-supervisor-sekolah'), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_can_not_see_profile_supervisor_sekolah_before_login(self): - self.client.credentials(HTTP_AUTHORIZATION='Bearer ' + 'falsetoken') - response = self.client.get(reverse('authentication:profile-supervisor-sekolah'), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) - - def test_can_not_see_profile_other_role_in_login_supervisor_sekolah(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_mahasiswa) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION='Bearer ' + token) - response = self.client.get(reverse('authentication:profile-supervisor-sekolah'), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_invalid_manual_sso_login_for_supervisor_sekolah_without_role(self): - response = self.client.post(reverse('authentication:login-sso'), {"username": "test", "password": "test"}) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - - def test_invalid_manual_sso_login_for_supervisor_sekolah_with_valid_role(self): - response = self.client.post(reverse('authentication:login-sso'), {"username": "test", "password": "test", "role": "Supervisor Sekolah"}) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - - def test_invalid_manual_sso_login_for_supervisor_sekolah_with_invalid_role(self): - response = self.client.post(reverse('authentication:login-sso'), {"username": "test", "password": "test", "role": "Mahasiswa"}) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - - # Supervisor Lembaga - - def test_can_login_user_supervisor_lembaga_after_register(self): - response = self.client.post(reverse('authentication:login-supervisor-lembaga'), self.login_data_supervisor_lembaga_valid) - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(type(response.data['token']), str) - - def test_can_not_login_user_supervisor_lembaga_after_register_if_wrong_password(self): - response = self.client.post(reverse('authentication:login-supervisor-lembaga'), self.login_data_supervisor_lembaga_invalid_wrong_password) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - - def test_can_not_login_user_supervisor_lembaga_before_register(self): - response = self.client.post(reverse('authentication:login-supervisor-lembaga'), self.login_data_invalid) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - - def test_can_see_profile_supervisor_lembaga_after_login(self): - response_login = self.client.post(reverse('authentication:login-supervisor-lembaga'), self.login_data_supervisor_lembaga_valid) - token = response_login.data['token'] - - self.client.credentials(HTTP_AUTHORIZATION='Bearer ' + token) - response = self.client.get(reverse('authentication:profile-supervisor-lembaga'), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_can_not_see_profile_supervisor_lembaga_before_login(self): - self.client.credentials(HTTP_AUTHORIZATION='Bearer ' + 'falsetoken') - response = self.client.get(reverse('authentication:profile-supervisor-lembaga'), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) - - def test_can_not_see_profile_other_role_in_login_supervisor_lembaga(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_supervisor_sekolah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION='Bearer ' + token) - response = self.client.get(reverse('authentication:profile-supervisor-lembaga'), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_cannot_login_user_supervisor_lembaga_in_administrator_auth_api(self): - response = self.client.post(reverse('authentication:login-administrator'), self.login_data_supervisor_lembaga_valid) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - - # Koordinator Kuliah - - def test_koordinator_kuliah_can_login_in_web_login_not_sso(self): - response = self.client.post(reverse('authentication:login-koordinator-kuliah'), self.login_data_koordinator_kuliah_valid) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_can_see_profile_koordinator_kuliah_after_login(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_koordinator_kuliah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION='Bearer ' + token) - response = self.client.get(reverse('authentication:profile-koordinator-kuliah'), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_can_not_see_profile_koordinator_kuliah_before_login(self): - self.client.credentials(HTTP_AUTHORIZATION='Bearer ' + 'falsetoken') - response = self.client.get(reverse('authentication:profile-koordinator-kuliah'), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) - - def test_can_not_see_profile_other_role_in_login_koordinator_kuliah(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_supervisor_lembaga) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION='Bearer ' + token) - response = self.client.get(reverse('authentication:profile-koordinator-kuliah'), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_invalid_manual_sso_login_for_koordinator_kuliah_without_role(self): - response = self.client.post(reverse('authentication:login-sso'), {"username": "test", "password": "test"}) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - - def test_invalid_manual_sso_login_for_koordinator_kuliah_with_invalid_role(self): - response = self.client.post(reverse('authentication:login-sso'), {"username": "test", "password": "test", "role": "Supervisor Sekolah"}) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - - def test_invalid_manual_sso_login_for_koordinator_kuliah_with_valid_role(self): - response = self.client.post(reverse('authentication:login-sso'), {"username": "test", "password": "test", "role": "Koordinator Kuliah"}) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - - # Administrator - - def test_can_see_profile_administrator_after_login(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_administrator) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION='Bearer ' + token) - response = self.client.get(reverse('authentication:profile-administrator'), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_can_not_see_profile_administrator_before_login(self): - self.client.credentials(HTTP_AUTHORIZATION='Bearer ' + 'falsetoken') - response = self.client.get(reverse('authentication:profile-administrator'), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) - - def test_can_not_see_profile_other_role_in_login_administrator(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_koordinator_kuliah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION='Bearer ' + token) - response = self.client.get(reverse('authentication:profile-administrator'), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_can_login_user_administrator_in_administrator_auth_api(self): - response = self.client.post(reverse('authentication:login-administrator'), self.login_data_administrator_valid) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - # User - - def test_can_see_profile_user_after_login(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_administrator) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION='Bearer ' + token) - response = self.client.get(reverse('authentication:profile-user'), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_can_not_see_profile_user_before_login(self): - self.client.credentials(HTTP_AUTHORIZATION='Bearer ' + 'falsetoken') - response = self.client.get(reverse('authentication:profile-user'), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) diff --git a/new/authentication/urls.py b/new/authentication/urls.py deleted file mode 100644 index c2237e0..0000000 --- a/new/authentication/urls.py +++ /dev/null @@ -1,24 +0,0 @@ -from . import views -from .cas_wrapper import APILoginView, APILogoutView -from django.urls import include, path - -app_name = 'authentication' -urlpatterns = [ - path('login/sivitas/', APILoginView.as_view(), name='login-sivitas'), - # path('logout/', APILogoutView.as_view(), name='logout'), - path('logout/', views.ManualLogoutView.as_view(), name='logout'), - path('register/supervisor-lembaga/', views.UserRegistrationView.as_view(), name='register-supervisor-lembaga'), - path('login/supervisor-lembaga/', views.UserLoginView.as_view(), name='login-supervisor-lembaga'), - path('register/supervisor-lembaga/', views.UserRegistrationView.as_view(), name='register-supervisor-lembaga'), - path('login/administrator/', views.AdministratorLoginView.as_view(), name='login-administrator'), - path('profile/mahasiswa', views.UserProfileMahasiswaView.as_view(), name='profile-mahasiswa'), - path('login/supervisor-sekolah/', views.UserLoginView.as_view(), name='login-supervisor-sekolah'), - path('profile/supervisor-sekolah', views.UserProfileSupervisorSekolahView.as_view(), name='profile-supervisor-sekolah'), - path('profile/supervisor-lembaga', views.UserProfileSupervisorLembagaView.as_view(), name='profile-supervisor-lembaga'), - path('login/koordinator-kuliah/', views.UserLoginView.as_view(), name='login-koordinator-kuliah'), - path('profile/koordinator-kuliah', views.UserProfileKoordinatorKuliahView.as_view(), name='profile-koordinator-kuliah'), - path('profile/administrator', views.UserProfileAdministratorView.as_view(), name='profile-administrator'), - path('profile/user', views.UserProfileUserView.as_view(), name='profile-user'), - path('periode/list', views.PeriodeListView.as_view(), name='periode-list'), - path('login/sso/', views.ManualSSOLoginView.as_view(), name='login-sso'), -] diff --git a/new/authentication/views.py b/new/authentication/views.py deleted file mode 100644 index a53a653..0000000 --- a/new/authentication/views.py +++ /dev/null @@ -1,304 +0,0 @@ -from .models import ( - User, - Mahasiswa, - SupervisorLembaga, - SupervisorSekolah, - KoordinatorKuliah, - Administrator, - Periode -) -from .serializers import ( - MahasiswaSerializer, - KoordinatorKuliahSerializer, - SupervisorLembagaSerializer, - SupervisorSekolahSerializer, - AdministratorSerializer, - SupervisorLembagaRegistrationSerializer, - UserLoginSerializer, - UserSerializer, - PeriodeSerializer, - ManualSSOLoginSerializer, - AdministratorLoginSerializer -) -from .role import Role -from datetime import datetime -from django.contrib.auth.decorators import login_required -from django.http import JsonResponse, HttpResponseRedirect -from django.contrib.auth.models import update_last_login -from django.shortcuts import render -from rest_framework import status -from rest_framework.decorators import api_view -from rest_framework.request import Request -from rest_framework.response import Response -from rest_framework.test import APIRequestFactory -from rest_framework.generics import CreateAPIView -from rest_framework.generics import RetrieveAPIView -from rest_framework.permissions import AllowAny -from rest_framework_jwt.authentication import JSONWebTokenAuthentication -from rest_framework.permissions import IsAuthenticated - -factory = APIRequestFactory() -request = factory.get('/') - -serializer_context = { - 'request': Request(request), -} - -response_field = ['success', 'status_code', 'message'] -profile_success_message = 'User profile fetched successfully' - -STR_CANNOT_FIND_USER_SUPERVISOR_SEKOLAH = 'Can not find user data for Supervisor Sekolah' - - -class UserRegistrationView(CreateAPIView): # pragma: no cover - - permission_classes = (AllowAny,) - serializer_class = SupervisorLembagaRegistrationSerializer - - def post(self, request): - serializer = self.serializer_class(data=request.data) - serializer.is_valid(raise_exception=True) - serializer.save() - status_code = status.HTTP_201_CREATED - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'User registered successfully', - } - - return Response(response, status=status.HTTP_201_CREATED) - - -class UserLoginView(RetrieveAPIView): # pragma: no cover - - permission_classes = (AllowAny,) - serializer_class = UserLoginSerializer - - def post(self, request): - serializer = self.serializer_class(data=request.data) - serializer.is_valid(raise_exception=True) - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'User logged in successfully', - 'token': serializer.data['token'], - } - - return Response(response, status=status.HTTP_200_OK) - - -class ManualSSOLoginView(RetrieveAPIView): - permission_classes = (AllowAny,) - serializer_class = ManualSSOLoginSerializer - - def post(self, request): - serializer = self.serializer_class(data=request.data) - serializer.is_valid(raise_exception=True) - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'User logged in successfully', - 'token': serializer.data['token'], - 'role': serializer.data['role'] - } - - return Response(response, status=status.HTTP_200_OK) - - -class ManualLogoutView(RetrieveAPIView): - permission_classes = (AllowAny,) - - def get(self, request): - update_last_login(datetime.now(), request.user) - return HttpResponseRedirect("http://ppl-berkah.herokuapp.com/") - - -class UserProfileMahasiswaView(RetrieveAPIView): # pragma: no cover - - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def get(self, request): - try: - profile = Mahasiswa.objects.get(user=request.user) - status_code = status.HTTP_200_OK - serializer = MahasiswaSerializer(profile, context={'request': request}) - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: profile_success_message, - 'data': serializer.data - } - except Mahasiswa.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Can not find user data for Mahasiswa' - } - return Response(response, status=status_code) - - -class AdministratorLoginView(RetrieveAPIView): # pragma: no cover - - permission_classes = (AllowAny,) - serializer_class = AdministratorLoginSerializer - - def post(self, request): - serializer = self.serializer_class(data=request.data) - serializer.is_valid(raise_exception=True) - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'User logged in successfully', - 'token': serializer.data['token'], - } - - return Response(response, status=status.HTTP_200_OK) - - -class UserProfileSupervisorSekolahView(RetrieveAPIView): # pragma: no cover - - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def get(self, request): - try: - profile = SupervisorSekolah.objects.get(user=request.user) - status_code = status.HTTP_200_OK - serializer = SupervisorSekolahSerializer(profile, context={'request': request}) - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: profile_success_message, - 'data': serializer.data - } - except SupervisorSekolah.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: STR_CANNOT_FIND_USER_SUPERVISOR_SEKOLAH - } - return Response(response, status=status_code) - - -class UserProfileSupervisorLembagaView(RetrieveAPIView): # pragma: no cover - - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def get(self, request): - try: - profile = SupervisorLembaga.objects.get(user=request.user) - status_code = status.HTTP_200_OK - serializer = SupervisorLembagaSerializer(profile, context={'request': request}) - response = { - response_field[0]: 'true', - response_field[1]: status_code, - response_field[2]: profile_success_message, - 'data': serializer.data - } - except SupervisorLembaga.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Can not find user data for Supervisor Lembaga' - } - return Response(response, status=status_code) - - -class UserProfileKoordinatorKuliahView(RetrieveAPIView): # pragma: no cover - - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def get(self, request): - try: - profile = KoordinatorKuliah.objects.get(user=request.user) - status_code = status.HTTP_200_OK - serializer = KoordinatorKuliahSerializer(profile, context={'request': request}) - response = { - response_field[0]: 'true', - response_field[1]: status_code, - response_field[2]: profile_success_message, - 'data': serializer.data - } - except KoordinatorKuliah.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Can not find user data for Koordinator Kuliah' - } - return Response(response, status=status_code) - - -class UserProfileAdministratorView(RetrieveAPIView): # pragma: no cover - - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def get(self, request): - try: - user = User.objects.get(username=request.user.username) - profile = Administrator.objects.get(user=user) - status_code = status.HTTP_200_OK - serializer = AdministratorSerializer(profile, context={'request': request}) - response = { - response_field[0]: 'true', - response_field[1]: status_code, - response_field[2]: profile_success_message, - 'data': serializer.data - } - except Administrator.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Can not find user data for Administrator', - } - return Response(response, status=status_code) - - -class UserProfileUserView(RetrieveAPIView): # pragma: no cover - - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def get(self, request): - user_data = User.objects.get(email=request.user.email) - status_code = status.HTTP_200_OK - serializer = UserSerializer(user_data, context={'request': request}) - response = { - response_field[0]: 'true', - response_field[1]: status_code, - response_field[2]: profile_success_message, - 'data': serializer.data - } - return Response(response, status=status.HTTP_200_OK) - - -class PeriodeListView(RetrieveAPIView): - """ - Provides a get method handler. - """ - permission_classes = (AllowAny, ) - serializer_class = PeriodeSerializer - - def get(self, request): - data = Periode.objects.all() - serializer = PeriodeSerializer(data, context={'request': request}, many=True) - - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'true', - response_field[1]: status_code, - response_field[2]: "Success fetched data", - 'data': serializer.data - } - return Response(response, status=status.HTTP_200_OK) diff --git a/new/core/__init__.py b/new/core/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/new/core/admin.py b/new/core/admin.py deleted file mode 100644 index 8c38f3f..0000000 --- a/new/core/admin.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.contrib import admin - -# Register your models here. diff --git a/new/core/apps.py b/new/core/apps.py deleted file mode 100644 index 26f78a8..0000000 --- a/new/core/apps.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.apps import AppConfig - - -class CoreConfig(AppConfig): - name = 'core' diff --git a/new/core/errors/views.py b/new/core/errors/views.py deleted file mode 100644 index ae99763..0000000 --- a/new/core/errors/views.py +++ /dev/null @@ -1,22 +0,0 @@ -from django.shortcuts import render -from django.http import HttpResponseRedirect -from sip.settings.staging import SUCCESS_SSO_AUTH_REDIRECT as DOMAIN - -''' -Custom Handler Views For Django Redirect to Frontend -''' - - -def custom_unauthorized_view(request, exception=None): - # HTTP 401 Unauthorized - return HttpResponseRedirect(DOMAIN + 'not-login/') - - -def custom_permission_denied_view(request, exception=None): - # HTTP 403 Forbidden - return HttpResponseRedirect(DOMAIN + 'not-login/') - - -def custom_not_found_view(request, exception=None): - # HTTP 404 Not Found - return HttpResponseRedirect(DOMAIN) diff --git a/new/core/migrations/__init__.py b/new/core/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/new/core/models.py b/new/core/models.py deleted file mode 100644 index 71a8362..0000000 --- a/new/core/models.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.db import models - -# Create your models here. diff --git a/new/core/tests.py b/new/core/tests.py deleted file mode 100644 index 7ce503c..0000000 --- a/new/core/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/new/core/views.py b/new/core/views.py deleted file mode 100644 index c24c96c..0000000 --- a/new/core/views.py +++ /dev/null @@ -1,16 +0,0 @@ -from django.shortcuts import render -from django.http import HttpResponseRedirect - -# Create your views here. - -from django.http import HttpResponse -from django.views.decorators.http import require_GET - - -@require_GET -def robots_txt(request): - lines = [ - "User-Agent: *", - "Disallow: /media/*", - ] - return HttpResponse("\n".join(lines), content_type="text/plain") diff --git a/new/db.json b/new/db.json deleted file mode 100644 index 7108964..0000000 --- a/new/db.json +++ /dev/null @@ -1 +0,0 @@ -[{"model": "lembaga.institusi", "pk": 1, "fields": {"nama": "Government Organisation"}}, {"model": "lembaga.institusi", "pk": 2, "fields": {"nama": "Non Government Organisation"}}, {"model": "lembaga.institusi", "pk": 3, "fields": {"nama": "Komunitas"}}, {"model": "lembaga.institusi", "pk": 4, "fields": {"nama": "Perusahaan"}}, {"model": "lembaga.institusi", "pk": 5, "fields": {"nama": "Pendidikan"}}, {"model": "lembaga.tema", "pk": 1, "fields": {"nama": "Lingkungan"}}, {"model": "lembaga.tema", "pk": 2, "fields": {"nama": "HRD"}}, {"model": "lembaga.tema", "pk": 3, "fields": {"nama": "CSR "}}, {"model": "lembaga.tema", "pk": 4, "fields": {"nama": "Anak dan Remaja"}}, {"model": "lembaga.tema", "pk": 5, "fields": {"nama": "Lansia"}}, {"model": "lembaga.tema", "pk": 6, "fields": {"nama": "Disabilitas"}}, {"model": "lembaga.tema", "pk": 7, "fields": {"nama": "Gender/Perempuan"}}, {"model": "lembaga.tema", "pk": 8, "fields": {"nama": "Pemberdayaan Masyarakat"}}, {"model": "lembaga.tema", "pk": 9, "fields": {"nama": "Penanganan Kemiskinan"}}, {"model": "lembaga.tema", "pk": 10, "fields": {"nama": "Kesehatan"}}, {"model": "lembaga.tema", "pk": 11, "fields": {"nama": "Edukasi"}}, {"model": "lembaga.lingkupkerja", "pk": 6, "fields": {"nama": "Komputer"}}, {"model": "lembaga.lingkupkerja", "pk": 7, "fields": {"nama": "Edukasi"}}, {"model": "lembaga.lingkupkerja", "pk": 8, "fields": {"nama": "Bisnis"}}, {"model": "lembaga.lingkupkerja", "pk": 9, "fields": {"nama": "Jasa"}}, {"model": "lembaga.lembaga", "pk": 6, "fields": {"nama": "Siprak Institution", "jenis_pelayanan": "Edukasi", "institusi": 5, "tema": 8, "deskripsi_singkat": "Siprak institution adalah institusi yang mengedepankan selesainya projek PPL.", "beneficaries": "Pengguna", "alamat": "Jln. Margonda Raya", "praktikum_ke": 1, "lingkup_kerja": [7]}}, {"model": "lembaga.lembaga", "pk": 7, "fields": {"nama": "Bawa Paket", "jenis_pelayanan": "Jasa pengantaran barang", "institusi": 4, "tema": 8, "deskripsi_singkat": "Bawa Pakat adalah jasa pengiriman barang yang handal. Fransiscus Emmanuel Bunaren adalah Co-Founder dan CEO dari Bawa Paket.", "beneficaries": "Pengguna jasa bawa paket", "alamat": "Bekasi, Jawa Barat", "praktikum_ke": 2, "lingkup_kerja": [9]}}, {"model": "lembaga.lembaga", "pk": 8, "fields": {"nama": "Just For Challenge", "jenis_pelayanan": "Edukasi melalui challenge", "institusi": 3, "tema": 8, "deskripsi_singkat": "Just For Challenge adalah challenge XSS secara terbuka dan gratis. Challenge XSS di Just For Challenge adalah kasus nyata / real-world.", "beneficaries": "Pengguna yang ingin mempelajari XSS", "alamat": "Bekasi, Jawa Barat", "praktikum_ke": 1, "lingkup_kerja": [6]}}, {"model": "lembaga.lembaga", "pk": 9, "fields": {"nama": "Go Get Gold Indonesia", "jenis_pelayanan": "Bisnis", "institusi": 4, "tema": 8, "deskripsi_singkat": "Go Get Gold Indonesia adalah start-up yang dibuat oleh mahasiswa Universitas Indonesia.", "beneficaries": "Pengguna Go Get Gold Indonesia", "alamat": "Jakarta Timur", "praktikum_ke": 2, "lingkup_kerja": [8]}}, {"model": "lembaga.lembaga", "pk": 10, "fields": {"nama": "Fakultas Ilmu Komputer UI", "jenis_pelayanan": "Edukasi", "institusi": 5, "tema": 8, "deskripsi_singkat": "Fakultas Ilmu Komputer UI adalah fakultas yang mempelajari hal-hal tentang bagaimana menyelesaikan suatu permasalahan secara komputasi. Fakultas Ilmu Komputer UI berada di Kampu UI Depok.", "beneficaries": "Mahasiswa Fasilkom UI", "alamat": "Jln. Raya Margonda, Kampus UI Depok", "praktikum_ke": 2, "lingkup_kerja": [7]}}, {"model": "lembaga.lembaga", "pk": 11, "fields": {"nama": "Yayasan Freons", "jenis_pelayanan": "Edukasi", "institusi": 3, "tema": 4, "deskripsi_singkat": "Yayasan Freons adalah yayasan yang di bentuk oleh komunitas Freons dimana anggota-anggota komunitas Freons sangat berbakat dalam dunia komputer.", "beneficaries": "Masyarakat", "alamat": "Depok", "praktikum_ke": 1, "lingkup_kerja": [7]}}, {"model": "lembaga.lembaga", "pk": 16, "fields": {"nama": "Yayasan Mengoding", "jenis_pelayanan": "Perusahaan", "institusi": 2, "tema": 11, "deskripsi_singkat": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. In posuere neque id posuere euismod.", "beneficaries": "Developers", "alamat": "Jl. Bambu Wulung No.7, RT.7/RW.5, Bambu Apus, Kec. Cipayung", "praktikum_ke": 1, "lingkup_kerja": [6, 7]}}, {"model": "laporan_praktikum.praktikum", "pk": 1, "fields": {"jenis_praktikum": "Praktikum 1"}}, {"model": "laporan_praktikum.praktikum", "pk": 2, "fields": {"jenis_praktikum": "Praktikum 2"}}, {"model": "laporan_praktikum.mahasiswapraktikum", "pk": 25, "fields": {"mahasiswa": 28, "list_praktikum": "Praktikum 2", "status": true}}, {"model": "laporan_praktikum.mahasiswapraktikum", "pk": 26, "fields": {"mahasiswa": 22, "list_praktikum": "Praktikum 1", "status": true}}, {"model": "laporan_praktikum.mahasiswapraktikum", "pk": 27, "fields": {"mahasiswa": 25, "list_praktikum": "Praktikum 1", "status": true}}, {"model": "laporan_praktikum.mahasiswapraktikum", "pk": 28, "fields": {"mahasiswa": 26, "list_praktikum": "Praktikum 2", "status": true}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 65, "fields": {"nama_laporan": "laporan praktikum fransiscus.emmanuel", "waktu_deadline": "2020-11-25T16:23:07", "waktu_submisi": "2020-11-24T16:23:08", "waktu_nilai_supv_sekolah": "2020-12-04T03:47:31", "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": true, "skor_laporan_sekolah": 98, "skor_laporan_lembaga": -1, "mahasiswa": 28, "jenis_praktikum": "Praktikum 2", "link_submisi": "https://duckduckgo.com"}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 68, "fields": {"nama_laporan": "laporan mingguan figo", "waktu_deadline": "2020-12-07T14:33:39", "waktu_submisi": "2020-12-07T21:56:00", "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": true, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 25, "jenis_praktikum": "Praktikum 1", "link_submisi": "http://www.google.com"}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 70, "fields": {"nama_laporan": "laporan mingguan 2 harold", "waktu_deadline": "2020-12-05T15:47:31", "waktu_submisi": "2020-12-04T23:06:00", "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": true, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 22, "jenis_praktikum": "Praktikum 1", "link_submisi": "javascript:document.write(\"\")"}}, {"model": "laporan_praktikum.laporanakhirpraktikum", "pk": 34, "fields": {"nama_laporan": "laporan akhir edina", "waktu_deadline": "2020-12-07T14:20:41", "waktu_submisi": "2020-12-06T14:20:42", "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": true, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 26, "jenis_praktikum": "Praktikum 2", "lembaga": 8, "periode_praktikum": "test", "laporan_akhir": "ppl.docx", "profil_lembaga": "ppl_RkIEk0K.docx", "umpan_balik": ""}}, {"model": "laporan_praktikum.laporanborangpraktikum", "pk": 25, "fields": {"nama_laporan": "laporan borang fransiscus.emmanuel", "waktu_deadline": "2020-11-25T16:19:19", "waktu_submisi": "2020-11-24T16:19:21", "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": true, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 28, "jenis_praktikum": "Praktikum 2", "borang_supv_sekolah": "Ini_cumin_buat_percobaan_ppl_oDVE20I.pdf", "borang_supv_lembaga": "Ini_cumin_buat_percobaan_ppl_Q4R9Y8N.pdf", "borang_supv_perkuliahan": "Ini_cumin_buat_percobaan_ppl_ze3ImM7.pdf"}}, {"model": "laporan_praktikum.laporanborangpraktikum", "pk": 28, "fields": {"nama_laporan": "laporan harold", "waktu_deadline": "2020-11-30T14:48:19", "waktu_submisi": "2020-11-30T23:13:00", "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": true, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 22, "jenis_praktikum": "Praktikum 1", "borang_supv_sekolah": "ppl_kXWC2BW.pdf", "borang_supv_lembaga": "ppl.docx", "borang_supv_perkuliahan": "tutorial.erl"}}, {"model": "laporan_praktikum.laporanborangpraktikum", "pk": 29, "fields": {"nama_laporan": "laporan borang figo", "waktu_deadline": "2020-12-02T13:42:58", "waktu_submisi": "2020-12-07T21:45:00", "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": true, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 25, "jenis_praktikum": "Praktikum 1", "borang_supv_sekolah": "[object Object]", "borang_supv_lembaga": "[object Object]", "borang_supv_perkuliahan": "[object Object]"}}, {"model": "laporan_praktikum.templateborangpenilaianpraktikum", "pk": 1, "fields": {"supervisor_sekolah": 29, "t_borang_supv_sekolah": "budhidharma/t_borang_supv_sekolah/Ini_cumin_buat_percobaan_ppl.pdf", "t_borang_supv_lembaga": "budhidharma/t_borang_supv_sekolah/Ini_cumin_buat_percobaan_ppl_LcHoRmq.pdf", "t_borang_supv_perkuliahan": "budhidharma/t_borang_supv_sekolah/Ini_cumin_buat_percobaan_ppl_LbINhnu.pdf"}}, {"model": "laporan_praktikum.templateborangpenilaianpraktikum", "pk": 2, "fields": {"supervisor_sekolah": 25, "t_borang_supv_sekolah": "figo.muhammad/t_borang_supv_sekolah/Ini_cumin_buat_percobaan_ppl.pdf", "t_borang_supv_lembaga": "figo.muhammad/t_borang_supv_sekolah/Ini_cumin_buat_percobaan_ppl_t1kL9AS.pdf", "t_borang_supv_perkuliahan": "figo.muhammad/t_borang_supv_sekolah/Ini_cumin_buat_percobaan_ppl_gBq4285.pdf"}}, {"model": "laporan_praktikum.templateborangpenilaianpraktikum", "pk": 3, "fields": {"supervisor_sekolah": 22, "t_borang_supv_sekolah": "harold.hotma/t_borang_supv_sekolah/tutorial.erl", "t_borang_supv_lembaga": "harold.hotma/t_borang_supv_sekolah/tutorial.beam", "t_borang_supv_perkuliahan": "harold.hotma/t_borang_supv_sekolah/ppl.docx"}}, {"model": "authentication.supervisorsekolah", "pk": 1, "fields": {"user": 2, "nip": "165587668158"}}, {"model": "authentication.supervisorsekolah", "pk": 2, "fields": {"user": 11, "nip": "171095499117"}}, {"model": "authentication.supervisorsekolah", "pk": 3, "fields": {"user": 20, "nip": "112233445566"}}, {"model": "authentication.supervisorsekolah", "pk": 5, "fields": {"user": 29, "nip": "102030405060"}}, {"model": "authentication.supervisorsekolah", "pk": 6, "fields": {"user": 30, "nip": "010203040506"}}, {"model": "authentication.supervisorsekolah", "pk": 7, "fields": {"user": 25, "nip": "1111100000"}}, {"model": "authentication.supervisorsekolah", "pk": 8, "fields": {"user": 22, "nip": "112233445566"}}, {"model": "authentication.supervisorlembaga", "pk": 4, "fields": {"user": 27, "lembaga": 8, "jabatan": "CEO"}}, {"model": "authentication.administrator", "pk": 1, "fields": {"user": 5, "nip": "112021023739"}}, {"model": "authentication.administrator", "pk": 2, "fields": {"user": 14, "nip": "134984760197"}}, {"model": "authentication.periode", "pk": 1, "fields": {"nama": "2018/2019 - Gasal"}}, {"model": "authentication.periode", "pk": 2, "fields": {"nama": "2018/2019 - Genap"}}, {"model": "authentication.periode", "pk": 3, "fields": {"nama": "2019/2020 - Gasal"}}, {"model": "authentication.periode", "pk": 4, "fields": {"nama": "2020/2021 - Genap"}}, {"model": "authentication.periode", "pk": 5, "fields": {"nama": "2020/2021 - Gasal"}}, {"model": "authentication.mahasiswa", "pk": 19, "fields": {"user": 22, "org_code": "", "npm": "1806241085", "faculty": "Ilmu Komputer", "major": "Ilmu Komputer", "program": "S1 Kls Internasional", "periode": 1, "supervisor_sekolah": 22, "supervisor_lembaga": 27}}, {"model": "authentication.mahasiswa", "pk": 20, "fields": {"user": 28, "org_code": "Test", "npm": "1806253844", "faculty": "Fasilkom", "major": "CS", "program": "Test", "periode": 1, "supervisor_sekolah": 25, "supervisor_lembaga": 27}}, {"model": "authentication.mahasiswa", "pk": 21, "fields": {"user": 25, "org_code": "test", "npm": "12341234", "faculty": "a", "major": "a", "program": "a", "periode": 5, "supervisor_sekolah": 25, "supervisor_lembaga": 27}}, {"model": "authentication.mahasiswa", "pk": 22, "fields": {"user": 26, "org_code": "test", "npm": "12345", "faculty": "test", "major": "t", "program": "t", "periode": 4, "supervisor_sekolah": 22, "supervisor_lembaga": 27}}, {"model": "authentication.koordinatorkuliah", "pk": 1, "fields": {"user": 4, "nip": "195595154900"}}, {"model": "authentication.koordinatorkuliah", "pk": 2, "fields": {"user": 13, "nip": "121526197823"}}, {"model": "authentication.koordinatorkuliah", "pk": 5, "fields": {"user": 30, "nip": "010203040506"}}, {"model": "authentication.koordinatorkuliah", "pk": 7, "fields": {"user": 20, "nip": "1029384756"}}, {"model": "authentication.koordinatorkuliah", "pk": 8, "fields": {"user": 31, "nip": "123456123456"}}, {"model": "authentication.koordinatorkuliah", "pk": 9, "fields": {"user": 27, "nip": "5647382910"}}, {"model": "authentication.koordinatorkuliah", "pk": 10, "fields": {"user": 28, "nip": "1806173506"}}, {"model": "authentication.koordinatorkuliah", "pk": 11, "fields": {"user": 26, "nip": "180180180180"}}, {"model": "authentication.koordinatorkuliah", "pk": 12, "fields": {"user": 25, "nip": "1029384756"}}, {"model": "authentication.koordinatorkuliah", "pk": 13, "fields": {"user": 22, "nip": "17243192487"}}, {"model": "auth.permission", "pk": 1, "fields": {"name": "Can add log entry", "content_type": 1, "codename": "add_logentry"}}, {"model": "auth.permission", "pk": 2, "fields": {"name": "Can change log entry", "content_type": 1, "codename": "change_logentry"}}, {"model": "auth.permission", "pk": 3, "fields": {"name": "Can delete log entry", "content_type": 1, "codename": "delete_logentry"}}, {"model": "auth.permission", "pk": 4, "fields": {"name": "Can view log entry", "content_type": 1, "codename": "view_logentry"}}, {"model": "auth.permission", "pk": 5, "fields": {"name": "Can add permission", "content_type": 2, "codename": "add_permission"}}, {"model": "auth.permission", "pk": 6, "fields": {"name": "Can change permission", "content_type": 2, "codename": "change_permission"}}, {"model": "auth.permission", "pk": 7, "fields": {"name": "Can delete permission", "content_type": 2, "codename": "delete_permission"}}, {"model": "auth.permission", "pk": 8, "fields": {"name": "Can view permission", "content_type": 2, "codename": "view_permission"}}, {"model": "auth.permission", "pk": 9, "fields": {"name": "Can add group", "content_type": 3, "codename": "add_group"}}, {"model": "auth.permission", "pk": 10, "fields": {"name": "Can change group", "content_type": 3, "codename": "change_group"}}, {"model": "auth.permission", "pk": 11, "fields": {"name": "Can delete group", "content_type": 3, "codename": "delete_group"}}, {"model": "auth.permission", "pk": 12, "fields": {"name": "Can view group", "content_type": 3, "codename": "view_group"}}, {"model": "auth.permission", "pk": 13, "fields": {"name": "Can add user", "content_type": 4, "codename": "add_user"}}, {"model": "auth.permission", "pk": 14, "fields": {"name": "Can change user", "content_type": 4, "codename": "change_user"}}, {"model": "auth.permission", "pk": 15, "fields": {"name": "Can delete user", "content_type": 4, "codename": "delete_user"}}, {"model": "auth.permission", "pk": 16, "fields": {"name": "Can view user", "content_type": 4, "codename": "view_user"}}, {"model": "auth.permission", "pk": 17, "fields": {"name": "Can add content type", "content_type": 5, "codename": "add_contenttype"}}, {"model": "auth.permission", "pk": 18, "fields": {"name": "Can change content type", "content_type": 5, "codename": "change_contenttype"}}, {"model": "auth.permission", "pk": 19, "fields": {"name": "Can delete content type", "content_type": 5, "codename": "delete_contenttype"}}, {"model": "auth.permission", "pk": 20, "fields": {"name": "Can view content type", "content_type": 5, "codename": "view_contenttype"}}, {"model": "auth.permission", "pk": 21, "fields": {"name": "Can add session", "content_type": 6, "codename": "add_session"}}, {"model": "auth.permission", "pk": 22, "fields": {"name": "Can change session", "content_type": 6, "codename": "change_session"}}, {"model": "auth.permission", "pk": 23, "fields": {"name": "Can delete session", "content_type": 6, "codename": "delete_session"}}, {"model": "auth.permission", "pk": 24, "fields": {"name": "Can view session", "content_type": 6, "codename": "view_session"}}, {"model": "auth.permission", "pk": 25, "fields": {"name": "Can add institusi", "content_type": 7, "codename": "add_institusi"}}, {"model": "auth.permission", "pk": 26, "fields": {"name": "Can change institusi", "content_type": 7, "codename": "change_institusi"}}, {"model": "auth.permission", "pk": 27, "fields": {"name": "Can delete institusi", "content_type": 7, "codename": "delete_institusi"}}, {"model": "auth.permission", "pk": 28, "fields": {"name": "Can view institusi", "content_type": 7, "codename": "view_institusi"}}, {"model": "auth.permission", "pk": 29, "fields": {"name": "Can add lingkup kerja", "content_type": 8, "codename": "add_lingkupkerja"}}, {"model": "auth.permission", "pk": 30, "fields": {"name": "Can change lingkup kerja", "content_type": 8, "codename": "change_lingkupkerja"}}, {"model": "auth.permission", "pk": 31, "fields": {"name": "Can delete lingkup kerja", "content_type": 8, "codename": "delete_lingkupkerja"}}, {"model": "auth.permission", "pk": 32, "fields": {"name": "Can view lingkup kerja", "content_type": 8, "codename": "view_lingkupkerja"}}, {"model": "auth.permission", "pk": 33, "fields": {"name": "Can add tema", "content_type": 9, "codename": "add_tema"}}, {"model": "auth.permission", "pk": 34, "fields": {"name": "Can change tema", "content_type": 9, "codename": "change_tema"}}, {"model": "auth.permission", "pk": 35, "fields": {"name": "Can delete tema", "content_type": 9, "codename": "delete_tema"}}, {"model": "auth.permission", "pk": 36, "fields": {"name": "Can view tema", "content_type": 9, "codename": "view_tema"}}, {"model": "auth.permission", "pk": 37, "fields": {"name": "Can add lembaga", "content_type": 10, "codename": "add_lembaga"}}, {"model": "auth.permission", "pk": 38, "fields": {"name": "Can change lembaga", "content_type": 10, "codename": "change_lembaga"}}, {"model": "auth.permission", "pk": 39, "fields": {"name": "Can delete lembaga", "content_type": 10, "codename": "delete_lembaga"}}, {"model": "auth.permission", "pk": 40, "fields": {"name": "Can view lembaga", "content_type": 10, "codename": "view_lembaga"}}, {"model": "auth.permission", "pk": 41, "fields": {"name": "Can add praktikum", "content_type": 11, "codename": "add_praktikum"}}, {"model": "auth.permission", "pk": 42, "fields": {"name": "Can change praktikum", "content_type": 11, "codename": "change_praktikum"}}, {"model": "auth.permission", "pk": 43, "fields": {"name": "Can delete praktikum", "content_type": 11, "codename": "delete_praktikum"}}, {"model": "auth.permission", "pk": 44, "fields": {"name": "Can view praktikum", "content_type": 11, "codename": "view_praktikum"}}, {"model": "auth.permission", "pk": 45, "fields": {"name": "Can add template borang penilaian praktikum", "content_type": 12, "codename": "add_templateborangpenilaianpraktikum"}}, {"model": "auth.permission", "pk": 46, "fields": {"name": "Can change template borang penilaian praktikum", "content_type": 12, "codename": "change_templateborangpenilaianpraktikum"}}, {"model": "auth.permission", "pk": 47, "fields": {"name": "Can delete template borang penilaian praktikum", "content_type": 12, "codename": "delete_templateborangpenilaianpraktikum"}}, {"model": "auth.permission", "pk": 48, "fields": {"name": "Can view template borang penilaian praktikum", "content_type": 12, "codename": "view_templateborangpenilaianpraktikum"}}, {"model": "auth.permission", "pk": 49, "fields": {"name": "Can add mahasiswa praktikum", "content_type": 13, "codename": "add_mahasiswapraktikum"}}, {"model": "auth.permission", "pk": 50, "fields": {"name": "Can change mahasiswa praktikum", "content_type": 13, "codename": "change_mahasiswapraktikum"}}, {"model": "auth.permission", "pk": 51, "fields": {"name": "Can delete mahasiswa praktikum", "content_type": 13, "codename": "delete_mahasiswapraktikum"}}, {"model": "auth.permission", "pk": 52, "fields": {"name": "Can view mahasiswa praktikum", "content_type": 13, "codename": "view_mahasiswapraktikum"}}, {"model": "auth.permission", "pk": 53, "fields": {"name": "Can add laporan borang praktikum", "content_type": 14, "codename": "add_laporanborangpraktikum"}}, {"model": "auth.permission", "pk": 54, "fields": {"name": "Can change laporan borang praktikum", "content_type": 14, "codename": "change_laporanborangpraktikum"}}, {"model": "auth.permission", "pk": 55, "fields": {"name": "Can delete laporan borang praktikum", "content_type": 14, "codename": "delete_laporanborangpraktikum"}}, {"model": "auth.permission", "pk": 56, "fields": {"name": "Can view laporan borang praktikum", "content_type": 14, "codename": "view_laporanborangpraktikum"}}, {"model": "auth.permission", "pk": 57, "fields": {"name": "Can add laporan akhir praktikum", "content_type": 15, "codename": "add_laporanakhirpraktikum"}}, {"model": "auth.permission", "pk": 58, "fields": {"name": "Can change laporan akhir praktikum", "content_type": 15, "codename": "change_laporanakhirpraktikum"}}, {"model": "auth.permission", "pk": 59, "fields": {"name": "Can delete laporan akhir praktikum", "content_type": 15, "codename": "delete_laporanakhirpraktikum"}}, {"model": "auth.permission", "pk": 60, "fields": {"name": "Can view laporan akhir praktikum", "content_type": 15, "codename": "view_laporanakhirpraktikum"}}, {"model": "auth.permission", "pk": 61, "fields": {"name": "Can add kelola laporan praktikum", "content_type": 16, "codename": "add_kelolalaporanpraktikum"}}, {"model": "auth.permission", "pk": 62, "fields": {"name": "Can change kelola laporan praktikum", "content_type": 16, "codename": "change_kelolalaporanpraktikum"}}, {"model": "auth.permission", "pk": 63, "fields": {"name": "Can delete kelola laporan praktikum", "content_type": 16, "codename": "delete_kelolalaporanpraktikum"}}, {"model": "auth.permission", "pk": 64, "fields": {"name": "Can view kelola laporan praktikum", "content_type": 16, "codename": "view_kelolalaporanpraktikum"}}, {"model": "auth.permission", "pk": 65, "fields": {"name": "Can add proxy granting ticket", "content_type": 17, "codename": "add_proxygrantingticket"}}, {"model": "auth.permission", "pk": 66, "fields": {"name": "Can change proxy granting ticket", "content_type": 17, "codename": "change_proxygrantingticket"}}, {"model": "auth.permission", "pk": 67, "fields": {"name": "Can delete proxy granting ticket", "content_type": 17, "codename": "delete_proxygrantingticket"}}, {"model": "auth.permission", "pk": 68, "fields": {"name": "Can view proxy granting ticket", "content_type": 17, "codename": "view_proxygrantingticket"}}, {"model": "auth.permission", "pk": 69, "fields": {"name": "Can add session ticket", "content_type": 18, "codename": "add_sessionticket"}}, {"model": "auth.permission", "pk": 70, "fields": {"name": "Can change session ticket", "content_type": 18, "codename": "change_sessionticket"}}, {"model": "auth.permission", "pk": 71, "fields": {"name": "Can delete session ticket", "content_type": 18, "codename": "delete_sessionticket"}}, {"model": "auth.permission", "pk": 72, "fields": {"name": "Can view session ticket", "content_type": 18, "codename": "view_sessionticket"}}, {"model": "auth.permission", "pk": 73, "fields": {"name": "Can add cors model", "content_type": 19, "codename": "add_corsmodel"}}, {"model": "auth.permission", "pk": 74, "fields": {"name": "Can change cors model", "content_type": 19, "codename": "change_corsmodel"}}, {"model": "auth.permission", "pk": 75, "fields": {"name": "Can delete cors model", "content_type": 19, "codename": "delete_corsmodel"}}, {"model": "auth.permission", "pk": 76, "fields": {"name": "Can view cors model", "content_type": 19, "codename": "view_corsmodel"}}, {"model": "auth.permission", "pk": 77, "fields": {"name": "Can add periode", "content_type": 20, "codename": "add_periode"}}, {"model": "auth.permission", "pk": 78, "fields": {"name": "Can change periode", "content_type": 20, "codename": "change_periode"}}, {"model": "auth.permission", "pk": 79, "fields": {"name": "Can delete periode", "content_type": 20, "codename": "delete_periode"}}, {"model": "auth.permission", "pk": 80, "fields": {"name": "Can view periode", "content_type": 20, "codename": "view_periode"}}, {"model": "auth.permission", "pk": 81, "fields": {"name": "Can add supervisor_sekolah", "content_type": 21, "codename": "add_supervisorsekolah"}}, {"model": "auth.permission", "pk": 82, "fields": {"name": "Can change supervisor_sekolah", "content_type": 21, "codename": "change_supervisorsekolah"}}, {"model": "auth.permission", "pk": 83, "fields": {"name": "Can delete supervisor_sekolah", "content_type": 21, "codename": "delete_supervisorsekolah"}}, {"model": "auth.permission", "pk": 84, "fields": {"name": "Can view supervisor_sekolah", "content_type": 21, "codename": "view_supervisorsekolah"}}, {"model": "auth.permission", "pk": 85, "fields": {"name": "Can add supervisor_lembaga", "content_type": 22, "codename": "add_supervisorlembaga"}}, {"model": "auth.permission", "pk": 86, "fields": {"name": "Can change supervisor_lembaga", "content_type": 22, "codename": "change_supervisorlembaga"}}, {"model": "auth.permission", "pk": 87, "fields": {"name": "Can delete supervisor_lembaga", "content_type": 22, "codename": "delete_supervisorlembaga"}}, {"model": "auth.permission", "pk": 88, "fields": {"name": "Can view supervisor_lembaga", "content_type": 22, "codename": "view_supervisorlembaga"}}, {"model": "auth.permission", "pk": 89, "fields": {"name": "Can add mahasiswa", "content_type": 23, "codename": "add_mahasiswa"}}, {"model": "auth.permission", "pk": 90, "fields": {"name": "Can change mahasiswa", "content_type": 23, "codename": "change_mahasiswa"}}, {"model": "auth.permission", "pk": 91, "fields": {"name": "Can delete mahasiswa", "content_type": 23, "codename": "delete_mahasiswa"}}, {"model": "auth.permission", "pk": 92, "fields": {"name": "Can view mahasiswa", "content_type": 23, "codename": "view_mahasiswa"}}, {"model": "auth.permission", "pk": 93, "fields": {"name": "Can add koordinator_kuliah", "content_type": 24, "codename": "add_koordinatorkuliah"}}, {"model": "auth.permission", "pk": 94, "fields": {"name": "Can change koordinator_kuliah", "content_type": 24, "codename": "change_koordinatorkuliah"}}, {"model": "auth.permission", "pk": 95, "fields": {"name": "Can delete koordinator_kuliah", "content_type": 24, "codename": "delete_koordinatorkuliah"}}, {"model": "auth.permission", "pk": 96, "fields": {"name": "Can view koordinator_kuliah", "content_type": 24, "codename": "view_koordinatorkuliah"}}, {"model": "auth.permission", "pk": 97, "fields": {"name": "Can add administrator", "content_type": 25, "codename": "add_administrator"}}, {"model": "auth.permission", "pk": 98, "fields": {"name": "Can change administrator", "content_type": 25, "codename": "change_administrator"}}, {"model": "auth.permission", "pk": 99, "fields": {"name": "Can delete administrator", "content_type": 25, "codename": "delete_administrator"}}, {"model": "auth.permission", "pk": 100, "fields": {"name": "Can view administrator", "content_type": 25, "codename": "view_administrator"}}, {"model": "auth.permission", "pk": 101, "fields": {"name": "Can add config", "content_type": 26, "codename": "add_config"}}, {"model": "auth.permission", "pk": 102, "fields": {"name": "Can change config", "content_type": 26, "codename": "change_config"}}, {"model": "auth.permission", "pk": 103, "fields": {"name": "Can delete config", "content_type": 26, "codename": "delete_config"}}, {"model": "auth.permission", "pk": 104, "fields": {"name": "Can view config", "content_type": 26, "codename": "view_config"}}, {"model": "auth.user", "pk": 1, "fields": {"password": "pbkdf2_sha256$180000$gGA9mE6UnbLn$nckdEWY0cQXuLE7n9yRayyzQr0ueUGM8ALq9p1xXYS8=", "last_login": null, "is_superuser": false, "username": "username_user0", "first_name": "full_name", "last_name": "user0", "email": "email_user0@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:50:53.124", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 2, "fields": {"password": "pbkdf2_sha256$180000$HnOHoadGL9so$VVzA0gURanYPKxV4xD+n2UOTAGWElhCjl68BaNidXtA=", "last_login": null, "is_superuser": false, "username": "username_user1", "first_name": "full_name", "last_name": "user1", "email": "email_user1@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:50:54.036", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 3, "fields": {"password": "pbkdf2_sha256$216000$8PdvCVmsebKU$9R3aYf/YOk0If5vyemqxEuMj1dzDEsD7+FtEgQNuvF0=", "last_login": "2020-11-24T11:12:58.698", "is_superuser": false, "username": "username_user2", "first_name": "full_name", "last_name": "user2", "email": "email_user2@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:50:54.869", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 4, "fields": {"password": "pbkdf2_sha256$180000$MokG4FPUyUHX$HIbInbI7v/1nHF2bBA4sm9QqS2mmDM8Yny/0o4lbUug=", "last_login": null, "is_superuser": false, "username": "username_user3", "first_name": "full_name", "last_name": "user3", "email": "email_user3@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:50:55.700", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 5, "fields": {"password": "pbkdf2_sha256$216000$3ZJodURWW0mE$OMhIpxXHreu0Bwnhol3klbSrk2gTg9nH+Vo1xluldH8=", "last_login": "2020-12-07T15:43:26.791", "is_superuser": false, "username": "username_user4", "first_name": "full_name", "last_name": "user4", "email": "email_user4@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:50:56.536", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 6, "fields": {"password": "pbkdf2_sha256$180000$OGPwEIvDaQpn$MpMirE37sbv4l8+MMxvLWuoBtoiU3XdnCcWvtm8nOtw=", "last_login": null, "is_superuser": false, "username": "username_user5", "first_name": "full_name", "last_name": "user5", "email": "email_user5@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:50:57.369", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 7, "fields": {"password": "pbkdf2_sha256$180000$uw1ZxF1ekG4R$Lx4QM/Yzeb+9GV4DNdqridQ0GYMirblLa6CiwGBXvGU=", "last_login": null, "is_superuser": false, "username": "username_user6", "first_name": "full_name", "last_name": "user6", "email": "email_user6@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:50:58.265", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 8, "fields": {"password": "pbkdf2_sha256$180000$I3kjTz50yrr3$mJuhi+aPjKyRY3aOfiwwTRup6erpoZ9T1md1+cJqmIw=", "last_login": null, "is_superuser": false, "username": "username_user7", "first_name": "full_name", "last_name": "user7", "email": "email_user7@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:50:59.097", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 9, "fields": {"password": "pbkdf2_sha256$180000$yAo6GcxIhc1y$R/V1o/t0EhamLyTeB07RSUKbJ4lhY55r6gxjYaUiHNs=", "last_login": null, "is_superuser": false, "username": "username_user8", "first_name": "full_name", "last_name": "user8", "email": "email_user8@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:50:59.931", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 10, "fields": {"password": "pbkdf2_sha256$180000$7WcEdc7zaHAT$Lvymu2SleGcSbIBukEZwVDfakeJbxS2YjEPQdQHG47w=", "last_login": null, "is_superuser": false, "username": "username_user9", "first_name": "full_name", "last_name": "user9", "email": "email_user9@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:51:00.774", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 11, "fields": {"password": "pbkdf2_sha256$180000$xnVPV2ZzTqDl$FRDz3kyHGzkO7lC3/cF5C67Nq78qI6JrhZXlQSmBGwE=", "last_login": null, "is_superuser": false, "username": "username_user10", "first_name": "full_name", "last_name": "user10", "email": "email_user10@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:51:01.599", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 12, "fields": {"password": "pbkdf2_sha256$180000$H0NAv6Aw3N2p$rTEpGIoTo0ZskQdj4GRDIBvX4fVHK8vmo4UtB+rqAnI=", "last_login": null, "is_superuser": false, "username": "username_user11", "first_name": "full_name", "last_name": "user11", "email": "email_user11@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:51:02.418", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 13, "fields": {"password": "pbkdf2_sha256$180000$IjzYPJljYSbZ$/n4Wkic3dJ3P/VDuuoHZYXXrmx/AmV5WxmaLD60QY8s=", "last_login": null, "is_superuser": false, "username": "username_user12", "first_name": "full_name", "last_name": "user12", "email": "email_user12@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:51:03.228", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 14, "fields": {"password": "pbkdf2_sha256$180000$hlQzbTRy3aLw$cI9K0qMh8+xs201WgoLlbv9bYD+8Kw0zQr6Ddc0SCx4=", "last_login": null, "is_superuser": false, "username": "username_user13", "first_name": "full_name", "last_name": "user13", "email": "email_user13@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:51:04.054", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 15, "fields": {"password": "pbkdf2_sha256$180000$m1syz139kpUw$+QourC4uMwxur4zFXakZa9Xj+3XcTYMCvAADuqq/5G8=", "last_login": null, "is_superuser": false, "username": "username_user14", "first_name": "full_name", "last_name": "user14", "email": "email_user14@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:51:04.873", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 16, "fields": {"password": "pbkdf2_sha256$180000$JO53zWbYonXG$Ib2eOio0XHeolJBqvHGkvX727NWcY4RzsgNsmzVp7v0=", "last_login": null, "is_superuser": false, "username": "username_user15", "first_name": "full_name", "last_name": "user15", "email": "email_user15@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:51:05.745", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 17, "fields": {"password": "pbkdf2_sha256$180000$r6j88bh3AKEt$bLQNxFAFPlJX+cPqWhiEcmVnm9QrMiMhsmYKDwwqLOk=", "last_login": null, "is_superuser": false, "username": "username_user16", "first_name": "full_name", "last_name": "user16", "email": "email_user16@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:51:06.581", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 18, "fields": {"password": "pbkdf2_sha256$180000$12STaQpbKvwc$pORBNHnEe3zBrcI6CEYn3VJVOZwF1CQllffj92Th87o=", "last_login": null, "is_superuser": false, "username": "username_user17", "first_name": "full_name", "last_name": "user17", "email": "email_user17@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:51:07.466", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 19, "fields": {"password": "pbkdf2_sha256$216000$4XjnsZ811cdE$94MU74BKig0yph8I9coHBJXI+jTguVh8NwnE2Q2wvQ0=", "last_login": "2020-12-08T13:54:11.922", "is_superuser": true, "username": "admin", "first_name": "", "last_name": "", "email": "admin@ppl.com", "is_staff": true, "is_active": true, "date_joined": "2020-10-30T20:51:09.204", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 20, "fields": {"password": "ga_perlu_password", "last_login": "2020-11-25T01:42:26.099", "is_superuser": false, "username": "annisaa.fitri51", "first_name": "Annisaa", "last_name": "Fitri Shabrina", "email": "annisaa.fitri51@ui.ac.id", "is_staff": false, "is_active": true, "date_joined": "2020-11-09T22:40:57", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 22, "fields": {"password": "nope", "last_login": "2020-12-08T14:39:46.249", "is_superuser": false, "username": "harold.hotma", "first_name": "Harold", "last_name": "Hotma Sibuea", "email": "harold.hotma@ui.ac.id", "is_staff": false, "is_active": true, "date_joined": "2020-11-09T22:43:06", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 25, "fields": {"password": "butuh password yang aman? Cek di Go Get Gold Indonesia", "last_login": "2020-12-07T14:17:38.775", "is_superuser": false, "username": "figo.muhammad", "first_name": "Figo", "last_name": "Muhammad Alfaritzi", "email": "figo.muhammad@ui.ac.id", "is_staff": false, "is_active": true, "date_joined": "2020-11-12T20:40:11", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 26, "fields": {"password": "ini nih jagonya frontend", "last_login": "2020-12-04T01:53:03.860", "is_superuser": false, "username": "nabila.edina", "first_name": "Nabila", "last_name": "Edina", "email": "nabila.edina@ui.ac.id", "is_staff": false, "is_active": true, "date_joined": "2020-11-12T20:41:32", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 27, "fields": {"password": "pbkdf2_sha256$216000$bBoFlPOzEQYM$E5azzhUBzyh63H10iTBtHlvj93kopkCzDS+CJyKNfNo=", "last_login": "2020-12-07T15:48:00.584", "is_superuser": false, "username": "budi_doremi", "first_name": "Budi", "last_name": "", "email": "budi_doremi@email.com", "is_staff": false, "is_active": true, "date_joined": "2020-11-12T20:53:10", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 28, "fields": {"password": "emang password guna?", "last_login": "2020-12-04T00:17:29.225", "is_superuser": false, "username": "fransiscus.emmanuel", "first_name": "Fransiscus", "last_name": "Emmanuel Bunaren", "email": "fransiscus.emmanuel@ui.ac.id", "is_staff": false, "is_active": true, "date_joined": "2020-11-12T21:15:48", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 29, "fields": {"password": "pbkdf2_sha256$216000$TPngQAglHMZX$1g87PQ/wp7v5dNeQPDflPSLkbIhjddfCUylzUs+Gwj8=", "last_login": "2020-11-24T03:16:33.916", "is_superuser": false, "username": "budhidharma", "first_name": "Budhi", "last_name": "Dharma", "email": "budhidharma@ui.ac.id", "is_staff": false, "is_active": true, "date_joined": "2020-11-15T17:10:56", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 30, "fields": {"password": "pbkdf2_sha256$216000$G7vCaS0ZSUhc$7YFJ/fN8PiwSLZIhknUEIn7nAui8OyupcWE5K8DOfKI=", "last_login": null, "is_superuser": false, "username": "wisni.bantarti09", "first_name": "Wisni", "last_name": "Bantarti", "email": "wisni.bantarti09@ui.ac.id", "is_staff": false, "is_active": true, "date_joined": "2020-11-15T17:12:43", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 31, "fields": {"password": "pbkdf2_sha256$216000$uoPJjKm0Vz9v$2ZMZYy3HoLoRrX29IvEiFlv2yr7Mj6MpX2pwc/Em/Xo=", "last_login": "2020-11-25T02:05:46.720", "is_superuser": false, "username": "maya.retno81", "first_name": "Maya", "last_name": "Retno", "email": "maya.retno81@ui.ac.id", "is_staff": false, "is_active": true, "date_joined": "2020-11-25T02:03:38", "groups": [], "user_permissions": []}}] \ No newline at end of file diff --git a/new/db2.json b/new/db2.json deleted file mode 100644 index 94fa68d..0000000 --- a/new/db2.json +++ /dev/null @@ -1 +0,0 @@ -[{"model": "auth.permission", "pk": 1, "fields": {"name": "Can add log entry", "content_type": 1, "codename": "add_logentry"}}, {"model": "auth.permission", "pk": 2, "fields": {"name": "Can change log entry", "content_type": 1, "codename": "change_logentry"}}, {"model": "auth.permission", "pk": 3, "fields": {"name": "Can delete log entry", "content_type": 1, "codename": "delete_logentry"}}, {"model": "auth.permission", "pk": 4, "fields": {"name": "Can view log entry", "content_type": 1, "codename": "view_logentry"}}, {"model": "auth.permission", "pk": 5, "fields": {"name": "Can add permission", "content_type": 2, "codename": "add_permission"}}, {"model": "auth.permission", "pk": 6, "fields": {"name": "Can change permission", "content_type": 2, "codename": "change_permission"}}, {"model": "auth.permission", "pk": 7, "fields": {"name": "Can delete permission", "content_type": 2, "codename": "delete_permission"}}, {"model": "auth.permission", "pk": 8, "fields": {"name": "Can view permission", "content_type": 2, "codename": "view_permission"}}, {"model": "auth.permission", "pk": 9, "fields": {"name": "Can add group", "content_type": 3, "codename": "add_group"}}, {"model": "auth.permission", "pk": 10, "fields": {"name": "Can change group", "content_type": 3, "codename": "change_group"}}, {"model": "auth.permission", "pk": 11, "fields": {"name": "Can delete group", "content_type": 3, "codename": "delete_group"}}, {"model": "auth.permission", "pk": 12, "fields": {"name": "Can view group", "content_type": 3, "codename": "view_group"}}, {"model": "auth.permission", "pk": 13, "fields": {"name": "Can add user", "content_type": 4, "codename": "add_user"}}, {"model": "auth.permission", "pk": 14, "fields": {"name": "Can change user", "content_type": 4, "codename": "change_user"}}, {"model": "auth.permission", "pk": 15, "fields": {"name": "Can delete user", "content_type": 4, "codename": "delete_user"}}, {"model": "auth.permission", "pk": 16, "fields": {"name": "Can view user", "content_type": 4, "codename": "view_user"}}, {"model": "auth.permission", "pk": 17, "fields": {"name": "Can add content type", "content_type": 5, "codename": "add_contenttype"}}, {"model": "auth.permission", "pk": 18, "fields": {"name": "Can change content type", "content_type": 5, "codename": "change_contenttype"}}, {"model": "auth.permission", "pk": 19, "fields": {"name": "Can delete content type", "content_type": 5, "codename": "delete_contenttype"}}, {"model": "auth.permission", "pk": 20, "fields": {"name": "Can view content type", "content_type": 5, "codename": "view_contenttype"}}, {"model": "auth.permission", "pk": 21, "fields": {"name": "Can add session", "content_type": 6, "codename": "add_session"}}, {"model": "auth.permission", "pk": 22, "fields": {"name": "Can change session", "content_type": 6, "codename": "change_session"}}, {"model": "auth.permission", "pk": 23, "fields": {"name": "Can delete session", "content_type": 6, "codename": "delete_session"}}, {"model": "auth.permission", "pk": 24, "fields": {"name": "Can view session", "content_type": 6, "codename": "view_session"}}, {"model": "auth.permission", "pk": 25, "fields": {"name": "Can add institusi", "content_type": 7, "codename": "add_institusi"}}, {"model": "auth.permission", "pk": 26, "fields": {"name": "Can change institusi", "content_type": 7, "codename": "change_institusi"}}, {"model": "auth.permission", "pk": 27, "fields": {"name": "Can delete institusi", "content_type": 7, "codename": "delete_institusi"}}, {"model": "auth.permission", "pk": 28, "fields": {"name": "Can view institusi", "content_type": 7, "codename": "view_institusi"}}, {"model": "auth.permission", "pk": 29, "fields": {"name": "Can add lingkup kerja", "content_type": 8, "codename": "add_lingkupkerja"}}, {"model": "auth.permission", "pk": 30, "fields": {"name": "Can change lingkup kerja", "content_type": 8, "codename": "change_lingkupkerja"}}, {"model": "auth.permission", "pk": 31, "fields": {"name": "Can delete lingkup kerja", "content_type": 8, "codename": "delete_lingkupkerja"}}, {"model": "auth.permission", "pk": 32, "fields": {"name": "Can view lingkup kerja", "content_type": 8, "codename": "view_lingkupkerja"}}, {"model": "auth.permission", "pk": 33, "fields": {"name": "Can add tema", "content_type": 9, "codename": "add_tema"}}, {"model": "auth.permission", "pk": 34, "fields": {"name": "Can change tema", "content_type": 9, "codename": "change_tema"}}, {"model": "auth.permission", "pk": 35, "fields": {"name": "Can delete tema", "content_type": 9, "codename": "delete_tema"}}, {"model": "auth.permission", "pk": 36, "fields": {"name": "Can view tema", "content_type": 9, "codename": "view_tema"}}, {"model": "auth.permission", "pk": 37, "fields": {"name": "Can add lembaga", "content_type": 10, "codename": "add_lembaga"}}, {"model": "auth.permission", "pk": 38, "fields": {"name": "Can change lembaga", "content_type": 10, "codename": "change_lembaga"}}, {"model": "auth.permission", "pk": 39, "fields": {"name": "Can delete lembaga", "content_type": 10, "codename": "delete_lembaga"}}, {"model": "auth.permission", "pk": 40, "fields": {"name": "Can view lembaga", "content_type": 10, "codename": "view_lembaga"}}, {"model": "auth.permission", "pk": 41, "fields": {"name": "Can add praktikum", "content_type": 11, "codename": "add_praktikum"}}, {"model": "auth.permission", "pk": 42, "fields": {"name": "Can change praktikum", "content_type": 11, "codename": "change_praktikum"}}, {"model": "auth.permission", "pk": 43, "fields": {"name": "Can delete praktikum", "content_type": 11, "codename": "delete_praktikum"}}, {"model": "auth.permission", "pk": 44, "fields": {"name": "Can view praktikum", "content_type": 11, "codename": "view_praktikum"}}, {"model": "auth.permission", "pk": 45, "fields": {"name": "Can add template borang penilaian praktikum", "content_type": 12, "codename": "add_templateborangpenilaianpraktikum"}}, {"model": "auth.permission", "pk": 46, "fields": {"name": "Can change template borang penilaian praktikum", "content_type": 12, "codename": "change_templateborangpenilaianpraktikum"}}, {"model": "auth.permission", "pk": 47, "fields": {"name": "Can delete template borang penilaian praktikum", "content_type": 12, "codename": "delete_templateborangpenilaianpraktikum"}}, {"model": "auth.permission", "pk": 48, "fields": {"name": "Can view template borang penilaian praktikum", "content_type": 12, "codename": "view_templateborangpenilaianpraktikum"}}, {"model": "auth.permission", "pk": 49, "fields": {"name": "Can add mahasiswa praktikum", "content_type": 13, "codename": "add_mahasiswapraktikum"}}, {"model": "auth.permission", "pk": 50, "fields": {"name": "Can change mahasiswa praktikum", "content_type": 13, "codename": "change_mahasiswapraktikum"}}, {"model": "auth.permission", "pk": 51, "fields": {"name": "Can delete mahasiswa praktikum", "content_type": 13, "codename": "delete_mahasiswapraktikum"}}, {"model": "auth.permission", "pk": 52, "fields": {"name": "Can view mahasiswa praktikum", "content_type": 13, "codename": "view_mahasiswapraktikum"}}, {"model": "auth.permission", "pk": 53, "fields": {"name": "Can add laporan borang praktikum", "content_type": 14, "codename": "add_laporanborangpraktikum"}}, {"model": "auth.permission", "pk": 54, "fields": {"name": "Can change laporan borang praktikum", "content_type": 14, "codename": "change_laporanborangpraktikum"}}, {"model": "auth.permission", "pk": 55, "fields": {"name": "Can delete laporan borang praktikum", "content_type": 14, "codename": "delete_laporanborangpraktikum"}}, {"model": "auth.permission", "pk": 56, "fields": {"name": "Can view laporan borang praktikum", "content_type": 14, "codename": "view_laporanborangpraktikum"}}, {"model": "auth.permission", "pk": 57, "fields": {"name": "Can add laporan akhir praktikum", "content_type": 15, "codename": "add_laporanakhirpraktikum"}}, {"model": "auth.permission", "pk": 58, "fields": {"name": "Can change laporan akhir praktikum", "content_type": 15, "codename": "change_laporanakhirpraktikum"}}, {"model": "auth.permission", "pk": 59, "fields": {"name": "Can delete laporan akhir praktikum", "content_type": 15, "codename": "delete_laporanakhirpraktikum"}}, {"model": "auth.permission", "pk": 60, "fields": {"name": "Can view laporan akhir praktikum", "content_type": 15, "codename": "view_laporanakhirpraktikum"}}, {"model": "auth.permission", "pk": 61, "fields": {"name": "Can add kelola laporan praktikum", "content_type": 16, "codename": "add_kelolalaporanpraktikum"}}, {"model": "auth.permission", "pk": 62, "fields": {"name": "Can change kelola laporan praktikum", "content_type": 16, "codename": "change_kelolalaporanpraktikum"}}, {"model": "auth.permission", "pk": 63, "fields": {"name": "Can delete kelola laporan praktikum", "content_type": 16, "codename": "delete_kelolalaporanpraktikum"}}, {"model": "auth.permission", "pk": 64, "fields": {"name": "Can view kelola laporan praktikum", "content_type": 16, "codename": "view_kelolalaporanpraktikum"}}, {"model": "auth.permission", "pk": 65, "fields": {"name": "Can add proxy granting ticket", "content_type": 17, "codename": "add_proxygrantingticket"}}, {"model": "auth.permission", "pk": 66, "fields": {"name": "Can change proxy granting ticket", "content_type": 17, "codename": "change_proxygrantingticket"}}, {"model": "auth.permission", "pk": 67, "fields": {"name": "Can delete proxy granting ticket", "content_type": 17, "codename": "delete_proxygrantingticket"}}, {"model": "auth.permission", "pk": 68, "fields": {"name": "Can view proxy granting ticket", "content_type": 17, "codename": "view_proxygrantingticket"}}, {"model": "auth.permission", "pk": 69, "fields": {"name": "Can add session ticket", "content_type": 18, "codename": "add_sessionticket"}}, {"model": "auth.permission", "pk": 70, "fields": {"name": "Can change session ticket", "content_type": 18, "codename": "change_sessionticket"}}, {"model": "auth.permission", "pk": 71, "fields": {"name": "Can delete session ticket", "content_type": 18, "codename": "delete_sessionticket"}}, {"model": "auth.permission", "pk": 72, "fields": {"name": "Can view session ticket", "content_type": 18, "codename": "view_sessionticket"}}, {"model": "auth.permission", "pk": 73, "fields": {"name": "Can add cors model", "content_type": 19, "codename": "add_corsmodel"}}, {"model": "auth.permission", "pk": 74, "fields": {"name": "Can change cors model", "content_type": 19, "codename": "change_corsmodel"}}, {"model": "auth.permission", "pk": 75, "fields": {"name": "Can delete cors model", "content_type": 19, "codename": "delete_corsmodel"}}, {"model": "auth.permission", "pk": 76, "fields": {"name": "Can view cors model", "content_type": 19, "codename": "view_corsmodel"}}, {"model": "auth.permission", "pk": 77, "fields": {"name": "Can add periode", "content_type": 20, "codename": "add_periode"}}, {"model": "auth.permission", "pk": 78, "fields": {"name": "Can change periode", "content_type": 20, "codename": "change_periode"}}, {"model": "auth.permission", "pk": 79, "fields": {"name": "Can delete periode", "content_type": 20, "codename": "delete_periode"}}, {"model": "auth.permission", "pk": 80, "fields": {"name": "Can view periode", "content_type": 20, "codename": "view_periode"}}, {"model": "auth.permission", "pk": 81, "fields": {"name": "Can add supervisor_sekolah", "content_type": 21, "codename": "add_supervisorsekolah"}}, {"model": "auth.permission", "pk": 82, "fields": {"name": "Can change supervisor_sekolah", "content_type": 21, "codename": "change_supervisorsekolah"}}, {"model": "auth.permission", "pk": 83, "fields": {"name": "Can delete supervisor_sekolah", "content_type": 21, "codename": "delete_supervisorsekolah"}}, {"model": "auth.permission", "pk": 84, "fields": {"name": "Can view supervisor_sekolah", "content_type": 21, "codename": "view_supervisorsekolah"}}, {"model": "auth.permission", "pk": 85, "fields": {"name": "Can add supervisor_lembaga", "content_type": 22, "codename": "add_supervisorlembaga"}}, {"model": "auth.permission", "pk": 86, "fields": {"name": "Can change supervisor_lembaga", "content_type": 22, "codename": "change_supervisorlembaga"}}, {"model": "auth.permission", "pk": 87, "fields": {"name": "Can delete supervisor_lembaga", "content_type": 22, "codename": "delete_supervisorlembaga"}}, {"model": "auth.permission", "pk": 88, "fields": {"name": "Can view supervisor_lembaga", "content_type": 22, "codename": "view_supervisorlembaga"}}, {"model": "auth.permission", "pk": 89, "fields": {"name": "Can add mahasiswa", "content_type": 23, "codename": "add_mahasiswa"}}, {"model": "auth.permission", "pk": 90, "fields": {"name": "Can change mahasiswa", "content_type": 23, "codename": "change_mahasiswa"}}, {"model": "auth.permission", "pk": 91, "fields": {"name": "Can delete mahasiswa", "content_type": 23, "codename": "delete_mahasiswa"}}, {"model": "auth.permission", "pk": 92, "fields": {"name": "Can view mahasiswa", "content_type": 23, "codename": "view_mahasiswa"}}, {"model": "auth.permission", "pk": 93, "fields": {"name": "Can add koordinator_kuliah", "content_type": 24, "codename": "add_koordinatorkuliah"}}, {"model": "auth.permission", "pk": 94, "fields": {"name": "Can change koordinator_kuliah", "content_type": 24, "codename": "change_koordinatorkuliah"}}, {"model": "auth.permission", "pk": 95, "fields": {"name": "Can delete koordinator_kuliah", "content_type": 24, "codename": "delete_koordinatorkuliah"}}, {"model": "auth.permission", "pk": 96, "fields": {"name": "Can view koordinator_kuliah", "content_type": 24, "codename": "view_koordinatorkuliah"}}, {"model": "auth.permission", "pk": 97, "fields": {"name": "Can add administrator", "content_type": 25, "codename": "add_administrator"}}, {"model": "auth.permission", "pk": 98, "fields": {"name": "Can change administrator", "content_type": 25, "codename": "change_administrator"}}, {"model": "auth.permission", "pk": 99, "fields": {"name": "Can delete administrator", "content_type": 25, "codename": "delete_administrator"}}, {"model": "auth.permission", "pk": 100, "fields": {"name": "Can view administrator", "content_type": 25, "codename": "view_administrator"}}, {"model": "auth.permission", "pk": 101, "fields": {"name": "Can add config", "content_type": 26, "codename": "add_config"}}, {"model": "auth.permission", "pk": 102, "fields": {"name": "Can change config", "content_type": 26, "codename": "change_config"}}, {"model": "auth.permission", "pk": 103, "fields": {"name": "Can delete config", "content_type": 26, "codename": "delete_config"}}, {"model": "auth.permission", "pk": 104, "fields": {"name": "Can view config", "content_type": 26, "codename": "view_config"}}, {"model": "auth.user", "pk": 1, "fields": {"password": "pbkdf2_sha256$216000$leFjQ2DxmVjS$tffeRLeWinHP27CpOds5vjBt3HeNInKLCJ9AbpbsiV8=", "last_login": "2020-12-09T11:01:59.681", "is_superuser": false, "username": "username_user0", "first_name": "full_name", "last_name": "user0", "email": "email_user0@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-31T03:50:53.124", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 2, "fields": {"password": "pbkdf2_sha256$180000$HnOHoadGL9so$VVzA0gURanYPKxV4xD+n2UOTAGWElhCjl68BaNidXtA=", "last_login": null, "is_superuser": false, "username": "username_user1", "first_name": "full_name", "last_name": "user1", "email": "email_user1@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-31T03:50:54.036", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 3, "fields": {"password": "pbkdf2_sha256$216000$8PdvCVmsebKU$9R3aYf/YOk0If5vyemqxEuMj1dzDEsD7+FtEgQNuvF0=", "last_login": "2020-11-24T18:12:58.698", "is_superuser": false, "username": "username_user2", "first_name": "full_name", "last_name": "user2", "email": "email_user2@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-31T03:50:54.869", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 4, "fields": {"password": "pbkdf2_sha256$180000$MokG4FPUyUHX$HIbInbI7v/1nHF2bBA4sm9QqS2mmDM8Yny/0o4lbUug=", "last_login": null, "is_superuser": false, "username": "username_user3", "first_name": "full_name", "last_name": "user3", "email": "email_user3@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-31T03:50:55.700", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 5, "fields": {"password": "pbkdf2_sha256$216000$3ZJodURWW0mE$OMhIpxXHreu0Bwnhol3klbSrk2gTg9nH+Vo1xluldH8=", "last_login": "2020-12-10T21:24:46.499", "is_superuser": false, "username": "username_user4", "first_name": "full_name", "last_name": "user4", "email": "email_user4@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-31T03:50:56.536", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 6, "fields": {"password": "pbkdf2_sha256$180000$OGPwEIvDaQpn$MpMirE37sbv4l8+MMxvLWuoBtoiU3XdnCcWvtm8nOtw=", "last_login": null, "is_superuser": false, "username": "username_user5", "first_name": "full_name", "last_name": "user5", "email": "email_user5@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-31T03:50:57.369", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 7, "fields": {"password": "pbkdf2_sha256$180000$uw1ZxF1ekG4R$Lx4QM/Yzeb+9GV4DNdqridQ0GYMirblLa6CiwGBXvGU=", "last_login": null, "is_superuser": false, "username": "username_user6", "first_name": "full_name", "last_name": "user6", "email": "email_user6@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-31T03:50:58.265", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 8, "fields": {"password": "pbkdf2_sha256$180000$I3kjTz50yrr3$mJuhi+aPjKyRY3aOfiwwTRup6erpoZ9T1md1+cJqmIw=", "last_login": null, "is_superuser": false, "username": "username_user7", "first_name": "full_name", "last_name": "user7", "email": "email_user7@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-31T03:50:59.097", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 9, "fields": {"password": "pbkdf2_sha256$180000$yAo6GcxIhc1y$R/V1o/t0EhamLyTeB07RSUKbJ4lhY55r6gxjYaUiHNs=", "last_login": null, "is_superuser": false, "username": "username_user8", "first_name": "full_name", "last_name": "user8", "email": "email_user8@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-31T03:50:59.931", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 10, "fields": {"password": "pbkdf2_sha256$180000$7WcEdc7zaHAT$Lvymu2SleGcSbIBukEZwVDfakeJbxS2YjEPQdQHG47w=", "last_login": null, "is_superuser": false, "username": "username_user9", "first_name": "full_name", "last_name": "user9", "email": "email_user9@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-31T03:51:00.774", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 11, "fields": {"password": "pbkdf2_sha256$180000$xnVPV2ZzTqDl$FRDz3kyHGzkO7lC3/cF5C67Nq78qI6JrhZXlQSmBGwE=", "last_login": null, "is_superuser": false, "username": "username_user10", "first_name": "full_name", "last_name": "user10", "email": "email_user10@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-31T03:51:01.599", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 12, "fields": {"password": "pbkdf2_sha256$180000$H0NAv6Aw3N2p$rTEpGIoTo0ZskQdj4GRDIBvX4fVHK8vmo4UtB+rqAnI=", "last_login": null, "is_superuser": false, "username": "username_user11", "first_name": "full_name", "last_name": "user11", "email": "email_user11@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-31T03:51:02.418", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 13, "fields": {"password": "pbkdf2_sha256$180000$IjzYPJljYSbZ$/n4Wkic3dJ3P/VDuuoHZYXXrmx/AmV5WxmaLD60QY8s=", "last_login": null, "is_superuser": false, "username": "username_user12", "first_name": "full_name", "last_name": "user12", "email": "email_user12@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-31T03:51:03.228", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 14, "fields": {"password": "pbkdf2_sha256$180000$hlQzbTRy3aLw$cI9K0qMh8+xs201WgoLlbv9bYD+8Kw0zQr6Ddc0SCx4=", "last_login": null, "is_superuser": false, "username": "username_user13", "first_name": "full_name", "last_name": "user13", "email": "email_user13@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-31T03:51:04.054", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 15, "fields": {"password": "pbkdf2_sha256$180000$m1syz139kpUw$+QourC4uMwxur4zFXakZa9Xj+3XcTYMCvAADuqq/5G8=", "last_login": null, "is_superuser": false, "username": "username_user14", "first_name": "full_name", "last_name": "user14", "email": "email_user14@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-31T03:51:04.873", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 16, "fields": {"password": "pbkdf2_sha256$180000$JO53zWbYonXG$Ib2eOio0XHeolJBqvHGkvX727NWcY4RzsgNsmzVp7v0=", "last_login": null, "is_superuser": false, "username": "username_user15", "first_name": "full_name", "last_name": "user15", "email": "email_user15@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-31T03:51:05.745", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 17, "fields": {"password": "pbkdf2_sha256$180000$r6j88bh3AKEt$bLQNxFAFPlJX+cPqWhiEcmVnm9QrMiMhsmYKDwwqLOk=", "last_login": null, "is_superuser": false, "username": "username_user16", "first_name": "full_name", "last_name": "user16", "email": "email_user16@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-31T03:51:06.581", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 18, "fields": {"password": "pbkdf2_sha256$180000$12STaQpbKvwc$pORBNHnEe3zBrcI6CEYn3VJVOZwF1CQllffj92Th87o=", "last_login": null, "is_superuser": false, "username": "username_user17", "first_name": "full_name", "last_name": "user17", "email": "email_user17@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-31T03:51:07.466", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 19, "fields": {"password": "pbkdf2_sha256$216000$4XjnsZ811cdE$94MU74BKig0yph8I9coHBJXI+jTguVh8NwnE2Q2wvQ0=", "last_login": "2020-12-11T00:25:52.347", "is_superuser": true, "username": "admin", "first_name": "", "last_name": "", "email": "admin@ppl.com", "is_staff": true, "is_active": true, "date_joined": "2020-10-31T03:51:09.204", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 20, "fields": {"password": "ga_perlu_password", "last_login": "2020-12-10T21:56:03.548", "is_superuser": false, "username": "annisaa.fitri51", "first_name": "Annisaa", "last_name": "Fitri Shabrina", "email": "annisaa.fitri51@ui.ac.id", "is_staff": false, "is_active": true, "date_joined": "2020-11-10T05:40:57", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 27, "fields": {"password": "pbkdf2_sha256$216000$bBoFlPOzEQYM$E5azzhUBzyh63H10iTBtHlvj93kopkCzDS+CJyKNfNo=", "last_login": "2020-12-10T21:44:33.546", "is_superuser": false, "username": "budi_doremi", "first_name": "Budi", "last_name": "", "email": "budi_doremi@email.com", "is_staff": false, "is_active": true, "date_joined": "2020-11-13T03:53:10", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 29, "fields": {"password": "pbkdf2_sha256$216000$TPngQAglHMZX$1g87PQ/wp7v5dNeQPDflPSLkbIhjddfCUylzUs+Gwj8=", "last_login": "2020-11-24T10:16:33.916", "is_superuser": false, "username": "budhidharma", "first_name": "Budhi", "last_name": "Dharma", "email": "budhidharma@ui.ac.id", "is_staff": false, "is_active": true, "date_joined": "2020-11-16T00:10:56", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 30, "fields": {"password": "pbkdf2_sha256$216000$G7vCaS0ZSUhc$7YFJ/fN8PiwSLZIhknUEIn7nAui8OyupcWE5K8DOfKI=", "last_login": null, "is_superuser": false, "username": "wisni.bantarti09", "first_name": "Wisni", "last_name": "Bantarti", "email": "wisni.bantarti09@ui.ac.id", "is_staff": false, "is_active": true, "date_joined": "2020-11-16T00:12:43", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 38, "fields": {"password": "!uC7GRV2ktWE06kf6KrTdns1PwcgESkwZfdewfNPz", "last_login": "2020-12-10T21:30:34.274", "is_superuser": false, "username": "figo.muhammad", "first_name": "Figo", "last_name": "Muhammad", "email": "figo.muhammad@ui.ac.id", "is_staff": false, "is_active": true, "date_joined": "2020-12-10T21:25:27", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 39, "fields": {"password": "!4dxmtK8RJdA784KlkjzI569dROYIBoZpO9Ff5U6P", "last_login": null, "is_superuser": false, "username": "nabila.edina", "first_name": "Nabila", "last_name": "Edina", "email": "nabila.edina@ui.ac.id", "is_staff": false, "is_active": true, "date_joined": "2020-12-10T21:25:27", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 40, "fields": {"password": "!0j8Shagfob6tDK0HOC6JUYZLNd3ZiCfHVde9noty", "last_login": "2020-12-11T00:27:49.585", "is_superuser": false, "username": "harold.hotma", "first_name": "Harold", "last_name": "Hotma", "email": "harold.hotma@ui.ac.id", "is_staff": false, "is_active": true, "date_joined": "2020-12-10T21:25:51", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 41, "fields": {"password": "!J78Ry3ds6NToubDianPplMJ8T5nkaYu9gZOEODPt", "last_login": "2020-12-10T23:10:59.678", "is_superuser": false, "username": "fransiscus.emmanuel", "first_name": "Fransiscus", "last_name": "Bunaren", "email": "fransiscus.emmanuel@ui.ac.id", "is_staff": false, "is_active": true, "date_joined": "2020-12-10T21:25:51", "groups": [], "user_permissions": []}}, {"model": "authentication.supervisorsekolah", "pk": 1, "fields": {"user": 2, "nip": "165587668158"}}, {"model": "authentication.supervisorsekolah", "pk": 2, "fields": {"user": 11, "nip": "171095499117"}}, {"model": "authentication.supervisorsekolah", "pk": 3, "fields": {"user": 20, "nip": "112233445566"}}, {"model": "authentication.supervisorsekolah", "pk": 5, "fields": {"user": 29, "nip": "102030405060"}}, {"model": "authentication.supervisorsekolah", "pk": 6, "fields": {"user": 30, "nip": "010203040506"}}, {"model": "authentication.supervisorsekolah", "pk": 48, "fields": {"user": 38, "nip": "1234567890"}}, {"model": "authentication.supervisorlembaga", "pk": 4, "fields": {"user": 27, "lembaga": 8, "jabatan": "CEO"}}, {"model": "authentication.administrator", "pk": 1, "fields": {"user": 5, "nip": "112021023739"}}, {"model": "authentication.administrator", "pk": 2, "fields": {"user": 14, "nip": "134984760197"}}, {"model": "authentication.administrator", "pk": 3, "fields": {"user": 39, "nip": "987654321"}}, {"model": "authentication.periode", "pk": 1, "fields": {"nama": "2018/2019 - Gasal"}}, {"model": "authentication.periode", "pk": 2, "fields": {"nama": "2018/2019 - Genap"}}, {"model": "authentication.periode", "pk": 3, "fields": {"nama": "2019/2020 - Gasal"}}, {"model": "authentication.periode", "pk": 4, "fields": {"nama": "2020/2021 - Genap"}}, {"model": "authentication.periode", "pk": 5, "fields": {"nama": "2020/2021 - Gasal"}}, {"model": "authentication.periode", "pk": 6, "fields": {"nama": "2019/2020 - Genap"}}, {"model": "authentication.mahasiswa", "pk": 23, "fields": {"user": 1, "org_code": "TEST", "npm": "1806253844", "faculty": "Fasilkom", "major": "CS", "program": "Test", "periode": 5, "supervisor_sekolah": 11, "supervisor_lembaga": 27}}, {"model": "authentication.mahasiswa", "pk": 61, "fields": {"user": 40, "org_code": "", "npm": "1806241085", "faculty": "", "major": "", "program": "", "periode": 1, "supervisor_sekolah": 38, "supervisor_lembaga": 27}}, {"model": "authentication.mahasiswa", "pk": 62, "fields": {"user": 41, "org_code": "", "npm": "1801801801", "faculty": "", "major": "", "program": "", "periode": 6, "supervisor_sekolah": 38, "supervisor_lembaga": 27}}, {"model": "authentication.koordinatorkuliah", "pk": 1, "fields": {"user": 4, "nip": "195595154900"}}, {"model": "authentication.koordinatorkuliah", "pk": 2, "fields": {"user": 13, "nip": "121526197823"}}, {"model": "authentication.koordinatorkuliah", "pk": 5, "fields": {"user": 30, "nip": "010203040506"}}, {"model": "authentication.koordinatorkuliah", "pk": 7, "fields": {"user": 20, "nip": "1029384756"}}, {"model": "authentication.koordinatorkuliah", "pk": 9, "fields": {"user": 27, "nip": "5647382910"}}, {"model": "authentication.koordinatorkuliah", "pk": 16, "fields": {"user": 39, "nip": "987654321"}}, {"model": "authentication.koordinatorkuliah", "pk": 17, "fields": {"user": 41, "nip": "1806173506"}}, {"model": "authentication.koordinatorkuliah", "pk": 18, "fields": {"user": 40, "nip": "111111111111"}}, {"model": "authentication.config", "pk": 1, "fields": {"key": "file_name_sheet_dosen", "value": "DataDosen.xlsx"}}, {"model": "authentication.config", "pk": 2, "fields": {"key": "file_date_sheet_dosen", "value": "10-Dec-2020 (21:25:27)"}}, {"model": "authentication.config", "pk": 3, "fields": {"key": "file_name_sheet_mahasiswa", "value": "DataMahasiswa.xlsx"}}, {"model": "authentication.config", "pk": 4, "fields": {"key": "file_date_sheet_mahasiswa", "value": "10-Dec-2020 (21:25:50)"}}, {"model": "laporan_praktikum.praktikum", "pk": 1, "fields": {"jenis_praktikum": "Praktikum 1"}}, {"model": "laporan_praktikum.praktikum", "pk": 2, "fields": {"jenis_praktikum": "Praktikum 2"}}, {"model": "laporan_praktikum.mahasiswapraktikum", "pk": 38, "fields": {"mahasiswa": 40, "list_praktikum": "Praktikum 1", "status": true}}, {"model": "laporan_praktikum.mahasiswapraktikum", "pk": 39, "fields": {"mahasiswa": 40, "list_praktikum": "Praktikum 2", "status": false}}, {"model": "laporan_praktikum.mahasiswapraktikum", "pk": 40, "fields": {"mahasiswa": 41, "list_praktikum": "Praktikum 1", "status": true}}, {"model": "laporan_praktikum.mahasiswapraktikum", "pk": 41, "fields": {"mahasiswa": 41, "list_praktikum": "Praktikum 2", "status": false}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 180, "fields": {"nama_laporan": "Laporan Minggu 1", "waktu_deadline": "2020-12-14T21:57:00", "waktu_submisi": "2020-12-10T21:57:30", "waktu_nilai_supv_sekolah": "2020-12-16T21:58:17", "waktu_nilai_supv_lembaga": "2020-12-16T22:26:14", "status_publikasi": true, "status_submisi": true, "skor_laporan_sekolah": 44, "skor_laporan_lembaga": 55, "mahasiswa": 40, "jenis_praktikum": "Praktikum 1", "link_submisi": "https://yandex.com"}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 181, "fields": {"nama_laporan": "Laporan Minggu 2", "waktu_deadline": "2020-12-22T22:08:00", "waktu_submisi": "2020-12-10T22:10:00", "waktu_nilai_supv_sekolah": "2020-12-23T22:11:26", "waktu_nilai_supv_lembaga": "2020-12-23T22:27:00", "status_publikasi": true, "status_submisi": true, "skor_laporan_sekolah": 67, "skor_laporan_lembaga": 70, "mahasiswa": 40, "jenis_praktikum": "Praktikum 1", "link_submisi": "http://www.google.com"}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 182, "fields": {"nama_laporan": "Laporan Minggu 3", "waktu_deadline": "2020-12-30T22:44:00", "waktu_submisi": "2020-12-10T22:48:00", "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": true, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 40, "jenis_praktikum": "Praktikum 1", "link_submisi": "1234qwer"}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 183, "fields": {"nama_laporan": "Laporan Minggu 4", "waktu_deadline": "2021-01-07T22:44:00", "waktu_submisi": "2020-12-11T00:27:00", "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": true, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 40, "jenis_praktikum": "Praktikum 1", "link_submisi": "-_-"}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 184, "fields": {"nama_laporan": "Laporan Minggu 5", "waktu_deadline": "2021-01-15T22:44:00", "waktu_submisi": null, "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": false, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 40, "jenis_praktikum": "Praktikum 1", "link_submisi": null}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 185, "fields": {"nama_laporan": "Laporan Minggu 6", "waktu_deadline": "2021-01-23T22:44:00", "waktu_submisi": null, "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": false, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 40, "jenis_praktikum": "Praktikum 1", "link_submisi": null}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 186, "fields": {"nama_laporan": "Laporan Minggu 7", "waktu_deadline": "2021-01-31T22:44:00", "waktu_submisi": null, "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": false, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 40, "jenis_praktikum": "Praktikum 1", "link_submisi": null}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 187, "fields": {"nama_laporan": "Laporan Minggu 8", "waktu_deadline": "2021-02-10T22:44:00", "waktu_submisi": null, "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": false, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 40, "jenis_praktikum": "Praktikum 1", "link_submisi": null}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 188, "fields": {"nama_laporan": "Laporan Minggu 9", "waktu_deadline": "2021-02-18T22:44:00", "waktu_submisi": null, "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": false, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 40, "jenis_praktikum": "Praktikum 1", "link_submisi": null}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 189, "fields": {"nama_laporan": "Laporan Minggu 10", "waktu_deadline": "2021-02-26T22:44:00", "waktu_submisi": null, "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": false, "skor_laporan_sekolah": -2, "skor_laporan_lembaga": -1, "mahasiswa": 40, "jenis_praktikum": "Praktikum 1", "link_submisi": null}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 190, "fields": {"nama_laporan": "Laporan Minggu 11", "waktu_deadline": "2021-03-06T22:44:00", "waktu_submisi": null, "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": false, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 40, "jenis_praktikum": "Praktikum 1", "link_submisi": null}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 191, "fields": {"nama_laporan": "Laporan Minggu 12", "waktu_deadline": "2021-03-20T22:44:00", "waktu_submisi": null, "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": false, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 40, "jenis_praktikum": "Praktikum 1", "link_submisi": null}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 192, "fields": {"nama_laporan": "Laporan Minggu 13", "waktu_deadline": "2021-03-31T22:44:00", "waktu_submisi": null, "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": false, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 40, "jenis_praktikum": "Praktikum 1", "link_submisi": null}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 193, "fields": {"nama_laporan": "Laporan Minggu 14", "waktu_deadline": "2021-04-07T22:44:00", "waktu_submisi": null, "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": false, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 40, "jenis_praktikum": "Praktikum 1", "link_submisi": null}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 194, "fields": {"nama_laporan": "Laporan Minggu 1", "waktu_deadline": "2020-12-14T22:51:00", "waktu_submisi": null, "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": false, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 41, "jenis_praktikum": "Praktikum 1", "link_submisi": null}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 195, "fields": {"nama_laporan": "Laporan Minggu 2", "waktu_deadline": "2020-12-22T22:51:00", "waktu_submisi": "2020-12-10T22:56:00", "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": true, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 41, "jenis_praktikum": "Praktikum 1", "link_submisi": "javascript:alert(\"xss\")"}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 196, "fields": {"nama_laporan": "Laporan Minggu 3", "waktu_deadline": "2020-12-30T22:51:00", "waktu_submisi": null, "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": false, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 41, "jenis_praktikum": "Praktikum 1", "link_submisi": null}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 197, "fields": {"nama_laporan": "Laporan Minggu 4", "waktu_deadline": "2021-01-07T22:51:00", "waktu_submisi": null, "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": false, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 41, "jenis_praktikum": "Praktikum 1", "link_submisi": null}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 198, "fields": {"nama_laporan": "Laporan Minggu 5", "waktu_deadline": "2021-01-15T22:51:00", "waktu_submisi": null, "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": false, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 41, "jenis_praktikum": "Praktikum 1", "link_submisi": null}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 199, "fields": {"nama_laporan": "Laporan Minggu 6", "waktu_deadline": "2021-01-23T22:51:00", "waktu_submisi": null, "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": false, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 41, "jenis_praktikum": "Praktikum 1", "link_submisi": null}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 200, "fields": {"nama_laporan": "Laporan Minggu 7", "waktu_deadline": "2021-01-31T22:51:00", "waktu_submisi": null, "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": false, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 41, "jenis_praktikum": "Praktikum 1", "link_submisi": null}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 201, "fields": {"nama_laporan": "Laporan Minggu 8", "waktu_deadline": "2021-02-08T22:51:00", "waktu_submisi": null, "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": false, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 41, "jenis_praktikum": "Praktikum 1", "link_submisi": null}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 202, "fields": {"nama_laporan": "Laporan Minggu 9", "waktu_deadline": "2021-02-16T22:51:00", "waktu_submisi": null, "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": false, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 41, "jenis_praktikum": "Praktikum 1", "link_submisi": null}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 203, "fields": {"nama_laporan": "Laporan Minggu 10", "waktu_deadline": "2021-02-24T22:51:00", "waktu_submisi": null, "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": false, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 41, "jenis_praktikum": "Praktikum 1", "link_submisi": null}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 204, "fields": {"nama_laporan": "Laporan Minggu 11", "waktu_deadline": "2021-03-04T22:51:00", "waktu_submisi": null, "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": false, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 41, "jenis_praktikum": "Praktikum 1", "link_submisi": null}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 205, "fields": {"nama_laporan": "Laporan Minggu 12", "waktu_deadline": "2021-03-12T22:51:00", "waktu_submisi": null, "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": false, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 41, "jenis_praktikum": "Praktikum 1", "link_submisi": null}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 206, "fields": {"nama_laporan": "Laporan Minggu 13", "waktu_deadline": "2021-03-20T22:51:00", "waktu_submisi": null, "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": false, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 41, "jenis_praktikum": "Praktikum 1", "link_submisi": null}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 207, "fields": {"nama_laporan": "Laporan Minggu 14", "waktu_deadline": "2021-03-31T22:51:00", "waktu_submisi": null, "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": false, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 41, "jenis_praktikum": "Praktikum 1", "link_submisi": null}}, {"model": "laporan_praktikum.laporanakhirpraktikum", "pk": 82, "fields": {"nama_laporan": "Laporan Akhir", "waktu_deadline": "2021-03-10T21:32:00", "waktu_submisi": "2020-12-10T21:35:00", "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": "2020-12-10T21:46:02.957", "status_publikasi": true, "status_submisi": true, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": 90, "mahasiswa": 40, "jenis_praktikum": "Praktikum 1", "lembaga": 8, "periode_praktikum": "2018/2019 - Gasal", "laporan_akhir": "Evaluasi_Praktikum_Revisi.doc", "profil_lembaga": "Evaluasi_Praktikum_Revisi_B4GZS1M.doc", "umpan_balik": " "}}, {"model": "laporan_praktikum.laporanakhirpraktikum", "pk": 83, "fields": {"nama_laporan": "Laporan Akhir", "waktu_deadline": "2021-05-28T17:51:00", "waktu_submisi": null, "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": false, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 41, "jenis_praktikum": "Praktikum 1", "lembaga": null, "periode_praktikum": " ", "laporan_akhir": "", "profil_lembaga": "", "umpan_balik": " "}}, {"model": "laporan_praktikum.laporanborangpraktikum", "pk": 70, "fields": {"nama_laporan": "Borang Penilaian Praktikum", "waktu_deadline": "2021-03-10T21:32:00", "waktu_submisi": "2020-12-10T21:36:00", "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": true, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 40, "jenis_praktikum": "Praktikum 1", "borang_supv_sekolah": "Evaluasi_Praktikum_Revisi_aoMPeoZ.doc", "borang_supv_lembaga": "Evaluasi_Praktikum_Revisi_wEyXQZX.doc", "borang_supv_perkuliahan": "Evaluasi_Praktikum_Revisi_iQIplQS.doc"}}, {"model": "laporan_praktikum.laporanborangpraktikum", "pk": 71, "fields": {"nama_laporan": "Borang Penilaian Praktikum", "waktu_deadline": "2021-03-26T22:51:00", "waktu_submisi": null, "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": false, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 41, "jenis_praktikum": "Praktikum 1", "borang_supv_sekolah": "", "borang_supv_lembaga": "", "borang_supv_perkuliahan": ""}}, {"model": "laporan_praktikum.templateborangpenilaianpraktikum", "pk": 1, "fields": {"supervisor_sekolah": 29, "t_borang_supv_sekolah": "budhidharma/t_borang_supv_sekolah/Ini_cumin_buat_percobaan_ppl.pdf", "t_borang_supv_lembaga": "budhidharma/t_borang_supv_sekolah/Ini_cumin_buat_percobaan_ppl_LcHoRmq.pdf", "t_borang_supv_perkuliahan": "budhidharma/t_borang_supv_sekolah/Ini_cumin_buat_percobaan_ppl_LbINhnu.pdf"}}, {"model": "laporan_praktikum.templateborangpenilaianpraktikum", "pk": 7, "fields": {"supervisor_sekolah": 38, "t_borang_supv_sekolah": "figo.muhammad/t_borang_supv_sekolah/test_template_borang.pdf", "t_borang_supv_lembaga": "figo.muhammad/t_borang_supv_sekolah/test_template_borang_GsOdevU.pdf", "t_borang_supv_perkuliahan": "figo.muhammad/t_borang_supv_sekolah/test_template_borang_3WwIOZ2.pdf"}}, {"model": "lembaga.institusi", "pk": 1, "fields": {"nama": "Government Organisation"}}, {"model": "lembaga.institusi", "pk": 2, "fields": {"nama": "Non Government Organisation"}}, {"model": "lembaga.institusi", "pk": 3, "fields": {"nama": "Komunitas"}}, {"model": "lembaga.institusi", "pk": 4, "fields": {"nama": "Perusahaan"}}, {"model": "lembaga.institusi", "pk": 5, "fields": {"nama": "Pendidikan"}}, {"model": "lembaga.tema", "pk": 1, "fields": {"nama": "Lingkungan"}}, {"model": "lembaga.tema", "pk": 2, "fields": {"nama": "HRD"}}, {"model": "lembaga.tema", "pk": 3, "fields": {"nama": "CSR "}}, {"model": "lembaga.tema", "pk": 4, "fields": {"nama": "Anak dan Remaja"}}, {"model": "lembaga.tema", "pk": 5, "fields": {"nama": "Lansia"}}, {"model": "lembaga.tema", "pk": 6, "fields": {"nama": "Disabilitas"}}, {"model": "lembaga.tema", "pk": 7, "fields": {"nama": "Gender/Perempuan"}}, {"model": "lembaga.tema", "pk": 8, "fields": {"nama": "Pemberdayaan Masyarakat"}}, {"model": "lembaga.tema", "pk": 9, "fields": {"nama": "Penanganan Kemiskinan"}}, {"model": "lembaga.tema", "pk": 10, "fields": {"nama": "Kesehatan"}}, {"model": "lembaga.tema", "pk": 11, "fields": {"nama": "Edukasi"}}, {"model": "lembaga.lingkupkerja", "pk": 6, "fields": {"nama": "Komputer"}}, {"model": "lembaga.lingkupkerja", "pk": 7, "fields": {"nama": "Edukasi"}}, {"model": "lembaga.lingkupkerja", "pk": 8, "fields": {"nama": "Bisnis"}}, {"model": "lembaga.lingkupkerja", "pk": 9, "fields": {"nama": "Jasa"}}, {"model": "lembaga.lembaga", "pk": 6, "fields": {"nama": "Siprak Institution", "jenis_pelayanan": "Edukasi", "institusi": 5, "tema": 8, "deskripsi_singkat": "Siprak institution adalah institusi yang mengedepankan selesainya projek PPL.", "beneficaries": "Pengguna", "alamat": "Jln. Margonda Raya", "praktikum_ke": 1, "lingkup_kerja": [7]}}, {"model": "lembaga.lembaga", "pk": 7, "fields": {"nama": "Bawa Paket", "jenis_pelayanan": "Jasa pengantaran barang", "institusi": 4, "tema": 8, "deskripsi_singkat": "Bawa Pakat adalah jasa pengiriman barang yang handal. Fransiscus Emmanuel Bunaren adalah Co-Founder dan CEO dari Bawa Paket.", "beneficaries": "Pengguna jasa bawa paket", "alamat": "Bekasi, Jawa Barat", "praktikum_ke": 2, "lingkup_kerja": [9]}}, {"model": "lembaga.lembaga", "pk": 8, "fields": {"nama": "Just For Challenge", "jenis_pelayanan": "Edukasi melalui challenge", "institusi": 3, "tema": 8, "deskripsi_singkat": "Just For Challenge adalah challenge XSS secara terbuka dan gratis. Challenge XSS di Just For Challenge adalah kasus nyata / real-world.", "beneficaries": "Pengguna yang ingin mempelajari XSS", "alamat": "Bekasi, Jawa Barat", "praktikum_ke": 1, "lingkup_kerja": [6, 7]}}, {"model": "lembaga.lembaga", "pk": 9, "fields": {"nama": "Go Get Gold Indonesia", "jenis_pelayanan": "Bisnis", "institusi": 4, "tema": 8, "deskripsi_singkat": "Go Get Gold Indonesia adalah start-up yang dibuat oleh mahasiswa Universitas Indonesia.", "beneficaries": "Pengguna Go Get Gold Indonesia", "alamat": "Jakarta Timur", "praktikum_ke": 2, "lingkup_kerja": [8]}}, {"model": "lembaga.lembaga", "pk": 10, "fields": {"nama": "Fakultas Ilmu Komputer UI", "jenis_pelayanan": "Edukasi", "institusi": 5, "tema": 8, "deskripsi_singkat": "Fakultas Ilmu Komputer UI adalah fakultas yang mempelajari hal-hal tentang bagaimana menyelesaikan suatu permasalahan secara komputasi. Fakultas Ilmu Komputer UI berada di Kampu UI Depok.", "beneficaries": "Mahasiswa Fasilkom UI", "alamat": "Jln. Raya Margonda, Kampus UI Depok", "praktikum_ke": 2, "lingkup_kerja": [7]}}, {"model": "lembaga.lembaga", "pk": 11, "fields": {"nama": "Yayasan Freons", "jenis_pelayanan": "Edukasi", "institusi": 3, "tema": 4, "deskripsi_singkat": "Yayasan Freons adalah yayasan yang di bentuk oleh komunitas Freons dimana anggota-anggota komunitas Freons sangat berbakat dalam dunia komputer.", "beneficaries": "Masyarakat", "alamat": "Depok", "praktikum_ke": 1, "lingkup_kerja": [7]}}, {"model": "lembaga.lembaga", "pk": 16, "fields": {"nama": "Yayasan Mengoding", "jenis_pelayanan": "Perusahaan", "institusi": 2, "tema": 11, "deskripsi_singkat": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. In posuere neque id posuere euismod.", "beneficaries": "Developers", "alamat": "Jl. Bambu Wulung No.7, RT.7/RW.5, Bambu Apus, Kec. Cipayung", "praktikum_ke": 1, "lingkup_kerja": [6, 7]}}] \ No newline at end of file diff --git a/new/docker-compose.yml b/new/docker-compose.yml deleted file mode 100644 index 141eb7c..0000000 --- a/new/docker-compose.yml +++ /dev/null @@ -1,31 +0,0 @@ -version: "3" -services: - db: - image: postgres - restart: always - environment: - POSTGRES_USER: ${POSTGRES_USER} - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} - POSTGRES_DB: ${POSTGRES_DB} - volumes: - - ~/postgres_data:/var/lib/postgresql/data - web: - build: ${DOCKER_APP_NAME} - command: > - bash -c "python3 manage.py makemigrations --settings=sip.settings.staging - && python3 manage.py migrate --settings=sip.settings.staging - && python3 manage.py runserver 0.0.0.0:9000 --settings=sip.settings.staging" - volumes: - - .:/app - - ./sip/settings/static:/app/static - environment: - SECRET_KEY: ${SECRET_KEY} - DB_NAME: ${DB_NAME} - DB_USER: ${DB_USER} - DB_PASS: ${DB_PASS} - DB_HOST: ${DB_HOST} - DB_PORT: ${DB_PORT} - ports: - - "8001:9000" - depends_on: - - db diff --git a/new/docker-entrypoint.sh b/new/docker-entrypoint.sh deleted file mode 100644 index 625ce90..0000000 --- a/new/docker-entrypoint.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh - -# Entry point spesific settings file -settings_entrypoint=$1 - -# Run using gunicorn from docker-entrypoint, bind to internal port 8080 -DJANGO_SETTINGS_MODULE=$settings_entrypoint gunicorn sip.wsgi:application --bind 0.0.0.0:8000 diff --git a/new/fixtures.json b/new/fixtures.json deleted file mode 100644 index 2dfbc1d..0000000 --- a/new/fixtures.json +++ /dev/null @@ -1 +0,0 @@ -[{"model": "lembaga.institusi", "pk": 1, "fields": {"nama": "Government Organisation"}}, {"model": "lembaga.institusi", "pk": 2, "fields": {"nama": "Non Government Organisation"}}, {"model": "lembaga.institusi", "pk": 3, "fields": {"nama": "Komunitas"}}, {"model": "lembaga.institusi", "pk": 4, "fields": {"nama": "Perusahaan"}}, {"model": "lembaga.institusi", "pk": 5, "fields": {"nama": "Pendidikan"}}, {"model": "lembaga.tema", "pk": 1, "fields": {"nama": "Lingkungan"}}, {"model": "lembaga.tema", "pk": 2, "fields": {"nama": "HRD"}}, {"model": "lembaga.tema", "pk": 3, "fields": {"nama": "CSR "}}, {"model": "lembaga.tema", "pk": 4, "fields": {"nama": "Anak dan Remaja"}}, {"model": "lembaga.tema", "pk": 5, "fields": {"nama": "Lansia"}}, {"model": "lembaga.tema", "pk": 6, "fields": {"nama": "Disabilitas"}}, {"model": "lembaga.tema", "pk": 7, "fields": {"nama": "Gender/Perempuan"}}, {"model": "lembaga.tema", "pk": 8, "fields": {"nama": "Pemberdayaan Masyarakat"}}, {"model": "lembaga.tema", "pk": 9, "fields": {"nama": "Penanganan Kemiskinan"}}, {"model": "lembaga.tema", "pk": 10, "fields": {"nama": "Kesehatan"}}, {"model": "lembaga.tema", "pk": 11, "fields": {"nama": "Edukasi"}}, {"model": "lembaga.lingkupkerja", "pk": 6, "fields": {"nama": "Komputer"}}, {"model": "lembaga.lingkupkerja", "pk": 7, "fields": {"nama": "Edukasi"}}, {"model": "lembaga.lingkupkerja", "pk": 8, "fields": {"nama": "Bisnis"}}, {"model": "lembaga.lingkupkerja", "pk": 9, "fields": {"nama": "Jasa"}}, {"model": "lembaga.lembaga", "pk": 6, "fields": {"nama": "Siprak Institution", "jenis_pelayanan": "Edukasi", "institusi": 5, "tema": 8, "deskripsi_singkat": "Siprak institution adalah institusi yang mengedepankan selesainya projek PPL.", "beneficaries": "Pengguna", "alamat": "Jln. Margonda Raya", "praktikum_ke": 1, "lingkup_kerja": [7]}}, {"model": "lembaga.lembaga", "pk": 7, "fields": {"nama": "Bawa Paket", "jenis_pelayanan": "Jasa pengantaran barang", "institusi": 4, "tema": 8, "deskripsi_singkat": "Bawa Pakat adalah jasa pengiriman barang yang handal. Fransiscus Emmanuel Bunaren adalah Co-Founder dan CEO dari Bawa Paket.", "beneficaries": "Pengguna jasa bawa paket", "alamat": "Bekasi, Jawa Barat", "praktikum_ke": 2, "lingkup_kerja": [9]}}, {"model": "lembaga.lembaga", "pk": 8, "fields": {"nama": "Just For Challenge", "jenis_pelayanan": "Edukasi melalui challenge", "institusi": 3, "tema": 8, "deskripsi_singkat": "Just For Challenge adalah challenge XSS secara terbuka dan gratis. Challenge XSS di Just For Challenge adalah kasus nyata / real-world.", "beneficaries": "Pengguna yang ingin mempelajari XSS", "alamat": "Bekasi, Jawa Barat", "praktikum_ke": 1, "lingkup_kerja": [6]}}, {"model": "lembaga.lembaga", "pk": 9, "fields": {"nama": "Go Get Gold Indonesia", "jenis_pelayanan": "Bisnis", "institusi": 4, "tema": 8, "deskripsi_singkat": "Go Get Gold Indonesia adalah start-up yang dibuat oleh mahasiswa Universitas Indonesia.", "beneficaries": "Pengguna Go Get Gold Indonesia", "alamat": "Jakarta Timur", "praktikum_ke": 2, "lingkup_kerja": [8]}}, {"model": "lembaga.lembaga", "pk": 10, "fields": {"nama": "Fakultas Ilmu Komputer UI", "jenis_pelayanan": "Edukasi", "institusi": 5, "tema": 8, "deskripsi_singkat": "Fakultas Ilmu Komputer UI adalah fakultas yang mempelajari hal-hal tentang bagaimana menyelesaikan suatu permasalahan secara komputasi. Fakultas Ilmu Komputer UI berada di Kampu UI Depok.", "beneficaries": "Mahasiswa Fasilkom UI", "alamat": "Jln. Raya Margonda, Kampus UI Depok", "praktikum_ke": 2, "lingkup_kerja": [7]}}, {"model": "lembaga.lembaga", "pk": 11, "fields": {"nama": "Yayasan Freons", "jenis_pelayanan": "Edukasi", "institusi": 3, "tema": 4, "deskripsi_singkat": "Yayasan Freons adalah yayasan yang di bentuk oleh komunitas Freons dimana anggota-anggota komunitas Freons sangat berbakat dalam dunia komputer.", "beneficaries": "Masyarakat", "alamat": "Depok", "praktikum_ke": 1, "lingkup_kerja": [7]}}, {"model": "lembaga.lembaga", "pk": 16, "fields": {"nama": "Yayasan Mengoding", "jenis_pelayanan": "Perusahaan", "institusi": 2, "tema": 11, "deskripsi_singkat": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. In posuere neque id posuere euismod.", "beneficaries": "Developers", "alamat": "Jl. Bambu Wulung No.7, RT.7/RW.5, Bambu Apus, Kec. Cipayung", "praktikum_ke": 1, "lingkup_kerja": [6, 7]}}, {"model": "laporan_praktikum.praktikum", "pk": 1, "fields": {"jenis_praktikum": "Praktikum 1"}}, {"model": "laporan_praktikum.praktikum", "pk": 2, "fields": {"jenis_praktikum": "Praktikum 2"}}, {"model": "laporan_praktikum.mahasiswapraktikum", "pk": 25, "fields": {"mahasiswa": 28, "list_praktikum": "Praktikum 2", "status": true}}, {"model": "laporan_praktikum.mahasiswapraktikum", "pk": 26, "fields": {"mahasiswa": 22, "list_praktikum": "Praktikum 1", "status": true}}, {"model": "laporan_praktikum.mahasiswapraktikum", "pk": 27, "fields": {"mahasiswa": 25, "list_praktikum": "Praktikum 1", "status": true}}, {"model": "laporan_praktikum.mahasiswapraktikum", "pk": 28, "fields": {"mahasiswa": 26, "list_praktikum": "Praktikum 2", "status": true}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 65, "fields": {"nama_laporan": "laporan praktikum fransiscus.emmanuel", "waktu_deadline": "2020-11-25T16:23:07", "waktu_submisi": "2020-11-24T16:23:08", "waktu_nilai_supv_sekolah": "2020-12-04T03:47:31", "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": true, "skor_laporan_sekolah": 98, "skor_laporan_lembaga": -1, "mahasiswa": 28, "jenis_praktikum": "Praktikum 2", "link_submisi": "https://duckduckgo.com"}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 68, "fields": {"nama_laporan": "laporan mingguan figo", "waktu_deadline": "2020-12-07T14:33:39", "waktu_submisi": "2020-12-07T21:56:00", "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": true, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 25, "jenis_praktikum": "Praktikum 1", "link_submisi": "http://www.google.com"}}, {"model": "laporan_praktikum.kelolalaporanpraktikum", "pk": 70, "fields": {"nama_laporan": "laporan mingguan 2 harold", "waktu_deadline": "2020-12-05T15:47:31", "waktu_submisi": "2020-12-04T23:06:00", "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": true, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 22, "jenis_praktikum": "Praktikum 1", "link_submisi": "javascript:document.write(\"\")"}}, {"model": "laporan_praktikum.laporanakhirpraktikum", "pk": 34, "fields": {"nama_laporan": "laporan akhir edina", "waktu_deadline": "2020-12-07T14:20:41", "waktu_submisi": "2020-12-06T14:20:42", "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": true, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 26, "jenis_praktikum": "Praktikum 2", "lembaga": 8, "periode_praktikum": "test", "laporan_akhir": "ppl.docx", "profil_lembaga": "ppl_RkIEk0K.docx", "umpan_balik": ""}}, {"model": "laporan_praktikum.laporanborangpraktikum", "pk": 25, "fields": {"nama_laporan": "laporan borang fransiscus.emmanuel", "waktu_deadline": "2020-11-25T16:19:19", "waktu_submisi": "2020-11-24T16:19:21", "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": true, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 28, "jenis_praktikum": "Praktikum 2", "borang_supv_sekolah": "Ini_cumin_buat_percobaan_ppl_oDVE20I.pdf", "borang_supv_lembaga": "Ini_cumin_buat_percobaan_ppl_Q4R9Y8N.pdf", "borang_supv_perkuliahan": "Ini_cumin_buat_percobaan_ppl_ze3ImM7.pdf"}}, {"model": "laporan_praktikum.laporanborangpraktikum", "pk": 28, "fields": {"nama_laporan": "laporan harold", "waktu_deadline": "2020-11-30T14:48:19", "waktu_submisi": "2020-11-30T23:13:00", "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": true, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 22, "jenis_praktikum": "Praktikum 1", "borang_supv_sekolah": "ppl_kXWC2BW.pdf", "borang_supv_lembaga": "ppl.docx", "borang_supv_perkuliahan": "tutorial.erl"}}, {"model": "laporan_praktikum.laporanborangpraktikum", "pk": 29, "fields": {"nama_laporan": "laporan borang figo", "waktu_deadline": "2020-12-02T13:42:58", "waktu_submisi": "2020-12-07T21:45:00", "waktu_nilai_supv_sekolah": null, "waktu_nilai_supv_lembaga": null, "status_publikasi": true, "status_submisi": true, "skor_laporan_sekolah": -1, "skor_laporan_lembaga": -1, "mahasiswa": 25, "jenis_praktikum": "Praktikum 1", "borang_supv_sekolah": "[object Object]", "borang_supv_lembaga": "[object Object]", "borang_supv_perkuliahan": "[object Object]"}}, {"model": "laporan_praktikum.templateborangpenilaianpraktikum", "pk": 1, "fields": {"supervisor_sekolah": 29, "t_borang_supv_sekolah": "budhidharma/t_borang_supv_sekolah/Ini_cumin_buat_percobaan_ppl.pdf", "t_borang_supv_lembaga": "budhidharma/t_borang_supv_sekolah/Ini_cumin_buat_percobaan_ppl_LcHoRmq.pdf", "t_borang_supv_perkuliahan": "budhidharma/t_borang_supv_sekolah/Ini_cumin_buat_percobaan_ppl_LbINhnu.pdf"}}, {"model": "laporan_praktikum.templateborangpenilaianpraktikum", "pk": 2, "fields": {"supervisor_sekolah": 25, "t_borang_supv_sekolah": "figo.muhammad/t_borang_supv_sekolah/Ini_cumin_buat_percobaan_ppl.pdf", "t_borang_supv_lembaga": "figo.muhammad/t_borang_supv_sekolah/Ini_cumin_buat_percobaan_ppl_t1kL9AS.pdf", "t_borang_supv_perkuliahan": "figo.muhammad/t_borang_supv_sekolah/Ini_cumin_buat_percobaan_ppl_gBq4285.pdf"}}, {"model": "laporan_praktikum.templateborangpenilaianpraktikum", "pk": 3, "fields": {"supervisor_sekolah": 22, "t_borang_supv_sekolah": "harold.hotma/t_borang_supv_sekolah/tutorial.erl", "t_borang_supv_lembaga": "harold.hotma/t_borang_supv_sekolah/tutorial.beam", "t_borang_supv_perkuliahan": "harold.hotma/t_borang_supv_sekolah/ppl.docx"}}, {"model": "authentication.supervisorsekolah", "pk": 1, "fields": {"user": 2, "nip": "165587668158"}}, {"model": "authentication.supervisorsekolah", "pk": 2, "fields": {"user": 11, "nip": "171095499117"}}, {"model": "authentication.supervisorsekolah", "pk": 3, "fields": {"user": 20, "nip": "112233445566"}}, {"model": "authentication.supervisorsekolah", "pk": 5, "fields": {"user": 29, "nip": "102030405060"}}, {"model": "authentication.supervisorsekolah", "pk": 6, "fields": {"user": 30, "nip": "010203040506"}}, {"model": "authentication.supervisorsekolah", "pk": 7, "fields": {"user": 25, "nip": "1111100000"}}, {"model": "authentication.supervisorsekolah", "pk": 8, "fields": {"user": 22, "nip": "112233445566"}}, {"model": "authentication.supervisorlembaga", "pk": 4, "fields": {"user": 27, "lembaga": 8, "jabatan": "CEO"}}, {"model": "authentication.administrator", "pk": 1, "fields": {"user": 5, "nip": "112021023739"}}, {"model": "authentication.administrator", "pk": 2, "fields": {"user": 14, "nip": "134984760197"}}, {"model": "authentication.periode", "pk": 1, "fields": {"nama": "2018/2019 - Gasal"}}, {"model": "authentication.periode", "pk": 2, "fields": {"nama": "2018/2019 - Genap"}}, {"model": "authentication.periode", "pk": 3, "fields": {"nama": "2019/2020 - Gasal"}}, {"model": "authentication.periode", "pk": 4, "fields": {"nama": "2020/2021 - Genap"}}, {"model": "authentication.periode", "pk": 5, "fields": {"nama": "2020/2021 - Gasal"}}, {"model": "authentication.mahasiswa", "pk": 19, "fields": {"user": 22, "org_code": "", "npm": "1806241085", "faculty": "Ilmu Komputer", "major": "Ilmu Komputer", "program": "S1 Kls Internasional", "periode": 1, "supervisor_sekolah": 22, "supervisor_lembaga": 27}}, {"model": "authentication.mahasiswa", "pk": 20, "fields": {"user": 28, "org_code": "Test", "npm": "1806253844", "faculty": "Fasilkom", "major": "CS", "program": "Test", "periode": 1, "supervisor_sekolah": 25, "supervisor_lembaga": 27}}, {"model": "authentication.mahasiswa", "pk": 21, "fields": {"user": 25, "org_code": "test", "npm": "12341234", "faculty": "a", "major": "a", "program": "a", "periode": 5, "supervisor_sekolah": 25, "supervisor_lembaga": 27}}, {"model": "authentication.mahasiswa", "pk": 22, "fields": {"user": 26, "org_code": "test", "npm": "12345", "faculty": "test", "major": "t", "program": "t", "periode": 4, "supervisor_sekolah": 22, "supervisor_lembaga": 27}}, {"model": "authentication.koordinatorkuliah", "pk": 1, "fields": {"user": 4, "nip": "195595154900"}}, {"model": "authentication.koordinatorkuliah", "pk": 2, "fields": {"user": 13, "nip": "121526197823"}}, {"model": "authentication.koordinatorkuliah", "pk": 5, "fields": {"user": 30, "nip": "010203040506"}}, {"model": "authentication.koordinatorkuliah", "pk": 7, "fields": {"user": 20, "nip": "1029384756"}}, {"model": "authentication.koordinatorkuliah", "pk": 8, "fields": {"user": 31, "nip": "123456123456"}}, {"model": "authentication.koordinatorkuliah", "pk": 9, "fields": {"user": 27, "nip": "5647382910"}}, {"model": "authentication.koordinatorkuliah", "pk": 10, "fields": {"user": 28, "nip": "1806173506"}}, {"model": "authentication.koordinatorkuliah", "pk": 11, "fields": {"user": 26, "nip": "180180180180"}}, {"model": "authentication.koordinatorkuliah", "pk": 12, "fields": {"user": 25, "nip": "1029384756"}}, {"model": "authentication.koordinatorkuliah", "pk": 13, "fields": {"user": 22, "nip": "17243192487"}}, {"model": "auth.permission", "pk": 1, "fields": {"name": "Can add log entry", "content_type": 1, "codename": "add_logentry"}}, {"model": "auth.permission", "pk": 2, "fields": {"name": "Can change log entry", "content_type": 1, "codename": "change_logentry"}}, {"model": "auth.permission", "pk": 3, "fields": {"name": "Can delete log entry", "content_type": 1, "codename": "delete_logentry"}}, {"model": "auth.permission", "pk": 4, "fields": {"name": "Can view log entry", "content_type": 1, "codename": "view_logentry"}}, {"model": "auth.permission", "pk": 5, "fields": {"name": "Can add permission", "content_type": 2, "codename": "add_permission"}}, {"model": "auth.permission", "pk": 6, "fields": {"name": "Can change permission", "content_type": 2, "codename": "change_permission"}}, {"model": "auth.permission", "pk": 7, "fields": {"name": "Can delete permission", "content_type": 2, "codename": "delete_permission"}}, {"model": "auth.permission", "pk": 8, "fields": {"name": "Can view permission", "content_type": 2, "codename": "view_permission"}}, {"model": "auth.permission", "pk": 9, "fields": {"name": "Can add group", "content_type": 3, "codename": "add_group"}}, {"model": "auth.permission", "pk": 10, "fields": {"name": "Can change group", "content_type": 3, "codename": "change_group"}}, {"model": "auth.permission", "pk": 11, "fields": {"name": "Can delete group", "content_type": 3, "codename": "delete_group"}}, {"model": "auth.permission", "pk": 12, "fields": {"name": "Can view group", "content_type": 3, "codename": "view_group"}}, {"model": "auth.permission", "pk": 13, "fields": {"name": "Can add user", "content_type": 4, "codename": "add_user"}}, {"model": "auth.permission", "pk": 14, "fields": {"name": "Can change user", "content_type": 4, "codename": "change_user"}}, {"model": "auth.permission", "pk": 15, "fields": {"name": "Can delete user", "content_type": 4, "codename": "delete_user"}}, {"model": "auth.permission", "pk": 16, "fields": {"name": "Can view user", "content_type": 4, "codename": "view_user"}}, {"model": "auth.permission", "pk": 17, "fields": {"name": "Can add content type", "content_type": 5, "codename": "add_contenttype"}}, {"model": "auth.permission", "pk": 18, "fields": {"name": "Can change content type", "content_type": 5, "codename": "change_contenttype"}}, {"model": "auth.permission", "pk": 19, "fields": {"name": "Can delete content type", "content_type": 5, "codename": "delete_contenttype"}}, {"model": "auth.permission", "pk": 20, "fields": {"name": "Can view content type", "content_type": 5, "codename": "view_contenttype"}}, {"model": "auth.permission", "pk": 21, "fields": {"name": "Can add session", "content_type": 6, "codename": "add_session"}}, {"model": "auth.permission", "pk": 22, "fields": {"name": "Can change session", "content_type": 6, "codename": "change_session"}}, {"model": "auth.permission", "pk": 23, "fields": {"name": "Can delete session", "content_type": 6, "codename": "delete_session"}}, {"model": "auth.permission", "pk": 24, "fields": {"name": "Can view session", "content_type": 6, "codename": "view_session"}}, {"model": "auth.permission", "pk": 25, "fields": {"name": "Can add institusi", "content_type": 7, "codename": "add_institusi"}}, {"model": "auth.permission", "pk": 26, "fields": {"name": "Can change institusi", "content_type": 7, "codename": "change_institusi"}}, {"model": "auth.permission", "pk": 27, "fields": {"name": "Can delete institusi", "content_type": 7, "codename": "delete_institusi"}}, {"model": "auth.permission", "pk": 28, "fields": {"name": "Can view institusi", "content_type": 7, "codename": "view_institusi"}}, {"model": "auth.permission", "pk": 29, "fields": {"name": "Can add lingkup kerja", "content_type": 8, "codename": "add_lingkupkerja"}}, {"model": "auth.permission", "pk": 30, "fields": {"name": "Can change lingkup kerja", "content_type": 8, "codename": "change_lingkupkerja"}}, {"model": "auth.permission", "pk": 31, "fields": {"name": "Can delete lingkup kerja", "content_type": 8, "codename": "delete_lingkupkerja"}}, {"model": "auth.permission", "pk": 32, "fields": {"name": "Can view lingkup kerja", "content_type": 8, "codename": "view_lingkupkerja"}}, {"model": "auth.permission", "pk": 33, "fields": {"name": "Can add tema", "content_type": 9, "codename": "add_tema"}}, {"model": "auth.permission", "pk": 34, "fields": {"name": "Can change tema", "content_type": 9, "codename": "change_tema"}}, {"model": "auth.permission", "pk": 35, "fields": {"name": "Can delete tema", "content_type": 9, "codename": "delete_tema"}}, {"model": "auth.permission", "pk": 36, "fields": {"name": "Can view tema", "content_type": 9, "codename": "view_tema"}}, {"model": "auth.permission", "pk": 37, "fields": {"name": "Can add lembaga", "content_type": 10, "codename": "add_lembaga"}}, {"model": "auth.permission", "pk": 38, "fields": {"name": "Can change lembaga", "content_type": 10, "codename": "change_lembaga"}}, {"model": "auth.permission", "pk": 39, "fields": {"name": "Can delete lembaga", "content_type": 10, "codename": "delete_lembaga"}}, {"model": "auth.permission", "pk": 40, "fields": {"name": "Can view lembaga", "content_type": 10, "codename": "view_lembaga"}}, {"model": "auth.permission", "pk": 41, "fields": {"name": "Can add praktikum", "content_type": 11, "codename": "add_praktikum"}}, {"model": "auth.permission", "pk": 42, "fields": {"name": "Can change praktikum", "content_type": 11, "codename": "change_praktikum"}}, {"model": "auth.permission", "pk": 43, "fields": {"name": "Can delete praktikum", "content_type": 11, "codename": "delete_praktikum"}}, {"model": "auth.permission", "pk": 44, "fields": {"name": "Can view praktikum", "content_type": 11, "codename": "view_praktikum"}}, {"model": "auth.permission", "pk": 45, "fields": {"name": "Can add template borang penilaian praktikum", "content_type": 12, "codename": "add_templateborangpenilaianpraktikum"}}, {"model": "auth.permission", "pk": 46, "fields": {"name": "Can change template borang penilaian praktikum", "content_type": 12, "codename": "change_templateborangpenilaianpraktikum"}}, {"model": "auth.permission", "pk": 47, "fields": {"name": "Can delete template borang penilaian praktikum", "content_type": 12, "codename": "delete_templateborangpenilaianpraktikum"}}, {"model": "auth.permission", "pk": 48, "fields": {"name": "Can view template borang penilaian praktikum", "content_type": 12, "codename": "view_templateborangpenilaianpraktikum"}}, {"model": "auth.permission", "pk": 49, "fields": {"name": "Can add mahasiswa praktikum", "content_type": 13, "codename": "add_mahasiswapraktikum"}}, {"model": "auth.permission", "pk": 50, "fields": {"name": "Can change mahasiswa praktikum", "content_type": 13, "codename": "change_mahasiswapraktikum"}}, {"model": "auth.permission", "pk": 51, "fields": {"name": "Can delete mahasiswa praktikum", "content_type": 13, "codename": "delete_mahasiswapraktikum"}}, {"model": "auth.permission", "pk": 52, "fields": {"name": "Can view mahasiswa praktikum", "content_type": 13, "codename": "view_mahasiswapraktikum"}}, {"model": "auth.permission", "pk": 53, "fields": {"name": "Can add laporan borang praktikum", "content_type": 14, "codename": "add_laporanborangpraktikum"}}, {"model": "auth.permission", "pk": 54, "fields": {"name": "Can change laporan borang praktikum", "content_type": 14, "codename": "change_laporanborangpraktikum"}}, {"model": "auth.permission", "pk": 55, "fields": {"name": "Can delete laporan borang praktikum", "content_type": 14, "codename": "delete_laporanborangpraktikum"}}, {"model": "auth.permission", "pk": 56, "fields": {"name": "Can view laporan borang praktikum", "content_type": 14, "codename": "view_laporanborangpraktikum"}}, {"model": "auth.permission", "pk": 57, "fields": {"name": "Can add laporan akhir praktikum", "content_type": 15, "codename": "add_laporanakhirpraktikum"}}, {"model": "auth.permission", "pk": 58, "fields": {"name": "Can change laporan akhir praktikum", "content_type": 15, "codename": "change_laporanakhirpraktikum"}}, {"model": "auth.permission", "pk": 59, "fields": {"name": "Can delete laporan akhir praktikum", "content_type": 15, "codename": "delete_laporanakhirpraktikum"}}, {"model": "auth.permission", "pk": 60, "fields": {"name": "Can view laporan akhir praktikum", "content_type": 15, "codename": "view_laporanakhirpraktikum"}}, {"model": "auth.permission", "pk": 61, "fields": {"name": "Can add kelola laporan praktikum", "content_type": 16, "codename": "add_kelolalaporanpraktikum"}}, {"model": "auth.permission", "pk": 62, "fields": {"name": "Can change kelola laporan praktikum", "content_type": 16, "codename": "change_kelolalaporanpraktikum"}}, {"model": "auth.permission", "pk": 63, "fields": {"name": "Can delete kelola laporan praktikum", "content_type": 16, "codename": "delete_kelolalaporanpraktikum"}}, {"model": "auth.permission", "pk": 64, "fields": {"name": "Can view kelola laporan praktikum", "content_type": 16, "codename": "view_kelolalaporanpraktikum"}}, {"model": "auth.permission", "pk": 65, "fields": {"name": "Can add proxy granting ticket", "content_type": 17, "codename": "add_proxygrantingticket"}}, {"model": "auth.permission", "pk": 66, "fields": {"name": "Can change proxy granting ticket", "content_type": 17, "codename": "change_proxygrantingticket"}}, {"model": "auth.permission", "pk": 67, "fields": {"name": "Can delete proxy granting ticket", "content_type": 17, "codename": "delete_proxygrantingticket"}}, {"model": "auth.permission", "pk": 68, "fields": {"name": "Can view proxy granting ticket", "content_type": 17, "codename": "view_proxygrantingticket"}}, {"model": "auth.permission", "pk": 69, "fields": {"name": "Can add session ticket", "content_type": 18, "codename": "add_sessionticket"}}, {"model": "auth.permission", "pk": 70, "fields": {"name": "Can change session ticket", "content_type": 18, "codename": "change_sessionticket"}}, {"model": "auth.permission", "pk": 71, "fields": {"name": "Can delete session ticket", "content_type": 18, "codename": "delete_sessionticket"}}, {"model": "auth.permission", "pk": 72, "fields": {"name": "Can view session ticket", "content_type": 18, "codename": "view_sessionticket"}}, {"model": "auth.permission", "pk": 73, "fields": {"name": "Can add cors model", "content_type": 19, "codename": "add_corsmodel"}}, {"model": "auth.permission", "pk": 74, "fields": {"name": "Can change cors model", "content_type": 19, "codename": "change_corsmodel"}}, {"model": "auth.permission", "pk": 75, "fields": {"name": "Can delete cors model", "content_type": 19, "codename": "delete_corsmodel"}}, {"model": "auth.permission", "pk": 76, "fields": {"name": "Can view cors model", "content_type": 19, "codename": "view_corsmodel"}}, {"model": "auth.permission", "pk": 77, "fields": {"name": "Can add periode", "content_type": 20, "codename": "add_periode"}}, {"model": "auth.permission", "pk": 78, "fields": {"name": "Can change periode", "content_type": 20, "codename": "change_periode"}}, {"model": "auth.permission", "pk": 79, "fields": {"name": "Can delete periode", "content_type": 20, "codename": "delete_periode"}}, {"model": "auth.permission", "pk": 80, "fields": {"name": "Can view periode", "content_type": 20, "codename": "view_periode"}}, {"model": "auth.permission", "pk": 81, "fields": {"name": "Can add supervisor_sekolah", "content_type": 21, "codename": "add_supervisorsekolah"}}, {"model": "auth.permission", "pk": 82, "fields": {"name": "Can change supervisor_sekolah", "content_type": 21, "codename": "change_supervisorsekolah"}}, {"model": "auth.permission", "pk": 83, "fields": {"name": "Can delete supervisor_sekolah", "content_type": 21, "codename": "delete_supervisorsekolah"}}, {"model": "auth.permission", "pk": 84, "fields": {"name": "Can view supervisor_sekolah", "content_type": 21, "codename": "view_supervisorsekolah"}}, {"model": "auth.permission", "pk": 85, "fields": {"name": "Can add supervisor_lembaga", "content_type": 22, "codename": "add_supervisorlembaga"}}, {"model": "auth.permission", "pk": 86, "fields": {"name": "Can change supervisor_lembaga", "content_type": 22, "codename": "change_supervisorlembaga"}}, {"model": "auth.permission", "pk": 87, "fields": {"name": "Can delete supervisor_lembaga", "content_type": 22, "codename": "delete_supervisorlembaga"}}, {"model": "auth.permission", "pk": 88, "fields": {"name": "Can view supervisor_lembaga", "content_type": 22, "codename": "view_supervisorlembaga"}}, {"model": "auth.permission", "pk": 89, "fields": {"name": "Can add mahasiswa", "content_type": 23, "codename": "add_mahasiswa"}}, {"model": "auth.permission", "pk": 90, "fields": {"name": "Can change mahasiswa", "content_type": 23, "codename": "change_mahasiswa"}}, {"model": "auth.permission", "pk": 91, "fields": {"name": "Can delete mahasiswa", "content_type": 23, "codename": "delete_mahasiswa"}}, {"model": "auth.permission", "pk": 92, "fields": {"name": "Can view mahasiswa", "content_type": 23, "codename": "view_mahasiswa"}}, {"model": "auth.permission", "pk": 93, "fields": {"name": "Can add koordinator_kuliah", "content_type": 24, "codename": "add_koordinatorkuliah"}}, {"model": "auth.permission", "pk": 94, "fields": {"name": "Can change koordinator_kuliah", "content_type": 24, "codename": "change_koordinatorkuliah"}}, {"model": "auth.permission", "pk": 95, "fields": {"name": "Can delete koordinator_kuliah", "content_type": 24, "codename": "delete_koordinatorkuliah"}}, {"model": "auth.permission", "pk": 96, "fields": {"name": "Can view koordinator_kuliah", "content_type": 24, "codename": "view_koordinatorkuliah"}}, {"model": "auth.permission", "pk": 97, "fields": {"name": "Can add administrator", "content_type": 25, "codename": "add_administrator"}}, {"model": "auth.permission", "pk": 98, "fields": {"name": "Can change administrator", "content_type": 25, "codename": "change_administrator"}}, {"model": "auth.permission", "pk": 99, "fields": {"name": "Can delete administrator", "content_type": 25, "codename": "delete_administrator"}}, {"model": "auth.permission", "pk": 100, "fields": {"name": "Can view administrator", "content_type": 25, "codename": "view_administrator"}}, {"model": "auth.permission", "pk": 101, "fields": {"name": "Can add config", "content_type": 26, "codename": "add_config"}}, {"model": "auth.permission", "pk": 102, "fields": {"name": "Can change config", "content_type": 26, "codename": "change_config"}}, {"model": "auth.permission", "pk": 103, "fields": {"name": "Can delete config", "content_type": 26, "codename": "delete_config"}}, {"model": "auth.permission", "pk": 104, "fields": {"name": "Can view config", "content_type": 26, "codename": "view_config"}}, {"model": "auth.user", "pk": 1, "fields": {"password": "pbkdf2_sha256$180000$gGA9mE6UnbLn$nckdEWY0cQXuLE7n9yRayyzQr0ueUGM8ALq9p1xXYS8=", "last_login": null, "is_superuser": false, "username": "username_user0", "first_name": "full_name", "last_name": "user0", "email": "email_user0@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:50:53.124", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 2, "fields": {"password": "pbkdf2_sha256$180000$HnOHoadGL9so$VVzA0gURanYPKxV4xD+n2UOTAGWElhCjl68BaNidXtA=", "last_login": null, "is_superuser": false, "username": "username_user1", "first_name": "full_name", "last_name": "user1", "email": "email_user1@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:50:54.036", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 3, "fields": {"password": "pbkdf2_sha256$216000$8PdvCVmsebKU$9R3aYf/YOk0If5vyemqxEuMj1dzDEsD7+FtEgQNuvF0=", "last_login": "2020-11-24T11:12:58.698", "is_superuser": false, "username": "username_user2", "first_name": "full_name", "last_name": "user2", "email": "email_user2@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:50:54.869", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 4, "fields": {"password": "pbkdf2_sha256$180000$MokG4FPUyUHX$HIbInbI7v/1nHF2bBA4sm9QqS2mmDM8Yny/0o4lbUug=", "last_login": null, "is_superuser": false, "username": "username_user3", "first_name": "full_name", "last_name": "user3", "email": "email_user3@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:50:55.700", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 5, "fields": {"password": "pbkdf2_sha256$216000$3ZJodURWW0mE$OMhIpxXHreu0Bwnhol3klbSrk2gTg9nH+Vo1xluldH8=", "last_login": "2020-12-07T15:43:26.791", "is_superuser": false, "username": "username_user4", "first_name": "full_name", "last_name": "user4", "email": "email_user4@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:50:56.536", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 6, "fields": {"password": "pbkdf2_sha256$180000$OGPwEIvDaQpn$MpMirE37sbv4l8+MMxvLWuoBtoiU3XdnCcWvtm8nOtw=", "last_login": null, "is_superuser": false, "username": "username_user5", "first_name": "full_name", "last_name": "user5", "email": "email_user5@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:50:57.369", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 7, "fields": {"password": "pbkdf2_sha256$180000$uw1ZxF1ekG4R$Lx4QM/Yzeb+9GV4DNdqridQ0GYMirblLa6CiwGBXvGU=", "last_login": null, "is_superuser": false, "username": "username_user6", "first_name": "full_name", "last_name": "user6", "email": "email_user6@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:50:58.265", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 8, "fields": {"password": "pbkdf2_sha256$180000$I3kjTz50yrr3$mJuhi+aPjKyRY3aOfiwwTRup6erpoZ9T1md1+cJqmIw=", "last_login": null, "is_superuser": false, "username": "username_user7", "first_name": "full_name", "last_name": "user7", "email": "email_user7@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:50:59.097", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 9, "fields": {"password": "pbkdf2_sha256$180000$yAo6GcxIhc1y$R/V1o/t0EhamLyTeB07RSUKbJ4lhY55r6gxjYaUiHNs=", "last_login": null, "is_superuser": false, "username": "username_user8", "first_name": "full_name", "last_name": "user8", "email": "email_user8@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:50:59.931", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 10, "fields": {"password": "pbkdf2_sha256$180000$7WcEdc7zaHAT$Lvymu2SleGcSbIBukEZwVDfakeJbxS2YjEPQdQHG47w=", "last_login": null, "is_superuser": false, "username": "username_user9", "first_name": "full_name", "last_name": "user9", "email": "email_user9@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:51:00.774", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 11, "fields": {"password": "pbkdf2_sha256$180000$xnVPV2ZzTqDl$FRDz3kyHGzkO7lC3/cF5C67Nq78qI6JrhZXlQSmBGwE=", "last_login": null, "is_superuser": false, "username": "username_user10", "first_name": "full_name", "last_name": "user10", "email": "email_user10@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:51:01.599", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 12, "fields": {"password": "pbkdf2_sha256$180000$H0NAv6Aw3N2p$rTEpGIoTo0ZskQdj4GRDIBvX4fVHK8vmo4UtB+rqAnI=", "last_login": null, "is_superuser": false, "username": "username_user11", "first_name": "full_name", "last_name": "user11", "email": "email_user11@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:51:02.418", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 13, "fields": {"password": "pbkdf2_sha256$180000$IjzYPJljYSbZ$/n4Wkic3dJ3P/VDuuoHZYXXrmx/AmV5WxmaLD60QY8s=", "last_login": null, "is_superuser": false, "username": "username_user12", "first_name": "full_name", "last_name": "user12", "email": "email_user12@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:51:03.228", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 14, "fields": {"password": "pbkdf2_sha256$180000$hlQzbTRy3aLw$cI9K0qMh8+xs201WgoLlbv9bYD+8Kw0zQr6Ddc0SCx4=", "last_login": null, "is_superuser": false, "username": "username_user13", "first_name": "full_name", "last_name": "user13", "email": "email_user13@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:51:04.054", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 15, "fields": {"password": "pbkdf2_sha256$180000$m1syz139kpUw$+QourC4uMwxur4zFXakZa9Xj+3XcTYMCvAADuqq/5G8=", "last_login": null, "is_superuser": false, "username": "username_user14", "first_name": "full_name", "last_name": "user14", "email": "email_user14@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:51:04.873", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 16, "fields": {"password": "pbkdf2_sha256$180000$JO53zWbYonXG$Ib2eOio0XHeolJBqvHGkvX727NWcY4RzsgNsmzVp7v0=", "last_login": null, "is_superuser": false, "username": "username_user15", "first_name": "full_name", "last_name": "user15", "email": "email_user15@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:51:05.745", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 17, "fields": {"password": "pbkdf2_sha256$180000$r6j88bh3AKEt$bLQNxFAFPlJX+cPqWhiEcmVnm9QrMiMhsmYKDwwqLOk=", "last_login": null, "is_superuser": false, "username": "username_user16", "first_name": "full_name", "last_name": "user16", "email": "email_user16@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:51:06.581", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 18, "fields": {"password": "pbkdf2_sha256$180000$12STaQpbKvwc$pORBNHnEe3zBrcI6CEYn3VJVOZwF1CQllffj92Th87o=", "last_login": null, "is_superuser": false, "username": "username_user17", "first_name": "full_name", "last_name": "user17", "email": "email_user17@mail.com", "is_staff": false, "is_active": true, "date_joined": "2020-10-30T20:51:07.466", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 19, "fields": {"password": "pbkdf2_sha256$216000$4XjnsZ811cdE$94MU74BKig0yph8I9coHBJXI+jTguVh8NwnE2Q2wvQ0=", "last_login": "2020-12-08T13:54:11.922", "is_superuser": true, "username": "admin", "first_name": "", "last_name": "", "email": "admin@ppl.com", "is_staff": true, "is_active": true, "date_joined": "2020-10-30T20:51:09.204", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 20, "fields": {"password": "ga_perlu_password", "last_login": "2020-11-25T01:42:26.099", "is_superuser": false, "username": "annisaa.fitri51", "first_name": "Annisaa", "last_name": "Fitri Shabrina", "email": "annisaa.fitri51@ui.ac.id", "is_staff": false, "is_active": true, "date_joined": "2020-11-09T22:40:57", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 22, "fields": {"password": "nope", "last_login": "2020-12-08T14:39:46.249", "is_superuser": false, "username": "harold.hotma", "first_name": "Harold", "last_name": "Hotma Sibuea", "email": "harold.hotma@ui.ac.id", "is_staff": false, "is_active": true, "date_joined": "2020-11-09T22:43:06", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 25, "fields": {"password": "butuh password yang aman? Cek di Go Get Gold Indonesia", "last_login": "2020-12-07T14:17:38.775", "is_superuser": false, "username": "figo.muhammad", "first_name": "Figo", "last_name": "Muhammad Alfaritzi", "email": "figo.muhammad@ui.ac.id", "is_staff": false, "is_active": true, "date_joined": "2020-11-12T20:40:11", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 26, "fields": {"password": "ini nih jagonya frontend", "last_login": "2020-12-04T01:53:03.860", "is_superuser": false, "username": "nabila.edina", "first_name": "Nabila", "last_name": "Edina", "email": "nabila.edina@ui.ac.id", "is_staff": false, "is_active": true, "date_joined": "2020-11-12T20:41:32", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 27, "fields": {"password": "pbkdf2_sha256$216000$bBoFlPOzEQYM$E5azzhUBzyh63H10iTBtHlvj93kopkCzDS+CJyKNfNo=", "last_login": "2020-12-07T15:48:00.584", "is_superuser": false, "username": "budi_doremi", "first_name": "Budi", "last_name": "", "email": "budi_doremi@email.com", "is_staff": false, "is_active": true, "date_joined": "2020-11-12T20:53:10", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 28, "fields": {"password": "emang password guna?", "last_login": "2020-12-04T00:17:29.225", "is_superuser": false, "username": "fransiscus.emmanuel", "first_name": "Fransiscus", "last_name": "Emmanuel Bunaren", "email": "fransiscus.emmanuel@ui.ac.id", "is_staff": false, "is_active": true, "date_joined": "2020-11-12T21:15:48", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 29, "fields": {"password": "pbkdf2_sha256$216000$TPngQAglHMZX$1g87PQ/wp7v5dNeQPDflPSLkbIhjddfCUylzUs+Gwj8=", "last_login": "2020-11-24T03:16:33.916", "is_superuser": false, "username": "budhidharma", "first_name": "Budhi", "last_name": "Dharma", "email": "budhidharma@ui.ac.id", "is_staff": false, "is_active": true, "date_joined": "2020-11-15T17:10:56", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 30, "fields": {"password": "pbkdf2_sha256$216000$G7vCaS0ZSUhc$7YFJ/fN8PiwSLZIhknUEIn7nAui8OyupcWE5K8DOfKI=", "last_login": null, "is_superuser": false, "username": "wisni.bantarti09", "first_name": "Wisni", "last_name": "Bantarti", "email": "wisni.bantarti09@ui.ac.id", "is_staff": false, "is_active": true, "date_joined": "2020-11-15T17:12:43", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 31, "fields": {"password": "pbkdf2_sha256$216000$uoPJjKm0Vz9v$2ZMZYy3HoLoRrX29IvEiFlv2yr7Mj6MpX2pwc/Em/Xo=", "last_login": "2020-11-25T02:05:46.720", "is_superuser": false, "username": "maya.retno81", "first_name": "Maya", "last_name": "Retno", "email": "maya.retno81@ui.ac.id", "is_staff": false, "is_active": true, "date_joined": "2020-11-25T02:03:38", "groups": [], "user_permissions": []}}] diff --git a/new/laporan_praktikum/__init__.py b/new/laporan_praktikum/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/new/laporan_praktikum/admin.py b/new/laporan_praktikum/admin.py deleted file mode 100644 index 43d301d..0000000 --- a/new/laporan_praktikum/admin.py +++ /dev/null @@ -1,41 +0,0 @@ -from django.contrib import admin -from laporan_praktikum.models import Praktikum, KelolaLaporanPraktikum, \ - MahasiswaPraktikum, LaporanAkhirPraktikum, LaporanBorangPraktikum, TemplateBorangPenilaianPraktikum - - -@admin.register(Praktikum) -class PraktikumAdmin(admin.ModelAdmin): - list_display = ['id', 'jenis_praktikum'] - - -@admin.register(MahasiswaPraktikum) -class MahasiswaPraktikumAdmin(admin.ModelAdmin): - list_display = ['id', 'mahasiswa', 'list_praktikum', 'status'] - - -@admin.register(KelolaLaporanPraktikum) -class KelolaLaporanPraktikumAdmin(admin.ModelAdmin): - list_display = ['id', 'nama_laporan', 'jenis_praktikum', 'mahasiswa', 'waktu_deadline', 'waktu_submisi', - 'waktu_nilai_supv_sekolah', 'waktu_nilai_supv_lembaga', 'status_publikasi', 'status_submisi', - 'skor_laporan_sekolah', 'skor_laporan_lembaga', 'link_submisi'] - - -@admin.register(LaporanAkhirPraktikum) -class LaporanAkhirPraktikumAdmin(admin.ModelAdmin): - list_display = ['id', 'nama_laporan', 'lembaga', 'jenis_praktikum', 'mahasiswa', 'periode_praktikum', - 'waktu_deadline', 'waktu_submisi', - 'waktu_nilai_supv_sekolah', 'waktu_nilai_supv_lembaga', 'status_publikasi', 'status_submisi', - 'skor_laporan_sekolah', 'skor_laporan_lembaga', 'laporan_akhir', 'profil_lembaga', 'umpan_balik'] - - -@admin.register(LaporanBorangPraktikum) -class LaporanBorangPraktikumAdmin(admin.ModelAdmin): - list_display = ['id', 'nama_laporan', 'jenis_praktikum', 'mahasiswa', 'waktu_deadline', 'waktu_submisi', - 'waktu_nilai_supv_sekolah', 'waktu_nilai_supv_lembaga', 'status_publikasi', 'status_submisi', - 'borang_supv_sekolah', 'borang_supv_lembaga', 'borang_supv_perkuliahan'] - - -@admin.register(TemplateBorangPenilaianPraktikum) -class TemplateBorangPenilaianPraktikum(admin.ModelAdmin): - list_display = ['id', 'supervisor_sekolah', 't_borang_supv_sekolah', - 't_borang_supv_lembaga', 't_borang_supv_perkuliahan'] diff --git a/new/laporan_praktikum/apps.py b/new/laporan_praktikum/apps.py deleted file mode 100644 index 7443053..0000000 --- a/new/laporan_praktikum/apps.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.apps import AppConfig - - -class LaporanPraktikumConfig(AppConfig): - name = 'laporan_praktikum' diff --git a/new/laporan_praktikum/custom_module/__init__.py b/new/laporan_praktikum/custom_module/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/new/laporan_praktikum/custom_module/parse_time.py b/new/laporan_praktikum/custom_module/parse_time.py deleted file mode 100644 index 5d30f15..0000000 --- a/new/laporan_praktikum/custom_module/parse_time.py +++ /dev/null @@ -1,8 +0,0 @@ -import datetime - - -def parse_time_custom(datetime_inp): - ''' - CUSTOM PARSER FOR TIME DD-MM-YY hh:mm - ''' - return datetime.strptime(datetime_inp, '%d-%m-%Y %H:%M') diff --git a/new/laporan_praktikum/error_message/__init__.py b/new/laporan_praktikum/error_message/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/new/laporan_praktikum/error_message/error_message.py b/new/laporan_praktikum/error_message/error_message.py deleted file mode 100644 index 415ebf0..0000000 --- a/new/laporan_praktikum/error_message/error_message.py +++ /dev/null @@ -1,9 +0,0 @@ -error_message_404_supervisor_sekolah = 'Can not find user data for Supervisor Sekolah' -error_message_404_koordinator_kuliah = 'Can not find user data for Koordinator Kuliah' -error_message_404_administrator = 'Can not find user data for Administrator' -error_message_404_mahasiswa = 'Can not find user data for Mahasiswa' -error_message_404_supervisor_lembaga = 'Can not find user data for Supervisor Lembaga' -error_message_404_user = 'Can not find user data for User' -error_message_404_praktikum = 'Can not find any praktikum data for mahasiswa' -error_message_404_laporan = 'Can not find any laporan data for mahasiswa' -error_message_404_lembaga = 'Can not find lembaga' diff --git a/new/laporan_praktikum/migrations/0001_initial.py b/new/laporan_praktikum/migrations/0001_initial.py deleted file mode 100644 index 0fee43c..0000000 --- a/new/laporan_praktikum/migrations/0001_initial.py +++ /dev/null @@ -1,113 +0,0 @@ -# Generated by Django 3.0.3 on 2020-06-03 12:43 - -from django.db import migrations, models -import django.db.models.deletion -import laporan_praktikum.models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('authentication', '0001_initial'), - ('lembaga', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='Praktikum', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('jenis_praktikum', models.CharField(default='Praktikum 1', max_length=255, unique=True)), - ], - ), - migrations.CreateModel( - name='TemplateBorangPenilaianPraktikum', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('t_borang_supv_sekolah', models.FileField(blank=True, null=True, upload_to=laporan_praktikum.models.dir_path_template_borang)), - ('t_borang_supv_lembaga', models.FileField(blank=True, null=True, upload_to=laporan_praktikum.models.dir_path_template_borang)), - ('t_borang_supv_perkuliahan', models.FileField(blank=True, null=True, upload_to=laporan_praktikum.models.dir_path_template_borang)), - ('supervisor_sekolah', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='template_borang', to='authentication.SupervisorSekolah', to_field='user')), - ], - ), - migrations.CreateModel( - name='MahasiswaPraktikum', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('status', models.BooleanField(default=False)), - ('list_praktikum', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='mahasiswa_praktikum', to='laporan_praktikum.Praktikum', to_field='jenis_praktikum')), - ('mahasiswa', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='mahasiswa_praktikum', to='authentication.Mahasiswa', to_field='user')), - ], - ), - migrations.CreateModel( - name='LaporanBorangPraktikum', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('nama_laporan', models.CharField(max_length=255)), - ('waktu_deadline', models.DateTimeField(blank=True, null=True)), - ('waktu_submisi', models.DateTimeField(blank=True, null=True)), - ('waktu_nilai_supv_sekolah', models.DateTimeField(blank=True, null=True)), - ('waktu_nilai_supv_lembaga', models.DateTimeField(blank=True, null=True)), - ('status_publikasi', models.BooleanField(default=False)), - ('status_submisi', models.BooleanField(default=False)), - ('skor_laporan_sekolah', models.IntegerField(default=-1)), - ('skor_laporan_lembaga', models.IntegerField(default=-1)), - ('borang_supv_sekolah', models.FileField(blank=True, null=True, upload_to='')), - ('borang_supv_lembaga', models.FileField(blank=True, null=True, upload_to='')), - ('borang_supv_perkuliahan', models.FileField(blank=True, null=True, upload_to='')), - ('jenis_praktikum', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='laporan_borang', to='laporan_praktikum.Praktikum', to_field='jenis_praktikum')), - ('mahasiswa', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='laporan_borang', to='authentication.Mahasiswa', to_field='user')), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='LaporanAkhirPraktikum', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('nama_laporan', models.CharField(max_length=255)), - ('waktu_deadline', models.DateTimeField(blank=True, null=True)), - ('waktu_submisi', models.DateTimeField(blank=True, null=True)), - ('waktu_nilai_supv_sekolah', models.DateTimeField(blank=True, null=True)), - ('waktu_nilai_supv_lembaga', models.DateTimeField(blank=True, null=True)), - ('status_publikasi', models.BooleanField(default=False)), - ('status_submisi', models.BooleanField(default=False)), - ('skor_laporan_sekolah', models.IntegerField(default=-1)), - ('skor_laporan_lembaga', models.IntegerField(default=-1)), - ('periode_praktikum', models.CharField(blank=True, default=' ', max_length=50)), - ('laporan_akhir', models.FileField(blank=True, null=True, upload_to='')), - ('profil_lembaga', models.FileField(blank=True, null=True, upload_to='')), - ('umpan_balik', models.CharField(blank=True, default=' ', max_length=255)), - ('jenis_praktikum', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='laporan_akhir', to='laporan_praktikum.Praktikum', to_field='jenis_praktikum')), - ('lembaga', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='laporan_akhir_set_lembaga', to='lembaga.Lembaga')), - ('mahasiswa', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='laporan_akhir', to='authentication.Mahasiswa', to_field='user')), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='KelolaLaporanPraktikum', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('nama_laporan', models.CharField(max_length=255)), - ('waktu_deadline', models.DateTimeField(blank=True, null=True)), - ('waktu_submisi', models.DateTimeField(blank=True, null=True)), - ('waktu_nilai_supv_sekolah', models.DateTimeField(blank=True, null=True)), - ('waktu_nilai_supv_lembaga', models.DateTimeField(blank=True, null=True)), - ('status_publikasi', models.BooleanField(default=False)), - ('status_submisi', models.BooleanField(default=False)), - ('skor_laporan_sekolah', models.IntegerField(default=-1)), - ('skor_laporan_lembaga', models.IntegerField(default=-1)), - ('link_submisi', models.URLField(blank=True, max_length=255, null=True)), - ('jenis_praktikum', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='kelola_laporan', to='laporan_praktikum.Praktikum', to_field='jenis_praktikum')), - ('mahasiswa', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='kelola_laporan', to='authentication.Mahasiswa', to_field='user')), - ], - options={ - 'abstract': False, - }, - ), - ] diff --git a/new/laporan_praktikum/migrations/0002_auto_20200603_1450.py b/new/laporan_praktikum/migrations/0002_auto_20200603_1450.py deleted file mode 100644 index b654b5c..0000000 --- a/new/laporan_praktikum/migrations/0002_auto_20200603_1450.py +++ /dev/null @@ -1,29 +0,0 @@ -# Generated by Django 3.0.3 on 2020-06-03 14:50 - -from django.db import migrations, models -import laporan_praktikum.models - - -class Migration(migrations.Migration): - - dependencies = [ - ('laporan_praktikum', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='laporanborangpraktikum', - name='borang_supv_lembaga', - field=models.FileField(blank=True, null=True, storage=laporan_praktikum.models.OverwriteStorage, upload_to=''), - ), - migrations.AlterField( - model_name='laporanborangpraktikum', - name='borang_supv_perkuliahan', - field=models.FileField(blank=True, null=True, storage=laporan_praktikum.models.OverwriteStorage, upload_to=''), - ), - migrations.AlterField( - model_name='laporanborangpraktikum', - name='borang_supv_sekolah', - field=models.FileField(blank=True, null=True, storage=laporan_praktikum.models.OverwriteStorage, upload_to=''), - ), - ] diff --git a/new/laporan_praktikum/migrations/0003_auto_20200603_1451.py b/new/laporan_praktikum/migrations/0003_auto_20200603_1451.py deleted file mode 100644 index d3cfd7f..0000000 --- a/new/laporan_praktikum/migrations/0003_auto_20200603_1451.py +++ /dev/null @@ -1,47 +0,0 @@ -# Generated by Django 3.0.3 on 2020-06-03 14:51 - -from django.db import migrations, models -import laporan_praktikum.models - - -class Migration(migrations.Migration): - - dependencies = [ - ('laporan_praktikum', '0002_auto_20200603_1450'), - ] - - operations = [ - migrations.AlterField( - model_name='laporanborangpraktikum', - name='borang_supv_lembaga', - field=models.FileField(blank=True, null=True, upload_to=''), - ), - migrations.AlterField( - model_name='laporanborangpraktikum', - name='borang_supv_perkuliahan', - field=models.FileField(blank=True, null=True, upload_to=''), - ), - migrations.AlterField( - model_name='laporanborangpraktikum', - name='borang_supv_sekolah', - field=models.FileField(blank=True, null=True, upload_to=''), - ), - migrations.AlterField( - model_name='templateborangpenilaianpraktikum', - name='t_borang_supv_lembaga', - field=models.FileField(blank=True, null=True, storage=laporan_praktikum.models.OverwriteStorage, - upload_to=laporan_praktikum.models.dir_path_template_borang), - ), - migrations.AlterField( - model_name='templateborangpenilaianpraktikum', - name='t_borang_supv_perkuliahan', - field=models.FileField(blank=True, null=True, storage=laporan_praktikum.models.OverwriteStorage, - upload_to=laporan_praktikum.models.dir_path_template_borang), - ), - migrations.AlterField( - model_name='templateborangpenilaianpraktikum', - name='t_borang_supv_sekolah', - field=models.FileField(blank=True, null=True, storage=laporan_praktikum.models.OverwriteStorage, - upload_to=laporan_praktikum.models.dir_path_template_borang), - ), - ] diff --git a/new/laporan_praktikum/migrations/0004_auto_20200603_1455.py b/new/laporan_praktikum/migrations/0004_auto_20200603_1455.py deleted file mode 100644 index 95fcccd..0000000 --- a/new/laporan_praktikum/migrations/0004_auto_20200603_1455.py +++ /dev/null @@ -1,32 +0,0 @@ -# Generated by Django 3.0.3 on 2020-06-03 14:55 - -from django.db import migrations, models -import laporan_praktikum.models - - -class Migration(migrations.Migration): - - dependencies = [ - ('laporan_praktikum', '0003_auto_20200603_1451'), - ] - - operations = [ - migrations.AlterField( - model_name='templateborangpenilaianpraktikum', - name='t_borang_supv_lembaga', - field=models.FileField(blank=True, null=True, storage=laporan_praktikum.models.OverwriteStorage(), - upload_to=laporan_praktikum.models.dir_path_template_borang), - ), - migrations.AlterField( - model_name='templateborangpenilaianpraktikum', - name='t_borang_supv_perkuliahan', - field=models.FileField(blank=True, null=True, storage=laporan_praktikum.models.OverwriteStorage(), - upload_to=laporan_praktikum.models.dir_path_template_borang), - ), - migrations.AlterField( - model_name='templateborangpenilaianpraktikum', - name='t_borang_supv_sekolah', - field=models.FileField(blank=True, null=True, storage=laporan_praktikum.models.OverwriteStorage(), - upload_to=laporan_praktikum.models.dir_path_template_borang), - ), - ] diff --git a/new/laporan_praktikum/migrations/0005_auto_20200603_1944.py b/new/laporan_praktikum/migrations/0005_auto_20200603_1944.py deleted file mode 100644 index 4d03a2d..0000000 --- a/new/laporan_praktikum/migrations/0005_auto_20200603_1944.py +++ /dev/null @@ -1,29 +0,0 @@ -# Generated by Django 3.0.3 on 2020-06-03 19:44 - -from django.db import migrations, models -import laporan_praktikum.models - - -class Migration(migrations.Migration): - - dependencies = [ - ('laporan_praktikum', '0004_auto_20200603_1455'), - ] - - operations = [ - migrations.AlterField( - model_name='templateborangpenilaianpraktikum', - name='t_borang_supv_lembaga', - field=models.FileField(blank=True, null=True, upload_to=laporan_praktikum.models.dir_path_template_borang), - ), - migrations.AlterField( - model_name='templateborangpenilaianpraktikum', - name='t_borang_supv_perkuliahan', - field=models.FileField(blank=True, null=True, upload_to=laporan_praktikum.models.dir_path_template_borang), - ), - migrations.AlterField( - model_name='templateborangpenilaianpraktikum', - name='t_borang_supv_sekolah', - field=models.FileField(blank=True, null=True, upload_to=laporan_praktikum.models.dir_path_template_borang), - ), - ] diff --git a/new/laporan_praktikum/migrations/__init__.py b/new/laporan_praktikum/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/new/laporan_praktikum/models.py b/new/laporan_praktikum/models.py deleted file mode 100644 index 38d4a27..0000000 --- a/new/laporan_praktikum/models.py +++ /dev/null @@ -1,155 +0,0 @@ -from django.db import models -from lembaga.models import Lembaga -from authentication.models import Administrator, KoordinatorKuliah, Mahasiswa, \ - SupervisorLembaga, SupervisorSekolah -from django.core.files.storage import FileSystemStorage -from django.conf import settings - -import uuid - -import os - - -def dir_path_template_borang(instance, filename): - # file will be uploaded to MEDIA_ROOT/user_/ - - if instance.t_borang_supv_sekolah: - return '{0}/{1}/{2}'.format(str(instance.supervisor_sekolah), 't_borang_supv_sekolah', filename) - - if instance.t_borang_supv_lembaga: - return '{0}/{1}/{2}'.format(str(instance.supervisor_sekolah), 't_borang_supv_lembaga', filename) - - if instance.t_borang_supv_perkuliahan: - return '{0}/{1}/{2}'.format(str(instance.supervisor_sekolah), 't_borang_supv_perkuliahan', filename) - -# For model LaporanAkhirPraktikum and LaporanBorangPraktikum to spesific media path - - -def dir_path_generator(instance, filename): - if instance.laporan_akhir: - return '{0}/{1}/{2}'.format(str(instance.mahasiswa), 'laporan_akhir', filename) - - if instance.profil_lembaga: - return '{0}/{1}/{2}'.format(str(instance.mahasiswa), 'profil_lembaga', filename) - - if instance.borang_supv_sekolah: - return '{0}/{1}/{2}'.format(str(instance.mahasiswa), 'borang_supv_sekolah', filename) - - if instance.borang_supv_lembaga: - return '{0}/{1}/{2}'.format(str(instance.mahasiswa), 'borang_supv_lembaga', filename) - - if instance.borang_supv_perkuliahan: - return '{0}/{1}/{2}'.format(str(instance.mahasiswa), 'borang_supv_perkuliahan', filename) - - -class OverwriteStorage(FileSystemStorage): - ''' - Changes Django's default behavior and makes it overwrite - same name that were loaded by the user instead of renaming them. - - ''' - - def get_available_name(self, filename, max_length=None): - temp_filename = filename - if self.exists(filename): - os.remove(os.path.join(settings.MEDIA_ROOT, filename)) - return filename - - -class Praktikum(models.Model): - jenis_praktikum = models.CharField(max_length=255, unique=True, default="Praktikum 1") - - def __str__(self): - return self.jenis_praktikum - - -class MahasiswaPraktikum(models.Model): - mahasiswa = models.ForeignKey(Mahasiswa, to_field="user", related_name="mahasiswa_praktikum", \ - on_delete=models.CASCADE) - list_praktikum = models.ForeignKey(Praktikum, to_field="jenis_praktikum", related_name="mahasiswa_praktikum", \ - on_delete=models.CASCADE) - status = models.BooleanField(default=False) - - -class AttributeLaporanPraktikum(models.Model): - ''' - Abstract Class - ''' - nama_laporan = models.CharField(max_length=255) - waktu_deadline = models.DateTimeField(blank=True, null=True) # unggah - waktu_submisi = models.DateTimeField(blank=True, null=True) - waktu_nilai_supv_sekolah = models.DateTimeField(blank=True, null=True) # supv sekolah nilai - waktu_nilai_supv_lembaga = models.DateTimeField(blank=True, null=True) # supv lembaga nilai - - status_publikasi = models.BooleanField(default=False) - status_submisi = models.BooleanField(default=False) - skor_laporan_sekolah = models.IntegerField(default=-1) - skor_laporan_lembaga = models.IntegerField(default=-1) - - class Meta: - abstract = True - - -class KelolaLaporanPraktikum(AttributeLaporanPraktikum): - ''' - Laporan Mingguan Praktikum - ''' - mahasiswa = models.ForeignKey(Mahasiswa, to_field="user", related_name="kelola_laporan", \ - on_delete=models.CASCADE) - jenis_praktikum = models.ForeignKey(Praktikum, to_field="jenis_praktikum", related_name="kelola_laporan", \ - on_delete=models.CASCADE) - link_submisi = models.URLField(max_length=255, blank=True, null=True) - - def __str__(self): # pragma: no cover - return self.nama_laporan - - -class LaporanAkhirPraktikum(AttributeLaporanPraktikum): - ''' - Laporan Akhir Praktikum - ''' - mahasiswa = models.ForeignKey(Mahasiswa, to_field="user", related_name="laporan_akhir", \ - on_delete=models.CASCADE) - jenis_praktikum = models.ForeignKey(Praktikum, to_field="jenis_praktikum", related_name="laporan_akhir", \ - on_delete=models.CASCADE) - lembaga = models.ForeignKey(Lembaga, related_name="laporan_akhir_set_lembaga", - blank=True, - null=True, - default=None, - on_delete=models.CASCADE) - periode_praktikum = models.CharField(max_length=50, blank=True, default=" ") - laporan_akhir = models.FileField(blank=True, null=True) - profil_lembaga = models.FileField(blank=True, null=True) - umpan_balik = models.CharField(max_length=255, blank=True, default=" ") - - def __str__(self): # pragma: no cover - return self.nama_laporan - - -class LaporanBorangPraktikum(AttributeLaporanPraktikum): - ''' - Laporan Borang Praktikum - ''' - mahasiswa = models.ForeignKey(Mahasiswa, to_field="user", related_name="laporan_borang", \ - on_delete=models.CASCADE) - jenis_praktikum = models.ForeignKey(Praktikum, to_field="jenis_praktikum", related_name="laporan_borang", \ - on_delete=models.CASCADE) - borang_supv_sekolah = models.FileField(blank=True, null=True) - borang_supv_lembaga = models.FileField(blank=True, null=True) - borang_supv_perkuliahan = models.FileField(blank=True, null=True) - - def __str__(self): # pragma: no cover - return self.nama_laporan - - -# flake8: noqa -class TemplateBorangPenilaianPraktikum(models.Model): - supervisor_sekolah = models.ForeignKey(SupervisorSekolah, related_name='template_borang', \ - to_field='user', on_delete=models.CASCADE, null=True, blank=True) - - t_borang_supv_sekolah = models.FileField(blank=True, null=True, upload_to=dir_path_template_borang) - t_borang_supv_lembaga = models.FileField(blank=True, null=True, upload_to=dir_path_template_borang) - t_borang_supv_perkuliahan = models.FileField(blank=True, null=True, upload_to=dir_path_template_borang) - - def __str__(self): # pragma: no cover - return '{}'.format(self.supervisor_sekolah.__str__()) diff --git a/new/laporan_praktikum/serializers.py b/new/laporan_praktikum/serializers.py deleted file mode 100644 index 3cc418a..0000000 --- a/new/laporan_praktikum/serializers.py +++ /dev/null @@ -1,474 +0,0 @@ -from django.db import models -from rest_framework import serializers -from lembaga.models import Lembaga -from lembaga.serializers import LembagaSerializer -from authentication.models import ( - Mahasiswa, - SupervisorLembaga, - SupervisorSekolah, - KoordinatorKuliah, - Administrator, - User -) -from authentication.serializers import ( - UserSerializer, - SupervisorSekolahSerializer, - SupervisorLembagaSerializer, - MahasiswaSerializer, -) -from laporan_praktikum.models import ( - Praktikum, - MahasiswaPraktikum, - KelolaLaporanPraktikum, - LaporanAkhirPraktikum, - LaporanBorangPraktikum, - TemplateBorangPenilaianPraktikum -) - - -date_format = "%d-%m-%Y %H:%M" - - -class PraktikumSerializer(serializers.ModelSerializer): - - class Meta: - model = Praktikum - fields = ['id', 'jenis_praktikum'] - - -class SupervisorLembagaSpesificSerializer(serializers.ModelSerializer): - """Supervisor Lembaga serializer json field.""" - user = UserSerializer() - - class Meta: - model = SupervisorLembaga - fields = ['user'] - - -class MahasiswaWithJenisPraktikumSerializer(MahasiswaSerializer): - - jenis_praktikum = serializers.SerializerMethodField() - status_kelola = serializers.SerializerMethodField() - - def get_jenis_praktikum(self, obj_mahasiswa): - mahasiswa_praktikum = MahasiswaPraktikum.objects.filter(mahasiswa=obj_mahasiswa, status=True) - if len(mahasiswa_praktikum) > 0: - mahasiswa_praktikum = mahasiswa_praktikum[0].list_praktikum - else: - mahasiswa_praktikum = "" - return str(mahasiswa_praktikum) - - def get_status_kelola(self, obj_mahasiswa): - status = False - list_praktikum_mingguan = KelolaLaporanPraktikum.objects.filter(mahasiswa=obj_mahasiswa, status_publikasi=True).count() - list_praktikum_akhir = LaporanAkhirPraktikum.objects.filter(mahasiswa=obj_mahasiswa, status_publikasi=True).count() - list_praktikum_borang = LaporanBorangPraktikum.objects.filter(mahasiswa=obj_mahasiswa, status_publikasi=True).count() - - if list_praktikum_mingguan != 0 or list_praktikum_akhir != 0 or list_praktikum_borang != 0: - status = True - - return status - - class Meta(MahasiswaSerializer.Meta): - model = Mahasiswa - fields = ['jenis_praktikum', 'status_kelola'] + MahasiswaSerializer.Meta.fields - - -class SupervisorSekolahListMahasiswaSerializer(serializers.ModelSerializer): - user = UserSerializer() - mahasiswa = MahasiswaWithJenisPraktikumSerializer(many=True) - - class Meta: - model = SupervisorSekolah - fields = [ - 'user', - 'nip', - 'mahasiswa' - ] - - -class MahasiswaPraktikumSerializer(serializers.ModelSerializer): - - class Meta: - model = MahasiswaPraktikum - fields = ['mahasiswa', 'list_praktikum', 'status'] - - -class SupervisorLembagaListMahasiswaSerializer(serializers.ModelSerializer): - user = UserSerializer() - mahasiswa = MahasiswaWithJenisPraktikumSerializer(many=True) - lembaga = LembagaSerializer() - - class Meta: - model = SupervisorLembaga - fields = [ - 'user', - 'lembaga', - 'jabatan', - 'mahasiswa' - ] - - -################################### -# Basic Riwayat Serializer Class ## -################################### - - -class RiwayatKelolaLaporanPraktikumSerializer_v2(serializers.ModelSerializer): - - class Meta: - model = KelolaLaporanPraktikum - fields = ['id', 'jenis_praktikum', 'nama_laporan'] - - -class RiwayatLaporanAkhirPraktikumSerializer_v2(serializers.ModelSerializer): - - class Meta: - model = LaporanAkhirPraktikum - fields = ['id', 'jenis_praktikum', 'nama_laporan'] - - -class RiwayatLaporanBorangPraktikumSerializer_v2(serializers.ModelSerializer): - - class Meta: - model = LaporanBorangPraktikum - fields = ['id', 'jenis_praktikum', 'nama_laporan'] - -##################################### -# SERIALIZER RIWAYAT DARI MAHASISWA # -##################################### - - -class MahasiswaWithContextProfileSerializer(serializers.ModelSerializer): - user = UserSerializer() - - class Meta: - model = Mahasiswa - fields = ['user'] - - -class RiwayatSupervisiMahasiswaWithContextProfileSerializer(serializers.ModelSerializer): - mahasiswa = MahasiswaWithContextProfileSerializer() - - class Meta: - model = KelolaLaporanPraktikum - fields = '__all__' - - -class RiwayatSupervisiMahasiswaLaporanAkhirWithContextProfileSerializer(serializers.ModelSerializer): - mahasiswa = MahasiswaWithContextProfileSerializer() - - class Meta: - model = LaporanAkhirPraktikum - fields = '__all__' - - -class RiwayatSupervisiMahasiswaLaporanBorangWithContextProfileSerializer(serializers.ModelSerializer): - mahasiswa = MahasiswaWithContextProfileSerializer() - - class Meta: - model = LaporanBorangPraktikum - fields = '__all__' - - -class RiwayatMahasiswaLaporanMingguanSerializer(RiwayatKelolaLaporanPraktikumSerializer_v2): - waktu_deadline = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - waktu_submisi = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - - class Meta(RiwayatKelolaLaporanPraktikumSerializer_v2.Meta): - ordering = ['-waktu_submisi'] - fields = RiwayatKelolaLaporanPraktikumSerializer_v2.Meta.fields + ['waktu_deadline', 'waktu_submisi', 'status_submisi'] - - -class RiwayatMahasiswaLaporanAkhirSerializer(RiwayatLaporanAkhirPraktikumSerializer_v2): - waktu_deadline = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - waktu_submisi = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - - class Meta(RiwayatLaporanAkhirPraktikumSerializer_v2.Meta): - ordering = ['-waktu_submisi'] - fields = RiwayatLaporanAkhirPraktikumSerializer_v2.Meta.fields + ['waktu_deadline', 'waktu_submisi', 'status_submisi'] - - -class RiwayatMahasiswaLaporanBorangSerializer(RiwayatLaporanBorangPraktikumSerializer_v2): - waktu_deadline = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - waktu_submisi = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - - class Meta(RiwayatLaporanBorangPraktikumSerializer_v2.Meta): - ordering = ['-waktu_submisi'] - fields = RiwayatLaporanBorangPraktikumSerializer_v2.Meta.fields + ['waktu_deadline', 'waktu_submisi', 'status_submisi'] - -############################################## -# SERIALIZER RIWAYAT DARI SUPERVISOR SEKOLAH # -############################################## - - -class RiwayatSupervisiMahasiswaBySupervisorSekolahSerializer(RiwayatKelolaLaporanPraktikumSerializer_v2): - - waktu_nilai_supv_sekolah = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - - class Meta(RiwayatKelolaLaporanPraktikumSerializer_v2.Meta): - ordering = ['-waktu_nilai_supv_sekolah'] - fields = RiwayatKelolaLaporanPraktikumSerializer_v2.Meta.fields + ['waktu_nilai_supv_sekolah', 'status_submisi'] - - -class RiwayatSupervisiLaporanAkhirMahasiswaBySupervisorSekolahSerializer(RiwayatLaporanAkhirPraktikumSerializer_v2): - mahasiswa = MahasiswaWithContextProfileSerializer() - waktu_nilai_supv_sekolah = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - - class Meta(RiwayatLaporanAkhirPraktikumSerializer_v2.Meta): - ordering = ['-waktu_nilai_supv_sekolah'] - fields = ['mahasiswa'] + RiwayatLaporanAkhirPraktikumSerializer_v2.Meta.fields + ['waktu_nilai_supv_sekolah', 'status_submisi'] - - -class RiwayatSupervisiLaporanBorangMahasiswaBySupervisorSekolahSerializer(RiwayatLaporanBorangPraktikumSerializer_v2): - mahasiswa = MahasiswaWithContextProfileSerializer() - waktu_nilai_supv_sekolah = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - - class Meta(RiwayatLaporanAkhirPraktikumSerializer_v2.Meta): - ordering = ['-waktu_nilai_supv_sekolah'] - fields = ['mahasiswa'] + RiwayatLaporanBorangPraktikumSerializer_v2.Meta.fields + ['waktu_nilai_supv_sekolah', 'status_submisi'] - - -############################################## -# SERIALIZER RIWAYAT DARI SUPERVISOR LEMBAGA # -############################################## - -class RiwayatSupervisiMahasiswaBySupervisorLembagaSerializer(RiwayatKelolaLaporanPraktikumSerializer_v2): - waktu_nilai_supv_lembaga = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - - class Meta(RiwayatKelolaLaporanPraktikumSerializer_v2.Meta): - ordering = ['-waktu_nilai_supv_lembaga'] - fields = RiwayatKelolaLaporanPraktikumSerializer_v2.Meta.fields + ['waktu_nilai_supv_lembaga', 'status_submisi'] - - -class RiwayatSupervisiLaporanAkhirMahasiswaBySupervisorLembagaSerializer(RiwayatLaporanAkhirPraktikumSerializer_v2): - waktu_nilai_supv_lembaga = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - - class Meta(RiwayatLaporanAkhirPraktikumSerializer_v2.Meta): - ordering = ['-waktu_nilai_supv_lembaga'] - fields = RiwayatLaporanAkhirPraktikumSerializer_v2.Meta.fields + ['waktu_nilai_supv_lembaga', 'status_submisi'] - - -class RiwayatSupervisiLaporanBorangMahasiswaBySupervisorLembagaSerializer(RiwayatLaporanBorangPraktikumSerializer_v2): - waktu_nilai_supv_lembaga = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - - class Meta(RiwayatLaporanBorangPraktikumSerializer_v2.Meta): - ordering = ['-waktu_nilai_supv_lembaga'] - fields = RiwayatLaporanBorangPraktikumSerializer_v2.Meta.fields + ['waktu_nilai_supv_lembaga', 'status_submisi'] - -############################## - - -class RiwayatLaporanPraktikumMahasiswaSerializer(serializers.ModelSerializer): - # change datetime-format - waktu_deadline = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - waktu_submisi = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - waktu_nilai_supv_lembaga = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - waktu_nilai_supv_sekolah = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - - class Meta: - model = KelolaLaporanPraktikum - ordering = ['-waktu_submisi', '-waktu_nilai_supv_lembaga', '-waktu_nilai_supv_sekolah'] - - fields = ['id', 'jenis_praktikum', 'nama_laporan', 'waktu_deadline', 'waktu_submisi', - 'waktu_nilai_supv_sekolah', 'waktu_nilai_supv_lembaga', 'status_publikasi', 'status_submisi', - 'skor_laporan_sekolah', 'skor_laporan_lembaga', 'link_submisi'] - - -################################################## - -class KelolaLaporanPraktikumSerializer(serializers.ModelSerializer): - - # change datetime-format - waktu_deadline = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - waktu_submisi = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - waktu_nilai_supv_lembaga = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - waktu_nilai_supv_sekolah = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - - class Meta: - model = KelolaLaporanPraktikum - fields = ['id', 'jenis_praktikum', 'nama_laporan', 'waktu_deadline', 'waktu_submisi', - 'waktu_nilai_supv_sekolah', 'waktu_nilai_supv_lembaga', 'status_publikasi', 'status_submisi', - 'skor_laporan_sekolah', 'skor_laporan_lembaga', 'link_submisi'] - - -class LaporanAkhirPraktikumSerializer(serializers.ModelSerializer): - mahasiswa = MahasiswaSerializer() - - # change datetime-format - waktu_deadline = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - waktu_submisi = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - waktu_nilai_supv_lembaga = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - waktu_nilai_supv_sekolah = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - - class Meta: - model = LaporanAkhirPraktikum - fields = ['mahasiswa', 'id', 'jenis_praktikum', 'nama_laporan', 'waktu_deadline', 'waktu_submisi', - 'waktu_nilai_supv_sekolah', 'waktu_nilai_supv_lembaga', 'status_publikasi', 'status_submisi', - 'skor_laporan_sekolah', 'skor_laporan_lembaga', 'laporan_akhir', 'profil_lembaga', 'umpan_balik', 'periode_praktikum'] - - -class LaporanBorangPraktikumSerializer(serializers.ModelSerializer): - mahasiswa = MahasiswaSerializer() - # change datetime-format - waktu_deadline = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - waktu_submisi = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - waktu_nilai_supv_lembaga = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - waktu_nilai_supv_sekolah = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - - class Meta: - model = LaporanBorangPraktikum - fields = ['mahasiswa', 'id', 'jenis_praktikum', 'nama_laporan', 'waktu_deadline', 'waktu_submisi', - 'waktu_nilai_supv_sekolah', 'waktu_nilai_supv_lembaga', 'status_publikasi', 'status_submisi', - 'skor_laporan_sekolah', 'skor_laporan_lembaga', - 'borang_supv_sekolah', - 'borang_supv_lembaga', - 'borang_supv_perkuliahan'] - - -class LaporanAkhirPraktikumSerializer_v2(serializers.ModelSerializer): - - # change datetime-format - waktu_deadline = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - waktu_submisi = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - waktu_nilai_supv_lembaga = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - waktu_nilai_supv_sekolah = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - - class Meta: - model = LaporanAkhirPraktikum - fields = ['id', 'jenis_praktikum', 'nama_laporan', 'waktu_deadline', 'waktu_submisi', - 'waktu_nilai_supv_sekolah', 'waktu_nilai_supv_lembaga', 'status_publikasi', 'status_submisi', - 'skor_laporan_sekolah', 'skor_laporan_lembaga', 'laporan_akhir', 'profil_lembaga', 'umpan_balik', 'periode_praktikum'] - - -class TemplateLaporanBorangPraktikumSerializer_v2(serializers.ModelSerializer): - supervisor_sekolah = SupervisorSekolah() - - class Meta: - model = TemplateBorangPenilaianPraktikum - fields = ['id', 't_borang_supv_sekolah', 't_borang_supv_lembaga', 't_borang_supv_perkuliahan'] - - -''' -class LaporanBorangPraktikumSerializer(serializers.ModelSerializer): - - # change datetime-format - waktu_deadline = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - waktu_submisi = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - waktu_nilai_supv_lembaga = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - waktu_nilai_supv_sekolah = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - - class Meta: - model = LaporanBorangPraktikum - fields = ['id', 'jenis_praktikum', 'nama_laporan', 'waktu_deadline', 'waktu_submisi', - 'waktu_nilai_supv_sekolah', 'waktu_nilai_supv_lembaga', 'status_publikasi', 'status_submisi', - 'skor_laporan_sekolah', 'skor_laporan_lembaga', - 'borang_supv_sekolah', - 'borang_supv_lembaga', - 'borang_supv_perkuliahan'] -''' - - -class KelolaLaporanPraktikumDefaultSerializer(serializers.ModelSerializer): - """ - Serializer for Kelola Laporan list - """ - mahasiswa = MahasiswaSerializer() - jenis_praktikum = PraktikumSerializer() - - # change datetime-format - waktu_deadline = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - waktu_submisi = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - waktu_nilai_supv_lembaga = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - waktu_nilai_supv_sekolah = serializers.DateTimeField(format="%d-%m-%Y %H:%M") - - class Meta: - model = KelolaLaporanPraktikum - - fields = [ - 'mahasiswa', - 'id', - 'jenis_praktikum', - 'nama_laporan', - 'waktu_deadline', - 'waktu_submisi', - 'waktu_nilai_supv_sekolah', - 'waktu_nilai_supv_lembaga', - 'status_publikasi', - 'status_submisi', - 'skor_laporan_sekolah', - 'skor_laporan_lembaga', - 'link_submisi' - ] - - -class MahasiswaDetailPraktikumSerializer(serializers.ModelSerializer): - """ - Serializer for Mahasiswa Praktikum - """ - mahasiswa = MahasiswaSerializer() - list_praktikum = PraktikumSerializer() - - class Meta: - model = MahasiswaPraktikum - fields = ['mahasiswa', 'list_praktikum', 'status'] - - -class KoordinatorKuliahListMahasiswaSerializer(serializers.ModelSerializer): - user = UserSerializer() - mahasiswa = serializers.SerializerMethodField(read_only=True) - - class Meta: - model = KoordinatorKuliah - fields = [ - 'user', - 'nip', - 'mahasiswa' - ] - - def get_mahasiswa(self, obj): - return MahasiswaWithJenisPraktikumSerializer(Mahasiswa.objects.all(), many=True).data - - -class AdministratorListUserSerializer(serializers.ModelSerializer): - user = UserSerializer() - user_list = serializers.SerializerMethodField(read_only=True) - - class Meta: - model = Administrator - fields = [ - 'user', - 'nip', - 'user_list' - ] - - def get_user_list(self, obj): - return UserSerializer(User.objects.all(), many=True).data - - -class MahasiswaDetailPraktikumSerializerTemp(serializers.ModelSerializer): - """ - Serializer for Mahasiswa Praktikum - """ - mahasiswa = MahasiswaSerializer() - - class Meta: - model = MahasiswaPraktikum - fields = '__all__' - depth = 2 - - -''' -class LaporanAkhirPraktikumSerializer(serializers.ModelSerializer): - mahasiswa = MahasiswaSerializer() - - class Meta: - model = LaporanAkhirPraktikum - fields = [ - 'nama_laporan', - 'mahasiswa', - 'jenis_praktikum', - 'laporan_akhir', - 'id' - ] -''' diff --git a/new/laporan_praktikum/supervisor_lembaga/__init__.py b/new/laporan_praktikum/supervisor_lembaga/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/new/laporan_praktikum/supervisor_lembaga/views_supv_lembaga.py b/new/laporan_praktikum/supervisor_lembaga/views_supv_lembaga.py deleted file mode 100644 index 5c0216e..0000000 --- a/new/laporan_praktikum/supervisor_lembaga/views_supv_lembaga.py +++ /dev/null @@ -1,199 +0,0 @@ -from rest_framework import viewsets, views -from laporan_praktikum.serializers import MahasiswaDetailPraktikumSerializerTemp -from authentication.models import ( - User, - Mahasiswa, - SupervisorLembaga, - SupervisorSekolah, - KoordinatorKuliah, - Administrator, - Periode -) -from authentication.serializers import ( - MahasiswaSerializer, - SupervisorLembagaSerializer, - SupervisorSekolahSerializer, - KoordinatorKuliahSerializer, - AdministratorSerializer -) -from authentication.role import Role -from lembaga.models import ( - Lembaga -) - -from laporan_praktikum.models import ( - Praktikum, - KelolaLaporanPraktikum, - LaporanBorangPraktikum, - LaporanAkhirPraktikum, - MahasiswaPraktikum, - Praktikum, - LaporanAkhirPraktikum -) -from laporan_praktikum.serializers import ( - - KelolaLaporanPraktikumSerializer, - KelolaLaporanPraktikumDefaultSerializer, - LaporanAkhirPraktikumSerializer, - LaporanAkhirPraktikumSerializer_v2, - LaporanBorangPraktikumSerializer, - MahasiswaDetailPraktikumSerializer, - SupervisorSekolahListMahasiswaSerializer, - SupervisorLembagaListMahasiswaSerializer, - SupervisorLembagaSpesificSerializer, - RiwayatLaporanPraktikumMahasiswaSerializer, - PraktikumSerializer, - KoordinatorKuliahListMahasiswaSerializer, - AdministratorListUserSerializer, -) -from rest_framework.decorators import api_view, permission_classes, authentication_classes -from rest_framework.response import Response -from rest_framework import status -from rest_framework.permissions import AllowAny, IsAuthenticated -from rest_framework.test import APIRequestFactory -from rest_framework.request import Request -from rest_framework.generics import CreateAPIView -from rest_framework.generics import RetrieveAPIView -from rest_framework.generics import UpdateAPIView -from rest_framework_jwt.authentication import JSONWebTokenAuthentication -from pyexcel_xls import get_data as xls_get -from pyexcel_xlsx import get_data as xlsx_get -from django.utils.datastructures import MultiValueDictKeyError - -from django.core import serializers -from django.db import transaction, IntegrityError -from django.db.models import Q -from django.http import HttpResponse, HttpResponseNotFound - - -import json -import datetime -from dateutil.parser import parse -from datetime import datetime - -response_field = ['success', 'status_code', 'message'] - - -class UserSupervisorLembagaDetailLaporanAkhirMahasiswaView(RetrieveAPIView): - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def get(self, request, username): - - try: - profile = SupervisorLembaga.objects.get(user=request.user) - user_mahasiswa = User.objects.get(username=username) - mahasiswa = Mahasiswa.objects.get(user=user_mahasiswa, supervisor_lembaga=profile) - - praktikum = MahasiswaPraktikum.objects.get(mahasiswa=mahasiswa, status=True) - - laporan_akhir = LaporanAkhirPraktikum.objects.filter(mahasiswa=mahasiswa, jenis_praktikum=praktikum.list_praktikum) - user_serializer = SupervisorLembagaSerializer(profile, context={'request': request}) - mahasiswa_serializer = MahasiswaSerializer(mahasiswa, context={'request': request}) - praktikum_serializer = PraktikumSerializer(praktikum.list_praktikum, context={'request': request}) - laporan_akhir_serializer = LaporanAkhirPraktikumSerializer_v2(laporan_akhir, context={'request': request}, many=True) - - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'List laporan akhir mahasiswa fetched successfully', - 'praktikum': praktikum_serializer.data, - 'mahasiswa': mahasiswa_serializer.data, - 'data': laporan_akhir_serializer.data, - 'user': user_serializer.data - } - - except SupervisorLembaga.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Can not find any user data for Supervisor Lembaga' - } - - except Mahasiswa.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Can not find any user data for Mahasiswa' - } - - except User.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Can not find any user data for User' - } - - return Response(response, status=status_code) - - -class UserSupervisorLembagaNilaiPraktikumMahasiswaView(UpdateAPIView): - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def update(self, request, username, id): - try: - skor = float(request.data.get("skor")) - if skor >= 0 and skor <= 100: - profile = SupervisorLembaga.objects.get(user=request.user) - user_mahasiswa = User.objects.get(username=username) - mahasiswa = Mahasiswa.objects.get(user=user_mahasiswa, supervisor_lembaga=profile) - laporan = LaporanAkhirPraktikum.objects.get(pk=id, mahasiswa=mahasiswa) - - laporan.waktu_nilai_supv_lembaga = datetime.now() - laporan.skor_laporan_lembaga = skor - laporan.save() - - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Score updated successfully', - } - else: - status_code = status.HTTP_422_UNPROCESSABLE_ENTITY - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Please enter a valid skor input between 1-100', - } - except ValueError: - status_code = status.HTTP_422_UNPROCESSABLE_ENTITY - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Please enter a valid float skor input', - } - except TypeError: - status_code = status.HTTP_422_UNPROCESSABLE_ENTITY - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Please enter a valid data input', - } - except LaporanAkhirPraktikum.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Can not find user data for Supervisor Lembaga' - } - except KelolaLaporanPraktikum.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Can not find any laporan for Mahasiswa' - } - except User.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Can not find any user data for User' - } - return Response(response, status=status_code) diff --git a/new/laporan_praktikum/supervisor_sekolah/__init__.py b/new/laporan_praktikum/supervisor_sekolah/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/new/laporan_praktikum/supervisor_sekolah/views.py b/new/laporan_praktikum/supervisor_sekolah/views.py deleted file mode 100644 index 37d8b4d..0000000 --- a/new/laporan_praktikum/supervisor_sekolah/views.py +++ /dev/null @@ -1,178 +0,0 @@ -from rest_framework import viewsets, views -from laporan_praktikum.serializers import MahasiswaDetailPraktikumSerializerTemp -from authentication.models import ( - User, - Mahasiswa, - SupervisorLembaga, - SupervisorSekolah, - KoordinatorKuliah, - Administrator, - Periode -) -from authentication.serializers import ( - MahasiswaSerializer, - SupervisorLembagaSerializer, - SupervisorSekolahSerializer, - KoordinatorKuliahSerializer, - AdministratorSerializer -) -from authentication.role import Role -from lembaga.models import ( - Lembaga -) - -from laporan_praktikum.models import ( - Praktikum, - KelolaLaporanPraktikum, - LaporanBorangPraktikum, - LaporanAkhirPraktikum, - MahasiswaPraktikum, - Praktikum, - LaporanAkhirPraktikum, - TemplateBorangPenilaianPraktikum -) - -from laporan_praktikum.serializers import ( - - KelolaLaporanPraktikumSerializer, - KelolaLaporanPraktikumDefaultSerializer, - LaporanAkhirPraktikumSerializer, - LaporanAkhirPraktikumSerializer_v2, - LaporanBorangPraktikumSerializer, - TemplateLaporanBorangPraktikumSerializer_v2, - MahasiswaDetailPraktikumSerializer, - SupervisorSekolahListMahasiswaSerializer, - SupervisorLembagaListMahasiswaSerializer, - SupervisorLembagaSpesificSerializer, - RiwayatLaporanPraktikumMahasiswaSerializer, - PraktikumSerializer, - KoordinatorKuliahListMahasiswaSerializer, - AdministratorListUserSerializer, - -) -from rest_framework.decorators import api_view, permission_classes, authentication_classes -from rest_framework.response import Response -from rest_framework import status -from rest_framework.permissions import AllowAny, IsAuthenticated -from rest_framework.test import APIRequestFactory -from rest_framework.request import Request -from rest_framework.generics import CreateAPIView -from rest_framework.generics import RetrieveAPIView -from rest_framework.generics import UpdateAPIView -from rest_framework_jwt.authentication import JSONWebTokenAuthentication -from pyexcel_xls import get_data as xls_get -from pyexcel_xlsx import get_data as xlsx_get -from django.utils.datastructures import MultiValueDictKeyError - -from django.core import serializers -from django.db import transaction, IntegrityError -from django.db.models import Q -from django.http import HttpResponse, HttpResponseNotFound - - -import json -import datetime -from dateutil.parser import parse -from datetime import datetime - -response_field = ['success', 'status_code', 'message'] - -STR_ERROR_MESSAGE_SOMETHING = "Something's wrong, try again..." -STR_CANNOT_FIND_USER_DATA_FOR_SUPERVISOR_SEKOLAH = 'Can not find user data for Supervisor Sekolah' - - -@api_view(["GET"]) -@authentication_classes([JSONWebTokenAuthentication]) -@permission_classes([IsAuthenticated]) -def get_template_laporan_borang(request): - ''' - Fungsi untuk get hasil upload Template Laporan Borang for SupervisorSekolah - ''' - try: - supervisor_sekolah = SupervisorSekolah.objects.get(user=request.user) - laporan_template_borang = TemplateBorangPenilaianPraktikum.objects.get(supervisor_sekolah=supervisor_sekolah) - serializer_template_borang = TemplateLaporanBorangPraktikumSerializer_v2(laporan_template_borang, context={'request': request}) - - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Template Borang fetched successfully', - 'data': serializer_template_borang.data - } - - except SupervisorSekolah.DoesNotExist: - status_code = status.HTTP_400_BAD_REQUEST - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: STR_CANNOT_FIND_USER_DATA_FOR_SUPERVISOR_SEKOLAH, - } - except TemplateBorangPenilaianPraktikum.DoesNotExist: - status_code = status.HTTP_400_BAD_REQUEST - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Can not find data for Template Borang Penilaian Praktikum', - } - return Response(response, status=status_code) - - -@ api_view(["PUT", "POST"]) -@ authentication_classes([JSONWebTokenAuthentication]) -@ permission_classes([IsAuthenticated]) -def crud_template_laporan_borang(request): - ''' - Fungsi untuk Upload Template Laporan Borang dan share ke seluruh Mahasiswa yang di supervisinya - ''' - try: - supervisor_sekolah = SupervisorSekolah.objects.get(user=request.user) - file_t_borang_supv_sekolah = request.data['template_borang_supv_sekolah'] - file_t_borang_supv_lembaga = request.data['template_borang_supv_lembaga'] - file_t_borang_supv_perkuliahan = request.data['template_borang_supv_perkuliahan'] - obj, created = TemplateBorangPenilaianPraktikum.objects.update_or_create( - supervisor_sekolah=supervisor_sekolah, - defaults={'t_borang_supv_sekolah': file_t_borang_supv_sekolah, - 't_borang_supv_lembaga': file_t_borang_supv_lembaga, - 't_borang_supv_perkuliahan': file_t_borang_supv_perkuliahan - } - ) - status_code = status.HTTP_201_CREATED - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Template Borang uploaded successfully' - } - - except AttributeError: - status_code = status.HTTP_400_BAD_REQUEST - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: STR_ERROR_MESSAGE_SOMETHING, - } - - except KeyError: - status_code = status.HTTP_400_BAD_REQUEST - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: STR_ERROR_MESSAGE_SOMETHING, - } - - except ValueError: - status_code = status.HTTP_400_BAD_REQUEST - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: STR_ERROR_MESSAGE_SOMETHING, - } - - except SupervisorSekolah.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: STR_CANNOT_FIND_USER_DATA_FOR_SUPERVISOR_SEKOLAH, - } - return Response(response, status=status_code) diff --git a/new/laporan_praktikum/tests/__init__.py b/new/laporan_praktikum/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/new/laporan_praktikum/tests/test_model.py b/new/laporan_praktikum/tests/test_model.py deleted file mode 100644 index e8b5957..0000000 --- a/new/laporan_praktikum/tests/test_model.py +++ /dev/null @@ -1,380 +0,0 @@ -from laporan_praktikum.models import Praktikum, KelolaLaporanPraktikum, MahasiswaPraktikum -from authentication.models import Mahasiswa, SupervisorLembaga, SupervisorSekolah, User, Periode -from lembaga.models import Lembaga, Tema, Institusi -from django.test import TestCase -from django.core.files import File -from io import BytesIO -from rest_framework.test import APITestCase -from rest_framework import serializers -from rest_framework import status -from PIL import Image -import json -import datetime -from rest_framework_jwt.settings import api_settings -from django.urls import reverse -from mixer.backend.django import mixer - -''' -TODO: Unit Test Kelola Laporan Praktikum -''' -class ModelsTest(TestCase): - - def setUp(self): - Praktikum.objects.create(jenis_praktikum='Laporan Minggu 1') - - def test_create_models_praktikum(self): - jenis_praktikum = Praktikum.objects.get(jenis_praktikum='Laporan Minggu 1') - self.assertEqual(type(jenis_praktikum.__str__()), str) - - - -token_type = "Bearer " -class SupervisorSekolahDashboardAPITest(APITestCase): - """ - Test for supervisor sekolah list and detail laporan - """ - def get_image_file(self, name='test.png', ext='png', size=(50, 50), color=(256, 0, 0)): - '''Mock image''' - file_obj = BytesIO() - image = Image.new("RGBA", size=size, color=color) - image.save(file_obj, ext) - file_obj.seek(0) - return File(file_obj, name=name) - - def setUp(self): - self.JWT_PAYLOAD_HANDLER = api_settings.JWT_PAYLOAD_HANDLER - self.JWT_ENCODE_HANDLER = api_settings.JWT_ENCODE_HANDLER - - self.user_mahasiswa_not_valid1 = User.objects.create_user( - username="username0", - email="username0@email.com", - password="password", - first_name="User", - last_name="Name0" - ) - - self.user_mahasiswa_not_valid2 = User.objects.create_user( - username="username1", - email="username1@email.com", - password="password", - first_name="User", - last_name="Name1" - ) - - self.user_mahasiswa = User.objects.create_user( - username="username2", - email="username2@email.com", - password="password", - first_name="User", - last_name="Name2" - ) - - self.user_supervisor_sekolah = User.objects.create_user( - username="username3", - email="username3@email.com", - password="password", - first_name="User", - last_name="Name3" - ) - - self.user_supervisor_lembaga = User.objects.create_user( - username="username4", - email="username4@email.com", - password="password", - first_name="User", - last_name="Name4" - ) - - supervisor_lembaga = mixer.blend( - SupervisorLembaga, lembaga=mixer.blend( - Lembaga, institusi=mixer.blend( - Institusi - ), tema=mixer.blend( - Tema - ), gambar=self.get_image_file() - ), user=mixer.blend(User) - ) - - supervisor_sekolah = SupervisorSekolah.objects.create( - user=self.user_supervisor_sekolah, - nip="nip" - ) - - periode = Periode.objects.create( - nama="periode" - ) - - mahasiswa_not_valid_1 = Mahasiswa.objects.create( - user=self.user_mahasiswa_not_valid1, - npm="npm", - org_code="org_code", - faculty="faculty", - major="major", - program="program", - periode=periode, - supervisor_lembaga=supervisor_lembaga, - supervisor_sekolah=supervisor_sekolah - ) - - Mahasiswa.objects.create( - user=self.user_mahasiswa_not_valid2, - npm="npm", - org_code="org_code", - faculty="faculty", - major="major", - program="program", - periode=periode, - supervisor_lembaga=supervisor_lembaga, - supervisor_sekolah=supervisor_sekolah - ) - - mahasiswa = Mahasiswa.objects.create( - user=self.user_mahasiswa, - npm="npm", - org_code="org_code", - faculty="faculty", - major="major", - program="program", - periode=periode, - supervisor_lembaga=supervisor_lembaga, - supervisor_sekolah=supervisor_sekolah - ) - - praktikum = Praktikum.objects.create( - jenis_praktikum="Praktikum 1" - ) - - MahasiswaPraktikum.objects.create( - mahasiswa=mahasiswa, - list_praktikum=praktikum, - status=True - ) - - MahasiswaPraktikum.objects.create( - mahasiswa=mahasiswa_not_valid_1, - list_praktikum=praktikum, - status=True - ) - - KelolaLaporanPraktikum.objects.create( - nama_laporan='nama_laporan_1', - mahasiswa=mahasiswa, - jenis_praktikum=praktikum, - waktu_deadline=datetime.datetime( - 2020, - 5, - 5, - 5, - 5, - 5 - ), - status_publikasi=True, - status_submisi=False, - skor_laporan_sekolah=-1, - skor_laporan_lembaga=-1 - ) - - self.login_data_supervisor_sekolah_valid = { - "username": "username3", - "password": "password" - } - - # Supervisor Sekolah Laporan List - - def test_can_see_list_laporan_supervisor_sekolah_after_login(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_supervisor_sekolah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:supervisor-sekolah-list-praktikum-mahasiswa', kwargs={'username': 'username2'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_can_not_see_list_laporan_supervisor_sekolah_because_of_no_user(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_supervisor_sekolah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:supervisor-sekolah-list-praktikum-mahasiswa', kwargs={'username': 'usernamefake'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_can_not_see_list_laporan_supervisor_sekolah_because_of_no_praktikum(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_supervisor_sekolah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:supervisor-sekolah-list-praktikum-mahasiswa', kwargs={'username': 'username1'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_can_not_see_list_laporan_supervisor_sekolah_before_login(self): - self.client.credentials(HTTP_AUTHORIZATION=token_type + 'falsetoken') - response = self.client.get( - reverse('laporan_praktikum:supervisor-sekolah-list-praktikum-mahasiswa', kwargs={'username': 'username2'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) - - def test_can_not_see_list_laporan_other_role_in_login_supervisor_sekolah(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_mahasiswa) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:supervisor-sekolah-list-praktikum-mahasiswa', kwargs={'username': 'username3'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - # Supervisor Sekolah Detail List - - def test_can_see_detail_laporan_supervisor_sekolah_after_login(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_supervisor_sekolah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:supervisor-sekolah-detail-laporan-mingguan-mahasiswa', kwargs={'username': 'username2', 'id': '1'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_can_not_see_detail_laporan_supervisor_sekolah_because_of_no_user(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_supervisor_sekolah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:supervisor-sekolah-detail-laporan-mingguan-mahasiswa', kwargs={'username': 'usernamefake', 'id': '1'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_can_not_see_detail_laporan_supervisor_sekolah_because_of_no_laporan(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_supervisor_sekolah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:supervisor-sekolah-detail-laporan-mingguan-mahasiswa', kwargs={'username': 'username2', 'id': '2'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_can_not_see_detail_laporan_supervisor_sekolah_before_login(self): - self.client.credentials(HTTP_AUTHORIZATION=token_type + 'falsetoken') - response = self.client.get( - reverse('laporan_praktikum:supervisor-sekolah-detail-laporan-mingguan-mahasiswa', kwargs={'username': 'username2', 'id': '1'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) - - def test_can_not_see_detail_laporan_other_role_in_login_supervisor_sekolah(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_mahasiswa) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:supervisor-sekolah-detail-laporan-mingguan-mahasiswa', kwargs={'username': 'username3', 'id': '1'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - # Supervisor Sekolah Update Skor - - def test_can_update_skor_supervisor_sekolah_with_valid_skor_input(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_supervisor_sekolah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.put( - reverse('laporan_praktikum:supervisor-sekolah-nilai-laporan-mingguan-mahasiswa', - kwargs={'username': 'username2', 'id': '1'}), - data={'format': 'json', 'skor': '50'} - ) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - response = self.client.put( - reverse('laporan_praktikum:supervisor-sekolah-nilai-laporan-mingguan-mahasiswa', - kwargs={'username': 'username2', 'id': '1'}), - data={'format': 'json', 'skor': '0'} - ) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - response = self.client.put( - reverse('laporan_praktikum:supervisor-sekolah-nilai-laporan-mingguan-mahasiswa', - kwargs={'username': 'username2', 'id': '1'}), - data={'format': 'json', 'skor': '100'} - ) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_can_not_update_skor_supervisor_sekolah_with_invalid_skor_input(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_supervisor_sekolah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.put( - reverse('laporan_praktikum:supervisor-sekolah-nilai-laporan-mingguan-mahasiswa', - kwargs={'username': 'username2', 'id': '1'}), - data={'format': 'json', 'skor': '-2'} - ) - self.assertEqual(response.status_code, status.HTTP_422_UNPROCESSABLE_ENTITY) - - response = self.client.put( - reverse('laporan_praktikum:supervisor-sekolah-nilai-laporan-mingguan-mahasiswa', - kwargs={'username': 'username2', 'id': '1'}), - data={'format': 'json', 'skor': '101'} - ) - self.assertEqual(response.status_code, status.HTTP_422_UNPROCESSABLE_ENTITY) - - response = self.client.put( - reverse('laporan_praktikum:supervisor-sekolah-nilai-laporan-mingguan-mahasiswa', - kwargs={'username': 'username2', 'id': '1'}), - data={'format': 'json', 'skor': 'aa'} - ) - self.assertEqual(response.status_code, status.HTTP_422_UNPROCESSABLE_ENTITY) - - def test_can_not_update_skor_supervisor_sekolah_because_of_no_user(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_supervisor_sekolah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.put( - reverse('laporan_praktikum:supervisor-sekolah-nilai-laporan-mingguan-mahasiswa', - kwargs={'username': 'usernamefake', 'id': '1'}), - data={'format': 'json', 'skor': '50'} - ) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_can_not_update_skor_supervisor_sekolah_because_of_no_laporan(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_supervisor_sekolah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.put( - reverse('laporan_praktikum:supervisor-sekolah-nilai-laporan-mingguan-mahasiswa', - kwargs={'username': 'username2', 'id': '2'}), - data={'format': 'json', 'skor': '50'} - ) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_can_not_update_skor_supervisor_sekolah_before_login(self): - self.client.credentials(HTTP_AUTHORIZATION=token_type + 'falsetoken') - response = self.client.put( - reverse('laporan_praktikum:supervisor-sekolah-nilai-laporan-mingguan-mahasiswa', - kwargs={'username': 'username2', 'id': '1'}), - data={'format': 'json', 'skor': '50'} - ) - self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) - - def test_can_not_update_skor_other_role_in_login_supervisor_sekolah(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_mahasiswa) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.put( - reverse('laporan_praktikum:supervisor-sekolah-nilai-laporan-mingguan-mahasiswa', - kwargs={'username': 'username3', 'id': '1'}), - data={'format': 'json', 'skor': '50'} - ) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) diff --git a/new/laporan_praktikum/tests/test_serializers.py b/new/laporan_praktikum/tests/test_serializers.py deleted file mode 100644 index e69de29..0000000 diff --git a/new/laporan_praktikum/tests/test_views.py b/new/laporan_praktikum/tests/test_views.py deleted file mode 100644 index 6d7027d..0000000 --- a/new/laporan_praktikum/tests/test_views.py +++ /dev/null @@ -1,1195 +0,0 @@ -from authentication.models import ( - User, - Mahasiswa, - SupervisorLembaga, - KoordinatorKuliah, - SupervisorSekolah, - Administrator, - Periode -) -from laporan_praktikum.models import ( - Praktikum, - KelolaLaporanPraktikum, - MahasiswaPraktikum -) -from laporan_praktikum.serializers import ( - RiwayatLaporanPraktikumMahasiswaSerializer -) -from lembaga.models import Lembaga, Tema, Institusi -from laporan_praktikum.models import LaporanAkhirPraktikum - -from django.test import TestCase -from rest_framework.request import Request -from rest_framework.test import APITestCase, APIRequestFactory, APIClient -from rest_framework_jwt.settings import api_settings -from django.urls import reverse -from mixer.backend.django import mixer -from io import BytesIO -from PIL import Image -from django.core.files import File -from rest_framework import status - -import collections -import datetime -import json - -factory = APIRequestFactory() -request = factory.get('/') - -serializer_context = { - 'request': Request(request), -} - -response_field = ['success', 'status_code', 'message'] -token_type = "Bearer " -''' -class RiwayatLaporanPraktikumLembagaTest(TestCase): - - def setUp(self): - - jenis_praktikum = Praktikum.objects.create( - jenis_praktikum="Praktikum 1" - ) - - user_mahasiswa = User.objects.create_user( - username="username1", - role=Role.MHS.value, - email="username1@email.com", - password="password", - full_name="User Name1" - ) - - lembaga_test = Lembaga.objects.create(nama="nama_lembaga_4") - lembaga_test.save() - - laporan = LaporanAkhirPraktikum.objects.create( - mahasiswa = user_mahasiswa, - jenis_praktikum = jenis_praktikum, - lembaga = Lembaga.objects.get(nama="nama_lembaga_4"), - praktikum_ke = 1, - periode_praktikum = "", - laporan_akhir = "", - profil_lembaga = "", - umpan_balik = "", - ) - - def test_get_riwayat_laporan_exist(self): - laporan_mahasiswa = LaporanAkhirPraktikum.objects.filter(lembaga=Lembaga.objects.get(nama="nama_lembaga_4").id) - self.assertNotEqual(laporan_mahasiswa, []) - - def test_get_riwayat_laporan_empty_string(self): - laporan_mahasiswa = LaporanAkhirPraktikum.objects.filter(lembaga=Lembaga.objects.get(nama="").id).count() - self.assertFalse(laporan_mahasiswa, []) - -''' -class TestListMahasiswaSupervisorLembaga(APITestCase): - def setUp(self): - self.JWT_PAYLOAD_HANDLER = api_settings.JWT_PAYLOAD_HANDLER - self.JWT_ENCODE_HANDLER = api_settings.JWT_ENCODE_HANDLER - - self.user_supervisor_lembaga = User.objects.create_user( - username="username3", - email="username3@email.com", - password="password", - first_name="User", - last_name="Name3" - ) - - - def test_no_mahasiswa_for_supervisor_lembaga(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_supervisor_lembaga) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - - response = self.client.get( - reverse('laporan_praktikum:supervisor-lembaga-list-mahasiswa'), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_cannot_see_API_without_login(self): - response = self.client.get( - reverse('laporan_praktikum:supervisor-lembaga-list-mahasiswa'), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) - -class RiwayatLaporanPraktikumMahasiswaTest(TestCase): - - def setUp(self): - - jenis_praktikum = Praktikum.objects.create( - jenis_praktikum="Praktikum 1" - ) - - user_mahasiswa = User.objects.create_user( - username="username1", - email="username1@email.com", - password="password", - first_name="User", - last_name="Name1" - ) - - user_mahasiswa_2 = User.objects.create_user( - username="username2", - email="username2@email.com", - password="password", - first_name="User", - last_name="Name2" - ) - - self.user_mahasiswa_3 = User.objects.create_user( - username="username3", - email="username1@email.com", - password="password", - first_name="User", - last_name="Name1" - ) - - periode = Periode.objects.create( - nama="periode" - ) - - profile_mahasiswa = Mahasiswa.objects.create( - user=user_mahasiswa, - npm="npm", - org_code="org_code", - faculty="faculty", - major="major", - program="program", - periode=periode, - supervisor_lembaga=None, - supervisor_sekolah=None - ) - - profile_mahasiswa_2 = Mahasiswa.objects.create( - user=user_mahasiswa_2, - npm="npm", - org_code="org_code", - faculty="faculty", - major="major", - program="program", - periode=periode, - supervisor_lembaga=None, - supervisor_sekolah=None - ) - - self.profile_mahasiswa_3 = Mahasiswa.objects.create( - user=self.user_mahasiswa_3, - npm="npm", - org_code="org_code", - faculty="faculty", - major="major", - program="program", - periode=periode, - supervisor_lembaga=None, - supervisor_sekolah=None - ) - - laporan_praktikum = KelolaLaporanPraktikum.objects.create( - nama_laporan="Laporan Minggu 1", - waktu_deadline=datetime.datetime.now(), - waktu_submisi=None, - status_publikasi=True, - status_submisi=False, - skor_laporan_sekolah=-1, - skor_laporan_lembaga=-1, - mahasiswa=profile_mahasiswa, - jenis_praktikum=jenis_praktikum, - link_submisi="http://website.hosted/laporan_minggu1.pdf" - ) - - laporan_praktikum_for_xss = KelolaLaporanPraktikum.objects.create( - nama_laporan="Laporan Minggu 2", - waktu_deadline=datetime.datetime.strptime("12-12-9999 23:54", '%d-%m-%Y %H:%M'), - waktu_submisi=None, - status_publikasi=True, - status_submisi=False, - skor_laporan_sekolah=-1, - skor_laporan_lembaga=-1, - mahasiswa=self.profile_mahasiswa_3, - jenis_praktikum=jenis_praktikum, - link_submisi=None - ) - - def test_get_riwayat_laporan_by_mahasiswa(self): - user_mahasiswa_data = User.objects.get(username="username1") - profile_mahasiswa = Mahasiswa.objects.get(user=user_mahasiswa_data) - laporan_mahasiswa = KelolaLaporanPraktikum.objects.filter(mahasiswa=profile_mahasiswa) - serializer = RiwayatLaporanPraktikumMahasiswaSerializer(laporan_mahasiswa, context=serializer_context, many=True) - self.assertNotEqual(laporan_mahasiswa.count(), 0) - self.assertNotEqual(serializer.data, []) - - def test_get_riwayat_laporan_by_mahasiswa_empty(self): - user_mahasiswa_data = User.objects.get(username="username2") - profile_mahasiswa = Mahasiswa.objects.get(user=user_mahasiswa_data) - laporan_mahasiswa = KelolaLaporanPraktikum.objects.filter(mahasiswa=profile_mahasiswa) - serializer = RiwayatLaporanPraktikumMahasiswaSerializer(laporan_mahasiswa, context=serializer_context, many=True) - self.assertEqual(laporan_mahasiswa.count(), 0) - self.assertEqual(serializer.data, []) - - def test_post_invalid_laporan_by_mahasiswa(self): - payload = api_settings.JWT_PAYLOAD_HANDLER(self.user_mahasiswa_3) - jwt_token = api_settings.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - client = APIClient() - client.credentials(HTTP_AUTHORIZATION='Bearer ' + token) - laporan_id = KelolaLaporanPraktikum.objects.get(nama_laporan="Laporan Minggu 2").id - response = client.post(reverse('laporan_praktikum:submit-link-laporan-praktikum'), {'id':laporan_id,'waktu_submisi':"12-12-2020 23:54",'link_submisi':'javascript:alert(1)','status_submisi':True}) - self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - - def test_post_valid_laporan_by_mahasiswa(self): - payload = api_settings.JWT_PAYLOAD_HANDLER(self.user_mahasiswa_3) - jwt_token = api_settings.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - client = APIClient() - client.credentials(HTTP_AUTHORIZATION='Bearer ' + token) - laporan_id = KelolaLaporanPraktikum.objects.get(nama_laporan="Laporan Minggu 2").id - response = client.post(reverse('laporan_praktikum:submit-link-laporan-praktikum'), {'id':laporan_id,'waktu_submisi':"12-12-2020 23:54",'link_submisi':'http://evil.com','status_submisi':True}) - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - -class MahasiswaAPITest(TestCase): - def setUp(self): - periode = Periode.objects.create( - nama="periode" - ) - - user_mahasiswa = User.objects.create_user( - username="username1", - email="username1@email.com", - password="password", - first_name="User", - last_name="Name1" - ) - - user_mahasiswa_2 = User.objects.create_user( - username="username2", - email="username2@email.com", - password="password", - first_name="User", - last_name="Name2" - ) - - profile_mahasiswa = Mahasiswa.objects.create( - user=user_mahasiswa, - npm="1806243684", - org_code="org_code", - faculty="faculty", - major="major", - program="program", - periode=periode, - supervisor_lembaga=None, - supervisor_sekolah=None - ) - - profile_mahasiswa_2 = Mahasiswa.objects.create( - user=user_mahasiswa_2, - npm="1806241085", - org_code="org_code", - faculty="faculty", - major="major", - program="program", - periode=periode, - supervisor_lembaga=None, - supervisor_sekolah=None - ) - - # Test to check whether the API Load all mahasiswa Data - def test_get_all_mahasiswa(self): - data = Mahasiswa.objects.all() - # Test if it returns non empty data - self.assertTrue(len(data) > 0) - - # Test to check whether the API can filter data by npm (EXISTS) - def test_get_mahasiswa_by_npm_exists(self): - data = Mahasiswa.objects.filter(npm=1806241085) - self.assertTrue(len(data) > 0) - - # Test to check whether the API can filter data by npm (NOT EXISTS) - def test_get_mahasiswa_by_npm_not_exists(self): - data = Mahasiswa.objects.filter(npm=180624108500) - self.assertTrue(len(data) == 0) - - # Test to check whether the API can handle NULL input or not - def test_get_mahasiswa_by_npm_null(self): - data = Mahasiswa.objects.filter(npm=None) - self.assertTrue(len(data) == 0) - - # Test API can be loaded - def test_can_see_API(self): - response = self.client.get( - reverse('laporan_praktikum:mahasiswa'), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_200_OK) - -class PeriodeAPITest(APITestCase): - """ - Test for supervisor sekolah list and detail laporan - """ - def get_image_file(self, name='test.png', ext='png', size=(50, 50), color=(256, 0, 0)): - '''Mock image''' - file_obj = BytesIO() - image = Image.new("RGBA", size=size, color=color) - image.save(file_obj, ext) - file_obj.seek(0) - return File(file_obj, name=name) - - def setUp(self): - self.JWT_PAYLOAD_HANDLER = api_settings.JWT_PAYLOAD_HANDLER - self.JWT_ENCODE_HANDLER = api_settings.JWT_ENCODE_HANDLER - - self.user_mahasiswa_not_valid2 = User.objects.create_user( - username="username1", - email="username1@email.com", - password="password", - first_name="User", - last_name="Name1" - ) - - self.user_mahasiswa = User.objects.create_user( - username="username2", - email="username2@email.com", - password="password", - first_name="User", - last_name="Name2" - ) - - self.supervisor_sekolah = mixer.blend( - SupervisorSekolah, user=mixer.blend( - User - ) - ) - - self.supervisor_lembaga = mixer.blend( - SupervisorLembaga, lembaga=mixer.blend( - Lembaga, institusi=mixer.blend( - Institusi - ), tema=mixer.blend( - Tema - ), gambar=self.get_image_file() - ), user=mixer.blend( - User - ) - ) - - periode = Periode.objects.create( - nama="periode" - ) - - self.mahasiswa = mixer.blend( - Mahasiswa, - supervisor_lembaga=self.supervisor_lembaga, - supervisor_sekolah=self.supervisor_sekolah, - periode=periode, - user=self.user_mahasiswa - ) - - Mahasiswa.objects.create( - user=self.user_mahasiswa_not_valid2, - npm="npm", - org_code="org_code", - faculty="faculty", - major="major", - program="program", - periode=periode, - supervisor_lembaga=self.supervisor_lembaga, - supervisor_sekolah=self.supervisor_sekolah - ) - - self.user_koordinator_kuliah = User.objects.create_user( - username="username3", - email="username3@email.com", - password="password", - first_name="User", - last_name="Name3" - ) - - koordinator_kuliah = KoordinatorKuliah.objects.create( - user=self.user_koordinator_kuliah, - nip="nip" - ) - - praktikum = Praktikum.objects.create( - jenis_praktikum="Praktikum 1" - ) - - MahasiswaPraktikum.objects.create( - mahasiswa=self.mahasiswa, - list_praktikum=praktikum, - status=True - ) - - KelolaLaporanPraktikum.objects.create( - nama_laporan='nama_laporan_1', - mahasiswa=self.mahasiswa, - jenis_praktikum=praktikum, - waktu_deadline=datetime.datetime( - 2020, - 5, - 5, - 5, - 5, - 5 - ), - status_publikasi=True, - status_submisi=False, - skor_laporan_sekolah=-1, - skor_laporan_lembaga=-1 - ) - - def test_can_load_api(self): - response = self.client.get( - reverse('laporan_praktikum:periode'), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_200_OK) - -class KoordinatorKuliahDashboardAPITest(APITestCase): - """ - Test for supervisor sekolah list and detail laporan - """ - def get_image_file(self, name='test.png', ext='png', size=(50, 50), color=(256, 0, 0)): - '''Mock image''' - file_obj = BytesIO() - image = Image.new("RGBA", size=size, color=color) - image.save(file_obj, ext) - file_obj.seek(0) - return File(file_obj, name=name) - - def setUp(self): - self.JWT_PAYLOAD_HANDLER = api_settings.JWT_PAYLOAD_HANDLER - self.JWT_ENCODE_HANDLER = api_settings.JWT_ENCODE_HANDLER - - self.user_mahasiswa_not_valid2 = User.objects.create_user( - username="username1", - email="username1@email.com", - password="password", - first_name="User", - last_name="Name1" - ) - - self.user_mahasiswa = User.objects.create_user( - username="username2", - email="username2@email.com", - password="password", - first_name="User", - last_name="Name2" - ) - - self.supervisor_sekolah = mixer.blend( - SupervisorSekolah, user=mixer.blend( - User - ) - ) - - self.supervisor_lembaga = mixer.blend( - SupervisorLembaga, lembaga=mixer.blend( - Lembaga, institusi=mixer.blend( - Institusi - ), tema=mixer.blend( - Tema - ), gambar=self.get_image_file() - ), user=mixer.blend( - User - ) - ) - - periode = Periode.objects.create( - nama="periode" - ) - - self.mahasiswa = mixer.blend( - Mahasiswa, - supervisor_lembaga=self.supervisor_lembaga, - supervisor_sekolah=self.supervisor_sekolah, - periode=periode, - user=self.user_mahasiswa - ) - - Mahasiswa.objects.create( - user=self.user_mahasiswa_not_valid2, - npm="npm", - org_code="org_code", - faculty="faculty", - major="major", - program="program", - periode=periode, - supervisor_lembaga=self.supervisor_lembaga, - supervisor_sekolah=self.supervisor_sekolah - ) - - self.user_koordinator_kuliah = User.objects.create_user( - username="username3", - email="username3@email.com", - password="password", - first_name="User", - last_name="Name3" - ) - - koordinator_kuliah = KoordinatorKuliah.objects.create( - user=self.user_koordinator_kuliah, - nip="nip" - ) - - praktikum = Praktikum.objects.create( - jenis_praktikum="Praktikum 1" - ) - - MahasiswaPraktikum.objects.create( - mahasiswa=self.mahasiswa, - list_praktikum=praktikum, - status=True - ) - - KelolaLaporanPraktikum.objects.create( - nama_laporan='nama_laporan_1', - mahasiswa=self.mahasiswa, - jenis_praktikum=praktikum, - waktu_deadline=datetime.datetime( - 2020, - 5, - 5, - 5, - 5, - 5 - ), - status_publikasi=True, - status_submisi=False, - skor_laporan_sekolah=-1, - skor_laporan_lembaga=-1 - ) - - # Koordinator Kuliah Mahasiswa List - def test_can_not_see_list_mahasiswa_koordinator_kuliah_before_login(self): - self.client.credentials(HTTP_AUTHORIZATION=token_type + 'falsetoken') - response = self.client.get( - reverse('laporan_praktikum:koordinator-kuliah-list-mahasiswa'), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) - - def test_can_not_see_list_mahasiswa_other_role_in_login_koordinator_kuliah(self): - payload = self.JWT_PAYLOAD_HANDLER(self.mahasiswa.user) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:koordinator-kuliah-list-mahasiswa'), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - # Koordinator Kuliah Daftar Mahasiswa - def test_can_see_daftar_mahasiswa_after_login(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_koordinator_kuliah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - # Test API URL is accessible without parameter - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:mahasiswa', kwargs={})) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - # Test API URL is accessible with npm parameter - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - "%s?npm=npm" % reverse('laporan_praktikum:mahasiswa')) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - # Koordinator Kuliah Grafik Pengumpulan - # [ Negative Test ] - # seeing API without login and no authorization token - '''def test_can_see_grafik_pengumpulan_tepat_waktu_without_login(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_koordinator_kuliah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - # Test API URL without providing AUTH TOKEN - response = self.client.get( - reverse('laporan_praktikum:koordinator-kuliah-grafik-pengumpulan-tepat-waktu')) - self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)''' - - # [ Positive Tests ] - # seeing API after login and with authorization token - def test_can_see_grafik_pengumpulan_tepat_waktu_after_login(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_koordinator_kuliah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - # Test API URL is accessible (Normal Flow) - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:koordinator-kuliah-grafik-pengumpulan-tepat-waktu')) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - # Check if the API can load all the data - def test_can_load_data(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_koordinator_kuliah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - # Test API URL is accessible (Normal Flow) - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:koordinator-kuliah-grafik-pengumpulan-tepat-waktu')) - self.assertIsNotNone(response.content) - - # ==================================================== - # Koordinator Kuliah Persentase Ketepatan Pengumpulan - # ==================================================== - # [ Negative Test ] - # seeing API without login and no authorization token - '''def test_can_see_persentase_ketepatan_pengumpulan_without_login(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_koordinator_kuliah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - # Test API URL without providing AUTH TOKEN - response = self.client.get( - reverse('laporan_praktikum:koordinator-kuliah-persentase-pengumpulan-laporan')) - self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)''' - - # [ Positive Tests ] - # seeing API after login and with authorization token - def test_can_see_persentase_ketepatan_pengumpulan_after_login(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_koordinator_kuliah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - # Test API URL is accessible (Normal Flow) - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:koordinator-kuliah-persentase-pengumpulan-laporan')) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - # Check if the API can load all the data - def test_can_load_data_persentase_ketepatan_pengumpulan(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_koordinator_kuliah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - # Test API URL is accessible (Normal Flow) - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:koordinator-kuliah-persentase-pengumpulan-laporan')) - self.assertIsNotNone(response.content) - - # ==================================================== - # Koordinator Kuliah Persentase Penilaian - # ==================================================== - # [ Negative Test ] - # seeing API without login and no authorization token - '''def test_can_see_persentase_ketepatan_pengumpulan_without_login(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_koordinator_kuliah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - # Test API URL without providing AUTH TOKEN - response = self.client.get( - reverse('laporan_praktikum:koordinator-kuliah-persentase-penilaian-laporan')) - self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)''' - - # [ Positive Tests ] - # seeing API after login and with authorization token - def test_can_see_persentase_penilaian_after_login(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_koordinator_kuliah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - # Test API URL is accessible (Normal Flow) - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:koordinator-kuliah-persentase-penilaian-laporan')) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - # Check if the API can load all the data - def test_can_load_data_persentase_penilaian(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_koordinator_kuliah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - # Test API URL is accessible (Normal Flow) - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:koordinator-kuliah-persentase-penilaian-laporan')) - self.assertIsNotNone(response.content) - - # ====================================================================================== - # Koordinator Kuliah Laporan List - def test_can_see_list_laporan_koordinator_kuliah_after_login(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_koordinator_kuliah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:koordinator-kuliah-persentase-pengumpulan-laporan')) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_can_not_see_list_laporan_koordinator_kuliah_because_of_no_user(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_koordinator_kuliah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:koordinator-kuliah-list-praktikum-mahasiswa', kwargs={'username': 'usernamefake'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_can_not_see_list_laporan_koordinator_kuliah_because_of_no_praktikum(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_koordinator_kuliah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:koordinator-kuliah-list-praktikum-mahasiswa', kwargs={'username': 'username1'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_can_not_see_list_laporan_koordinator_kuliah_before_login(self): - self.client.credentials(HTTP_AUTHORIZATION=token_type + 'falsetoken') - response = self.client.get( - reverse('laporan_praktikum:koordinator-kuliah-list-praktikum-mahasiswa', kwargs={'username': 'username2'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) - - def test_can_not_see_list_laporan_other_role_in_login_koordinator_kuliah(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_mahasiswa) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:koordinator-kuliah-list-praktikum-mahasiswa', kwargs={'username': 'username3'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - # Koordinator Kuliah Detail List - - def test_can_see_detail_laporan_koordinator_kuliah_after_login(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_koordinator_kuliah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:koordinator-kuliah-detail-laporan-mingguan-mahasiswa', kwargs={'username': 'username2', 'id': '1'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_can_not_see_detail_laporan_koordinator_kuliah_because_of_no_user(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_koordinator_kuliah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:koordinator-kuliah-detail-laporan-mingguan-mahasiswa', kwargs={'username': 'usernamefake', 'id': '1'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_can_not_see_detail_laporan_koordinator_kuliah_because_of_no_laporan(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_koordinator_kuliah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:koordinator-kuliah-detail-laporan-mingguan-mahasiswa', kwargs={'username': 'username2', 'id': '2'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_can_not_see_detail_laporan_koordinator_kuliah_before_login(self): - self.client.credentials(HTTP_AUTHORIZATION=token_type + 'falsetoken') - response = self.client.get( - reverse('laporan_praktikum:koordinator-kuliah-detail-laporan-mingguan-mahasiswa', kwargs={'username': 'username2', 'id': '1'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) - - def test_can_not_see_detail_laporan_other_role_in_login_koordinator_kuliah(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_mahasiswa) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:koordinator-kuliah-detail-laporan-mingguan-mahasiswa', kwargs={'username': 'username3', 'id': '1'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - -class AdministratorDashboardAPITest(APITestCase): - """ - Test for administrator - """ - - def setUp(self): - self.JWT_PAYLOAD_HANDLER = api_settings.JWT_PAYLOAD_HANDLER - self.JWT_ENCODE_HANDLER = api_settings.JWT_ENCODE_HANDLER - - self.user_administrator = User.objects.create_user( - username="username4", - email="username4@email.com", - password="password", - first_name="User", - last_name="Name4" - ) - - administrator = Administrator.objects.create( - user=self.user_administrator, - nip="nip" - ) - - self.user_koordinator_kuliah = User.objects.create_user( - username="username3", - email="username3@email.com", - password="password", - first_name="User", - last_name="Name3" - ) - - self.koordinator_kuliah = mixer.blend( - KoordinatorKuliah, - user=self.user_koordinator_kuliah - ) - - self.supervisor_sekolah = mixer.blend( - SupervisorSekolah, - user=mixer.blend( - User, - username="username1" - ) - ) - - self.supervisor_lembaga = mixer.blend( - SupervisorLembaga, lembaga=mixer.blend( - Lembaga, institusi=mixer.blend( - Institusi - ), tema=mixer.blend( - Tema - ), - ), user=mixer.blend( - User, - username="username2", - ) - ) - - self.mahasiswa = mixer.blend( - Mahasiswa, - supervisor_lembaga=self.supervisor_lembaga, - supervisor_sekolah=self.supervisor_sekolah, - user=mixer.blend( - User, - username="username0", - email="username0@email.com", - ) - ) - - praktikum = Praktikum.objects.create( - jenis_praktikum="Praktikum 1" - ) - - MahasiswaPraktikum.objects.create( - mahasiswa=self.mahasiswa, - list_praktikum=praktikum, - status=True - ) - - # [ Administrator Statistik ] - - # ================= - # [ Positive Test ] - # ================= - def test_can_see_statistik_administrator_by_tema_after_login(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_administrator) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get('/api/v1/administrator/statistik-lembaga?berdasarkan=tema&tahun=2020') - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_can_see_statistik_administrator_by_institusi_after_login(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_administrator) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get('/api/v1/administrator/statistik-lembaga?berdasarkan=institusi&tahun=2020') - self.assertEqual(response.status_code, status.HTTP_200_OK) - - # ================= - # [ Negative Test ] - # ================= - def test_can_not_see_statistik_administrator_before_login(self): - # Provide False Token - self.client.credentials(HTTP_AUTHORIZATION=token_type + 'falsetoken') - response = self.client.get('/api/v1/administrator/statistik-lembaga?berdasarkan=tema&tahun=2020') - self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) - - def test_can_not_see_statistik_administrator_without_parameters(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_administrator) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:administrator-statistik'), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - - # Administrator User List - - def test_can_see_list_user_administrator_after_login(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_administrator) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:administrator-list-user'), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_can_not_see_list_user_administrator_before_login(self): - self.client.credentials(HTTP_AUTHORIZATION=token_type + 'falsetoken') - response = self.client.get( - reverse('laporan_praktikum:administrator-list-user'), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) - - def test_can_not_see_list_user_other_role_in_login_administrator(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_koordinator_kuliah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:administrator-list-user'), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - # Administrator Detail Kelola Mahasiswa - - def test_can_see_detail_kelola_mahasiswa_data_by_administrator_after_login(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_administrator) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:administrator-detail-user-mahasiswa', kwargs={'username': 'username0'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_can_not_see_detail_kelola_mahasiswa_data_by_administrator_because_of_no_user(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_administrator) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:administrator-detail-user-mahasiswa', kwargs={'username': 'usernamefake'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_can_not_see_detail_kelola_mahasiswa_data_by_administrator_because_of_not_mahasiswa(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_administrator) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:administrator-detail-user-mahasiswa', kwargs={'username': 'username1'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_can_not_see_detail_kelola_mahasiswa_data_by_administrator_before_login(self): - self.client.credentials(HTTP_AUTHORIZATION=token_type + 'falsetoken') - response = self.client.get( - reverse('laporan_praktikum:administrator-detail-user-mahasiswa', kwargs={'username': 'username0'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) - - def test_can_not_see_detail_kelola_other_role_for_mahasiswa_in_login_administrator(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_koordinator_kuliah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:administrator-detail-user-mahasiswa', kwargs={'username': 'username0'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - # Administrator Detail Kelola Supervisor Sekolah - - def test_can_see_detail_kelola_supervisor_sekolah_data_by_administrator_after_login(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_administrator) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:administrator-detail-user-supervisor-sekolah', kwargs={'username': 'username1'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_can_not_see_detail_kelola_supervisor_sekolah_data_by_administrator_because_of_no_user(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_administrator) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:administrator-detail-user-supervisor-sekolah', kwargs={'username': 'usernamefake'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_can_not_see_detail_kelola_supervisor_sekolah_data_by_administrator_because_of_not_supervisor_sekolah(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_administrator) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:administrator-detail-user-supervisor-sekolah', kwargs={'username': 'username2'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_can_not_see_detail_kelola_supervisor_sekolah_data_by_administrator_before_login(self): - self.client.credentials(HTTP_AUTHORIZATION=token_type + 'falsetoken') - response = self.client.get( - reverse('laporan_praktikum:administrator-detail-user-supervisor-sekolah', kwargs={'username': 'username1'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) - - def test_can_not_see_detail_kelola_other_role_for_supervisor_sekolah_in_login_administrator(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_koordinator_kuliah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:administrator-detail-user-supervisor-sekolah', kwargs={'username': 'username1'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - # Administrator Detail Kelola Supervisor Lembaga - - def test_can_see_detail_kelola_supervisor_lembaga_data_by_administrator_after_login(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_administrator) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:administrator-detail-user-supervisor-lembaga', kwargs={'username': 'username2'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_can_not_see_detail_kelola_supervisor_lembaga_data_by_administrator_because_of_no_user(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_administrator) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:administrator-detail-user-supervisor-lembaga', kwargs={'username': 'usernamefake'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_can_not_see_detail_kelola_supervisor_lembaga_data_by_administrator_because_of_not_supervisor_lembaga(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_administrator) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:administrator-detail-user-supervisor-lembaga', kwargs={'username': 'username3'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_can_not_see_detail_kelola_supervisor_lembaga_data_by_administrator_before_login(self): - self.client.credentials(HTTP_AUTHORIZATION=token_type + 'falsetoken') - response = self.client.get( - reverse('laporan_praktikum:administrator-detail-user-supervisor-lembaga', kwargs={'username': 'username2'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) - - def test_can_not_see_detail_kelola_other_role_for_supervisor_lembaga_in_login_administrator(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_koordinator_kuliah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:administrator-detail-user-supervisor-lembaga', kwargs={'username': 'username2'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - # Administrator Detail Kelola Koordinator Kuliah - - def test_can_see_detail_kelola_koordinator_kuliah_data_by_administrator_after_login(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_administrator) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:administrator-detail-user-koordinator-kuliah', kwargs={'username': 'username3'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_can_not_see_detail_kelola_koordinator_kuliah_data_by_administrator_because_of_no_user(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_administrator) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:administrator-detail-user-koordinator-kuliah', kwargs={'username': 'usernamefake'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_can_not_see_detail_kelola_koordinator_kuliah_data_by_administrator_because_of_not_koordinator_kuliah(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_administrator) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:administrator-detail-user-koordinator-kuliah', kwargs={'username': 'username4'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_can_not_see_detail_kelola_koordinator_kuliah_data_by_administrator_before_login(self): - self.client.credentials(HTTP_AUTHORIZATION=token_type + 'falsetoken') - response = self.client.get( - reverse('laporan_praktikum:administrator-detail-user-koordinator-kuliah', kwargs={'username': 'username3'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) - - def test_can_not_see_detail_kelola_other_role_for_koordinator_kuliah_in_login_administrator(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_koordinator_kuliah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:administrator-detail-user-koordinator-kuliah', kwargs={'username': 'username3'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - # Administrator Detail Kelola Administrator - - def test_can_see_detail_kelola_administrator_data_by_administrator_after_login(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_administrator) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:administrator-detail-user-administrator', kwargs={'username': 'username4'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_can_not_see_detail_kelola_administrator_data_by_administrator_because_of_no_user(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_administrator) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:administrator-detail-user-administrator', kwargs={'username': 'usernamefake'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_can_not_see_detail_kelola_administrator_data_by_administrator_because_of_not_administrator(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_administrator) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:administrator-detail-user-administrator', kwargs={'username': 'username0'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_can_not_see_detail_kelola_administrator_data_by_administrator_before_login(self): - self.client.credentials(HTTP_AUTHORIZATION=token_type + 'falsetoken') - response = self.client.get( - reverse('laporan_praktikum:administrator-detail-user-administrator', kwargs={'username': 'username4'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) - - def test_can_not_see_detail_kelola_other_role_for_administrator_in_login_administrator(self): - payload = self.JWT_PAYLOAD_HANDLER(self.user_koordinator_kuliah) - jwt_token = self.JWT_ENCODE_HANDLER(payload) - token = jwt_token - - self.client.credentials(HTTP_AUTHORIZATION=token_type + token) - response = self.client.get( - reverse('laporan_praktikum:administrator-detail-user-administrator', kwargs={'username': 'username4'}), data={'format': 'json'}) - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - diff --git a/new/laporan_praktikum/urls.py b/new/laporan_praktikum/urls.py deleted file mode 100644 index 56e0694..0000000 --- a/new/laporan_praktikum/urls.py +++ /dev/null @@ -1,286 +0,0 @@ -''' Module routing in lembaga app''' -from django.urls import path -from laporan_praktikum import views, views_riwayat -from laporan_praktikum.supervisor_lembaga import views_supv_lembaga -from laporan_praktikum.supervisor_sekolah import views as v_supv_sekolah - -# Temp for sprint review -from .views import MahasiswaPraktikumView -from rest_framework import routers -from django.urls import include - -# Endpoint Variables -laporan_praktikum_admin = "admin/laporan_praktikum" - -app_name = 'laporan_praktikum' - -urlpatterns = [ - - # Show riwayat praktikum by lembaga - path('lembaga/praktikum', - views_riwayat.get_riwayat_laporan_by_lembaga, - name='list-praktikum-mahasiswa'), - # Show jenis praktikum mahasiswa - path('mahasiswa/praktikum/', - views.UserMahasiswaListPraktikumView.as_view(), - name='list-praktikum-mahasiswa'), - - # Show laporan mahasiswa list detail - path('mahasiswa/praktikum/laporan-detail/', - views.get_list_laporan_praktikum_detail, - name='laporan-praktikum-mahasiswa'), - - # Get Laporan Mahasiswa By id - path('mahasiswa/praktikum/laporan-detail//', - views.get_laporan_mahasiswa_by_id, - name='laporan-mahasiswa-by-id'), - - # Get Laporan Akhir Mahasiswa By id - path('mahasiswa/praktikum/laporan-akhir-detail//', - views.get_laporan_akhir_mahasiswa_by_id, - name='laporan-akhir-mahasiswa-by-id'), - - # Get Laporan Borang Mahasiswa By id - path('mahasiswa/praktikum/laporan-borang-detail//', - views.get_laporan_borang_mahasiswa_by_id, - name='laporan-borang-mahasiswa-by-id'), - - # Submit link drive laporan mingguan mahasiswa - path('mahasiswa/praktikum/laporan-detail/submit-link/', - views.submit_link_laporan_praktikum, - name='submit-link-laporan-praktikum'), - - # Submit laporan akhir mahasiswa - path('mahasiswa/praktikum/laporan-akhir/submit/', - views.crud_submisi_laporan_akhir_mahasiswa, - name='submit-laporan-akhir-praktikum'), - - # Submit laporan borang mahasiswa - path('mahasiswa/praktikum/laporan-borang/submit/', - views.crud_submisi_laporan_borang_mahasiswa, - name='submit-laporan-akhir-praktikum'), - - # Update laporan praktikum slot mahasiswa - path('mahasiswa/praktikum/laporan-update//', - views.get_or_update_laporan_praktikum, - name='get-or-update-laporan-praktikum'), - - # Delete laporan praktikum slot mahasiswa - path('mahasiswa/praktikum/laporan-update//delete-laporan///', - views.delete_laporan_praktikum, - name='delete-laporan-praktikum'), - - # List Riwayat Laporan Praktikum by mahasiswa - path('mahasiswa/praktikum/riwayat-laporan/', - views_riwayat.get_riwayat_laporan_by_mahasiswa, - name='riwayat-laporan-mahasiswa'), - - # Supervisor Lembaga - path('supervisor-lembaga//', - views.get_supervisor_lembaga_by_id_lembaga, - name='list-supervisor-lembaga-by-id-lembaga'), - - path('supervisor-lembaga/praktikum-mahasiswa/riwayat-laporan/', - views_riwayat.get_riwayat_laporan_by_supervisor_lembaga, - name='riwayat-laporan-mahasiswa-by-supervisor-lembaga'), - - path('supervisor-lembaga/list-mahasiswa/praktikum/', - views.UserSupervisorLembagaListMahasiswaView.as_view(), - name='supervisor-lembaga-list-mahasiswa'), - - path('supervisor-lembaga/list-mahasiswa/praktikum/laporan-akhir//', - views_supv_lembaga.UserSupervisorLembagaDetailLaporanAkhirMahasiswaView.as_view(), - name='supervisor-lembaga-detail-laporan-akhir-mahasiswa'), - - path('supervisor-lembaga/praktikum-mahasiswa/nilai///', - views_supv_lembaga.UserSupervisorLembagaNilaiPraktikumMahasiswaView.as_view(),\ - name='supervisor-sekolah-nilai-praktikum-mahasiswa'), - - # Koordinator Kuliah - path('koordinator-kuliah/list-mahasiswa/praktikum/', - views.UserKoordinatorKuliahListMahasiswaView.as_view(), - name='koordinator-kuliah-list-mahasiswa'), - - # Koordinator Kuliah Grafik Ketepatan Pengumpulan - path('koordinator-kuliah/riwayat-ketepatan-pengumpulan-laporan', - views_riwayat.get_riwayat_ketepatan_pengumpulan, - name='koordinator-kuliah-grafik-pengumpulan-tepat-waktu'), - - # Koordinator Kuliah Chart Persentase Ketepatan Pengumpulan - path('koordinator-kuliah/persentase-pengumpulan-laporan', - views_riwayat.get_persentase_ketepatan_pengumpulan, - name='koordinator-kuliah-persentase-pengumpulan-laporan'), - - # Koordinator Kuliah Chart Persentase Ketepatan Pengumpulan - path('koordinator-kuliah/persentase-penilaian-laporan-supervisor-sekolah', - views_riwayat.get_persentase_penilaian_laporan_supervisor_sekolah, - name='koordinator-kuliah-persentase-penilaian-laporan'), - - # Administrator - path('administrator/list-user/', - views.UserAdministratorListUserView.as_view(), - name='administrator-list-user'), - - # Supervisor Sekolah list praktikum mahasiswa - path('supervisor-sekolah/list-mahasiswa/praktikum/', - views.UserSupervisorSekolahListMahasiswaView.as_view(), - name='supervisor-sekolah-list-mahasiswa'), - - # List Praktikum Mahasiswa by Supervisor Sekolah - path('supervisor-sekolah/praktikum-mahasiswa/list//', - views.UserSupervisorSekolahListPraktikumMahasiswaView.as_view(), - name='supervisor-sekolah-list-praktikum-mahasiswa'), - - # List Riwayat Laporan Praktikum by supervisor Sekolah - path('supervisor-sekolah/praktikum-mahasiswa/riwayat-laporan/', - views_riwayat.get_riwayat_laporan_by_supervisor_sekolah, - name='riwayat-laporan-supervisor-sekolah'), - - # Detail Laporan Mingguan Mahasiswa Supervisor Sekolah by Username Mahasiswa and Id Laporan - path('supervisor-sekolah/laporan-mingguan-mahasiswa/detail///', - views.UserSupervisorSekolahDetailLaporanMingguanMahasiswaView.as_view(), - name='supervisor-sekolah-detail-laporan-mingguan-mahasiswa'), - - # Detail Laporan Akhir Mahasiswa Supervisor Sekolah by Username Mahasiswa and Id Laporan - path('supervisor-sekolah/laporan-akhir-mahasiswa/detail///', - views.UserSupervisorSekolahDetailLaporanAkhirMahasiswaView.as_view(), - name='supervisor-sekolah-detail-laporan-akhir-mahasiswa'), - - # Detail Borang Mahasiswa Supervisor Sekolah by Username Mahasiswa and Id Laporan - path('supervisor-sekolah/borang-mahasiswa/detail///', - views.UserSupervisorSekolahDetailBorangMahasiswaView.as_view(), - name='supervisor-sekolah-detail-borang-mahasiswa'), - - # Update Nilai Laporan Mingguan Mahasiswa Supervisor Sekolah by Username Mahasiswa and Id Laporan - path('supervisor-sekolah/laporan-mingguan-mahasiswa/nilai///', - views.UserSupervisorSekolahNilaiLaporanMingguanMahasiswaView.as_view(), - name='supervisor-sekolah-nilai-laporan-mingguan-mahasiswa'), - - # Update Nilai Laporan Akhir Mahasiswa Supervisor Sekolah by Username Mahasiswa and Id Laporan - path('supervisor-sekolah/laporan-akhir-mahasiswa/nilai///', - views.UserSupervisorSekolahNilaiLaporanAkhirMahasiswaView.as_view(), - name='supervisor-sekolah-nilai-laporan-akhir-mahasiswa'), - - # Create template laporan borang mahasiswa - path('supervisor-sekolah/praktikum-mahasiswa/upload-template-borang/', - v_supv_sekolah.crud_template_laporan_borang, - name='create-template-borang'), - - path('supervisor-sekolah/praktikum-mahasiswa/get-template-borang/', - v_supv_sekolah.get_template_laporan_borang, - name='get-template-borang'), - - # List Praktikum Mahasiswa by Koordinator Kuliah - path('koordinator-kuliah/praktikum-mahasiswa/list//', - views.UserKoordinatorKuliahListPraktikumMahasiswaView.as_view(), - name='koordinator-kuliah-list-praktikum-mahasiswa'), - - # Detail Praktikum Mahasiswa Koordinator Kuliah by Username Mahasiswa and Id Laporan - path('koordinator-kuliah/laporan-mingguan-mahasiswa/detail///', - views.UserKoordinatorKuliahDetailLaporanMingguanMahasiswaView.as_view(), - name='koordinator-kuliah-detail-laporan-mingguan-mahasiswa'), - - # Detail Laporan Akhir Mahasiswa Koordinator Kuliah by Username Mahasiswa and Id Laporan - path('koordinator-kuliah/laporan-akhir-mahasiswa/detail///', - views.UserKoordinatorKuliahDetailLaporanAkhirMahasiswaView.as_view(), - name='koordinator-kuliah-detail-laporan-akhir-mahasiswa'), - - # Detail Borang Mahasiswa Koordinator Kuliah by Username Mahasiswa and Id Laporan - path('koordinator-kuliah/borang-mahasiswa/detail///', - views.UserKoordinatorKuliahDetailBorangMahasiswaView.as_view(), - name='koordinator-kuliah-detail-borang-mahasiswa'), - - # Administrator User View Statistik Lembaga - path('administrator/statistik-lembaga', - views_riwayat.get_statistik_lembaga, - name='administrator-statistik'), - - # Administrator User View Detail Mahasiswa - path('administrator/kelola-user/detail/mahasiswa//', - views.UserAdministratorKelolaUserDetailUserMahasiswaView.as_view(), - name='administrator-detail-user-mahasiswa'), - - # Administrator User Edit Detail Mahasiswa - path('administrator/kelola-user/edit/mahasiswa//', - views.UserAdministratorKelolaUserEditUserMahasiswaView.as_view(), - name='administrator-edit-user-mahasiswa'), - - # Administrator User Detail Supervisor Sekolah - path('administrator/kelola-user/detail/supervisor-sekolah//', - views.UserAdministratorKelolaUserDetailUserSupervisorSekolahView.as_view(), - name='administrator-detail-user-supervisor-sekolah'), - - # Administrator User Edit Detail Supervisor Sekolah - path('administrator/kelola-user/edit/supervisor-sekolah//', - views.UserAdministratorKelolaUserEditUserSupervisorSekolahView.as_view(), - name='administrator-edit-user-supervisor-sekolah'), - - # Administrator Get All User Supervisor Lembaga - path('administrator/kelola-user/list/supervisor-sekolah/', - views.UserAdministratorGetAllUserSupervisorSekolahView.as_view(), - name='administrator-get-all-user-supervisor-lembaga'), - - # Administrator User Detail Supervisor Lembaga - path('administrator/kelola-user/detail/supervisor-lembaga//', - views.UserAdministratorKelolaUserDetailUserSupervisorLembagaView.as_view(), - name='administrator-detail-user-supervisor-lembaga'), - - # Administrator User Edit Detail Supervisor Lembaga - path('administrator/kelola-user/edit/supervisor-lembaga//', - views.UserAdministratorKelolaUserEditUserSupervisorLembagaView.as_view(), - name='administrator-edit-user-supervisor-lembaga'), - - # Administrator User Detail Koordinator Kuliah - path('administrator/kelola-user/detail/koordinator-kuliah//', - views.UserAdministratorKelolaUserDetailUserKoordinatorKuliahView.as_view(), - name='administrator-detail-user-koordinator-kuliah'), - - # Administrator User Edit Detail Koordinator Kuliah - path('administrator/kelola-user/edit/koordinator-kuliah//', - views.UserAdministratorKelolaUserEditUserKoordinatorKuliahView.as_view(), - name='administrator-edit-user-koordinator-kuliah'), - - # Administrator User Detail Administrator - path('administrator/kelola-user/detail/administrator//', - views.UserAdministratorKelolaUserDetailUserAdministratorView.as_view(), - name='administrator-detail-user-administrator'), - - # Administrator User Edit Detail Administrator - path('administrator/kelola-user/edit/administrator//', - views.UserAdministratorKelolaUserEditUserAdministratorView.as_view(), - name='administrator-edit-user-administrator'), - - # Administrator Upload All Mahasiswa Data From Excel - path('administrator/kelola-user/mahasiswa/upload/excel/', - views.InputDataMahasiswaExcelView.as_view(), - name='administrator-kelola-user-mahasiswa-upload-excel'), - - # Administrator Upload All Dosen Data From Excel - path('administrator/kelola-user/dosen/upload/excel/', - views.InputDataDosenExcelView.as_view(), - name='administrator-kelola-user-dosen-upload-excel'), - - path('laporan-akhir-db/', - views.LaporanAkhirDBView.as_view(), - name='laporan-akhir-db'), - - path('administrator/sheet-info/', - views.UserAdministratorFileUploadInfo.as_view(), - name='sheet-info'), - - path('mahasiswa', - views.MahasiswaView.as_view({'get': 'list'}), - name='mahasiswa'), - - path('periode', - views_riwayat.get_periode_list, - name='periode'), - -] - -# temp for sprint review -router = routers.DefaultRouter() -router.register('mahasiswa_praktikum', MahasiswaPraktikumView, basename="lembaga") -router.register('laporan-akhir', views.LaporanAkhirPraktikumView, basename="laporan-akhir") -router.register('mahasiswa', views.MahasiswaView, basename="mahasiswa") -urlpatterns.append(path('', include(router.urls))) diff --git a/new/laporan_praktikum/views.py b/new/laporan_praktikum/views.py deleted file mode 100644 index 83cf79c..0000000 --- a/new/laporan_praktikum/views.py +++ /dev/null @@ -1,2718 +0,0 @@ -from rest_framework import viewsets, views -from .serializers import MahasiswaDetailPraktikumSerializerTemp -from authentication.models import ( - User, - Mahasiswa, - SupervisorLembaga, - SupervisorSekolah, - KoordinatorKuliah, - Administrator, - Periode, - Config -) -from authentication.serializers import ( - MahasiswaSerializer, - SupervisorLembagaSerializer, - SupervisorSekolahSerializer, - KoordinatorKuliahSerializer, - AdministratorSerializer, - ConfigSerializer -) -from authentication.role import Role -from lembaga.models import ( - Lembaga -) - -from laporan_praktikum.models import ( - Praktikum, - KelolaLaporanPraktikum, - LaporanBorangPraktikum, - LaporanAkhirPraktikum, - MahasiswaPraktikum, - Praktikum, - LaporanAkhirPraktikum, - TemplateBorangPenilaianPraktikum -) - -from laporan_praktikum.serializers import ( - MahasiswaWithJenisPraktikumSerializer, - KelolaLaporanPraktikumSerializer, - KelolaLaporanPraktikumDefaultSerializer, - LaporanAkhirPraktikumSerializer, - LaporanAkhirPraktikumSerializer_v2, - LaporanBorangPraktikumSerializer, - MahasiswaDetailPraktikumSerializer, - SupervisorSekolahListMahasiswaSerializer, - SupervisorLembagaListMahasiswaSerializer, - SupervisorLembagaSpesificSerializer, - RiwayatLaporanPraktikumMahasiswaSerializer, - PraktikumSerializer, - KoordinatorKuliahListMahasiswaSerializer, - AdministratorListUserSerializer, - TemplateLaporanBorangPraktikumSerializer_v2 -) -from rest_framework.decorators import api_view, permission_classes, authentication_classes -from rest_framework.response import Response -from rest_framework import status -from rest_framework.permissions import AllowAny, IsAuthenticated -from rest_framework.test import APIRequestFactory -from rest_framework.request import Request -from rest_framework.generics import CreateAPIView -from rest_framework.generics import RetrieveAPIView -from rest_framework.generics import UpdateAPIView -from rest_framework_jwt.authentication import JSONWebTokenAuthentication -from pyexcel_xls import get_data as xls_get -from pyexcel_xlsx import get_data as xlsx_get -from django.utils.datastructures import MultiValueDictKeyError - -from django.core import serializers -from django.db import transaction, IntegrityError -from django.db.models import Q -from django.http import HttpResponse, HttpResponseNotFound - - -import json -import datetime -from dateutil.parser import parse -from datetime import datetime - -import base64 -from django.core.files.base import ContentFile - -STR_ERROR_MESSAGE_SOMETHING = 'Something\'s wrong, try again...' - - -def parse_time_custom(datetime_inp): - ''' - CUSTOM PARSER FOR TIME DD-MM-YY hh:mm - ''' - return datetime.strptime(datetime_inp, '%d-%m-%Y %H:%M') - - -response_field = ['success', 'status_code', 'message'] -error_message_404_supervisor_sekolah = 'Can not find user data for Supervisor Sekolah' -error_message_404_koordinator_kuliah = 'Can not find user data for Koordinator Kuliah' -error_message_404_administrator = 'Can not find user data for Administrator' -error_message_404_mahasiswa = 'Can not find user data for Mahasiswa' -error_message_404_supervisor_lembaga = 'Can not find user data for Supervisor Lembaga' -error_message_404_user = 'Can not find user data for User' -error_message_404_praktikum = 'Can not find any praktikum data for mahasiswa' -error_message_404_laporan = 'Can not find any laporan data for mahasiswa' -error_message_404_lembaga = 'Can not find lembaga' - - -class UserSupervisorSekolahListMahasiswaView(RetrieveAPIView): # pragma: no cover - ''''''''''''''''''''''''''' - Supervisor Sekolah Related - ''''''''''''''''''''''''''' - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def get(self, request): - - try: - profile = SupervisorSekolah.objects.get(user=request.user) - status_code = status.HTTP_200_OK - serializer = SupervisorSekolahListMahasiswaSerializer(profile, context={'request': request}) - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'List mahasiswa fetch successfully', - 'data': serializer.data - } - except SupervisorSekolah.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_supervisor_sekolah - } - return Response(response, status=status_code) - - -class UserMahasiswaListPraktikumView(RetrieveAPIView): # pragma: no cover - ''''''''''''''''''''' - User Mahasiswa Related - ''''''''''''''''''''' - permission_classes = (IsAuthenticated, ) - authentication_class = JSONWebTokenAuthentication - - def get(self, request): - try: - profile = Mahasiswa.objects.get(user=request.user) - user = MahasiswaPraktikum.objects.filter(mahasiswa=profile) - status_code = status.HTTP_200_OK - serializer = MahasiswaDetailPraktikumSerializer(user, context={'request': request}, many=True) - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Jenis praktikum fetched successfully', - 'data': serializer.data - } - - except Mahasiswa.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Can not find user data for Mahasiswa' - } - return Response(response, status=status_code) - - -@api_view(["GET"]) # pragma: no cover -@authentication_classes([JSONWebTokenAuthentication]) -@permission_classes([IsAuthenticated]) -def get_list_laporan_praktikum_detail(request): - try: - mahasiswa = Mahasiswa.objects.get(user=request.user) - supervisor_sekolah = mahasiswa.supervisor_sekolah - - praktikum = MahasiswaPraktikum.objects.get(mahasiswa=mahasiswa, status=True) - laporan_mingguan = KelolaLaporanPraktikum.objects.filter(mahasiswa=mahasiswa, jenis_praktikum=praktikum.list_praktikum) - laporan_akhir = LaporanAkhirPraktikum.objects.filter(mahasiswa=mahasiswa, jenis_praktikum=praktikum.list_praktikum) - laporan_borang = LaporanBorangPraktikum.objects.filter(mahasiswa=mahasiswa, jenis_praktikum=praktikum.list_praktikum) - template_laporan_borang = TemplateBorangPenilaianPraktikum.objects.get(supervisor_sekolah=supervisor_sekolah) - - serializer_mahasiswa = MahasiswaSerializer(mahasiswa, context={'request': request}) - serializer_laporan_mingguan = KelolaLaporanPraktikumSerializer(laporan_mingguan, - context={'request': request}, many=True) - serializer_laporan_akhir = LaporanAkhirPraktikumSerializer_v2(laporan_akhir, - context={'request': request}, many=True) - - serializer_laporan_borang = LaporanBorangPraktikumSerializer(laporan_borang, - context={'request': request}, many=True) - - serializer_template_laporan = TemplateLaporanBorangPraktikumSerializer_v2(template_laporan_borang, - context={'request': request}) - - status_code = status.HTTP_200_OK - - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Jenis praktikum fetched successfully', - 'profile': serializer_mahasiswa.data, - 'laporan_mingguan': serializer_laporan_mingguan.data, - 'laporan_akhir': serializer_laporan_akhir.data, - 'laporan_borang': serializer_laporan_borang.data, - 'template_borang': serializer_template_laporan.data - } - - except Mahasiswa.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Can not find user data for Mahasiswa' - } - - except MahasiswaPraktikum.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_praktikum - } - - except TemplateBorangPenilaianPraktikum.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: "Your Supervisor Sekolah hasn't been uploaded the Template Borang" - } - return Response(response, status=status_code) - - -@api_view(["GET"]) # pragma: no cover -@authentication_classes([JSONWebTokenAuthentication]) -@permission_classes([IsAuthenticated]) -def get_laporan_mahasiswa_by_id(request, id): - # Laporan mahasiswa by id - profile = Mahasiswa.objects.get(user=request.user) - laporan_mahasiswa = KelolaLaporanPraktikum.objects.filter(Q(mahasiswa=profile) & Q(id=id)) - serializer_mahasiswa = MahasiswaSerializer(profile, context={'request': request}) - serializer_laporan = RiwayatLaporanPraktikumMahasiswaSerializer(laporan_mahasiswa, context={'request': request}, many=True) - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Laporan Praktikum fetched successfully', - 'profile': serializer_mahasiswa.data, - 'data': serializer_laporan.data - } - return Response(response, status=status.HTTP_200_OK) - - -@api_view(["GET"]) # pragma: no cover -@authentication_classes([JSONWebTokenAuthentication]) -@permission_classes([IsAuthenticated]) -def get_laporan_akhir_mahasiswa_by_id(request, id): - # Laporan mahasiswa by id - profile = Mahasiswa.objects.get(user=request.user) - laporan_akhir_mahasiswa = LaporanAkhirPraktikum.objects.filter(Q(mahasiswa=profile) & Q(id=id)) - serializer_mahasiswa = MahasiswaSerializer(profile, context={'request': request}) - serializer_laporan = LaporanAkhirPraktikumSerializer_v2(laporan_akhir_mahasiswa, - context={'request': request}, many=True) - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Laporan Praktikum fetched successfully', - 'profile': serializer_mahasiswa.data, - 'data': serializer_laporan.data - } - return Response(response, status=status.HTTP_200_OK) - - -@api_view(["GET"]) # pragma: no cover -@authentication_classes([JSONWebTokenAuthentication]) -@permission_classes([IsAuthenticated]) -def get_laporan_borang_mahasiswa_by_id(request, id): - # Laporan mahasiswa by id - - try: - profile = Mahasiswa.objects.get(user=request.user) - laporan_borang_mahasiswa = LaporanBorangPraktikum.objects.filter(Q(mahasiswa=profile) & Q(id=id)) - serializer_mahasiswa = MahasiswaSerializer(profile, context={'request': request}) - serializer_laporan = LaporanBorangPraktikumSerializer(laporan_borang_mahasiswa, - context={'request': request}, many=True) - - # Get supervisor_sekolah value from rows - supervisor_sekolah = profile.supervisor_sekolah - - template_laporan_borang = TemplateBorangPenilaianPraktikum.objects.get(supervisor_sekolah=supervisor_sekolah) - serializer_template_laporan = TemplateLaporanBorangPraktikumSerializer_v2(template_laporan_borang, - context={'request': request}) - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Laporan Praktikum fetched successfully', - 'profile': serializer_mahasiswa.data, - 'data': serializer_laporan.data, - 'template_borang': serializer_template_laporan.data - } - - except Mahasiswa.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Can not find user data for Mahasiswa' - } - - except SupervisorSekolah.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_supervisor_sekolah - } - return Response(response, status=status_code) - - -class UserSupervisorLembagaListMahasiswaView(RetrieveAPIView): # pragma: no cover - ''''''''''''''''''''' - Supervisor Lembaga Mahasiswa Related - ''''''''''''''''''''' - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def get(self, request): - try: - profile = SupervisorLembaga.objects.get(user=request.user) - status_code = status.HTTP_200_OK - serializer = SupervisorLembagaListMahasiswaSerializer(profile, context={'request': request}) - - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'List mahasiswa fetch successfully', - 'data': serializer.data - } - except SupervisorLembaga.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Can not find user data for Supervisor Lembaga' - } - return Response(response, status=status_code) - - -@api_view(["GET", "PUT", "POST"]) # pragma: no cover -@permission_classes([AllowAny]) -def get_supervisor_lembaga_by_id_lembaga(request, id_lembaga): - try: - nama_lembaga = Lembaga.objects.get(id=id_lembaga) - supervisor_lembaga = SupervisorLembaga.objects.filter(lembaga=nama_lembaga) - if supervisor_lembaga.count() == 0: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Can not find Supervisor Lembaga' - } - return Response(response, status=status_code) - - serializer = SupervisorLembagaSpesificSerializer(supervisor_lembaga, context={'request': request}, many=True) - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Supervisor Lembaga fetched successfully', - 'data': serializer.data - } - - except Lembaga.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_lembaga - } - - return Response(response, status=status_code) - - -@api_view(["GET", "PUT", "POST", "DELETE"]) # pragma: no cover -@authentication_classes([JSONWebTokenAuthentication]) -@permission_classes([IsAuthenticated]) -def get_or_update_laporan_praktikum(request, username): - try: - profile_supervisor_sekolah = SupervisorSekolah.objects.get(user=request.user) - user_mahasiswa = User.objects.get(username=username) - mahasiswa = Mahasiswa.objects.get(user=user_mahasiswa, supervisor_sekolah=profile_supervisor_sekolah) - praktikum = MahasiswaPraktikum.objects.get(mahasiswa=mahasiswa, status=True) - laporan_mingguan = KelolaLaporanPraktikum.objects.filter(mahasiswa=mahasiswa, - jenis_praktikum=praktikum.list_praktikum).order_by('nama_laporan') - laporan_akhir = LaporanAkhirPraktikum.objects.filter(mahasiswa=mahasiswa, jenis_praktikum=praktikum.list_praktikum) - laporan_borang = LaporanBorangPraktikum.objects.filter(mahasiswa=mahasiswa, jenis_praktikum=praktikum.list_praktikum) - - if request.method == "GET": - serializer_mahasiswa = MahasiswaSerializer(mahasiswa, context={'request': request}) - serializer_laporan_mingguan = KelolaLaporanPraktikumSerializer(laporan_mingguan, - context={'request': request}, many=True) - serializer_laporan_akhir = LaporanAkhirPraktikumSerializer_v2(laporan_akhir, - context={'request': request}, many=True) - - serializer_laporan_borang = LaporanBorangPraktikumSerializer(laporan_borang, - context={'request': request}, many=True) - - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'List mahasiswa fetch successfully', - 'profile': serializer_mahasiswa.data, - 'laporan_mingguan': serializer_laporan_mingguan.data, - 'laporan_akhir': serializer_laporan_akhir.data, - 'laporan_borang': serializer_laporan_borang.data, - } - return Response(response, status=status.HTTP_200_OK) - - elif request.method == "POST" or request.method == "PUT": - ''' - Docs API - { - "username_mahasiswa": "username_mahasiswa", - "username_supervisor_lembaga": "username_supervisor", - "laporan_mingguan": [], - "laporan_akhir": [], - "laporan_borang":[] - } - ''' - - username_supervisor_lembaga = request.data['username_supervisor_lembaga'] - - data_lap_mingguan = list(request.data['laporan_mingguan']) - data_lap_akhir = list(request.data['laporan_akhir']) - data_lap_borang = list(request.data['laporan_borang']) - - # check supervisor_lembaga available or not - if mahasiswa.supervisor_lembaga is None: - profile_supervisor_lembaga = User.objects.get(username=username_supervisor_lembaga) - supervisor_lembaga = SupervisorLembaga.objects.get(user=profile_supervisor_lembaga) - mahasiswa.supervisor_lembaga = supervisor_lembaga - - if data_lap_mingguan: - for attribute in data_lap_mingguan: - laporan_praktikum = Praktikum.objects.get(jenis_praktikum=attribute['jenis_praktikum']) - if attribute["waktu_deadline"] is not None: - waktu_deadline = parse_time_custom(attribute["waktu_deadline"]) - obj, created = KelolaLaporanPraktikum.objects.update_or_create( - mahasiswa=mahasiswa, - jenis_praktikum=laporan_praktikum, - nama_laporan=attribute["nama_laporan"], - defaults={'waktu_deadline': waktu_deadline, - 'status_publikasi': attribute["status_publikasi"] - } - ) - - if data_lap_akhir: - for attribute in data_lap_akhir: - laporan_praktikum = Praktikum.objects.get(jenis_praktikum=attribute['jenis_praktikum']) - - if attribute["waktu_deadline"] is not None: - waktu_deadline = parse_time_custom(attribute["waktu_deadline"]) - obj, created = LaporanAkhirPraktikum.objects.update_or_create( - mahasiswa=mahasiswa, - jenis_praktikum=laporan_praktikum, - nama_laporan=attribute["nama_laporan"], - defaults={'waktu_deadline': waktu_deadline, - 'status_publikasi': attribute["status_publikasi"] - } - ) - - if data_lap_borang: - for attribute in data_lap_borang: - laporan_praktikum = Praktikum.objects.get(jenis_praktikum=attribute['jenis_praktikum']) - if attribute["waktu_deadline"] is not None: - waktu_deadline = parse_time_custom(attribute["waktu_deadline"]) - obj, created = LaporanBorangPraktikum.objects.update_or_create( - mahasiswa=mahasiswa, - jenis_praktikum=laporan_praktikum, - nama_laporan=attribute["nama_laporan"], - defaults={'waktu_deadline': waktu_deadline, - 'status_publikasi': attribute["status_publikasi"] - } - ) - - status_code = status.HTTP_201_CREATED - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Laporan Praktikum successfully update', - } - - except User.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_user - } - - except Mahasiswa.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_user - } - - except Praktikum.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_praktikum - } - - except MahasiswaPraktikum.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_praktikum - } - return Response(response, status=status_code) - - -@api_view(["DELETE"]) # pragma: no cover -@authentication_classes([JSONWebTokenAuthentication]) -@permission_classes([IsAuthenticated]) -def delete_laporan_praktikum(request, username, tipe, pk): - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: "Laporan successfully deleted" - } - - if tipe == 'mingguan': - KelolaLaporanPraktikum.objects.get(pk=pk).delete() - - elif tipe == 'borang': - LaporanBorangPraktikum.objects.get(pk=pk).delete() - - elif tipe == 'akhir': - LaporanAkhirPraktikum.objects.get(pk=pk).delete() - - return Response(response, status=status_code) - - -@api_view(["PUT", "POST"]) # pragma: no cover -@authentication_classes([JSONWebTokenAuthentication]) -@permission_classes([IsAuthenticated]) -def submit_link_laporan_praktikum(request): - try: - profile = Mahasiswa.objects.get(user=request.user) - id_laporan = request.data['id'] - check_laporan_ownership = (profile == KelolaLaporanPraktikum.objects.get(id=id_laporan).mahasiswa) - - if not check_laporan_ownership: - response = { - response_field[0]: 'True', - response_field[1]: status.HTTP_403_FORBIDDEN, - response_field[2]: 'Forbidden access to laporan praktikum', - } - return Response(response, status=status.HTTP_403_FORBIDDEN) - - if request.data['link_submisi'][:11].lower() == "javascript:": - response = { - response_field[0]: 'True', - response_field[1]: status.HTTP_403_FORBIDDEN, - response_field[2]: 'Forbidden protocol for the link', - } - return Response(response, status=status.HTTP_403_FORBIDDEN) - - # Update link submit laporan praktikum mahasiswa and waktu_submisi (minus 5 hour to localzone) - KelolaLaporanPraktikum.objects.filter(id=id_laporan).update( - waktu_submisi=parse_time_custom(request.data['waktu_submisi']), - link_submisi=request.data['link_submisi'], - status_submisi=request.data['status_submisi'] - ) - - status_code = status.HTTP_201_CREATED - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Link laporan praktikum successfully update', - } - return Response(response, status=status_code) - - except Mahasiswa.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Can not find user data for Mahasiswa', - } - return Response(response, status=status_code) - - except KelolaLaporanPraktikum.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Can not find the laporan with the specific id', - } - return Response(response, status=status_code) - - -@api_view(["GET", "PUT", "POST"]) -@authentication_classes([JSONWebTokenAuthentication]) -@permission_classes([IsAuthenticated]) -def crud_submisi_laporan_akhir_mahasiswa(request): - try: - mahasiswa = Mahasiswa.objects.get(user=request.user) - if request.method == "POST" or request.method == "PUT": - nama_laporan = request.data["nama_laporan"] - nama_lembaga = Lembaga.objects.get(nama=request.data['nama_lembaga']) - jenis_praktikum = Praktikum.objects.get(jenis_praktikum=request.data['jenis_praktikum']) - periode_praktikum = request.data['periode_praktikum'] - waktu_submisi = parse_time_custom(request.data['waktu_submisi']) - status_submisi = request.data['status_submisi'] - file_laporan_akhir = request.data.get('file_laporan_akhir') - file_profil_lembaga = request.data.get('file_profil_lembaga') - - if status_submisi.lower() == "true" or status_submisi is True: - status_submisi = True - - else: - status_submisi = False - - obj, created = LaporanAkhirPraktikum.objects.update_or_create( - mahasiswa=mahasiswa, - nama_laporan=nama_laporan, - jenis_praktikum=jenis_praktikum, - defaults={'lembaga': nama_lembaga, 'waktu_submisi': waktu_submisi, - 'status_submisi': status_submisi, - 'periode_praktikum': periode_praktikum, - 'laporan_akhir': file_laporan_akhir, - 'profil_lembaga': file_profil_lembaga - } - ) - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Laporan akhir submitted successfully', - } - - except Mahasiswa.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Can not find user data for Mahasiswa', - } - - except AttributeError: - status_code = status.HTTP_400_BAD_REQUEST - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: STR_ERROR_MESSAGE_SOMETHING, - } - - except KeyError: - status_code = status.HTTP_400_BAD_REQUEST - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: STR_ERROR_MESSAGE_SOMETHING, - } - - except ValueError: - status_code = status.HTTP_400_BAD_REQUEST - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: STR_ERROR_MESSAGE_SOMETHING, - } - return Response(response, status=status_code) - - -@api_view(["GET", "PUT", "POST"]) -@authentication_classes([JSONWebTokenAuthentication]) -@permission_classes([IsAuthenticated]) -def crud_submisi_laporan_borang_mahasiswa(request): - try: - mahasiswa = Mahasiswa.objects.get(user=request.user) - if request.method == "POST" or request.method == "PUT": - nama_laporan = request.data["nama_laporan"] - jenis_praktikum = Praktikum.objects.get(jenis_praktikum=request.data['jenis_praktikum']) - waktu_submisi = parse_time_custom(request.data['waktu_submisi']) - status_submisi = request.data['status_submisi'] - file_borang_supv_lembaga = request.data.get('file_borang_supv_lembaga') - file_borang_supv_sekolah = request.data.get('file_borang_supv_sekolah') - file_borang_penilaian_kuliah = request.data.get('file_borang_penilaian_kuliah') - - if status_submisi.lower() == "true" or status_submisi is True: - status_submisi = True - - else: - status_submisi = False - - obj, created = LaporanBorangPraktikum.objects.update_or_create( - mahasiswa=mahasiswa, - nama_laporan=nama_laporan, - jenis_praktikum=jenis_praktikum, - defaults={'waktu_submisi': waktu_submisi, - 'status_submisi': status_submisi, - 'borang_supv_sekolah': file_borang_supv_sekolah, - 'borang_supv_lembaga': file_borang_supv_lembaga, - 'borang_supv_perkuliahan': file_borang_penilaian_kuliah - } - ) - - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Laporan akhir submitted successfully', - } - - except Mahasiswa.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Can not find user data for Mahasiswa', - } - - except LaporanBorangPraktikum.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Can not find Laporan Borang Praktikum', - } - - except AttributeError: - status_code = status.HTTP_400_BAD_REQUEST - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: STR_ERROR_MESSAGE_SOMETHING, - } - - except KeyError: - status_code = status.HTTP_400_BAD_REQUEST - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: STR_ERROR_MESSAGE_SOMETHING, - } - - except ValueError: - status_code = status.HTTP_400_BAD_REQUEST - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: STR_ERROR_MESSAGE_SOMETHING, - } - return Response(response, status=status_code) - - -class UserSupervisorSekolahListPraktikumMahasiswaView(RetrieveAPIView): # pragma: no cover - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def get(self, request, username): - try: - profile = SupervisorSekolah.objects.get(user=request.user) - user_mahasiswa = User.objects.get(username=username) - mahasiswa = Mahasiswa.objects.get(user=user_mahasiswa, supervisor_sekolah=profile) - praktikum = MahasiswaPraktikum.objects.get(mahasiswa=mahasiswa, status=True) - - laporan_mingguan = KelolaLaporanPraktikum.objects.filter(mahasiswa=mahasiswa, jenis_praktikum=praktikum.list_praktikum) - laporan_akhir = LaporanAkhirPraktikum.objects.filter(mahasiswa=mahasiswa, jenis_praktikum=praktikum.list_praktikum) - laporan_borang = LaporanBorangPraktikum.objects.filter(mahasiswa=mahasiswa, jenis_praktikum=praktikum.list_praktikum) - - praktikum_serializer = PraktikumSerializer(praktikum.list_praktikum, context={'request': request}) - mahasiswa_serializer = MahasiswaSerializer(mahasiswa, context={'request': request}) - user_serializer = SupervisorSekolahSerializer(profile, context={'request': request}) - - serializer_laporan_mingguan = KelolaLaporanPraktikumSerializer(laporan_mingguan, - context={'request': request}, many=True) - serializer_laporan_akhir = LaporanAkhirPraktikumSerializer_v2(laporan_akhir, - context={'request': request}, many=True) - serializer_laporan_borang = LaporanBorangPraktikumSerializer(laporan_borang, - context={'request': request}, many=True) - - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'List praktikum mahasiswa fetch successfully', - 'laporan_mingguan': serializer_laporan_mingguan.data, - 'laporan_akhir': serializer_laporan_akhir.data, - 'laporan_borang': serializer_laporan_borang.data, - 'praktikum': praktikum_serializer.data, - 'mahasiswa': mahasiswa_serializer.data, - 'user': user_serializer.data - } - except SupervisorSekolah.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_supervisor_sekolah - } - except User.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_user - } - except MahasiswaPraktikum.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_praktikum - } - return Response(response, status=status_code) - - -class UserSupervisorSekolahDetailLaporanMingguanMahasiswaView(RetrieveAPIView): - """ - Return detail laporan mingguan data of mahasiswa of supervisor sekolah - """ - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def get(self, request, username, id): - try: - profile = SupervisorSekolah.objects.get(user=request.user) - user_mahasiswa = User.objects.get(username=username) - mahasiswa = Mahasiswa.objects.get(user=user_mahasiswa, supervisor_sekolah=profile) - laporan = KelolaLaporanPraktikum.objects.get(pk=id, mahasiswa=mahasiswa) - - mahasiswa_serializer = MahasiswaSerializer(mahasiswa, context={'request': request}) - user_serializer = SupervisorSekolahSerializer(profile, context={'request': request}) - laporan_serializer = KelolaLaporanPraktikumSerializer(laporan, context={'request': request}) - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Detail praktikum mahasiswa fetch successfully', - 'data': laporan_serializer.data, - 'user': user_serializer.data, - 'mahasiswa': mahasiswa_serializer.data - } - except SupervisorSekolah.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_supervisor_sekolah - } - except KelolaLaporanPraktikum.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_laporan - } - except User.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_user - } - return Response(response, status=status_code) - - -class UserSupervisorSekolahDetailLaporanAkhirMahasiswaView(RetrieveAPIView): - """ - Return detail laporan akhir data of mahasiswa of supervisor sekolah - """ - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def get(self, request, username, id): - try: - profile = SupervisorSekolah.objects.get(user=request.user) - user_mahasiswa = User.objects.get(username=username) - mahasiswa = Mahasiswa.objects.get(user=user_mahasiswa, supervisor_sekolah=profile) - laporan = LaporanAkhirPraktikum.objects.get(pk=id, mahasiswa=mahasiswa) - - mahasiswa_serializer = MahasiswaSerializer(mahasiswa, context={'request': request}) - user_serializer = SupervisorSekolahSerializer(profile, context={'request': request}) - laporan_serializer = LaporanAkhirPraktikumSerializer_v2(laporan, context={'request': request}) - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Detail laporan akhir mahasiswa fetch successfully', - 'data': laporan_serializer.data, - 'user': user_serializer.data, - 'mahasiswa': mahasiswa_serializer.data - } - except SupervisorSekolah.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_supervisor_sekolah - } - except LaporanAkhirPraktikum.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_laporan - } - except User.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_user - } - return Response(response, status=status_code) - - -class UserSupervisorSekolahDetailBorangMahasiswaView(RetrieveAPIView): - """ - Return detail borang data of mahasiswa of supervisor sekolah - """ - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def get(self, request, username, id): - try: - profile = SupervisorSekolah.objects.get(user=request.user) - user_mahasiswa = User.objects.get(username=username) - mahasiswa = Mahasiswa.objects.get(user=user_mahasiswa, supervisor_sekolah=profile) - laporan = LaporanBorangPraktikum.objects.get(pk=id, mahasiswa=mahasiswa) - - mahasiswa_serializer = MahasiswaSerializer(mahasiswa, context={'request': request}) - user_serializer = SupervisorSekolahSerializer(profile, context={'request': request}) - laporan_serializer = LaporanBorangPraktikumSerializer(laporan, context={'request': request}) - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Detail laporan akhir mahasiswa fetch successfully', - 'data': laporan_serializer.data, - 'user': user_serializer.data, - 'mahasiswa': mahasiswa_serializer.data - } - except SupervisorSekolah.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_supervisor_sekolah - } - except LaporanBorangPraktikum.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_laporan - } - except User.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_user - } - return Response(response, status=status_code) - - -class UserSupervisorSekolahNilaiLaporanMingguanMahasiswaView(UpdateAPIView): - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def update(self, request, username, id): - try: - skor = float(request.data.get("skor")) - if skor >= 0 and skor <= 100: - profile = SupervisorSekolah.objects.get(user=request.user) - user_mahasiswa = User.objects.get(username=username) - mahasiswa = Mahasiswa.objects.get(user=user_mahasiswa, supervisor_sekolah=profile) - laporan = KelolaLaporanPraktikum.objects.get(pk=id, mahasiswa=mahasiswa) - - laporan.waktu_nilai_supv_sekolah = datetime.now() - laporan.skor_laporan_sekolah = skor - laporan.save() - - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Score updated successfully', - } - else: - status_code = status.HTTP_422_UNPROCESSABLE_ENTITY - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Please enter a valid skor input between 1-100', - } - except ValueError: - status_code = status.HTTP_422_UNPROCESSABLE_ENTITY - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Please enter a valid float skor input', - } - except TypeError: - status_code = status.HTTP_422_UNPROCESSABLE_ENTITY - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Please enter a valid data input', - } - except SupervisorSekolah.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_supervisor_sekolah - } - except KelolaLaporanPraktikum.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Can not find any laporan for Mahasiswa' - } - except User.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Can not find any user data for Mahasiswa' - } - return Response(response, status=status_code) - - -class UserSupervisorSekolahNilaiLaporanAkhirMahasiswaView(UpdateAPIView): - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def update(self, request, username, id): - try: - skor = float(request.data.get("skor")) - feedback = request.data.get("feedback") - if skor >= 0 and skor <= 100: - profile = SupervisorSekolah.objects.get(user=request.user) - user_mahasiswa = User.objects.get(username=username) - mahasiswa = Mahasiswa.objects.get(user=user_mahasiswa, supervisor_sekolah=profile) - laporan = LaporanAkhirPraktikum.objects.get(pk=id, mahasiswa=mahasiswa) - - laporan.waktu_nilai_supv_sekolah = datetime.now() - laporan.skor_laporan_sekolah = skor - laporan.umpan_balik = feedback - laporan.save() - - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Data updated successfully', - } - else: - status_code = status.HTTP_422_UNPROCESSABLE_ENTITY - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Please enter a valid skor input between 1-100', - } - except ValueError: - status_code = status.HTTP_422_UNPROCESSABLE_ENTITY - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Please enter a valid float skor input', - } - except TypeError: - status_code = status.HTTP_422_UNPROCESSABLE_ENTITY - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Please enter a valid data input', - } - except SupervisorSekolah.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_supervisor_sekolah - } - except LaporanAkhirPraktikum.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Can not find any laporan for Mahasiswa' - } - except User.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Can not find any user data for Mahasiswa' - } - return Response(response, status=status_code) - - -class UserKoordinatorKuliahListMahasiswaView(RetrieveAPIView): # pragma: no cover - - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def get(self, request): - try: - profile = KoordinatorKuliah.objects.get(user=request.user) - status_code = status.HTTP_200_OK - serializer = KoordinatorKuliahListMahasiswaSerializer(profile, context={'request': request}) - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'List mahasiswa fetch successfully', - 'data': serializer.data - } - except KoordinatorKuliah.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_koordinator_kuliah - } - return Response(response, status=status_code) - - -class UserAdministratorListUserView(RetrieveAPIView): # pragma: no cover - - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def get(self, request): - try: - profile = Administrator.objects.get(user=request.user) - status_code = status.HTTP_200_OK - serializer = AdministratorListUserSerializer(profile, context={'request': request}) - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'List users fetch successfully', - 'data': serializer.data - } - except Administrator.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_administrator - } - return Response(response, status=status_code) - - -class UserKoordinatorKuliahListPraktikumMahasiswaView(RetrieveAPIView): # pragma: no cover - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def get(self, request, username): - try: - profile = KoordinatorKuliah.objects.get(user=request.user) - user_mahasiswa = User.objects.get(username=username) - mahasiswa = Mahasiswa.objects.get(user=user_mahasiswa) - praktikum = MahasiswaPraktikum.objects.get(mahasiswa=mahasiswa, status=True) - - laporan_mingguan = KelolaLaporanPraktikum.objects.filter(mahasiswa=mahasiswa, jenis_praktikum=praktikum.list_praktikum) - laporan_akhir = LaporanAkhirPraktikum.objects.filter(mahasiswa=mahasiswa, jenis_praktikum=praktikum.list_praktikum) - laporan_borang = LaporanBorangPraktikum.objects.filter(mahasiswa=mahasiswa, jenis_praktikum=praktikum.list_praktikum) - - praktikum_serializer = PraktikumSerializer(praktikum.list_praktikum, context={'request': request}) - mahasiswa_serializer = MahasiswaSerializer(mahasiswa, context={'request': request}) - user_serializer = SupervisorSekolahSerializer(profile, context={'request': request}) - - serializer_laporan_mingguan = KelolaLaporanPraktikumSerializer(laporan_mingguan, - context={'request': request}, many=True) - serializer_laporan_akhir = LaporanAkhirPraktikumSerializer_v2(laporan_akhir, - context={'request': request}, many=True) - serializer_laporan_borang = LaporanBorangPraktikumSerializer(laporan_borang, - context={'request': request}, many=True) - - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'List praktikum mahasiswa fetch successfully', - 'laporan_mingguan': serializer_laporan_mingguan.data, - 'laporan_akhir': serializer_laporan_akhir.data, - 'laporan_borang': serializer_laporan_borang.data, - 'praktikum': praktikum_serializer.data, - 'mahasiswa': mahasiswa_serializer.data, - 'user': user_serializer.data - } - except KoordinatorKuliah.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_koordinator_kuliah - } - except User.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_user - } - except MahasiswaPraktikum.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_praktikum - } - return Response(response, status=status_code) - - -class UserKoordinatorKuliahDetailLaporanMingguanMahasiswaView(RetrieveAPIView): - """ - Return detail laporan data of mahasiswa of koordinator kuliah - """ - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def get(self, request, username, id): - try: - profile = KoordinatorKuliah.objects.get(user=request.user) - user_mahasiswa = User.objects.get(username=username) - mahasiswa = Mahasiswa.objects.get(user=user_mahasiswa) - laporan = KelolaLaporanPraktikum.objects.get(pk=id, mahasiswa=mahasiswa) - - mahasiswa_serializer = MahasiswaSerializer(mahasiswa, context={'request': request}) - user_serializer = KoordinatorKuliahSerializer(profile, context={'request': request}) - laporan_serializer = KelolaLaporanPraktikumSerializer(laporan, context={'request': request}) - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Detail praktikum mahasiswa fetch successfully', - 'data': laporan_serializer.data, - 'user': user_serializer.data, - 'mahasiswa': mahasiswa_serializer.data - } - except KoordinatorKuliah.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_koordinator_kuliah - } - except KelolaLaporanPraktikum.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_laporan - } - except User.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_user - } - return Response(response, status=status_code) - - -class UserKoordinatorKuliahDetailLaporanAkhirMahasiswaView(RetrieveAPIView): - """ - Return detail laporan akhir data of mahasiswa of supervisor sekolah - """ - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def get(self, request, username, id): - try: - profile = KoordinatorKuliah.objects.get(user=request.user) - user_mahasiswa = User.objects.get(username=username) - mahasiswa = Mahasiswa.objects.get(user=user_mahasiswa) - laporan = LaporanAkhirPraktikum.objects.get(pk=id, mahasiswa=mahasiswa) - - mahasiswa_serializer = MahasiswaSerializer(mahasiswa, context={'request': request}) - user_serializer = KoordinatorKuliahSerializer(profile, context={'request': request}) - laporan_serializer = LaporanAkhirPraktikumSerializer_v2(laporan, context={'request': request}) - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Detail laporan akhir mahasiswa fetch successfully', - 'data': laporan_serializer.data, - 'user': user_serializer.data, - 'mahasiswa': mahasiswa_serializer.data - } - except KoordinatorKuliah.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_koordinator_kuliah - } - except LaporanAkhirPraktikum.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_laporan - } - except User.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_user - } - return Response(response, status=status_code) - - -class UserKoordinatorKuliahDetailBorangMahasiswaView(RetrieveAPIView): - """ - Return detail borang data of mahasiswa of supervisor sekolah - """ - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def get(self, request, username, id): - try: - profile = KoordinatorKuliah.objects.get(user=request.user) - user_mahasiswa = User.objects.get(username=username) - mahasiswa = Mahasiswa.objects.get(user=user_mahasiswa) - laporan = LaporanBorangPraktikum.objects.get(pk=id, mahasiswa=mahasiswa) - - mahasiswa_serializer = MahasiswaSerializer(mahasiswa, context={'request': request}) - user_serializer = KoordinatorKuliahSerializer(profile, context={'request': request}) - laporan_serializer = LaporanBorangPraktikumSerializer(laporan, context={'request': request}) - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Detail laporan akhir mahasiswa fetch successfully', - 'data': laporan_serializer.data, - 'user': user_serializer.data, - 'mahasiswa': mahasiswa_serializer.data - } - except KoordinatorKuliah.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_koordinator_kuliah - } - except LaporanBorangPraktikum.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_laporan - } - except User.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_user - } - return Response(response, status=status_code) - - -class UserAdministratorKelolaUserDetailUserMahasiswaView(RetrieveAPIView): - - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def get(self, request, username): - try: - profile = Administrator.objects.get(user=request.user) - user_mahasiswa = User.objects.get(username=username) - mahasiswa = Mahasiswa.objects.get(user=user_mahasiswa) - mahasiswa_praktikum = MahasiswaPraktikum.objects.get(status=True, mahasiswa=mahasiswa) - - mahasiswa_serializer = MahasiswaDetailPraktikumSerializer(mahasiswa_praktikum, context={'request': request}) - user_serializer = AdministratorSerializer(profile, context={'request': request}) - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Detail kelola mahasiswa fetch successfully', - 'data': mahasiswa_serializer.data, - 'user': user_serializer.data - } - except Administrator.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_administrator - } - except MahasiswaPraktikum.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: "Active data praktikum can't be found" - } - except User.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_user - } - except Mahasiswa.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_mahasiswa - } - return Response(response, status=status_code) - - -class UserAdministratorKelolaUserEditUserMahasiswaView(UpdateAPIView): - - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def update(self, request, username): - try: - jenis_praktikum_id = int(request.data.get("jenis_praktikum_id")) - periode_id = int(request.data.get("periode_id")) - new_username = request.data.get("username") - email = request.data.get("email") - username_supervisor_lembaga = request.data.get("username_supervisor_lembaga") - username_supervisor_sekolah = request.data.get("username_supervisor_sekolah") - if (jenis_praktikum_id > 0 and periode_id > 0): - Administrator.objects.get(user=request.user) - user_mahasiswa = User.objects.get(username=username) - mahasiswa = Mahasiswa.objects.get(user=user_mahasiswa) - mahasiswa_praktikum_active = MahasiswaPraktikum.objects.get(mahasiswa=mahasiswa, status=True) - - periode_new = Periode.objects.get(pk=periode_id) - user_supervisor_lembaga_new = User.objects.get(username=username_supervisor_lembaga) - supervisor_lembaga_new = SupervisorLembaga.objects.get(user=user_supervisor_lembaga_new) - user_supervisor_sekolah_new = User.objects.get(username=username_supervisor_sekolah) - supervisor_sekolah_new = SupervisorSekolah.objects.get(user=user_supervisor_sekolah_new) - praktikum_new = Praktikum.objects.get(pk=jenis_praktikum_id) - mahasiswa_praktikum_selected = MahasiswaPraktikum.objects.get(mahasiswa=mahasiswa, list_praktikum=praktikum_new) - - mahasiswa_praktikum_active.status = False - mahasiswa_praktikum_active.save() - - mahasiswa_praktikum_selected.status = True - mahasiswa_praktikum_selected.save() - - user_mahasiswa.username = new_username - user_mahasiswa.email = email - user_mahasiswa.save() - - mahasiswa.periode = periode_new - mahasiswa.supervisor_lembaga = supervisor_lembaga_new - mahasiswa.supervisor_sekolah = supervisor_sekolah_new - mahasiswa.save() - - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Data mahasiswa updated successfully', - } - else: - status_code = status.HTTP_422_UNPROCESSABLE_ENTITY - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Please enter a valid data input for id', - } - except ValueError: - status_code = status.HTTP_422_UNPROCESSABLE_ENTITY - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Please enter a valid data input for id (int)', - } - except TypeError: - status_code = status.HTTP_422_UNPROCESSABLE_ENTITY - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Please enter a valid field name for input', - } - except IntegrityError: - status_code = status.HTTP_409_CONFLICT - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Duplication data for username or email', - } - except User.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_user - } - except Administrator.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_administrator - } - except SupervisorSekolah.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_supervisor_sekolah - } - except SupervisorLembaga.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_supervisor_lembaga - } - except Mahasiswa.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_mahasiswa - } - except MahasiswaPraktikum.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Can not find any data of kelola mahasiswa praktikum for mahasiswa' - } - except Praktikum.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Can not find any data of praktikum' - } - return Response(response, status=status_code) - - -class UserAdministratorKelolaUserDetailUserSupervisorSekolahView(RetrieveAPIView): - - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def get(self, request, username): - try: - profile = Administrator.objects.get(user=request.user) - user_supervisor_sekolah = User.objects.get(username=username) - supervisor_sekolah = SupervisorSekolah.objects.get(user=user_supervisor_sekolah) - - supervisor_sekolah_serializer = SupervisorSekolahSerializer(supervisor_sekolah, context={'request': request}) - user_serializer = AdministratorSerializer(profile, context={'request': request}) - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Detail kelola supervisor sekolah fetch successfully', - 'data': supervisor_sekolah_serializer.data, - 'user': user_serializer.data - } - except Administrator.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_administrator - } - except User.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_user - } - except SupervisorSekolah.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_supervisor_sekolah - } - return Response(response, status=status_code) - - -class UserAdministratorKelolaUserEditUserSupervisorSekolahView(UpdateAPIView): - - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def update(self, request, username): - try: - new_username = request.data.get("username") - email = request.data.get("email") - role = request.data.get("role") - Administrator.objects.get(user=request.user) - user_supervisor_sekolah = User.objects.get(username=username) - supervisor_sekolah = SupervisorSekolah.objects.get(user=user_supervisor_sekolah) - - user_supervisor_sekolah.username = new_username - user_supervisor_sekolah.email = email - user_supervisor_sekolah.save() - - if role == Role.KKL.value: - user_supervisor_sekolah.save() - KoordinatorKuliah.objects.create( - user=user_supervisor_sekolah, - nip=supervisor_sekolah.nip - ) - mahasiswa_bimbingan = Mahasiswa.objects.filter(supervisor_sekolah=supervisor_sekolah) - mahasiswa_bimbingan.update(supervisor_sekolah=None) - supervisor_sekolah.delete() - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Data supervisor sekolah updated successfully', - } - elif role == Role.SSK.value: - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Data supervisor sekolah updated successfully', - } - elif role == Role.ADM.value: - user_supervisor_sekolah.save() - Administrator.objects.create( - user=user_supervisor_sekolah, - nip=user_supervisor_sekolah.nip - ) - mahasiswa_bimbingan = Mahasiswa.objects.filter(supervisor_sekolah=supervisor_sekolah) - mahasiswa_bimbingan.update(supervisor_sekolah=None) - supervisor_sekolah.delete() - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Data supervisor sekolah updated successfully', - } - else: - status_code = status.HTTP_422_UNPROCESSABLE_ENTITY - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Please enter a valid data input for role', - } - - except TypeError: - status_code = status.HTTP_422_UNPROCESSABLE_ENTITY - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Please enter a valid field name for input', - } - except IntegrityError: - status_code = status.HTTP_409_CONFLICT - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Duplication data for username or email', - } - except User.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_user - } - except Administrator.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_administrator - } - except SupervisorSekolah.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_supervisor_sekolah - } - return Response(response, status=status_code) - - -class UserAdministratorGetAllUserSupervisorSekolahView(RetrieveAPIView): - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def get(self, request): - try: - profile = Administrator.objects.get(user=request.user) - supervisor_sekolahs = SupervisorSekolah.objects.all() - supervisor_sekolah_serializer = SupervisorSekolahSerializer(supervisor_sekolahs, context={'request': request}, - many=True) - - user_serializer = AdministratorSerializer(profile, context={'request': request}) - - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'List all supervisor sekolah fetch successfully', - 'data': supervisor_sekolah_serializer.data, - 'user': user_serializer.data - - } - - except Administrator.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_administrator - } - - return Response(response, status=status_code) - - -class UserAdministratorKelolaUserDetailUserSupervisorLembagaView(RetrieveAPIView): - - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def get(self, request, username): - try: - profile = Administrator.objects.get(user=request.user) - user_supervisor_lembaga = User.objects.get(username=username) - supervisor_lembaga = SupervisorLembaga.objects.get(user=user_supervisor_lembaga) - - supervisor_lembaga_serializer = SupervisorLembagaSerializer(supervisor_lembaga, context={'request': request}) - user_serializer = AdministratorSerializer(profile, context={'request': request}) - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Detail kelola supervisor lembaga fetch successfully', - 'data': supervisor_lembaga_serializer.data, - 'user': user_serializer.data - } - except Administrator.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_administrator - } - except User.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_user - } - except SupervisorLembaga.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_supervisor_lembaga - } - return Response(response, status=status_code) - - -class UserAdministratorKelolaUserEditUserSupervisorLembagaView(UpdateAPIView): - - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def update(self, request, username): - try: - lembaga_id = int(request.data.get("lembaga_id")) - username_baru = request.data.get("username") - jabatan = request.data.get("jabatan") - email = request.data.get("email") - - if lembaga_id > 0: - Administrator.objects.get(user=request.user) - user_supervisor_lembaga = User.objects.get(username=username) - supervisor_lembaga = SupervisorLembaga.objects.get(user=user_supervisor_lembaga) - - lembaga_new = Lembaga.objects.get(pk=lembaga_id) - - user_supervisor_lembaga.username = username_baru - user_supervisor_lembaga.email = email - user_supervisor_lembaga.save() - - supervisor_lembaga.lembaga = lembaga_new - supervisor_lembaga.jabatan = jabatan - supervisor_lembaga.save() - - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Data supervisor lembaga updated successfully', - } - else: - status_code = status.HTTP_422_UNPROCESSABLE_ENTITY - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Please enter a valid data input for id', - } - - except ValueError: - status_code = status.HTTP_422_UNPROCESSABLE_ENTITY - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Please enter a valid data input for id (int)', - } - except TypeError: - status_code = status.HTTP_422_UNPROCESSABLE_ENTITY - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Please enter a valid field name for input', - } - except User.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_user - } - except SupervisorLembaga.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_supervisor_lembaga - } - except Lembaga.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: "Lembaga id is not found" - } - except IntegrityError: - status_code = status.HTTP_409_CONFLICT - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: "Duplicate value of username/email" - } - return Response(response, status=status_code) - - -class UserAdministratorKelolaUserDetailUserKoordinatorKuliahView(RetrieveAPIView): - - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def get(self, request, username): - try: - profile = Administrator.objects.get(user=request.user) - user_koordinator_kuliah = User.objects.get(username=username) - koordinator_kuliah = KoordinatorKuliah.objects.get(user=user_koordinator_kuliah) - - koordinator_kuliah_serializer = KoordinatorKuliahSerializer(koordinator_kuliah, context={'request': request}) - user_serializer = AdministratorSerializer(profile, context={'request': request}) - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Detail kelola koordinator kuliah fetch successfully', - 'data': koordinator_kuliah_serializer.data, - 'user': user_serializer.data - } - except Administrator.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_administrator - } - except User.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_user - } - except KoordinatorKuliah.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_koordinator_kuliah - } - return Response(response, status=status_code) - - -class UserAdministratorKelolaUserEditUserKoordinatorKuliahView(UpdateAPIView): - - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def update(self, request, username): - try: - new_username = request.data.get("username") - email = request.data.get("email") - role = request.data.get("role") - Administrator.objects.get(user=request.user) - user_koordinator_kuliah = User.objects.get(username=username) - koordinator_kuliah = KoordinatorKuliah.objects.get(user=user_koordinator_kuliah) - - user_koordinator_kuliah.username = new_username - user_koordinator_kuliah.email = email - user_koordinator_kuliah.save() - - if role == Role.SSK.value: - user_koordinator_kuliah.save() - SupervisorSekolah.objects.create( - user=user_koordinator_kuliah, - nip=koordinator_kuliah.nip - ) - koordinator_kuliah.delete() - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Data koordinator kuliah updated successfully', - } - elif role == Role.KKL.value: - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Data koordinator kuliah updated successfully', - } - elif role == Role.ADM.value: - user_koordinator_kuliah.save() - Administrator.objects.create( - user=user_koordinator_kuliah, - nip=koordinator_kuliah.nip - ) - koordinator_kuliah.delete() - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Data koordinator kuliah updated successfully', - } - else: - status_code = status.HTTP_422_UNPROCESSABLE_ENTITY - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Please enter a valid data input for role', - } - - except TypeError: - status_code = status.HTTP_422_UNPROCESSABLE_ENTITY - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Please enter a valid field name for input', - } - except IntegrityError: - status_code = status.HTTP_409_CONFLICT - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Duplication data for username or email', - } - except User.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_user - } - except Administrator.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_administrator - } - except KoordinatorKuliah.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_koordinator_kuliah - } - return Response(response, status=status_code) - - -class UserAdministratorKelolaUserDetailUserAdministratorView(RetrieveAPIView): - - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def get(self, request, username): - try: - profile = Administrator.objects.get(user=request.user) - user_administrator = User.objects.get(username=username) - administrator = Administrator.objects.get(user=user_administrator) - - administrator_serializer = AdministratorSerializer(administrator, context={'request': request}) - user_serializer = AdministratorSerializer(profile, context={'request': request}) - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Detail kelola administrator fetch successfully', - 'data': administrator_serializer.data, - 'user': user_serializer.data - } - except Administrator.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_administrator - } - except User.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_user - } - return Response(response, status=status_code) - - -class UserAdministratorKelolaUserEditUserAdministratorView(UpdateAPIView): - - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def update(self, request, username): - try: - new_username = request.data.get("username") - email = request.data.get("email") - role = request.data.get("role") - Administrator.objects.get(user=request.user) - user_administrator = User.objects.get(username=username) - administrator = Administrator.objects.get(user=user_administrator) - - user_administrator.username = new_username - user_administrator.email = email - user_administrator.save() - - if role == Role.SSK.value: - user_administrator.save() - SupervisorSekolah.objects.create( - user=user_administrator, - nip=administrator.nip - ) - administrator.delete() - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Data administrator updated successfully', - } - elif role == Role.ADM.value: - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Data administrator updated successfully', - } - elif role == Role.KKL.value: - user_administrator.save() - KoordinatorKuliah.objects.create( - user=user_administrator, - nip=administrator.nip - ) - administrator.delete() - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Data administrator updated successfully', - } - else: - status_code = status.HTTP_422_UNPROCESSABLE_ENTITY - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Please enter a valid data input for role', - } - - except TypeError: - status_code = status.HTTP_422_UNPROCESSABLE_ENTITY - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Please enter a valid field name for input', - } - except IntegrityError: - status_code = status.HTTP_409_CONFLICT - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Duplication data for username or email', - } - except User.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_user - } - except Administrator.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_administrator - } - return Response(response, status=status_code) - - -# Temporary for sprint review lol -class MahasiswaPraktikumView(viewsets.ModelViewSet): - """ - Provides a get method handler. - """ - permission_classes = (AllowAny, ) - queryset = MahasiswaPraktikum.objects.all() - serializer_class = MahasiswaDetailPraktikumSerializerTemp - - -class LaporanAkhirDBView(views.APIView): - """ - Provides a get method handler. - """ - permission_classes = (AllowAny, ) - - def get(self, request): - final_queryset = [] - mahasiswa = Mahasiswa.objects.all() - for mhs in mahasiswa: - laporan_akhir = LaporanAkhirPraktikum.objects.filter(mahasiswa=mhs) - data = {} - data['mahasiswa'] = MahasiswaSerializer(mhs).data - data['laporan_akhir'] = [] - for lprn in laporan_akhir: - data['laporan_akhir'].append(LaporanAkhirPraktikumSerializer_v2(lprn).data) - final_queryset.append(data) - return Response(final_queryset) - - -class LaporanAkhirPraktikumView(viewsets.ModelViewSet): - """ - Provides a get method handler. - """ - permission_classes = (AllowAny, ) - serializer_class = LaporanAkhirPraktikumSerializer - queryset = LaporanAkhirPraktikum.objects.all() - - def create(self, request): - npm = request.data['npm_mahasiswa'] - praktikum_ke = request.data['jenis_praktikum'] - data = request.data['file'] - lembaga_id = request.data['lembaga_id'] - frmt, filestr = data.split(';base64,') - ext = frmt.split('/')[-1] - - obj, created = LaporanAkhirPraktikum.objects.update_or_create( - nama_laporan=request.data['nama_laporan'], - waktu_deadline=datetime.now(), - mahasiswa=Mahasiswa.objects.get(npm=npm), - jenis_praktikum=Praktikum.objects.get(jenis_praktikum=praktikum_ke), - periode_praktikum=request.data['periode_praktikum'], - lembaga=Lembaga.objects.get(id=lembaga_id), - laporan_akhir=ContentFile(base64.b64decode(filestr), name=npm + '.' + ext), - umpan_balik='default', - status_publikasi=True - ) - return HttpResponse('OK') - - def update(self, request, pk): - npm = request.data['npm_mahasiswa'] - praktikum_ke = request.data['jenis_praktikum'] - data = request.data['file'] - lembaga_id = request.data['lembaga_id'] - frmt, filestr = data.split(';base64,') - ext = frmt.split('/')[-1] - - LaporanAkhirPraktikum.objects.filter(pk=pk).update( - nama_laporan=request.data['nama_laporan'], - waktu_deadline=datetime.now(), - mahasiswa=Mahasiswa.objects.get(npm=npm), - jenis_praktikum=Praktikum.objects.get(jenis_praktikum=praktikum_ke), - periode_praktikum=request.data['periode_praktikum'], - lembaga=Lembaga.objects.get(id=lembaga_id), - umpan_balik='default' - ) - - lprn = LaporanAkhirPraktikum.objects.get(pk=pk) - lprn.laporan_akhir = ContentFile(base64.b64decode(filestr), name=npm + '.' + ext) - lprn.save() - return HttpResponse('OK') - - -class MahasiswaView(viewsets.ModelViewSet): - """ - API For Mahasiswa List, - Sorted in Alphabetical Order - - Usage: - - - npm (Optional) = Mahasiswa's NPM - """ - - # Authentication Setting - permission_classes = (AllowAny, ) - - # Initialize Serializer for Mahasiswa - serializer_class = MahasiswaWithJenisPraktikumSerializer - - # Retrieve objects from models in alphabetical order (default) - queryset = Mahasiswa.objects.order_by('user__username') - - # The method below handles data retrieval - # when filter parameter is applied - def get_queryset(self, *args, **kwargs): - result = dict() - try: - """ - Optionally restricts the returned Mahasiswas - by filtering against a `npm` query parameter in the URL. - """ - - # Retrieve objects from models in alphabetical order - queryset = Mahasiswa.objects.order_by('user__username') - - # Parameter to retrieve data by filter (npm) - parameter = self.request.GET.get('npm') - - # Check if it uses parameter to filter data - if (parameter): - queryset = queryset.filter(npm=parameter) - - # Return JSON Response - return queryset - - # HANDLE EXCEPTION when there is Unicode Error - except UnicodeError: - # Build JSON Response - result['status'] = "500" - result['message'] = "Unable to handle Unicode Input." - return result - - # HANDLE EXCEPTION when NameError (undefined variables, undefined data, etc) occured - except NameError: - # Build JSON Response - result['status'] = "500" - result['message'] = "Undefined data occured, please check the given parameters, etc." - return result - - # HANDLE EXCEPTION when no data is found - except Mahasiswa.DoesNotExist: - # Build JSON Response - result['status'] = "404" - result['message'] = "Mahasiswa not found based on the given filter!" - return result - - -class InputDataMahasiswaExcelView(CreateAPIView): - - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - excel_columns = [ - 'No', - 'Nama Awal', - 'Nama Akhir', - 'Username SSO', - 'Email UI', - 'NPM', - 'Jenis Praktikum', - 'Username Supervisor Sekolah', - 'Username Supervisor Lembaga', - 'Lembaga', - 'Periode' - ] - number_of_laporan = 14 - template_laporan_name = "Laporan Minggu " - template_laporan_akhir_name = "Laporan Akhir" - template_laporan_borang_name = "Borang Penilaian Praktikum" - - def post(self, request): - try: - Administrator.objects.get(user=request.user) - excel_file = request.data['file'] - if (str(excel_file).split('.')[-1] == 'xls'): - data = xls_get(excel_file, column_limit=len(self.excel_columns)) - - is_saved_file_name = (Config.objects.filter(key="file_name_sheet_mahasiswa").count() != 0) - if is_saved_file_name: - file_name = Config.objects.get(key="file_name_sheet_mahasiswa") - file_name.value = str(excel_file) - file_name.save() - else: - Config.objects.create( - key="file_name_sheet_mahasiswa", - value=str(excel_file) - ) - - is_saved_file_date = (Config.objects.filter(key="file_date_sheet_mahasiswa").count() != 0) - if is_saved_file_date: - file_date = Config.objects.get(key="file_date_sheet_mahasiswa") - file_date.value = datetime.now().strftime("%d-%b-%Y (%H:%M:%S)") - file_date.save() - else: - Config.objects.create( - key="file_date_sheet_mahasiswa", - value=datetime.now().strftime("%d-%b-%Y (%H:%M:%S)") - ) - - elif (str(excel_file).split('.')[-1] == 'xlsx'): - data = xlsx_get(excel_file, column_limit=len(self.excel_columns)) - - is_saved_file_name = (Config.objects.filter(key="file_name_sheet_mahasiswa").count() != 0) - if is_saved_file_name: - file_name = Config.objects.get(key="file_name_sheet_mahasiswa") - file_name.value = str(excel_file) - file_name.save() - else: - Config.objects.create( - key="file_name_sheet_mahasiswa", - value=str(excel_file) - ) - - is_saved_file_date = (Config.objects.filter(key="file_date_sheet_mahasiswa").count() != 0) - if is_saved_file_date: - file_date = Config.objects.get(key="file_date_sheet_mahasiswa") - file_date.value = datetime.now().strftime("%d-%b-%Y (%H:%M:%S)") - file_date.save() - else: - Config.objects.create( - key="file_date_sheet_mahasiswa", - value=datetime.now().strftime("%d-%b-%Y (%H:%M:%S)") - ) - - else: - status_code = status.HTTP_422_UNPROCESSABLE_ENTITY - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Please enter a valid format xls or xlsx file', - } - - file_name, mahasiswa_list = list(data.items())[0] - mahasiswa_list = mahasiswa_list[1:] - if (len(mahasiswa_list) >= 1): - - for mahasiswa in mahasiswa_list: - - try: - if mahasiswa == []: - break - if len(mahasiswa) < 11: - break - except IndexError: - break - - if (len(mahasiswa) == len(self.excel_columns)) and (mahasiswa[0] != self.excel_columns[0]): - username_count = User.objects.filter(username=mahasiswa[self.excel_columns.index('Username SSO')]).count() - email_count = User.objects.filter(email=mahasiswa[self.excel_columns.index('Email UI')]).count() - try: - user_supervisor_sekolah = User.objects.get(username=mahasiswa[self.excel_columns.index('Username Supervisor Sekolah')]) - supervisor_sekolah = SupervisorSekolah.objects.get(user=user_supervisor_sekolah) - except User.DoesNotExist: - supervisor_sekolah = None - except SupervisorSekolah.DoesNotExist: - supervisor_sekolah = None - - try: - user_supervisor_lembaga = User.objects.get(username=mahasiswa[self.excel_columns.index('Username Supervisor Lembaga')]) - supervisor_lembaga = SupervisorLembaga.objects.get(user=user_supervisor_lembaga) - except User.DoesNotExist: - supervisor_lembaga = None - except SupervisorLembaga.DoesNotExist: - supervisor_lembaga = None - try: - periode = Periode.objects.get(nama=mahasiswa[self.excel_columns.index('Periode')]) - except Periode.DoesNotExist: - periode = Periode.objects.create(nama=mahasiswa[self.excel_columns.index('Periode')]) - - if (username_count == 0) and (email_count == 0): - user = User.objects.create_user( - first_name=mahasiswa[self.excel_columns.index('Nama Awal')], - last_name=mahasiswa[self.excel_columns.index('Nama Akhir')], - username=mahasiswa[self.excel_columns.index('Username SSO')], - email=mahasiswa[self.excel_columns.index('Email UI')], - ) - - mahasiswa_object = Mahasiswa.objects.create( - user=user, - npm=mahasiswa[self.excel_columns.index('NPM')], - supervisor_sekolah=supervisor_sekolah, - supervisor_lembaga=supervisor_lembaga, - periode=periode - ) - else: - user = User.objects.get(username=mahasiswa[self.excel_columns.index('Username SSO')]) - user.email = mahasiswa[self.excel_columns.index('Email UI')] - user.is_active = True - user.save() - - mahasiswa_object = Mahasiswa.objects.get(user=user) - mahasiswa_object.npm = mahasiswa[self.excel_columns.index('NPM')] - mahasiswa_object.supervisor_sekolah = supervisor_sekolah - mahasiswa_object.supervisor_lembaga = supervisor_lembaga - mahasiswa_object.periode = periode - mahasiswa_object.save() - - praktikum_list = Praktikum.objects.all() - mahasiswa_praktikum = MahasiswaPraktikum.objects.filter(mahasiswa=mahasiswa_object).count() - for praktikum in praktikum_list: - if praktikum.jenis_praktikum == mahasiswa[self.excel_columns.index('Jenis Praktikum')]: - is_active = True - else: - is_active = False - - if mahasiswa_praktikum == 0: - MahasiswaPraktikum.objects.create( - mahasiswa=mahasiswa_object, - list_praktikum=praktikum, - status=is_active - ) - else: - MahasiswaPraktikum.objects.filter(mahasiswa=mahasiswa_object, list_praktikum=praktikum).update(status=is_active) - - laporan_count = KelolaLaporanPraktikum.objects.filter(mahasiswa=mahasiswa_object, jenis_praktikum=praktikum).count() - if is_active and laporan_count == 0: - for i in range(1, self.number_of_laporan + 1): - KelolaLaporanPraktikum.objects.create( - mahasiswa=mahasiswa_object, - jenis_praktikum=praktikum, - nama_laporan=self.template_laporan_name + str(i) - ) - - laporan_akhir_count = LaporanAkhirPraktikum.objects.filter(mahasiswa=mahasiswa_object, jenis_praktikum=praktikum).count() - if is_active and laporan_akhir_count == 0: - LaporanAkhirPraktikum.objects.create( - mahasiswa=mahasiswa_object, - jenis_praktikum=praktikum, - nama_laporan=self.template_laporan_akhir_name - ) - - laporan_borang_count = LaporanBorangPraktikum.objects.filter(mahasiswa=mahasiswa_object, jenis_praktikum=praktikum).count() - if is_active and laporan_borang_count == 0: - LaporanBorangPraktikum.objects.create( - mahasiswa=mahasiswa_object, - jenis_praktikum=praktikum, - nama_laporan=self.template_laporan_borang_name - ) - - status_code = status.HTTP_201_CREATED - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Successfuly added to database', - } - except MultiValueDictKeyError: - status_code = status.HTTP_422_UNPROCESSABLE_ENTITY - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Please enter a valid format row-column excel file', - } - except Administrator.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_administrator - } - return Response(response, status=status_code) - - -class InputDataDosenExcelView(CreateAPIView): - - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - excel_columns = [ - 'No', - 'Nama Awal', - 'Nama Akhir', - 'Username SSO', - 'Email UI', - 'Role', - 'NIP' - ] - - def post(self, request): - try: - Administrator.objects.get(user=request.user) - excel_file = request.data['file'] - if (str(excel_file).split('.')[-1] == 'xls'): - data = xls_get(excel_file, column_limit=len(self.excel_columns)) - - is_saved_file_name = (Config.objects.filter(key="file_name_sheet_dosen").count() != 0) - if is_saved_file_name: - file_name = Config.objects.get(key="file_name_sheet_dosen") - file_name.value = str(excel_file) - file_name.save() - else: - Config.objects.create( - key="file_name_sheet_dosen", - value=str(excel_file) - ) - - is_saved_file_date = (Config.objects.filter(key="file_date_sheet_dosen").count() != 0) - if is_saved_file_date: - file_date = Config.objects.get(key="file_date_sheet_dosen") - file_date.value = datetime.now().strftime("%d-%b-%Y (%H:%M:%S)") - file_date.save() - else: - Config.objects.create( - key="file_date_sheet_dosen", - value=datetime.now().strftime("%d-%b-%Y (%H:%M:%S)") - ) - - elif (str(excel_file).split('.')[-1] == 'xlsx'): - data = xlsx_get(excel_file, column_limit=len(self.excel_columns)) - - is_saved_file_name = (Config.objects.filter(key="file_name_sheet_dosen").count() != 0) - if is_saved_file_name: - file_name = Config.objects.get(key="file_name_sheet_dosen") - file_name.value = str(excel_file) - file_name.save() - else: - Config.objects.create( - key="file_name_sheet_dosen", - value=str(excel_file) - ) - - is_saved_file_date = (Config.objects.filter(key="file_date_sheet_dosen").count() != 0) - if is_saved_file_date: - file_date = Config.objects.get(key="file_date_sheet_dosen") - file_date.value = datetime.now().strftime("%d-%b-%Y (%H:%M:%S)") - file_date.save() - else: - Config.objects.create( - key="file_date_sheet_dosen", - value=datetime.now().strftime("%d-%b-%Y (%H:%M:%S)") - ) - - else: - status_code = status.HTTP_422_UNPROCESSABLE_ENTITY - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Please enter a valid format xls or xlsx file', - } - - file_name, dosen_list = list(data.items())[0] - dosen_list = dosen_list[1:] - if (len(dosen_list) >= 1): - - for dosen in dosen_list: - - try: - if dosen == []: - break - if len(dosen) < 7: - break - except IndexError: - break - - role = dosen[self.excel_columns.index('Role')] - - if (len(dosen) == len(self.excel_columns)) and (dosen[0] != self.excel_columns[0]) and \ - ((role == Role.SSK.value) or (role == Role.KKL.value) or (role == Role.ADM.value)): - - username_count = User.objects.filter(username=dosen[self.excel_columns.index('Username SSO')]).count() - email_count = User.objects.filter(email=dosen[self.excel_columns.index('Email UI')]).count() - - if (username_count == 0) and (email_count == 0): - user = User.objects.create_user( - first_name=dosen[self.excel_columns.index('Nama Awal')], - last_name=dosen[self.excel_columns.index('Nama Akhir')], - username=dosen[self.excel_columns.index('Username SSO')], - email=dosen[self.excel_columns.index('Email UI')], - ) - if role == Role.SSK.value: - dosen_object = SupervisorSekolah.objects.create( - user=user, - nip=dosen[self.excel_columns.index('NIP')] - ) - if role == Role.KKL.value: - dosen_object = KoordinatorKuliah.objects.create( - user=user, - nip=dosen[self.excel_columns.index('NIP')] - ) - if role == Role.KKL.value: - dosen_object = Administrator.objects.create( - user=user, - nip=dosen[self.excel_columns.index('NIP')] - ) - else: - user = User.objects.get(username=dosen[self.excel_columns.index('Username SSO')]) - if Administrator.objects.filter(user=user).count() != 0: - old_role = "Administrator" - elif SupervisorSekolah.objects.filter(user=user).count() != 0: - old_role = "Supervisor Sekolah" - elif KoordinatorKuliah.objects.filter(user=user).count() != 0: - old_role = "Koordinator Kuliah" - user.email = dosen[self.excel_columns.index('Email UI')] - user.role = role - user.is_active = True - user.save() - - if old_role == Role.SSK.value: - dosen_object = SupervisorSekolah.objects.get(user=user) - elif old_role == Role.KKL.value: - dosen_object = KoordinatorKuliah.objects.get(user=user) - elif old_role == Role.ADM.value: - dosen_object = Administrator.objects.get(user=user) - - dosen_object.nip = dosen[self.excel_columns.index('NIP')] - dosen_object.save() - - if old_role != role: - if role == Role.SSK.value: - SupervisorSekolah.objects.create( - user=user, - nip=dosen_object.nip - ) - elif role == Role.KKL.value: - KoordinatorKuliah.objects.create( - user=user, - nip=dosen_object.nip - ) - elif role == Role.ADM.value: - Administrator.objects.create( - user=user, - nip=dosen_object.nip - ) - dosen_object.delete() - - status_code = status.HTTP_201_CREATED - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Successfuly added to database', - } - except MultiValueDictKeyError: - status_code = status.HTTP_422_UNPROCESSABLE_ENTITY - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Please enter a valid format row-column excel file', - } - except Administrator.DoesNotExist: - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: error_message_404_administrator - } - return Response(response, status=status_code) - - -class UserAdministratorFileUploadInfo(RetrieveAPIView): - - permission_classes = (IsAuthenticated,) - authentication_class = JSONWebTokenAuthentication - - def get(self, request): - sheet_name_dosen_exist = (Config.objects.filter(key="file_name_sheet_dosen").count() != 0) - sheet_date_dosen_exist = (Config.objects.filter(key="file_date_sheet_dosen").count() != 0) - sheet_name_mahasiswa_exist = (Config.objects.filter(key="file_name_sheet_mahasiswa").count() != 0) - sheet_date_mahasiswa_exist = (Config.objects.filter(key="file_date_sheet_mahasiswa").count() != 0) - - sheet_name_dosen = "" - sheet_date_dosen = "" - sheet_name_mahasiswa = "" - sheet_date_mahasiswa = "" - - if sheet_name_dosen_exist: - sheet_name_dosen = Config.objects.get(key="file_name_sheet_dosen").value - if sheet_date_dosen_exist: - sheet_date_dosen = Config.objects.get(key="file_date_sheet_dosen").value - if sheet_name_mahasiswa_exist: - sheet_name_mahasiswa = Config.objects.get(key="file_name_sheet_mahasiswa").value - if sheet_date_mahasiswa_exist: - sheet_date_mahasiswa = Config.objects.get(key="file_date_sheet_mahasiswa").value - - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - 'file_name_dosen': sheet_name_dosen, - 'file_date_dosen': sheet_date_dosen, - 'file_name_mahasiswa': sheet_name_mahasiswa, - 'file_date_mahasiswa': sheet_date_mahasiswa - } - return Response(response, status=status_code) diff --git a/new/laporan_praktikum/views_riwayat.py b/new/laporan_praktikum/views_riwayat.py deleted file mode 100644 index 68bef2d..0000000 --- a/new/laporan_praktikum/views_riwayat.py +++ /dev/null @@ -1,764 +0,0 @@ -from authentication.models import ( - User, - Mahasiswa, - SupervisorLembaga, - SupervisorSekolah, - Periode -) -from authentication.serializers import ( - MahasiswaSerializer, - SupervisorLembagaSerializer, - SupervisorSekolahSerializer -) - -from lembaga.models import ( - Lembaga, - Institusi, - Tema -) - -from laporan_praktikum.models import ( - Praktikum, - KelolaLaporanPraktikum, - LaporanAkhirPraktikum, - LaporanBorangPraktikum, - MahasiswaPraktikum, - Praktikum -) -from laporan_praktikum.serializers import ( - KelolaLaporanPraktikumSerializer, - KelolaLaporanPraktikumDefaultSerializer, - MahasiswaDetailPraktikumSerializer, - PraktikumSerializer, - - RiwayatMahasiswaLaporanMingguanSerializer, - RiwayatMahasiswaLaporanAkhirSerializer, - RiwayatMahasiswaLaporanBorangSerializer, - - RiwayatSupervisiMahasiswaBySupervisorLembagaSerializer, - RiwayatSupervisiLaporanAkhirMahasiswaBySupervisorLembagaSerializer, - RiwayatSupervisiLaporanBorangMahasiswaBySupervisorLembagaSerializer, - - RiwayatSupervisiMahasiswaBySupervisorSekolahSerializer, - RiwayatSupervisiLaporanAkhirMahasiswaBySupervisorSekolahSerializer, - RiwayatSupervisiLaporanBorangMahasiswaBySupervisorSekolahSerializer, - - RiwayatSupervisiMahasiswaWithContextProfileSerializer, - SupervisorSekolahListMahasiswaSerializer, - SupervisorLembagaSpesificSerializer, - RiwayatSupervisiMahasiswaLaporanAkhirWithContextProfileSerializer, - RiwayatSupervisiMahasiswaLaporanBorangWithContextProfileSerializer - -) -from rest_framework.decorators import api_view, permission_classes, authentication_classes -from rest_framework.response import Response -from rest_framework import status -from rest_framework.permissions import AllowAny, IsAuthenticated -from rest_framework.test import APIRequestFactory -from rest_framework.request import Request -from rest_framework.generics import CreateAPIView -from rest_framework.generics import RetrieveAPIView -from rest_framework.generics import UpdateAPIView -from rest_framework_jwt.authentication import JSONWebTokenAuthentication - -from django.core import serializers -from django.db import transaction, IntegrityError -from django.http import HttpResponse, JsonResponse - -import json -import datetime -from dateutil.parser import parse - -response_field = ['success', 'status_code', 'message'] - -# Messages -STR_SUCCESS_FETCH_LAPORAN_PRAKTIKUM = "Laporan Praktikum fetched successfully" - - -@api_view(["GET"]) # pragma: no cover -@authentication_classes([JSONWebTokenAuthentication]) -@permission_classes([IsAuthenticated]) -def get_riwayat_laporan_by_mahasiswa(request): - # Mahasiswa Riwayat Laporan Terunggah - mahasiswa = Mahasiswa.objects.get(user=request.user) - praktikum = MahasiswaPraktikum.objects.get(mahasiswa=mahasiswa, status=True) - laporan_mingguan_mahasiswa = KelolaLaporanPraktikum.objects.filter(mahasiswa=mahasiswa, - jenis_praktikum=praktikum.list_praktikum) - laporan_akhir_mahasiswa = LaporanAkhirPraktikum.objects.filter(mahasiswa=mahasiswa, - jenis_praktikum=praktikum.list_praktikum) - laporan_borang_mahasiswa = LaporanBorangPraktikum.objects.filter(mahasiswa=mahasiswa, - jenis_praktikum=praktikum.list_praktikum) - - serializer_mahasiswa = MahasiswaSerializer(mahasiswa, context={'request': request}) - - serializer_riwayat_laporan_mingguan = RiwayatMahasiswaLaporanMingguanSerializer( - laporan_mingguan_mahasiswa.order_by('-waktu_submisi'), - context={'request': request}, many=True) - serializers_riwayat_laporan_akhir = RiwayatMahasiswaLaporanAkhirSerializer( - laporan_akhir_mahasiswa.order_by('-waktu_submisi'), - context={'request': request}, many=True) - serializer_riwayat_laporan_borang = RiwayatMahasiswaLaporanBorangSerializer( - laporan_borang_mahasiswa.order_by('-waktu_submisi'), - context={'request': request}, many=True) - - serializer_riwayat_lap_mingguan_supv_lembaga = RiwayatSupervisiMahasiswaBySupervisorLembagaSerializer( - laporan_mingguan_mahasiswa.order_by('-waktu_nilai_supv_lembaga'), - context={'request': request}, many=True) - serializer_riwayat_lap_akhir_supv_lembaga = RiwayatSupervisiLaporanAkhirMahasiswaBySupervisorLembagaSerializer( - laporan_akhir_mahasiswa.order_by('-waktu_nilai_supv_lembaga'), - context={'request': request}, many=True) - serializer_riwayat_lap_borang_supv_lembaga = RiwayatSupervisiLaporanBorangMahasiswaBySupervisorLembagaSerializer( - laporan_borang_mahasiswa.order_by('-waktu_nilai_supv_lembaga'), - context={'request': request}, many=True) - - serializer_riwayat_lap_mingguan_supv_sekolah = RiwayatSupervisiMahasiswaBySupervisorSekolahSerializer( - laporan_mingguan_mahasiswa.order_by('-waktu_nilai_supv_sekolah'), - context={'request': request}, many=True) - serializer_riwayat_lap_akhir_supv_sekolah = RiwayatSupervisiLaporanAkhirMahasiswaBySupervisorSekolahSerializer( - laporan_akhir_mahasiswa.order_by('-waktu_nilai_supv_sekolah'), - context={'request': request}, many=True) - serializer_riwayat_lap_borang_supv_sekolah = RiwayatSupervisiLaporanBorangMahasiswaBySupervisorSekolahSerializer( - laporan_borang_mahasiswa.order_by('-waktu_nilai_supv_sekolah'), - context={'request': request}, many=True) - - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: STR_SUCCESS_FETCH_LAPORAN_PRAKTIKUM, - 'profile': serializer_mahasiswa.data, - 'riwayat_laporan_siswa': { - 'laporan_mingguan': serializer_riwayat_laporan_mingguan.data, - 'laporan_akhir': serializers_riwayat_laporan_akhir.data, - 'laporan_borang': serializer_riwayat_laporan_borang.data - }, - 'riwayat_supv_sekolah': { - 'laporan_mingguan': serializer_riwayat_lap_mingguan_supv_sekolah.data, - 'laporan_akhir': serializer_riwayat_lap_akhir_supv_sekolah.data, - 'laporan_borang': serializer_riwayat_lap_borang_supv_sekolah.data - }, - 'riwayat_supv_lembaga': { - 'laporan_mingguan': serializer_riwayat_lap_mingguan_supv_lembaga.data, - 'laporan_akhir': serializer_riwayat_lap_akhir_supv_lembaga.data, - 'laporan_borang': serializer_riwayat_lap_borang_supv_lembaga.data - } - } - return Response(response, status=status.HTTP_200_OK) - - -@api_view(["GET"]) # pragma: no cover -@authentication_classes([JSONWebTokenAuthentication]) -@permission_classes([IsAuthenticated]) -def get_riwayat_laporan_by_supervisor_sekolah(request): - # Supervisor Sekolah Riwayat Laporan - profile_supervisor_sekolah = SupervisorSekolah.objects.get(user=request.user) - list_profile_mahasiswa = Mahasiswa.objects.filter(supervisor_sekolah=profile_supervisor_sekolah) - - data_laporan_mahasiswa = Mahasiswa.objects.none() - data_laporan_akhir_mahasiswa = Mahasiswa.objects.none() - data_laporan_borang_mahasiswa = Mahasiswa.objects.none() - for profile_mahasiswa in list_profile_mahasiswa.iterator(): - - praktikum = MahasiswaPraktikum.objects.get(mahasiswa=profile_mahasiswa, status=True) - laporan_mahasiswa = KelolaLaporanPraktikum.objects.filter(mahasiswa=profile_mahasiswa, jenis_praktikum=praktikum.list_praktikum) - laporan_akhir_mahasiswa = LaporanAkhirPraktikum.objects.filter(mahasiswa=profile_mahasiswa, jenis_praktikum=praktikum.list_praktikum) - laporan_borang_mahasiswa = LaporanBorangPraktikum.objects.filter(mahasiswa=profile_mahasiswa, jenis_praktikum=praktikum.list_praktikum) - - # merge querysets - data_laporan_mahasiswa = data_laporan_mahasiswa | laporan_mahasiswa - data_laporan_akhir_mahasiswa = data_laporan_akhir_mahasiswa | laporan_akhir_mahasiswa - data_laporan_borang_mahasiswa = data_laporan_borang_mahasiswa | laporan_borang_mahasiswa - - serializer_supervisor_sekolah = SupervisorSekolahSerializer(profile_supervisor_sekolah, context={'request': request}) - serializer_riwayat_mahasiswa = RiwayatSupervisiMahasiswaWithContextProfileSerializer( - data_laporan_mahasiswa.order_by('skor_laporan_sekolah', '-waktu_submisi'), - context={'request': request}, many=True) - - serializer_riwayat_lap_akhir = RiwayatSupervisiMahasiswaLaporanAkhirWithContextProfileSerializer( - data_laporan_akhir_mahasiswa.order_by('skor_laporan_sekolah', '-waktu_submisi'), - context={'request': request}, many=True) - - serializer_riwayat_lap_borang = RiwayatSupervisiMahasiswaLaporanAkhirWithContextProfileSerializer( - data_laporan_borang_mahasiswa.order_by('skor_laporan_sekolah', '-waktu_submisi'), - context={'request': request}, many=True) - - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: STR_SUCCESS_FETCH_LAPORAN_PRAKTIKUM, - 'profile': serializer_supervisor_sekolah.data, - 'riwayat_laporan_siswa': serializer_riwayat_mahasiswa.data, - 'riwayat_laporan_akhir': serializer_riwayat_lap_akhir.data, - 'riwayat_laporan_borang': serializer_riwayat_lap_borang.data - } - return Response(response, status=status.HTTP_200_OK) - - -@api_view(["GET"]) # pragma: no cover -@authentication_classes([JSONWebTokenAuthentication]) -@permission_classes([IsAuthenticated]) -def get_riwayat_laporan_by_supervisor_lembaga(request): - - # Supervisor Lembaga Riwayat Laporan - profile_supervisor_lembaga = SupervisorLembaga.objects.get(user=request.user) - list_profile_mahasiswa = Mahasiswa.objects.filter(supervisor_lembaga=profile_supervisor_lembaga) - - data_laporan_mahasiswa = Mahasiswa.objects.none() - for profile_mahasiswa in list_profile_mahasiswa.iterator(): - - praktikum = MahasiswaPraktikum.objects.get(mahasiswa=profile_mahasiswa, status=True) - laporan_mahasiswa = LaporanAkhirPraktikum.objects.filter(mahasiswa=profile_mahasiswa, jenis_praktikum=praktikum.list_praktikum) - - # merge querysets - data_laporan_mahasiswa = data_laporan_mahasiswa | laporan_mahasiswa - - serializer_supervisor_lembaga = SupervisorLembagaSerializer(profile_supervisor_lembaga, context={'request': request}) - serializer_riwayat_mahasiswa = RiwayatSupervisiMahasiswaLaporanAkhirWithContextProfileSerializer( - data_laporan_mahasiswa.order_by('skor_laporan_sekolah', '-waktu_submisi'), - context={'request': request}, many=True) - - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: STR_SUCCESS_FETCH_LAPORAN_PRAKTIKUM, - 'profile': serializer_supervisor_lembaga.data, - 'riwayat_laporan_siswa': serializer_riwayat_mahasiswa.data, - } - return Response(response, status=status.HTTP_200_OK) - -# Django Views for Riwayat Praktikum by Lembaga - - -@api_view(["GET"]) # pragma: no cover -@authentication_classes([]) -@permission_classes([]) -def get_riwayat_laporan_by_lembaga(request): - ''' - API Endpoint: - http://localhost:8000/api/v1/lembaga/praktikum?lembaga= - - Expected output: - Lembaga and its riwayat laporan - - Output Format: - success: boolean - status_code: html status code - data: JSON Data - ''' - - try: - query_lembaga = request.GET['lembaga'] - if (query_lembaga.isdigit()): - # Retrieve Lembaga object by id - lembaga_object = Lembaga.objects.get(pk=query_lembaga) - else: - # Retrieve Lembaga object by name - lembaga_object = Lembaga.objects.get(nama=query_lembaga) - - # Periode - if 'periode' in request.GET: - periode = request.GET['periode'] - else: - periode = "all" - - # Retrieve Laporan Akhir from Database - laporan = LaporanAkhirPraktikum.objects.filter(lembaga=lembaga_object.id) - - # Convert laporan query to JSON - laporan_list = [] - mahasiswas = set() - for i in laporan: - object_json = {} - if i.periode_praktikum == periode or periode == "all": - object_json['nama_laporan'] = i.nama_laporan - object_json['jenis_praktikum'] = i.jenis_praktikum.jenis_praktikum - object_json['mahasiswa'] = i.mahasiswa.user.username - object_json['periode_praktikum'] = i.periode_praktikum - laporan_list.append(object_json) - mahasiswas.add(i.mahasiswa.user.username) - - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: STR_SUCCESS_FETCH_LAPORAN_PRAKTIKUM, - 'data': laporan_list, - 'count': len(mahasiswas), - } - except Lembaga.DoesNotExist: - # To indicate that Lembaga is not found and give clear info about the problem - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Lembaga cannot be found', - 'data': [], - 'count': 0, - } - except LaporanAkhirPraktikum.DoesNotExist: - # To indicate that Riwayat Praktikum for this Lembaga is not found and give clear info about the problem - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Riwayat Praktikum for this Lembaga cannot be found', - 'data': [], - 'count': 0, - } - return Response(response, status=status.HTTP_200_OK) - - -@api_view(["GET"]) # pragma: no cover -@authentication_classes([]) -@permission_classes([]) -def get_periode_list(request): - ''' - API Endpoint: - http://localhost:8000/api/v1/periode - - Expected output: - List of all Periodes - ''' - - periode = [i.nama for i in Periode.objects.all()] - - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: "Periodes has successfully been loaded", - 'data': periode, - 'count': len(periode), - } - return Response(response, status=status.HTTP_200_OK) - - -def get_ketepatan_pengumpulan_per_week(): - none_check = None - - # Retrieve Laporan from Database - laporan = KelolaLaporanPraktikum.objects.filter(status_publikasi=True).order_by('waktu_deadline') - # riwayat_ketepatan and total_pengumpulan are for output - riwayat_ketepatan = dict() - total_pengumpulan = dict() - - # First Week of the first submission - one_laporan = laporan[0] - first_week = datetime.date(one_laporan.waktu_deadline.year, one_laporan.waktu_deadline.month, one_laporan.waktu_deadline.day).isocalendar()[1] - - # First Year - first_year = datetime.date(one_laporan.waktu_deadline.year, one_laporan.waktu_deadline.month, one_laporan.waktu_deadline.day).isocalendar()[0] - - # Iterate Through Laporan - for one_laporan in laporan: - # Check if Mahasiswa is active - is_active = KelolaLaporanPraktikum.objects.filter(mahasiswa=one_laporan.mahasiswa, status_publikasi=True).count() > 0 - - # Check if it has deadline and is active - if (not is_active) and (not one_laporan.waktu_deadline): - continue - - # Dictionary for counting this week's submission time - this_weeks_laporan = {} - this_weeks_laporan[True] = 0 - this_weeks_laporan[False] = 0 - - # Get Week - this_time = datetime.date(one_laporan.waktu_deadline.year, one_laporan.waktu_deadline.month, one_laporan.waktu_deadline.day).isocalendar() - week = this_time[1] - - # Adjust week according to first week - week = week - first_week + 1 - - # Adjust week by year - week += 53 * (this_time[0] - first_year) - - # Construct data structure in riwayat_ketepatan - riwayat_ketepatan[week] = riwayat_ketepatan.get(week, this_weeks_laporan[True]) - - # Check is punctual - is_punctual = (one_laporan.waktu_deadline != none_check) and (one_laporan.waktu_submisi != none_check) - is_punctual = is_punctual and (one_laporan.waktu_deadline >= one_laporan.waktu_submisi) - this_weeks_laporan[is_punctual] += 1 - - # Add to riwayat_ketepatan - riwayat_ketepatan[week] += this_weeks_laporan[True] - - # Add to total_pengumpulan - this_week_total_submission = (this_weeks_laporan[True] + this_weeks_laporan[False]) - total_pengumpulan[week] = total_pengumpulan.get(week, 0) + this_week_total_submission - - # By default, add this week's data as 0 - today_time = datetime.datetime.now() - today_week = datetime.date(today_time.year, today_time.month, today_time.day).isocalendar()[1] - - today_week -= first_week - 1 - riwayat_ketepatan[today_week] = riwayat_ketepatan.get(today_week, 0) - - # Remove week 0 - riwayat_ketepatan.pop(0, None) - total_pengumpulan.pop(0, None) - - return {"first_week": first_week, "riwayat_ketepatan": riwayat_ketepatan, "total_pengumpulan": total_pengumpulan} - - -@api_view(["GET"]) -@authentication_classes([]) -@permission_classes([]) -def get_riwayat_ketepatan_pengumpulan(request): - ''' - API Endpoint: - http://localhost:8000/api/v1/koordinator-kuliah/riwayat-ketepatan-pengumpulan-laporan - - Expected output: - Weekly Count of Puctually submitted report - - Output Format: - success: boolean - status_code: html status code - data: JSON Data - ''' - - try: - riwayat_ketepatan = get_ketepatan_pengumpulan_per_week()['riwayat_ketepatan'] - - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Riwayat Ketepatan Pengumpulan Laporan fetched successfully', - 'data': riwayat_ketepatan, - 'count': len(riwayat_ketepatan.keys()), - } - - # [ Exception Handling ] - except KelolaLaporanPraktikum.DoesNotExist: - # To indicate that KelolaLaporanPraktikum is not found and give clear info about the problem - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Laporan Praktikum cannot be found', - 'data': [], - 'count': 0, - } - - except TypeError: - # To indicate that the data type that is used is validto be compared with ">" operator - # waktu_deadline and waktu_submisi should be in the type of DateTime - status_code = status.HTTP_500_INTERNAL_SERVER_ERROR - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Invalid data type exist in database', - 'data': [], - 'count': 0, - } - - except UnicodeDecodeError: - # To indicate that the server failed to read unicode or special characters - status_code = status.HTTP_500_INTERNAL_SERVER_ERROR - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Failed to read unicode characters', - 'data': [], - 'count': 0, - } - - return Response(response, status=status.HTTP_200_OK) - - -@api_view(["GET"]) -@authentication_classes([]) -@permission_classes([]) -def get_persentase_ketepatan_pengumpulan(request): - ''' - API Endpoint: - http://localhost:8000/api/v1/koordinator-kuliah/persentase-ketepatan-pengumpulan-laporan - - Expected output: - Weekly Percentage of Puctually submitted report - and The comparison to the previous week - - Output Format: - success: boolean - status_code: html status code - data: JSON Data - ''' - output = {"this_week": 0, "previous_week": 0} - try: - riwayat = get_ketepatan_pengumpulan_per_week() - - today_time = datetime.datetime.now() - today_time = datetime.date(today_time.year, today_time.month, today_time.day).isocalendar() - this_week = today_time[1] - - this_week -= riwayat['first_week'] - 1 - - last_week = this_week - 1 - - ketepatan_this_week = riwayat['riwayat_ketepatan'].get(this_week, 0) - total_this_week = riwayat['total_pengumpulan'].get(this_week, 1) - - ketepatan_last_week = riwayat['riwayat_ketepatan'].get(last_week, 0) - total_last_week = riwayat['total_pengumpulan'].get(last_week, 1) - - last_percentage = round(ketepatan_this_week * 100 / total_this_week, 2) - second_last_percentage = round(ketepatan_last_week * 100 / total_last_week, 2) - - difference = (ketepatan_this_week - ketepatan_last_week) * 100 / max(1, ketepatan_last_week) - difference = round(difference, 2) - - status_code = status.HTTP_200_OK - output["this_week"] = last_percentage - output["previous_week"] = second_last_percentage - output["difference_percent"] = difference - - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Persentase Ketepatan Pengumpulan Laporan calculated successfully', - 'data': output, - } - - # [ Exception Handling ] - except KelolaLaporanPraktikum.DoesNotExist: - # To indicate that KelolaLaporanPraktikum is not found and give clear info about the problem - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'No Laporan Praktikum Mingguan found!', - 'data': output, - } - - except TypeError: - # To indicate that the data type that is used is validto be compared with ">" operator - # waktu_deadline and waktu_submisi should be in the type of DateTime - status_code = status.HTTP_500_INTERNAL_SERVER_ERROR - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Invalid data type found in database', - 'data': output, - } - - except UnicodeDecodeError: - # To indicate that the server failed to read unicode or special characters - status_code = status.HTTP_500_INTERNAL_SERVER_ERROR - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Failed to read unicode characters!', - 'data': output, - } - - return Response(response, status=status.HTTP_200_OK) - - -def get_penilaian_laporan_per_week(): - # Retrieve Laporan from Database - laporan = KelolaLaporanPraktikum.objects.filter(status_publikasi=True).order_by('waktu_deadline') - # laporan_dinilai and total_pengumpulan are for output - laporan_dinilai = dict() - total_laporan = dict() - - # First Week of the first submission - one_laporan = laporan[0] - first_time = datetime.date(one_laporan.waktu_deadline.year, one_laporan.waktu_deadline.month, one_laporan.waktu_deadline.day).isocalendar() - first_week = first_time[1] - - # First Year - first_year = datetime.date(one_laporan.waktu_deadline.year, one_laporan.waktu_deadline.month, one_laporan.waktu_deadline.day).isocalendar()[0] - - # Iterate Through Laporan - for one_laporan in laporan: - # Skip if Mahasiswa is not active anymore - is_active = KelolaLaporanPraktikum.objects.filter(mahasiswa=one_laporan.mahasiswa, status_publikasi=True).count() > 0 - if not is_active: - continue - - # Dictionary for counting this week's submission time - this_weeks_laporan = {} - this_weeks_laporan[True] = 0 - this_weeks_laporan[False] = 0 - - # Get Week - this_time = datetime.date(one_laporan.waktu_deadline.year, one_laporan.waktu_deadline.month, one_laporan.waktu_deadline.day).isocalendar() - week = this_time[1] - - # Adjust week according to first week - week = week - first_week + 1 - - # Adjust week by year - week += 53 * (this_time[0] - first_year) - - # Construct data structure in laporan_dinilai - laporan_dinilai[week] = laporan_dinilai.get(week, this_weeks_laporan[True]) - - # Check is graded - is_graded = (one_laporan.skor_laporan_sekolah >= 0) - this_weeks_laporan[is_graded] += 1 - - # Add to laporan_dinilai - laporan_dinilai[week] += this_weeks_laporan[True] - - # Add to total_laporan - this_week_total_submission = (this_weeks_laporan[True] + this_weeks_laporan[False]) - total_laporan[week] = total_laporan.get(week, 0) + this_week_total_submission - - # By default, add this week's data as 0 - today_time = datetime.datetime.now() - today_week = datetime.date(today_time.year, today_time.month, today_time.day).isocalendar()[1] - today_week -= first_week - 1 - laporan_dinilai[today_week] = laporan_dinilai.get(today_week, 0) - - return {"first_week": first_week, "laporan_dinilai": laporan_dinilai, "total_laporan": total_laporan} - - -@api_view(["GET"]) -@authentication_classes([]) -@permission_classes([]) -def get_persentase_penilaian_laporan_supervisor_sekolah(request): - ''' - API Endpoint: - http://localhost:8000/api/v1/koordinator-kuliah/persentase-penilaian-laporan-supervisor-sekolah - - Expected output: - Weekly Percentage of Puctually submitted report - and The comparison to the previous week - - Output Format: - success: boolean - status_code: html status code - data: JSON Data - ''' - output = {"this_week": 0, "previous_week": 0} - try: - riwayat = get_penilaian_laporan_per_week() - - today_time = datetime.datetime.now() - today_time = datetime.date(today_time.year, today_time.month, today_time.day).isocalendar() - this_week = today_time[1] - - this_week -= riwayat['first_week'] - 1 - - last_week = this_week - 1 - - laporan_dinilai_this_week = riwayat['laporan_dinilai'].get(this_week, 0) - total_laporan_this_week = riwayat['total_laporan'].get(this_week, 1) - - laporan_dinilai_last_week = riwayat['laporan_dinilai'].get(last_week, 0) - total_laporan_last_week = riwayat['total_laporan'].get(last_week, 1) - - last_percentage = round(laporan_dinilai_this_week * 100 / total_laporan_this_week, 2) - second_last_percentage = round(laporan_dinilai_last_week * 100 / total_laporan_last_week, 2) - - difference = (laporan_dinilai_this_week - laporan_dinilai_last_week) * 100 / max(1, laporan_dinilai_last_week) - difference = round(difference, 2) - - status_code = status.HTTP_200_OK - output["this_week"] = last_percentage - output["previous_week"] = second_last_percentage - output["difference_percent"] = difference - - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Persentase penilaian Laporan has been calculated successfully', - 'data': output, - } - - # [ Exception Handling ] - except KelolaLaporanPraktikum.DoesNotExist: - # To indicate that KelolaLaporanPraktikum is not found and give clear info about the problem - status_code = status.HTTP_404_NOT_FOUND - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'No Laporan Praktikum Mingguan found.', - 'data': output, - } - - except TypeError: - # To indicate that the data type that is used is validto be compared with ">" operator - # waktu_deadline and waktu_submisi should be in the type of DateTime - status_code = status.HTTP_500_INTERNAL_SERVER_ERROR - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Invalid data type found in database.', - 'data': output, - } - - except UnicodeDecodeError: - # To indicate that the server failed to read unicode or special characters - status_code = status.HTTP_500_INTERNAL_SERVER_ERROR - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Failed to read unicode characters.', - 'data': output, - } - - return Response(response, status=status.HTTP_200_OK) - - -@api_view(["GET"]) -@authentication_classes([JSONWebTokenAuthentication]) -@permission_classes([IsAuthenticated]) -def get_statistik_lembaga(request): - ''' - API Endpoint: - http://localhost:8000/api/v1/statistik-lembaga - - Expected output: - Statistik Lembaga, filtered by tema/institusi & Year - ''' - result = dict() - - try: - lembaga = Lembaga.objects.all() - - # Institusi - institusi = Institusi.objects.all() - institusi = [i.nama for i in institusi] - - # Tema - tema = Tema.objects.all() - tema = [i.nama for i in tema] - - if request.GET['berdasarkan'] == "institusi": - lembaga = lembaga.filter(institusi__nama__in=institusi) - for i in lembaga: - nama_institusi = i.institusi.nama - result[nama_institusi] = result.get(nama_institusi, 0) + 1 - else: - lembaga = lembaga.filter(institusi__nama__in=tema) - for i in lembaga: - nama_tema = i.tema.nama - result[nama_tema] = result.get(nama_tema, 0) + 1 - - status_code = status.HTTP_200_OK - response = { - response_field[0]: 'True', - response_field[1]: status_code, - response_field[2]: 'Statistik Lembaga has been loaded successfully', - 'data': result, - } - - # [ Exception Handling ] - except KeyError: - # To indicate that KelolaLaporanPraktikum is not found and give clear info about the problem - status_code = status.HTTP_400_BAD_REQUEST - response = { - response_field[0]: 'False', - response_field[1]: status_code, - response_field[2]: 'Please set the filter', - 'data': result, - } - - return Response(response, status=status_code) diff --git a/new/lembaga/__init__.py b/new/lembaga/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/new/lembaga/admin.py b/new/lembaga/admin.py deleted file mode 100644 index 733cb1e..0000000 --- a/new/lembaga/admin.py +++ /dev/null @@ -1,8 +0,0 @@ -from django.contrib import admin -from lembaga import models - -# Register your models here. -admin.site.register(models.Lembaga) -admin.site.register(models.Institusi) -admin.site.register(models.Tema) -admin.site.register(models.ErrorMessage) diff --git a/new/lembaga/apps.py b/new/lembaga/apps.py deleted file mode 100644 index 76eb4d4..0000000 --- a/new/lembaga/apps.py +++ /dev/null @@ -1,7 +0,0 @@ -""" This module save config for the app """ -from django.apps import AppConfig - - -class LembagaConfig(AppConfig): - """ Config for App Lembaga """ - name = 'lembaga' diff --git a/new/lembaga/migrations/0001_initial.py b/new/lembaga/migrations/0001_initial.py deleted file mode 100644 index 3bf58f3..0000000 --- a/new/lembaga/migrations/0001_initial.py +++ /dev/null @@ -1,45 +0,0 @@ -# Generated by Django 3.0.3 on 2020-06-03 12:43 - -from django.db import migrations, models -import django.db.models.deletion -import lembaga.models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Institusi', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('nama', models.CharField(max_length=255)), - ], - ), - migrations.CreateModel( - name='Tema', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('nama', models.CharField(max_length=255)), - ], - ), - migrations.CreateModel( - name='Lembaga', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('nama', models.CharField(max_length=255)), - ('gambar', models.ImageField(upload_to=lembaga.models.upload_location)), - ('jenis_pelayanan', models.CharField(max_length=255)), - ('deskripsi_singkat', models.TextField()), - ('beneficaries', models.CharField(max_length=1024)), - ('alamat', models.CharField(max_length=1024)), - ('praktikum_ke', models.IntegerField()), - ('institusi', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='lembaga.Institusi')), - ('tema', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='lembaga.Tema')), - ], - ), - ] diff --git a/new/lembaga/migrations/0002_auto_20200604_0324.py b/new/lembaga/migrations/0002_auto_20200604_0324.py deleted file mode 100644 index c7f16be..0000000 --- a/new/lembaga/migrations/0002_auto_20200604_0324.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.0.3 on 2020-06-04 03:24 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('lembaga', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='institusi', - name='nama', - field=models.CharField(max_length=255, unique=True), - ), - migrations.AlterField( - model_name='tema', - name='nama', - field=models.CharField(max_length=255, unique=True), - ), - ] diff --git a/new/lembaga/migrations/0003_carousel.py b/new/lembaga/migrations/0003_carousel.py deleted file mode 100644 index 394840a..0000000 --- a/new/lembaga/migrations/0003_carousel.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 3.0.3 on 2020-06-04 04:23 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('lembaga', '0002_auto_20200604_0324'), - ] - - operations = [ - migrations.CreateModel( - name='Carousel', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('gambar', models.ImageField(upload_to='')), - ], - ), - ] diff --git a/new/lembaga/migrations/0004_auto_20201105_2133.py b/new/lembaga/migrations/0004_auto_20201105_2133.py deleted file mode 100644 index 128f9d2..0000000 --- a/new/lembaga/migrations/0004_auto_20201105_2133.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 3.0.3 on 2020-11-05 21:33 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('lembaga', '0003_carousel'), - ] - - operations = [ - migrations.DeleteModel( - name='Carousel', - ), - migrations.RemoveField( - model_name='lembaga', - name='gambar', - ), - ] diff --git a/new/lembaga/migrations/0005_errormessage.py b/new/lembaga/migrations/0005_errormessage.py deleted file mode 100644 index 08e1359..0000000 --- a/new/lembaga/migrations/0005_errormessage.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 3.1.3 on 2021-03-25 10:31 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('lembaga', '0004_auto_20201105_2133'), - ] - - operations = [ - migrations.CreateModel( - name='ErrorMessage', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ], - ), - ] diff --git a/new/lembaga/migrations/0006_auto_20210425_2225.py b/new/lembaga/migrations/0006_auto_20210425_2225.py deleted file mode 100644 index d86ef77..0000000 --- a/new/lembaga/migrations/0006_auto_20210425_2225.py +++ /dev/null @@ -1,11 +0,0 @@ -# Generated by Django 3.1.3 on 2021-04-25 22:25 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('lembaga', '0005_errormessage'), - ] - diff --git a/new/lembaga/migrations/__init__.py b/new/lembaga/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/new/lembaga/models.py b/new/lembaga/models.py deleted file mode 100644 index a5d4052..0000000 --- a/new/lembaga/models.py +++ /dev/null @@ -1,46 +0,0 @@ -""" This module create a models """ -from django.db import models -from django.conf import settings -import os - - -class Institusi(models.Model): - """ Models for Institusi """ - nama = models.CharField(max_length=255, unique=True) - - def __str__(self): - return self.nama - - -class Tema(models.Model): - """ Models for Tema """ - nama = models.CharField(max_length=255, unique=True) - - def __str__(self): - return self.nama - - -def upload_location(instance, filename): - _, extension = filename.split('.') - return '%s.%s' % (instance.nama, extension) - - -class Lembaga(models.Model): - """ Models for Lembaga """ - nama = models.CharField(max_length=255) - jenis_pelayanan = models.CharField(max_length=255) - institusi = models.ForeignKey(Institusi, on_delete=models.CASCADE) - tema = models.ForeignKey(Tema, on_delete=models.CASCADE) - deskripsi_singkat = models.TextField() - beneficaries = models.CharField(max_length=1024) - alamat = models.CharField(max_length=1024) - praktikum_ke = models.IntegerField() - - def __str__(self): - return self.nama - - -class ErrorMessage(models.Model): - """ Models for Error Messages """ - def not_found(self): - return "tidak ditemukan" diff --git a/new/lembaga/serializers.py b/new/lembaga/serializers.py deleted file mode 100644 index 9830879..0000000 --- a/new/lembaga/serializers.py +++ /dev/null @@ -1,104 +0,0 @@ -from rest_framework import serializers -from lembaga.models import Lembaga, Institusi, Tema, ErrorMessage -from rest_framework.exceptions import NotFound -from drf_extra_fields.fields import Base64ImageField - - -class InstitusiSerializer(serializers.ModelSerializer): - class Meta: - model = Institusi - fields = '__all__' - extra_kwargs = { - 'nama': {'validators': []}, - } - - -class TemaSerializer(serializers.ModelSerializer): - class Meta: - model = Tema - fields = '__all__' - extra_kwargs = { - 'nama': {'validators': []}, - } - - -class LembagaSerializer(serializers.ModelSerializer): - tema = TemaSerializer() - institusi = InstitusiSerializer() - - class Meta: - model = Lembaga - fields = '__all__' - depth = 1 - - def create(self, validated_data): - nama = validated_data.pop('nama') - jenis_pelayanan = validated_data.pop('jenis_pelayanan') - deskripsi_singkat = validated_data.pop('deskripsi_singkat') - praktikum_ke = validated_data.pop('praktikum_ke') - beneficaries = validated_data.pop('beneficaries') - alamat = validated_data.pop('alamat') - - nama_tema = validated_data.pop('tema')['nama'] - - error = ErrorMessage - - try: - tema = Tema.objects.get(nama=nama_tema) - except Tema.DoesNotExist: - raise NotFound(detail="Tema dengan nama " + str(nama_tema) + ErrorMessage.not_found(error)) - - nama_institusi = validated_data.pop('institusi')['nama'] - try: - institusi = Institusi.objects.get(nama=nama_institusi) - except Institusi.DoesNotExist: - raise NotFound(detail="Institusi dengan nama " + str(nama_institusi) + ErrorMessage.not_found(error)) - - lembaga = Lembaga() - lembaga.nama = nama - lembaga.jenis_pelayanan = jenis_pelayanan - lembaga.deskripsi_singkat = deskripsi_singkat - lembaga.institusi = institusi - lembaga.tema = tema - lembaga.praktikum_ke = praktikum_ke - lembaga.beneficaries = beneficaries - lembaga.alamat = alamat - - lembaga.save() - - return lembaga - - def update(self, lembaga, validated_data): - nama = validated_data.pop('nama') - jenis_pelayanan = validated_data.pop('jenis_pelayanan') - deskripsi_singkat = validated_data.pop('deskripsi_singkat') - praktikum_ke = validated_data.pop('praktikum_ke') - beneficaries = validated_data.pop('beneficaries') - alamat = validated_data.pop('alamat') - - nama_tema = validated_data.pop('tema')['nama'] - - error = ErrorMessage - try: - tema = Tema.objects.get(nama=nama_tema) - except Tema.DoesNotExist: - raise NotFound(detail="Tema dengan nama " + str(nama_tema) + ErrorMessage.not_found(error)) - - nama_institusi = validated_data.pop('institusi')['nama'] - try: - institusi = Institusi.objects.get(nama=nama_institusi) - except Institusi.DoesNotExist: - raise NotFound(detail="Institusi dengan nama " + str(nama_institusi) + ErrorMessage.not_found(error)) - - lembaga.nama = nama - lembaga.jenis_pelayanan = jenis_pelayanan - lembaga.deskripsi_singkat = deskripsi_singkat - lembaga.institusi = institusi - lembaga.tema = tema - lembaga.praktikum_ke = praktikum_ke - lembaga.beneficaries = beneficaries - lembaga.alamat = alamat - - lembaga.save() - - return lembaga diff --git a/new/lembaga/tests.py b/new/lembaga/tests.py deleted file mode 100644 index b9ea9ed..0000000 --- a/new/lembaga/tests.py +++ /dev/null @@ -1,270 +0,0 @@ -""" This module test the functionality of the module """ - -from django.test import TestCase -from .models import Lembaga, Tema, Institusi -from .serializers import LembagaSerializer, InstitusiSerializer, TemaSerializer -from django.urls import reverse -from rest_framework.test import APITestCase, APIClient, APIRequestFactory -from rest_framework.views import status -from lembaga.views import LembagaView -from django.core.files import File -from io import BytesIO -from PIL import Image -import base64 - - -# Create your tests here. -class BaseViewTest(APITestCase): - client = APIClient() - - def get_image_file(self, name='test.png', ext='png', size=(50, 50), color=(256, 0, 0)): - file_obj = BytesIO() - image = Image.new("RGBA", size=size, color=color) - image.save(file_obj, ext) - file_obj.seek(0) - return File(file_obj, name=name) - - def setUp(self): - tema = Tema.objects.create(nama="test_tema") - institusi = Institusi.objects.create(nama="test_institusi") - lembaga1 = Lembaga.objects.create(nama="test_nama", - jenis_pelayanan="test_pelayanan", - deskripsi_singkat="test_deskripsi", - tema=tema, institusi=institusi, - praktikum_ke=1, beneficaries="test_beneficaries", - alamat="test_alamat") - lembaga1.gambar = self.get_image_file() - lembaga1.save() - lembaga2 = Lembaga.objects.create(nama="test_nama1", - jenis_pelayanan="test_pelayanan", - deskripsi_singkat="test_deskripsi", - tema=tema, institusi=institusi, - praktikum_ke=1, beneficaries="test_beneficaries", - alamat="test_alamat") - lembaga2.gambar = self.get_image_file() - lembaga2.save() - lembaga3 = Lembaga.objects.create(nama="test_nama2", - jenis_pelayanan="test_pelayanan", - deskripsi_singkat="test_deskripsi", - tema=tema, institusi=institusi, - praktikum_ke=1, beneficaries="test_beneficaries", - alamat="test_alamat") - lembaga3.gambar = self.get_image_file() - lembaga3.save() - - -class LembagaFunctionality(BaseViewTest): - - def test_lembaga_str(self): - """ Test Models Lembaga Field """ - test_lembaga = Lembaga.objects.get(nama="test_nama") - tema = Tema.objects.get(nama="test_tema") - institusi = Institusi.objects.get(nama="test_institusi") - self.assertEqual(str(test_lembaga), 'test_nama') - self.assertEqual(test_lembaga.jenis_pelayanan, 'test_pelayanan') - self.assertEqual(test_lembaga.deskripsi_singkat, 'test_deskripsi') - self.assertEqual(test_lembaga.praktikum_ke, 1) - self.assertEqual(test_lembaga.alamat, "test_alamat") - self.assertEqual(test_lembaga.beneficaries, "test_beneficaries") - self.assertEqual(str(test_lembaga.tema), str(tema)) - self.assertEqual(str(test_lembaga.institusi), str(institusi)) - - def test_get_all_lembaga(self): - """ - Test get all lembaga API functionality - """ - factory = APIRequestFactory() - request = factory.get('/api/v1/lembaga/') - view = LembagaView.as_view(actions={"get": "list"}) - response = view(request) - expected = Lembaga.objects.all() - serialized = LembagaSerializer(expected, many=True, context={'request': request}) - self.assertEqual(response.data, serialized.data) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_add_lembaga(self): - factory = APIRequestFactory() - json = { - "tema": { - "nama": "test_tema" - }, - "institusi": { - "nama": "test_institusi" - }, - "nama": "hom", - "jenis_pelayanan": "pim", - "deskripsi_singkat": "pa", - "praktikum_ke": 1, - "beneficaries": "test_beneficaries", - "alamat": "test_alamat" - } - - json_no_tema = { - "tema": { - "nama": "asal" - }, - "institusi": { - "nama": "test_institusi" - }, - "nama": "hom", - "jenis_pelayanan": "pim", - "deskripsi_singkat": "pa", - "praktikum_ke": 1, - "beneficaries": "test_beneficaries", - "alamat": "test_alamat" - } - - json_no_institusi = { - "tema": { - "nama": "test_tema" - }, - "institusi": { - "nama": "asal" - }, - "nama": "hom", - "jenis_pelayanan": "pim", - "deskripsi_singkat": "pa", - "praktikum_ke": 1, - "beneficaries": "test_beneficaries", - "alamat": "test_alamat" - } - - view = LembagaView.as_view(actions={"post": "create", "put": "update"}) - - request = factory.post('/api/v1/lembaga/posts/', json, format='json') - response = view(request) - - lembaga = Lembaga.objects.get(nama="hom") - self.assertEqual(lembaga.jenis_pelayanan, "pim") - - request = factory.post('/api/v1/lembaga/posts/', json_no_tema, format='json') - response = view(request) - self.assertEqual(response.status_code, 404) - request = factory.post('/api/v1/lembaga/posts/', json_no_institusi, format='json') - response = view(request) - self.assertEqual(response.status_code, 404) - - json_put = { - "tema": { - "nama": "test_tema" - }, - "institusi": { - "nama": "test_institusi" - }, - "nama": "hom", - "jenis_pelayanan": "akut", - "deskripsi_singkat": "pa", - "praktikum_ke": 1, - "beneficaries": "test_beneficaries", - "alamat": "test_alamat" - } - - id_lembaga = lembaga.id - - request = factory.put('/api/v1/lembaga/' + str(id_lembaga) + '/', json_put, format='json') - response = view(request, pk=id_lembaga) - - lembaga = Lembaga.objects.get(nama="hom") - self.assertEqual(lembaga.jenis_pelayanan, "akut") - - def test_get_lembaga_by_param_nama(self): - """ - Test get lembaga with param nama API functionality - """ - # Test API to get lembaga by name that contains substring _4 - param = {'nama': ['test_nama1']} - factory = APIRequestFactory() - request = factory.get('/api/v1/lembaga/', param) - view = LembagaView.as_view(actions={"get": "list"}) - response = view(request) - - # Get All Elements in Object - lembaga_objects = Lembaga.objects.all() - # Generate Response - expected = [] - for i in lembaga_objects: - if param['nama'][0] in i.nama: - expected.append(i) - - serialized = LembagaSerializer(expected, many=True, context={'request': request}) - self.assertEqual(response.data, serialized.data) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_get_lembaga_by_param_nama_not_exist(self): - """ - Test get lembaga with param nama API functionality - """ - # Test API to get lembaga by name that contains the given substring - param = {'nama': ['test_nama1_1233241231231']} - factory = APIRequestFactory() - request = factory.get('/api/v1/lembaga/', param) - view = LembagaView.as_view(actions={"get": "list"}) - response = view(request) - - # Get All Elements in Object - lembaga_objects = Lembaga.objects.all() - # Generate Response - expected = [] - for i in lembaga_objects: - if param['nama'][0] in i.nama: - expected.append(i) - - serialized = LembagaSerializer(expected, many=True, context={'request': request}) - self.assertEqual(response.data, serialized.data) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_get_lembaga_by_param_tema(self): - """ - Test get lembaga with param tema API functionality - """ - param = {'tema': ['test_tema']} - factory = APIRequestFactory() - request = factory.get('/api/v1/lembaga/', param) - view = LembagaView.as_view(actions={"get": "list"}) - response = view(request) - expected = Lembaga.objects.all().filter(tema__nama__in=param['tema']) - serialized = LembagaSerializer(expected, many=True, context={'request': request}) - self.assertEqual(response.data, serialized.data) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_get_lembaga_by_param_institusi(self): - """ - Test get lembaga with param institusi API functionality - """ - param = {'institusi': ['test_institusi']} - factory = APIRequestFactory() - request = factory.get('/api/v1/lembaga/', param) - view = LembagaView.as_view(actions={"get": "list"}) - response = view(request) - expected = Lembaga.objects.all().filter(institusi__nama__in=param['institusi']) - serialized = LembagaSerializer(expected, many=True, context={'request': request}) - self.assertEqual(response.data, serialized.data) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_get_lembaga_by_all_param(self): - """ - Test get lembaga with 2 param API functionality - """ - param = {'tema': ['test_tema'], 'institusi': ['test_institusi']} - factory = APIRequestFactory() - request = factory.get('/api/v1/lembaga/', param) - view = LembagaView.as_view(actions={"get": "list"}) - response = view(request) - expected = Lembaga.objects.all().filter(institusi__nama__in=param['institusi']).filter(tema__nama__in=param['tema']) - serialized = LembagaSerializer(expected, many=True, context={'request': request}) - self.assertEqual(response.data, serialized.data) - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_get_lembaga_by_param_praktikum(self): - """ - Test get lembaga with param praktikum API functionality - """ - param = {'praktikum': ['Praktikum 1']} - factory = APIRequestFactory() - request = factory.get('/api/v1/lembaga/', param) - view = LembagaView.as_view(actions={"get": "list"}) - response = view(request) - expected = Lembaga.objects.all().filter(praktikum_ke__in=[1]) - serialized = LembagaSerializer(expected, many=True, context={'request': request}) - self.assertEqual(response.data, serialized.data) - self.assertEqual(response.status_code, status.HTTP_200_OK) diff --git a/new/lembaga/urls.py b/new/lembaga/urls.py deleted file mode 100644 index fbdc5be..0000000 --- a/new/lembaga/urls.py +++ /dev/null @@ -1,12 +0,0 @@ -from django.urls import path, include -from lembaga.views import LembagaView, InstitusiView, TemaView -from rest_framework import routers - -router = routers.DefaultRouter() -router.register('lembaga', LembagaView, basename="lembaga") -router.register('institusi', InstitusiView, basename="institusi") -router.register('tema', TemaView, basename="tema") - -urlpatterns = [ - path('', include(router.urls)), -] diff --git a/new/lembaga/views.py b/new/lembaga/views.py deleted file mode 100644 index d7484cf..0000000 --- a/new/lembaga/views.py +++ /dev/null @@ -1,74 +0,0 @@ -from rest_framework import generics -from lembaga.models import Lembaga, Institusi, Tema -from lembaga.serializers import LembagaSerializer, InstitusiSerializer, TemaSerializer -from rest_framework.permissions import AllowAny -from rest_framework import viewsets -from django_filters.rest_framework import DjangoFilterBackend - - -class LembagaView(viewsets.ModelViewSet): - permission_classes = (AllowAny,) - serializer_class = LembagaSerializer - - def get_queryset(self, *args, **kwargs): - """ - Optionally restricts the returned purchases to a given user, - by filtering against a query parameter in the URL. - """ - try: - queryset = Lembaga.objects.all() - param_institusi = self.request.GET.get('institusi') - param_tema = self.request.GET.get('tema') - param_praktikum = self.request.GET.get('praktikum') - param_nama = self.request.GET.get('nama') - - if param_praktikum: - temp = param_praktikum.split(',') - param_praktikum = [] - for i in temp: - param_praktikum.append(int(i[-1])) - queryset = queryset.filter(praktikum_ke__in=param_praktikum) - if (param_institusi and param_tema): - param_institusi = param_institusi.split(',') - param_tema = param_tema.split(',') - queryset = queryset.filter(institusi__nama__in=param_institusi).filter(tema__nama__in=param_tema) - else: - if (param_institusi is not None): - param_institusi = param_institusi.split(',') - queryset = queryset.filter(institusi__nama__in=param_institusi) - if (param_tema is not None): - param_tema = param_tema.split(',') - queryset = queryset.filter(tema__nama__in=param_tema) - - # Find lembaga by Name - # by performing substring checking - if param_nama: - tmp_queryset = queryset - queryset = [] - for i in tmp_queryset: - if param_nama.lower() in i.nama.lower(): - queryset.append(i) - - return queryset - - # Kasus Error Jika Parameter, Variable, dan Data tidak di set saat melakukan query - except (ValueError, RuntimeError, TypeError, NameError): - return {"status": "Harap isi kriteria pencarian"} - - -class InstitusiView(viewsets.ModelViewSet): - """ - Provides a get method handler. - """ - permission_classes = (AllowAny, ) - queryset = Institusi.objects.all() - serializer_class = InstitusiSerializer - - -class TemaView(viewsets.ModelViewSet): - """ - Provides a get method handler. - """ - permission_classes = (AllowAny, ) - queryset = Tema.objects.all() - serializer_class = TemaSerializer diff --git a/new/manage.py b/new/manage.py deleted file mode 100644 index 6955dd1..0000000 --- a/new/manage.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env python -"""Django's command-line utility for administrative tasks.""" -import os -import sys - - -def main(): - os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'sip.settings.dev') - try: - from django.core.management import execute_from_command_line - except ImportError as exc: - raise ImportError( - "Couldn't import Django. Are you sure it's installed and " - "available on your PYTHONPATH environment variable? Did you " - "forget to activate a virtual environment?" - ) from exc - execute_from_command_line(sys.argv) - - -if __name__ == '__main__': - main() diff --git a/new/migrate.sh b/new/migrate.sh deleted file mode 100644 index 53e93f3..0000000 --- a/new/migrate.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -python manage.py makemigrations && python manage.py migrate \ No newline at end of file diff --git a/new/requirements.txt b/new/requirements.txt deleted file mode 100644 index 6a20140..0000000 --- a/new/requirements.txt +++ /dev/null @@ -1,98 +0,0 @@ -amqp==2.5.2 -appdirs==1.4.3 -asgiref==3.3.1 -astroid==2.3.3 -atomicwrites==1.3.0 -attrs==19.3.0 -autopep8==1.5.4 -billiard==3.6.3.0 -boto3==1.16.36 -botocore==1.19.36 -celery==4.4.1 -certifi==2019.11.28 -chardet==3.0.4 -colorama==0.4.3 -coreapi==2.3.3 -coreschema==0.0.4 -coverage==5.0.3 -distlib==0.3.1 -dj-database-url==0.5.0 -Django==3.1.3 -django-cas-ng==4.1.1 -django-cleanup==4.0.0 -django-cors-headers==3.2.1 -django-cors-middleware==1.5.0 -django-environ==0.4.5 -django-filter==2.4.0 -django-storages==1.10.1 -djangorestframework==3.11.0 -djangorestframework-jwt==1.11.0 -drf-extra-fields==3.0.3 -drf-yasg==1.17.1 -entrypoints==0.3 -et-xmlfile==1.0.1 -Faker==0.9.1 -filelock==3.0.12 -flake8==3.8.4 -gunicorn==20.0.4 -idna==2.9 -importlib-metadata==1.6.0 -importlib-resources==1.5.0 -inflection==0.4.0 -isort==4.3.21 -itypes==1.2.0 -jdcal==1.4.1 -Jinja2==2.11.2 -jmespath==0.10.0 -kombu==4.6.8 -lazy-object-proxy==1.4.3 -lml==0.0.9 -lxml==4.6.1 -MarkupSafe==1.1.1 -mccabe==0.6.1 -mixer==6.1.3 -mock==4.0.2 -more-itertools==8.2.0 -openapi-codec==1.3.2 -openpyxl==3.0.3 -packaging==20.1 -pdfkit==0.6.1 -Pillow==8.0.1 -pipenv==2018.11.26 -pluggy==0.13.1 -psycopg2-binary==2.8.6 -py==1.8.1 -pycodestyle==2.6.0 -pyexcel-io==0.5.20 -pyexcel-xls==0.5.8 -pyexcel-xlsx==0.5.8 -pyflakes==2.2.0 -PyJWT==1.7.1 -pyparsing==2.4.6 -pytest==5.3.5 -pytest-cov==2.8.1 -python-cas==1.5.0 -python-dateutil==2.8.1 -pytz==2019.3 -requests==2.23.0 -ruamel.yaml==0.16.10 -ruamel.yaml.clib==0.2.0 -s3transfer==0.3.3 -simplejson==3.17.0 -six==1.14.0 -snowballstemmer==2.0.0 -sqlparse==0.3.1 -text-unidecode==1.2 -toml==0.10.2 -typed-ast==1.4.1 -uritemplate==3.0.1 -urllib3==1.25.8 -vine==1.3.0 -virtualenv==20.1.0 -virtualenv-clone==0.5.4 -wcwidth==0.1.8 -whitenoise==5.0.1 -wrapt==1.11.2 -xlrd==1.2.0 -xlwt==1.3.0 -zipp==3.1.0 diff --git a/new/seeder_dev.py b/new/seeder_dev.py deleted file mode 100644 index 95e7fc4..0000000 --- a/new/seeder_dev.py +++ /dev/null @@ -1,493 +0,0 @@ -import os -import django -import random -import string -import datetime -import base64 -import pdfkit - - -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "sip.settings.dev") -django.setup() - - -from authentication.models import ( - User, - Mahasiswa, - SupervisorLembaga, - SupervisorSekolah, - KoordinatorKuliah, - Administrator, - Periode, - ORG_CODE, -) -from lembaga.models import ( - Institusi, - Tema, - Lembaga, -) -from laporan_praktikum.models import ( - Praktikum, - MahasiswaPraktikum, - KelolaLaporanPraktikum, - LaporanAkhirPraktikum, - LaporanBorangPraktikum -) -from authentication.role import Role -from django.core.files import File -from django.core.files.uploadedfile import SimpleUploadedFile -from io import BytesIO -from PIL import Image - - -def seed_user(user_number_each_role): - role_mhs = [(Role.MHS, Role.MHS.value)] * 4 - roles = [(tag, tag.value) for tag in Role] + role_mhs - roles = roles * user_number_each_role - for i in range(len(roles)): - user_data = 'user' + str(i) - User.objects.create_user( - username='username_' + user_data, - email='email_' + user_data + '@mail.com', - password='password_' + user_data, - full_name='full_name_' + user_data, - role=roles[i][1] - ) - print('seeding user..... [SUCCESS]') - - -def seed_institusi(institusi_number): - Institusi.objects.create(nama='Government Organisation') - Institusi.objects.create(nama='Non Government Organisation') - Institusi.objects.create(nama='Komunitas') - Institusi.objects.create(nama='Perusahaan') - Institusi.objects.create(nama='Pendidikan') - print('seeding institusi..... [SUCCESS]') - - -def seed_tema(tema_number): - Tema.objects.create(nama='Lingkungan') - Tema.objects.create(nama='HRD') - Tema.objects.create(nama='CSR ') - Tema.objects.create(nama='Anak dan Remaja') - Tema.objects.create(nama='Lansia') - Tema.objects.create(nama='Disabilitas') - Tema.objects.create(nama='Gender/Perempuan') - Tema.objects.create(nama='Pemberdayaan Masyarakat') - Tema.objects.create(nama='Penanganan Kemiskinan') - Tema.objects.create(nama='Kesehatan') - print('seeding tema..... [SUCCESS]') - - -def get_image_file(name='test.png', ext='png', size=(50, 50), color=(256, 0, 0)): - file_obj = BytesIO() - image = Image.new("RGBA", size=size, color=color) - image.save(file_obj, ext) - file_obj.seek(0) - return File(file_obj, name=name) - - -def seed_lembaga(lembaga_number): - all_institusi = Institusi.objects.all() - all_tema = Tema.objects.all() - jenis_pelayanan_list = [ - 'Perusahaan', - 'Pemerintahan', - 'Organisasi', - ] - for i in range(lembaga_number): - lembaga = Lembaga.objects.create( - nama='nama_lembaga_' + str(i), - jenis_pelayanan=random.choice(jenis_pelayanan_list), - institusi=random.choice(all_institusi), - tema=random.choice(all_tema), - deskripsi_singkat='deskripsi_singkat_' + str(i), - praktikum_ke=1, - beneficaries="test_beneficaries_" + str(i), - alamat="test_alamat_" + str(i) - ) - lembaga.gambar = get_image_file() - lembaga.save() - print('seeding lembaga..... [SUCCESS]') - - -def seed_supervisor_lembaga(): - users = User.objects.filter(role=Role.SLB.value) - all_lembaga = Lembaga.objects.all() - jabatan_list = [ - 'direktur', - 'ketua', - 'hrd', - 'senior marketing', - 'associate marketing' - ] - for i in range(len(users)): - SupervisorLembaga.objects.create( - jabatan=random.choice(jabatan_list), - lembaga=random.choice(all_lembaga), - user=users[i] - ) - print('seeding supervisor lembaga..... [SUCCESS]') - - -def seed_supervisor_sekolah(): - users = User.objects.filter(role=Role.SSK.value) - for i in range(len(users)): - SupervisorSekolah.objects.create( - nip=random.randint(100000000000, 199999999999), - user=users[i] - ) - print('seeding supervisor sekolah..... [SUCCESS]') - - -def seed_koordinator_kuliah(): - users = User.objects.filter(role=Role.KKL.value) - for i in range(len(users)): - KoordinatorKuliah.objects.create( - nip=random.randint(100000000000, 199999999999), - user=users[i] - ) - print('seeding koordinator kuliah..... [SUCCESS]') - - -def seed_administrator(): - users = User.objects.filter(role=Role.ADM.value) - for i in range(len(users)): - Administrator.objects.create( - nip=random.randint(100000000000, 199999999999), - user=users[i] - ) - print('seeding administrator..... [SUCCESS]') - - -def seed_periode(): - periode_list = [ - '2018/2019 - Gasal', - '2018/2019 - Genap', - '2019/2020 - Gasal', - '2020/2021 - Genap', - '2020/2021 - Gasal' - ] - for i in range(len(periode_list)): - Periode.objects.create( - nama=periode_list[i] - ) - print('seeding periode..... [SUCCESS]') - - -def seed_mahasiswa(): - org_code_list = [ - '02.07.09.01', - '05.03.09.01', - '06.03.09.01', - '07.03.09.01', - '01.08.09.01', - '01.06.09.01', - '02.01.09.01', - '01.02.09.01', - '01.05.09.01', - '01.04.09.01', - '07.01.09.01' - ] - users = User.objects.filter(role=Role.MHS.value) - supervisor_lembaga = SupervisorLembaga.objects.all() - supervisor_sekolah = SupervisorSekolah.objects.all() - periode_list = Periode.objects.all() - - for i in range(len(users)): - org_code_random = random.choice(org_code_list) - Mahasiswa.objects.create( - org_code='org_code' + str(i), - faculty=ORG_CODE['id'][org_code_random]['faculty'], - major=ORG_CODE['id'][org_code_random]['faculty'], - program=ORG_CODE['id'][org_code_random]['faculty'], - npm=random.randint(1200000000, 1900000000), - periode=random.choice(periode_list), - user=users[i], - supervisor_lembaga=supervisor_lembaga[i % len(supervisor_lembaga)], - supervisor_sekolah=supervisor_sekolah[i % len(supervisor_sekolah)] - ) - print('seeding mahasiswa..... [SUCCESS]') - - -def seed_superuser(): - User.objects.create_superuser( - email='admin@ppl.com', - password='secret123' - ) - print('seeding super user..... [SUCCESS]') - - -def seed_praktikum(): - Praktikum.objects.create( - jenis_praktikum="Praktikum 1" - ) - Praktikum.objects.create( - jenis_praktikum="Praktikum 2" - ) - print('seeding praktikum..... [SUCCESS]') - - -def seed_kelola_laporan_praktikum(laporan_praktikum_number): - mahasiswa = Mahasiswa.objects.all() - - for i in range(len(mahasiswa)): - this_mahasiswa = mahasiswa[i] - status_praktikum1 = True - status_praktikum2 = False - - praktikum1 = Praktikum.objects.get(jenis_praktikum='Praktikum 1') - praktikum2 = Praktikum.objects.get(jenis_praktikum='Praktikum 2') - - if i % 3 == 0: - status_praktikum2 = True - status_praktikum1 = False - - MahasiswaPraktikum.objects.create( - mahasiswa=this_mahasiswa, - list_praktikum=praktikum1, - status=status_praktikum1 - ) - - MahasiswaPraktikum.objects.create( - mahasiswa=this_mahasiswa, - list_praktikum=praktikum2, - status=status_praktikum2 - ) - for i in range(0, 2): - if i: - this_praktikum = praktikum2 - else: - this_praktikum = praktikum1 - for i in range(laporan_praktikum_number): - random_year = 2020 - random_month = random.randint(1, 6) - random_day = random.randint(1, 27) - random_hour = random.randint(0, 22) - random_minute = random.randint(0, 58) - random_second = random.randint(0, 58) - is_submitted = random.choice([True, False]) - if is_submitted: - KelolaLaporanPraktikum.objects.create( - nama_laporan='nama_laporan_' + str(i), - mahasiswa=this_mahasiswa, - jenis_praktikum=this_praktikum, - waktu_deadline=datetime.datetime( - random_year, - random_month, - random_day, - random_hour, - random_minute, - random_second - ), - waktu_submisi=datetime.datetime( - random_year, - random_month, - random_day + 1, - random_hour + 1, - random_minute + 1, - random_second + 1 - ), - status_publikasi=True, - status_submisi=True, - skor_laporan_sekolah=random.randint(0, 100), - skor_laporan_lembaga=random.randint(0, 100), - link_submisi="https://link_submisi_" + str(i) + ".com" - ) - else: - KelolaLaporanPraktikum.objects.create( - nama_laporan='nama_laporan_' + str(i), - mahasiswa=this_mahasiswa, - jenis_praktikum=this_praktikum, - waktu_deadline=datetime.datetime( - random_year, - random_month, - random_day, - random_hour, - random_minute, - random_second - ), - status_publikasi=random.randint(False, True), - status_submisi=False, - skor_laporan_sekolah=-1, - skor_laporan_lembaga=-1 - ) - print('seeding kelola laporan praktikum..... [SUCCESS]') - -def seed_laporan_akhir_praktikum(laporan_praktikum_number): - mahasiswa = Mahasiswa.objects.all() - - for i in range(len(mahasiswa)): - this_mahasiswa = mahasiswa[i] - status_praktikum1 = True - status_praktikum2 = False - - praktikum1 = Praktikum.objects.get(jenis_praktikum='Praktikum 1') - praktikum2 = Praktikum.objects.get(jenis_praktikum='Praktikum 2') - - if i % 3 == 0: - status_praktikum2 = True - status_praktikum1 = False - - for i in range(0, 2): - if i: - this_praktikum = praktikum2 - else: - this_praktikum = praktikum1 - for i in range(laporan_praktikum_number): - random_year = 2020 - random_month = random.randint(1, 6) - random_day = random.randint(1, 27) - random_hour = random.randint(0, 22) - random_minute = random.randint(0, 58) - random_second = random.randint(0, 58) - is_submitted = random.choice([True, False]) - if is_submitted: - LaporanAkhirPraktikum.objects.create( - nama_laporan='nama_laporan_akhir' + str(i), - lembaga=None, - mahasiswa=this_mahasiswa, - jenis_praktikum=this_praktikum, - waktu_deadline=datetime.datetime( - random_year, - random_month, - random_day, - random_hour, - random_minute, - random_second - ), - waktu_submisi=datetime.datetime( - random_year, - random_month, - random_day + 1, - random_hour + 1, - random_minute + 1, - random_second + 1 - ), - status_publikasi=True, - status_submisi=True, - periode_praktikum="2019/2020", - laporan_akhir=SimpleUploadedFile("laporan_akhir_{}.pdf".format(str(i)), b"These are the file contents!"), - profil_lembaga=SimpleUploadedFile("profil_lembaga_{}.pdf".format(str(i)), b"These are the file contents!"), - umpan_balik=" " - ) - else: - LaporanAkhirPraktikum.objects.create( - nama_laporan='nama_laporan_akhir' + str(i), - lembaga=None, - mahasiswa=this_mahasiswa, - jenis_praktikum=this_praktikum, - waktu_deadline=datetime.datetime( - random_year, - random_month, - random_day, - random_hour, - random_minute, - random_second - ), - status_publikasi=random.randint(False, True), - status_submisi=False, - periode_praktikum=" ", - laporan_akhir=None, - profil_lembaga=None, - umpan_balik=" " - ) - print('seeding laporan akhir praktikum..... [SUCCESS]') - -def seed_laporan_borang_praktikum(laporan_praktikum_number): - mahasiswa = Mahasiswa.objects.all() - - for i in range(len(mahasiswa)): - this_mahasiswa = mahasiswa[i] - status_praktikum1 = True - status_praktikum2 = False - - praktikum1 = Praktikum.objects.get(jenis_praktikum='Praktikum 1') - praktikum2 = Praktikum.objects.get(jenis_praktikum='Praktikum 2') - - if i % 3 == 0: - status_praktikum2 = True - status_praktikum1 = False - - for i in range(0, 2): - if i: - this_praktikum = praktikum2 - else: - this_praktikum = praktikum1 - for i in range(laporan_praktikum_number): - random_year = 2020 - random_month = random.randint(1, 6) - random_day = random.randint(1, 27) - random_hour = random.randint(0, 22) - random_minute = random.randint(0, 58) - random_second = random.randint(0, 58) - is_submitted = random.choice([True, False]) - if is_submitted: - LaporanBorangPraktikum.objects.create( - nama_laporan='nama_laporan_borang' + str(i), - mahasiswa=this_mahasiswa, - jenis_praktikum=this_praktikum, - waktu_deadline=datetime.datetime( - random_year, - random_month, - random_day, - random_hour, - random_minute, - random_second - ), - waktu_submisi=datetime.datetime( - random_year, - random_month, - random_day + 1, - random_hour + 1, - random_minute + 1, - random_second + 1 - ), - status_publikasi=True, - status_submisi=True, - borang_supv_sekolah=SimpleUploadedFile("laporan_borang_supv_sekolah_{}.pdf".format(str(i)), b"These are the file contents!"), - borang_supv_lembaga=SimpleUploadedFile("laporan_borang_supv_lembaga_{}.pdf".format(str(i)), b"These are the file contents!"), - borang_supv_perkuliahan=SimpleUploadedFile("laporan_borang_supv_perkuliahan_{}.pdf".format(str(i)), b"These are the file contents!"), - ) - else: - LaporanBorangPraktikum.objects.create( - nama_laporan='nama_laporan_borang' + str(i), - mahasiswa=this_mahasiswa, - jenis_praktikum=this_praktikum, - waktu_deadline=datetime.datetime( - random_year, - random_month, - random_day, - random_hour, - random_minute, - random_second - ), - status_publikasi=random.randint(False, True), - status_submisi=False, - ) - print('seeding laporan borang praktikum..... [SUCCESS]') - -if __name__ == "__main__": - user_number_each_role = 2 - lembaga_number = 5 - laporan_praktikum_number = 3 - laporan_akhir_number = 1 - laporan_borang_number = 1 - - seed_institusi(lembaga_number) - seed_tema(lembaga_number) - seed_lembaga(lembaga_number) - seed_periode() - - seed_user(user_number_each_role) - seed_supervisor_lembaga() - seed_supervisor_sekolah() - seed_koordinator_kuliah() - seed_administrator() - seed_mahasiswa() - seed_superuser() - - seed_praktikum() - seed_kelola_laporan_praktikum(laporan_praktikum_number) - seed_laporan_akhir_praktikum(laporan_akhir_number) - seed_laporan_borang_praktikum(laporan_borang_number) diff --git a/new/seeder_staging.py b/new/seeder_staging.py deleted file mode 100644 index c958149..0000000 --- a/new/seeder_staging.py +++ /dev/null @@ -1,484 +0,0 @@ -from PIL import Image -from io import BytesIO -from django.core.files.uploadedfile import SimpleUploadedFile -from django.core.files import File -from authentication.role import Role -from laporan_praktikum.models import ( - Praktikum, - MahasiswaPraktikum, - KelolaLaporanPraktikum, - LaporanAkhirPraktikum, - LaporanBorangPraktikum -) -from lembaga.models import ( - Institusi, - Tema, - Lembaga, -) -from authentication.models import ( - User, - Mahasiswa, - SupervisorLembaga, - SupervisorSekolah, - KoordinatorKuliah, - Administrator, - Periode, - ORG_CODE, -) -import os -import django -import random -import string -import datetime -import base64 - - -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "sip.settings.staging") -django.setup() - - -def seed_user(user_number_each_role): - role_mhs = [(Role.MHS, Role.MHS.value)] * 4 - roles = [(tag, tag.value) for tag in Role] + role_mhs - roles = roles * user_number_each_role - for i in range(len(roles)): - user_data = 'user' + str(i) - User.objects.create_user( - username='username_' + user_data, - email='email_' + user_data + '@mail.com', - password='password_' + user_data, - full_name='full_name_' + user_data, - role=roles[i][1] - ) - print('seeding user..... [SUCCESS]') - - -def seed_institusi(institusi_number): - Institusi.objects.create(nama='Government Organisation') - Institusi.objects.create(nama='Non Government Organisation') - Institusi.objects.create(nama='Komunitas') - Institusi.objects.create(nama='Perusahaan') - Institusi.objects.create(nama='Pendidikan') - print('seeding institusi..... [SUCCESS]') - - -def seed_tema(tema_number): - Tema.objects.create(nama='Lingkungan') - Tema.objects.create(nama='HRD') - Tema.objects.create(nama='CSR ') - Tema.objects.create(nama='Anak dan Remaja') - Tema.objects.create(nama='Lansia') - Tema.objects.create(nama='Disabilitas') - Tema.objects.create(nama='Gender/Perempuan') - Tema.objects.create(nama='Pemberdayaan Masyarakat') - Tema.objects.create(nama='Penanganan Kemiskinan') - Tema.objects.create(nama='Kesehatan') - print('seeding tema..... [SUCCESS]') - - -def seed_lembaga(lembaga_number): - all_institusi = Institusi.objects.all() - all_tema = Tema.objects.all() - jenis_pelayanan_list = [ - 'Perusahaan', - 'Pemerintahan', - 'Organisasi', - ] - for i in range(lembaga_number): - lembaga = Lembaga.objects.create( - nama='nama_lembaga_' + str(i), - jenis_pelayanan=random.choice(jenis_pelayanan_list), - institusi=random.choice(all_institusi), - tema=random.choice(all_tema), - deskripsi_singkat='deskripsi_singkat_' + str(i), - praktikum_ke=1, - beneficaries="test_beneficaries_" + str(i), - alamat="test_alamat_" + str(i) - ) - lembaga.save() - print('seeding lembaga..... [SUCCESS]') - - -def seed_supervisor_lembaga(): - users = User.objects.filter(role=Role.SLB.value) - all_lembaga = Lembaga.objects.all() - jabatan_list = [ - 'direktur', - 'ketua', - 'hrd', - 'senior marketing', - 'associate marketing' - ] - for i in range(len(users)): - SupervisorLembaga.objects.create( - jabatan=random.choice(jabatan_list), - lembaga=random.choice(all_lembaga), - user=users[i] - ) - print('seeding supervisor lembaga..... [SUCCESS]') - - -def seed_supervisor_sekolah(): - users = User.objects.filter(role=Role.SSK.value) - for i in range(len(users)): - SupervisorSekolah.objects.create( - nip=random.randint(100000000000, 199999999999), - user=users[i] - ) - print('seeding supervisor sekolah..... [SUCCESS]') - - -def seed_koordinator_kuliah(): - users = User.objects.filter(role=Role.KKL.value) - for i in range(len(users)): - KoordinatorKuliah.objects.create( - nip=random.randint(100000000000, 199999999999), - user=users[i] - ) - print('seeding koordinator kuliah..... [SUCCESS]') - - -def seed_administrator(): - users = User.objects.filter(role=Role.ADM.value) - for i in range(len(users)): - Administrator.objects.create( - nip=random.randint(100000000000, 199999999999), - user=users[i] - ) - print('seeding administrator..... [SUCCESS]') - - -def seed_periode(): - periode_list = [ - '2018/2019 - Gasal', - '2018/2019 - Genap', - '2019/2020 - Gasal', - '2020/2021 - Genap', - '2020/2021 - Gasal' - ] - for i in range(len(periode_list)): - Periode.objects.create( - nama=periode_list[i] - ) - print('seeding periode..... [SUCCESS]') - - -def seed_mahasiswa(): - org_code_list = [ - '02.07.09.01', - '05.03.09.01', - '06.03.09.01', - '07.03.09.01', - '01.08.09.01', - '01.06.09.01', - '02.01.09.01', - '01.02.09.01', - '01.05.09.01', - '01.04.09.01', - '07.01.09.01' - ] - users = User.objects.filter(role=Role.MHS.value) - supervisor_lembaga = SupervisorLembaga.objects.all() - supervisor_sekolah = SupervisorSekolah.objects.all() - periode_list = Periode.objects.all() - - for i in range(len(users)): - org_code_random = random.choice(org_code_list) - Mahasiswa.objects.create( - org_code='org_code' + str(i), - faculty=ORG_CODE['id'][org_code_random]['faculty'], - major=ORG_CODE['id'][org_code_random]['faculty'], - program=ORG_CODE['id'][org_code_random]['faculty'], - npm=random.randint(1200000000, 1900000000), - periode=random.choice(periode_list), - user=users[i], - supervisor_lembaga=supervisor_lembaga[i % len(supervisor_lembaga)], - supervisor_sekolah=supervisor_sekolah[i % len(supervisor_sekolah)] - ) - print('seeding mahasiswa..... [SUCCESS]') - - -def seed_superuser(): - User.objects.create_superuser( - email='admin@ppl.com', - password='secret123' - ) - print('seeding super user..... [SUCCESS]') - - -def seed_praktikum(): - Praktikum.objects.create( - jenis_praktikum="Praktikum 1" - ) - Praktikum.objects.create( - jenis_praktikum="Praktikum 2" - ) - print('seeding praktikum..... [SUCCESS]') - - -def seed_kelola_laporan_praktikum(laporan_praktikum_number): - mahasiswa = Mahasiswa.objects.all() - - for i in range(len(mahasiswa)): - this_mahasiswa = mahasiswa[i] - status_praktikum1 = True - status_praktikum2 = False - - praktikum1 = Praktikum.objects.get(jenis_praktikum='Praktikum 1') - praktikum2 = Praktikum.objects.get(jenis_praktikum='Praktikum 2') - - if i % 3 == 0: - status_praktikum2 = True - status_praktikum1 = False - - MahasiswaPraktikum.objects.create( - mahasiswa=this_mahasiswa, - list_praktikum=praktikum1, - status=status_praktikum1 - ) - - MahasiswaPraktikum.objects.create( - mahasiswa=this_mahasiswa, - list_praktikum=praktikum2, - status=status_praktikum2 - ) - for i in range(0, 2): - if i: - this_praktikum = praktikum2 - else: - this_praktikum = praktikum1 - for i in range(laporan_praktikum_number): - random_year = 2020 - random_month = random.randint(1, 6) - random_day = random.randint(1, 27) - random_hour = random.randint(0, 22) - random_minute = random.randint(0, 58) - random_second = random.randint(0, 58) - is_submitted = random.choice([True, False]) - if is_submitted: - KelolaLaporanPraktikum.objects.create( - nama_laporan='nama_laporan_' + str(i), - mahasiswa=this_mahasiswa, - jenis_praktikum=this_praktikum, - waktu_deadline=datetime.datetime( - random_year, - random_month, - random_day, - random_hour, - random_minute, - random_second - ), - waktu_submisi=datetime.datetime( - random_year, - random_month, - random_day + 1, - random_hour + 1, - random_minute + 1, - random_second + 1 - ), - status_publikasi=True, - status_submisi=True, - skor_laporan_sekolah=random.randint(0, 100), - skor_laporan_lembaga=random.randint(0, 100), - link_submisi="https://link_submisi_" + str(i) + ".com" - ) - else: - KelolaLaporanPraktikum.objects.create( - nama_laporan='nama_laporan_' + str(i), - mahasiswa=this_mahasiswa, - jenis_praktikum=this_praktikum, - waktu_deadline=datetime.datetime( - random_year, - random_month, - random_day, - random_hour, - random_minute, - random_second - ), - status_publikasi=random.randint(False, True), - status_submisi=False, - skor_laporan_sekolah=-1, - skor_laporan_lembaga=-1 - ) - print('seeding kelola laporan praktikum..... [SUCCESS]') - - -def seed_laporan_akhir_praktikum(laporan_praktikum_number): - mahasiswa = Mahasiswa.objects.all() - - for i in range(len(mahasiswa)): - this_mahasiswa = mahasiswa[i] - status_praktikum1 = True - status_praktikum2 = False - - praktikum1 = Praktikum.objects.get(jenis_praktikum='Praktikum 1') - praktikum2 = Praktikum.objects.get(jenis_praktikum='Praktikum 2') - - if i % 3 == 0: - status_praktikum2 = True - status_praktikum1 = False - - for i in range(0, 2): - if i: - this_praktikum = praktikum2 - else: - this_praktikum = praktikum1 - for i in range(laporan_praktikum_number): - random_year = 2020 - random_month = random.randint(1, 6) - random_day = random.randint(1, 27) - random_hour = random.randint(0, 22) - random_minute = random.randint(0, 58) - random_second = random.randint(0, 58) - is_submitted = random.choice([True, False]) - if is_submitted: - LaporanAkhirPraktikum.objects.create( - nama_laporan='nama_laporan_akhir' + str(i), - lembaga=None, - mahasiswa=this_mahasiswa, - jenis_praktikum=this_praktikum, - waktu_deadline=datetime.datetime( - random_year, - random_month, - random_day, - random_hour, - random_minute, - random_second - ), - waktu_submisi=datetime.datetime( - random_year, - random_month, - random_day + 1, - random_hour + 1, - random_minute + 1, - random_second + 1 - ), - status_publikasi=True, - status_submisi=True, - periode_praktikum="2019/2020", - laporan_akhir=SimpleUploadedFile("laporan_akhir_{}.pdf".format(str(i)), b"These are the file contents!"), - profil_lembaga=SimpleUploadedFile("profil_lembaga_{}.pdf".format(str(i)), b"These are the file contents!"), - umpan_balik=" " - ) - else: - LaporanAkhirPraktikum.objects.create( - nama_laporan='nama_laporan_akhir' + str(i), - lembaga=None, - mahasiswa=this_mahasiswa, - jenis_praktikum=this_praktikum, - waktu_deadline=datetime.datetime( - random_year, - random_month, - random_day, - random_hour, - random_minute, - random_second - ), - status_publikasi=random.randint(False, True), - status_submisi=False, - periode_praktikum=" ", - laporan_akhir=None, - profil_lembaga=None, - umpan_balik=" " - ) - print('seeding laporan akhir praktikum..... [SUCCESS]') - - -def seed_laporan_borang_praktikum(laporan_praktikum_number): - mahasiswa = Mahasiswa.objects.all() - - for i in range(len(mahasiswa)): - this_mahasiswa = mahasiswa[i] - status_praktikum1 = True - status_praktikum2 = False - - praktikum1 = Praktikum.objects.get(jenis_praktikum='Praktikum 1') - praktikum2 = Praktikum.objects.get(jenis_praktikum='Praktikum 2') - - if i % 3 == 0: - status_praktikum2 = True - status_praktikum1 = False - - for i in range(0, 2): - if i: - this_praktikum = praktikum2 - else: - this_praktikum = praktikum1 - for i in range(laporan_praktikum_number): - random_year = 2020 - random_month = random.randint(1, 6) - random_day = random.randint(1, 27) - random_hour = random.randint(0, 22) - random_minute = random.randint(0, 58) - random_second = random.randint(0, 58) - is_submitted = random.choice([True, False]) - if is_submitted: - LaporanBorangPraktikum.objects.create( - nama_laporan='nama_laporan_borang' + str(i), - mahasiswa=this_mahasiswa, - jenis_praktikum=this_praktikum, - waktu_deadline=datetime.datetime( - random_year, - random_month, - random_day, - random_hour, - random_minute, - random_second - ), - waktu_submisi=datetime.datetime( - random_year, - random_month, - random_day + 1, - random_hour + 1, - random_minute + 1, - random_second + 1 - ), - status_publikasi=True, - status_submisi=True, - borang_supv_sekolah=SimpleUploadedFile("laporan_borang_supv_sekolah_{}.pdf".format(str(i)), b"These are the file contents!"), - borang_supv_lembaga=SimpleUploadedFile("laporan_borang_supv_lembaga_{}.pdf".format(str(i)), b"These are the file contents!"), - borang_supv_perkuliahan=SimpleUploadedFile("laporan_borang_supv_perkuliahan_{}.pdf".format(str(i)), b"These are the file contents!"), - ) - else: - LaporanBorangPraktikum.objects.create( - nama_laporan='nama_laporan_borang' + str(i), - mahasiswa=this_mahasiswa, - jenis_praktikum=this_praktikum, - waktu_deadline=datetime.datetime( - random_year, - random_month, - random_day, - random_hour, - random_minute, - random_second - ), - status_publikasi=random.randint(False, True), - status_submisi=False, - ) - print('seeding laporan borang praktikum..... [SUCCESS]') - - -if __name__ == "__main__": - user_number_each_role = 2 - lembaga_number = 5 - laporan_praktikum_number = 3 - laporan_akhir_number = 1 - laporan_borang_number = 1 - - seed_institusi(lembaga_number) - seed_tema(lembaga_number) - seed_lembaga(lembaga_number) - seed_periode() - - seed_user(user_number_each_role) - seed_supervisor_lembaga() - seed_supervisor_sekolah() - seed_koordinator_kuliah() - seed_administrator() - seed_mahasiswa() - seed_superuser() - - seed_praktikum() - seed_kelola_laporan_praktikum(laporan_praktikum_number) - seed_laporan_akhir_praktikum(laporan_akhir_number) - seed_laporan_borang_praktikum(laporan_borang_number) diff --git a/new/server-setup.sh b/new/server-setup.sh deleted file mode 100644 index 998222c..0000000 --- a/new/server-setup.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash - -if [[ $(whoami) != "root" ]]; then - echo "[-] Please run as root user..." - exit 1 -fi - -# Check health and state of Server OS -echo "[+] Update and upgrade server..." -apt-get update && apt upgrade -y - -echo "[+] Apt get install tools..." -apt-get install curl -apt-get install net-tools -apt-get install bind-tools -apt-get install postgresql -apt-get install nslookup -apt-get install tmux -apt-get install unzip -apt-get install hostname -apt-get install progress - -# Multiserver web interface -apt-get install cockpit - -# Set iptables config to false by default true for docker -echo "{ -\"iptables\": false -}" > /etc/docker/daemon.json - -# Restructured DEFAULT_FORWARD_POLICY from DROP to ACCEPT -echo "[+] Forward Policy Update for UFW..." -sed -i -e 's/DEFAULT_FORWARD_POLICY="DROP"/DEFAULT_FORWARD_POLICY="ACCEPT"/g' /etc/default/ufw -echo "[+] UFW Reloaded...." -ufw reload - -# Iptables configuration for docker to egress -echo "[+] Postrouting Update" -iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE diff --git a/new/setup.cfg b/new/setup.cfg deleted file mode 100644 index bfc2c6b..0000000 --- a/new/setup.cfg +++ /dev/null @@ -1,4 +0,0 @@ -[flake8] -ignore = E128,E502,E999,F401,F811 -exclude = .git,__pycache__,venv,*/tests/*,**/migrations/**,env,seeder_staging.py,seeder_dev.py -max-line-length = 160 \ No newline at end of file diff --git a/new/sip/__init__.py b/new/sip/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/new/sip/asgi.py b/new/sip/asgi.py deleted file mode 100644 index a851113..0000000 --- a/new/sip/asgi.py +++ /dev/null @@ -1,16 +0,0 @@ -""" -ASGI config for sip project. - -It exposes the ASGI callable as a module-level variable named ``application``. - -For more information on this file, see -https://docs.djangoproject.com/en/3.0/howto/deployment/asgi/ -""" - -import os - -from django.core.asgi import get_asgi_application - -os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'sip.settings') - -application = get_asgi_application() diff --git a/new/sip/settings/.env.example b/new/sip/settings/.env.example deleted file mode 100644 index 8fefc42..0000000 --- a/new/sip/settings/.env.example +++ /dev/null @@ -1,10 +0,0 @@ -DJANGO_SECRET_KEY -AWS_ACCESS_KEY_ID -AWS_SECRET_ACCESS_KEY -AWS_STORAGE_BUCKET_NAME -SQL_ENGINE -SQL_DATABASE -SQL_USER -SQL_PASSWORD -SQL_HOST -SQL_PORT \ No newline at end of file diff --git a/new/sip/settings/dev.py b/new/sip/settings/dev.py deleted file mode 100644 index 3b508b4..0000000 --- a/new/sip/settings/dev.py +++ /dev/null @@ -1,235 +0,0 @@ -""" -Django settings for sip project. - -Generated by 'django-admin startproject' using Django 3.0.3. - -For more information on this file, see -https://docs.djangoproject.com/en/3.0/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/3.0/ref/settings/ -""" - -import environ -import os -import dj_database_url -from datetime import timedelta -import mimetypes -mimetypes.add_type("text/css", ".css", True) - -# Environ Setup - -env = environ.Env() -environ.Env.read_env() # Reading .env file - -# Build paths inside the project like this: os.path.join(BASE_DIR, ...) -BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = env('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = True - -# HOST_URL = os.getenv('HOST_URL') - -ALLOWED_HOSTS = ['*'] - - -# Application definition - -INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'rest_framework', - 'drf_yasg', - 'lembaga', - 'laporan_praktikum', - 'django_cas_ng', - 'corsheaders', - 'authentication', -] - -MIDDLEWARE = [ - 'corsheaders.middleware.CorsMiddleware', - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', - 'corsheaders.middleware.CorsMiddleware', - 'django.middleware.common.CommonMiddleware', - 'whitenoise.middleware.WhiteNoiseMiddleware', -] - -ROOT_URLCONF = 'sip.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.debug', - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'sip.wsgi.application' - - -# Rest Framework configuration settings - -REST_FRAMEWORK = { - # Use Django's standard `django.contrib.auth` permissions, - # or allow read-only access for unauthenticated users. - 'DEFAULT_PERMISSION_CLASSES': [ - 'rest_framework.permissions.IsAuthenticated', - 'rest_framework.permissions.IsAdminUser', - ], - 'TEST_REQUEST_DEFAULT_FORMAT': 'json', - 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', - ), -} - -# Database -# https://docs.djangoproject.com/en/3.0/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), - } -} - -# Switch between sqlite (dev branch) and PostgreSQL (staging branch) -# Temporary, for staging only -if os.environ.get('DATABASE_URL') is not None: - DATABASES['default'] = dj_database_url.config(conn_max_age=600, ssl_require=True) - - -# Password validation -# https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/3.0/topics/i18n/ - -LANGUAGE_CODE = 'en-us' - -TIME_ZONE = 'Asia/Jakarta' - -USE_I18N = True - -USE_L10N = False - -USE_TZ = False - -DATETIME_INPUT_FORMATS = '%d-%m-%Y %H:%M', # '21-04-2020 12:30' - - -PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/3.0/howto/static-files/ - -STATIC_URL = '/static/' -STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static') -STATICFILES_DIRS = [ - 'static/', - os.path.join(BASE_DIR, "static"), -] -STATIFILES_STORAGE = 'whitenoise.storage.CompressManifestStaticFilesStrorage' - -MEDIA_URL = '/media/' -MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'media') - - -# Authentication backends -# https://docs.djangoproject.com/en/2.1/topics/auth/customizing/#specifying-authentication-backends - -AUTHENTICATION_BACKENDS = ( - 'django.contrib.auth.backends.ModelBackend', - 'django_cas_ng.backends.CASBackend', -) - - -# Django CAS-NG configuration - -CAS_SERVER_URL = os.getenv("CAS_SERVER_URL", 'https://sso.ui.ac.id/cas2/') -CAS_LOGIN_URL_NAME = 'authentication:login-sivitas' -CAS_FORCE_CHANGE_USERNAME_CASE = 'lower' - - -# SSO-UI configuration - -SSO_UI_ORG_DETAIL_FILE_PATH = "authentication/static/sso/kodoru.json" -SSO_UI_ORG_DETAIL_LANG = "id" - -JWT_AUTH = { - 'JWT_ENCODE_HANDLER': - 'rest_framework_jwt.utils.jwt_encode_handler', - 'JWT_DECODE_HANDLER': - 'rest_framework_jwt.utils.jwt_decode_handler', - 'JWT_PAYLOAD_HANDLER': - 'rest_framework_jwt.utils.jwt_payload_handler', - 'JWT_PAYLOAD_GET_USER_ID_HANDLER': - 'rest_framework_jwt.utils.jwt_get_user_id_from_payload_handler', - 'JWT_RESPONSE_PAYLOAD_HANDLER': - 'rest_framework_jwt.utils.jwt_response_payload_handler', - - 'JWT_SECRET_KEY': 'SECRET_KEY', - 'JWT_GET_USER_SECRET_KEY': None, - 'JWT_PUBLIC_KEY': None, - 'JWT_PRIVATE_KEY': None, - 'JWT_ALGORITHM': 'HS256', - 'JWT_VERIFY': True, - 'JWT_VERIFY_EXPIRATION': True, - 'JWT_LEEWAY': 0, - 'JWT_EXPIRATION_DELTA': timedelta(days=30), - 'JWT_AUDIENCE': None, - 'JWT_ISSUER': None, - 'JWT_ALLOW_REFRESH': False, - 'JWT_REFRESH_EXPIRATION_DELTA': timedelta(days=30), - 'JWT_AUTH_HEADER_PREFIX': 'Bearer', - 'JWT_AUTH_COOKIE': None, -} - -SUCCESS_SSO_AUTH_REDIRECT = "http://localhost:3000/" -# flake8: noqa - - -def CAS_CHECK_NEXT(_): return True - - -CORS_ORIGIN_ALLOW_ALL = True diff --git a/new/sip/settings/production.py b/new/sip/settings/production.py deleted file mode 100644 index 26f1917..0000000 --- a/new/sip/settings/production.py +++ /dev/null @@ -1,237 +0,0 @@ -""" -Django settings for sip project. - -Generated by 'django-admin startproject' using Django 3.0.3. - -For more information on this file, see -https://docs.djangoproject.com/en/3.0/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/3.0/ref/settings/ -""" - -import environ -import os -from datetime import timedelta - -# Environ Setup - -env = environ.Env() -environ.Env.read_env() # Reading .env file - -# Build paths inside the project like this: os.path.join(BASE_DIR, ...) -BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = env('DJANGO_SECRET_KEY') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = False - -HOST_URL = os.getenv('HOST_URL') - -ALLOWED_HOSTS = ['*'] - - -# Application definition - -INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'rest_framework', - 'drf_yasg', - 'lembaga', - 'laporan_praktikum', - 'django_cas_ng', - 'corsheaders', - 'authentication', - 'storages' -] - -MIDDLEWARE = [ - 'corsheaders.middleware.CorsMiddleware', - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'sip.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.debug', - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'sip.wsgi.application' - -# Rest Framework configuration settings -REST_FRAMEWORK = { - # Use Django's standard `django.contrib.auth` permissions, - # or allow read-only access for unauthenticated users. - 'DEFAULT_PERMISSION_CLASSES': [ - 'rest_framework.permissions.IsAuthenticated', - 'rest_framework.permissions.IsAdminUser', - ], - 'TEST_REQUEST_DEFAULT_FORMAT': 'json', - 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', - ), -} - - -# Database -# https://docs.djangoproject.com/en/3.0/ref/settings/#databases - -DATABASES = { - "default": { - "ENGINE": env("SQL_ENGINE"), - "NAME": env("SQL_DATABASE"), - "USER": env("SQL_USER"), - "PASSWORD": env("SQL_PASSWORD"), - "HOST": env("SQL_HOST"), - "PORT": env("SQL_PORT"), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/3.0/topics/i18n/ - -LANGUAGE_CODE = 'en-us' - -TIME_ZONE = 'Asia/Jakarta' - -USE_I18N = True - -USE_L10N = True - -USE_TZ = True - - -PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/3.0/howto/static-files/ - -AWS_ACCESS_KEY_ID = env('AWS_ACCESS_KEY_ID') -AWS_SECRET_ACCESS_KEY = env('AWS_SECRET_ACCESS_KEY') -AWS_STORAGE_BUCKET_NAME = env('AWS_STORAGE_BUCKET_NAME') -AWS_S3_OBJECT_PARAMETERS = { - 'CacheControl': 'max-age=86400', -} -AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % env('AWS_STORAGE_BUCKET_NAME') -AWS_LOCATION = 'static' - -STATIC_URL = 'https://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION) -STATICFILES_DIRS = [ - os.path.join(BASE_DIR, "static"), -] -STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage' - -# Ini buat media aws -DEFAULT_FILE_STORAGE = 'sip.settings.storage_backends.MediaStorage' - - -# Authentication backends -# https://docs.djangoproject.com/en/2.1/topics/auth/customizing/#specifying-authentication-backends - -AUTHENTICATION_BACKENDS = ( - 'django.contrib.auth.backends.ModelBackend', - 'django_cas_ng.backends.CASBackend', -) - - -# Django CAS-NG configuration - -CAS_SERVER_URL = os.getenv("CAS_SERVER_URL", 'https://sso.ui.ac.id/cas2/') -CAS_LOGIN_URL_NAME = 'authentication:login-sivitas' -CAS_FORCE_CHANGE_USERNAME_CASE = 'lower' - - -# SSO-UI configuration - -SSO_UI_ORG_DETAIL_FILE_PATH = "authentication/static/sso/kodoru.json" -SSO_UI_ORG_DETAIL_LANG = "id" - -JWT_AUTH = { - 'JWT_ENCODE_HANDLER': - 'rest_framework_jwt.utils.jwt_encode_handler', - 'JWT_DECODE_HANDLER': - 'rest_framework_jwt.utils.jwt_decode_handler', - 'JWT_PAYLOAD_HANDLER': - 'rest_framework_jwt.utils.jwt_payload_handler', - 'JWT_PAYLOAD_GET_USER_ID_HANDLER': - 'rest_framework_jwt.utils.jwt_get_user_id_from_payload_handler', - 'JWT_RESPONSE_PAYLOAD_HANDLER': - 'rest_framework_jwt.utils.jwt_response_payload_handler', - - 'JWT_SECRET_KEY': 'SECRET_KEY', - 'JWT_GET_USER_SECRET_KEY': None, - 'JWT_PUBLIC_KEY': None, - 'JWT_PRIVATE_KEY': None, - 'JWT_ALGORITHM': 'HS256', - 'JWT_VERIFY': True, - 'JWT_VERIFY_EXPIRATION': True, - 'JWT_LEEWAY': 0, - 'JWT_EXPIRATION_DELTA': timedelta(days=30), - 'JWT_AUDIENCE': None, - 'JWT_ISSUER': None, - 'JWT_ALLOW_REFRESH': False, - 'JWT_REFRESH_EXPIRATION_DELTA': timedelta(days=30), - 'JWT_AUTH_HEADER_PREFIX': 'Bearer', - 'JWT_AUTH_COOKIE': None, -} - -SUCCESS_SSO_AUTH_REDIRECT = "http://ppl-berkah.herokuapp.com/" - -CORS_ORIGIN_WHITELIST = [ - "http://ppl-berkah.herokuapp.com/", - "http://localhost:8000", - "http://127.0.0.1:8000", -] - -# flake8: noqa - - -def CAS_CHECK_NEXT(_): return True diff --git a/new/sip/settings/staging.py b/new/sip/settings/staging.py deleted file mode 100644 index 6878fd5..0000000 --- a/new/sip/settings/staging.py +++ /dev/null @@ -1,250 +0,0 @@ -""" -Django settings for sip project. - -Generated by 'django-admin startproject' using Django 3.0.3. - -For more information on this file, see -https://docs.djangoproject.com/en/3.0/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/3.0/ref/settings/ -""" - -import environ -import os -# import sys -import dj_database_url -from datetime import timedelta -import mimetypes -mimetypes.add_type("text/css", ".css", True) - -#env = environ.Env() -#environ.Env.read_env() # Reading .env file - -# Build paths inside the project like this: os.path.join(BASE_DIR, ...) -BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('DJANGO_SECRET_KEY', "s3cr3t_k3y_c4nn0t_h4ck3d_by_l33t_1337") - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = False - -# HOST_URL = os.getenv('HOST_URL') - -ALLOWED_HOSTS = ['*'] - - -# Application definition - -INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'rest_framework', - 'drf_yasg', - 'lembaga', - 'laporan_praktikum', - 'django_cas_ng', - 'corsheaders', - 'authentication', - 'storages' -] - -MIDDLEWARE = [ - 'corsheaders.middleware.CorsMiddleware', - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', - 'django.middleware.common.CommonMiddleware', - 'whitenoise.middleware.WhiteNoiseMiddleware', -] - -ROOT_URLCONF = 'sip.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.debug', - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'sip.wsgi.application' - -# Rest Framework configuration settings -REST_FRAMEWORK = { - # Use Django's standard `django.contrib.auth` permissions, - # or allow read-only access for unauthenticated users. - 'DEFAULT_PERMISSION_CLASSES': [ - 'rest_framework.permissions.IsAuthenticated', - 'rest_framework.permissions.IsAdminUser', - ], - 'TEST_REQUEST_DEFAULT_FORMAT': 'json', - 'DEFAULT_AUTHENTICATION_CLASSES': ( - 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', - ), -} - - -# Database -# https://docs.djangoproject.com/en/3.0/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), - } -} - -# Switch between sqlite for Gitlab Runner and PostgreSQL for Heroku -if os.environ.get('DATABASE_URL') is not None: - DATABASES['default'] = dj_database_url.config(conn_max_age=600, ssl_require=True) - - -# if os.environ.get('https_proxy') == 'http://proxy.cs.ui.ac.id:8080/' -# DOMAIN='https://ppl2020a1.cs.ui.ac.id' - -# else: -# DOMAIN='http://sipraktikum-backend.herokuapp.com' - - -# Password validation -# https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/3.0/topics/i18n/ - -LANGUAGE_CODE = 'en-us' - -TIME_ZONE = 'Asia/Jakarta' - -USE_I18N = True - -USE_L10N = False - -USE_TZ = False - -DATETIME_INPUT_FORMATS = '%d-%m-%Y %H:%M' - -PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/3.0/howto/static-files/ - -AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID') -AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY') -AWS_STORAGE_BUCKET_NAME = os.environ.get('AWS_STORAGE_BUCKET_NAME') -AWS_S3_OBJECT_PARAMETERS = { - 'CacheControl': 'max-age=86400', -} -AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME -AWS_LOCATION = 'static' - -STATIC_URL = '/static/' -STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') -STATICFILES_DIRS = [ - 'static/', - os.path.join(BASE_DIR, "static"), -] -STATIFILES_STORAGE = 'whitenoise.storage.CompressManifestStaticFilesStrorage' - -DEFAULT_FILE_STORAGE = 'sip.settings.storage_backends.MediaStorage' - -# Authentication backends -# https://docs.djangoproject.com/en/2.1/topics/auth/customizing/#specifying-authentication-backends - -AUTHENTICATION_BACKENDS = ( - 'django.contrib.auth.backends.ModelBackend', - 'django_cas_ng.backends.CASBackend', -) - - -# Django CAS-NG configuration - -CAS_SERVER_URL = os.getenv("CAS_SERVER_URL", 'https://sso.ui.ac.id/cas2/') -CAS_LOGIN_URL_NAME = 'authentication:login-sivitas' -CAS_FORCE_CHANGE_USERNAME_CASE = 'lower' - - -# SSO-UI configuration - -SSO_UI_ORG_DETAIL_FILE_PATH = "authentication/static/sso/kodoru.json" -SSO_UI_ORG_DETAIL_LANG = "id" - -JWT_AUTH = { - 'JWT_ENCODE_HANDLER': - 'rest_framework_jwt.utils.jwt_encode_handler', - 'JWT_DECODE_HANDLER': - 'rest_framework_jwt.utils.jwt_decode_handler', - 'JWT_PAYLOAD_HANDLER': - 'rest_framework_jwt.utils.jwt_payload_handler', - 'JWT_PAYLOAD_GET_USER_ID_HANDLER': - 'rest_framework_jwt.utils.jwt_get_user_id_from_payload_handler', - 'JWT_RESPONSE_PAYLOAD_HANDLER': - 'rest_framework_jwt.utils.jwt_response_payload_handler', - - 'JWT_SECRET_KEY': 'SECRET_KEY', - 'JWT_GET_USER_SECRET_KEY': None, - 'JWT_PUBLIC_KEY': None, - 'JWT_PRIVATE_KEY': None, - 'JWT_ALGORITHM': 'HS256', - 'JWT_VERIFY': True, - 'JWT_VERIFY_EXPIRATION': True, - 'JWT_LEEWAY': 0, - 'JWT_EXPIRATION_DELTA': timedelta(days=30), - 'JWT_AUDIENCE': None, - 'JWT_ISSUER': None, - 'JWT_ALLOW_REFRESH': False, - 'JWT_REFRESH_EXPIRATION_DELTA': timedelta(days=30), - 'JWT_AUTH_HEADER_PREFIX': 'Bearer', - 'JWT_AUTH_COOKIE': None, -} - -SUCCESS_SSO_AUTH_REDIRECT = "http://ppl-berkah.herokuapp.com/" - -CORS_ORIGIN_ALLOW_ALL = True -# CORS_ORIGIN_WHITELIST = [ -# "http://ppl-mkppl-inos.herokuapp.com", -# "http://localhost:8000", -# "http://127.0.0.1:8000", -# ] - -# flake8: noqa - - -def CAS_CHECK_NEXT(_): return True diff --git a/new/sip/settings/static/admin/css/autocomplete.css b/new/sip/settings/static/admin/css/autocomplete.css deleted file mode 100644 index 3ef95d1..0000000 --- a/new/sip/settings/static/admin/css/autocomplete.css +++ /dev/null @@ -1,260 +0,0 @@ -select.admin-autocomplete { - width: 20em; -} - -.select2-container--admin-autocomplete.select2-container { - min-height: 30px; -} - -.select2-container--admin-autocomplete .select2-selection--single, -.select2-container--admin-autocomplete .select2-selection--multiple { - min-height: 30px; - padding: 0; -} - -.select2-container--admin-autocomplete.select2-container--focus .select2-selection, -.select2-container--admin-autocomplete.select2-container--open .select2-selection { - border-color: #999; - min-height: 30px; -} - -.select2-container--admin-autocomplete.select2-container--focus .select2-selection.select2-selection--single, -.select2-container--admin-autocomplete.select2-container--open .select2-selection.select2-selection--single { - padding: 0; -} - -.select2-container--admin-autocomplete.select2-container--focus .select2-selection.select2-selection--multiple, -.select2-container--admin-autocomplete.select2-container--open .select2-selection.select2-selection--multiple { - padding: 0; -} - -.select2-container--admin-autocomplete .select2-selection--single { - background-color: #fff; - border: 1px solid #ccc; - border-radius: 4px; -} - -.select2-container--admin-autocomplete .select2-selection--single .select2-selection__rendered { - color: #444; - line-height: 30px; -} - -.select2-container--admin-autocomplete .select2-selection--single .select2-selection__clear { - cursor: pointer; - float: right; - font-weight: bold; -} - -.select2-container--admin-autocomplete .select2-selection--single .select2-selection__placeholder { - color: #999; -} - -.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow { - height: 26px; - position: absolute; - top: 1px; - right: 1px; - width: 20px; -} - -.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow b { - border-color: #888 transparent transparent transparent; - border-style: solid; - border-width: 5px 4px 0 4px; - height: 0; - left: 50%; - margin-left: -4px; - margin-top: -2px; - position: absolute; - top: 50%; - width: 0; -} - -.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--single .select2-selection__clear { - float: left; -} - -.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--single .select2-selection__arrow { - left: 1px; - right: auto; -} - -.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single { - background-color: #eee; - cursor: default; -} - -.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single .select2-selection__clear { - display: none; -} - -.select2-container--admin-autocomplete.select2-container--open .select2-selection--single .select2-selection__arrow b { - border-color: transparent transparent #888 transparent; - border-width: 0 4px 5px 4px; -} - -.select2-container--admin-autocomplete .select2-selection--multiple { - background-color: white; - border: 1px solid #ccc; - border-radius: 4px; - cursor: text; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered { - box-sizing: border-box; - list-style: none; - margin: 0; - padding: 0 5px; - width: 100%; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered li { - list-style: none; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__placeholder { - color: #999; - margin-top: 5px; - float: left; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__clear { - cursor: pointer; - float: right; - font-weight: bold; - margin: 5px; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice { - background-color: #e4e4e4; - border: 1px solid #ccc; - border-radius: 4px; - cursor: default; - float: left; - margin-right: 5px; - margin-top: 5px; - padding: 0 5px; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove { - color: #999; - cursor: pointer; - display: inline-block; - font-weight: bold; - margin-right: 2px; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove:hover { - color: #333; -} - -.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-search--inline { - float: right; -} - -.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice { - margin-left: 5px; - margin-right: auto; -} - -.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { - margin-left: 2px; - margin-right: auto; -} - -.select2-container--admin-autocomplete.select2-container--focus .select2-selection--multiple { - border: solid #999 1px; - outline: 0; -} - -.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--multiple { - background-color: #eee; - cursor: default; -} - -.select2-container--admin-autocomplete.select2-container--disabled .select2-selection__choice__remove { - display: none; -} - -.select2-container--admin-autocomplete.select2-container--open.select2-container--above .select2-selection--single, .select2-container--admin-autocomplete.select2-container--open.select2-container--above .select2-selection--multiple { - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.select2-container--admin-autocomplete.select2-container--open.select2-container--below .select2-selection--single, .select2-container--admin-autocomplete.select2-container--open.select2-container--below .select2-selection--multiple { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; -} - -.select2-container--admin-autocomplete .select2-search--dropdown .select2-search__field { - border: 1px solid #ccc; -} - -.select2-container--admin-autocomplete .select2-search--inline .select2-search__field { - background: transparent; - border: none; - outline: 0; - box-shadow: none; - -webkit-appearance: textfield; -} - -.select2-container--admin-autocomplete .select2-results > .select2-results__options { - max-height: 200px; - overflow-y: auto; -} - -.select2-container--admin-autocomplete .select2-results__option[role=group] { - padding: 0; -} - -.select2-container--admin-autocomplete .select2-results__option[aria-disabled=true] { - color: #999; -} - -.select2-container--admin-autocomplete .select2-results__option[aria-selected=true] { - background-color: #ddd; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option { - padding-left: 1em; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__group { - padding-left: 0; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option { - margin-left: -1em; - padding-left: 2em; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -2em; - padding-left: 3em; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -3em; - padding-left: 4em; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -4em; - padding-left: 5em; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -5em; - padding-left: 6em; -} - -.select2-container--admin-autocomplete .select2-results__option--highlighted[aria-selected] { - background-color: #79aec8; - color: white; -} - -.select2-container--admin-autocomplete .select2-results__group { - cursor: default; - display: block; - padding: 6px; -} diff --git a/new/sip/settings/static/admin/css/base.css b/new/sip/settings/static/admin/css/base.css deleted file mode 100644 index c428519..0000000 --- a/new/sip/settings/static/admin/css/base.css +++ /dev/null @@ -1,966 +0,0 @@ -/* - DJANGO Admin styles -*/ - -@import url(fonts.css); - -html, body { - height: 100%; -} - -body { - margin: 0; - padding: 0; - font-size: 14px; - font-family: "Roboto","Lucida Grande","DejaVu Sans","Bitstream Vera Sans",Verdana,Arial,sans-serif; - color: #333; - background: #fff; -} - -/* LINKS */ - -a:link, a:visited { - color: #447e9b; - text-decoration: none; -} - -a:focus, a:hover { - color: #036; -} - -a:focus { - text-decoration: underline; -} - -a img { - border: none; -} - -a.section:link, a.section:visited { - color: #fff; - text-decoration: none; -} - -a.section:focus, a.section:hover { - text-decoration: underline; -} - -/* GLOBAL DEFAULTS */ - -p, ol, ul, dl { - margin: .2em 0 .8em 0; -} - -p { - padding: 0; - line-height: 140%; -} - -h1,h2,h3,h4,h5 { - font-weight: bold; -} - -h1 { - margin: 0 0 20px; - font-weight: 300; - font-size: 20px; - color: #666; -} - -h2 { - font-size: 16px; - margin: 1em 0 .5em 0; -} - -h2.subhead { - font-weight: normal; - margin-top: 0; -} - -h3 { - font-size: 14px; - margin: .8em 0 .3em 0; - color: #666; - font-weight: bold; -} - -h4 { - font-size: 12px; - margin: 1em 0 .8em 0; - padding-bottom: 3px; -} - -h5 { - font-size: 10px; - margin: 1.5em 0 .5em 0; - color: #666; - text-transform: uppercase; - letter-spacing: 1px; -} - -ul > li { - list-style-type: square; - padding: 1px 0; -} - -li ul { - margin-bottom: 0; -} - -li, dt, dd { - font-size: 13px; - line-height: 20px; -} - -dt { - font-weight: bold; - margin-top: 4px; -} - -dd { - margin-left: 0; -} - -form { - margin: 0; - padding: 0; -} - -fieldset { - margin: 0; - min-width: 0; - padding: 0; - border: none; - border-top: 1px solid #eee; -} - -blockquote { - font-size: 11px; - color: #777; - margin-left: 2px; - padding-left: 10px; - border-left: 5px solid #ddd; -} - -code, pre { - font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace; - color: #666; - font-size: 12px; - overflow-x: auto; -} - -pre.literal-block { - margin: 10px; - background: #eee; - padding: 6px 8px; -} - -code strong { - color: #930; -} - -hr { - clear: both; - color: #eee; - background-color: #eee; - height: 1px; - border: none; - margin: 0; - padding: 0; - font-size: 1px; - line-height: 1px; -} - -/* TEXT STYLES & MODIFIERS */ - -.small { - font-size: 11px; -} - -.mini { - font-size: 10px; -} - -.help, p.help, form p.help, div.help, form div.help, div.help li { - font-size: 11px; - color: #999; -} - -div.help ul { - margin-bottom: 0; -} - -.help-tooltip { - cursor: help; -} - -p img, h1 img, h2 img, h3 img, h4 img, td img { - vertical-align: middle; -} - -.quiet, a.quiet:link, a.quiet:visited { - color: #999; - font-weight: normal; -} - -.clear { - clear: both; -} - -.nowrap { - white-space: nowrap; -} - -/* TABLES */ - -table { - border-collapse: collapse; - border-color: #ccc; -} - -td, th { - font-size: 13px; - line-height: 16px; - border-bottom: 1px solid #eee; - vertical-align: top; - padding: 8px; - font-family: "Roboto", "Lucida Grande", Verdana, Arial, sans-serif; -} - -th { - font-weight: 600; - text-align: left; -} - -thead th, -tfoot td { - color: #666; - padding: 5px 10px; - font-size: 11px; - background: #fff; - border: none; - border-top: 1px solid #eee; - border-bottom: 1px solid #eee; -} - -tfoot td { - border-bottom: none; - border-top: 1px solid #eee; -} - -thead th.required { - color: #000; -} - -tr.alt { - background: #f6f6f6; -} - -tr:nth-child(odd), .row-form-errors { - background: #fff; -} - -tr:nth-child(even), -tr:nth-child(even) .errorlist, -tr:nth-child(odd) + .row-form-errors, -tr:nth-child(odd) + .row-form-errors .errorlist { - background: #f9f9f9; -} - -/* SORTABLE TABLES */ - -thead th { - padding: 5px 10px; - line-height: normal; - text-transform: uppercase; - background: #f6f6f6; -} - -thead th a:link, thead th a:visited { - color: #666; -} - -thead th.sorted { - background: #eee; -} - -thead th.sorted .text { - padding-right: 42px; -} - -table thead th .text span { - padding: 8px 10px; - display: block; -} - -table thead th .text a { - display: block; - cursor: pointer; - padding: 8px 10px; -} - -table thead th .text a:focus, table thead th .text a:hover { - background: #eee; -} - -thead th.sorted a.sortremove { - visibility: hidden; -} - -table thead th.sorted:hover a.sortremove { - visibility: visible; -} - -table thead th.sorted .sortoptions { - display: block; - padding: 9px 5px 0 5px; - float: right; - text-align: right; -} - -table thead th.sorted .sortpriority { - font-size: .8em; - min-width: 12px; - text-align: center; - vertical-align: 3px; - margin-left: 2px; - margin-right: 2px; -} - -table thead th.sorted .sortoptions a { - position: relative; - width: 14px; - height: 14px; - display: inline-block; - background: url(../img/sorting-icons.svg) 0 0 no-repeat; - background-size: 14px auto; -} - -table thead th.sorted .sortoptions a.sortremove { - background-position: 0 0; -} - -table thead th.sorted .sortoptions a.sortremove:after { - content: '\\'; - position: absolute; - top: -6px; - left: 3px; - font-weight: 200; - font-size: 18px; - color: #999; -} - -table thead th.sorted .sortoptions a.sortremove:focus:after, -table thead th.sorted .sortoptions a.sortremove:hover:after { - color: #447e9b; -} - -table thead th.sorted .sortoptions a.sortremove:focus, -table thead th.sorted .sortoptions a.sortremove:hover { - background-position: 0 -14px; -} - -table thead th.sorted .sortoptions a.ascending { - background-position: 0 -28px; -} - -table thead th.sorted .sortoptions a.ascending:focus, -table thead th.sorted .sortoptions a.ascending:hover { - background-position: 0 -42px; -} - -table thead th.sorted .sortoptions a.descending { - top: 1px; - background-position: 0 -56px; -} - -table thead th.sorted .sortoptions a.descending:focus, -table thead th.sorted .sortoptions a.descending:hover { - background-position: 0 -70px; -} - -/* FORM DEFAULTS */ - -input, textarea, select, .form-row p, form .button { - margin: 2px 0; - padding: 2px 3px; - vertical-align: middle; - font-family: "Roboto", "Lucida Grande", Verdana, Arial, sans-serif; - font-weight: normal; - font-size: 13px; -} -.form-row div.help { - padding: 2px 3px; -} - -textarea { - vertical-align: top; -} - -input[type=text], input[type=password], input[type=email], input[type=url], -input[type=number], input[type=tel], textarea, select, .vTextField { - border: 1px solid #ccc; - border-radius: 4px; - padding: 5px 6px; - margin-top: 0; -} - -input[type=text]:focus, input[type=password]:focus, input[type=email]:focus, -input[type=url]:focus, input[type=number]:focus, input[type=tel]:focus, -textarea:focus, select:focus, .vTextField:focus { - border-color: #999; -} - -select { - height: 30px; -} - -select[multiple] { - /* Allow HTML size attribute to override the height in the rule above. */ - height: auto; - min-height: 150px; -} - -/* FORM BUTTONS */ - -.button, input[type=submit], input[type=button], .submit-row input, a.button { - background: #79aec8; - padding: 10px 15px; - border: none; - border-radius: 4px; - color: #fff; - cursor: pointer; -} - -a.button { - padding: 4px 5px; -} - -.button:active, input[type=submit]:active, input[type=button]:active, -.button:focus, input[type=submit]:focus, input[type=button]:focus, -.button:hover, input[type=submit]:hover, input[type=button]:hover { - background: #609ab6; -} - -.button[disabled], input[type=submit][disabled], input[type=button][disabled] { - opacity: 0.4; -} - -.button.default, input[type=submit].default, .submit-row input.default { - float: right; - border: none; - font-weight: 400; - background: #417690; -} - -.button.default:active, input[type=submit].default:active, -.button.default:focus, input[type=submit].default:focus, -.button.default:hover, input[type=submit].default:hover { - background: #205067; -} - -.button[disabled].default, -input[type=submit][disabled].default, -input[type=button][disabled].default { - opacity: 0.4; -} - - -/* MODULES */ - -.module { - border: none; - margin-bottom: 30px; - background: #fff; -} - -.module p, .module ul, .module h3, .module h4, .module dl, .module pre { - padding-left: 10px; - padding-right: 10px; -} - -.module blockquote { - margin-left: 12px; -} - -.module ul, .module ol { - margin-left: 1.5em; -} - -.module h3 { - margin-top: .6em; -} - -.module h2, .module caption, .inline-group h2 { - margin: 0; - padding: 8px; - font-weight: 400; - font-size: 13px; - text-align: left; - background: #79aec8; - color: #fff; -} - -.module caption, -.inline-group h2 { - font-size: 12px; - letter-spacing: 0.5px; - text-transform: uppercase; -} - -.module table { - border-collapse: collapse; -} - -/* MESSAGES & ERRORS */ - -ul.messagelist { - padding: 0; - margin: 0; -} - -ul.messagelist li { - display: block; - font-weight: 400; - font-size: 13px; - padding: 10px 10px 10px 65px; - margin: 0 0 10px 0; - background: #dfd url(../img/icon-yes.svg) 40px 12px no-repeat; - background-size: 16px auto; - color: #333; -} - -ul.messagelist li.warning { - background: #ffc url(../img/icon-alert.svg) 40px 14px no-repeat; - background-size: 14px auto; -} - -ul.messagelist li.error { - background: #ffefef url(../img/icon-no.svg) 40px 12px no-repeat; - background-size: 16px auto; -} - -.errornote { - font-size: 14px; - font-weight: 700; - display: block; - padding: 10px 12px; - margin: 0 0 10px 0; - color: #ba2121; - border: 1px solid #ba2121; - border-radius: 4px; - background-color: #fff; - background-position: 5px 12px; -} - -ul.errorlist { - margin: 0 0 4px; - padding: 0; - color: #ba2121; - background: #fff; -} - -ul.errorlist li { - font-size: 13px; - display: block; - margin-bottom: 4px; -} - -ul.errorlist li:first-child { - margin-top: 0; -} - -ul.errorlist li a { - color: inherit; - text-decoration: underline; -} - -td ul.errorlist { - margin: 0; - padding: 0; -} - -td ul.errorlist li { - margin: 0; -} - -.form-row.errors { - margin: 0; - border: none; - border-bottom: 1px solid #eee; - background: none; -} - -.form-row.errors ul.errorlist li { - padding-left: 0; -} - -.errors input, .errors select, .errors textarea, -td ul.errorlist + input, td ul.errorlist + select, td ul.errorlist + textarea { - border: 1px solid #ba2121; -} - -.description { - font-size: 12px; - padding: 5px 0 0 12px; -} - -/* BREADCRUMBS */ - -div.breadcrumbs { - background: #79aec8; - padding: 10px 40px; - border: none; - font-size: 14px; - color: #c4dce8; - text-align: left; -} - -div.breadcrumbs a { - color: #fff; -} - -div.breadcrumbs a:focus, div.breadcrumbs a:hover { - color: #c4dce8; -} - -/* ACTION ICONS */ - -.viewlink, .inlineviewlink { - padding-left: 16px; - background: url(../img/icon-viewlink.svg) 0 1px no-repeat; -} - -.addlink { - padding-left: 16px; - background: url(../img/icon-addlink.svg) 0 1px no-repeat; -} - -.changelink, .inlinechangelink { - padding-left: 16px; - background: url(../img/icon-changelink.svg) 0 1px no-repeat; -} - -.deletelink { - padding-left: 16px; - background: url(../img/icon-deletelink.svg) 0 1px no-repeat; -} - -a.deletelink:link, a.deletelink:visited { - color: #CC3434; -} - -a.deletelink:focus, a.deletelink:hover { - color: #993333; - text-decoration: none; -} - -/* OBJECT TOOLS */ - -.object-tools { - font-size: 10px; - font-weight: bold; - padding-left: 0; - float: right; - position: relative; - margin-top: -48px; -} - -.form-row .object-tools { - margin-top: 5px; - margin-bottom: 5px; - float: none; - height: 2em; - padding-left: 3.5em; -} - -.object-tools li { - display: block; - float: left; - margin-left: 5px; - height: 16px; -} - -.object-tools a { - border-radius: 15px; -} - -.object-tools a:link, .object-tools a:visited { - display: block; - float: left; - padding: 3px 12px; - background: #999; - font-weight: 400; - font-size: 11px; - text-transform: uppercase; - letter-spacing: 0.5px; - color: #fff; -} - -.object-tools a:focus, .object-tools a:hover { - background-color: #417690; -} - -.object-tools a:focus{ - text-decoration: none; -} - -.object-tools a.viewsitelink, .object-tools a.golink,.object-tools a.addlink { - background-repeat: no-repeat; - background-position: right 7px center; - padding-right: 26px; -} - -.object-tools a.viewsitelink, .object-tools a.golink { - background-image: url(../img/tooltag-arrowright.svg); -} - -.object-tools a.addlink { - background-image: url(../img/tooltag-add.svg); -} - -/* OBJECT HISTORY */ - -table#change-history { - width: 100%; -} - -table#change-history tbody th { - width: 16em; -} - -/* PAGE STRUCTURE */ - -#container { - position: relative; - width: 100%; - min-width: 980px; - padding: 0; - display: flex; - flex-direction: column; - height: 100%; -} - -#container > div { - flex-shrink: 0; -} - -#container > .main { - display: flex; - flex: 1 0 auto; -} - -.main > .content { - flex: 1 0; - max-width: 100%; -} - -#content { - padding: 20px 40px; -} - -.dashboard #content { - width: 600px; -} - -#content-main { - float: left; - width: 100%; -} - -#content-related { - float: right; - width: 260px; - position: relative; - margin-right: -300px; -} - -#footer { - clear: both; - padding: 10px; -} - -/* COLUMN TYPES */ - -.colMS { - margin-right: 300px; -} - -.colSM { - margin-left: 300px; -} - -.colSM #content-related { - float: left; - margin-right: 0; - margin-left: -300px; -} - -.colSM #content-main { - float: right; -} - -.popup .colM { - width: auto; -} - -/* HEADER */ - -#header { - width: auto; - height: auto; - display: flex; - justify-content: space-between; - align-items: center; - padding: 10px 40px; - background: #417690; - color: #ffc; - overflow: hidden; -} - -#header a:link, #header a:visited { - color: #fff; -} - -#header a:focus , #header a:hover { - text-decoration: underline; -} - -#branding { - float: left; -} - -#branding h1 { - padding: 0; - margin: 0 20px 0 0; - font-weight: 300; - font-size: 24px; - color: #f5dd5d; -} - -#branding h1, #branding h1 a:link, #branding h1 a:visited { - color: #f5dd5d; -} - -#branding h2 { - padding: 0 10px; - font-size: 14px; - margin: -8px 0 8px 0; - font-weight: normal; - color: #ffc; -} - -#branding a:hover { - text-decoration: none; -} - -#user-tools { - float: right; - padding: 0; - margin: 0 0 0 20px; - font-weight: 300; - font-size: 11px; - letter-spacing: 0.5px; - text-transform: uppercase; - text-align: right; -} - -#user-tools a { - border-bottom: 1px solid rgba(255, 255, 255, 0.25); -} - -#user-tools a:focus, #user-tools a:hover { - text-decoration: none; - border-bottom-color: #79aec8; - color: #79aec8; -} - -/* SIDEBAR */ - -#content-related { - background: #f8f8f8; -} - -#content-related .module { - background: none; -} - -#content-related h3 { - font-size: 14px; - color: #666; - padding: 0 16px; - margin: 0 0 16px; -} - -#content-related h4 { - font-size: 13px; -} - -#content-related p { - padding-left: 16px; - padding-right: 16px; -} - -#content-related .actionlist { - padding: 0; - margin: 16px; -} - -#content-related .actionlist li { - line-height: 1.2; - margin-bottom: 10px; - padding-left: 18px; -} - -#content-related .module h2 { - background: none; - padding: 16px; - margin-bottom: 16px; - border-bottom: 1px solid #eaeaea; - font-size: 18px; - color: #333; -} - -.delete-confirmation form input[type="submit"] { - background: #ba2121; - border-radius: 4px; - padding: 10px 15px; - color: #fff; -} - -.delete-confirmation form input[type="submit"]:active, -.delete-confirmation form input[type="submit"]:focus, -.delete-confirmation form input[type="submit"]:hover { - background: #a41515; -} - -.delete-confirmation form .cancel-link { - display: inline-block; - vertical-align: middle; - height: 15px; - line-height: 15px; - background: #ddd; - border-radius: 4px; - padding: 10px 15px; - color: #333; - margin: 0 0 0 10px; -} - -.delete-confirmation form .cancel-link:active, -.delete-confirmation form .cancel-link:focus, -.delete-confirmation form .cancel-link:hover { - background: #ccc; -} - -/* POPUP */ -.popup #content { - padding: 20px; -} - -.popup #container { - min-width: 0; -} - -.popup #header { - padding: 10px 20px; -} diff --git a/new/sip/settings/static/admin/css/changelists.css b/new/sip/settings/static/admin/css/changelists.css deleted file mode 100644 index 7b8b9c7..0000000 --- a/new/sip/settings/static/admin/css/changelists.css +++ /dev/null @@ -1,354 +0,0 @@ -/* CHANGELISTS */ - -#changelist { - display: flex; - align-items: flex-start; - justify-content: space-between; -} - -#changelist .changelist-form-container { - flex: 1 1 auto; - min-width: 0; -} - -#changelist table { - width: 100%; -} - -.change-list .hiddenfields { display:none; } - -.change-list .filtered table { - border-right: none; -} - -.change-list .filtered { - min-height: 400px; -} - -.change-list .filtered .results, .change-list .filtered .paginator, -.filtered #toolbar, .filtered div.xfull { - width: auto; -} - -.change-list .filtered table tbody th { - padding-right: 1em; -} - -#changelist-form .results { - overflow-x: auto; - width: 100%; -} - -#changelist .toplinks { - border-bottom: 1px solid #ddd; -} - -#changelist .paginator { - color: #666; - border-bottom: 1px solid #eee; - background: #fff; - overflow: hidden; -} - -/* CHANGELIST TABLES */ - -#changelist table thead th { - padding: 0; - white-space: nowrap; - vertical-align: middle; -} - -#changelist table thead th.action-checkbox-column { - width: 1.5em; - text-align: center; -} - -#changelist table tbody td.action-checkbox { - text-align: center; -} - -#changelist table tfoot { - color: #666; -} - -/* TOOLBAR */ - -#toolbar { - padding: 8px 10px; - margin-bottom: 15px; - border-top: 1px solid #eee; - border-bottom: 1px solid #eee; - background: #f8f8f8; - color: #666; -} - -#toolbar form input { - border-radius: 4px; - font-size: 14px; - padding: 5px; - color: #333; -} - -#toolbar #searchbar { - height: 19px; - border: 1px solid #ccc; - padding: 2px 5px; - margin: 0; - vertical-align: top; - font-size: 13px; - max-width: 100%; -} - -#toolbar #searchbar:focus { - border-color: #999; -} - -#toolbar form input[type="submit"] { - border: 1px solid #ccc; - font-size: 13px; - padding: 4px 8px; - margin: 0; - vertical-align: middle; - background: #fff; - box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset; - cursor: pointer; - color: #333; -} - -#toolbar form input[type="submit"]:focus, -#toolbar form input[type="submit"]:hover { - border-color: #999; -} - -#changelist-search img { - vertical-align: middle; - margin-right: 4px; -} - -/* FILTER COLUMN */ - -#changelist-filter { - order: 1; - width: 240px; - background: #f8f8f8; - border-left: none; - margin: 0 0 0 30px; -} - -#changelist-filter h2 { - font-size: 14px; - text-transform: uppercase; - letter-spacing: 0.5px; - padding: 5px 15px; - margin-bottom: 12px; - border-bottom: none; -} - -#changelist-filter h3 { - font-weight: 400; - font-size: 14px; - padding: 0 15px; - margin-bottom: 10px; -} - -#changelist-filter ul { - margin: 5px 0; - padding: 0 15px 15px; - border-bottom: 1px solid #eaeaea; -} - -#changelist-filter ul:last-child { - border-bottom: none; -} - -#changelist-filter li { - list-style-type: none; - margin-left: 0; - padding-left: 0; -} - -#changelist-filter a { - display: block; - color: #999; - text-overflow: ellipsis; - overflow-x: hidden; -} - -#changelist-filter li.selected { - border-left: 5px solid #eaeaea; - padding-left: 10px; - margin-left: -15px; -} - -#changelist-filter li.selected a { - color: #5b80b2; -} - -#changelist-filter a:focus, #changelist-filter a:hover, -#changelist-filter li.selected a:focus, -#changelist-filter li.selected a:hover { - color: #036; -} - -#changelist-filter #changelist-filter-clear a { - font-size: 13px; - padding-bottom: 10px; - border-bottom: 1px solid #eaeaea; -} - -/* DATE DRILLDOWN */ - -.change-list ul.toplinks { - display: block; - float: left; - padding: 0; - margin: 0; - width: 100%; -} - -.change-list ul.toplinks li { - padding: 3px 6px; - font-weight: bold; - list-style-type: none; - display: inline-block; -} - -.change-list ul.toplinks .date-back a { - color: #999; -} - -.change-list ul.toplinks .date-back a:focus, -.change-list ul.toplinks .date-back a:hover { - color: #036; -} - -/* PAGINATOR */ - -.paginator { - font-size: 13px; - padding-top: 10px; - padding-bottom: 10px; - line-height: 22px; - margin: 0; - border-top: 1px solid #ddd; - width: 100%; -} - -.paginator a:link, .paginator a:visited { - padding: 2px 6px; - background: #79aec8; - text-decoration: none; - color: #fff; -} - -.paginator a.showall { - border: none; - background: none; - color: #5b80b2; -} - -.paginator a.showall:focus, .paginator a.showall:hover { - background: none; - color: #036; -} - -.paginator .end { - margin-right: 6px; -} - -.paginator .this-page { - padding: 2px 6px; - font-weight: bold; - font-size: 13px; - vertical-align: top; -} - -.paginator a:focus, .paginator a:hover { - color: white; - background: #036; -} - -/* ACTIONS */ - -.filtered .actions { - border-right: none; -} - -#changelist table input { - margin: 0; - vertical-align: baseline; -} - -#changelist table tbody tr.selected { - background-color: #FFFFCC; -} - -#changelist .actions { - padding: 10px; - background: #fff; - border-top: none; - border-bottom: none; - line-height: 24px; - color: #999; - width: 100%; -} - -#changelist .actions.selected { - background: #fffccf; - border-top: 1px solid #fffee8; - border-bottom: 1px solid #edecd6; -} - -#changelist .actions span.all, -#changelist .actions span.action-counter, -#changelist .actions span.clear, -#changelist .actions span.question { - font-size: 13px; - margin: 0 0.5em; - display: none; -} - -#changelist .actions:last-child { - border-bottom: none; -} - -#changelist .actions select { - vertical-align: top; - height: 24px; - background: none; - color: #000; - border: 1px solid #ccc; - border-radius: 4px; - font-size: 14px; - padding: 0 0 0 4px; - margin: 0; - margin-left: 10px; -} - -#changelist .actions select:focus { - border-color: #999; -} - -#changelist .actions label { - display: inline-block; - vertical-align: middle; - font-size: 13px; -} - -#changelist .actions .button { - font-size: 13px; - border: 1px solid #ccc; - border-radius: 4px; - background: #fff; - box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset; - cursor: pointer; - height: 24px; - line-height: 1; - padding: 4px 8px; - margin: 0; - color: #333; -} - -#changelist .actions .button:focus, #changelist .actions .button:hover { - border-color: #999; -} diff --git a/new/sip/settings/static/admin/css/dashboard.css b/new/sip/settings/static/admin/css/dashboard.css deleted file mode 100644 index 91d6efd..0000000 --- a/new/sip/settings/static/admin/css/dashboard.css +++ /dev/null @@ -1,26 +0,0 @@ -/* DASHBOARD */ - -.dashboard .module table th { - width: 100%; -} - -.dashboard .module table td { - white-space: nowrap; -} - -.dashboard .module table td a { - display: block; - padding-right: .6em; -} - -/* RECENT ACTIONS MODULE */ - -.module ul.actionlist { - margin-left: 0; -} - -ul.actionlist li { - list-style-type: none; - overflow: hidden; - text-overflow: ellipsis; -} diff --git a/new/sip/settings/static/admin/css/fonts.css b/new/sip/settings/static/admin/css/fonts.css deleted file mode 100644 index c837e01..0000000 --- a/new/sip/settings/static/admin/css/fonts.css +++ /dev/null @@ -1,20 +0,0 @@ -@font-face { - font-family: 'Roboto'; - src: url('../fonts/Roboto-Bold-webfont.woff'); - font-weight: 700; - font-style: normal; -} - -@font-face { - font-family: 'Roboto'; - src: url('../fonts/Roboto-Regular-webfont.woff'); - font-weight: 400; - font-style: normal; -} - -@font-face { - font-family: 'Roboto'; - src: url('../fonts/Roboto-Light-webfont.woff'); - font-weight: 300; - font-style: normal; -} diff --git a/new/sip/settings/static/admin/css/forms.css b/new/sip/settings/static/admin/css/forms.css deleted file mode 100644 index 89d5748..0000000 --- a/new/sip/settings/static/admin/css/forms.css +++ /dev/null @@ -1,527 +0,0 @@ -@import url('widgets.css'); - -/* FORM ROWS */ - -.form-row { - overflow: hidden; - padding: 10px; - font-size: 13px; - border-bottom: 1px solid #eee; -} - -.form-row img, .form-row input { - vertical-align: middle; -} - -.form-row label input[type="checkbox"] { - margin-top: 0; - vertical-align: 0; -} - -form .form-row p { - padding-left: 0; -} - -.hidden { - display: none; -} - -/* FORM LABELS */ - -label { - font-weight: normal; - color: #666; - font-size: 13px; -} - -.required label, label.required { - font-weight: bold; - color: #333; -} - -/* RADIO BUTTONS */ - -form ul.radiolist li { - list-style-type: none; -} - -form ul.radiolist label { - float: none; - display: inline; -} - -form ul.radiolist input[type="radio"] { - margin: -2px 4px 0 0; - padding: 0; -} - -form ul.inline { - margin-left: 0; - padding: 0; -} - -form ul.inline li { - float: left; - padding-right: 7px; -} - -/* ALIGNED FIELDSETS */ - -.aligned label { - display: block; - padding: 4px 10px 0 0; - float: left; - width: 160px; - word-wrap: break-word; - line-height: 1; -} - -.aligned label:not(.vCheckboxLabel):after { - content: ''; - display: inline-block; - vertical-align: middle; - height: 26px; -} - -.aligned label + p, .aligned label + div.help, .aligned label + div.readonly { - padding: 6px 0; - margin-top: 0; - margin-bottom: 0; - margin-left: 170px; -} - -.aligned ul label { - display: inline; - float: none; - width: auto; -} - -.aligned .form-row input { - margin-bottom: 0; -} - -.colMS .aligned .vLargeTextField, .colMS .aligned .vXMLLargeTextField { - width: 350px; -} - -form .aligned ul { - margin-left: 160px; - padding-left: 10px; -} - -form .aligned ul.radiolist { - display: inline-block; - margin: 0; - padding: 0; -} - -form .aligned p.help, -form .aligned div.help { - clear: left; - margin-top: 0; - margin-left: 160px; - padding-left: 10px; -} - -form .aligned label + p.help, -form .aligned label + div.help { - margin-left: 0; - padding-left: 0; -} - -form .aligned p.help:last-child, -form .aligned div.help:last-child { - margin-bottom: 0; - padding-bottom: 0; -} - -form .aligned input + p.help, -form .aligned textarea + p.help, -form .aligned select + p.help, -form .aligned input + div.help, -form .aligned textarea + div.help, -form .aligned select + div.help { - margin-left: 160px; - padding-left: 10px; -} - -form .aligned ul li { - list-style: none; -} - -form .aligned table p { - margin-left: 0; - padding-left: 0; -} - -.aligned .vCheckboxLabel { - float: none; - width: auto; - display: inline-block; - vertical-align: -3px; - padding: 0 0 5px 5px; -} - -.aligned .vCheckboxLabel + p.help, -.aligned .vCheckboxLabel + div.help { - margin-top: -4px; -} - -.colM .aligned .vLargeTextField, .colM .aligned .vXMLLargeTextField { - width: 610px; -} - -.checkbox-row p.help, -.checkbox-row div.help { - margin-left: 0; - padding-left: 0; -} - -fieldset .fieldBox { - float: left; - margin-right: 20px; -} - -/* WIDE FIELDSETS */ - -.wide label { - width: 200px; -} - -form .wide p, -form .wide input + p.help, -form .wide input + div.help { - margin-left: 200px; -} - -form .wide p.help, -form .wide div.help { - padding-left: 38px; -} - -form div.help ul { - padding-left: 0; - margin-left: 0; -} - -.colM fieldset.wide .vLargeTextField, .colM fieldset.wide .vXMLLargeTextField { - width: 450px; -} - -/* COLLAPSED FIELDSETS */ - -fieldset.collapsed * { - display: none; -} - -fieldset.collapsed h2, fieldset.collapsed { - display: block; -} - -fieldset.collapsed { - border: 1px solid #eee; - border-radius: 4px; - overflow: hidden; -} - -fieldset.collapsed h2 { - background: #f8f8f8; - color: #666; -} - -fieldset .collapse-toggle { - color: #fff; -} - -fieldset.collapsed .collapse-toggle { - background: transparent; - display: inline; - color: #447e9b; -} - -/* MONOSPACE TEXTAREAS */ - -fieldset.monospace textarea { - font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace; -} - -/* SUBMIT ROW */ - -.submit-row { - padding: 12px 14px; - margin: 0 0 20px; - background: #f8f8f8; - border: 1px solid #eee; - border-radius: 4px; - text-align: right; - overflow: hidden; -} - -body.popup .submit-row { - overflow: auto; -} - -.submit-row input { - height: 35px; - line-height: 15px; - margin: 0 0 0 5px; -} - -.submit-row input.default { - margin: 0 0 0 8px; - text-transform: uppercase; -} - -.submit-row p { - margin: 0.3em; -} - -.submit-row p.deletelink-box { - float: left; - margin: 0; -} - -.submit-row a.deletelink { - display: block; - background: #ba2121; - border-radius: 4px; - padding: 10px 15px; - height: 15px; - line-height: 15px; - color: #fff; -} - -.submit-row a.closelink { - display: inline-block; - background: #bbbbbb; - border-radius: 4px; - padding: 10px 15px; - height: 15px; - line-height: 15px; - margin: 0 0 0 5px; - color: #fff; -} - -.submit-row a.deletelink:focus, -.submit-row a.deletelink:hover, -.submit-row a.deletelink:active { - background: #a41515; -} - -.submit-row a.closelink:focus, -.submit-row a.closelink:hover, -.submit-row a.closelink:active { - background: #aaaaaa; -} - -/* CUSTOM FORM FIELDS */ - -.vSelectMultipleField { - vertical-align: top; -} - -.vCheckboxField { - border: none; -} - -.vDateField, .vTimeField { - margin-right: 2px; - margin-bottom: 4px; -} - -.vDateField { - min-width: 6.85em; -} - -.vTimeField { - min-width: 4.7em; -} - -.vURLField { - width: 30em; -} - -.vLargeTextField, .vXMLLargeTextField { - width: 48em; -} - -.flatpages-flatpage #id_content { - height: 40.2em; -} - -.module table .vPositiveSmallIntegerField { - width: 2.2em; -} - -.vTextField, .vUUIDField { - width: 20em; -} - -.vIntegerField { - width: 5em; -} - -.vBigIntegerField { - width: 10em; -} - -.vForeignKeyRawIdAdminField { - width: 5em; -} - -/* INLINES */ - -.inline-group { - padding: 0; - margin: 0 0 30px; -} - -.inline-group thead th { - padding: 8px 10px; -} - -.inline-group .aligned label { - width: 160px; -} - -.inline-related { - position: relative; -} - -.inline-related h3 { - margin: 0; - color: #666; - padding: 5px; - font-size: 13px; - background: #f8f8f8; - border-top: 1px solid #eee; - border-bottom: 1px solid #eee; -} - -.inline-related h3 span.delete { - float: right; -} - -.inline-related h3 span.delete label { - margin-left: 2px; - font-size: 11px; -} - -.inline-related fieldset { - margin: 0; - background: #fff; - border: none; - width: 100%; -} - -.inline-related fieldset.module h3 { - margin: 0; - padding: 2px 5px 3px 5px; - font-size: 11px; - text-align: left; - font-weight: bold; - background: #bcd; - color: #fff; -} - -.inline-group .tabular fieldset.module { - border: none; -} - -.inline-related.tabular fieldset.module table { - width: 100%; - overflow-x: scroll; -} - -.last-related fieldset { - border: none; -} - -.inline-group .tabular tr.has_original td { - padding-top: 2em; -} - -.inline-group .tabular tr td.original { - padding: 2px 0 0 0; - width: 0; - _position: relative; -} - -.inline-group .tabular th.original { - width: 0px; - padding: 0; -} - -.inline-group .tabular td.original p { - position: absolute; - left: 0; - height: 1.1em; - padding: 2px 9px; - overflow: hidden; - font-size: 9px; - font-weight: bold; - color: #666; - _width: 700px; -} - -.inline-group ul.tools { - padding: 0; - margin: 0; - list-style: none; -} - -.inline-group ul.tools li { - display: inline; - padding: 0 5px; -} - -.inline-group div.add-row, -.inline-group .tabular tr.add-row td { - color: #666; - background: #f8f8f8; - padding: 8px 10px; - border-bottom: 1px solid #eee; -} - -.inline-group .tabular tr.add-row td { - padding: 8px 10px; - border-bottom: 1px solid #eee; -} - -.inline-group ul.tools a.add, -.inline-group div.add-row a, -.inline-group .tabular tr.add-row td a { - background: url(../img/icon-addlink.svg) 0 1px no-repeat; - padding-left: 16px; - font-size: 12px; -} - -.empty-form { - display: none; -} - -/* RELATED FIELD ADD ONE / LOOKUP */ - -.related-lookup { - margin-left: 5px; - display: inline-block; - vertical-align: middle; - background-repeat: no-repeat; - background-size: 14px; -} - -.related-lookup { - width: 16px; - height: 16px; - background-image: url(../img/search.svg); -} - -form .related-widget-wrapper ul { - display: inline-block; - margin-left: 0; - padding-left: 0; -} - -.clearable-file-input input { - margin-top: 0; -} diff --git a/new/sip/settings/static/admin/css/login.css b/new/sip/settings/static/admin/css/login.css deleted file mode 100644 index 062b36e..0000000 --- a/new/sip/settings/static/admin/css/login.css +++ /dev/null @@ -1,79 +0,0 @@ -/* LOGIN FORM */ - -.login { - background: #f8f8f8; - height: auto; -} - -.login #header { - height: auto; - padding: 15px 16px; - justify-content: center; -} - -.login #header h1 { - font-size: 18px; -} - -.login #header h1 a { - color: #fff; -} - -.login #content { - padding: 20px 20px 0; -} - -.login #container { - background: #fff; - border: 1px solid #eaeaea; - border-radius: 4px; - overflow: hidden; - width: 28em; - min-width: 300px; - margin: 100px auto; - height: auto; -} - -.login #content-main { - width: 100%; -} - -.login .form-row { - padding: 4px 0; - float: left; - width: 100%; - border-bottom: none; -} - -.login .form-row label { - padding-right: 0.5em; - line-height: 2em; - font-size: 1em; - clear: both; - color: #333; -} - -.login .form-row #id_username, .login .form-row #id_password { - clear: both; - padding: 8px; - width: 100%; - box-sizing: border-box; -} - -.login span.help { - font-size: 10px; - display: block; -} - -.login .submit-row { - clear: both; - padding: 1em 0 0 9.4em; - margin: 0; - border: none; - background: none; - text-align: left; -} - -.login .password-reset-link { - text-align: center; -} diff --git a/new/sip/settings/static/admin/css/nav_sidebar.css b/new/sip/settings/static/admin/css/nav_sidebar.css deleted file mode 100644 index 784d087..0000000 --- a/new/sip/settings/static/admin/css/nav_sidebar.css +++ /dev/null @@ -1,119 +0,0 @@ -.sticky { - position: sticky; - top: 0; - max-height: 100vh; -} - -.toggle-nav-sidebar { - z-index: 20; - left: 0; - display: flex; - align-items: center; - justify-content: center; - flex: 0 0 23px; - width: 23px; - border-right: 1px solid #eaeaea; - background-color: #ffffff; - cursor: pointer; - font-size: 20px; - color: #447e9b; - padding: 0; -} - -[dir="rtl"] .toggle-nav-sidebar { - border-left: 1px solid #eaeaea; - border-right: 0; -} - -.toggle-nav-sidebar:hover, -.toggle-nav-sidebar:focus { - background-color: #f6f6f6; -} - -#nav-sidebar { - z-index: 15; - flex: 0 0 275px; - left: -276px; - margin-left: -276px; - border-top: 1px solid transparent; - border-right: 1px solid #eaeaea; - background-color: #ffffff; - overflow: auto; -} - -[dir="rtl"] #nav-sidebar { - border-left: 1px solid #eaeaea; - border-right: 0; - left: 0; - margin-left: 0; - right: -276px; - margin-right: -276px; -} - -.toggle-nav-sidebar::before { - content: '\00BB'; -} - -.main.shifted .toggle-nav-sidebar::before { - content: '\00AB'; -} - -.main.shifted > #nav-sidebar { - left: 24px; - margin-left: 0; -} - -[dir="rtl"] .main.shifted > #nav-sidebar { - left: 0; - right: 24px; - margin-right: 0; -} - -#nav-sidebar .module th { - width: 100%; - overflow-wrap: anywhere; -} - -#nav-sidebar .module th, -#nav-sidebar .module caption { - padding-left: 16px; -} - -#nav-sidebar .module td { - white-space: nowrap; -} - -[dir="rtl"] #nav-sidebar .module th, -[dir="rtl"] #nav-sidebar .module caption { - padding-left: 8px; - padding-right: 16px; -} - -#nav-sidebar .current-app .section:link, -#nav-sidebar .current-app .section:visited { - color: #ffc; - font-weight: bold; -} - -#nav-sidebar .current-model { - background: #ffc; -} - -.main > #nav-sidebar + .content { - max-width: calc(100% - 23px); -} - -.main.shifted > #nav-sidebar + .content { - max-width: calc(100% - 299px); -} - -@media (max-width: 767px) { - #nav-sidebar, #toggle-nav-sidebar { - display: none; - } - - .main > #nav-sidebar + .content, - .main.shifted > #nav-sidebar + .content { - max-width: 100%; - } -} diff --git a/new/sip/settings/static/admin/css/responsive.css b/new/sip/settings/static/admin/css/responsive.css deleted file mode 100644 index ef968c2..0000000 --- a/new/sip/settings/static/admin/css/responsive.css +++ /dev/null @@ -1,1004 +0,0 @@ -/* Tablets */ - -input[type="submit"], button { - -webkit-appearance: none; - appearance: none; -} - -@media (max-width: 1024px) { - /* Basic */ - - html { - -webkit-text-size-adjust: 100%; - } - - td, th { - padding: 10px; - font-size: 14px; - } - - .small { - font-size: 12px; - } - - /* Layout */ - - #container { - min-width: 0; - } - - #content { - padding: 20px 30px 30px; - } - - div.breadcrumbs { - padding: 10px 30px; - } - - /* Header */ - - #header { - flex-direction: column; - padding: 15px 30px; - justify-content: flex-start; - } - - #branding h1 { - margin: 0 0 8px; - font-size: 20px; - line-height: 1.2; - } - - #user-tools { - margin: 0; - font-weight: 400; - line-height: 1.85; - text-align: left; - } - - #user-tools a { - display: inline-block; - line-height: 1.4; - } - - /* Dashboard */ - - .dashboard #content { - width: auto; - } - - #content-related { - margin-right: -290px; - } - - .colSM #content-related { - margin-left: -290px; - } - - .colMS { - margin-right: 290px; - } - - .colSM { - margin-left: 290px; - } - - .dashboard .module table td a { - padding-right: 0; - } - - td .changelink, td .addlink { - font-size: 13px; - } - - /* Changelist */ - - #toolbar { - border: none; - padding: 15px; - } - - #changelist-search > div { - display: flex; - flex-wrap: nowrap; - max-width: 480px; - } - - #changelist-search label { - line-height: 22px; - } - - #toolbar form #searchbar { - flex: 1 0 auto; - width: 0; - height: 22px; - margin: 0 10px 0 6px; - } - - #toolbar form input[type=submit] { - flex: 0 1 auto; - } - - #changelist-search .quiet { - width: 0; - flex: 1 0 auto; - margin: 5px 0 0 25px; - } - - #changelist .actions { - display: flex; - flex-wrap: wrap; - padding: 15px 0; - } - - #changelist .actions.selected { - border: none; - } - - #changelist .actions label { - display: flex; - } - - #changelist .actions select { - background: #fff; - } - - #changelist .actions .button { - min-width: 48px; - margin: 0 10px; - } - - #changelist .actions span.all, - #changelist .actions span.clear, - #changelist .actions span.question, - #changelist .actions span.action-counter { - font-size: 11px; - margin: 0 10px 0 0; - } - - #changelist-filter { - width: 200px; - } - - .change-list .filtered .results, - .change-list .filtered .paginator, - .filtered #toolbar, - .filtered .actions, - - #changelist .paginator { - border-top-color: #eee; - } - - #changelist .results + .paginator { - border-top: none; - } - - /* Forms */ - - label { - font-size: 14px; - } - - .form-row input[type=text], - .form-row input[type=password], - .form-row input[type=email], - .form-row input[type=url], - .form-row input[type=tel], - .form-row input[type=number], - .form-row textarea, - .form-row select, - .form-row .vTextField { - box-sizing: border-box; - margin: 0; - padding: 6px 8px; - min-height: 36px; - font-size: 14px; - } - - .form-row select { - height: 36px; - } - - .form-row select[multiple] { - height: auto; - min-height: 0; - } - - fieldset .fieldBox { - float: none; - margin: 0 -10px; - padding: 0 10px; - } - - fieldset .fieldBox + .fieldBox { - margin-top: 10px; - padding-top: 10px; - border-top: 1px solid #eee; - } - - textarea { - max-width: 100%; - max-height: 120px; - } - - .aligned label { - padding-top: 6px; - } - - .aligned .related-lookup, - .aligned .datetimeshortcuts, - .aligned .related-lookup + strong { - align-self: center; - margin-left: 15px; - } - - form .aligned ul.radiolist { - margin-left: 2px; - } - - /* Related widget */ - - .related-widget-wrapper { - float: none; - } - - .related-widget-wrapper-link + .selector { - max-width: calc(100% - 30px); - margin-right: 15px; - } - - select + .related-widget-wrapper-link, - .related-widget-wrapper-link + .related-widget-wrapper-link { - margin-left: 10px; - } - - /* Selector */ - - .selector { - display: flex; - width: 100%; - } - - .selector .selector-filter { - display: flex; - align-items: center; - } - - .selector .selector-filter label { - margin: 0 8px 0 0; - } - - .selector .selector-filter input { - width: auto; - min-height: 0; - flex: 1 1; - } - - .selector-available, .selector-chosen { - width: auto; - flex: 1 1; - display: flex; - flex-direction: column; - } - - .selector select { - width: 100%; - flex: 1 0 auto; - margin-bottom: 5px; - } - - .selector ul.selector-chooser { - width: 26px; - height: 52px; - padding: 2px 0; - margin: auto 15px; - border-radius: 20px; - transform: translateY(-10px); - } - - .selector-add, .selector-remove { - width: 20px; - height: 20px; - background-size: 20px auto; - } - - .selector-add { - background-position: 0 -120px; - } - - .selector-remove { - background-position: 0 -80px; - } - - a.selector-chooseall, a.selector-clearall { - align-self: center; - } - - .stacked { - flex-direction: column; - max-width: 480px; - } - - .stacked > * { - flex: 0 1 auto; - } - - .stacked select { - margin-bottom: 0; - } - - .stacked .selector-available, .stacked .selector-chosen { - width: auto; - } - - .stacked ul.selector-chooser { - width: 52px; - height: 26px; - padding: 0 2px; - margin: 15px auto; - transform: none; - } - - .stacked .selector-chooser li { - padding: 3px; - } - - .stacked .selector-add, .stacked .selector-remove { - background-size: 20px auto; - } - - .stacked .selector-add { - background-position: 0 -40px; - } - - .stacked .active.selector-add { - background-position: 0 -40px; - } - - .active.selector-add:focus, .active.selector-add:hover { - background-position: 0 -140px; - } - - .stacked .active.selector-add:focus, .stacked .active.selector-add:hover { - background-position: 0 -60px; - } - - .stacked .selector-remove { - background-position: 0 0; - } - - .stacked .active.selector-remove { - background-position: 0 0; - } - - .active.selector-remove:focus, .active.selector-remove:hover { - background-position: 0 -100px; - } - - .stacked .active.selector-remove:focus, .stacked .active.selector-remove:hover { - background-position: 0 -20px; - } - - .help-tooltip, .selector .help-icon { - display: none; - } - - form .form-row p.datetime { - width: 100%; - } - - .datetime input { - width: 50%; - max-width: 120px; - } - - .datetime span { - font-size: 13px; - } - - .datetime .timezonewarning { - display: block; - font-size: 11px; - color: #999; - } - - .datetimeshortcuts { - color: #ccc; - } - - .form-row .datetime input.vDateField, .form-row .datetime input.vTimeField { - width: 75%; - } - - .inline-group { - overflow: auto; - } - - /* Messages */ - - ul.messagelist li { - padding-left: 55px; - background-position: 30px 12px; - } - - ul.messagelist li.error { - background-position: 30px 12px; - } - - ul.messagelist li.warning { - background-position: 30px 14px; - } - - /* Login */ - - .login #header { - padding: 15px 20px; - } - - .login #branding h1 { - margin: 0; - } - - /* GIS */ - - div.olMap { - max-width: calc(100vw - 30px); - max-height: 300px; - } - - .olMap + .clear_features { - display: block; - margin-top: 10px; - } - - /* Docs */ - - .module table.xfull { - width: 100%; - } - - pre.literal-block { - overflow: auto; - } -} - -/* Mobile */ - -@media (max-width: 767px) { - /* Layout */ - - #header, #content, #footer { - padding: 15px; - } - - #footer:empty { - padding: 0; - } - - div.breadcrumbs { - padding: 10px 15px; - } - - /* Dashboard */ - - .colMS, .colSM { - margin: 0; - } - - #content-related, .colSM #content-related { - width: 100%; - margin: 0; - } - - #content-related .module { - margin-bottom: 0; - } - - #content-related .module h2 { - padding: 10px 15px; - font-size: 16px; - } - - /* Changelist */ - - #changelist { - align-items: stretch; - flex-direction: column; - } - - #toolbar { - padding: 10px; - } - - #changelist-filter { - margin-left: 0; - } - - #changelist .actions label { - flex: 1 1; - } - - #changelist .actions select { - flex: 1 0; - width: 100%; - } - - #changelist .actions span { - flex: 1 0 100%; - } - - #changelist-filter { - position: static; - width: auto; - margin-top: 30px; - } - - .object-tools { - float: none; - margin: 0 0 15px; - padding: 0; - overflow: hidden; - } - - .object-tools li { - height: auto; - margin-left: 0; - } - - .object-tools li + li { - margin-left: 15px; - } - - /* Forms */ - - .form-row { - padding: 15px 0; - } - - .aligned .form-row, - .aligned .form-row > div { - display: flex; - flex-wrap: wrap; - max-width: 100vw; - } - - .aligned .form-row > div { - width: calc(100vw - 30px); - } - - textarea { - max-width: none; - } - - .vURLField { - width: auto; - } - - fieldset .fieldBox + .fieldBox { - margin-top: 15px; - padding-top: 15px; - } - - fieldset.collapsed .form-row { - display: none; - } - - .aligned label { - width: 100%; - padding: 0 0 10px; - } - - .aligned label:after { - max-height: 0; - } - - .aligned .form-row input, - .aligned .form-row select, - .aligned .form-row textarea { - flex: 1 1 auto; - max-width: 100%; - } - - .aligned .checkbox-row { - align-items: center; - } - - .aligned .checkbox-row input { - flex: 0 1 auto; - margin: 0; - } - - .aligned .vCheckboxLabel { - flex: 1 0; - padding: 1px 0 0 5px; - } - - .aligned label + p, - .aligned label + div.help, - .aligned label + div.readonly { - padding: 0; - margin-left: 0; - } - - .aligned p.file-upload { - margin-left: 0; - font-size: 13px; - } - - span.clearable-file-input { - margin-left: 15px; - } - - span.clearable-file-input label { - font-size: 13px; - padding-bottom: 0; - } - - .aligned .timezonewarning { - flex: 1 0 100%; - margin-top: 5px; - } - - form .aligned .form-row div.help { - width: 100%; - margin: 5px 0 0; - padding: 0; - } - - form .aligned ul { - margin-left: 0; - padding-left: 0; - } - - form .aligned ul.radiolist { - margin-right: 15px; - margin-bottom: -3px; - } - - form .aligned ul.radiolist li + li { - margin-top: 5px; - } - - /* Related widget */ - - .related-widget-wrapper { - width: 100%; - display: flex; - align-items: flex-start; - } - - .related-widget-wrapper .selector { - order: 1; - } - - .related-widget-wrapper > a { - order: 2; - } - - .related-widget-wrapper .radiolist ~ a { - align-self: flex-end; - } - - .related-widget-wrapper > select ~ a { - align-self: center; - } - - select + .related-widget-wrapper-link, - .related-widget-wrapper-link + .related-widget-wrapper-link { - margin-left: 15px; - } - - /* Selector */ - - .selector { - flex-direction: column; - } - - .selector > * { - float: none; - } - - .selector-available, .selector-chosen { - margin-bottom: 0; - flex: 1 1 auto; - } - - .selector select { - max-height: 96px; - } - - .selector ul.selector-chooser { - display: block; - float: none; - width: 52px; - height: 26px; - padding: 0 2px; - margin: 15px auto 20px; - transform: none; - } - - .selector ul.selector-chooser li { - float: left; - } - - .selector-remove { - background-position: 0 0; - } - - .active.selector-remove:focus, .active.selector-remove:hover { - background-position: 0 -20px; - } - - .selector-add { - background-position: 0 -40px; - } - - .active.selector-add:focus, .active.selector-add:hover { - background-position: 0 -60px; - } - - /* Inlines */ - - .inline-group[data-inline-type="stacked"] .inline-related { - border: 2px solid #eee; - border-radius: 4px; - margin-top: 15px; - overflow: auto; - } - - .inline-group[data-inline-type="stacked"] .inline-related > * { - box-sizing: border-box; - } - - .inline-group[data-inline-type="stacked"] .inline-related + .inline-related { - margin-top: 30px; - } - - .inline-group[data-inline-type="stacked"] .inline-related .module { - padding: 0 10px; - } - - .inline-group[data-inline-type="stacked"] .inline-related .module .form-row:last-child { - border-bottom: none; - } - - .inline-group[data-inline-type="stacked"] .inline-related h3 { - padding: 10px; - border-top-width: 0; - border-bottom-width: 2px; - display: flex; - flex-wrap: wrap; - align-items: center; - } - - .inline-group[data-inline-type="stacked"] .inline-related h3 .inline_label { - margin-right: auto; - } - - .inline-group[data-inline-type="stacked"] .inline-related h3 span.delete { - float: none; - flex: 1 1 100%; - margin-top: 5px; - } - - .inline-group[data-inline-type="stacked"] .aligned .form-row > div:not([class]) { - width: 100%; - } - - .inline-group[data-inline-type="stacked"] .aligned label { - width: 100%; - } - - .inline-group[data-inline-type="stacked"] div.add-row { - margin-top: 15px; - border: 1px solid #eee; - border-radius: 4px; - } - - .inline-group div.add-row, - .inline-group .tabular tr.add-row td { - padding: 0; - } - - .inline-group div.add-row a, - .inline-group .tabular tr.add-row td a { - display: block; - padding: 8px 10px 8px 26px; - background-position: 8px 9px; - } - - /* Submit row */ - - .submit-row { - padding: 10px 10px 0; - margin: 0 0 15px; - display: flex; - flex-direction: column; - } - - .submit-row > * { - width: 100%; - } - - .submit-row input, .submit-row input.default, .submit-row a, .submit-row a.closelink { - float: none; - margin: 0 0 10px; - text-align: center; - } - - .submit-row a.closelink { - padding: 10px 0; - } - - .submit-row p.deletelink-box { - order: 4; - } - - /* Messages */ - - ul.messagelist li { - padding-left: 40px; - background-position: 15px 12px; - } - - ul.messagelist li.error { - background-position: 15px 12px; - } - - ul.messagelist li.warning { - background-position: 15px 14px; - } - - /* Paginator */ - - .paginator .this-page, .paginator a:link, .paginator a:visited { - padding: 4px 10px; - } - - /* Login */ - - body.login { - padding: 0 15px; - } - - .login #container { - width: auto; - max-width: 480px; - margin: 50px auto; - } - - .login #header, - .login #content { - padding: 15px; - } - - .login #content-main { - float: none; - } - - .login .form-row { - padding: 0; - } - - .login .form-row + .form-row { - margin-top: 15px; - } - - .login .form-row label { - display: block; - margin: 0 0 5px; - padding: 0; - line-height: 1.2; - } - - .login .submit-row { - padding: 15px 0 0; - } - - .login br, .login .submit-row label { - display: none; - } - - .login .submit-row input { - margin: 0; - text-transform: uppercase; - } - - .errornote { - margin: 0 0 20px; - padding: 8px 12px; - font-size: 13px; - } - - /* Calendar and clock */ - - .calendarbox, .clockbox { - position: fixed !important; - top: 50% !important; - left: 50% !important; - transform: translate(-50%, -50%); - margin: 0; - border: none; - overflow: visible; - } - - .calendarbox:before, .clockbox:before { - content: ''; - position: fixed; - top: 50%; - left: 50%; - width: 100vw; - height: 100vh; - background: rgba(0, 0, 0, 0.75); - transform: translate(-50%, -50%); - } - - .calendarbox > *, .clockbox > * { - position: relative; - z-index: 1; - } - - .calendarbox > div:first-child { - z-index: 2; - } - - .calendarbox .calendar, .clockbox h2 { - border-radius: 4px 4px 0 0; - overflow: hidden; - } - - .calendarbox .calendar-cancel, .clockbox .calendar-cancel { - border-radius: 0 0 4px 4px; - overflow: hidden; - } - - .calendar-shortcuts { - padding: 10px 0; - font-size: 12px; - line-height: 12px; - } - - .calendar-shortcuts a { - margin: 0 4px; - } - - .timelist a { - background: #fff; - padding: 4px; - } - - .calendar-cancel { - padding: 8px 10px; - } - - .clockbox h2 { - padding: 8px 15px; - } - - .calendar caption { - padding: 10px; - } - - .calendarbox .calendarnav-previous, .calendarbox .calendarnav-next { - z-index: 1; - top: 10px; - } - - /* History */ - - table#change-history tbody th, table#change-history tbody td { - font-size: 13px; - word-break: break-word; - } - - table#change-history tbody th { - width: auto; - } - - /* Docs */ - - table.model tbody th, table.model tbody td { - font-size: 13px; - word-break: break-word; - } -} diff --git a/new/sip/settings/static/admin/css/responsive_rtl.css b/new/sip/settings/static/admin/css/responsive_rtl.css deleted file mode 100644 index 66d3c2f..0000000 --- a/new/sip/settings/static/admin/css/responsive_rtl.css +++ /dev/null @@ -1,80 +0,0 @@ -/* TABLETS */ - -@media (max-width: 1024px) { - [dir="rtl"] .colMS { - margin-right: 0; - } - - [dir="rtl"] #user-tools { - text-align: right; - } - - [dir="rtl"] #changelist .actions label { - padding-left: 10px; - padding-right: 0; - } - - [dir="rtl"] #changelist .actions select { - margin-left: 0; - margin-right: 15px; - } - - [dir="rtl"] .change-list .filtered .results, - [dir="rtl"] .change-list .filtered .paginator, - [dir="rtl"] .filtered #toolbar, - [dir="rtl"] .filtered div.xfull, - [dir="rtl"] .filtered .actions, - [dir="rtl"] #changelist-filter { - margin-left: 0; - } - - [dir="rtl"] .inline-group ul.tools a.add, - [dir="rtl"] .inline-group div.add-row a, - [dir="rtl"] .inline-group .tabular tr.add-row td a { - padding: 8px 26px 8px 10px; - background-position: calc(100% - 8px) 9px; - } - - [dir="rtl"] .related-widget-wrapper-link + .selector { - margin-right: 0; - margin-left: 15px; - } - - [dir="rtl"] .selector .selector-filter label { - margin-right: 0; - margin-left: 8px; - } - - [dir="rtl"] .object-tools li { - float: right; - } - - [dir="rtl"] .object-tools li + li { - margin-left: 0; - margin-right: 15px; - } - - [dir="rtl"] .dashboard .module table td a { - padding-left: 0; - padding-right: 16px; - } -} - -/* MOBILE */ - -@media (max-width: 767px) { - [dir="rtl"] .aligned .related-lookup, - [dir="rtl"] .aligned .datetimeshortcuts { - margin-left: 0; - margin-right: 15px; - } - - [dir="rtl"] .aligned ul { - margin-right: 0; - } - - [dir="rtl"] #changelist-filter { - margin-left: 0; - margin-right: 0; - } -} diff --git a/new/sip/settings/static/admin/css/rtl.css b/new/sip/settings/static/admin/css/rtl.css deleted file mode 100644 index a40aad0..0000000 --- a/new/sip/settings/static/admin/css/rtl.css +++ /dev/null @@ -1,249 +0,0 @@ -body { - direction: rtl; -} - -/* LOGIN */ - -.login .form-row { - float: right; -} - -.login .form-row label { - float: right; - padding-left: 0.5em; - padding-right: 0; - text-align: left; -} - -.login .submit-row { - clear: both; - padding: 1em 9.4em 0 0; -} - -/* GLOBAL */ - -th { - text-align: right; -} - -.module h2, .module caption { - text-align: right; -} - -.module ul, .module ol { - margin-left: 0; - margin-right: 1.5em; -} - -.viewlink, .addlink, .changelink { - padding-left: 0; - padding-right: 16px; - background-position: 100% 1px; -} - -.deletelink { - padding-left: 0; - padding-right: 16px; - background-position: 100% 1px; -} - -.object-tools { - float: left; -} - -thead th:first-child, -tfoot td:first-child { - border-left: none; -} - -/* LAYOUT */ - -#user-tools { - right: auto; - left: 0; - text-align: left; -} - -div.breadcrumbs { - text-align: right; -} - -#content-main { - float: right; -} - -#content-related { - float: left; - margin-left: -300px; - margin-right: auto; -} - -.colMS { - margin-left: 300px; - margin-right: 0; -} - -/* SORTABLE TABLES */ - -table thead th.sorted .sortoptions { - float: left; -} - -thead th.sorted .text { - padding-right: 0; - padding-left: 42px; -} - -/* dashboard styles */ - -.dashboard .module table td a { - padding-left: .6em; - padding-right: 16px; -} - -/* changelists styles */ - -.change-list .filtered table { - border-left: none; - border-right: 0px none; -} - -#changelist-filter { - border-left: none; - border-right: none; - margin-left: 0; - margin-right: 30px; -} - -#changelist-filter li.selected { - border-left: none; - padding-left: 10px; - margin-left: 0; - border-right: 5px solid #eaeaea; - padding-right: 10px; - margin-right: -15px; -} - -#changelist table tbody td:first-child, #changelist table tbody th:first-child { - border-right: none; - border-left: none; -} - -/* FORMS */ - -.aligned label { - padding: 0 0 3px 1em; - float: right; -} - -.submit-row { - text-align: left -} - -.submit-row p.deletelink-box { - float: right; -} - -.submit-row input.default { - margin-left: 0; -} - -.vDateField, .vTimeField { - margin-left: 2px; -} - -.aligned .form-row input { - margin-left: 5px; -} - -form .aligned p.help, form .aligned div.help { - clear: right; -} - -form .aligned ul { - margin-right: 163px; - margin-left: 0; -} - -form ul.inline li { - float: right; - padding-right: 0; - padding-left: 7px; -} - -input[type=submit].default, .submit-row input.default { - float: left; -} - -fieldset .fieldBox { - float: right; - margin-left: 20px; - margin-right: 0; -} - -.errorlist li { - background-position: 100% 12px; - padding: 0; -} - -.errornote { - background-position: 100% 12px; - padding: 10px 12px; -} - -/* WIDGETS */ - -.calendarnav-previous { - top: 0; - left: auto; - right: 10px; -} - -.calendarnav-next { - top: 0; - right: auto; - left: 10px; -} - -.calendar caption, .calendarbox h2 { - text-align: center; -} - -.selector { - float: right; -} - -.selector .selector-filter { - text-align: right; -} - -.inline-deletelink { - float: left; -} - -form .form-row p.datetime { - overflow: hidden; -} - -.related-widget-wrapper { - float: right; -} - -/* MISC */ - -.inline-related h2, .inline-group h2 { - text-align: right -} - -.inline-related h3 span.delete { - padding-right: 20px; - padding-left: inherit; - left: 10px; - right: inherit; - float:left; -} - -.inline-related h3 span.delete label { - margin-left: inherit; - margin-right: 2px; -} diff --git a/new/sip/settings/static/admin/css/vendor/select2/LICENSE-SELECT2.md b/new/sip/settings/static/admin/css/vendor/select2/LICENSE-SELECT2.md deleted file mode 100644 index 8cb8a2b..0000000 --- a/new/sip/settings/static/admin/css/vendor/select2/LICENSE-SELECT2.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2012-2017 Kevin Brown, Igor Vaynberg, and Select2 contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/new/sip/settings/static/admin/css/vendor/select2/select2.css b/new/sip/settings/static/admin/css/vendor/select2/select2.css deleted file mode 100644 index 750b320..0000000 --- a/new/sip/settings/static/admin/css/vendor/select2/select2.css +++ /dev/null @@ -1,481 +0,0 @@ -.select2-container { - box-sizing: border-box; - display: inline-block; - margin: 0; - position: relative; - vertical-align: middle; } - .select2-container .select2-selection--single { - box-sizing: border-box; - cursor: pointer; - display: block; - height: 28px; - user-select: none; - -webkit-user-select: none; } - .select2-container .select2-selection--single .select2-selection__rendered { - display: block; - padding-left: 8px; - padding-right: 20px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; } - .select2-container .select2-selection--single .select2-selection__clear { - position: relative; } - .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { - padding-right: 8px; - padding-left: 20px; } - .select2-container .select2-selection--multiple { - box-sizing: border-box; - cursor: pointer; - display: block; - min-height: 32px; - user-select: none; - -webkit-user-select: none; } - .select2-container .select2-selection--multiple .select2-selection__rendered { - display: inline-block; - overflow: hidden; - padding-left: 8px; - text-overflow: ellipsis; - white-space: nowrap; } - .select2-container .select2-search--inline { - float: left; } - .select2-container .select2-search--inline .select2-search__field { - box-sizing: border-box; - border: none; - font-size: 100%; - margin-top: 5px; - padding: 0; } - .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button { - -webkit-appearance: none; } - -.select2-dropdown { - background-color: white; - border: 1px solid #aaa; - border-radius: 4px; - box-sizing: border-box; - display: block; - position: absolute; - left: -100000px; - width: 100%; - z-index: 1051; } - -.select2-results { - display: block; } - -.select2-results__options { - list-style: none; - margin: 0; - padding: 0; } - -.select2-results__option { - padding: 6px; - user-select: none; - -webkit-user-select: none; } - .select2-results__option[aria-selected] { - cursor: pointer; } - -.select2-container--open .select2-dropdown { - left: 0; } - -.select2-container--open .select2-dropdown--above { - border-bottom: none; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; } - -.select2-container--open .select2-dropdown--below { - border-top: none; - border-top-left-radius: 0; - border-top-right-radius: 0; } - -.select2-search--dropdown { - display: block; - padding: 4px; } - .select2-search--dropdown .select2-search__field { - padding: 4px; - width: 100%; - box-sizing: border-box; } - .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button { - -webkit-appearance: none; } - .select2-search--dropdown.select2-search--hide { - display: none; } - -.select2-close-mask { - border: 0; - margin: 0; - padding: 0; - display: block; - position: fixed; - left: 0; - top: 0; - min-height: 100%; - min-width: 100%; - height: auto; - width: auto; - opacity: 0; - z-index: 99; - background-color: #fff; - filter: alpha(opacity=0); } - -.select2-hidden-accessible { - border: 0 !important; - clip: rect(0 0 0 0) !important; - -webkit-clip-path: inset(50%) !important; - clip-path: inset(50%) !important; - height: 1px !important; - overflow: hidden !important; - padding: 0 !important; - position: absolute !important; - width: 1px !important; - white-space: nowrap !important; } - -.select2-container--default .select2-selection--single { - background-color: #fff; - border: 1px solid #aaa; - border-radius: 4px; } - .select2-container--default .select2-selection--single .select2-selection__rendered { - color: #444; - line-height: 28px; } - .select2-container--default .select2-selection--single .select2-selection__clear { - cursor: pointer; - float: right; - font-weight: bold; } - .select2-container--default .select2-selection--single .select2-selection__placeholder { - color: #999; } - .select2-container--default .select2-selection--single .select2-selection__arrow { - height: 26px; - position: absolute; - top: 1px; - right: 1px; - width: 20px; } - .select2-container--default .select2-selection--single .select2-selection__arrow b { - border-color: #888 transparent transparent transparent; - border-style: solid; - border-width: 5px 4px 0 4px; - height: 0; - left: 50%; - margin-left: -4px; - margin-top: -2px; - position: absolute; - top: 50%; - width: 0; } - -.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear { - float: left; } - -.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow { - left: 1px; - right: auto; } - -.select2-container--default.select2-container--disabled .select2-selection--single { - background-color: #eee; - cursor: default; } - .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear { - display: none; } - -.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b { - border-color: transparent transparent #888 transparent; - border-width: 0 4px 5px 4px; } - -.select2-container--default .select2-selection--multiple { - background-color: white; - border: 1px solid #aaa; - border-radius: 4px; - cursor: text; } - .select2-container--default .select2-selection--multiple .select2-selection__rendered { - box-sizing: border-box; - list-style: none; - margin: 0; - padding: 0 5px; - width: 100%; } - .select2-container--default .select2-selection--multiple .select2-selection__rendered li { - list-style: none; } - .select2-container--default .select2-selection--multiple .select2-selection__clear { - cursor: pointer; - float: right; - font-weight: bold; - margin-top: 5px; - margin-right: 10px; - padding: 1px; } - .select2-container--default .select2-selection--multiple .select2-selection__choice { - background-color: #e4e4e4; - border: 1px solid #aaa; - border-radius: 4px; - cursor: default; - float: left; - margin-right: 5px; - margin-top: 5px; - padding: 0 5px; } - .select2-container--default .select2-selection--multiple .select2-selection__choice__remove { - color: #999; - cursor: pointer; - display: inline-block; - font-weight: bold; - margin-right: 2px; } - .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { - color: #333; } - -.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline { - float: right; } - -.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice { - margin-left: 5px; - margin-right: auto; } - -.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { - margin-left: 2px; - margin-right: auto; } - -.select2-container--default.select2-container--focus .select2-selection--multiple { - border: solid black 1px; - outline: 0; } - -.select2-container--default.select2-container--disabled .select2-selection--multiple { - background-color: #eee; - cursor: default; } - -.select2-container--default.select2-container--disabled .select2-selection__choice__remove { - display: none; } - -.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple { - border-top-left-radius: 0; - border-top-right-radius: 0; } - -.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; } - -.select2-container--default .select2-search--dropdown .select2-search__field { - border: 1px solid #aaa; } - -.select2-container--default .select2-search--inline .select2-search__field { - background: transparent; - border: none; - outline: 0; - box-shadow: none; - -webkit-appearance: textfield; } - -.select2-container--default .select2-results > .select2-results__options { - max-height: 200px; - overflow-y: auto; } - -.select2-container--default .select2-results__option[role=group] { - padding: 0; } - -.select2-container--default .select2-results__option[aria-disabled=true] { - color: #999; } - -.select2-container--default .select2-results__option[aria-selected=true] { - background-color: #ddd; } - -.select2-container--default .select2-results__option .select2-results__option { - padding-left: 1em; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__group { - padding-left: 0; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__option { - margin-left: -1em; - padding-left: 2em; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -2em; - padding-left: 3em; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -3em; - padding-left: 4em; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -4em; - padding-left: 5em; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -5em; - padding-left: 6em; } - -.select2-container--default .select2-results__option--highlighted[aria-selected] { - background-color: #5897fb; - color: white; } - -.select2-container--default .select2-results__group { - cursor: default; - display: block; - padding: 6px; } - -.select2-container--classic .select2-selection--single { - background-color: #f7f7f7; - border: 1px solid #aaa; - border-radius: 4px; - outline: 0; - background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%); - background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%); - background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } - .select2-container--classic .select2-selection--single:focus { - border: 1px solid #5897fb; } - .select2-container--classic .select2-selection--single .select2-selection__rendered { - color: #444; - line-height: 28px; } - .select2-container--classic .select2-selection--single .select2-selection__clear { - cursor: pointer; - float: right; - font-weight: bold; - margin-right: 10px; } - .select2-container--classic .select2-selection--single .select2-selection__placeholder { - color: #999; } - .select2-container--classic .select2-selection--single .select2-selection__arrow { - background-color: #ddd; - border: none; - border-left: 1px solid #aaa; - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; - height: 26px; - position: absolute; - top: 1px; - right: 1px; - width: 20px; - background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%); - background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%); - background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); } - .select2-container--classic .select2-selection--single .select2-selection__arrow b { - border-color: #888 transparent transparent transparent; - border-style: solid; - border-width: 5px 4px 0 4px; - height: 0; - left: 50%; - margin-left: -4px; - margin-top: -2px; - position: absolute; - top: 50%; - width: 0; } - -.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear { - float: left; } - -.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow { - border: none; - border-right: 1px solid #aaa; - border-radius: 0; - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; - left: 1px; - right: auto; } - -.select2-container--classic.select2-container--open .select2-selection--single { - border: 1px solid #5897fb; } - .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow { - background: transparent; - border: none; } - .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b { - border-color: transparent transparent #888 transparent; - border-width: 0 4px 5px 4px; } - -.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single { - border-top: none; - border-top-left-radius: 0; - border-top-right-radius: 0; - background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%); - background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%); - background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } - -.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single { - border-bottom: none; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; - background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%); - background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%); - background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); } - -.select2-container--classic .select2-selection--multiple { - background-color: white; - border: 1px solid #aaa; - border-radius: 4px; - cursor: text; - outline: 0; } - .select2-container--classic .select2-selection--multiple:focus { - border: 1px solid #5897fb; } - .select2-container--classic .select2-selection--multiple .select2-selection__rendered { - list-style: none; - margin: 0; - padding: 0 5px; } - .select2-container--classic .select2-selection--multiple .select2-selection__clear { - display: none; } - .select2-container--classic .select2-selection--multiple .select2-selection__choice { - background-color: #e4e4e4; - border: 1px solid #aaa; - border-radius: 4px; - cursor: default; - float: left; - margin-right: 5px; - margin-top: 5px; - padding: 0 5px; } - .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove { - color: #888; - cursor: pointer; - display: inline-block; - font-weight: bold; - margin-right: 2px; } - .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { - color: #555; } - -.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { - float: right; - margin-left: 5px; - margin-right: auto; } - -.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { - margin-left: 2px; - margin-right: auto; } - -.select2-container--classic.select2-container--open .select2-selection--multiple { - border: 1px solid #5897fb; } - -.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple { - border-top: none; - border-top-left-radius: 0; - border-top-right-radius: 0; } - -.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple { - border-bottom: none; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; } - -.select2-container--classic .select2-search--dropdown .select2-search__field { - border: 1px solid #aaa; - outline: 0; } - -.select2-container--classic .select2-search--inline .select2-search__field { - outline: 0; - box-shadow: none; } - -.select2-container--classic .select2-dropdown { - background-color: white; - border: 1px solid transparent; } - -.select2-container--classic .select2-dropdown--above { - border-bottom: none; } - -.select2-container--classic .select2-dropdown--below { - border-top: none; } - -.select2-container--classic .select2-results > .select2-results__options { - max-height: 200px; - overflow-y: auto; } - -.select2-container--classic .select2-results__option[role=group] { - padding: 0; } - -.select2-container--classic .select2-results__option[aria-disabled=true] { - color: grey; } - -.select2-container--classic .select2-results__option--highlighted[aria-selected] { - background-color: #3875d7; - color: white; } - -.select2-container--classic .select2-results__group { - cursor: default; - display: block; - padding: 6px; } - -.select2-container--classic.select2-container--open .select2-dropdown { - border-color: #5897fb; } diff --git a/new/sip/settings/static/admin/css/vendor/select2/select2.min.css b/new/sip/settings/static/admin/css/vendor/select2/select2.min.css deleted file mode 100644 index 7c18ad5..0000000 --- a/new/sip/settings/static/admin/css/vendor/select2/select2.min.css +++ /dev/null @@ -1 +0,0 @@ -.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px;padding:1px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} diff --git a/new/sip/settings/static/admin/css/widgets.css b/new/sip/settings/static/admin/css/widgets.css deleted file mode 100644 index 14ef12d..0000000 --- a/new/sip/settings/static/admin/css/widgets.css +++ /dev/null @@ -1,574 +0,0 @@ -/* SELECTOR (FILTER INTERFACE) */ - -.selector { - width: 800px; - float: left; -} - -.selector select { - width: 380px; - height: 17.2em; -} - -.selector-available, .selector-chosen { - float: left; - width: 380px; - text-align: center; - margin-bottom: 5px; -} - -.selector-chosen select { - border-top: none; -} - -.selector-available h2, .selector-chosen h2 { - border: 1px solid #ccc; - border-radius: 4px 4px 0 0; -} - -.selector-chosen h2 { - background: #79aec8; - color: #fff; -} - -.selector .selector-available h2 { - background: #f8f8f8; - color: #666; -} - -.selector .selector-filter { - background: white; - border: 1px solid #ccc; - border-width: 0 1px; - padding: 8px; - color: #999; - font-size: 10px; - margin: 0; - text-align: left; -} - -.selector .selector-filter label, -.inline-group .aligned .selector .selector-filter label { - float: left; - margin: 7px 0 0; - width: 18px; - height: 18px; - padding: 0; - overflow: hidden; - line-height: 1; -} - -.selector .selector-available input { - width: 320px; - margin-left: 8px; -} - -.selector ul.selector-chooser { - float: left; - width: 22px; - background-color: #eee; - border-radius: 10px; - margin: 10em 5px 0 5px; - padding: 0; -} - -.selector-chooser li { - margin: 0; - padding: 3px; - list-style-type: none; -} - -.selector select { - padding: 0 10px; - margin: 0 0 10px; - border-radius: 0 0 4px 4px; -} - -.selector-add, .selector-remove { - width: 16px; - height: 16px; - display: block; - text-indent: -3000px; - overflow: hidden; - cursor: default; - opacity: 0.3; -} - -.active.selector-add, .active.selector-remove { - opacity: 1; -} - -.active.selector-add:hover, .active.selector-remove:hover { - cursor: pointer; -} - -.selector-add { - background: url(../img/selector-icons.svg) 0 -96px no-repeat; -} - -.active.selector-add:focus, .active.selector-add:hover { - background-position: 0 -112px; -} - -.selector-remove { - background: url(../img/selector-icons.svg) 0 -64px no-repeat; -} - -.active.selector-remove:focus, .active.selector-remove:hover { - background-position: 0 -80px; -} - -a.selector-chooseall, a.selector-clearall { - display: inline-block; - height: 16px; - text-align: left; - margin: 1px auto 3px; - overflow: hidden; - font-weight: bold; - line-height: 16px; - color: #666; - text-decoration: none; - opacity: 0.3; -} - -a.active.selector-chooseall:focus, a.active.selector-clearall:focus, -a.active.selector-chooseall:hover, a.active.selector-clearall:hover { - color: #447e9b; -} - -a.active.selector-chooseall, a.active.selector-clearall { - opacity: 1; -} - -a.active.selector-chooseall:hover, a.active.selector-clearall:hover { - cursor: pointer; -} - -a.selector-chooseall { - padding: 0 18px 0 0; - background: url(../img/selector-icons.svg) right -160px no-repeat; - cursor: default; -} - -a.active.selector-chooseall:focus, a.active.selector-chooseall:hover { - background-position: 100% -176px; -} - -a.selector-clearall { - padding: 0 0 0 18px; - background: url(../img/selector-icons.svg) 0 -128px no-repeat; - cursor: default; -} - -a.active.selector-clearall:focus, a.active.selector-clearall:hover { - background-position: 0 -144px; -} - -/* STACKED SELECTORS */ - -.stacked { - float: left; - width: 490px; -} - -.stacked select { - width: 480px; - height: 10.1em; -} - -.stacked .selector-available, .stacked .selector-chosen { - width: 480px; -} - -.stacked .selector-available { - margin-bottom: 0; -} - -.stacked .selector-available input { - width: 422px; -} - -.stacked ul.selector-chooser { - height: 22px; - width: 50px; - margin: 0 0 10px 40%; - background-color: #eee; - border-radius: 10px; -} - -.stacked .selector-chooser li { - float: left; - padding: 3px 3px 3px 5px; -} - -.stacked .selector-chooseall, .stacked .selector-clearall { - display: none; -} - -.stacked .selector-add { - background: url(../img/selector-icons.svg) 0 -32px no-repeat; - cursor: default; -} - -.stacked .active.selector-add { - background-position: 0 -32px; - cursor: pointer; -} - -.stacked .active.selector-add:focus, .stacked .active.selector-add:hover { - background-position: 0 -48px; - cursor: pointer; -} - -.stacked .selector-remove { - background: url(../img/selector-icons.svg) 0 0 no-repeat; - cursor: default; -} - -.stacked .active.selector-remove { - background-position: 0 0px; - cursor: pointer; -} - -.stacked .active.selector-remove:focus, .stacked .active.selector-remove:hover { - background-position: 0 -16px; - cursor: pointer; -} - -.selector .help-icon { - background: url(../img/icon-unknown.svg) 0 0 no-repeat; - display: inline-block; - vertical-align: middle; - margin: -2px 0 0 2px; - width: 13px; - height: 13px; -} - -.selector .selector-chosen .help-icon { - background: url(../img/icon-unknown-alt.svg) 0 0 no-repeat; -} - -.selector .search-label-icon { - background: url(../img/search.svg) 0 0 no-repeat; - display: inline-block; - height: 18px; - width: 18px; -} - -/* DATE AND TIME */ - -p.datetime { - line-height: 20px; - margin: 0; - padding: 0; - color: #666; - font-weight: bold; -} - -.datetime span { - white-space: nowrap; - font-weight: normal; - font-size: 11px; - color: #ccc; -} - -.datetime input, .form-row .datetime input.vDateField, .form-row .datetime input.vTimeField { - margin-left: 5px; - margin-bottom: 4px; -} - -table p.datetime { - font-size: 11px; - margin-left: 0; - padding-left: 0; -} - -.datetimeshortcuts .clock-icon, .datetimeshortcuts .date-icon { - position: relative; - display: inline-block; - vertical-align: middle; - height: 16px; - width: 16px; - overflow: hidden; -} - -.datetimeshortcuts .clock-icon { - background: url(../img/icon-clock.svg) 0 0 no-repeat; -} - -.datetimeshortcuts a:focus .clock-icon, -.datetimeshortcuts a:hover .clock-icon { - background-position: 0 -16px; -} - -.datetimeshortcuts .date-icon { - background: url(../img/icon-calendar.svg) 0 0 no-repeat; - top: -1px; -} - -.datetimeshortcuts a:focus .date-icon, -.datetimeshortcuts a:hover .date-icon { - background-position: 0 -16px; -} - -.timezonewarning { - font-size: 11px; - color: #999; -} - -/* URL */ - -p.url { - line-height: 20px; - margin: 0; - padding: 0; - color: #666; - font-size: 11px; - font-weight: bold; -} - -.url a { - font-weight: normal; -} - -/* FILE UPLOADS */ - -p.file-upload { - line-height: 20px; - margin: 0; - padding: 0; - color: #666; - font-size: 11px; - font-weight: bold; -} - -.aligned p.file-upload { - margin-left: 170px; -} - -.file-upload a { - font-weight: normal; -} - -.file-upload .deletelink { - margin-left: 5px; -} - -span.clearable-file-input label { - color: #333; - font-size: 11px; - display: inline; - float: none; -} - -/* CALENDARS & CLOCKS */ - -.calendarbox, .clockbox { - margin: 5px auto; - font-size: 12px; - width: 19em; - text-align: center; - background: white; - border: 1px solid #ddd; - border-radius: 4px; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15); - overflow: hidden; - position: relative; -} - -.clockbox { - width: auto; -} - -.calendar { - margin: 0; - padding: 0; -} - -.calendar table { - margin: 0; - padding: 0; - border-collapse: collapse; - background: white; - width: 100%; -} - -.calendar caption, .calendarbox h2 { - margin: 0; - text-align: center; - border-top: none; - background: #f5dd5d; - font-weight: 700; - font-size: 12px; - color: #333; -} - -.calendar th { - padding: 8px 5px; - background: #f8f8f8; - border-bottom: 1px solid #ddd; - font-weight: 400; - font-size: 12px; - text-align: center; - color: #666; -} - -.calendar td { - font-weight: 400; - font-size: 12px; - text-align: center; - padding: 0; - border-top: 1px solid #eee; - border-bottom: none; -} - -.calendar td.selected a { - background: #79aec8; - color: #fff; -} - -.calendar td.nonday { - background: #f8f8f8; -} - -.calendar td.today a { - font-weight: 700; -} - -.calendar td a, .timelist a { - display: block; - font-weight: 400; - padding: 6px; - text-decoration: none; - color: #444; -} - -.calendar td a:focus, .timelist a:focus, -.calendar td a:hover, .timelist a:hover { - background: #79aec8; - color: white; -} - -.calendar td a:active, .timelist a:active { - background: #417690; - color: white; -} - -.calendarnav { - font-size: 10px; - text-align: center; - color: #ccc; - margin: 0; - padding: 1px 3px; -} - -.calendarnav a:link, #calendarnav a:visited, -#calendarnav a:focus, #calendarnav a:hover { - color: #999; -} - -.calendar-shortcuts { - background: white; - font-size: 11px; - line-height: 11px; - border-top: 1px solid #eee; - padding: 8px 0; - color: #ccc; -} - -.calendarbox .calendarnav-previous, .calendarbox .calendarnav-next { - display: block; - position: absolute; - top: 8px; - width: 15px; - height: 15px; - text-indent: -9999px; - padding: 0; -} - -.calendarnav-previous { - left: 10px; - background: url(../img/calendar-icons.svg) 0 0 no-repeat; -} - -.calendarbox .calendarnav-previous:focus, -.calendarbox .calendarnav-previous:hover { - background-position: 0 -15px; -} - -.calendarnav-next { - right: 10px; - background: url(../img/calendar-icons.svg) 0 -30px no-repeat; -} - -.calendarbox .calendarnav-next:focus, -.calendarbox .calendarnav-next:hover { - background-position: 0 -45px; -} - -.calendar-cancel { - margin: 0; - padding: 4px 0; - font-size: 12px; - background: #eee; - border-top: 1px solid #ddd; - color: #333; -} - -.calendar-cancel:focus, .calendar-cancel:hover { - background: #ddd; -} - -.calendar-cancel a { - color: black; - display: block; -} - -ul.timelist, .timelist li { - list-style-type: none; - margin: 0; - padding: 0; -} - -.timelist a { - padding: 2px; -} - -/* EDIT INLINE */ - -.inline-deletelink { - float: right; - text-indent: -9999px; - background: url(../img/inline-delete.svg) 0 0 no-repeat; - width: 16px; - height: 16px; - border: 0px none; -} - -.inline-deletelink:focus, .inline-deletelink:hover { - cursor: pointer; -} - -/* RELATED WIDGET WRAPPER */ -.related-widget-wrapper { - float: left; /* display properly in form rows with multiple fields */ - overflow: hidden; /* clear floated contents */ -} - -.related-widget-wrapper-link { - opacity: 0.3; -} - -.related-widget-wrapper-link:link { - opacity: .8; -} - -.related-widget-wrapper-link:link:focus, -.related-widget-wrapper-link:link:hover { - opacity: 1; -} - -select + .related-widget-wrapper-link, -.related-widget-wrapper-link + .related-widget-wrapper-link { - margin-left: 7px; -} diff --git a/new/sip/settings/static/admin/fonts/LICENSE.txt b/new/sip/settings/static/admin/fonts/LICENSE.txt deleted file mode 100644 index d645695..0000000 --- a/new/sip/settings/static/admin/fonts/LICENSE.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/new/sip/settings/static/admin/fonts/README.txt b/new/sip/settings/static/admin/fonts/README.txt deleted file mode 100644 index b247bef..0000000 --- a/new/sip/settings/static/admin/fonts/README.txt +++ /dev/null @@ -1,3 +0,0 @@ -Roboto webfont source: https://www.google.com/fonts/specimen/Roboto -WOFF files extracted using https://github.com/majodev/google-webfonts-helper -Weights used in this project: Light (300), Regular (400), Bold (700) diff --git a/new/sip/settings/static/admin/fonts/Roboto-Bold-webfont.woff b/new/sip/settings/static/admin/fonts/Roboto-Bold-webfont.woff deleted file mode 100644 index 6e0f56267035c2321ca6b590adcfc0fc93b7dc51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86184 zcmZ_01$Z2>&M3NRnxtW7ZWtP7W@cvGFf%s|bJ8#;4Kp({Hq6Y-%y75o{O{fO-TS@W z(X8c>Y>%apCEK%Z@?v5DFaQ7mrcew(0sVeS{|3VU<@{eCaS>555McrcoIr#|^+MJD z;tKN0008(m0DwUi05G9@wv`SRS5_4Q0GJH`09bDT0R8u=|DLA2GCdOjz_$h}R1pLQ zDU~%P#x{ob002J&001ou0HBD0xoHp>yE+pA0204IG!p-S=I7T2Q+qQTP;wYlFEa?* z^>1*>%nY4CypnGq8o2+!Hvp=cwTCGHAO&j6xgh{-<9BwF#IiZi#vK60ZVlr54FEu3 z{fdb$FgGy-0>C)_@v{Acx5XJ9b5JG#jFSa~6M=vfmK}53%35rb zD`;=$=qp0#fn`DwOoal2>%PM+mtPMjwz$kJnT20j9G?@jJ z@m@}?(1;POO4jfdfdw_2K3(8Bu@#|a$S{}K0(55oELXtcaO)o$_ssHD;QG9ecX7;9 zYI#-T*-L-80L*(kHS~(KspZ6weD4iQoN#}fo2xl{&5GW zi*U>we-V@3%uISS%V)7I2G3mcD>*hJplI=xR3xj0Whqf zF8Bs=Tg; zT-&;?kIw7Nshe0F NnEW@dXOkKyR?}yvkZ8wQL&uuS_U3)~+lk}gj(#3(&<^9sR z`BJSwiLAZ9^<$%P0O8%a?W#aUXG6vdiq zSroRqwcvweuMA z;=76kgTw(=69?m%HY1DSnA9^4;+VBVlfO*M|9pthe?M^ZeVWz(c!=?RKlF{4VH;4H zm0|CbsT*S((mA!R9>Ji0;A zir@hGOBfCUe4xfKg{siN-wzy4hG9U30pLVV^dT=M1n zr+n3sOGiQ1oc^g@BenKngRHEuu0qJlU`tS;)yiPZC?l4Eid-pFZ@el)BH7M~6Q@wx z&99${WHFYW=WS!_scm0ZB~{u!L;{)o^FJ!D8?I#`nUGQ=fsWTpvQ1tLgJl#XCN^De zaNCBmmvPhWYfM^QD}-zHKBNIOc2xwf{&GvHuBPi2ZVT@gS_gM4d8ZAysd(%4c4P*d zkS}~PSK(_G8&Oxb4wt*{m1`gJ<`B}JMMNZ~xxcM5I86MK~mP%>ahePK_bD1&c}+%wU)+BB(B(e?t{oKe^d zSYW+@p_!Gt$qA1~0s)#8h(SZ^81LI(!!#P6S@zF{*LrC8hkN8ogwL2=Bj=fAQ>L^z z$Q+(|QkbC9-*QqN84aB+q9o8)6CMF8bzSoLWVw z+&Z$CSL~wq0ApytSHXJIiGPOme-7>GC6;i51Rmaj2w7EZQR3&9IO8NzP#Ih3d%!#RC)UZyf zYDvY`X9kGN%R^u{_7eMtq14?DatgndOBu{mkS84ca&;6sY?Z2pNX`On1->{s06N!F_!VJ^_ShVq;;d*^_n)B+E>?Xs)u0$=J|~k zuR`r=2W0)`aH5~Y zHV2_M&qFv5#osBD-%@S=7FE4^F6^XGmFmwnvL z`6&K3MZ^!}imZO*s-C2Z9J%cToa1`AvT3=?a-7|@%94@F^Ocp8R@(xbi#<86ogRXm zJc4~iu5$;1D(0*`Nv=bxtkT=8i{sX#)T|O|y|ew+vqZfTT)lJF)?*jFqScMPAFaDK z8-=eM+q#}xyc>B#8;3rgJK%hUMSR;|gO908E3M%Bu5_%%J*6LW61EVca0!wH*Vf}( z+tx*ixy07iX<UwcToDiGuMciJJ${FTJj>WRu6!)T2I6zh)XFoB}g#RgPpbE!O6J zt=beToLnju%kWnW=ZdTXDc3aCi5-}G_ZOxS+NEQsYFlIisZ7J|AJ_)Xu>?vs zPrt!J)#wI^n1VCJJ7ef;?nLuyP|9i`UE<7HByzFCA(*;#LPa$q$wEc(8l_8Gz`1K+ z+iIY^YUEGG-Z_2+a0HTYgd1~2qjFF+98hHpVrL{;-r`NveLyUnq*_>4AL5dC;zw7eDRRuat+xacQvaEi$N?p6gNi}hg^kIzfIY*5Pr+yTQSsr~ne`n#H59KxiIPMqFD|Co0S)eB zBD)-ahfk)$@J6nadm!uzC4cTEqmTS>QNBbbo57AOM-L=s$wH-l0J{qz_8*@DmDku0 zAOKqeGPVc!?U`UX>rB9vlsh(agbt`)i@Th8Cip-qJi@?~5ebYjzZ28H8xnvMgA+4i z88qS{H)1L@;xaX2JJ|8@rfhgI_70!CChHt*ddlK{56!-&v9rZB+wz*@PHn=3!oG#_ z_zHbj#6Sn{DmjNRCzT7Ms;E@xDOqsxiffDNeI~DU>-^!{%C5pVt)~exfh-Q5t@NZGPQFD4yr3#QsgBO`Ad@Ab}D2htwwLquW zKxjLNM$406+2@b=h2h)n6u`B`&?wHo87f@lZ952Q|haPo|;C<&1~_Lp3KNFxR#27G2l+)HDM zk8b1(n^GtxVE>33>#xl+J@`KR$bO)8KbwvqdF_?L2|O&{w{D`bzSk$ElX0J=7;uhI z;ZX4}alidpfJCsaKoZPnN&(`hw2J>!S}eq?MdaN9DZ|l&8yhNScPHu#*Kg2o@K5?1 zLvn9^Bx`?lWfNff;2lQCdA_3`DB|@wWON(z3^4(Ptb$Roo6;EM`@;_m)tYky$Xj9_%|-EBhcBi1#k9AJPA|?G=^p~pqbdpCB21RdV(m8RG&u3x(cR$V?@%INW=~x z#tPon2yf5`xnKGf)g0dSI~2Ir<7Y+LOTyE`TvFR=K-Ne^5N0k=r*i!NU)fJZY7J^t zLWkl`r9X1Yd=V<0@7g;I8*x%333!pqI}Df-1uaMs)mYL<5ggX>Uv7Ckkdq5$V19q0 z`6f+O^<6!Fbp(H>+BG(^A&zP@Uq`Sdv0eThd7nb5uO?O*v|f(!(hv6`>T|Y4w6e}O2y(Nl8;mCUX;qb)Lk{b zm7PU?iaV+_>L_zMYR@xwV*fDj<6RpP9_0U?y+x%b5tm~iS#ynYOfDK6l7P!M2R;?n z`0Y-RA1>GCJ14d>BkZlY7oomXO$*|y0|3h5o3B)yhe-HX9!KylhhMysQC6=-Mvo>H z`y_D|C$xkR%*<~;+NIbioxMCjP;<1}LrVyhd+5;FHOQ(Dd#X#7yV{3<6e~i2s>xNl zra?Wf{Cy6Q>4CwJ zrXOPat>@?N5Ib{|y;~=@o7qEn=bahRq9c9))|kXl)Pb1eFjRz+?hdb^ z+YMjmn0jir2sz`xCwCOK_uo(c?15;_lO>Zz{t}&GniYNHsCTKg?9K2A1nyimI2SVn zV-Av$-6Z?r^$r?G^oxsDbFhf|4&u@Jw$=rW<9ki_6>mE224YgGtZeHE&d&lAj8rR&CXDwB817b_c;V7(Yx` zMWMi_t5K^aOKczMB#u$DzNn7Yxqut9L|<0_h55HtOSB-|0fsF}c3U$Ap47%r@-sDR z$}njm$03Vp^-|~GdR|bOV%lLD@b~A-Y$wAC*f@jsVsS%u8r`_V*7bU{yY|J=s5&zA zm4|W{Mqldk8n0uXu=!(FMh#pR@^}WB2+SZv(dvRxq^OKZ>|%{j)0amZ6*4Ieew;2# zpf}8+3b`WpXMWfYppVnC_FP z%`Cs^a{QiWv`n7YY$>`qEXSco6#YC~8M~y=l)r_WyuqUvx2e_J=5MgwEq1~?wCl0s zRZQ*WVKxH2-Tz+p;!l6G@RB<{cm@ z13MmeJhqk2gViAKz4`p}7psX;>Zxb13oluvsy;;}=HLGjrkD+CTk#*M*Pk{;3mH+P zMOECZ!D(YF%-Uyo4U(<}+@DzuM-oGk|D)0wopK$*?{p5~w{pgi5%bBGljXXac@=?C zIh3g|P;qwR=W!PMZv9f038xM0(|8T?1n4oM=S+E9>%~6#{CTUKp$^FU$O!%He|}sW z@{JBH3q%;lCoDH*lHlg9a$@1^&@_YH_lG=F5}JYk$RSS6AM5PM)fQGh81}w?FwiCE z5?*6w$#lgyt(n@>&Y_x4N7PRBPKdb;^u(UXkci-3k|!zpD4NKjT28!>F~nik5QbiG zonD__HWZ!zvj^C7xo0c{vC%C;iB3ku)5@$$m!SMecG1SJR@zSxh97XGiyOSKCP!-vL-1e`H z3Mp6Qw(#}-3!@l?R80~Y#Vl$$)S?LHeyDPGf?A(O&)A!jYEkmiII97acWza3wUK`6 zRE_Vb1x$(*s6mR+dW3&v(c&9@q|Kv82k;-3E8gUaV`F`olP0pdtHc=FR zD2drRO>)M3Df`znM+RfmClPv1LekrGB4Sg*n+orlfz>@U+v6c53q z`8^(!5U*2=qJNAY;->2(4d8(oLZwwu`nxvI$j^>!ju{}k|0wE zWI`9u5RFmz9#55O9U8^EEHh&2XI=S^xe!>ly~jcOWPmqX3__U6(y9Jk?Hj3iPKxZL zNRJsl;7au-&KkfwV4`m)ivMfElsGSd`U4MvDwS3OI2)^H=#h)aZ%P~?6d*&F461Em z^gqo3QY(ftQvav41IJ}=;+hB;>IPM1R4JfSi#1yYULL%pv5J~CiKC`2T^U5J7F8M5zZ8|G>npIPO*8YjLK&D&v&mE}&CILxivF;z!Tw)cXL;oISh1Ej^CT2 z{4B94CoTVkVIYJ!^6DoJ7m}#qhVi|n1l33TSuRtuLn4fd&5tlD(2?v93Uov!P_Wgk z|4cMuWgUgD-*~*IxP0|orb^Cqe0=W#iDa6jokDp3;`L-trSSIGWmZVNuk@?+{qqh@ zyI8DESwlr)^7C{^c{N||A%D-l&Iqev%-MNtOZZX9NtY=f{mLWRwF#rmtLgra(f!fY zyoqVs{V`OzcY!%7O9g(MhyD>tZa#JSCe*et-g;dky?!zsF@2lGumDl{3ilKa9X#S_ zj3ExTko3M+CS_vg%l^kQ-yiOdCBDK7`4lFvUjWMvxTtNF`9oZ=jV`h8v(p}b+%Tr)H(q%T)g=XH5! z{W1N7WuG$7kE5`O$ycQ>F!!ox+_r6vZVmI4gi~tb0gWUp(W1*EY_+S=2zLx0p255$ z5e@oM^eOfK_CcL@77f<+lA?DkW8^-0XaD%xsJrc<9C=9izupsAiub7Hqn%LG z-|~)GI&=XkiD|{_*65M{)K+wcG`hVMd)*NL_nXD;XAh^AZ~chScBG@8Dg{=VRj z!L&6gb8@?O(j^)5E7CX*uv9K)kpg6S=AO&asr!p6-^* zR&mR5K0o2uO^*xzV8@6OgCkAB;}EA9(u~i`*H@hn7{Tiw_;}P?ifbWulUo1 z&{#X#_-3H(+=>2?#w<%GIy0Y#^W^uvZs*YBGZ;URyiUVl;l1>U%QuoM<5?vSv994$ z<1MvWK?exmDpFr5$I*CyTxiqwROuPDBv98#ax#>QFcNsLNnzDO=iH}5yFAP5RAZAo z6T#=55_99gH&XOWn|%mF4pnDg81J#dIoUVCtnJ}Bw=Q=;%?#9b3uq7VzAQ4FN<=Zqmf`%)F zgZL!T>|5wZ9Fte?-YyY~f2zOpuvHOxW4m#^`ZIvjJMM2EU$(Oyj|3iVG_q6uVZ`ID z%i|)cgJbb^$;XcJx$HladgAlM2&;+q@C@|59@&sbTkX{HY4Zdhzlr~&?9RUolIz2Q z3H7W8(V6T7Mud(PVfK!0b}t1|Q|SJV>n1ICg4-^t2vk30T?uJ&+i2&;Ap#0igmFLK z`SZ@ZjFID2GS9}Y>1?cMQKgE9%K=OW`_3JWcX!*`_fI!B^?LnmHZhBuwba+0OO-oG zLs0GAo9Sa15gBz=oN--id*p*&Vi*w(Pd@Zq#d<|L@+7h> zvqr1P*H}ZGhQZhl7>6EudMC@z(EBw0iP=jrVBUVX_50x-k;XhtR_W%h&uH*0)4kgU zVv^7W)>muZ%4;HI^Y!jx8t!NmF~H={hxTi+9G~ zKi{~|Om8<2MC`KuM6z&m?BX|i8k@_x7SgPz_JSPsV3g0tM8#-6Jdnen{1>b)l?&wX zrwOz8KmR(=?OEN}J}^-C%@0#a8u!#?sJ^*MG5OOP`a3S_jrzS+(+lP>7&uXy?#DFlAhJuu)mHiSPqzy>|Y*@96lXxq@o4Sloxpf zn|VZk&b^{Ub3JhQ-dg>NO~dMkhco>qj4g~{JhHE5Ys~X3vxh5_+x^}-){NyX)}L()E?=eq)Pu=#AH|y0`QHjD*RL@pKXISeaxMsXck%ms4FWB+ zEmz}>h(DJfk?_B7Ql!pTUk)EpQt*)M7F(H`SVJHqDidyZI7PpRn3OF6<<+mMee76V z5ykqjCM0g2;9=bZ?h~e4v&=7jm#rdSl2ATz^d7s;S@jTKHdlr)BRY;SKd|)a5$bG2 zmIw})T#H_GWejp3Mh0gIBMbf;&d1h`s4oV zrp~`$wdi?Ebm#vH4MXsoG`!=4e70;Ni`4mO%%L|UqAlk?O>w!$*?4O1yt)`z7W%Hg zU4%`9UBb$GZnc@>mW{Egk$K*JHOXJ@`H8cRo_Q?g=J}#u6gr#I(|2MeA|G1pcIrip zJ&vhv-yM1Mr`02eCN6tw=_Pu2eqA8?j_xLhg&Wm5=ak8C|33hkWoj)O!I3b-l zVTd{PpYu3*DbKwu8syX3e84*`sMX7UzhSx9s(ER%=)|piO3>j}bGn`frG6@SIiGL| z?c!M@NdI%h<-$SND^Aigc;3^*Wo}~m!lkhuG{$dPPwdeik7>$r2jtB}ONk$Ho>)a| zxD6tI0x!qRRuAf)lMMeGxcsPz*Hu|Mv^BQ+$r8C8Ny;u0ebeud=lX zgb?!V;D2H0=v}iEaoQ5!mLlMAWP3I?>6tL3F}RBsJn}yQEloY<|2faVak8}g_CrQ4 z1HF}EVw-1WD%ziczhPKVxh@5gFczt#z~;ZIN$-)QJq+mZ4^k5un}&n=kd zzl%AMaPGwoaoEeR;@=H-%fPnrhVVz?`_gyg?|%| z9Xbdp+XW@V=}z(5@VxM487H+xkJbp1ZxV31IMdUB^Q-x?#Jc`I3ENUGCxRr!xKVJy zK^6;gm>k-`D*F4Tb9$}uS)3Y^`WcAbMN`lAVTa5WXW_M8$C~Bw(mi6{KjL?}SuU5H zctBA-!;5Dbwy>XS_^&c}sMPNm&vfa3ixuUy$7D%QQM@r8{d30$?jm`Kzkk?=AgXw>7 zz`ALdc(YZ&Ugk$__c;TfXg4rBBNunK3K-ZQn&PXIdDYcVWL<{_P@9ipB7Qa>fe-cB zI}Z$5YgEGTvjmygn?LA9xG8lpA_SLt%}`~4Y4fxC8ZhxxD7}jJaG(uJ8=O(h6m7L* zOz`D)@U$>i^c}YEebkGc+7~Wt|7`Z^Sy#O?+j6bDB=Q{aS^3T@?q1b@Dvp-Lb5L9vZ5VD(+doxWb(%njUnHY&r)YSjNJ@*=R0vv3g!~_6nKVUYgn0o$P}4f zIyYASTNo`{V|-pBLc*``A;9Zi7jDS#_c>Q@%r@@K#)Mth!=n+k*c|-TT1kOBjkAo9&JIn;MJPgxmC|GZPS^(#k6vV3`GP7p2i9Iwyx^Qxk6(maKR`J8sYvS}&>IT8Yvi37 zt0M5sqWmLpe%kq+P4_Y6cqp39n2Vrj*MZA+r7Ir$+kB_MY?dj{xO-a9xJ%aRHiUSN zja#x}7RSlT*-PDNU*&M6zSqQx_IFpe*|U1K#6un`52d^Ou?yi+wpD`2)ZXuU%#{_; zBg+IoG?JR=YCGylR`1JC*7=9Ec)OPzAplq(R>q1X)OlJpvws?Gpc?QgqEuHG>TGbW zxF_B&ffpm?au>Qj@z;!ft@6!|Xs?70q)@%n{8?9&W)9@Ss;HV~ydtV_>a2I^_iPN| zHXjyMIR@;pn=45#d_O;=L|qdqU1RHzi^)bVm`d_3lMOI;4+N-HPeD}l#s-AY57DfJ zyaTM~STGw0>717O#! z*u`V(f=ZRN-BFfAS)V95`QbN*2GqDmmM18G8vAfex+M{MmVG`m+tUucMEG)T+J67s z!m1uJ(L6YHwJ)Eov%ONi!t)xOS#3nL2wNs?;hgy8o{6_=JywN}2hoU0v#7XB2*KuO z(>S159dc8;puvm2d^#Y<)k~7JlJt4Da`(z#g%?W*z^e{X{ zevf%M{%4KaRFuHJ2&wv{LgLv38EXJV0+YNfb}EIm9RQf zpuUnlF8VS-)$Z>Li$_qOHTUSU3F5i@mFPPR&5(y+YYv35CTO{7+ql}(I(?_nY2px= z;Fs)k3iJN6=50FqgbCdVTopMe&VHI5W@NA3*O4)pbw7=rSBz!nB*{R0ZN>CJbSJcz z;JAX`bc2tLaYFJVG)eZ9AqYNmzLFTU(>X2HHE|2%&lHQp?Z$3=s$=f1dJBp>vER}{ z(MjttkeQ_E#*lh&ut#J_D={k_%m3XbLuP%B|rSH4@Fk3rn<^buvxcJkN3zrYD-x@rjV3+G^xqexdo$7j# zM6gHKw^#>L|l+GEcb&B{%C`1#pRVjo7M%P;L z2wFD`&l%Hkiey+Yh6IY&5ATlDaY}jNymM~$NpNxtiZ_Dr4)5pG?UNw=7F0(l;T^%x zsn;h#!YwEt5Q6-3YG~nd^ezmd9mdBJqDm@Tv$t&eaN+9YE=aT;(kG1ZE-@;Hz^7vp zeTM#3hnQQ$HRz78Qo)}lA($p1h$bO|CLx4I#h+#lbcEB)1=Gw$)65yFA8i~7q2Yv5 zvh?Rp!7{=~n}1K50@CJCX$UFT1ezK_j}M_}8Au;hX#{?+M-Vj!51+z7%dw#pT2%~u z5Ju*L5(00XvR=H;u6WxMhdbOMQg=ZJVFr3X+sLS5JPK)QalnA z$q7LUA`nFLL<4n*NDc*ZP!|3&~B$`M5oz+k;r=k;9)-5b-ks7zxOgmT7`V%B&5i31w zlstlwPzSNBbv{}@Xkt}CV}!}H95hu?DcaN`($qGEPiII~s~L_a9Xq1LQiDwPGTd+q zdx(0PrV);l)O+yzFOUl7zRGIOmoC1;97vC|9MSKkSWsUK@{q-4=O|ZKr`1!Z>0e67 zUc`Op-NhkGNFj#|5(kj%r0CM){ub_e%959mk`DnBYe=^7H7n9IP_4XuE7%L*n##GN z!}I1M_0;f(1{^F+P0}<|)zrv0X>P+-c9iX81DX!J&<7E(11>+0)~SGQI7^w3t`yn- zl2Xf=25$cAR96>xCH*f4iqs9=9vL$gwplsV%^uN?<(Zjf?Rz}wX4oSIBL$@*e1C7` zbc<9RI~J+Otz3#~SUOTbuly!)KHqgMErh{*q9_XIwaWZV(LtJ83yGvssQuxC><`o3!XJwg_E?J+TgKxfbSU`V%WOvn96t!_-W*o<-8 zGBTdh_ro?wa$NWI(t*CwA^SC&Z_6(-#sg2qXbBdBWOZLn!+((Nt$sRz-+_hy!}>uLYZ_br~$ z?<+RywH0v~sYkqI5@S$;h5&U*O{nt>I1>Z>Fex)zoM_V7GH{5?@yd!gd2LCE@A&~! zVJn_Kci0M=Oz$tHvM=X;w3-5TdP&Zp6}}5sX^~zKJj?KsMBYl8MWZSAc}*q)m(IL& z70l~Vd`I@rGI$1qPbA?|d{YgwyhtsxNXFAhX1Xi`A)fJiRpkh0kal^=2wdx5!?2)2B_XRjuz(CGPi7Y!yVHGNQELWC5x=Ow=Zs2{UP{k=AKzi<32G{?eYJtKCtTc}B5zOtfwo2;0?`G%d}nTA$*( z-qE#r#_)DbcJgfr5IPpeaLf$houbO!Q5C&JGW$$;I6L%+-Z_pGbnZy$J5|^zwJE!TISu4+GF-?(GnobEy7kKIbve;>-0i<_fT;*!-e8$P1d z%p@tg-E;Btr&F3ElUk9ouLwLElCq~!G5SqCf0QRCyI67x3BR6SViSs0C`yxLG5b+e z9qsTfG#3!QF^O&{LK!OX-F1}u&mSRSiYYKZ+0?~MGQ3tsXy>z(98`+P9aP{ow542T zF0&b0Mtaw35UdoPZk$d_E>_>4{S{Upc3a9e7wK@D-)k+xj~635ct8gPE&`rE;xR`f zs3Ub|D|+n;(GgSO5ekndiKXmzaP3}2JAL98MU!jv`gh*1g~vmP@LfM8Ki=N0Dyr~? z42i;XL-OPCxZJqSE`8l@`Ktxdh>CXuU$01mm8himKeXCXbgeKS7gq)@wAwiItuWiH z&UgMN*KFj^<6l^TdW~i6YgWi%q*LZ!I`0NX)~DlnC1&4(CD>!Xh36JYGz;qos7HBy zhQIB5TQ>=j@`BFX_n15;w}3bPJ_-a@9$>=wj?(NjdT+9!|O(O6BeocRIC^vjP< zb5f0jM7qXSc=}+P1}5c~l5CRgEh-*fgQiwqAehv6Dk-uwFtWmDV1s~Oue^PZwYv7^ zv*ni62^W(`bIDKzzy8%!%=8OwlvD4%v(0e_?dqh7EWulb#JQK z(sD@&1`Mr3p{sNn3oE#8uJ&;~>h*VB4CVIs(;#r3=2Lee_wvumO@{dtPglZVID>^5 ziDbp263a?4^<%NujL@FSaEPoxow0E+Z~?X`zR54xGQ39AIe%gZaHbY#FE_9$z`0s# z!^DNDJ{+UeB^{tBaqI$%aOm~AVZ;51C192;^M|u#Sl#cWczgwf;!g0;cBmwqSTk6* z14zQrS~{&}Fr&N1DCD+RV$2j53)8Bfh7_DrVa{BT)ziN^_#Dl)7UJ)We%XP?UA46R znb*n7+&zp}C;tI6)^OAx(>>fPHvWw3rP+-P+Gy{-k}w4(03)IK%I50Rt2!q;I6ZK>!U$`t|e{I$$v4wZm)k z{jzN`0I-Du)yP&qF2WS?+e51fiFzI}2D$cT9Hub`tlIzpA=jAjy`GswhVxDf=5**?0q9RnJP?F@JT7D?&T=H8yro))9d{h!! zUTwbqs<*S&PNj0UP73yg6-7U)RysdZr<7`GnMhfzLPM zLQy;)v!Ul=^*g6`t*%A>`~=As`t({d`u&PGHgB=%BkGvixztw0N#9S0on#{S>S(~P zFMx$Nix&->8QBwbt5fS$F_a`I>4xU3?e%nZ`Yc|LyDh$n9TvGA4g^)zghVv-y?vlb zegP@j+w1M=P!oOj3629gy90ic1Gbw(Wl2FrURjZyfjQ9H$kNo-(89z<9tm$<;41_G zz}*4$?Hf^b=)2pEaJ~H9OIUA27g3UgiDS@Afs$4I_QEl|Sp2e4!*XVH43WElEl4{6 zu1)2asWz)@R;#v~>*R$p>5Ntr?GO=3wAwY6of)QD#~YY%sZr`u%M+Y5trf0T&lkvGu|e`e z(}U}-pn}APsEW*vfV}v+h%#*nNaDbRwxVQt5h-5QP!C7}v@ExS)g@E>)lwU6_IVr7 zm=79;7C@(siq*G}TfD}an{vDbW7PCkwtIu$y4H;|_*!}JE4lb9dEi{Rs9brlt+}|Z zc~G9Yn4WovFS&#-#sEkoBuL|L!A4kFL$L11U0dv9-LzwaMznn}<-O1u{r}mSJHVMS z1fdhitg{8f-rNVCb>+|Qy#>qvL;~>pCd43w6wVMx@+CHusY8aJxf_m2c#PpT++)1m zaD(wO^>KXh0Jm#t0|q1Y(j{`F5!`M{ zH)$b5RO*;1-7SP-l4WtyNpTiVaco*~s#bC0N^xe^l(MJTWJv&5NknT&$bn_nft4SI zWh{nONs>j2nt6emMZZYZoY>lawla1xdT;=yoOh&wG-^g3DXr)V|-4hcb zsYJ|VZQ71{Jya`?gzzSB*<49lx@MW5t`1fEJF;MkGd8t}4~I8pSv&IdQ*jlX558^L z&-#1(jj#NrkM-VC3CSmPJ_62R2l+-rENY&rw*xz6ZKh=~%Rfq&q6P8W{n)QTyD7Qd zF)z1$ynp?F=IFis=&#W`2ic!6Hn+Xrei1T4IWZ!_R)cmle*FvDZ0G=;>;R$e0Kez} z&h7x)#veejE_Amf>9eAptDCz2mv{W zg@gTfDFvsn@Yv=h-Oscd+cJy2Ds6E*{XqBD?>Q-+GZD8XEWIU2yCrJ1C4jpnqOB#w zt0m^u;}?`iXoyE3Xo7yo!=J(<9JEYx=`3!52nx2 z5CD=fVLKAYVvId0Le89cJZ6M&t3gCEBF3t!?V_p=Kd&J>uk&MG%Vu6r{=|Z}Ec&Fp z@}x3rrPOAn5`U#&eI>7BrRbgOPXJebUu(f?YhGJx(W~d55KmI=GCnQP7XT4eRYba zV{Z?N8Sj-sZrIHE3B|r=#aCw&UG>Mg_o>Nt>?<}Ga?WmT^6S3B zH@NtcoRTKudT2>uNM|#e#7h*Y?Pb%;#7iXc#7h?7)C^$gWW9*tyo z>9Q33;WHXX!~;o0vJeGh0wY^;$6BkD5iygp7H+7vhUif>sMZFOtuCje&xflOH?rQg zp!WUYw$yg?;!+fkMM(E$?8*lZjY^!Q%4w)0|0>Pn-XKeAq<1{5ab?IUMR`OOHdGQ(fqr38#xrK{p=Rt<1bJ1fvJmmXNE2V9kvY z>9HSA@I#!zjYnP>M)ee5coS))JlZAYZ=JtL>|7^BF4Uls!VyNZ$4A~hJpZ~2_ZLA z2G4vG)>IKv`e2ic;xadAM+(9M3gM;UJRFz@tYvt>7{#@q5288I_#Yprq1BC5U>&4t zJCyh1By