prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  About page requires login
  **Describe the bug**
  Accessing the "About this server" link (https://bookwyrm.social/about) redirects to login
  
  **To Reproduce**
  Steps to reproduce the behavior:
  1. Go to https://bookwyrm.social/about
  2. redirected to login instead of seeing an about page (the URL is login/?next=/about)
  
  **Expected behavior**
  Access to information about this site / server
  
  **Desktop (please complete the following information):**
   - OS: linux
   - Browser firefox
   - Version 85 (developer edition)
  
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `bookwyrm/views/landing.py`
  Content:
  ```
  1 ''' non-interactive pages '''
  2 from django.contrib.auth.decorators import login_required
  3 from django.core.paginator import Paginator
  4 from django.db.models import Avg, Max
  5 from django.template.response import TemplateResponse
  6 from django.utils import timezone
  7 from django.utils.decorators import method_decorator
  8 from django.views import View
  9 
  10 from bookwyrm import forms, models
  11 from bookwyrm.settings import PAGE_LENGTH
  12 from .helpers import get_activity_feed
  13 
  14 
  15 # pylint: disable= no-self-use
  16 @method_decorator(login_required, name='dispatch')
  17 class About(View):
  18     ''' create invites '''
  19     def get(self, request):
  20         ''' more information about the instance '''
  21         data = {
  22             'title': 'About',
  23         }
  24         return TemplateResponse(request, 'about.html', data)
  25 
  26 class Home(View):
  27     ''' discover page or home feed depending on auth '''
  28     def get(self, request):
  29         ''' this is the same as the feed on the home tab '''
  30         if request.user.is_authenticated:
  31             feed_view = Feed.as_view()
  32             return feed_view(request, 'home')
  33         discover_view = Discover.as_view()
  34         return discover_view(request)
  35 
  36 class Discover(View):
  37     ''' preview of recently reviewed books '''
  38     def get(self, request):
  39         ''' tiled book activity page '''
  40         books = models.Edition.objects.filter(
  41             review__published_date__isnull=False,
  42             review__user__local=True,
  43             review__privacy__in=['public', 'unlisted'],
  44         ).exclude(
  45             cover__exact=''
  46         ).annotate(
  47             Max('review__published_date')
  48         ).order_by('-review__published_date__max')[:6]
  49 
  50         ratings = {}
  51         for book in books:
  52             reviews = models.Review.objects.filter(
  53                 book__in=book.parent_work.editions.all()
  54             )
  55             reviews = get_activity_feed(
  56                 request.user, ['public', 'unlisted'], queryset=reviews)
  57             ratings[book.id] = reviews.aggregate(Avg('rating'))['rating__avg']
  58         data = {
  59             'title': 'Discover',
  60             'register_form': forms.RegisterForm(),
  61             'books': list(set(books)),
  62             'ratings': ratings
  63         }
  64         return TemplateResponse(request, 'discover.html', data)
  65 
  66 
  67 @method_decorator(login_required, name='dispatch')
  68 class Feed(View):
  69     ''' activity stream '''
  70     def get(self, request, tab):
  71         ''' user's homepage with activity feed '''
  72         try:
  73             page = int(request.GET.get('page', 1))
  74         except ValueError:
  75             page = 1
  76 
  77         suggested_books = get_suggested_books(request.user)
  78 
  79         if tab == 'home':
  80             activities = get_activity_feed(
  81                 request.user, ['public', 'unlisted', 'followers'],
  82                 following_only=True)
  83         elif tab == 'local':
  84             activities = get_activity_feed(
  85                 request.user, ['public', 'followers'], local_only=True)
  86         else:
  87             activities = get_activity_feed(
  88                 request.user, ['public', 'followers'])
  89         paginated = Paginator(activities, PAGE_LENGTH)
  90 
  91         goal = models.AnnualGoal.objects.filter(
  92             user=request.user, year=timezone.now().year
  93         ).first()
  94         data = {
  95             'title': 'Updates Feed',
  96             'user': request.user,
  97             'suggested_books': suggested_books,
  98             'activities': paginated.page(page),
  99             'tab': tab,
  100             'goal': goal,
  101             'goal_form': forms.GoalForm(),
  102         }
  103         return TemplateResponse(request, 'feed.html', data)
  104 
  105 
  106 def get_suggested_books(user, max_books=5):
  107     ''' helper to get a user's recent books '''
  108     book_count = 0
  109     preset_shelves = [
  110         ('reading', max_books), ('read', 2), ('to-read', max_books)
  111     ]
  112     suggested_books = []
  113     for (preset, shelf_max) in preset_shelves:
  114         limit = shelf_max if shelf_max < (max_books - book_count) \
  115                 else max_books - book_count
  116         shelf = user.shelf_set.get(identifier=preset)
  117 
  118         shelf_books = shelf.shelfbook_set.order_by(
  119             '-updated_date'
  120         ).all()[:limit]
  121         if not shelf_books:
  122             continue
  123         shelf_preview = {
  124             'name': shelf.name,
  125             'books': [s.book for s in shelf_books]
  126         }
  127         suggested_books.append(shelf_preview)
  128         book_count += len(shelf_preview['books'])
  129     return suggested_books
  130
  ```
  --- 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()
  
  ```
  
golden_diff: diff --git a/bookwyrm/views/landing.py b/bookwyrm/views/landing.py
  --- a/bookwyrm/views/landing.py
  +++ b/bookwyrm/views/landing.py
  @@ -13,7 +13,6 @@
   
   
   # pylint: disable= no-self-use
  -@method_decorator(login_required, name='dispatch')
   class About(View):
       ''' create invites '''
       def get(self, request):
  
verification_info: {"golden_diff": "diff --git a/bookwyrm/views/landing.py b/bookwyrm/views/landing.py\n--- a/bookwyrm/views/landing.py\n+++ b/bookwyrm/views/landing.py\n@@ -13,7 +13,6 @@\n \n \n # pylint: disable= no-self-use\n-@method_decorator(login_required, name='dispatch')\n class About(View):\n     ''' create invites '''\n     def get(self, request):\n", "issue": "About page requires login\n**Describe the bug**\r\nAccessing the \"About this server\" link (https://bookwyrm.social/about) redirects to login\r\n\r\n**To Reproduce**\r\nSteps to reproduce the behavior:\r\n1. Go to https://bookwyrm.social/about\r\n2. redirected to login instead of seeing an about page (the URL is login/?next=/about)\r\n\r\n**Expected behavior**\r\nAccess to information about this site / server\r\n\r\n**Desktop (please complete the following information):**\r\n - OS: linux\r\n - Browser firefox\r\n - Version 85 (developer edition)\r\n\n", "before_files": [{"content": "''' non-interactive pages '''\nfrom django.contrib.auth.decorators import login_required\nfrom django.core.paginator import Paginator\nfrom django.db.models import Avg, Max\nfrom django.template.response import TemplateResponse\nfrom django.utils import timezone\nfrom django.utils.decorators import method_decorator\nfrom django.views import View\n\nfrom bookwyrm import forms, models\nfrom bookwyrm.settings import PAGE_LENGTH\nfrom .helpers import get_activity_feed\n\n\n# pylint: disable= no-self-use\n@method_decorator(login_required, name='dispatch')\nclass About(View):\n    ''' create invites '''\n    def get(self, request):\n        ''' more information about the instance '''\n        data = {\n            'title': 'About',\n        }\n        return TemplateResponse(request, 'about.html', data)\n\nclass Home(View):\n    ''' discover page or home feed depending on auth '''\n    def get(self, request):\n        ''' this is the same as the feed on the home tab '''\n        if request.user.is_authenticated:\n            feed_view = Feed.as_view()\n            return feed_view(request, 'home')\n        discover_view = Discover.as_view()\n        return discover_view(request)\n\nclass Discover(View):\n    ''' preview of recently reviewed books '''\n    def get(self, request):\n        ''' tiled book activity page '''\n        books = models.Edition.objects.filter(\n            review__published_date__isnull=False,\n            review__user__local=True,\n            review__privacy__in=['public', 'unlisted'],\n        ).exclude(\n            cover__exact=''\n        ).annotate(\n            Max('review__published_date')\n        ).order_by('-review__published_date__max')[:6]\n\n        ratings = {}\n        for book in books:\n            reviews = models.Review.objects.filter(\n                book__in=book.parent_work.editions.all()\n            )\n            reviews = get_activity_feed(\n                request.user, ['public', 'unlisted'], queryset=reviews)\n            ratings[book.id] = reviews.aggregate(Avg('rating'))['rating__avg']\n        data = {\n            'title': 'Discover',\n            'register_form': forms.RegisterForm(),\n            'books': list(set(books)),\n            'ratings': ratings\n        }\n        return TemplateResponse(request, 'discover.html', data)\n\n\n@method_decorator(login_required, name='dispatch')\nclass Feed(View):\n    ''' activity stream '''\n    def get(self, request, tab):\n        ''' user's homepage with activity feed '''\n        try:\n            page = int(request.GET.get('page', 1))\n        except ValueError:\n            page = 1\n\n        suggested_books = get_suggested_books(request.user)\n\n        if tab == 'home':\n            activities = get_activity_feed(\n                request.user, ['public', 'unlisted', 'followers'],\n                following_only=True)\n        elif tab == 'local':\n            activities = get_activity_feed(\n                request.user, ['public', 'followers'], local_only=True)\n        else:\n            activities = get_activity_feed(\n                request.user, ['public', 'followers'])\n        paginated = Paginator(activities, PAGE_LENGTH)\n\n        goal = models.AnnualGoal.objects.filter(\n            user=request.user, year=timezone.now().year\n        ).first()\n        data = {\n            'title': 'Updates Feed',\n            'user': request.user,\n            'suggested_books': suggested_books,\n            'activities': paginated.page(page),\n            'tab': tab,\n            'goal': goal,\n            'goal_form': forms.GoalForm(),\n        }\n        return TemplateResponse(request, 'feed.html', data)\n\n\ndef get_suggested_books(user, max_books=5):\n    ''' helper to get a user's recent books '''\n    book_count = 0\n    preset_shelves = [\n        ('reading', max_books), ('read', 2), ('to-read', max_books)\n    ]\n    suggested_books = []\n    for (preset, shelf_max) in preset_shelves:\n        limit = shelf_max if shelf_max < (max_books - book_count) \\\n                else max_books - book_count\n        shelf = user.shelf_set.get(identifier=preset)\n\n        shelf_books = shelf.shelfbook_set.order_by(\n            '-updated_date'\n        ).all()[:limit]\n        if not shelf_books:\n            continue\n        shelf_preview = {\n            'name': shelf.name,\n            'books': [s.book for s in shelf_books]\n        }\n        suggested_books.append(shelf_preview)\n        book_count += len(shelf_preview['books'])\n    return suggested_books\n", "path": "bookwyrm/views/landing.py"}], "after_files": [{"content": "''' non-interactive pages '''\nfrom django.contrib.auth.decorators import login_required\nfrom django.core.paginator import Paginator\nfrom django.db.models import Avg, Max\nfrom django.template.response import TemplateResponse\nfrom django.utils import timezone\nfrom django.utils.decorators import method_decorator\nfrom django.views import View\n\nfrom bookwyrm import forms, models\nfrom bookwyrm.settings import PAGE_LENGTH\nfrom .helpers import get_activity_feed\n\n\n# pylint: disable= no-self-use\nclass About(View):\n    ''' create invites '''\n    def get(self, request):\n        ''' more information about the instance '''\n        data = {\n            'title': 'About',\n        }\n        return TemplateResponse(request, 'about.html', data)\n\nclass Home(View):\n    ''' discover page or home feed depending on auth '''\n    def get(self, request):\n        ''' this is the same as the feed on the home tab '''\n        if request.user.is_authenticated:\n            feed_view = Feed.as_view()\n            return feed_view(request, 'home')\n        discover_view = Discover.as_view()\n        return discover_view(request)\n\nclass Discover(View):\n    ''' preview of recently reviewed books '''\n    def get(self, request):\n        ''' tiled book activity page '''\n        books = models.Edition.objects.filter(\n            review__published_date__isnull=False,\n            review__user__local=True,\n            review__privacy__in=['public', 'unlisted'],\n        ).exclude(\n            cover__exact=''\n        ).annotate(\n            Max('review__published_date')\n        ).order_by('-review__published_date__max')[:6]\n\n        ratings = {}\n        for book in books:\n            reviews = models.Review.objects.filter(\n                book__in=book.parent_work.editions.all()\n            )\n            reviews = get_activity_feed(\n                request.user, ['public', 'unlisted'], queryset=reviews)\n            ratings[book.id] = reviews.aggregate(Avg('rating'))['rating__avg']\n        data = {\n            'title': 'Discover',\n            'register_form': forms.RegisterForm(),\n            'books': list(set(books)),\n            'ratings': ratings\n        }\n        return TemplateResponse(request, 'discover.html', data)\n\n\n@method_decorator(login_required, name='dispatch')\nclass Feed(View):\n    ''' activity stream '''\n    def get(self, request, tab):\n        ''' user's homepage with activity feed '''\n        try:\n            page = int(request.GET.get('page', 1))\n        except ValueError:\n            page = 1\n\n        suggested_books = get_suggested_books(request.user)\n\n        if tab == 'home':\n            activities = get_activity_feed(\n                request.user, ['public', 'unlisted', 'followers'],\n                following_only=True)\n        elif tab == 'local':\n            activities = get_activity_feed(\n                request.user, ['public', 'followers'], local_only=True)\n        else:\n            activities = get_activity_feed(\n                request.user, ['public', 'followers'])\n        paginated = Paginator(activities, PAGE_LENGTH)\n\n        goal = models.AnnualGoal.objects.filter(\n            user=request.user, year=timezone.now().year\n        ).first()\n        data = {\n            'title': 'Updates Feed',\n            'user': request.user,\n            'suggested_books': suggested_books,\n            'activities': paginated.page(page),\n            'tab': tab,\n            'goal': goal,\n            'goal_form': forms.GoalForm(),\n        }\n        return TemplateResponse(request, 'feed.html', data)\n\n\ndef get_suggested_books(user, max_books=5):\n    ''' helper to get a user's recent books '''\n    book_count = 0\n    preset_shelves = [\n        ('reading', max_books), ('read', 2), ('to-read', max_books)\n    ]\n    suggested_books = []\n    for (preset, shelf_max) in preset_shelves:\n        limit = shelf_max if shelf_max < (max_books - book_count) \\\n                else max_books - book_count\n        shelf = user.shelf_set.get(identifier=preset)\n\n        shelf_books = shelf.shelfbook_set.order_by(\n            '-updated_date'\n        ).all()[:limit]\n        if not shelf_books:\n            continue\n        shelf_preview = {\n            'name': shelf.name,\n            'books': [s.book for s in shelf_books]\n        }\n        suggested_books.append(shelf_preview)\n        book_count += len(shelf_preview['books'])\n    return suggested_books\n", "path": "bookwyrm/views/landing.py"}]}