We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Move session data into session
atm there is data like sidebar stuff that is stored in the actual cookie.

apart from slowing down normal users (they send all that data in *every* request), bots are acumulating cookie cruft and needlessly posting that at our sites.

if the cookie cruft gets too long it gets truncated and errors out

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `pootle/core/helpers.py`
Content:
```
1 # -*- coding: utf-8 -*-
2 #
3 # Copyright (C) Pootle contributors.
4 #
5 # This file is a part of the Pootle project. It is distributed under the GPL3
6 # or later license. See the LICENSE file for a copy of the license and the
7 # AUTHORS file for copyright and authorship information.
8 
9 import json
10 from urllib import quote, unquote
11 
12 from django.utils import dateformat
13 
14 
15 SIDEBAR_COOKIE_NAME = 'pootle-browser-sidebar'
16 
17 
18 def get_sidebar_announcements_context(request, objects):
19     """Return the announcements context for the browser pages sidebar.
20 
21     :param request: a :cls:`django.http.HttpRequest` object.
22     :param objects: a tuple of Project, Language and TranslationProject to
23                     retrieve the announcements for. Any of those can be
24                     missing, but it is recommended for them to be in that exact
25                     order.
26     """
27     announcements = []
28     new_cookie_data = {}
29     cookie_data = {}
30 
31     if SIDEBAR_COOKIE_NAME in request.COOKIES:
32         json_str = unquote(request.COOKIES[SIDEBAR_COOKIE_NAME])
33         cookie_data = json.loads(json_str)
34 
35     is_sidebar_open = cookie_data.get('isOpen', True)
36 
37     for item in objects:
38         announcement = item.get_announcement(request.user)
39 
40         if announcement is None:
41             continue
42 
43         announcements.append(announcement)
44         # The virtual_path cannot be used as is for JSON.
45         ann_key = announcement.virtual_path.replace('/', '_')
46         ann_mtime = dateformat.format(announcement.modified_on, 'U')
47         stored_mtime = cookie_data.get(ann_key, None)
48 
49         if ann_mtime != stored_mtime:
50             new_cookie_data[ann_key] = ann_mtime
51 
52     if new_cookie_data:
53         # Some announcement has been changed or was never displayed before, so
54         # display sidebar and save the changed mtimes in the cookie to not
55         # display it next time unless it is necessary.
56         is_sidebar_open = True
57         cookie_data.update(new_cookie_data)
58         new_cookie_data = quote(json.dumps(cookie_data))
59 
60     ctx = {
61         'announcements': announcements,
62         'is_sidebar_open': is_sidebar_open,
63         'has_sidebar': len(announcements) > 0,
64     }
65 
66     return ctx, new_cookie_data
67
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/pootle/core/helpers.py b/pootle/core/helpers.py
--- a/pootle/core/helpers.py
+++ b/pootle/core/helpers.py
@@ -12,7 +12,7 @@
 from django.utils import dateformat
 
 
-SIDEBAR_COOKIE_NAME = 'pootle-browser-sidebar'
+SIDEBAR_COOKIE_NAME = 'pootle-browser-open-sidebar'
 
 
 def get_sidebar_announcements_context(request, objects):
@@ -24,6 +24,7 @@
                     missing, but it is recommended for them to be in that exact
                     order.
     """
+    must_show_announcement = False
     announcements = []
     new_cookie_data = {}
     cookie_data = {}
@@ -41,20 +42,20 @@
             continue
 
         announcements.append(announcement)
-        # The virtual_path cannot be used as is for JSON.
-        ann_key = announcement.virtual_path.replace('/', '_')
+
         ann_mtime = dateformat.format(announcement.modified_on, 'U')
-        stored_mtime = cookie_data.get(ann_key, None)
+        stored_mtime = request.session.get(announcement.virtual_path, None)
 
         if ann_mtime != stored_mtime:
-            new_cookie_data[ann_key] = ann_mtime
+            # Some announcement has been changed or was never displayed before,
+            # so display sidebar and save the changed mtimes in the session to
+            # not display it next time unless it is necessary.
+            must_show_announcement = True
+            request.session[announcement.virtual_path] = ann_mtime
 
-    if new_cookie_data:
-        # Some announcement has been changed or was never displayed before, so
-        # display sidebar and save the changed mtimes in the cookie to not
-        # display it next time unless it is necessary.
+    if must_show_announcement and not is_sidebar_open:
         is_sidebar_open = True
-        cookie_data.update(new_cookie_data)
+        cookie_data['isOpen'] = is_sidebar_open
         new_cookie_data = quote(json.dumps(cookie_data))
 
     ctx = {

{"golden_diff": "diff --git a/pootle/core/helpers.py b/pootle/core/helpers.py\n--- a/pootle/core/helpers.py\n+++ b/pootle/core/helpers.py\n@@ -12,7 +12,7 @@\n from django.utils import dateformat\n \n \n-SIDEBAR_COOKIE_NAME = 'pootle-browser-sidebar'\n+SIDEBAR_COOKIE_NAME = 'pootle-browser-open-sidebar'\n \n \n def get_sidebar_announcements_context(request, objects):\n@@ -24,6 +24,7 @@\n                     missing, but it is recommended for them to be in that exact\n                     order.\n     \"\"\"\n+    must_show_announcement = False\n     announcements = []\n     new_cookie_data = {}\n     cookie_data = {}\n@@ -41,20 +42,20 @@\n             continue\n \n         announcements.append(announcement)\n-        # The virtual_path cannot be used as is for JSON.\n-        ann_key = announcement.virtual_path.replace('/', '_')\n+\n         ann_mtime = dateformat.format(announcement.modified_on, 'U')\n-        stored_mtime = cookie_data.get(ann_key, None)\n+        stored_mtime = request.session.get(announcement.virtual_path, None)\n \n         if ann_mtime != stored_mtime:\n-            new_cookie_data[ann_key] = ann_mtime\n+            # Some announcement has been changed or was never displayed before,\n+            # so display sidebar and save the changed mtimes in the session to\n+            # not display it next time unless it is necessary.\n+            must_show_announcement = True\n+            request.session[announcement.virtual_path] = ann_mtime\n \n-    if new_cookie_data:\n-        # Some announcement has been changed or was never displayed before, so\n-        # display sidebar and save the changed mtimes in the cookie to not\n-        # display it next time unless it is necessary.\n+    if must_show_announcement and not is_sidebar_open:\n         is_sidebar_open = True\n-        cookie_data.update(new_cookie_data)\n+        cookie_data['isOpen'] = is_sidebar_open\n         new_cookie_data = quote(json.dumps(cookie_data))\n \n     ctx = {\n", "issue": "Move session data into session\natm there is data like sidebar stuff that is stored in the actual cookie.\r\n\r\napart from slowing down normal users (they send all that data in *every* request), bots are acumulating cookie cruft and needlessly posting that at our sites.\r\n\r\nif the cookie cruft gets too long it gets truncated and errors out\n", "before_files": [{"content": "# -*- coding: utf-8 -*-\n#\n# Copyright (C) Pootle contributors.\n#\n# This file is a part of the Pootle project. It is distributed under the GPL3\n# or later license. See the LICENSE file for a copy of the license and the\n# AUTHORS file for copyright and authorship information.\n\nimport json\nfrom urllib import quote, unquote\n\nfrom django.utils import dateformat\n\n\nSIDEBAR_COOKIE_NAME = 'pootle-browser-sidebar'\n\n\ndef get_sidebar_announcements_context(request, objects):\n    \"\"\"Return the announcements context for the browser pages sidebar.\n\n    :param request: a :cls:`django.http.HttpRequest` object.\n    :param objects: a tuple of Project, Language and TranslationProject to\n                    retrieve the announcements for. Any of those can be\n                    missing, but it is recommended for them to be in that exact\n                    order.\n    \"\"\"\n    announcements = []\n    new_cookie_data = {}\n    cookie_data = {}\n\n    if SIDEBAR_COOKIE_NAME in request.COOKIES:\n        json_str = unquote(request.COOKIES[SIDEBAR_COOKIE_NAME])\n        cookie_data = json.loads(json_str)\n\n    is_sidebar_open = cookie_data.get('isOpen', True)\n\n    for item in objects:\n        announcement = item.get_announcement(request.user)\n\n        if announcement is None:\n            continue\n\n        announcements.append(announcement)\n        # The virtual_path cannot be used as is for JSON.\n        ann_key = announcement.virtual_path.replace('/', '_')\n        ann_mtime = dateformat.format(announcement.modified_on, 'U')\n        stored_mtime = cookie_data.get(ann_key, None)\n\n        if ann_mtime != stored_mtime:\n            new_cookie_data[ann_key] = ann_mtime\n\n    if new_cookie_data:\n        # Some announcement has been changed or was never displayed before, so\n        # display sidebar and save the changed mtimes in the cookie to not\n        # display it next time unless it is necessary.\n        is_sidebar_open = True\n        cookie_data.update(new_cookie_data)\n        new_cookie_data = quote(json.dumps(cookie_data))\n\n    ctx = {\n        'announcements': announcements,\n        'is_sidebar_open': is_sidebar_open,\n        'has_sidebar': len(announcements) > 0,\n    }\n\n    return ctx, new_cookie_data\n", "path": "pootle/core/helpers.py"}], "after_files": [{"content": "# -*- coding: utf-8 -*-\n#\n# Copyright (C) Pootle contributors.\n#\n# This file is a part of the Pootle project. It is distributed under the GPL3\n# or later license. See the LICENSE file for a copy of the license and the\n# AUTHORS file for copyright and authorship information.\n\nimport json\nfrom urllib import quote, unquote\n\nfrom django.utils import dateformat\n\n\nSIDEBAR_COOKIE_NAME = 'pootle-browser-open-sidebar'\n\n\ndef get_sidebar_announcements_context(request, objects):\n    \"\"\"Return the announcements context for the browser pages sidebar.\n\n    :param request: a :cls:`django.http.HttpRequest` object.\n    :param objects: a tuple of Project, Language and TranslationProject to\n                    retrieve the announcements for. Any of those can be\n                    missing, but it is recommended for them to be in that exact\n                    order.\n    \"\"\"\n    must_show_announcement = False\n    announcements = []\n    new_cookie_data = {}\n    cookie_data = {}\n\n    if SIDEBAR_COOKIE_NAME in request.COOKIES:\n        json_str = unquote(request.COOKIES[SIDEBAR_COOKIE_NAME])\n        cookie_data = json.loads(json_str)\n\n    is_sidebar_open = cookie_data.get('isOpen', True)\n\n    for item in objects:\n        announcement = item.get_announcement(request.user)\n\n        if announcement is None:\n            continue\n\n        announcements.append(announcement)\n\n        ann_mtime = dateformat.format(announcement.modified_on, 'U')\n        stored_mtime = request.session.get(announcement.virtual_path, None)\n\n        if ann_mtime != stored_mtime:\n            # Some announcement has been changed or was never displayed before,\n            # so display sidebar and save the changed mtimes in the session to\n            # not display it next time unless it is necessary.\n            must_show_announcement = True\n            request.session[announcement.virtual_path] = ann_mtime\n\n    if must_show_announcement and not is_sidebar_open:\n        is_sidebar_open = True\n        cookie_data['isOpen'] = is_sidebar_open\n        new_cookie_data = quote(json.dumps(cookie_data))\n\n    ctx = {\n        'announcements': announcements,\n        'is_sidebar_open': is_sidebar_open,\n        'has_sidebar': len(announcements) > 0,\n    }\n\n    return ctx, new_cookie_data\n", "path": "pootle/core/helpers.py"}]}