Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added Access control for admins / course instructors #21

Open
wants to merge 25 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 16 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
2fe9078
Integrated unfold admin & added important models fields to filter, di…
M97Chahboun Feb 11, 2024
c91f8ea
Fixed custom widgets conflict issue
M97Chahboun Feb 11, 2024
7000d5c
Revert database configurations
M97Chahboun Feb 13, 2024
c986c0c
Added django-unfold to pipfile
M97Chahboun Feb 13, 2024
b034ec7
Configured tailwind for use on admin custom widgets
M97Chahboun Feb 15, 2024
f8b5c77
format code
M97Chahboun Feb 15, 2024
c515aba
Merge branch 'main' of https://github.com/DataTalksClub/course-manage…
M97Chahboun Feb 15, 2024
08f419a
Revert static configuration
M97Chahboun Feb 15, 2024
d8db149
Fixed minor issues on course admin
M97Chahboun Feb 15, 2024
6e5fe70
Removed tailwind styling
M97Chahboun Feb 15, 2024
3a8eaf1
Merge branch 'main' of https://github.com/DataTalksClub/course-manage…
M97Chahboun Mar 22, 2024
d2c65ac
pipfile updated
alexeygrigorev Mar 23, 2024
7a70996
removed the account admin and modified the titles for the course admin
alexeygrigorev Mar 23, 2024
3df3029
Merge branch 'DataTalksClub:main' into main
M97Chahboun Mar 27, 2024
75df497
Added instructor to Course model
M97Chahboun Mar 27, 2024
61f73ec
Added Access control for admins / course instructors
M97Chahboun Mar 27, 2024
979ce37
Merge branch 'main' of https://github.com/DataTalksClub/course-manage…
M97Chahboun Apr 14, 2024
048c5cd
Added instructor field to course model
M97Chahboun Apr 14, 2024
4272fad
Updated course instructor field to manytomany field
M97Chahboun Apr 14, 2024
cab2860
Merge remote-tracking branch 'origin' into M97Chahboun/main
alexeygrigorev May 29, 2024
150a71a
Used ForeignKey instead of ManyToManyField
M97Chahboun Jun 27, 2024
7aedd6b
Merge branch 'main' of https://github.com/DataTalksClub/course-manage…
M97Chahboun Dec 3, 2024
32ad834
Added instructor add field migration
M97Chahboun Dec 3, 2024
8f7bbe9
Fixed add new user from admin issue
M97Chahboun Dec 3, 2024
3a650d9
Merge branch 'DataTalksClub:main' into main
M97Chahboun Jan 27, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 52 additions & 1 deletion courses/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,14 @@ class HomeworkAdmin(ModelAdmin):
actions = [score_selected_homeworks, set_most_popular_as_correct]
list_display = ["title", "course", "due_date", "is_scored"]
list_filter = ["course__slug"]

def formfield_for_foreignkey(self, db_field, request, obj=None, **kwargs):
kwargs = handled_course_choices(db_field, kwargs, request)
return super().formfield_for_foreignkey(db_field, request, **kwargs)

def get_queryset(self, request):
qs = super().get_queryset(request)
return get_queryset(request, qs, filter_field='course__instructor')


class CriteriaForm(forms.ModelForm):
Expand Down Expand Up @@ -113,7 +121,14 @@ class CourseAdmin(ModelAdmin):
actions = [update_leaderboard_admin]
inlines = [CriteriaInline]
list_display = ["title"]

def get_form(self, request, obj=None, **kwargs):
form = super().get_form(request, obj, **kwargs)
return get_form(request, form)

def get_queryset(self, request):
qs = super().get_queryset(request)
return get_queryset(request, qs)

def assign_peer_reviews_for_project_admin(
modeladmin, request, queryset
Expand Down Expand Up @@ -142,8 +157,44 @@ class ProjectAdmin(ModelAdmin):
list_display = ["title", "course", "state"]
list_filter = ["course__slug"]

def get_queryset(self, request):
qs = super().get_queryset(request)
return get_queryset(request, qs, filter_field='course__instructor')

def formfield_for_foreignkey(self, db_field, request, obj=None, **kwargs):
kwargs = handled_course_choices(db_field, kwargs, request)
return super().formfield_for_foreignkey(db_field, request, **kwargs)


@admin.register(ReviewCriteria)
class ReviewCriteriaAdmin(ModelAdmin):
pass

def get_queryset(self, request):
qs = super().get_queryset(request)
return get_queryset(request, qs, filter_field='course__instructor')

def formfield_for_foreignkey(self, db_field, request, obj=None, **kwargs):
kwargs = handled_course_choices(db_field, kwargs, request)
return super().formfield_for_foreignkey(db_field, request, **kwargs)

def get_queryset(request, qs, filter_field="instructor"):
if request.user.is_superuser:
return qs
else:
return qs.filter(**{filter_field: request.user})


def get_form(request, form):
if not request.user.is_superuser:
form.base_fields["instructor"].initial = request.user
form.base_fields["instructor"].widget = forms.HiddenInput()
return form

def handled_course_choices(db_field, kwargs, request):
if db_field.name == "course":
kwargs["queryset"] = (
Course.objects.all()
if request.user.is_superuser
else Course.objects.filter(instructor=request.user)
)
return kwargs
2 changes: 1 addition & 1 deletion courses/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@


class Course(models.Model):
instructor = models.ForeignKey(User, on_delete=models.CASCADE, related_name="courses_taught")
M97Chahboun marked this conversation as resolved.
Show resolved Hide resolved
slug = models.SlugField(unique=True, blank=False)
title = models.CharField(max_length=200)

description = models.TextField()
students = models.ManyToManyField(
User, through="Enrollment", related_name="courses_enrolled"
Expand Down