Repository: fidals/shopelectro

Issue:
Remove Canonical html tag on CategoryPage
[trello src](https://trello.com/c/QRjRPDKN/295-se-%D1%83%D0%B1%D0%B8%D1%80%D0%B0%D0%B9-canonical-url-%D0%BD%D0%B0-%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0%D1%85-%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82)

Сейчас [любая](https://www.shopelectro.ru/catalog/categories/zariadnye-ustroistva-242/tags/robiton/) страница с фильтрами, считается каноничной странице раздела.
Убирай тег  `<link rel="canonical" href="">` на всех страницах с фильтрами(по характеристикам. По цене, наличию,популярности и пагинации - оставь).


Discussion:

Resolving patch:
diff --git a/shopelectro/views/catalog.py b/shopelectro/views/catalog.py
--- a/shopelectro/views/catalog.py
+++ b/shopelectro/views/catalog.py
@@ -4,6 +4,7 @@
 from django.http import HttpResponse, HttpResponseForbidden
 from django.shortcuts import render, get_object_or_404
 from django.views.decorators.http import require_POST
+from django.urls import reverse
 from django_user_agents.utils import get_user_agent
 
 from catalog.views import catalog
@@ -112,6 +113,17 @@ def merge_products_and_images(products):
 class CategoryPage(catalog.CategoryPage):
 
     def get_context_data(self, **kwargs):
+
+        def get_category_canonical_url(slug, tags):
+            # patch canonical url for page.
+            # Using reverse(), not request.path to avoid "sorting" url option
+            return reverse(
+                'category', kwargs=dict(
+                    slug=slug,
+                    **tags and dict(tags=tags) or {}
+                )
+            )
+
         """Add sorting options and view_types in context."""
         context = super(CategoryPage, self).get_context_data(**kwargs)
         products_on_page = get_products_count(self.request)
@@ -182,6 +194,9 @@ def template_context(page, tags):
             'tags': tags,
             'view_type': view_type,
             'tags_metadata': tags_metadata,
+            'canonical_url': get_category_canonical_url(
+                slug=page.slug, tags=self.kwargs.get('tags')
+            ),
         }
 
 


Test patch:
diff --git a/shopelectro/tests/tests_views.py b/shopelectro/tests/tests_views.py
--- a/shopelectro/tests/tests_views.py
+++ b/shopelectro/tests/tests_views.py
@@ -39,6 +39,28 @@ def test_category_page_contains_all_tags(self):
         for tag_name in tag_names:
             self.assertContains(response, tag_name)
 
+    """
+    @todo #172 Создаём тест для таких сценариев:
+    Сценарий 1. CategoryPage with tag
+      - открываем CategoryPage с тегом.
+        Например /catalog/categories/zariadnye-ustroistva-242/tags/robiton/
+      - проверяем на этой странице метатег canonical.
+        Его значением должен быть полный урл:
+        `<link rel="canonical" href="/catalog/categories/zariadnye-ustroistva-242/">`
+
+    Сценарий 2. CategoryPage with sorted tag
+      - открываем CategoryPage с тегом и параметром сортировки.
+        Например /catalog/categories/zariadnye-ustroistva-242/1/tags/robiton/
+      - проверяем на этой странице метатег canonical.
+        Его значением должен быть урл категории без страницы сортировки:
+        `<link rel="canonical" href="/catalog/categories/zariadnye-ustroistva-242/tags/robiton/">`
+    """
+    def test_category_page_canonical_meta_tag(self):
+        """Category contains all Product's tags."""
+        url = reverse('category', args=(self.category.page.slug, ))
+        response = self.client.get(url)
+        self.assertContains(response, url)
+
     def test_product_by_certain_tags(self):
         """Category page contains Product's related by certain tags."""
         first_tag, last_tag = Tag.objects.all().first(), Tag.objects.last()