diff --git a/ESSArch_Core/auth/admin.py b/ESSArch_Core/auth/admin.py index 6ec7511fe..bc2f52d80 100644 --- a/ESSArch_Core/auth/admin.py +++ b/ESSArch_Core/auth/admin.py @@ -296,10 +296,30 @@ def log_deletion(self, request, object, message): logger.info(f"User '{request.user}' attempts to delete the group type '{object}' with msg: '{message}'.") +@admin.action(permissions=["change"], description=_("Duplicate selected items")) +def duplicate(modeladmin, request, queryset): + import copy + + from django.db import IntegrityError + from django.utils.text import slugify + for obj in queryset: + obj_copy = copy.copy(obj) + obj_copy.id = None + obj_copy.label = '{} ***'.format(obj_copy.label) + obj_copy.codename = slugify(obj_copy.label) + try: + obj_copy.save() + except IntegrityError: + obj_copy.codename = obj_copy.label + obj_copy.save() + obj_copy.permissions.add(*obj.permissions.all()) + + class GroupMemberRoleAdmin(admin.ModelAdmin): list_display = ('__str__', 'external_id', 'codename') search_fields = ['codename', 'label', 'external_id'] filter_horizontal = ['permissions'] + actions = [duplicate] def log_addition(self, request, object, message): logger.info(f"User '{request.user}' attempts to create role '{object}' with msg: '{message}'.") diff --git a/ESSArch_Core/frontend/static/frontend/scripts/controllers/EventCtrl.js b/ESSArch_Core/frontend/static/frontend/scripts/controllers/EventCtrl.js index b678cda15..976671939 100644 --- a/ESSArch_Core/frontend/static/frontend/scripts/controllers/EventCtrl.js +++ b/ESSArch_Core/frontend/static/frontend/scripts/controllers/EventCtrl.js @@ -19,28 +19,9 @@ export default class EventCtrl { const vm = this; $scope.$translate = $translate; - vm.getCookieName = function () { - let name; - switch ($rootScope.app) { - case 'ESSArch Preservation Platform': - name = 'epp-events-per-page'; - break; - case 'ESSArch Tools For Producer': - name = 'etp-events-per-page'; - break; - case 'ESSArch Tools Archive': - name = 'eta-events-per-page'; - break; - default: - name = 'etp-events-per-page'; - break; - } - return name; - }; - - vm.itemsPerPage = $cookies.get(vm.getCookieName) || 10; + vm.itemsPerPage = $cookies.get('essarch-events-per-page') || 10; $scope.updateEventsPerPage = function (items) { - $cookies.put(vm.getCookieName, items); + $cookies.put('essarch-events-per-page', items); }; $scope.selected = []; vm.displayed = []; diff --git a/ESSArch_Core/frontend/tests/test_login.py b/ESSArch_Core/frontend/tests/test_login.py index 6a6139470..ba26d3dc0 100644 --- a/ESSArch_Core/frontend/tests/test_login.py +++ b/ESSArch_Core/frontend/tests/test_login.py @@ -1,4 +1,7 @@ +from time import sleep + from django.contrib.auth import get_user_model +from selenium.common.exceptions import TimeoutException from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait @@ -22,12 +25,16 @@ def test_login(self): old_url = self.selenium.current_url self.selenium.find_element("xpath", '//button[@type="submit"]').click() - WebDriverWait(self.selenium, 25).until(EC.title_is('Info | ESSArch')) + try: + WebDriverWait(self.selenium, 15).until(EC.title_is('Info | ESSArch')) + except TimeoutException: + sleep(10) + WebDriverWait(self.selenium, 15).until(EC.title_is('Info | ESSArch')) self.assertTrue(EC.url_changes(old_url)) # logout old_url = self.selenium.current_url self.selenium.find_element("class name", 'dropdown-toggle').click() self.selenium.find_element("xpath", '//*[contains(text(), "Logout")]').click() - WebDriverWait(self.selenium, 25).until(EC.title_is('Login | ESSArch')) + WebDriverWait(self.selenium, 15).until(EC.title_is('Login | ESSArch')) self.assertTrue(EC.url_changes(old_url)) diff --git a/requirements/base.txt b/requirements/base.txt index 443d145d3..04e9344b5 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,5 +1,5 @@ asgiref==3.7.2 -boto3==1.34.106 +boto3==1.34.113 celery[tblib]==5.4.0 cffi==1.16.0 channels==4.1.0 @@ -29,7 +29,7 @@ django-json-widget==1.1.1 django-proxy==1.2.2 django-rest-knox==4.2.0 distro==1.9.0 -docker==6.0.1 +docker==7.1.0 drf-dynamic-fields==0.4.0 drf-extensions==0.7.1 drf-proxy-pagination==0.2.0 @@ -40,7 +40,7 @@ gevent==24.2.1 ; platform_system=='Windows' glob2==0.7 jsonfield==3.1.0 lxml==5.2.2 -msoffcrypto-tool==5.4.0 +msoffcrypto-tool==5.4.1 natsort==8.4.0 opf-fido==1.6.1 pyfakefs==5.5.0 @@ -48,7 +48,7 @@ python-dateutil==2.8.2 pywin32==306 ; platform_system=='Windows' redis==5.0.4 regex==2024.5.15 -requests==2.31.0 +requests==2.32.2 requests_toolbelt==1.0.0 tenacity==8.3.0 wand==0.6.13 diff --git a/requirements/tests.txt b/requirements/tests.txt index 5b27be33d..96a08fe3e 100644 --- a/requirements/tests.txt +++ b/requirements/tests.txt @@ -1,3 +1,3 @@ -coverage==7.4.4 +coverage==7.5.2 django-test-without-migrations==0.6 selenium==3.141.0