From ec2532a5948aab894a1e5ca8ec3836356a750ee8 Mon Sep 17 00:00:00 2001 From: Eve Martin Date: Tue, 27 Aug 2024 10:31:06 +0000 Subject: [PATCH 01/25] add pigeon sounds --- game/static/game/js/sound.js | 4 ++++ game/static/game/sound/pigeon.mp3 | Bin 0 -> 57165 bytes game/static/game/sound/pigeon.ogg | Bin 0 -> 22442 bytes 3 files changed, 4 insertions(+) create mode 100644 game/static/game/sound/pigeon.mp3 create mode 100644 game/static/game/sound/pigeon.ogg diff --git a/game/static/game/js/sound.js b/game/static/game/js/sound.js index e9f57fe18..088bd73b9 100644 --- a/game/static/game/js/sound.js +++ b/game/static/game/js/sound.js @@ -43,6 +43,10 @@ ocargo.sound.cowSound = new Howl({ urls: ['/static/game/sound/cow.mp3', '/static/game/sound/cow.ogg'] }); +ocargo.sound.pigeonSound = new Howl({ + urls: ['/static/game/sound/pigeon.mp3', '/static/game/sound/pigeon.ogg'] +}); + function safePlay(sound) { try { sound.play(); diff --git a/game/static/game/sound/pigeon.mp3 b/game/static/game/sound/pigeon.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..2e24497c54810181f1277ec1c37f23e74317c82e GIT binary patch literal 57165 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 Ef5{zVHUIzs literal 0 HcmV?d00001 diff --git a/game/static/game/sound/pigeon.ogg b/game/static/game/sound/pigeon.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f3c39af5c379fa0069b3abff770b5262785b11da GIT binary patch literal 22442 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 VR=BY*^$G38ub06ED*?WT{|CqGPF(;1 literal 0 HcmV?d00001 From 507c927ba1bd2359a83c86e4d0a57610cd6fff13 Mon Sep 17 00:00:00 2001 From: Eve Martin Date: Thu, 29 Aug 2024 14:21:05 +0000 Subject: [PATCH 02/25] add pigeon sound and image --- game/static/game/image/pigeon.svg | 685 ++++++++++++++++++++++++++++++ game/static/game/js/animation.js | 1 + game/static/game/js/cow.js | 1 + game/static/game/js/drawing.js | 3 + game/static/game/js/sound.js | 4 + 5 files changed, 694 insertions(+) create mode 100644 game/static/game/image/pigeon.svg diff --git a/game/static/game/image/pigeon.svg b/game/static/game/image/pigeon.svg new file mode 100644 index 000000000..9988526b6 --- /dev/null +++ b/game/static/game/image/pigeon.svg @@ -0,0 +1,685 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/game/static/game/js/animation.js b/game/static/game/js/animation.js index 2422a1237..7a6a6d9de 100644 --- a/game/static/game/js/animation.js +++ b/game/static/game/js/animation.js @@ -41,6 +41,7 @@ ocargo.Animation.prototype.addCows = function() { for (let i = 0 ; i < cows.length ; i++){ let cow = cows[i]; + console.log(cow.type); for (let j = 0; j < cow.potentialNodes.length; j++) { const cowImage = this.drawing.renderCow(cow.id, cow.potentialNodes[j].coordinate, cow.potentialNodes[j], 0, cow.type); this.numberOfCowsOnMap++; diff --git a/game/static/game/js/cow.js b/game/static/game/js/cow.js index 1f0b1e2f0..801488d52 100644 --- a/game/static/game/js/cow.js +++ b/game/static/game/js/cow.js @@ -49,3 +49,4 @@ ocargo.Cow.ACTIVE = 'ACTIVE'; ocargo.Cow.INACTIVE = 'INACTIVE'; ocargo.Cow.WHITE = 'WHITE'; ocargo.Cow.BROWN = 'BROWN'; +ocargo.Cow.PIGEON = 'PIGEON'; diff --git a/game/static/game/js/drawing.js b/game/static/game/js/drawing.js index e1c23c76b..535464523 100644 --- a/game/static/game/js/drawing.js +++ b/game/static/game/js/drawing.js @@ -1239,6 +1239,8 @@ ocargo.Drawing.cowUrl = function (type) { return ocargo.Drawing.whiteCowUrl case ocargo.Cow.BROWN: return ocargo.Drawing.brownCowUrl + case ocargo.Cow.PIGEON: + return ocargo.Drawing.pigeonUrl default: return ocargo.Drawing.whiteCowUrl } @@ -1282,6 +1284,7 @@ ocargo.Drawing.TOP_VIEW = 'top_view' ocargo.Drawing.whiteCowUrl = 'Clarice.svg' ocargo.Drawing.brownCowUrl = 'Clarice_Jersey.svg' +ocargo.Drawing.pigeonUrl = 'pigeon.svg' ocargo.Drawing.imageDir = '/static/game/image/' ocargo.Drawing.raphaelImageDir = '/static/game/raphael_image/' diff --git a/game/static/game/js/sound.js b/game/static/game/js/sound.js index 088bd73b9..afad8fb40 100644 --- a/game/static/game/js/sound.js +++ b/game/static/game/js/sound.js @@ -100,6 +100,10 @@ ocargo.sound.cow = function() { safePlay(ocargo.sound.cowSound); }; +ocargo.sound.pigeon = function() { + safePlay(ocargo.sound.pigeonSound); +} + ocargo.sound.sound_horn = function() { safePlay(ocargo.sound.hornSound); }; From 74aefadbaa41a25ca94c566991bc507556f37d0a Mon Sep 17 00:00:00 2001 From: Eve Martin Date: Fri, 30 Aug 2024 09:44:59 +0000 Subject: [PATCH 03/25] switch between animals on theme switch, rotate pigeon --- game/static/game/image/pigeon.svg | 257 ++++---- game/static/game/js/level_editor.js | 95 ++- game/static/game/raphael_image/pigeon.svg | 685 ++++++++++++++++++++++ game/templates/game/level_editor.html | 2 +- 4 files changed, 879 insertions(+), 160 deletions(-) create mode 100644 game/static/game/raphael_image/pigeon.svg diff --git a/game/static/game/image/pigeon.svg b/game/static/game/image/pigeon.svg index 9988526b6..9afd7eb16 100644 --- a/game/static/game/image/pigeon.svg +++ b/game/static/game/image/pigeon.svg @@ -1,5 +1,4 @@ - - + - - + + - - + + - + - + - - + + - + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - + - - + + - + - - + + - + - - + + - - + + - - + + - + - + - - + + - + - - + + - + - + - + - + - + - - - + + + - - - + + + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - - + + - + - + - - + + - - - - + + + + - + - + - + - + diff --git a/game/static/game/js/level_editor.js b/game/static/game/js/level_editor.js index 83e7d9327..580dcc04b 100644 --- a/game/static/game/js/level_editor.js +++ b/game/static/game/js/level_editor.js @@ -909,7 +909,7 @@ ocargo.LevelEditor = function(levelId) { var color = COW_GROUP_COLOR_PALETTE[(currentCowGroupId - 1) % COW_GROUP_COLOR_PALETTE.length]; var style = 'background-color: ' + color; var value = 'group' + currentCowGroupId++; - var type = ocargo.Cow.WHITE; + var type = currentTheme == THEMES.city ? ocargo.Cow.PIGEON : ocargo.Cow.WHITE; cowGroups[value] = { id: value, @@ -1857,6 +1857,7 @@ ocargo.LevelEditor = function(levelId) { function handleDraggableCowMouseUp(e){ let internalCow = new InternalCow({group: cowGroups["group1"]}); let image = internalCow.image; + console.log(cowGroups); if (isValidDraggedCowPlacement(controlledCoord)) { internalCow.controlledNode = ocargo.Node.findNodeByCoordinate(controlledCoord, nodes); @@ -2397,6 +2398,25 @@ ocargo.LevelEditor = function(levelId) { }); $('#paper').css({'background-color': theme.background}); + + const animalSource = theme == THEMES.city ? "/static/game/image/pigeon.svg" : "/static/game/image/Clarice.svg"; + + $('#cow').each(function(index, element) { + element.src = animalSource; + }) + + $('#animals_label').each(function(index, element) { + element.innerHTML = theme == THEMES.city ? "Pigeons" : "Cows"; + }) + + for (let i = 0; i < cowGroups.length; i++) { + let cowGroupId = Object.keys(cowGroups)[i]; + cowGroup[cowGroupId] = theme == THEMES.city ? ocargo.Cow.PIGEON : ocargo.Cow.WHITE; + } + + for (let i = 0; i < cows.length; i++) { + cows[i].updateTheme(); + } } function sortNodes(nodes) { @@ -2554,35 +2574,6 @@ ocargo.LevelEditor = function(levelId) { new InternalTrafficLight(trafficLightData[i]); } - if(COW_LEVELS_ENABLED) { - var cowGroupData = JSON.parse(state.cows); - for (var i = 0; i < cowGroupData.length; i++) { - // Add new group to group select element - if (i >= Object.keys(cowGroups).length) { - addCowGroup(); - } - var cowGroupId = Object.keys(cowGroups)[i]; - cowGroups[cowGroupId].minCows = cowGroupData[i].minCows; - cowGroups[cowGroupId].maxCows = cowGroupData[i].maxCows; - cowGroups[cowGroupId].type = cowGroupData[i].type; - - if (cowGroupData[i].potentialCoordinates != null) { - for (var j = 0; j < cowGroupData[i].potentialCoordinates.length; j++) { - var cowData = { - coordinates: [cowGroupData[i].potentialCoordinates[j]], - group: cowGroups[cowGroupId] - }; - new InternalCow(cowData); - } - } - } - - // Trigger change listener on cow group select box to set initial min/max values - $('#cow_group_select').change(); - - markCowNodes(); - } - // Load in destination and origin nodes if (state.destinations) { var houses = JSON.parse(state.destinations); @@ -2630,6 +2621,36 @@ ocargo.LevelEditor = function(levelId) { PAPER_HEIGHT - currentTheme.decor[decor[i].decorName].height - decor[i].y + PAPER_PADDING); } + //Load in cow data + if(COW_LEVELS_ENABLED) { + var cowGroupData = JSON.parse(state.cows); + for (var i = 0; i < cowGroupData.length; i++) { + // Add new group to group select element + if (i >= Object.keys(cowGroups).length) { + addCowGroup(); + } + var cowGroupId = Object.keys(cowGroups)[i]; + cowGroups[cowGroupId].minCows = cowGroupData[i].minCows; + cowGroups[cowGroupId].maxCows = cowGroupData[i].maxCows; + cowGroups[cowGroupId].type = cowGroupData[i].type; + + if (cowGroupData[i].potentialCoordinates != null) { + for (var j = 0; j < cowGroupData[i].potentialCoordinates.length; j++) { + var cowData = { + coordinates: [cowGroupData[i].potentialCoordinates[j]], + group: cowGroups[cowGroupId] + }; + new InternalCow(cowData); + } + } + } + + // Trigger change listener on cow group select box to set initial min/max values + $('#cow_group_select').change(); + + markCowNodes(); + } + // Load in block data if(state.blocks) { for(var i = 0; i < BLOCKS.length; i++) { @@ -2918,6 +2939,20 @@ ocargo.LevelEditor = function(levelId) { }; + this.updateTheme = function() { + console.log(this); + let newType = currentTheme == THEMES.city ? ocargo.Cow.PIGEON : ocargo.Cow.WHITE; + let controlledNode = this.controlledNode; + let coordinates = controlledNode.coordinate; + + this.image.remove(); + + this.image = drawing.createCowImage(newType); + drawing.setCowImagePosition(coordinates, this.image, controlledNode); + + setupCowListeners(this); + } + this.image = drawing.createCowImage(data.group.type); this.valid = false; diff --git a/game/static/game/raphael_image/pigeon.svg b/game/static/game/raphael_image/pigeon.svg new file mode 100644 index 000000000..9988526b6 --- /dev/null +++ b/game/static/game/raphael_image/pigeon.svg @@ -0,0 +1,685 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/game/templates/game/level_editor.html b/game/templates/game/level_editor.html index 5ba7c09c5..f2a36eca7 100644 --- a/game/templates/game/level_editor.html +++ b/game/templates/game/level_editor.html @@ -364,7 +364,7 @@

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 diff --git a/game/static/game/sound/pigeon.ogg b/game/static/game/sound/pigeon.ogg index f3c39af5c379fa0069b3abff770b5262785b11da..c8507fc5a56706c0db45d606d5dcdbdd568e1dde 100644 GIT binary patch delta 2989 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 delta 10710 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 G?f(P1<@? Date: Fri, 30 Aug 2024 11:48:38 +0000 Subject: [PATCH 05/25] write pigeon test, address pigeon edge case --- game/end_to_end_tests/test_level_editor.py | 20 ++++++++++++++++++++ game/static/game/js/level_editor.js | 20 +++++++++++++++----- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/game/end_to_end_tests/test_level_editor.py b/game/end_to_end_tests/test_level_editor.py index c7da90a7f..380d1afcd 100644 --- a/game/end_to_end_tests/test_level_editor.py +++ b/game/end_to_end_tests/test_level_editor.py @@ -289,3 +289,23 @@ def test_electric_fuel_gauge(self): ) electric_fuel_gauge = self.selenium.find_element(By.ID, "electricFuelGauge") assert "visibility: visible" in electric_fuel_gauge.get_attribute("style") + + def test_pigeon(self): + page = self.go_to_level_editor() + [road_start, road_end] = self.set_up_basic_map() + + source_cow = self.selenium.find_element(By.ID, "cow") + end_space = self.selenium.find_element( + By.CSS_SELECTOR, "rect[x='230'][y='530']" + ) + ActionChains(self.selenium).drag_and_drop(source_cow, end_space).perform() + + Select(self.selenium.find_element(By.ID, "theme_select")).select_by_value( + "city" + ) + + pigeon = self.selenium.find_elements(By.CSS_SELECTOR, "image[href='/static/game/raphael_image/pigeon.svg']") + nonexistent_cow = self.selenium.find_elements(By.CSS_SELECTOR, "image[href='/static/game/raphael_image/Clarice.svg']") + + assert len(pigeon) == 1 + assert len(nonexistent_cow) == 0 diff --git a/game/static/game/js/level_editor.js b/game/static/game/js/level_editor.js index 28ff9c744..fe9d6df82 100644 --- a/game/static/game/js/level_editor.js +++ b/game/static/game/js/level_editor.js @@ -1857,7 +1857,6 @@ ocargo.LevelEditor = function(levelId) { function handleDraggableCowMouseUp(e){ let internalCow = new InternalCow({group: cowGroups["group1"]}); let image = internalCow.image; - console.log(cowGroups); if (isValidDraggedCowPlacement(controlledCoord)) { internalCow.controlledNode = ocargo.Node.findNodeByCoordinate(controlledCoord, nodes); @@ -2939,15 +2938,26 @@ ocargo.LevelEditor = function(levelId) { }; this.updateTheme = function() { - console.log(this); let newType = currentTheme == THEMES.city ? ocargo.Cow.PIGEON : ocargo.Cow.WHITE; - let controlledNode = this.controlledNode; - let coordinates = controlledNode.coordinate; + let transformDimensions = this["image"]["_"]["transform"][0] + let rotateDimensions = this["image"]["_"]["transform"][1] + let x = transformDimensions[1] + let y = transformDimensions[2] + let r = 0; + if (rotateDimensions) { + r = rotateDimensions[1]; + } this.image.remove(); this.image = drawing.createCowImage(newType); - drawing.setCowImagePosition(coordinates, this.image, controlledNode); + if (this.controlledNode !== null) { + let controlledNode = this.controlledNode; + let coordinates = controlledNode.coordinate; + drawing.setCowImagePosition(coordinates, this.image, controlledNode); + } else { + this.image.transform("t" + x + "," + y + " r" + r); + } setupCowListeners(this); } From ab7973f09327c00a3ed08c6de41952116169d0f2 Mon Sep 17 00:00:00 2001 From: Eve Martin Date: Fri, 30 Aug 2024 11:51:22 +0000 Subject: [PATCH 06/25] change descriptions to be more general --- game/static/game/js/cow.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/game/static/game/js/cow.js b/game/static/game/js/cow.js index 98b834029..03eedb410 100644 --- a/game/static/game/js/cow.js +++ b/game/static/game/js/cow.js @@ -27,13 +27,13 @@ ocargo.Cow.prototype.queueLeaveAnimation = function(model, node) { ocargo.animation.appendAnimation({ type: 'callable', functionCall: this.type == ocargo.Cow.PIGEON ? ocargo.sound.pigeon : ocargo.sound.cow, - description: 'cow sound' + description: 'animal sound' }); ocargo.animation.appendAnimation({ type: 'cow_leave', id: this.id, coordinate: node.coordinate, - description: 'Cow leaving' + description: 'animal leaving' }); }; From fbc314c0cc8e4b2bceb16a79deb01bc65e9acdc1 Mon Sep 17 00:00:00 2001 From: Eve Martin Date: Fri, 30 Aug 2024 12:04:25 +0000 Subject: [PATCH 07/25] modify test slightly --- game/end_to_end_tests/test_level_editor.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/game/end_to_end_tests/test_level_editor.py b/game/end_to_end_tests/test_level_editor.py index 380d1afcd..7862c9978 100644 --- a/game/end_to_end_tests/test_level_editor.py +++ b/game/end_to_end_tests/test_level_editor.py @@ -292,11 +292,10 @@ def test_electric_fuel_gauge(self): def test_pigeon(self): page = self.go_to_level_editor() - [road_start, road_end] = self.set_up_basic_map() source_cow = self.selenium.find_element(By.ID, "cow") end_space = self.selenium.find_element( - By.CSS_SELECTOR, "rect[x='230'][y='530']" + By.CSS_SELECTOR, "rect[x='130'][y='530']" ) ActionChains(self.selenium).drag_and_drop(source_cow, end_space).perform() From 59f7e08478df015a0c1866079412ddb6351aa7f1 Mon Sep 17 00:00:00 2001 From: Eve Martin Date: Fri, 30 Aug 2024 12:11:14 +0000 Subject: [PATCH 08/25] add line to test that I forgot --- game/end_to_end_tests/test_level_editor.py | 1 + 1 file changed, 1 insertion(+) diff --git a/game/end_to_end_tests/test_level_editor.py b/game/end_to_end_tests/test_level_editor.py index 7862c9978..041f89fd2 100644 --- a/game/end_to_end_tests/test_level_editor.py +++ b/game/end_to_end_tests/test_level_editor.py @@ -292,6 +292,7 @@ def test_electric_fuel_gauge(self): def test_pigeon(self): page = self.go_to_level_editor() + page.go_to_scenery_tab() source_cow = self.selenium.find_element(By.ID, "cow") end_space = self.selenium.find_element( From f8e7f1eeecb9bb29ddf83347f0701aef03a5d500 Mon Sep 17 00:00:00 2001 From: Eve Martin Date: Fri, 30 Aug 2024 12:28:36 +0000 Subject: [PATCH 09/25] add line to test to wait for element --- game/end_to_end_tests/test_level_editor.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/game/end_to_end_tests/test_level_editor.py b/game/end_to_end_tests/test_level_editor.py index 041f89fd2..c5bb47623 100644 --- a/game/end_to_end_tests/test_level_editor.py +++ b/game/end_to_end_tests/test_level_editor.py @@ -291,6 +291,8 @@ def test_electric_fuel_gauge(self): assert "visibility: visible" in electric_fuel_gauge.get_attribute("style") def test_pigeon(self): + """ Test that cows on the map automatically become pigeons when the theme is changed to "city" + """ page = self.go_to_level_editor() page.go_to_scenery_tab() @@ -304,6 +306,10 @@ def test_pigeon(self): "city" ) + assert WebDriverWait(self.selenium, DELAY_TIME).until( + EC.presence_of_element_located((By.CSS_SELECTOR, "image[href='/static/game/raphael_image/pigeon.svg']")) + ) + pigeon = self.selenium.find_elements(By.CSS_SELECTOR, "image[href='/static/game/raphael_image/pigeon.svg']") nonexistent_cow = self.selenium.find_elements(By.CSS_SELECTOR, "image[href='/static/game/raphael_image/Clarice.svg']") From 25c3c0f2fa40603100ee4da67ea63851a1ff5c1d Mon Sep 17 00:00:00 2001 From: Eve Martin Date: Fri, 30 Aug 2024 12:40:30 +0000 Subject: [PATCH 10/25] use xpath instead of css_selector --- game/end_to_end_tests/test_level_editor.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/game/end_to_end_tests/test_level_editor.py b/game/end_to_end_tests/test_level_editor.py index c5bb47623..e728e4efb 100644 --- a/game/end_to_end_tests/test_level_editor.py +++ b/game/end_to_end_tests/test_level_editor.py @@ -310,8 +310,8 @@ def test_pigeon(self): EC.presence_of_element_located((By.CSS_SELECTOR, "image[href='/static/game/raphael_image/pigeon.svg']")) ) - pigeon = self.selenium.find_elements(By.CSS_SELECTOR, "image[href='/static/game/raphael_image/pigeon.svg']") - nonexistent_cow = self.selenium.find_elements(By.CSS_SELECTOR, "image[href='/static/game/raphael_image/Clarice.svg']") + pigeon = self.selenium.find_elements(By.XPATH, "//image[contains(@href, 'pigeon')]]") + nonexistent_cow = self.selenium.find_elements(By.XPATH, "//image[contains(@href, 'Clarice')]") assert len(pigeon) == 1 assert len(nonexistent_cow) == 0 From b0d8eef5914718f1b2abdb58c7e42bbb8ccbd0ad Mon Sep 17 00:00:00 2001 From: Eve Martin Date: Fri, 30 Aug 2024 12:43:40 +0000 Subject: [PATCH 11/25] get rid of unnecessary check --- game/end_to_end_tests/test_level_editor.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/game/end_to_end_tests/test_level_editor.py b/game/end_to_end_tests/test_level_editor.py index e728e4efb..1ee1c357d 100644 --- a/game/end_to_end_tests/test_level_editor.py +++ b/game/end_to_end_tests/test_level_editor.py @@ -306,10 +306,6 @@ def test_pigeon(self): "city" ) - assert WebDriverWait(self.selenium, DELAY_TIME).until( - EC.presence_of_element_located((By.CSS_SELECTOR, "image[href='/static/game/raphael_image/pigeon.svg']")) - ) - pigeon = self.selenium.find_elements(By.XPATH, "//image[contains(@href, 'pigeon')]]") nonexistent_cow = self.selenium.find_elements(By.XPATH, "//image[contains(@href, 'Clarice')]") From c0498c6a39fe169f8a7d2a844c5f5a4d821cdd17 Mon Sep 17 00:00:00 2001 From: Eve Martin Date: Fri, 30 Aug 2024 12:48:26 +0000 Subject: [PATCH 12/25] fix typo --- game/end_to_end_tests/test_level_editor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game/end_to_end_tests/test_level_editor.py b/game/end_to_end_tests/test_level_editor.py index 1ee1c357d..13938e491 100644 --- a/game/end_to_end_tests/test_level_editor.py +++ b/game/end_to_end_tests/test_level_editor.py @@ -306,7 +306,7 @@ def test_pigeon(self): "city" ) - pigeon = self.selenium.find_elements(By.XPATH, "//image[contains(@href, 'pigeon')]]") + pigeon = self.selenium.find_elements(By.XPATH, "//image[contains(@href, 'pigeon')]") nonexistent_cow = self.selenium.find_elements(By.XPATH, "//image[contains(@href, 'Clarice')]") assert len(pigeon) == 1 From 70dc1e1be701279ca1fac157902df76303a7a863 Mon Sep 17 00:00:00 2001 From: Eve Martin Date: Fri, 30 Aug 2024 12:58:06 +0000 Subject: [PATCH 13/25] test out adding delay to test --- game/end_to_end_tests/test_level_editor.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/game/end_to_end_tests/test_level_editor.py b/game/end_to_end_tests/test_level_editor.py index 13938e491..084ebe526 100644 --- a/game/end_to_end_tests/test_level_editor.py +++ b/game/end_to_end_tests/test_level_editor.py @@ -306,6 +306,10 @@ def test_pigeon(self): "city" ) + assert WebDriverWait(self.selenium, DELAY_TIME).until( + EC.presence_of_element_located((By.XPATH, "//image[contains(@href, 'pigeon')]")) + ) + pigeon = self.selenium.find_elements(By.XPATH, "//image[contains(@href, 'pigeon')]") nonexistent_cow = self.selenium.find_elements(By.XPATH, "//image[contains(@href, 'Clarice')]") From 8f710f8a7ee1051b2fc25f370970d638a6fb765d Mon Sep 17 00:00:00 2001 From: Eve Martin Date: Fri, 30 Aug 2024 13:04:46 +0000 Subject: [PATCH 14/25] check that cow is there --- game/end_to_end_tests/test_level_editor.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/game/end_to_end_tests/test_level_editor.py b/game/end_to_end_tests/test_level_editor.py index 084ebe526..7c0153ae8 100644 --- a/game/end_to_end_tests/test_level_editor.py +++ b/game/end_to_end_tests/test_level_editor.py @@ -302,15 +302,20 @@ def test_pigeon(self): ) ActionChains(self.selenium).drag_and_drop(source_cow, end_space).perform() + cow = self.selenium.find_elements(By.XPATH, "//image[contains(@href, 'Clarice')]") + assert that len(cow) == 1 + Select(self.selenium.find_element(By.ID, "theme_select")).select_by_value( "city" ) - assert WebDriverWait(self.selenium, DELAY_TIME).until( - EC.presence_of_element_located((By.XPATH, "//image[contains(@href, 'pigeon')]")) - ) + nonexistent_cow = self.selenium.find_elements(By.XPATH, "//image[contains(@href, 'Clarice')]") + + # assert WebDriverWait(self.selenium, DELAY_TIME).until( + # EC.presence_of_element_located((By.XPATH, "//image[contains(@href, 'pigeon')]")) + # ) - pigeon = self.selenium.find_elements(By.XPATH, "//image[contains(@href, 'pigeon')]") + # pigeon = self.selenium.find_elements(By.XPATH, "//image[contains(@href, 'pigeon')]") nonexistent_cow = self.selenium.find_elements(By.XPATH, "//image[contains(@href, 'Clarice')]") assert len(pigeon) == 1 From 5e3b42c976871d573fd8511d0f86e5b346637b08 Mon Sep 17 00:00:00 2001 From: Eve Martin Date: Fri, 30 Aug 2024 13:08:33 +0000 Subject: [PATCH 15/25] fix typo --- game/end_to_end_tests/test_level_editor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game/end_to_end_tests/test_level_editor.py b/game/end_to_end_tests/test_level_editor.py index 7c0153ae8..ec3421866 100644 --- a/game/end_to_end_tests/test_level_editor.py +++ b/game/end_to_end_tests/test_level_editor.py @@ -303,7 +303,7 @@ def test_pigeon(self): ActionChains(self.selenium).drag_and_drop(source_cow, end_space).perform() cow = self.selenium.find_elements(By.XPATH, "//image[contains(@href, 'Clarice')]") - assert that len(cow) == 1 + assert len(cow) == 1 Select(self.selenium.find_element(By.ID, "theme_select")).select_by_value( "city" From 3ca336aa927e9fe1d4c97beedbac7233f290cc18 Mon Sep 17 00:00:00 2001 From: Eve Martin Date: Fri, 30 Aug 2024 13:15:25 +0000 Subject: [PATCH 16/25] test the test --- game/end_to_end_tests/test_level_editor.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/game/end_to_end_tests/test_level_editor.py b/game/end_to_end_tests/test_level_editor.py index ec3421866..579b2c4e3 100644 --- a/game/end_to_end_tests/test_level_editor.py +++ b/game/end_to_end_tests/test_level_editor.py @@ -302,6 +302,14 @@ def test_pigeon(self): ) ActionChains(self.selenium).drag_and_drop(source_cow, end_space).perform() + scenery_cow = self.selenium.find_elements( + By.CSS_SELECTOR, "image[x='0'][y='0']" + ) + assert len(scenery_cow) == 1 + cow_link = scenery_cow[0].get_attribute("href") + assert cow_link == "this will fail I just want to see what the link is" + + cow = self.selenium.find_elements(By.XPATH, "//image[contains(@href, 'Clarice')]") assert len(cow) == 1 @@ -309,14 +317,12 @@ def test_pigeon(self): "city" ) - nonexistent_cow = self.selenium.find_elements(By.XPATH, "//image[contains(@href, 'Clarice')]") - # assert WebDriverWait(self.selenium, DELAY_TIME).until( # EC.presence_of_element_located((By.XPATH, "//image[contains(@href, 'pigeon')]")) # ) # pigeon = self.selenium.find_elements(By.XPATH, "//image[contains(@href, 'pigeon')]") - nonexistent_cow = self.selenium.find_elements(By.XPATH, "//image[contains(@href, 'Clarice')]") + # nonexistent_cow = self.selenium.find_elements(By.XPATH, "//image[contains(@href, 'Clarice')]") - assert len(pigeon) == 1 - assert len(nonexistent_cow) == 0 + # assert len(pigeon) == 1 + # assert len(nonexistent_cow) == 0 From 327a27e04a5320ef03016c5af4fdddd5775aa1db Mon Sep 17 00:00:00 2001 From: Eve Martin Date: Fri, 30 Aug 2024 13:22:32 +0000 Subject: [PATCH 17/25] test if xpath works at all in this case --- game/end_to_end_tests/test_level_editor.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/game/end_to_end_tests/test_level_editor.py b/game/end_to_end_tests/test_level_editor.py index 579b2c4e3..6217609c4 100644 --- a/game/end_to_end_tests/test_level_editor.py +++ b/game/end_to_end_tests/test_level_editor.py @@ -307,22 +307,18 @@ def test_pigeon(self): ) assert len(scenery_cow) == 1 cow_link = scenery_cow[0].get_attribute("href") - assert cow_link == "this will fail I just want to see what the link is" + assert cow_link == "/static/game/raphael_image/Clarice.svg" - cow = self.selenium.find_elements(By.XPATH, "//image[contains(@href, 'Clarice')]") + cow = self.selenium.find_elements(By.XPATH, "//image[@href='/static/game/raphael_image/Clarice.svg']") assert len(cow) == 1 Select(self.selenium.find_element(By.ID, "theme_select")).select_by_value( "city" ) - # assert WebDriverWait(self.selenium, DELAY_TIME).until( - # EC.presence_of_element_located((By.XPATH, "//image[contains(@href, 'pigeon')]")) - # ) - - # pigeon = self.selenium.find_elements(By.XPATH, "//image[contains(@href, 'pigeon')]") - # nonexistent_cow = self.selenium.find_elements(By.XPATH, "//image[contains(@href, 'Clarice')]") + # pigeon = self.selenium.find_elements(By.XPATH, "//image[@href='/static/game/raphael_image/pigeon.svg']") + # nonexistent_cow = self.selenium.find_elements(By.XPATH, "//image[@href='/static/game/raphael_image/Clarice.svg']") # assert len(pigeon) == 1 # assert len(nonexistent_cow) == 0 From b856333f91a13388cd561f6b43f67d9b58889c6f Mon Sep 17 00:00:00 2001 From: Eve Martin Date: Fri, 30 Aug 2024 13:26:48 +0000 Subject: [PATCH 18/25] switch back to using css_selector --- game/end_to_end_tests/test_level_editor.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/game/end_to_end_tests/test_level_editor.py b/game/end_to_end_tests/test_level_editor.py index 6217609c4..b37130180 100644 --- a/game/end_to_end_tests/test_level_editor.py +++ b/game/end_to_end_tests/test_level_editor.py @@ -305,20 +305,15 @@ def test_pigeon(self): scenery_cow = self.selenium.find_elements( By.CSS_SELECTOR, "image[x='0'][y='0']" ) - assert len(scenery_cow) == 1 cow_link = scenery_cow[0].get_attribute("href") assert cow_link == "/static/game/raphael_image/Clarice.svg" - - cow = self.selenium.find_elements(By.XPATH, "//image[@href='/static/game/raphael_image/Clarice.svg']") - assert len(cow) == 1 - Select(self.selenium.find_element(By.ID, "theme_select")).select_by_value( "city" ) - # pigeon = self.selenium.find_elements(By.XPATH, "//image[@href='/static/game/raphael_image/pigeon.svg']") - # nonexistent_cow = self.selenium.find_elements(By.XPATH, "//image[@href='/static/game/raphael_image/Clarice.svg']") - - # assert len(pigeon) == 1 - # assert len(nonexistent_cow) == 0 + scenery_pigeon = self.selenium.find_elements( + By.CSS_SELECTOR, "image[x='0'][y='0']" + ) + pigeon_link = scenery_pigeon[0].get_attribute("href") + assert pigeon_link == "/static/game/raphael_image/pigeon.svg" From 938e26f9e0c8fcfc6d79b3c81e95bf16824aa75e Mon Sep 17 00:00:00 2001 From: Eve Martin Date: Fri, 30 Aug 2024 13:38:51 +0000 Subject: [PATCH 19/25] test out a small change to the test --- game/end_to_end_tests/test_level_editor.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/game/end_to_end_tests/test_level_editor.py b/game/end_to_end_tests/test_level_editor.py index b37130180..5bb8ceaf7 100644 --- a/game/end_to_end_tests/test_level_editor.py +++ b/game/end_to_end_tests/test_level_editor.py @@ -302,18 +302,15 @@ def test_pigeon(self): ) ActionChains(self.selenium).drag_and_drop(source_cow, end_space).perform() - scenery_cow = self.selenium.find_elements( + scenery_animal = self.selenium.find_elements( By.CSS_SELECTOR, "image[x='0'][y='0']" ) - cow_link = scenery_cow[0].get_attribute("href") + cow_link = scenery_animal[0].get_attribute("href") assert cow_link == "/static/game/raphael_image/Clarice.svg" Select(self.selenium.find_element(By.ID, "theme_select")).select_by_value( "city" ) - scenery_pigeon = self.selenium.find_elements( - By.CSS_SELECTOR, "image[x='0'][y='0']" - ) - pigeon_link = scenery_pigeon[0].get_attribute("href") + pigeon_link = scenery_animal[0].get_attribute("href") assert pigeon_link == "/static/game/raphael_image/pigeon.svg" From 9d5e90bc78eaad44a91685327b7e727bfa54be33 Mon Sep 17 00:00:00 2001 From: Eve Martin Date: Fri, 30 Aug 2024 13:43:45 +0000 Subject: [PATCH 20/25] undo small change, run black --- game/end_to_end_tests/test_level_editor.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/game/end_to_end_tests/test_level_editor.py b/game/end_to_end_tests/test_level_editor.py index 5bb8ceaf7..fda0bb0c4 100644 --- a/game/end_to_end_tests/test_level_editor.py +++ b/game/end_to_end_tests/test_level_editor.py @@ -291,8 +291,7 @@ def test_electric_fuel_gauge(self): assert "visibility: visible" in electric_fuel_gauge.get_attribute("style") def test_pigeon(self): - """ Test that cows on the map automatically become pigeons when the theme is changed to "city" - """ + """Test that cows on the map automatically become pigeons when the theme is changed to "city" """ page = self.go_to_level_editor() page.go_to_scenery_tab() @@ -302,15 +301,18 @@ def test_pigeon(self): ) ActionChains(self.selenium).drag_and_drop(source_cow, end_space).perform() - scenery_animal = self.selenium.find_elements( + scenery_cow = self.selenium.find_elements( By.CSS_SELECTOR, "image[x='0'][y='0']" ) - cow_link = scenery_animal[0].get_attribute("href") + cow_link = scenery_cow[0].get_attribute("href") assert cow_link == "/static/game/raphael_image/Clarice.svg" Select(self.selenium.find_element(By.ID, "theme_select")).select_by_value( "city" ) - pigeon_link = scenery_animal[0].get_attribute("href") + scenery_pigeon = self.selenium.find_elements( + By.CSS_SELECTOR, "image[x='0'][y='0']" + ) + pigeon_link = scenery_pigeon[0].get_attribute("href") assert pigeon_link == "/static/game/raphael_image/pigeon.svg" From aa55222c126f3b7f3195d1822a249e339c982cfb Mon Sep 17 00:00:00 2001 From: faucomte97 Date: Mon, 2 Sep 2024 16:28:08 +0100 Subject: [PATCH 21/25] Install latest portal --- Pipfile.lock | 637 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 627 insertions(+), 10 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 22bc135e2..fff78289a 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "bbb811b94400b98a360b492760ea36f4e2cb9376ffd9ef70757a1c403aa8f240" + "sha256": "99757dfdead709146cd48636b7540e953db720f2f814fcd852c05ef26b737c1f" }, "pipfile-spec": 6, "requires": { @@ -41,10 +41,10 @@ }, "cfl-common": { "hashes": [ - "sha256:520ae556c4f7a1c0f62702dc4da4ef821f56374b66e80fb5fcd8d61f20681173", - "sha256:78b9610c748cc6de5561808f28bb0bce39c509324048cc9b62f242123c531231" + "sha256:27e9da29befec4bda55c2160781103e640ca804e0a07c1c30b0094490e048a56", + "sha256:4e2ea706899d4bfa77b6e02d19c2939ea77a70bcf206d8b50db8a44baa73f905" ], - "version": "==7.2.0" + "version": "==7.2.1" }, "charset-normalizer": { "hashes": [ @@ -244,11 +244,11 @@ }, "executing": { "hashes": [ - "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147", - "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc" + "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf", + "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab" ], - "markers": "python_version >= '3.5'", - "version": "==2.0.1" + "markers": "python_version >= '3.8'", + "version": "==2.1.0" }, "idna": { "hashes": [ @@ -478,7 +478,7 @@ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.9.0.post0" }, "pytz": { @@ -513,7 +513,7 @@ "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.16.0" }, "sqlparse": { @@ -633,6 +633,109 @@ "markers": "python_version >= '3.6'", "version": "==2024.8.30" }, + "cfl-common": { + "hashes": [ + "sha256:27e9da29befec4bda55c2160781103e640ca804e0a07c1c30b0094490e048a56", + "sha256:4e2ea706899d4bfa77b6e02d19c2939ea77a70bcf206d8b50db8a44baa73f905" + ], + "version": "==7.2.1" + }, + "charset-normalizer": { + "hashes": [ + "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", + "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", + "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", + "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", + "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", + "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", + "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", + "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", + "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", + "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", + "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", + "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", + "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", + "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", + "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", + "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", + "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", + "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", + "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", + "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", + "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", + "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", + "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", + "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", + "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", + "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", + "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", + "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", + "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", + "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", + "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", + "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", + "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", + "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", + "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", + "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", + "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", + "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", + "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", + "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", + "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", + "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", + "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", + "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", + "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", + "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", + "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", + "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", + "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", + "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", + "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", + "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", + "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", + "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", + "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", + "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", + "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", + "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", + "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", + "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", + "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", + "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", + "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", + "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", + "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", + "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", + "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", + "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", + "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", + "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", + "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", + "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", + "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", + "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", + "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", + "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", + "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", + "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", + "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", + "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", + "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", + "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", + "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", + "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", + "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", + "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", + "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", + "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", + "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", + "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==3.3.2" + }, "click": { "hashes": [ "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", @@ -641,6 +744,14 @@ "markers": "python_version >= '3.7'", "version": "==8.1.7" }, + "codeforlife-portal": { + "hashes": [ + "sha256:a2ff374e2fb259ce2be2546c4c85f0a803c50708034e5939d5485da57ec70adc", + "sha256:bc26d1503bd591aaf048e59631d68ca75a3e428726b75a2bbc6ca07a12417877" + ], + "index": "pypi", + "version": "==7.2.1" + }, "diff-match-patch": { "hashes": [ "sha256:953019cdb9c9d2c9e47b5b12bcff3cf4746fc4598eb406076fa1fc27e6a1f15c", @@ -657,6 +768,35 @@ "markers": "python_version >= '3.6'", "version": "==3.2.25" }, + "django-classy-tags": { + "hashes": [ + "sha256:25eb4f95afee396148683bfb4811b83b3f5729218d73ad0a3399271a6f9fcc49", + "sha256:d59d98bdf96a764dcf7a2929a86439d023b283a9152492811c7e44fc47555bc9" + ], + "version": "==2.0.0" + }, + "django-countries": { + "hashes": [ + "sha256:5a4ee958f77810bcc38ae96605e47d76a707e81f53cf2938743ef45faafd2fce", + "sha256:b6b439cc5c7e766ec2335615160fdcebb9f2774ccc17aaa5e173306832d77594" + ], + "version": "==7.3.1" + }, + "django-csp": { + "hashes": [ + "sha256:01443a07723f9a479d498bd7bb63571aaa771e690f64bde515db6cdb76e8041a", + "sha256:01eda02ad3f10261c74131cdc0b5a6a62b7c7ad4fd017fbefb7a14776e0a9727" + ], + "version": "==3.7" + }, + "django-formtools": { + "hashes": [ + "sha256:47cb34552c6efca088863d693284d04fc36eaaf350eb21e1a1d935e0df523c93", + "sha256:bce9b64eda52cc1eef6961cc649cf75aacd1a707c2fff08d6c3efcbc8e7e761a" + ], + "markers": "python_version >= '3.8'", + "version": "==2.5.1" + }, "django-import-export": { "hashes": [ "sha256:16ecc5a9f0df46bde6eb278a3e65ebda0ee1db55656f36440e9fb83f40ab85a3", @@ -666,6 +806,63 @@ "markers": "python_version >= '3.8'", "version": "==4.1.1" }, + "django-js-reverse": { + "hashes": [ + "sha256:2a392d169f44e30b883c30dfcfd917a14167ce8fe196c99d2385b31c90d77aa0", + "sha256:8134c2ab6307c945edfa90671ca65e85d6c1754d48566bdd6464be259cc80c30" + ], + "version": "==0.9.1" + }, + "django-otp": { + "hashes": [ + "sha256:931a4f46f0ec10cab4d25ac8b7dfd6344538320b0489716cabb0da3108dabd75", + "sha256:fc6d13025eb659030684728ab55b9343e06069c62a17d5f3be2649d8ee314f0f" + ], + "markers": "python_version >= '3.7'", + "version": "==1.5.2" + }, + "django-phonenumber-field": { + "hashes": [ + "sha256:72a3e7a3e7493bf2a12c07a3bc77ce89813acc16592bf04d0eee3b5a452097ed", + "sha256:a31b4f05ac0ff898661516c84940f83adb5cdcf0ae4b9b1d31bb8ad3ff345b58" + ], + "markers": "python_version >= '3.7'", + "version": "==6.4.0" + }, + "django-pipeline": { + "hashes": [ + "sha256:26f1d344a7bf39bc92c9dc520093471d912de53abd7d22ac715e77d779a831c8", + "sha256:56c299cec0e644e77d5f928f4cebfff804b919cc10ff5c0bfaa070ff57e8da44" + ], + "version": "==2.0.8" + }, + "django-preventconcurrentlogins": { + "hashes": [ + "sha256:9cb45fcd63edeec55e5ac29bbd2ee96974dc2a72d74ab88088dbf6a1f52978e9" + ], + "version": "==0.8.2" + }, + "django-ratelimit": { + "hashes": [ + "sha256:73223d860abd5c5d7b9a807fabb39a6220068129b514be8d78044b52607ab154", + "sha256:857e797f23de948b204a31dba9d88aea3ce731b7a5d926d0240c772e19b5486f" + ], + "markers": "python_version >= '3.4'", + "version": "==3.0.1" + }, + "django-recaptcha": { + "hashes": [ + "sha256:567784963fd5400feaf92e8951d8dbbbdb4b4c48a76e225d4baa63a2c9d2cd8c" + ], + "version": "==2.0.6" + }, + "django-sekizai": { + "hashes": [ + "sha256:5c5e16845d37ce822fc655ce79ec02715191b3d03330b550997bcb842cf24fdf", + "sha256:e829f09b0d6bf01ee5cde05de1fb3faf2fbc5df66dc4dc280fbaac224ca4336f" + ], + "version": "==2.0.0" + }, "django-selenium-clean": { "hashes": [ "sha256:35982f7af664f578b6db48053ade5e4260f96c13d778308b992007a548d1fc26", @@ -683,6 +880,27 @@ "markers": "python_version >= '3.6' and python_version < '4.0'", "version": "==1.2.0" }, + "django-treebeard": { + "hashes": [ + "sha256:83aebc34a9f06de7daaec330d858d1c47887e81be3da77e3541fe7368196dd8a" + ], + "version": "==4.3.1" + }, + "django-two-factor-auth": { + "hashes": [ + "sha256:3fac266d12472ac66475dd737bb18f2992484313bf56acf5a2eea5e824291ee6", + "sha256:44fb9f6a52dbf83229de52c6f642eb2e0feafdb919854f3dc0e7716877c340ba" + ], + "version": "==1.13.2" + }, + "djangorestframework": { + "hashes": [ + "sha256:0c33407ce23acc68eca2a6e46424b008c9c02eceb8cf18581921d0092bc1f2ee", + "sha256:24c4bf58ed7e85d1fe4ba250ab2da926d263cd57d64b03e8dcef0ac683f8b1aa" + ], + "markers": "python_version >= '3.6'", + "version": "==3.13.1" + }, "execnet": { "hashes": [ "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", @@ -733,6 +951,26 @@ "markers": "python_full_version >= '3.8.0'", "version": "==5.13.2" }, + "libsass": { + "hashes": [ + "sha256:31e86d92a5c7a551df844b72d83fc2b5e50abc6fbbb31e296f7bebd6489ed1b4", + "sha256:34cae047cbbfc4ffa832a61cbb110f3c95f5471c6170c842d3fed161e40814dc", + "sha256:4a218406d605f325d234e4678bd57126a66a88841cb95bee2caeafdc6f138306", + "sha256:6f209955ede26684e76912caf329f4ccb57e4a043fd77fe0e7348dd9574f1880", + "sha256:a2ec85d819f353cbe807432d7275d653710d12b08ec7ef61c124a580a8352f3c", + "sha256:ea97d1b45cdc2fc3590cb9d7b60f1d8915d3ce17a98c1f2d4dd47ee0d9c68ce6" + ], + "markers": "python_version >= '3.8'", + "version": "==0.23.0" + }, + "more-itertools": { + "hashes": [ + "sha256:5652a9ac72209ed7df8d9c15daf4e1aa0e3d2ccd3c87f8265a0673cd9cbc9ced", + "sha256:c5d6da9ca3ff65220c3bfd2a8db06d698f05d4d2b9be57e1deb2be5a45019713" + ], + "markers": "python_version >= '3.5'", + "version": "==8.7.0" + }, "mypy-extensions": { "hashes": [ "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", @@ -741,6 +979,64 @@ "markers": "python_version >= '3.5'", "version": "==1.0.0" }, + "numpy": { + "hashes": [ + "sha256:08801848a40aea24ce16c2ecde3b756f9ad756586fb2d13210939eb69b023f5b", + "sha256:0937e54c09f7a9a68da6889362ddd2ff584c02d015ec92672c099b61555f8911", + "sha256:0ab32eb9170bf8ffcbb14f11613f4a0b108d3ffee0832457c5d4808233ba8977", + "sha256:0abb3916a35d9090088a748636b2c06dc9a6542f99cd476979fb156a18192b84", + "sha256:0af3a5987f59d9c529c022c8c2a64805b339b7ef506509fba7d0556649b9714b", + "sha256:10e2350aea18d04832319aac0f887d5fcec1b36abd485d14f173e3e900b83e33", + "sha256:15ef8b2177eeb7e37dd5ef4016f30b7659c57c2c0b57a779f1d537ff33a72c7b", + "sha256:1f817c71683fd1bb5cff1529a1d085a57f02ccd2ebc5cd2c566f9a01118e3b7d", + "sha256:24003ba8ff22ea29a8c306e61d316ac74111cebf942afbf692df65509a05f111", + "sha256:30014b234f07b5fec20f4146f69e13cfb1e33ee9a18a1879a0142fbb00d47673", + "sha256:343e3e152bf5a087511cd325e3b7ecfd5b92d369e80e74c12cd87826e263ec06", + "sha256:378cb4f24c7d93066ee4103204f73ed046eb88f9ad5bb2275bb9fa0f6a02bd36", + "sha256:398049e237d1aae53d82a416dade04defed1a47f87d18d5bd615b6e7d7e41d1f", + "sha256:3a3336fbfa0d38d3deacd3fe7f3d07e13597f29c13abf4d15c3b6dc2291cbbdd", + "sha256:442596f01913656d579309edcd179a2a2f9977d9a14ff41d042475280fc7f34e", + "sha256:44e44973262dc3ae79e9063a1284a73e09d01b894b534a769732ccd46c28cc62", + "sha256:54139e0eb219f52f60656d163cbe67c31ede51d13236c950145473504fa208cb", + "sha256:5474dad8c86ee9ba9bb776f4b99ef2d41b3b8f4e0d199d4f7304728ed34d0300", + "sha256:54c6a63e9d81efe64bfb7bcb0ec64332a87d0b87575f6009c8ba67ea6374770b", + "sha256:624884b572dff8ca8f60fab591413f077471de64e376b17d291b19f56504b2bb", + "sha256:6326ab99b52fafdcdeccf602d6286191a79fe2fda0ae90573c5814cd2b0bc1b8", + "sha256:652e92fc409e278abdd61e9505649e3938f6d04ce7ef1953f2ec598a50e7c195", + "sha256:6c1de77ded79fef664d5098a66810d4d27ca0224e9051906e634b3f7ead134c2", + "sha256:76368c788ccb4f4782cf9c842b316140142b4cbf22ff8db82724e82fe1205dce", + "sha256:7a894c51fd8c4e834f00ac742abad73fc485df1062f1b875661a3c1e1fb1c2f6", + "sha256:7dc90da0081f7e1da49ec4e398ede6a8e9cc4f5ebe5f9e06b443ed889ee9aaa2", + "sha256:848c6b5cad9898e4b9ef251b6f934fa34630371f2e916261070a4eb9092ffd33", + "sha256:899da829b362ade41e1e7eccad2cf274035e1cb36ba73034946fccd4afd8606b", + "sha256:8ab81ccd753859ab89e67199b9da62c543850f819993761c1e94a75a814ed667", + "sha256:8fb49a0ba4d8f41198ae2d52118b050fd34dace4b8f3fb0ee34e23eb4ae775b1", + "sha256:9156ca1f79fc4acc226696e95bfcc2b486f165a6a59ebe22b2c1f82ab190384a", + "sha256:9523f8b46485db6939bd069b28b642fec86c30909cea90ef550373787f79530e", + "sha256:a0756a179afa766ad7cb6f036de622e8a8f16ffdd55aa31f296c870b5679d745", + "sha256:a0cdef204199278f5c461a0bed6ed2e052998276e6d8ab2963d5b5c39a0500bc", + "sha256:ab83adc099ec62e044b1fbb3a05499fa1e99f6d53a1dde102b2d85eff66ed324", + "sha256:b34fa5e3b5d6dc7e0a4243fa0f81367027cb6f4a7215a17852979634b5544ee0", + "sha256:b47c551c6724960479cefd7353656498b86e7232429e3a41ab83be4da1b109e8", + "sha256:c4cd94dfefbefec3f8b544f61286584292d740e6e9d4677769bc76b8f41deb02", + "sha256:c4f982715e65036c34897eb598d64aef15150c447be2cfc6643ec7a11af06574", + "sha256:d8f699a709120b220dfe173f79c73cb2a2cab2c0b88dd59d7b49407d032b8ebd", + "sha256:dd94ce596bda40a9618324547cfaaf6650b1a24f5390350142499aa4e34e53d1", + "sha256:de844aaa4815b78f6023832590d77da0e3b6805c644c33ce94a1e449f16d6ab5", + "sha256:e5f0642cdf4636198a4990de7a71b693d824c56a757862230454629cf62e323d", + "sha256:f07fa2f15dabe91259828ce7d71b5ca9e2eb7c8c26baa822c825ce43552f4883", + "sha256:f15976718c004466406342789f31b6673776360f3b1e3c575f25302d7e789575", + "sha256:f358ea9e47eb3c2d6eba121ab512dfff38a88db719c38d1e67349af210bc7529", + "sha256:f505264735ee074250a9c78247ee8618292091d9d1fcc023290e9ac67e8f1afa", + "sha256:f5ebbf9fbdabed208d4ecd2e1dfd2c0741af2f876e7ae522c2537d404ca895c3", + "sha256:f6b26e6c3b98adb648243670fddc8cab6ae17473f9dc58c51574af3e64d61211", + "sha256:f8e93a01a35be08d31ae33021e5268f157a2d60ebd643cfc15de6ab8e4722eb1", + "sha256:fe76d75b345dc045acdbc006adcb197cc680754afd6c259de60d358d60c93736", + "sha256:ffbd6faeb190aaf2b5e9024bac9622d2ee549b7ec89ef3a9373fa35313d44e0e" + ], + "markers": "python_version >= '3.10'", + "version": "==2.1.0" + }, "outcome": { "hashes": [ "sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8", @@ -757,6 +1053,41 @@ "markers": "python_version >= '3.8'", "version": "==24.1" }, + "pandas": { + "hashes": [ + "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863", + "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2", + "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1", + "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad", + "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db", + "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76", + "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51", + "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32", + "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08", + "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b", + "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4", + "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921", + "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288", + "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee", + "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0", + "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24", + "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99", + "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151", + "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd", + "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce", + "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57", + "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef", + "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54", + "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a", + "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238", + "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23", + "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772", + "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce", + "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad" + ], + "markers": "python_version >= '3.9'", + "version": "==2.2.2" + }, "pathspec": { "hashes": [ "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", @@ -765,6 +1096,107 @@ "markers": "python_version >= '3.8'", "version": "==0.12.1" }, + "pgeocode": { + "hashes": [ + "sha256:07995d4cd2d7fec1f82afb14d6025e83bbc156b6f225fa3e0b3417da2ec020c8", + "sha256:60fc2bad60aa161c3cf46ace4fde607b77e016b1e2a25470534163305499e55e" + ], + "markers": "python_version >= '3.8'", + "version": "==0.4.0" + }, + "phonenumbers": { + "hashes": [ + "sha256:23944f9e628f32a975d3b221b6d76e6ba8ae618d53cb3d82fc23d9e100a59b29", + "sha256:70aa98a50ba7bc7f6bf17851f806c927107e7c44e7d21eb46bdbec07b99d23ae" + ], + "version": "==8.12.12" + }, + "pillow": { + "hashes": [ + "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885", + "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea", + "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df", + "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5", + "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c", + "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d", + "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd", + "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06", + "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908", + "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a", + "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be", + "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0", + "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b", + "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80", + "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a", + "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e", + "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9", + "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696", + "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b", + "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309", + "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e", + "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab", + "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d", + "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060", + "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d", + "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d", + "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4", + "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3", + "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6", + "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb", + "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94", + "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b", + "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496", + "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0", + "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319", + "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b", + "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856", + "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef", + "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680", + "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b", + "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42", + "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e", + "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597", + "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a", + "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8", + "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3", + "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736", + "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da", + "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126", + "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd", + "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5", + "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b", + "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026", + "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b", + "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc", + "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46", + "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2", + "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c", + "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe", + "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984", + "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a", + "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70", + "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca", + "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b", + "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91", + "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3", + "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84", + "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1", + "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5", + "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be", + "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f", + "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc", + "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9", + "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e", + "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141", + "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef", + "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22", + "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27", + "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e", + "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1" + ], + "markers": "python_version >= '3.8'", + "version": "==10.4.0" + }, "platformdirs": { "hashes": [ "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", @@ -781,6 +1213,29 @@ "markers": "python_version >= '3.8'", "version": "==1.5.0" }, + "pyhamcrest": { + "hashes": [ + "sha256:412e00137858f04bde0729913874a48485665f2d36fe9ee449f26be864af9316", + "sha256:7ead136e03655af85069b6f47b23eb7c3e5c221aa9f022a4fbb499f5b7308f29" + ], + "markers": "python_version >= '3.5'", + "version": "==2.0.2" + }, + "pyjwt": { + "hashes": [ + "sha256:69285c7e31fc44f68a1feb309e948e0df53259d579295e6cfe2b1792329f05fd", + "sha256:d83c3d892a77bbb74d3e1a2cfa90afaadb60945205d1095d9221f04466f64c14" + ], + "markers": "python_version >= '3.7'", + "version": "==2.6.0" + }, + "pypng": { + "hashes": [ + "sha256:4a43e969b8f5aaafb2a415536c1a8ec7e341cd6a3f957fd5b5f32a4cfeed902c", + "sha256:739c433ba96f078315de54c0db975aee537cbc3e1d0ae4ed9aab0ca1e427e2c1" + ], + "version": "==0.20220715.0" + }, "pysocks": { "hashes": [ "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299", @@ -825,6 +1280,14 @@ "markers": "python_version >= '3.8'", "version": "==3.6.1" }, + "python-dateutil": { + "hashes": [ + "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", + "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==2.9.0.post0" + }, "pytz": { "hashes": [ "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812", @@ -832,6 +1295,136 @@ ], "version": "==2024.1" }, + "pyyaml": { + "hashes": [ + "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff", + "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", + "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", + "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", + "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", + "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", + "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", + "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", + "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", + "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", + "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a", + "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", + "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", + "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", + "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", + "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", + "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", + "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a", + "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", + "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", + "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", + "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", + "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", + "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", + "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", + "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", + "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", + "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", + "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", + "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706", + "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", + "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", + "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", + "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083", + "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", + "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", + "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", + "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", + "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", + "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", + "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", + "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", + "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", + "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", + "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5", + "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d", + "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", + "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", + "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", + "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", + "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", + "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", + "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4" + ], + "markers": "python_version >= '3.8'", + "version": "==6.0.2" + }, + "qrcode": { + "hashes": [ + "sha256:581dca7a029bcb2deef5d01068e39093e80ef00b4a61098a2182eac59d01643a", + "sha256:9dd969454827e127dbd93696b20747239e6d540e082937c90f14ac95b30f5845" + ], + "markers": "python_version >= '3.7'", + "version": "==7.4.2" + }, + "rapid-router": { + "editable": true, + "path": "." + }, + "reportlab": { + "hashes": [ + "sha256:0b94e4f65a5f77a631cc010c9a7892d69e33f3251b760639dcc76420e138ce95", + "sha256:11a71c314183532d889ad4b3941f61c3fe4bfdda769c768a7f02d93cb69dd1bb", + "sha256:149718c3eaee937f28094325f0dd9ae1add3172c2dacbb93ff5403f37c9d3c57", + "sha256:21d6b6bcdecee9c7ce047156d0553a30d736b8172629e4c0fcacab35ba261f3b", + "sha256:269c59e508df08be498ab9e5278addb2cc16989677a03f800b17f8a31f8c5cc7", + "sha256:36568d3cb4101a210c4d821d9101635c2ef6e06bd649335938c01eb197f50c5d", + "sha256:3cb0da4975dbade6cc2ea6b0b0b17578af266dc3f669e959648f3306af993369", + "sha256:48eadd93237c7e2739525c74cf6615dd6c1a767c839f4b0d7c12167dc0b09911", + "sha256:57add04824bca89a130f9d428ace1b003cce4061386e0ec2a1b45b554ffe7aa3", + "sha256:58ea3471b9b4b8e7952bd357e8487789da11213470be328ffb3e5b7d7690c2c7", + "sha256:5a460f4c0c30bdf9d7bef46a816671a4386a9253670a53d35c694c666544261f", + "sha256:6172481e8acffcf72042653e977281fbd807a41705a39456d92d2606d8b8c5e2", + "sha256:65b441e22d8fe93154567a30662d8539e639b78142815afcaf92b388846eb3c1", + "sha256:6ea46fef07c588fef84d1164d4788fef322b39feb2bfb2df0a0706181dff79b8", + "sha256:6f75d33f7a3720cf47371ab63ced0f0ebd1aeb6db19386ae92f8977a09be9611", + "sha256:6fdac930dfdc6227720545ec44fdb396e92d53ec227a6f5ae58cc8cb9a6cbe89", + "sha256:701290747662d2b3be49fc0de33898ecc9ce3fafe0e2887d406e24693465e5ae", + "sha256:753485bb2b18cbd11340e227e4aaf9bde3bb64f83406dfa011e92ad0231a42c9", + "sha256:7b690bc30f58931b0abd47635d93a43a82d67972e83a6511cc8adbcd7da25310", + "sha256:7efdf68e97e8fea8683bfc17f25747fefbda729b9018bc2e3221658ac41ee0bd", + "sha256:7ff89011b5ee30209b3106641e3b7b4959f10aa6e9d6f3030205123c178f605d", + "sha256:8260c002e4845a5af65908d5ee2099bcc25a16c7646c5c417fa27f1e4b844bc1", + "sha256:8e4983486d419daa45cade40874bb869976e27ba11f77fb4b9ae32417284ade7", + "sha256:8f00175f8e12e6f7d3a01309de6d7008fac94a2cdce6837ad066f0961472c9e5", + "sha256:9f869286fcefa7f8e89e38448309891ff110ad74f58a7317ec204f3d4b8ad5f5", + "sha256:a0330322c6c8123745ac7667fcc6ae3e0de3b73c15bdfaa28c788a9eaa0f50da", + "sha256:a043cff1781ddb2a0ba0e8e760a79fc5be2430957c4f2a1f51bd4528cc53178f", + "sha256:a477f652e6c417ad40387a8498d9ad827421006f156aab16f67adc9b81699a72", + "sha256:a4dbc28fede7f504b9ac65ce9cbea35585e999d63f9fa68bc73f5a75b4929302", + "sha256:afb418409e0d323c6cb5e3be7ea4d14dfbf8a07eb03ab0b0062904cacf819878", + "sha256:b0d91663d450c11404ec189ebc5a4abdf20f7c4eca5954a920427cdbf5601525", + "sha256:ba6f533b262f4ee1636b754992bb2fb349df0500d765ac9be014a375c047f4db", + "sha256:bbdbba1ec3498b17eefca14d424ee90bb95b53e1423ecb22f1c17733c3406559", + "sha256:ca8eb7a6607f8a664187a330bab9f8d11c9f81ed885e063dfbb29a130944a72a", + "sha256:cca2d4c783f985b91b98e80d09ac79b6ed3f317a729cba5ba86edfe5eb9a2d9c", + "sha256:d59e62faa03003be81aa14d37ac34ea110e5ac59c8678fd4c0daa7d8b8f42096", + "sha256:d95fc8bc177a009053548c6d851a513b2147c465a5e8fea82287ea22d6825c4e", + "sha256:dbddadca6f08212732e83a60e30a42cfc7d2695892cedea208b3c3e7131c9993", + "sha256:e13a4e81761636591f5b60104f6e1eec70832ffd9aa781db68d7ebb576970d4b", + "sha256:e28a8d9cf462e2b4c9e71abd0630f9ec245d88b976b283b0dbb4602c9ddb3938", + "sha256:e5949f3b4e207fa7901c0cc3b49470b2a3372617a47dfbc892db31c2b56af296", + "sha256:e98965c6e60d76ff63989d9400ae8e65efd67c665d785b377f438f166a57c053", + "sha256:f1993a68c0edc45895d3df350d01b0456efe79aaf309cef777762742be501f2a", + "sha256:faeebde62f0f6ad86985bec5685411260393d2eb7ba907972da56af586b644e8", + "sha256:ff09a0a1e5cef05309ac09dfc5185e8151d927bcf45470d2f540c96260f8a355" + ], + "markers": "python_version >= '3.7' and python_version < '4'", + "version": "==3.6.13" + }, + "requests": { + "hashes": [ + "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", + "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" + ], + "markers": "python_version >= '3.8'", + "version": "==2.32.3" + }, "selenium": { "hashes": [ "sha256:478fae77cdfaec32adb1e68d59632c8c191f920535282abcaa2d1a3d98655624", @@ -841,6 +1434,22 @@ "markers": "python_version >= '3.7'", "version": "==4.9.0" }, + "setuptools": { + "hashes": [ + "sha256:0274581a0037b638b9fc1c6883cc71c0210865aaa76073f7882376b641b84e8f", + "sha256:a85e96b8be2b906f3e3e789adec6a9323abf79758ecfa3065bd740d81158b11e" + ], + "markers": "python_version >= '3.8'", + "version": "==74.0.0" + }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.16.0" + }, "sniffio": { "hashes": [ "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", @@ -896,6 +1505,14 @@ "markers": "python_version >= '3.8'", "version": "==4.12.2" }, + "tzdata": { + "hashes": [ + "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd", + "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252" + ], + "markers": "python_version >= '2'", + "version": "==2024.1" + }, "urllib3": { "hashes": [ "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472", From f2231c989521174aa714dc904be0f1fb91f6c95d Mon Sep 17 00:00:00 2001 From: Eve Martin Date: Tue, 3 Sep 2024 11:14:03 +0000 Subject: [PATCH 22/25] address PR comments - dynamically change cows block --- game/static/game/js/animation.js | 1 - game/static/game/js/blocklyCustomBlocks.js | 15 ++++++++++++++- game/static/game/js/drawing.js | 9 +++++++++ game/static/game/js/level_editor.js | 19 +++++++++++++++++++ game/templates/game/level_editor.html | 3 +++ 5 files changed, 45 insertions(+), 2 deletions(-) diff --git a/game/static/game/js/animation.js b/game/static/game/js/animation.js index b7648a702..e57fe656b 100644 --- a/game/static/game/js/animation.js +++ b/game/static/game/js/animation.js @@ -41,7 +41,6 @@ ocargo.Animation.prototype.addCows = function() { for (let i = 0 ; i < cows.length ; i++){ let cow = cows[i]; - console.log(cow.type); for (let j = 0; j < cow.potentialNodes.length; j++) { const cowImage = this.drawing.renderCow(cow.id, cow.potentialNodes[j].coordinate, cow.potentialNodes[j], 0, cow.type); this.numberOfCowsOnMap++; diff --git a/game/static/game/js/blocklyCustomBlocks.js b/game/static/game/js/blocklyCustomBlocks.js index 12ffec32a..9c7cef111 100644 --- a/game/static/game/js/blocklyCustomBlocks.js +++ b/game/static/game/js/blocklyCustomBlocks.js @@ -281,13 +281,26 @@ function initCustomBlocksDescription() { init: function() { this.setColour(210); this.setOutput(true, 'Boolean'); + console.log(ocargo.Drawing.animalType); this.appendDummyInput() - .appendField(Blockly.Msg.COW_CROSSING_TITLE) + .appendField(ocargo.Drawing.animalType == "pigeon" ? "pigeons": Blockly.Msg.COW_CROSSING_TITLE) .appendField(new Blockly.FieldImage(ocargo.Drawing.imageDir + ocargo.Drawing.whiteCowUrl, ocargo.BlocklyControl.COW_WIDTH, ocargo.BlocklyControl.BLOCK_HEIGHT), 'IMAGE'); } }; + + Blockly.Blocks['pigeon_crossing_IMAGE_ONLY'] = { + init: function() { + this.setColour(210); + this.setOutput(true, 'Boolean'); + this.appendDummyInput() + .appendField("pigeons") + .appendField(new Blockly.FieldImage(ocargo.Drawing.imageDir + ocargo.Drawing.pigeonUrl, + ocargo.BlocklyControl.COW_WIDTH, + ocargo.BlocklyControl.BLOCK_HEIGHT), 'IMAGE'); + } + } /****************/ /* Procedures */ /****************/ diff --git a/game/static/game/js/drawing.js b/game/static/game/js/drawing.js index 3bd2b1d2b..a0cffd920 100644 --- a/game/static/game/js/drawing.js +++ b/game/static/game/js/drawing.js @@ -852,6 +852,7 @@ ocargo.Drawing = function (startingPosition) { } this.renderCow = function (id, coordinate, node, animationLength, type) { + console.log(type); let res = this.determineCowOrientation(coordinate, node) let image = paper.image( ocargo.Drawing.raphaelImageDir + ocargo.Drawing.cowUrl(type), @@ -1236,14 +1237,20 @@ ocargo.Drawing.renderCoins = function (coins) { } ocargo.Drawing.cowUrl = function (type) { + console.log(ocargo.Drawing.animalType) + //ocargo.Drawing.animalType = type; switch (type) { case ocargo.Cow.WHITE: + ocargo.Drawing.animalType = "white" return ocargo.Drawing.whiteCowUrl case ocargo.Cow.BROWN: + ocargo.Drawing.animalType = "brown" return ocargo.Drawing.brownCowUrl case ocargo.Cow.PIGEON: + ocargo.Drawing.animalType = "pigeon" return ocargo.Drawing.pigeonUrl default: + ocargo.Drawing.animalType = "white" return ocargo.Drawing.whiteCowUrl } } @@ -1290,3 +1297,5 @@ ocargo.Drawing.pigeonUrl = 'pigeon.svg' ocargo.Drawing.imageDir = '/static/game/image/' ocargo.Drawing.raphaelImageDir = '/static/game/raphael_image/' + +ocargo.Drawing.animalType = 'WHITE' \ No newline at end of file diff --git a/game/static/game/js/level_editor.js b/game/static/game/js/level_editor.js index fe9d6df82..926209119 100644 --- a/game/static/game/js/level_editor.js +++ b/game/static/game/js/level_editor.js @@ -416,6 +416,7 @@ ocargo.LevelEditor = function(levelId) { for (var i = 0; i < BLOCKS.length; i++) { var type = BLOCKS[i]; var block = Blockly.mainWorkspace.newBlock(type); + console.log(type); block.initSvg(); block.render(); @@ -2959,6 +2960,24 @@ ocargo.LevelEditor = function(levelId) { this.image.transform("t" + x + "," + y + " r" + r); } + let cowsBlock = document.getElementById("cow_crossing_image"); + + let block = Blockly.mainWorkspace.newBlock("cow_crossing"); + + if (newType == ocargo.Cow.PIGEON) { + block = Blockly.mainWorkspace.newBlock("pigeon_crossing_IMAGE_ONLY"); + } + + block.initSvg(); + block.render(); + let svg = block.getSvgRoot(); + let newContent = '' + newContent += ' Date: Tue, 3 Sep 2024 14:19:46 +0000 Subject: [PATCH 24/25] make pigeon block dynamic --- game/static/game/js/blocklyCustomBlocks.js | 4 +- game/static/game/js/drawing.js | 1 - game/static/game/js/level_editor.js | 58 ++++------------------ 3 files changed, 13 insertions(+), 50 deletions(-) diff --git a/game/static/game/js/blocklyCustomBlocks.js b/game/static/game/js/blocklyCustomBlocks.js index 9c7cef111..16a20f922 100644 --- a/game/static/game/js/blocklyCustomBlocks.js +++ b/game/static/game/js/blocklyCustomBlocks.js @@ -281,10 +281,10 @@ function initCustomBlocksDescription() { init: function() { this.setColour(210); this.setOutput(true, 'Boolean'); - console.log(ocargo.Drawing.animalType); + let imageUrl = ocargo.Drawing.animalType == "pigeon" ? ocargo.Drawing.pigeonUrl : ocargo.Drawing.whiteCowUrl this.appendDummyInput() .appendField(ocargo.Drawing.animalType == "pigeon" ? "pigeons": Blockly.Msg.COW_CROSSING_TITLE) - .appendField(new Blockly.FieldImage(ocargo.Drawing.imageDir + ocargo.Drawing.whiteCowUrl, + .appendField(new Blockly.FieldImage(ocargo.Drawing.imageDir + imageUrl, ocargo.BlocklyControl.COW_WIDTH, ocargo.BlocklyControl.BLOCK_HEIGHT), 'IMAGE'); } diff --git a/game/static/game/js/drawing.js b/game/static/game/js/drawing.js index a0cffd920..5a88dc393 100644 --- a/game/static/game/js/drawing.js +++ b/game/static/game/js/drawing.js @@ -852,7 +852,6 @@ ocargo.Drawing = function (startingPosition) { } this.renderCow = function (id, coordinate, node, animationLength, type) { - console.log(type); let res = this.determineCowOrientation(coordinate, node) let image = paper.image( ocargo.Drawing.raphaelImageDir + ocargo.Drawing.cowUrl(type), diff --git a/game/static/game/js/level_editor.js b/game/static/game/js/level_editor.js index 66152548e..a183fa7f6 100644 --- a/game/static/game/js/level_editor.js +++ b/game/static/game/js/level_editor.js @@ -418,7 +418,7 @@ ocargo.LevelEditor = function(levelId) { for (var i = 0; i < BLOCKS.length; i++) { var type = BLOCKS[i]; - let usePigeons = type === "cow_crossing" && currentTheme == THEMES.grass + let usePigeons = type === "cow_crossing" && currentTheme == THEMES.city var block = usePigeons ? Blockly.mainWorkspace.newBlock("pigeon_crossing_IMAGE_ONLY") : Blockly.mainWorkspace.newBlock(type); block.initSvg(); block.render(); @@ -2421,28 +2421,17 @@ ocargo.LevelEditor = function(levelId) { cows[i].updateTheme(); } - let block = Blockly.mainWorkspace.newBlock("cow_crossing"); + const pigeonHTML = `pigeons`; + + const cowHTML = `cows`; - if (newType == ocargo.Cow.PIGEON) { - block = Blockly.mainWorkspace.newBlock("pigeon_crossing_IMAGE_ONLY"); - } - - block.initSvg(); - block.render(); - let svg = block.getSvgRoot(); - let innerHTML = svg.innerHTML; - let innerParts = innerHTML.split(" Date: Tue, 3 Sep 2024 14:41:25 +0000 Subject: [PATCH 25/25] tidy up, add pigeon translations --- game/static/game/js/blockly/msg/js/ca.js | 1 + game/static/game/js/blockly/msg/js/en-gb.js | 1 + game/static/game/js/blockly/msg/js/en.js | 1 + game/static/game/js/blockly/msg/js/es.js | 1 + game/static/game/js/blockly/msg/js/fr.js | 1 + game/static/game/js/blockly/msg/js/hi.js | 1 + game/static/game/js/blocklyCustomBlocks.js | 4 ++-- game/static/game/js/drawing.js | 7 +------ game/static/game/js/level_editor.js | 10 +++------- game/templates/game/level_editor.html | 3 --- 10 files changed, 12 insertions(+), 18 deletions(-) diff --git a/game/static/game/js/blockly/msg/js/ca.js b/game/static/game/js/blockly/msg/js/ca.js index 8c21ea6b6..26f030b54 100755 --- a/game/static/game/js/blockly/msg/js/ca.js +++ b/game/static/game/js/blockly/msg/js/ca.js @@ -461,6 +461,7 @@ Blockly.Msg["TRAFFIC_LIGHT_GREEN_TITLE"] = "semàfor verd"; Blockly.Msg["DEAD_END_TITLE"] = "és carrer sense sortida"; Blockly.Msg["AT_DESTINATION_TITLE"] = "a destí"; Blockly.Msg["COW_CROSSING_TITLE"] = "vaques"; +Blockly.Msg["PIGEON_CROSSING_TITLE"] = "coloms"; Blockly.Msg["CALL_PROC_TITLE"] = "Crida"; Blockly.Msg["CALL_PROC_TOOLTIP"] = "Crida un procediment"; diff --git a/game/static/game/js/blockly/msg/js/en-gb.js b/game/static/game/js/blockly/msg/js/en-gb.js index fb9e42f7f..86fa64048 100755 --- a/game/static/game/js/blockly/msg/js/en-gb.js +++ b/game/static/game/js/blockly/msg/js/en-gb.js @@ -461,6 +461,7 @@ Blockly.Msg["TRAFFIC_LIGHT_GREEN_TITLE"] = "traffic light green"; Blockly.Msg["DEAD_END_TITLE"] = "is dead end"; Blockly.Msg["AT_DESTINATION_TITLE"] = "at destination"; Blockly.Msg["COW_CROSSING_TITLE"] = "cows"; +Blockly.Msg["PIGEON_CROSSING_TITLE"] = "pigeons"; Blockly.Msg["CALL_PROC_TITLE"] = "Call"; Blockly.Msg["CALL_PROC_TOOLTIP"] = "Calls a procedure"; diff --git a/game/static/game/js/blockly/msg/js/en.js b/game/static/game/js/blockly/msg/js/en.js index 584b42dd6..108f16c82 100755 --- a/game/static/game/js/blockly/msg/js/en.js +++ b/game/static/game/js/blockly/msg/js/en.js @@ -461,6 +461,7 @@ Blockly.Msg["TRAFFIC_LIGHT_GREEN_TITLE"] = "traffic light green"; Blockly.Msg["DEAD_END_TITLE"] = "is dead end"; Blockly.Msg["AT_DESTINATION_TITLE"] = "at destination"; Blockly.Msg["COW_CROSSING_TITLE"] = "cows"; +Blockly.Msg["PIGEON_CROSSING_TITLE"] = "pigeons"; Blockly.Msg["CALL_PROC_TITLE"] = "Call"; Blockly.Msg["CALL_PROC_TOOLTIP"] = "Calls a procedure"; diff --git a/game/static/game/js/blockly/msg/js/es.js b/game/static/game/js/blockly/msg/js/es.js index 08bf8fc25..a40936c00 100755 --- a/game/static/game/js/blockly/msg/js/es.js +++ b/game/static/game/js/blockly/msg/js/es.js @@ -461,6 +461,7 @@ Blockly.Msg["TRAFFIC_LIGHT_GREEN_TITLE"] = "semáforo en verde"; Blockly.Msg["DEAD_END_TITLE"] = "es un callejón sin salida"; Blockly.Msg["AT_DESTINATION_TITLE"] = "en destino"; Blockly.Msg["COW_CROSSING_TITLE"] = "vacas"; +Blockly.Msg["PIGEON_CROSSING_TITLE"] = "palomas"; Blockly.Msg["CALL_PROC_TITLE"] = "Llamar"; Blockly.Msg["CALL_PROC_TOOLTIP"] = "Llamar a una función"; diff --git a/game/static/game/js/blockly/msg/js/fr.js b/game/static/game/js/blockly/msg/js/fr.js index decee21fb..e8991aa0f 100755 --- a/game/static/game/js/blockly/msg/js/fr.js +++ b/game/static/game/js/blockly/msg/js/fr.js @@ -461,6 +461,7 @@ Blockly.Msg["TRAFFIC_LIGHT_GREEN_TITLE"] = "feu vert"; Blockly.Msg["DEAD_END_TITLE"] = "cul-de-sac"; Blockly.Msg["AT_DESTINATION_TITLE"] = "arrivé à destination"; Blockly.Msg["COW_CROSSING_TITLE"] = "vaches"; +Blockly.Msg["PIGEON_CROSSING_TITLE"] = "pigeons"; Blockly.Msg["CALL_PROC_TITLE"] = "Appeler"; Blockly.Msg["CALL_PROC_TOOLTIP"] = "Appeler une fonction"; diff --git a/game/static/game/js/blockly/msg/js/hi.js b/game/static/game/js/blockly/msg/js/hi.js index 5555386a3..9d998dc39 100755 --- a/game/static/game/js/blockly/msg/js/hi.js +++ b/game/static/game/js/blockly/msg/js/hi.js @@ -461,6 +461,7 @@ Blockly.Msg["TRAFFIC_LIGHT_GREEN_TITLE"] = "ट्रैफिक लाइट Blockly.Msg["DEAD_END_TITLE"] = "आगे का रास्ता बंद है"; Blockly.Msg["AT_DESTINATION_TITLE"] = "मंजिल /गंतव्य पर"; Blockly.Msg["COW_CROSSING_TITLE"] = "गायों"; +Blockly.Msg["PIGEON_CROSSING_TITLE"] = "कबूतरों"; Blockly.Msg["CALL_PROC_TITLE"] = "पुकारना"; Blockly.Msg["CALL_PROC_TOOLTIP"] = "एक प्रक्रिया बुलाना"; diff --git a/game/static/game/js/blocklyCustomBlocks.js b/game/static/game/js/blocklyCustomBlocks.js index 16a20f922..2ca5c950f 100644 --- a/game/static/game/js/blocklyCustomBlocks.js +++ b/game/static/game/js/blocklyCustomBlocks.js @@ -281,9 +281,9 @@ function initCustomBlocksDescription() { init: function() { this.setColour(210); this.setOutput(true, 'Boolean'); - let imageUrl = ocargo.Drawing.animalType == "pigeon" ? ocargo.Drawing.pigeonUrl : ocargo.Drawing.whiteCowUrl + let imageUrl = ocargo.Drawing.animalType == ocargo.Cow.PIGEON ? ocargo.Drawing.pigeonUrl : ocargo.Drawing.whiteCowUrl this.appendDummyInput() - .appendField(ocargo.Drawing.animalType == "pigeon" ? "pigeons": Blockly.Msg.COW_CROSSING_TITLE) + .appendField(ocargo.Drawing.animalType == ocargo.Cow.PIGEON ? Blockly.Msg.PIGEON_CROSSING_TITLE: Blockly.Msg.COW_CROSSING_TITLE) .appendField(new Blockly.FieldImage(ocargo.Drawing.imageDir + imageUrl, ocargo.BlocklyControl.COW_WIDTH, ocargo.BlocklyControl.BLOCK_HEIGHT), 'IMAGE'); diff --git a/game/static/game/js/drawing.js b/game/static/game/js/drawing.js index 5a88dc393..c7b4ddcd6 100644 --- a/game/static/game/js/drawing.js +++ b/game/static/game/js/drawing.js @@ -1236,20 +1236,15 @@ ocargo.Drawing.renderCoins = function (coins) { } ocargo.Drawing.cowUrl = function (type) { - console.log(ocargo.Drawing.animalType) - //ocargo.Drawing.animalType = type; + ocargo.Drawing.animalType = type; switch (type) { case ocargo.Cow.WHITE: - ocargo.Drawing.animalType = "white" return ocargo.Drawing.whiteCowUrl case ocargo.Cow.BROWN: - ocargo.Drawing.animalType = "brown" return ocargo.Drawing.brownCowUrl case ocargo.Cow.PIGEON: - ocargo.Drawing.animalType = "pigeon" return ocargo.Drawing.pigeonUrl default: - ocargo.Drawing.animalType = "white" return ocargo.Drawing.whiteCowUrl } } diff --git a/game/static/game/js/level_editor.js b/game/static/game/js/level_editor.js index a183fa7f6..05f022af6 100644 --- a/game/static/game/js/level_editor.js +++ b/game/static/game/js/level_editor.js @@ -126,16 +126,13 @@ ocargo.LevelEditor = function(levelId) { // Initialise the grid initialiseGrid(); - //setTheme(THEMES.grass); + setTheme(THEMES.grass); // Setup the toolbox setupToolbox(); if (levelId !== null) { loadLevel(levelId); - console.log(currentTheme); - } else { - setTheme(THEMES.grass); } setupTrashcan(); @@ -2707,8 +2704,8 @@ ocargo.LevelEditor = function(levelId) { } } - async function loadLevel(levelID) { - await saving.retrieveLevel(levelID, function(err, level, owned) { + function loadLevel(levelID) { + saving.retrieveLevel(levelID, function(err, level, owned) { if (err !== null) { console.error(err); return; @@ -2718,7 +2715,6 @@ ocargo.LevelEditor = function(levelId) { saveState.loaded(owned, extractState(), level.id); }); - console.log(currentTheme); } function saveLevel(name, levelId, callback) { diff --git a/game/templates/game/level_editor.html b/game/templates/game/level_editor.html index 7028d614a..f2a36eca7 100644 --- a/game/templates/game/level_editor.html +++ b/game/templates/game/level_editor.html @@ -424,9 +424,6 @@