Commit 4f156dc0 by Will Daly

Updates to the verify student Django admin.

* Ensure that VerificationStatus is append-only and immutable.
* Allow searching by student for verification status.
* Properly pluralize verification status.
* Use ConfigModelAdmin for ICRV config model admin.
parent bd1e7a41
from ratelimitbackend import admin from ratelimitbackend import admin
from config_models.admin import ConfigurationModelAdmin
from verify_student.models import ( from verify_student.models import (
SoftwareSecurePhotoVerification, SoftwareSecurePhotoVerification,
InCourseReverificationConfiguration, InCourseReverificationConfiguration,
VerificationStatus VerificationStatus,
SkippedReverification,
) )
...@@ -20,12 +22,39 @@ class VerificationStatusAdmin(admin.ModelAdmin): ...@@ -20,12 +22,39 @@ class VerificationStatusAdmin(admin.ModelAdmin):
""" """
Admin for the VerificationStatus table. Admin for the VerificationStatus table.
""" """
list_display = ('id', 'user', 'status', 'checkpoint', 'location_id') list_display = ('timestamp', 'user', 'status', 'checkpoint', 'location_id')
search_fields = ( readonly_fields = ()
'checkpoint', search_fields = ('checkpoint', 'user')
)
def get_readonly_fields(self, request, obj=None):
"""When editing an existing record, all fields should be read-only.
VerificationStatus records should be immutable; to change the user's
status, create a new record with the updated status and a more
recent timestamp.
"""
if obj:
return self.readonly_fields + ('status', 'checkpoint', 'user', 'location_id', 'response', 'error')
return self.readonly_fields
def has_delete_permission(self, request, obj=None):
"""The verification status table is append-only. """
return False
class SkippedReverificationAdmin(admin.ModelAdmin):
"""Admin for the SkippedReverification table. """
list_display = ('created_at', 'user', 'course_id', 'checkpoint')
readonly_fields = ('user', 'course_id')
search_fields = ('user', 'course_id', 'checkpoint')
def has_add_permission(self, request):
"""Skipped verifications can't be created in Django admin. """
return False
admin.site.register(SoftwareSecurePhotoVerification, SoftwareSecurePhotoVerificationAdmin) admin.site.register(SoftwareSecurePhotoVerification, SoftwareSecurePhotoVerificationAdmin)
admin.site.register(InCourseReverificationConfiguration) admin.site.register(InCourseReverificationConfiguration, ConfigurationModelAdmin)
admin.site.register(SkippedReverification, SkippedReverificationAdmin)
admin.site.register(VerificationStatus, VerificationStatusAdmin) admin.site.register(VerificationStatus, VerificationStatusAdmin)
...@@ -974,6 +974,13 @@ class VerificationCheckpoint(models.Model): ...@@ -974,6 +974,13 @@ class VerificationCheckpoint(models.Model):
class Meta: # pylint: disable=missing-docstring, old-style-class class Meta: # pylint: disable=missing-docstring, old-style-class
unique_together = (('course_id', 'checkpoint_name'),) unique_together = (('course_id', 'checkpoint_name'),)
def __unicode__(self):
"""Unicode representation of the checkpoint. """
return u"{checkpoint} in {course}".format(
checkpoint=self.checkpoint_name,
course=self.course_id
)
def add_verification_attempt(self, verification_attempt): def add_verification_attempt(self, verification_attempt):
""" Add the verification attempt in M2M relation of photo_verification """ Add the verification attempt in M2M relation of photo_verification
...@@ -1047,6 +1054,8 @@ class VerificationStatus(models.Model): ...@@ -1047,6 +1054,8 @@ class VerificationStatus(models.Model):
class Meta(object): # pylint: disable=missing-docstring class Meta(object): # pylint: disable=missing-docstring
get_latest_by = "timestamp" get_latest_by = "timestamp"
verbose_name = "Verification Status"
verbose_name_plural = "Verification Statuses"
@classmethod @classmethod
def add_verification_status(cls, checkpoint, user, status, location_id=None): def add_verification_status(cls, checkpoint, user, status, location_id=None):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment