Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
E
edx-platform
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
edx-platform
Commits
2a31e356
Commit
2a31e356
authored
Nov 06, 2013
by
John Jarvis
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
sending template pdf with certificate request
parent
64c0a8c9
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
136 additions
and
30 deletions
+136
-30
lms/djangoapps/certificates/management/commands/ungenerated_certs.py
+1
-0
lms/djangoapps/certificates/migrations/0015_adding_mode_for_verified_certs.py
+87
-0
lms/djangoapps/certificates/models.py
+5
-0
lms/djangoapps/certificates/queue.py
+43
-30
No files found.
lms/djangoapps/certificates/management/commands/ungenerated_certs.py
View file @
2a31e356
...
...
@@ -93,6 +93,7 @@ class Command(BaseCommand):
total
=
enrolled_students
.
count
()
count
=
0
start
=
datetime
.
datetime
.
now
(
UTC
)
for
student
in
enrolled_students
:
count
+=
1
if
count
%
STATUS_INTERVAL
==
0
:
...
...
lms/djangoapps/certificates/migrations/0015_adding_mode_for_verified_certs.py
0 → 100644
View file @
2a31e356
# -*- coding: utf-8 -*-
import
datetime
from
south.db
import
db
from
south.v2
import
SchemaMigration
from
django.db
import
models
class
Migration
(
SchemaMigration
):
def
forwards
(
self
,
orm
):
# Adding field 'GeneratedCertificate.mode'
db
.
add_column
(
'certificates_generatedcertificate'
,
'mode'
,
self
.
gf
(
'django.db.models.fields.CharField'
)(
default
=
'honor'
,
max_length
=
32
),
keep_default
=
False
)
def
backwards
(
self
,
orm
):
# Deleting field 'GeneratedCertificate.mode'
db
.
delete_column
(
'certificates_generatedcertificate'
,
'mode'
)
models
=
{
'auth.group'
:
{
'Meta'
:
{
'object_name'
:
'Group'
},
'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'80'
}),
'permissions'
:
(
'django.db.models.fields.related.ManyToManyField'
,
[],
{
'to'
:
"orm['auth.Permission']"
,
'symmetrical'
:
'False'
,
'blank'
:
'True'
})
},
'auth.permission'
:
{
'Meta'
:
{
'ordering'
:
"('content_type__app_label', 'content_type__model', 'codename')"
,
'unique_together'
:
"(('content_type', 'codename'),)"
,
'object_name'
:
'Permission'
},
'codename'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'100'
}),
'content_type'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
"orm['contenttypes.ContentType']"
}),
'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'50'
})
},
'auth.user'
:
{
'Meta'
:
{
'object_name'
:
'User'
},
'date_joined'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'email'
:
(
'django.db.models.fields.EmailField'
,
[],
{
'max_length'
:
'75'
,
'blank'
:
'True'
}),
'first_name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'30'
,
'blank'
:
'True'
}),
'groups'
:
(
'django.db.models.fields.related.ManyToManyField'
,
[],
{
'to'
:
"orm['auth.Group']"
,
'symmetrical'
:
'False'
,
'blank'
:
'True'
}),
'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'is_active'
:
(
'django.db.models.fields.BooleanField'
,
[],
{
'default'
:
'True'
}),
'is_staff'
:
(
'django.db.models.fields.BooleanField'
,
[],
{
'default'
:
'False'
}),
'is_superuser'
:
(
'django.db.models.fields.BooleanField'
,
[],
{
'default'
:
'False'
}),
'last_login'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'default'
:
'datetime.datetime.now'
}),
'last_name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'30'
,
'blank'
:
'True'
}),
'password'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'128'
}),
'user_permissions'
:
(
'django.db.models.fields.related.ManyToManyField'
,
[],
{
'to'
:
"orm['auth.Permission']"
,
'symmetrical'
:
'False'
,
'blank'
:
'True'
}),
'username'
:
(
'django.db.models.fields.CharField'
,
[],
{
'unique'
:
'True'
,
'max_length'
:
'30'
})
},
'certificates.certificatewhitelist'
:
{
'Meta'
:
{
'object_name'
:
'CertificateWhitelist'
},
'course_id'
:
(
'django.db.models.fields.CharField'
,
[],
{
'default'
:
"''"
,
'max_length'
:
'255'
,
'blank'
:
'True'
}),
'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'user'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
"orm['auth.User']"
}),
'whitelist'
:
(
'django.db.models.fields.BooleanField'
,
[],
{
'default'
:
'False'
})
},
'certificates.generatedcertificate'
:
{
'Meta'
:
{
'unique_together'
:
"(('user', 'course_id'),)"
,
'object_name'
:
'GeneratedCertificate'
},
'course_id'
:
(
'django.db.models.fields.CharField'
,
[],
{
'default'
:
"''"
,
'max_length'
:
'255'
,
'blank'
:
'True'
}),
'created_date'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'default'
:
'datetime.datetime.now'
,
'auto_now_add'
:
'True'
,
'blank'
:
'True'
}),
'distinction'
:
(
'django.db.models.fields.BooleanField'
,
[],
{
'default'
:
'False'
}),
'download_url'
:
(
'django.db.models.fields.CharField'
,
[],
{
'default'
:
"''"
,
'max_length'
:
'128'
,
'blank'
:
'True'
}),
'download_uuid'
:
(
'django.db.models.fields.CharField'
,
[],
{
'default'
:
"''"
,
'max_length'
:
'32'
,
'blank'
:
'True'
}),
'error_reason'
:
(
'django.db.models.fields.CharField'
,
[],
{
'default'
:
"''"
,
'max_length'
:
'512'
,
'blank'
:
'True'
}),
'grade'
:
(
'django.db.models.fields.CharField'
,
[],
{
'default'
:
"''"
,
'max_length'
:
'5'
,
'blank'
:
'True'
}),
'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'key'
:
(
'django.db.models.fields.CharField'
,
[],
{
'default'
:
"''"
,
'max_length'
:
'32'
,
'blank'
:
'True'
}),
'mode'
:
(
'django.db.models.fields.CharField'
,
[],
{
'default'
:
"'honor'"
,
'max_length'
:
'32'
}),
'modified_date'
:
(
'django.db.models.fields.DateTimeField'
,
[],
{
'default'
:
'datetime.datetime.now'
,
'auto_now'
:
'True'
,
'blank'
:
'True'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'255'
,
'blank'
:
'True'
}),
'status'
:
(
'django.db.models.fields.CharField'
,
[],
{
'default'
:
"'unavailable'"
,
'max_length'
:
'32'
}),
'user'
:
(
'django.db.models.fields.related.ForeignKey'
,
[],
{
'to'
:
"orm['auth.User']"
}),
'verify_uuid'
:
(
'django.db.models.fields.CharField'
,
[],
{
'default'
:
"''"
,
'max_length'
:
'32'
,
'blank'
:
'True'
})
},
'contenttypes.contenttype'
:
{
'Meta'
:
{
'ordering'
:
"('name',)"
,
'unique_together'
:
"(('app_label', 'model'),)"
,
'object_name'
:
'ContentType'
,
'db_table'
:
"'django_content_type'"
},
'app_label'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'100'
}),
'id'
:
(
'django.db.models.fields.AutoField'
,
[],
{
'primary_key'
:
'True'
}),
'model'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'100'
}),
'name'
:
(
'django.db.models.fields.CharField'
,
[],
{
'max_length'
:
'100'
})
}
}
complete_apps
=
[
'certificates'
]
\ No newline at end of file
lms/djangoapps/certificates/models.py
View file @
2a31e356
...
...
@@ -62,6 +62,10 @@ class CertificateStatuses(object):
restricted
=
'restricted'
unavailable
=
'unavailable'
class
CertificateModes
(
object
):
verified
=
'verified'
honor
=
'honor'
audit
=
'audit'
class
CertificateWhitelist
(
models
.
Model
):
"""
...
...
@@ -86,6 +90,7 @@ class GeneratedCertificate(models.Model):
key
=
models
.
CharField
(
max_length
=
32
,
blank
=
True
,
default
=
''
)
distinction
=
models
.
BooleanField
(
default
=
False
)
status
=
models
.
CharField
(
max_length
=
32
,
default
=
'unavailable'
)
mode
=
models
.
CharField
(
max_length
=
32
,
default
=
CertificateModes
.
honor
)
name
=
models
.
CharField
(
blank
=
True
,
max_length
=
255
)
created_date
=
models
.
DateTimeField
(
auto_now_add
=
True
,
default
=
datetime
.
now
)
...
...
lms/djangoapps/certificates/queue.py
View file @
2a31e356
...
...
@@ -9,7 +9,7 @@ from capa.xqueue_interface import XQueueInterface
from
capa.xqueue_interface
import
make_xheader
,
make_hashkey
from
django.conf
import
settings
from
requests.auth
import
HTTPBasicAuth
from
student.models
import
UserProfile
from
student.models
import
UserProfile
,
CourseEnrollment
import
json
import
random
...
...
@@ -57,7 +57,7 @@ class XQueueCertInterface(object):
if
settings
.
XQUEUE_INTERFACE
.
get
(
'basic_auth'
)
is
not
None
:
requests_auth
=
HTTPBasicAuth
(
*
settings
.
XQUEUE_INTERFACE
[
'basic_auth'
])
*
settings
.
XQUEUE_INTERFACE
[
'basic_auth'
])
else
:
requests_auth
=
None
...
...
@@ -68,10 +68,10 @@ class XQueueCertInterface(object):
self
.
request
=
request
self
.
xqueue_interface
=
XQueueInterface
(
settings
.
XQUEUE_INTERFACE
[
'url'
],
settings
.
XQUEUE_INTERFACE
[
'django_auth'
],
requests_auth
,
)
settings
.
XQUEUE_INTERFACE
[
'url'
],
settings
.
XQUEUE_INTERFACE
[
'django_auth'
],
requests_auth
,
)
self
.
whitelist
=
CertificateWhitelist
.
objects
.
all
()
self
.
restricted
=
UserProfile
.
objects
.
filter
(
allow_certificate
=
False
)
self
.
use_https
=
True
...
...
@@ -84,7 +84,7 @@ class XQueueCertInterface(object):
course_id - courseenrollment.course_id (string)
WARNING: this command will leave the old certificate, if one exists,
laying around in AWS taking up space. If this is a problem,
laying around in AWS taking up space. If this is a problem,
take pains to clean up storage before running this command.
Change the certificate status to unavailable (if it exists) and request
...
...
@@ -92,7 +92,7 @@ class XQueueCertInterface(object):
Return the status object.
"""
# TODO: when del_cert is implemented and plumbed through certificates
# TODO: when del_cert is implemented and plumbed through certificates
# repo also, do a deletion followed by a creation r/t a simple
# recreation. XXX: this leaves orphan cert files laying around in
# AWS. See note in the docstring too.
...
...
@@ -149,13 +149,15 @@ class XQueueCertInterface(object):
"""
VALID_STATUSES
=
[
status
.
generating
,
status
.
unavailable
,
status
.
deleted
,
status
.
unavailable
,
status
.
deleted
,
status
.
error
,
status
.
notpassing
]
cert_status
=
certificate_status_for_student
(
student
,
course_id
)[
'status'
]
new_status
=
cert_status
if
cert_status
in
VALID_STATUSES
:
# grade the student
...
...
@@ -165,9 +167,6 @@ class XQueueCertInterface(object):
course
=
courses
.
get_course_by_id
(
course_id
)
profile
=
UserProfile
.
objects
.
get
(
user
=
student
)
cert
,
created
=
GeneratedCertificate
.
objects
.
get_or_create
(
user
=
student
,
course_id
=
course_id
)
# Needed
self
.
request
.
user
=
student
self
.
request
.
session
=
{}
...
...
@@ -175,45 +174,59 @@ class XQueueCertInterface(object):
grade
=
grades
.
grade
(
student
,
self
.
request
,
course
)
is_whitelisted
=
self
.
whitelist
.
filter
(
user
=
student
,
course_id
=
course_id
,
whitelist
=
True
)
.
exists
()
enrollment
=
CourseEnrollment
.
objects
.
get
(
user
=
student
)
org
=
course_id
.
split
(
'/'
)[
0
]
course_num
=
course_id
.
split
(
'/'
)[
1
]
if
enrolment
.
mode
==
CertificateModes
.
verified
:
template_pdf
=
"certificate-template-{0}-{1}-verified.pdf"
.
format
(
org
,
course_num
)
else
:
# honor code and audit students
template_pdf
=
"certificate-template-{0}-{1}.pdf"
.
format
(
org
,
course_num
)
if
is_whitelisted
or
grade
[
'grade'
]
is
not
None
:
cert
,
created
=
GeneratedCertificate
.
objects
.
get_or_create
(
user
=
student
,
course_id
=
course_id
)
cert
.
mode
=
enrollment
.
mode
key
=
make_hashkey
(
random
.
random
())
cert
.
user
=
student
cert
.
grade
=
grade
[
'percent'
]
cert
.
course_id
=
course_id
cert
.
name
=
profile
.
name
cert
.
grade
=
grade
[
'percent'
]
cert
.
user
=
student
cert
.
course_id
=
course_id
cert
.
key
=
key
cert
.
name
=
profile
.
name
if
is_whitelisted
or
grade
[
'grade'
]
is
not
None
:
# check to see whether the student is on the
# the embargoed country restricted list
# otherwise, put a new certificate request
# on the queue
if
self
.
restricted
.
filter
(
user
=
student
)
.
exists
():
cert
.
status
=
status
.
restricted
new_status
=
status
.
restricted
cert
.
status
=
new_status
cert
.
save
()
else
:
key
=
make_hashkey
(
random
.
random
())
cert
.
key
=
key
contents
=
{
'action'
:
'create'
,
'username'
:
student
.
username
,
'course_id'
:
course_id
,
'name'
:
profile
.
name
,
'grade'
:
grade
[
'grade'
],
'template_pdf'
:
template_pdf
,
}
cert
.
status
=
status
.
generating
new_status
=
status
.
generating
cert
.
status
=
new_status
cert
.
save
()
self
.
_send_to_xqueue
(
contents
,
key
)
else
:
cert_status
=
status
.
notpassing
cert
.
grade
=
grade
[
'percent'
]
cert
.
user
=
student
cert
.
course_id
=
course_id
cert
.
name
=
profile
.
name
cert
.
status
=
cert_status
new_status
=
status
.
notpassing
cert
.
status
=
new_status
cert
.
save
()
return
cert
_status
return
new
_status
def
_send_to_xqueue
(
self
,
contents
,
key
):
...
...
@@ -227,7 +240,7 @@ class XQueueCertInterface(object):
proto
,
settings
.
SITE_NAME
,
key
),
key
,
settings
.
CERT_QUEUE
)
(
error
,
msg
)
=
self
.
xqueue_interface
.
send_to_queue
(
header
=
xheader
,
body
=
json
.
dumps
(
contents
))
header
=
xheader
,
body
=
json
.
dumps
(
contents
))
if
error
:
logger
.
critical
(
'Unable to add a request to the queue: {} {}'
.
format
(
error
,
msg
))
raise
Exception
(
'Unable to send queue message'
)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment