prompt: You will be provided with a partial code base and an issue statement explaining a problem to resolve.
  <issue>
  Bug: возможность замьютить самого себя
  ## Чеклист
  
  - [x] Я поискал поиском по трекеру похожие проблемы, в том числе в закрытых Issues
  - [x] Баг стабильно воспроизводится и я знаю как это сделать
  
  ## Описание бага
  
  Пользователь технически может замьюить самого себя, после чего не сможет увидеть свои посты и комментарии.
  Отмьютить себя пользователь тоже может самостоятельно (это работает в обе стороны).
  
  ## Ожидаемый результат
  
  - При вызове мьюта самого себя система показывает шаблон с заглушкой: нельзя мьютить себя.
  - Невозможность мьюта и размьюта самого себя.
  
  ## Шаги к воспроизведению
  
  1. **Mute**: перейти на URL `vas3k.club/user/%USERNAME%/mute/`, где `%USERNAME%` — псевдоним пользователя (slug) 
  2. Следовать мастеру мьюта.
  3. **Unmute**: перейти на URL `vas3k.club/user/%USERNAME%/mute/`, где `%USERNAME%` — псевдоним пользователя (slug) 
  4. Следовать мастеру мьюта.
  
  Скриншот со страницы шаблона мьюта (продакшн):
  ![image](https://user-images.githubusercontent.com/94802477/148997272-685359bd-4d61-4f69-9dee-2b6beb6045d3.png)
  
  </issue>
  <code>
  [start of users/views/muted.py]
  1 from django.conf import settings
  2 from django.http import HttpResponseForbidden
  3 from django.shortcuts import get_object_or_404, render
  4 
  5 from auth.helpers import auth_required
  6 from club.exceptions import AccessDenied
  7 from notifications.telegram.users import notify_admin_user_on_mute
  8 from users.models.mute import Muted
  9 from users.models.user import User
  10 
  11 
  12 @auth_required
  13 def toggle_mute(request, user_slug):
  14     user_to = get_object_or_404(User, slug=user_slug)
  15     if user_to.is_curator or user_to.is_moderator:
  16         raise AccessDenied(title="У этого юзера иммунитет от мьюта")
  17 
  18     total_user_muted_count = Muted.objects.filter(user_from=request.me).count()
  19 
  20     # show form on GET
  21     if request.method != "POST":
  22         is_muted = Muted.is_muted(
  23             user_from=request.me,
  24             user_to=user_to,
  25         )
  26         if is_muted:
  27             return render(request, "users/mute/unmute.html", {
  28                 "user": user_to,
  29             })
  30         else:
  31             return render(request, "users/mute/mute.html", {
  32                 "user": user_to,
  33                 "mutes_left": settings.MAX_MUTE_COUNT - total_user_muted_count,
  34             })
  35 
  36     # else — process POST
  37     if total_user_muted_count > settings.MAX_MUTE_COUNT:
  38         raise AccessDenied(
  39             title="Вы замьютили слишком много людей",
  40             message="Рекомендуем притормозить и поговорить с кем-нибудь..."
  41         )
  42 
  43     comment = request.POST.get("comment") or ""
  44     mute, is_created = Muted.mute(
  45         user_from=request.me,
  46         user_to=user_to,
  47         comment=comment,
  48     )
  49 
  50     if is_created:
  51         # notify admins
  52         notify_admin_user_on_mute(
  53             user_from=request.me,
  54             user_to=user_to,
  55             comment=comment,
  56         )
  57 
  58         return render(request, "users/messages/muted.html", {
  59             "user": user_to,
  60         })
  61     else:
  62         # unmute this user
  63         Muted.unmute(
  64             user_from=request.me,
  65             user_to=user_to,
  66         )
  67 
  68         return render(request, "users/messages/unmuted.html", {
  69             "user": user_to,
  70         })
  71 
  72 
  73 @auth_required
  74 def muted(request, user_slug):
  75     if request.me.slug != user_slug:
  76         return HttpResponseForbidden()
  77 
  78     user = get_object_or_404(User, slug=user_slug)
  79     muted_users = Muted.muted_by_user(user)
  80 
  81     return render(request, "users/mute/index.html", {
  82         "user": user,
  83         "muted": muted_users,
  84     })
  85
  [end of users/views/muted.py]
  </code>
  
  I need you to solve this issue by generating a single patch file that I can apply directly to this repository using git apply. Please respond with a single patch file in the following format.
  <patch>
  diff --git a/file.py b/file.py
  --- a/file.py
  +++ b/file.py
  @@ -1,27 +1,35 @@
   def euclidean(a, b):
  -    while b:
  -        a, b = b, a % b
  -    return a
  +    if b == 0:
  +        return a
  +    return euclidean(b, a % b)
   
   
   def bresenham(x0, y0, x1, y1):
       points = []
       dx = abs(x1 - x0)
       dy = abs(y1 - y0)
  -    sx = 1 if x0 < x1 else -1
  -    sy = 1 if y0 < y1 else -1
  -    err = dx - dy
  +    x, y = x0, y0
  +    sx = -1 if x0 > x1 else 1
  +    sy = -1 if y0 > y1 else 1
   
  -    while True:
  -        points.append((x0, y0))
  -        if x0 == x1 and y0 == y1:
  -            break
  -        e2 = 2 * err
  -        if e2 > -dy:
  -            err -= dy
  -            x0 += sx
  -        if e2 < dx:
  -            err += dx
  -            y0 += sy
  +    if dx > dy:
  +        err = dx / 2.0
  +        while x != x1:
  +            points.append((x, y))
  +            err -= dy
  +            if err < 0:
  +                y += sy
  +                err += dx
  +            x += sx
  +    else:
  +        err = dy / 2.0
  +        while y != y1:
  +            points.append((x, y))
  +            err -= dx
  +            if err < 0:
  +                x += sx
  +                err += dy
  +            y += sy
  +
  +    points.append((x, y))
       return points
  
  </patch>
golden_diff: diff --git a/users/views/muted.py b/users/views/muted.py
  --- a/users/views/muted.py
  +++ b/users/views/muted.py
  @@ -15,6 +15,10 @@
       if user_to.is_curator or user_to.is_moderator:
           raise AccessDenied(title="У этого юзера иммунитет от мьюта")
   
  +    if user_to == request.me:
  +        raise AccessDenied(title='Хорошая попытка, но мьютить себя нельзя. Кожаный мешок, ты прекрасен!',
  +                           message='')
  +
       total_user_muted_count = Muted.objects.filter(user_from=request.me).count()
   
       # show form on GET
  
verification_info: {"golden_diff": "diff --git a/users/views/muted.py b/users/views/muted.py\n--- a/users/views/muted.py\n+++ b/users/views/muted.py\n@@ -15,6 +15,10 @@\n     if user_to.is_curator or user_to.is_moderator:\n         raise AccessDenied(title=\"\u0423 \u044d\u0442\u043e\u0433\u043e \u044e\u0437\u0435\u0440\u0430 \u0438\u043c\u043c\u0443\u043d\u0438\u0442\u0435\u0442 \u043e\u0442 \u043c\u044c\u044e\u0442\u0430\")\n \n+    if user_to == request.me:\n+        raise AccessDenied(title='\u0425\u043e\u0440\u043e\u0448\u0430\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430, \u043d\u043e \u043c\u044c\u044e\u0442\u0438\u0442\u044c \u0441\u0435\u0431\u044f \u043d\u0435\u043b\u044c\u0437\u044f. \u041a\u043e\u0436\u0430\u043d\u044b\u0439 \u043c\u0435\u0448\u043e\u043a, \u0442\u044b \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u0435\u043d!',\n+                           message='')\n+\n     total_user_muted_count = Muted.objects.filter(user_from=request.me).count()\n \n     # show form on GET\n", "issue": "Bug: \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043c\u044c\u044e\u0442\u0438\u0442\u044c \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0435\u0431\u044f\n## \u0427\u0435\u043a\u043b\u0438\u0441\u0442\r\n\r\n- [x] \u042f \u043f\u043e\u0438\u0441\u043a\u0430\u043b \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u043f\u043e \u0442\u0440\u0435\u043a\u0435\u0440\u0443 \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0432 \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0445 Issues\r\n- [x] \u0411\u0430\u0433 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0438 \u044f \u0437\u043d\u0430\u044e \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c\r\n\r\n## \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0431\u0430\u0433\u0430\r\n\r\n\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043c\u044c\u044e\u0438\u0442\u044c \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0435\u0431\u044f, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u043e\u0441\u0442\u044b \u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438.\r\n\u041e\u0442\u043c\u044c\u044e\u0442\u0438\u0442\u044c \u0441\u0435\u0431\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e (\u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043e\u0431\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b).\r\n\r\n## \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\r\n\r\n- \u041f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043c\u044c\u044e\u0442\u0430 \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0435\u0431\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0448\u0430\u0431\u043b\u043e\u043d \u0441 \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u043e\u0439: \u043d\u0435\u043b\u044c\u0437\u044f \u043c\u044c\u044e\u0442\u0438\u0442\u044c \u0441\u0435\u0431\u044f.\r\n- \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043c\u044c\u044e\u0442\u0430 \u0438 \u0440\u0430\u0437\u043c\u044c\u044e\u0442\u0430 \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0435\u0431\u044f.\r\n\r\n## \u0428\u0430\u0433\u0438 \u043a \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044e\r\n\r\n1. **Mute**: \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 URL `vas3k.club/user/%USERNAME%/mute/`, \u0433\u0434\u0435 `%USERNAME%` \u2014 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (slug) \r\n2. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0442\u0435\u0440\u0443 \u043c\u044c\u044e\u0442\u0430.\r\n3. **Unmute**: \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 URL `vas3k.club/user/%USERNAME%/mute/`, \u0433\u0434\u0435 `%USERNAME%` \u2014 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (slug) \r\n4. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0442\u0435\u0440\u0443 \u043c\u044c\u044e\u0442\u0430.\r\n\r\n\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043c\u044c\u044e\u0442\u0430 (\u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d):\r\n![image](https://user-images.githubusercontent.com/94802477/148997272-685359bd-4d61-4f69-9dee-2b6beb6045d3.png)\n", "before_files": [{"content": "from django.conf import settings\nfrom django.http import HttpResponseForbidden\nfrom django.shortcuts import get_object_or_404, render\n\nfrom auth.helpers import auth_required\nfrom club.exceptions import AccessDenied\nfrom notifications.telegram.users import notify_admin_user_on_mute\nfrom users.models.mute import Muted\nfrom users.models.user import User\n\n\n@auth_required\ndef toggle_mute(request, user_slug):\n    user_to = get_object_or_404(User, slug=user_slug)\n    if user_to.is_curator or user_to.is_moderator:\n        raise AccessDenied(title=\"\u0423 \u044d\u0442\u043e\u0433\u043e \u044e\u0437\u0435\u0440\u0430 \u0438\u043c\u043c\u0443\u043d\u0438\u0442\u0435\u0442 \u043e\u0442 \u043c\u044c\u044e\u0442\u0430\")\n\n    total_user_muted_count = Muted.objects.filter(user_from=request.me).count()\n\n    # show form on GET\n    if request.method != \"POST\":\n        is_muted = Muted.is_muted(\n            user_from=request.me,\n            user_to=user_to,\n        )\n        if is_muted:\n            return render(request, \"users/mute/unmute.html\", {\n                \"user\": user_to,\n            })\n        else:\n            return render(request, \"users/mute/mute.html\", {\n                \"user\": user_to,\n                \"mutes_left\": settings.MAX_MUTE_COUNT - total_user_muted_count,\n            })\n\n    # else \u2014 process POST\n    if total_user_muted_count > settings.MAX_MUTE_COUNT:\n        raise AccessDenied(\n            title=\"\u0412\u044b \u0437\u0430\u043c\u044c\u044e\u0442\u0438\u043b\u0438 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u043b\u044e\u0434\u0435\u0439\",\n            message=\"\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c \u043f\u0440\u0438\u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0442\u044c \u0438 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u0441 \u043a\u0435\u043c-\u043d\u0438\u0431\u0443\u0434\u044c...\"\n        )\n\n    comment = request.POST.get(\"comment\") or \"\"\n    mute, is_created = Muted.mute(\n        user_from=request.me,\n        user_to=user_to,\n        comment=comment,\n    )\n\n    if is_created:\n        # notify admins\n        notify_admin_user_on_mute(\n            user_from=request.me,\n            user_to=user_to,\n            comment=comment,\n        )\n\n        return render(request, \"users/messages/muted.html\", {\n            \"user\": user_to,\n        })\n    else:\n        # unmute this user\n        Muted.unmute(\n            user_from=request.me,\n            user_to=user_to,\n        )\n\n        return render(request, \"users/messages/unmuted.html\", {\n            \"user\": user_to,\n        })\n\n\n@auth_required\ndef muted(request, user_slug):\n    if request.me.slug != user_slug:\n        return HttpResponseForbidden()\n\n    user = get_object_or_404(User, slug=user_slug)\n    muted_users = Muted.muted_by_user(user)\n\n    return render(request, \"users/mute/index.html\", {\n        \"user\": user,\n        \"muted\": muted_users,\n    })\n", "path": "users/views/muted.py"}]}