diff --git a/templates/customize-adventure.html b/templates/customize-adventure.html index bae7ce9968f..405975b773a 100644 --- a/templates/customize-adventure.html +++ b/templates/customize-adventure.html @@ -34,13 +34,14 @@

{{_('general_settings')}}

-
- + + +
{{ render_partial('htmx-tags-list.html', tags=adventure_tags, adventure_id=adventure.id, creator=adventure.creator) }} diff --git a/templates/htmx-tags-dropdown-item.html b/templates/htmx-tags-dropdown-item.html new file mode 100644 index 00000000000..a54f5696725 --- /dev/null +++ b/templates/htmx-tags-dropdown-item.html @@ -0,0 +1,17 @@ + +
{{tag["name"]}}
\ No newline at end of file diff --git a/templates/htmx-tags-dropdown.html b/templates/htmx-tags-dropdown.html new file mode 100644 index 00000000000..0dca89c511a --- /dev/null +++ b/templates/htmx-tags-dropdown.html @@ -0,0 +1,12 @@ + + diff --git a/templates/htmx-tags-list.html b/templates/htmx-tags-list.html index d42bf53425d..26e69c95bab 100644 --- a/templates/htmx-tags-list.html +++ b/templates/htmx-tags-list.html @@ -2,35 +2,23 @@ \ No newline at end of file diff --git a/tests/cypress/e2e/for-teacher_page/customize-adventure_page/tags.cy.js b/tests/cypress/e2e/for-teacher_page/customize-adventure_page/tags.cy.js index f8d7a22973d..39e99a49024 100644 --- a/tests/cypress/e2e/for-teacher_page/customize-adventure_page/tags.cy.js +++ b/tests/cypress/e2e/for-teacher_page/customize-adventure_page/tags.cy.js @@ -8,7 +8,7 @@ describe("Tags of adventures", () => { }) it("has tags input and button", () => { - cy.get("#input_adventure_tags") + cy.get("#search_tags_input") .should("be.visible") .should("be.empty") @@ -18,26 +18,23 @@ describe("Tags of adventures", () => { it("has no tags initially", () => { cy.get("#tags-list") - .should("be.visible") - .get("#no-tags") - .should("be.visible") + .should("be.not.visible") }) it("adds a tag to adventure by pressing enter within the input field", () => { - cy.get("#input_adventure_tags") + cy.get("#search_tags_input") .should("be.empty") .type("statements{enter}") cy.wait(500) cy.get("#tags-list") .should("be.visible") - .get("#no-tags") - .should("be.hidden") + cy.get("#tags-list li") .should("include.text", "statements") }) it("adds a tag to adventure by pressing the add button", () => { - cy.get("#input_adventure_tags") + cy.get("#search_tags_input") .should("be.empty") .type("training") cy.get("#add_adventure_tags") @@ -46,8 +43,7 @@ describe("Tags of adventures", () => { cy.wait(500) cy.get("#tags-list") .should("be.visible") - .get("#no-tags") - .should("be.hidden") + cy.get("#tags-list li") .should("include.text", "training") }) @@ -59,7 +55,7 @@ describe("Tags of adventures", () => { times: 1, }).as("createTag") - cy.get("#input_adventure_tags") + cy.get("#search_tags_input") .should("be.empty") .type("training{enter}") cy.wait("@createTag").should('have.nested.property', 'response.statusCode', 400) diff --git a/website/database.py b/website/database.py index 44c5a11b2b5..4a848564376 100644 --- a/website/database.py +++ b/website/database.py @@ -611,6 +611,15 @@ def read_tag(self, tag_name): def read_tags(self, tags): return [self.read_tag(name) for name in tags] + def read_public_tags(self): + """Public tags are tagged within one or more public adventure or those that aren't in use.""" + all_tags = TAGS.scan() + public_tags = [] + for tag in all_tags: + if not tag["tagged_in"] or any([adv["public"] for adv in tag["tagged_in"]]): + public_tags.append(tag) + return public_tags + def read_tags_by_username(self, username): tags = TAGS.get_many({"creator": username}) return tags if tags else {} @@ -645,6 +654,9 @@ def get_second_teacher_adventures(self, classes, teacher): def all_adventures(self): return ADVENTURES.scan() + def public_adventures(self): + return ADVENTURES.get_many({"public": True}) + def get_student_classes_ids(self, username): ids = USERS.get({"username": username}).get("classes") return list(ids) if ids else [] diff --git a/website/tags.py b/website/tags.py index ce17333eb66..38d2d319b11 100644 --- a/website/tags.py +++ b/website/tags.py @@ -22,6 +22,20 @@ def __init__(self, db: Database, achievements: Achievements): self.db = db self.achievements = achievements + @route("/", methods=["GET"]) + @route("/", methods=["GET"], defaults={"adventure_id": None}) + @requires_teacher + def get_public_tags(self, user, adventure_id): + public_tags = self.db.read_public_tags() + adventure_id = request.args.get("adventure_id") + if adventure_id: + adventure = self.db.get_adventure(adventure_id) + # exclude current adventure's tags + public_tags = list(filter(lambda t: t["name"] not in adventure.get("tags", []), public_tags)) + + return jinja_partials.render_partial('htmx-tags-dropdown.html', + tags=public_tags, adventure_id=adventure_id, creator=user) + @route("/create/", methods=["POST"]) @route("/create//", methods=["POST"]) @requires_teacher @@ -91,6 +105,4 @@ def delete_from_adventure(self, user, tag, adventure_id): adventure_tags = list(filter(lambda name: name != tag_name, adventure_tags)) self.db.update_adventure(adventure_id, {"tags": adventure_tags}) - return adventure_tags, 200 - # return jinja_partials.render_partial('htmx-tags-list.html', tags=adventure_tags, - # adventure_id=adventure_id, creator=user["username"]) + return jinja_partials.render_partial('htmx-tags-dropdown-item.html', tag=db_tag, adventure_id=adventure_id)