prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  Separate promotion permissions in eventadmin inline from the main promotion perms
  ### What?
  Currently, people need add/change_promotionrequest permission to make promotionrequests for their events. But with this permission they also get full access to all other promotionrequests. So we should make the inline in the eventadmin bypass that check. For all I care, anyone who can change an event can make a promorquest from the eventadmin (by virtue of their 'change_event' permission and being an organizer of the event), without having the add/change_promotionrequest permission, and thus without seeing the main Promotion Requests changelist page.
  
  ### Why?
  <!-- A clear and concise motivation why we should consider implementing this. -->
  Least privilege principle: many people should be allowed to request promotion for their own events, but don't need to be able to edit unrelated requests. And this way we can have promocie be able to bypass the requirements in #3529, without normal organizers being able to do the same.
  
  ### How?
  Override has_xxx_permission() on the inline class. Read the inlinemodeladmin docs for guidance.
  
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `website/events/admin/inlines.py`
  Content:
  ```
  1 from django.contrib import admin
  2 
  3 from events import models
  4 from pizzas.models import FoodEvent
  5 from promotion.models import PromotionRequest
  6 
  7 from .forms import RegistrationInformationFieldForm
  8 
  9 
  10 class RegistrationInformationFieldInline(admin.TabularInline):
  11     """The inline for registration information fields in the Event admin."""
  12 
  13     form = RegistrationInformationFieldForm
  14     extra = 0
  15     model = models.RegistrationInformationField
  16     ordering = ("_order",)
  17 
  18     radio_fields = {"type": admin.VERTICAL}
  19 
  20     def get_formset(self, request, obj=None, **kwargs):
  21         formset = super().get_formset(request, obj, **kwargs)
  22         if obj is not None:
  23             count = obj.registrationinformationfield_set.count()
  24             formset.form.declared_fields["order"].initial = count
  25         return formset
  26 
  27 
  28 class PizzaEventInline(admin.StackedInline):
  29     """The inline for pizza events in the Event admin."""
  30 
  31     model = FoodEvent
  32     extra = 0
  33     max_num = 1
  34 
  35 
  36 class PromotionRequestInline(admin.StackedInline):
  37     model = PromotionRequest
  38     readonly_fields = (
  39         "assigned_to",
  40         "status",
  41         "drive_folder",
  42     )
  43     extra = 0
  44
  ```
  --- 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/website/events/admin/inlines.py b/website/events/admin/inlines.py
  --- a/website/events/admin/inlines.py
  +++ b/website/events/admin/inlines.py
  @@ -39,5 +39,19 @@
           "assigned_to",
           "status",
           "drive_folder",
  +        "status_updated",
       )
  +
  +    def has_add_permission(self, request, obj=None):
  +        return True
  +
  +    def has_view_permission(self, request, obj=None):
  +        return True
  +
  +    def has_change_permission(self, request, obj=None):
  +        return True
  +
  +    def has_delete_permission(self, request, obj=None):
  +        return True
  +
       extra = 0
  
verification_info: {"golden_diff": "diff --git a/website/events/admin/inlines.py b/website/events/admin/inlines.py\n--- a/website/events/admin/inlines.py\n+++ b/website/events/admin/inlines.py\n@@ -39,5 +39,19 @@\n         \"assigned_to\",\n         \"status\",\n         \"drive_folder\",\n+        \"status_updated\",\n     )\n+\n+    def has_add_permission(self, request, obj=None):\n+        return True\n+\n+    def has_view_permission(self, request, obj=None):\n+        return True\n+\n+    def has_change_permission(self, request, obj=None):\n+        return True\n+\n+    def has_delete_permission(self, request, obj=None):\n+        return True\n+\n     extra = 0\n", "issue": "Separate promotion permissions in eventadmin inline from the main promotion perms\n### What?\r\nCurrently, people need add/change_promotionrequest permission to make promotionrequests for their events. But with this permission they also get full access to all other promotionrequests. So we should make the inline in the eventadmin bypass that check. For all I care, anyone who can change an event can make a promorquest from the eventadmin (by virtue of their 'change_event' permission and being an organizer of the event), without having the add/change_promotionrequest permission, and thus without seeing the main Promotion Requests changelist page.\r\n\r\n### Why?\r\n<!-- A clear and concise motivation why we should consider implementing this. -->\r\nLeast privilege principle: many people should be allowed to request promotion for their own events, but don't need to be able to edit unrelated requests. And this way we can have promocie be able to bypass the requirements in #3529, without normal organizers being able to do the same.\r\n\r\n### How?\r\nOverride has_xxx_permission() on the inline class. Read the inlinemodeladmin docs for guidance.\r\n\n", "before_files": [{"content": "from django.contrib import admin\n\nfrom events import models\nfrom pizzas.models import FoodEvent\nfrom promotion.models import PromotionRequest\n\nfrom .forms import RegistrationInformationFieldForm\n\n\nclass RegistrationInformationFieldInline(admin.TabularInline):\n    \"\"\"The inline for registration information fields in the Event admin.\"\"\"\n\n    form = RegistrationInformationFieldForm\n    extra = 0\n    model = models.RegistrationInformationField\n    ordering = (\"_order\",)\n\n    radio_fields = {\"type\": admin.VERTICAL}\n\n    def get_formset(self, request, obj=None, **kwargs):\n        formset = super().get_formset(request, obj, **kwargs)\n        if obj is not None:\n            count = obj.registrationinformationfield_set.count()\n            formset.form.declared_fields[\"order\"].initial = count\n        return formset\n\n\nclass PizzaEventInline(admin.StackedInline):\n    \"\"\"The inline for pizza events in the Event admin.\"\"\"\n\n    model = FoodEvent\n    extra = 0\n    max_num = 1\n\n\nclass PromotionRequestInline(admin.StackedInline):\n    model = PromotionRequest\n    readonly_fields = (\n        \"assigned_to\",\n        \"status\",\n        \"drive_folder\",\n    )\n    extra = 0\n", "path": "website/events/admin/inlines.py"}], "after_files": [{"content": "from django.contrib import admin\n\nfrom events import models\nfrom pizzas.models import FoodEvent\nfrom promotion.models import PromotionRequest\n\nfrom .forms import RegistrationInformationFieldForm\n\n\nclass RegistrationInformationFieldInline(admin.TabularInline):\n    \"\"\"The inline for registration information fields in the Event admin.\"\"\"\n\n    form = RegistrationInformationFieldForm\n    extra = 0\n    model = models.RegistrationInformationField\n    ordering = (\"_order\",)\n\n    radio_fields = {\"type\": admin.VERTICAL}\n\n    def get_formset(self, request, obj=None, **kwargs):\n        formset = super().get_formset(request, obj, **kwargs)\n        if obj is not None:\n            count = obj.registrationinformationfield_set.count()\n            formset.form.declared_fields[\"order\"].initial = count\n        return formset\n\n\nclass PizzaEventInline(admin.StackedInline):\n    \"\"\"The inline for pizza events in the Event admin.\"\"\"\n\n    model = FoodEvent\n    extra = 0\n    max_num = 1\n\n\nclass PromotionRequestInline(admin.StackedInline):\n    model = PromotionRequest\n    readonly_fields = (\n        \"assigned_to\",\n        \"status\",\n        \"drive_folder\",\n        \"status_updated\",\n    )\n\n    def has_add_permission(self, request, obj=None):\n        return True\n\n    def has_view_permission(self, request, obj=None):\n        return True\n\n    def has_change_permission(self, request, obj=None):\n        return True\n\n    def has_delete_permission(self, request, obj=None):\n        return True\n\n    extra = 0\n", "path": "website/events/admin/inlines.py"}]}