Commit b8b86527 by Joe Blaylock

Certificates: Additional flags for regenerate_user

* -G allows explicit setting of grade condition (e.g., a string such as
  'Distinction', 'Pass', 'F', 'B') for the certificate, regardless of
  grader output for the user.
* -T allows explicit request of a particular certificate template to be
  applied to a given user's certificate regeneration, i.e.:
    -T doctor_distinction.pdf
  to generate a certificate of distinction for doctors.
parent 14d03784
...@@ -35,6 +35,16 @@ class Command(BaseCommand): ...@@ -35,6 +35,16 @@ class Command(BaseCommand):
dest='username', dest='username',
default=False, default=False,
help='The username or email address for whom grading and certification should be requested'), help='The username or email address for whom grading and certification should be requested'),
make_option('-G', '--grade',
metavar='GRADE',
dest='grade_value',
default=None,
help='The grade string, such as "Distinction", which should be passed to the certificate agent'),
make_option('-T', '--template',
metavar='TEMPLATE',
dest='template_file',
default=None,
help='The template file used to render this certificate, like "QMSE01-distinction.pdf"'),
) )
def handle(self, *args, **options): def handle(self, *args, **options):
...@@ -59,7 +69,9 @@ class Command(BaseCommand): ...@@ -59,7 +69,9 @@ class Command(BaseCommand):
xq = XQueueCertInterface() xq = XQueueCertInterface()
if options['insecure']: if options['insecure']:
xq.use_https = False xq.use_https = False
ret = xq.regen_cert(student, course_id, course=course) ret = xq.regen_cert(student, course_id, course=course,
forced_grade=options['grade_value'],
template_file=options['template_file'])
print '{0} - {1}'.format(student, ret) print '{0} - {1}'.format(student, ret)
else: else:
print "noop option given, skipping work queueing..." print "noop option given, skipping work queueing..."
...@@ -78,7 +78,7 @@ class XQueueCertInterface(object): ...@@ -78,7 +78,7 @@ class XQueueCertInterface(object):
self.restricted = UserProfile.objects.filter(allow_certificate=False) self.restricted = UserProfile.objects.filter(allow_certificate=False)
self.use_https = True self.use_https = True
def regen_cert(self, student, course_id, course=None): def regen_cert(self, student, course_id, course=None, forced_grade=None, template_file=None):
"""(Re-)Make certificate for a particular student in a particular course """(Re-)Make certificate for a particular student in a particular course
Arguments: Arguments:
...@@ -105,7 +105,7 @@ class XQueueCertInterface(object): ...@@ -105,7 +105,7 @@ class XQueueCertInterface(object):
except GeneratedCertificate.DoesNotExist: except GeneratedCertificate.DoesNotExist:
pass pass
return self.add_cert(student, course_id, course) return self.add_cert(student, course_id, course, forced_grade, template_file)
def del_cert(self, student, course_id): def del_cert(self, student, course_id):
...@@ -124,21 +124,24 @@ class XQueueCertInterface(object): ...@@ -124,21 +124,24 @@ class XQueueCertInterface(object):
raise NotImplementedError raise NotImplementedError
def add_cert(self, student, course_id, course=None): def add_cert(self, student, course_id, course=None, forced_grade=None, template_file=None, title='None'):
""" """
Request a new certificate for a student.
Arguments: Arguments:
student - User.object student - User.object
course_id - courseenrollment.course_id (string) course_id - courseenrollment.course_id (string)
forced_grade - a string indicating a grade parameter to pass with
the certificate request. If this is given, grading
will be skipped.
Request a new certificate for a student.
Will change the certificate status to 'generating'. Will change the certificate status to 'generating'.
Certificate must be in the 'unavailable', 'error', Certificate must be in the 'unavailable', 'error',
'deleted' or 'generating' state. 'deleted' or 'generating' state.
If a student has a passing grade or is in the whitelist If a student has a passing grade or is in the whitelist
table for the course a request will made for a new cert. table for the course a request will be made for a new cert.
If a student has allow_certificate set to False in the If a student has allow_certificate set to False in the
userprofile table the status will change to 'restricted' userprofile table the status will change to 'restricted'
...@@ -147,7 +150,6 @@ class XQueueCertInterface(object): ...@@ -147,7 +150,6 @@ class XQueueCertInterface(object):
will change to status.notpassing will change to status.notpassing
Returns the student's status Returns the student's status
""" """
VALID_STATUSES = [status.generating, VALID_STATUSES = [status.generating,
...@@ -173,9 +175,8 @@ class XQueueCertInterface(object): ...@@ -173,9 +175,8 @@ class XQueueCertInterface(object):
self.request.user = student self.request.user = student
self.request.session = {} self.request.session = {}
is_whitelisted = self.whitelist.filter(user=student, course_id=course_id, whitelist=True).exists()
grade = grades.grade(student, self.request, course) grade = grades.grade(student, self.request, course)
is_whitelisted = self.whitelist.filter(
user=student, course_id=course_id, whitelist=True).exists()
enrollment_mode = CourseEnrollment.enrollment_mode_for_user(student, course_id) enrollment_mode = CourseEnrollment.enrollment_mode_for_user(student, course_id)
mode_is_verified = (enrollment_mode == GeneratedCertificate.MODES.verified) mode_is_verified = (enrollment_mode == GeneratedCertificate.MODES.verified)
user_is_verified = SoftwareSecurePhotoVerification.user_is_verified(student) user_is_verified = SoftwareSecurePhotoVerification.user_is_verified(student)
...@@ -190,6 +191,8 @@ class XQueueCertInterface(object): ...@@ -190,6 +191,8 @@ class XQueueCertInterface(object):
else: else:
# honor code and audit students # honor code and audit students
template_pdf = "certificate-template-{org}-{course}.pdf".format(**course_id_dict) template_pdf = "certificate-template-{org}-{course}.pdf".format(**course_id_dict)
if forced_grade:
grade['grade'] = forced_grade
cert, __ = GeneratedCertificate.objects.get_or_create(user=student, course_id=course_id) cert, __ = GeneratedCertificate.objects.get_or_create(user=student, course_id=course_id)
...@@ -221,6 +224,8 @@ class XQueueCertInterface(object): ...@@ -221,6 +224,8 @@ class XQueueCertInterface(object):
'grade': grade['grade'], 'grade': grade['grade'],
'template_pdf': template_pdf, 'template_pdf': template_pdf,
} }
if template_file:
contents['template_pdf'] = template_file
new_status = status.generating new_status = status.generating
cert.status = new_status cert.status = new_status
cert.save() cert.save()
......
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