diff --git a/app/forms.py b/app/forms.py index e674a9c..86b0b81 100644 --- a/app/forms.py +++ b/app/forms.py @@ -20,4 +20,5 @@ class SnippetForm(FlaskForm): language = SelectField("Language", choices=LANGUAGES) code = TextAreaField("Code", validators=[DataRequired()]) description = StringField("Description", validators=[Length(max=200)]) + collection = StringField("Collection", validators=[Length(max=50)]) tags = StringField("Tags (comma separated)") \ No newline at end of file diff --git a/app/models.py b/app/models.py index 8e6efba..727a403 100644 --- a/app/models.py +++ b/app/models.py @@ -1,6 +1,6 @@ from datetime import datetime, UTC -def make_snippet(title, language, code, description, tags): +def make_snippet(title, language, code, description, tags, collection=""): """ Returns a clean snippet document ready to insert into MongoDB. Centralizing this means if we ever change the schema, @@ -12,6 +12,7 @@ def make_snippet(title, language, code, description, tags): "code": code, "description": description, "tags": tags, + "collection": collection, "created_at": datetime.now(UTC), "updated_at": datetime.now(UTC) diff --git a/app/routes.py b/app/routes.py index 9ffbaa8..d1be722 100644 --- a/app/routes.py +++ b/app/routes.py @@ -18,6 +18,7 @@ def index(): query = request.args.get("q", "") tag = request.args.get("tag", "") language = request.args.get("language", "") + collection = request.args.get("collection", "") page = request.args.get("page", 1, type=int) page = max(page, 1) @@ -32,6 +33,8 @@ def index(): filters["tags"] = tag if language: filters["language"] = language + if collection: + filters["collection"] = collection total_snippets = snippets_collection.count_documents(filters) total_pages = ceil(total_snippets / PAGE_SIZE) if total_snippets else 0 @@ -47,12 +50,14 @@ def index(): ) languages = snippets_collection.distinct("language") + collections = snippets_collection.distinct("collection") pagination_params = { key: value for key, value in { "q": query, "tag": tag, "language": language, + "collection": collection, }.items() if value } @@ -64,7 +69,9 @@ def index(): query=query, tag=tag, language=language, + collection=collection, languages=languages, + collections=[c for c in collections if c], page=page, total_pages=total_pages, pagination_params=pagination_params, @@ -82,6 +89,7 @@ def add_snippet(): code=form.code.data, description=form.description.data, tags=tags, + collection=form.collection.data, ) snippets_collection.insert_one(snippet) flash("Snip saved successfully!", "success") @@ -120,6 +128,7 @@ def edit_snippet(id): "language": form.language.data, "code": form.code.data, "description": form.description.data, + "collection": form.collection.data, "tags": tags, "updated_at": datetime.now(UTC), } @@ -133,6 +142,7 @@ def edit_snippet(id): form.language.data = snippet["language"] form.code.data = snippet["code"] form.description.data = snippet.get("description", "") + form.collection.data = snippet.get("collection", "") form.tags.data = ", ".join(snippet.get("tags", [])) return render_template("edit.html", form=form, snippet=snippet) diff --git a/app/templates/add.html b/app/templates/add.html index 12a0383..552432b 100644 --- a/app/templates/add.html +++ b/app/templates/add.html @@ -21,6 +21,11 @@
{{ snippet.description }}
diff --git a/tests/test_routes.py b/tests/test_routes.py index e89d915..7f4d84b 100644 --- a/tests/test_routes.py +++ b/tests/test_routes.py @@ -188,3 +188,19 @@ def test_pagination_handles_empty_results(client, fake_collection): assert response.status_code == 200 assert b"0 snippets found" in response.data assert b"Page 1 of" not in response.data + + +def test_filter_by_collection(client, fake_collection): + """Home page should filter snippets by collection""" + snip1 = make_test_snippet(1) + snip1["collection"] = "Work" + snip2 = make_test_snippet(2) + snip2["collection"] = "Personal" + fake_collection.documents = [snip1, snip2] + + response = client.get("/?collection=Work") + assert response.status_code == 200 + assert b"1 snippet found" in response.data + assert b"Snippet 01" in response.data + assert b"Snippet 02" not in response.data +