From aa9e2c33acf0e715adb00732bf018c1aa421e80a Mon Sep 17 00:00:00 2001 From: Liam DeVoe Date: Tue, 13 Jun 2023 00:22:37 -0400 Subject: [PATCH 1/2] add admin permission, move from is_staff to permission system --- home/migrations/0011_user_is_planetterp_admin.py | 15 +++++++++++++++ home/models.py | 15 +++++++++++---- home/tables/columns.py | 8 ++++---- home/tables/reviews_table.py | 4 ++-- home/templates/base_main.html | 4 ++-- home/templates/index.html | 2 +- home/templates/professor.html | 4 ++-- home/views/admin.py | 8 +++----- home/views/basic.py | 12 +++++------- home/views/endpoints.py | 2 +- home/views/professor.py | 2 +- 11 files changed, 47 insertions(+), 29 deletions(-) create mode 100644 home/migrations/0011_user_is_planetterp_admin.py diff --git a/home/migrations/0011_user_is_planetterp_admin.py b/home/migrations/0011_user_is_planetterp_admin.py new file mode 100644 index 00000000..d58d64e9 --- /dev/null +++ b/home/migrations/0011_user_is_planetterp_admin.py @@ -0,0 +1,15 @@ +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0010_initial_data'), + ] + + operations = [ + migrations.AlterModelOptions( + name='user', + options={'permissions': [('admin', 'Can take any planetterp admin actions')]}, + ), + ] diff --git a/home/models.py b/home/models.py index f7b48de0..96f19fed 100644 --- a/home/models.py +++ b/home/models.py @@ -331,11 +331,9 @@ class User(AbstractUser): objects = UserManager() send_review_email = BooleanField(default=True) - # accounts which are from ourumd are given an unusable password so nobody # can log in to the accounts from_ourumd = BooleanField(default=False) - username = CharField( max_length=22, unique=True, @@ -351,7 +349,6 @@ class User(AbstractUser): "unique": "A user with that username already exists." } ) - email = EmailField( unique=True, null=True, @@ -366,7 +363,6 @@ class User(AbstractUser): ) } ) - password = CharField( max_length=128, validators=[ @@ -377,6 +373,17 @@ class User(AbstractUser): } ) + class Meta: + # planetterp admins are a level between staff users and normal users: + # admins can view the admin panel and take all actions theiren, but + # cannot view the django admin panel. + # Essentially, this role is for site admins which should not have access + # to the prod db, which the django admin panel grants to a moderate + # degree. + permissions = [ + ("admin", "Can take any planetterp admin actions") + ] + # Workaround to force CharField to store empty values as NULL instead of '' # https://stackoverflow.com/a/38621160 def save(self, *args, **kwargs): diff --git a/home/tables/columns.py b/home/tables/columns.py index 5989feb0..fefdb64a 100644 --- a/home/tables/columns.py +++ b/home/tables/columns.py @@ -45,7 +45,7 @@ def grade_to_element(self, grade): def render(self, value: dict): review = value.pop("review") - is_staff = value.pop("is_staff") + is_planetterp_admin = value.pop("is_planetterp_admin") column_html = "" if review.professor.slug: @@ -80,7 +80,7 @@ def render(self, value: dict): # wrap long usernames to avoid increasing the information column width column_html += '' - if is_staff and review.user: + if is_planetterp_admin and review.user: if review.anonymous: column_html += ''' @@ -110,12 +110,12 @@ def render(self, value: dict): if review.created_at.date() >= date(2020, 3, 10) and review.created_at.date() <= date(2021, 8, 30): column_html += ' ' - if not review.user or (review.anonymous and not is_staff): + if not review.user or (review.anonymous and not is_planetterp_admin): username = "Anonymous" else: username = review.user.username - if is_staff: + if is_planetterp_admin: column_html += '''
diff --git a/home/tables/reviews_table.py b/home/tables/reviews_table.py index 91bfea0d..dfbbc2b4 100644 --- a/home/tables/reviews_table.py +++ b/home/tables/reviews_table.py @@ -59,7 +59,7 @@ def get_data(self, reviews: QuerySet[Review]): if ReviewsTableColumn.INFORMATION in self.columns: formatted_data['information'] = { "review": review, - "is_staff": self.request.user.is_staff + "is_planetterp_admin": self.request.user.has_perm("home.admin") } if ReviewsTableColumn.REVIEW in self.columns: formatted_data['review'] = {"review": review} @@ -87,7 +87,7 @@ def __init__(self, reviews, request, *args, **kwargs): ) self.columns = [ReviewsTableColumn.INFORMATION, ReviewsTableColumn.REVIEW] - if request.user.is_staff: + if request.user.has_perm("home.admin"): self.columns.append(ReviewsTableColumn.ACTION) kwargs = {"empty_text": empty_text} diff --git a/home/templates/base_main.html b/home/templates/base_main.html index cd4ebd6a..1db8bb47 100644 --- a/home/templates/base_main.html +++ b/home/templates/base_main.html @@ -33,7 +33,7 @@ - {% if user and user.is_staff %} + {% if user and perms.home.admin %} {% endif %} @@ -151,7 +151,7 @@