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
c9c8b476
Commit
c9c8b476
authored
Nov 07, 2012
by
David Ormsbee
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1024 from MITx/feature/dave/pearson_setup
Simple Pearson Testing
parents
e6e60c81
33361d02
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
501 additions
and
19 deletions
+501
-19
common/djangoapps/student/management/commands/pearson_export_cdd.py
+157
-0
common/djangoapps/student/management/commands/pearson_export_ead.py
+151
-0
common/djangoapps/student/management/commands/pearson_make_tc_user.py
+85
-0
common/djangoapps/student/migrations/0020_add_test_center_user.py
+0
-0
common/djangoapps/student/models.py
+70
-15
common/djangoapps/student/views.py
+25
-2
lms/djangoapps/courseware/models.py
+0
-2
lms/envs/aws.py
+3
-0
lms/envs/dev.py
+5
-0
lms/urls.py
+5
-0
No files found.
common/djangoapps/student/management/commands/pearson_export_cdd.py
0 → 100644
View file @
c9c8b476
import
csv
import
uuid
from
collections
import
defaultdict
,
OrderedDict
from
datetime
import
datetime
from
django.core.management.base
import
BaseCommand
,
CommandError
from
student.models
import
TestCenterUser
class
Command
(
BaseCommand
):
CSV_TO_MODEL_FIELDS
=
OrderedDict
([
(
"ClientCandidateID"
,
"client_candidate_id"
),
(
"FirstName"
,
"first_name"
),
(
"LastName"
,
"last_name"
),
(
"MiddleName"
,
"middle_name"
),
(
"Suffix"
,
"suffix"
),
(
"Salutation"
,
"salutation"
),
(
"Email"
,
"email"
),
# Skipping optional fields Username and Password
(
"Address1"
,
"address_1"
),
(
"Address2"
,
"address_2"
),
(
"Address3"
,
"address_3"
),
(
"City"
,
"city"
),
(
"State"
,
"state"
),
(
"PostalCode"
,
"postal_code"
),
(
"Country"
,
"country"
),
(
"Phone"
,
"phone"
),
(
"Extension"
,
"extension"
),
(
"PhoneCountryCode"
,
"phone_country_code"
),
(
"FAX"
,
"fax"
),
(
"FAXCountryCode"
,
"fax_country_code"
),
(
"CompanyName"
,
"company_name"
),
# Skipping optional field CustomQuestion
(
"LastUpdate"
,
"user_updated_at"
),
# in UTC, so same as what we store
])
args
=
'<output_file>'
help
=
"""
Export user information from TestCenterUser model into a tab delimited
text file with a format that Pearson expects.
"""
def
handle
(
self
,
*
args
,
**
kwargs
):
if
len
(
args
)
<
1
:
print
Command
.
help
return
self
.
reset_sample_data
()
with
open
(
args
[
0
],
"wb"
)
as
outfile
:
writer
=
csv
.
DictWriter
(
outfile
,
Command
.
CSV_TO_MODEL_FIELDS
,
delimiter
=
"
\t
"
,
quoting
=
csv
.
QUOTE_MINIMAL
,
extrasaction
=
'ignore'
)
writer
.
writeheader
()
for
tcu
in
TestCenterUser
.
objects
.
order_by
(
'id'
):
record
=
dict
((
csv_field
,
getattr
(
tcu
,
model_field
))
for
csv_field
,
model_field
in
Command
.
CSV_TO_MODEL_FIELDS
.
items
())
record
[
"LastUpdate"
]
=
record
[
"LastUpdate"
]
.
strftime
(
"
%
Y/
%
m/
%
d
%
H:
%
M:
%
S"
)
writer
.
writerow
(
record
)
def
reset_sample_data
(
self
):
def
make_sample
(
**
kwargs
):
data
=
dict
((
model_field
,
kwargs
.
get
(
model_field
,
""
))
for
model_field
in
Command
.
CSV_TO_MODEL_FIELDS
.
values
())
return
TestCenterUser
(
**
data
)
def
generate_id
():
return
"edX{:012}"
.
format
(
uuid
.
uuid4
()
.
int
%
(
10
**
12
))
# TestCenterUser.objects.all().delete()
samples
=
[
make_sample
(
client_candidate_id
=
generate_id
(),
first_name
=
"Jack"
,
last_name
=
"Doe"
,
middle_name
=
"C"
,
address_1
=
"11 Cambridge Center"
,
address_2
=
"Suite 101"
,
city
=
"Cambridge"
,
state
=
"MA"
,
postal_code
=
"02140"
,
country
=
"USA"
,
phone
=
"(617)555-5555"
,
phone_country_code
=
"1"
,
user_updated_at
=
datetime
.
utcnow
()
),
make_sample
(
client_candidate_id
=
generate_id
(),
first_name
=
"Clyde"
,
last_name
=
"Smith"
,
middle_name
=
"J"
,
suffix
=
"Jr."
,
salutation
=
"Mr."
,
address_1
=
"1 Penny Lane"
,
city
=
"Honolulu"
,
state
=
"HI"
,
postal_code
=
"96792"
,
country
=
"USA"
,
phone
=
"555-555-5555"
,
phone_country_code
=
"1"
,
user_updated_at
=
datetime
.
utcnow
()
),
make_sample
(
client_candidate_id
=
generate_id
(),
first_name
=
"Patty"
,
last_name
=
"Lee"
,
salutation
=
"Dr."
,
address_1
=
"P.O. Box 555"
,
city
=
"Honolulu"
,
state
=
"HI"
,
postal_code
=
"96792"
,
country
=
"USA"
,
phone
=
"808-555-5555"
,
phone_country_code
=
"1"
,
user_updated_at
=
datetime
.
utcnow
()
),
make_sample
(
client_candidate_id
=
generate_id
(),
first_name
=
"Jimmy"
,
last_name
=
"James"
,
address_1
=
"2020 Palmer Blvd."
,
city
=
"Springfield"
,
state
=
"MA"
,
postal_code
=
"96792"
,
country
=
"USA"
,
phone
=
"917-555-5555"
,
phone_country_code
=
"1"
,
extension
=
"2039"
,
fax
=
"917-555-5556"
,
fax_country_code
=
"1"
,
company_name
=
"ACME Traps"
,
user_updated_at
=
datetime
.
utcnow
()
),
make_sample
(
client_candidate_id
=
generate_id
(),
first_name
=
"Yeong-Un"
,
last_name
=
"Seo"
,
address_1
=
"Duryu, Lotte 101"
,
address_2
=
"Apt 55"
,
city
=
"Daegu"
,
country
=
"KOR"
,
phone
=
"917-555-5555"
,
phone_country_code
=
"011"
,
user_updated_at
=
datetime
.
utcnow
()
),
]
for
tcu
in
samples
:
tcu
.
save
()
\ No newline at end of file
common/djangoapps/student/management/commands/pearson_export_ead.py
0 → 100644
View file @
c9c8b476
import
csv
import
uuid
from
collections
import
defaultdict
,
OrderedDict
from
datetime
import
datetime
from
django.core.management.base
import
BaseCommand
,
CommandError
from
student.models
import
TestCenterUser
def
generate_id
():
return
"{:012}"
.
format
(
uuid
.
uuid4
()
.
int
%
(
10
**
12
))
class
Command
(
BaseCommand
):
args
=
'<output_file>'
help
=
"""
Export user information from TestCenterUser model into a tab delimited
text file with a format that Pearson expects.
"""
FIELDS
=
[
'AuthorizationTransactionType'
,
'AuthorizationID'
,
'ClientAuthorizationID'
,
'ClientCandidateID'
,
'ExamAuthorizationCount'
,
'ExamSeriesCode'
,
'EligibilityApptDateFirst'
,
'EligibilityApptDateLast'
,
'LastUpdate'
,
]
def
handle
(
self
,
*
args
,
**
kwargs
):
if
len
(
args
)
<
1
:
print
Command
.
help
return
# self.reset_sample_data()
with
open
(
args
[
0
],
"wb"
)
as
outfile
:
writer
=
csv
.
DictWriter
(
outfile
,
Command
.
FIELDS
,
delimiter
=
"
\t
"
,
quoting
=
csv
.
QUOTE_MINIMAL
,
extrasaction
=
'ignore'
)
writer
.
writeheader
()
for
tcu
in
TestCenterUser
.
objects
.
order_by
(
'id'
)[:
5
]:
record
=
defaultdict
(
lambda
:
""
,
AuthorizationTransactionType
=
"Add"
,
ClientAuthorizationID
=
generate_id
(),
ClientCandidateID
=
tcu
.
client_candidate_id
,
ExamAuthorizationCount
=
"1"
,
ExamSeriesCode
=
"6002x001"
,
EligibilityApptDateFirst
=
"2012/12/15"
,
EligibilityApptDateLast
=
"2012/12/30"
,
LastUpdate
=
datetime
.
utcnow
()
.
strftime
(
"
%
Y/
%
m/
%
d
%
H:
%
M:
%
S"
)
)
writer
.
writerow
(
record
)
def
reset_sample_data
(
self
):
def
make_sample
(
**
kwargs
):
data
=
dict
((
model_field
,
kwargs
.
get
(
model_field
,
""
))
for
model_field
in
Command
.
CSV_TO_MODEL_FIELDS
.
values
())
return
TestCenterUser
(
**
data
)
# TestCenterUser.objects.all().delete()
samples
=
[
make_sample
(
client_candidate_id
=
generate_id
(),
first_name
=
"Jack"
,
last_name
=
"Doe"
,
middle_name
=
"C"
,
address_1
=
"11 Cambridge Center"
,
address_2
=
"Suite 101"
,
city
=
"Cambridge"
,
state
=
"MA"
,
postal_code
=
"02140"
,
country
=
"USA"
,
phone
=
"(617)555-5555"
,
phone_country_code
=
"1"
,
user_updated_at
=
datetime
.
utcnow
()
),
make_sample
(
client_candidate_id
=
generate_id
(),
first_name
=
"Clyde"
,
last_name
=
"Smith"
,
middle_name
=
"J"
,
suffix
=
"Jr."
,
salutation
=
"Mr."
,
address_1
=
"1 Penny Lane"
,
city
=
"Honolulu"
,
state
=
"HI"
,
postal_code
=
"96792"
,
country
=
"USA"
,
phone
=
"555-555-5555"
,
phone_country_code
=
"1"
,
user_updated_at
=
datetime
.
utcnow
()
),
make_sample
(
client_candidate_id
=
generate_id
(),
first_name
=
"Patty"
,
last_name
=
"Lee"
,
salutation
=
"Dr."
,
address_1
=
"P.O. Box 555"
,
city
=
"Honolulu"
,
state
=
"HI"
,
postal_code
=
"96792"
,
country
=
"USA"
,
phone
=
"808-555-5555"
,
phone_country_code
=
"1"
,
user_updated_at
=
datetime
.
utcnow
()
),
make_sample
(
client_candidate_id
=
generate_id
(),
first_name
=
"Jimmy"
,
last_name
=
"James"
,
address_1
=
"2020 Palmer Blvd."
,
city
=
"Springfield"
,
state
=
"MA"
,
postal_code
=
"96792"
,
country
=
"USA"
,
phone
=
"917-555-5555"
,
phone_country_code
=
"1"
,
extension
=
"2039"
,
fax
=
"917-555-5556"
,
fax_country_code
=
"1"
,
company_name
=
"ACME Traps"
,
user_updated_at
=
datetime
.
utcnow
()
),
make_sample
(
client_candidate_id
=
generate_id
(),
first_name
=
"Yeong-Un"
,
last_name
=
"Seo"
,
address_1
=
"Duryu, Lotte 101"
,
address_2
=
"Apt 55"
,
city
=
"Daegu"
,
country
=
"KOR"
,
phone
=
"917-555-5555"
,
phone_country_code
=
"011"
,
user_updated_at
=
datetime
.
utcnow
()
),
]
for
tcu
in
samples
:
tcu
.
save
()
\ No newline at end of file
common/djangoapps/student/management/commands/pearson_make_tc_user.py
0 → 100644
View file @
c9c8b476
import
uuid
from
datetime
import
datetime
from
optparse
import
make_option
from
django.contrib.auth.models
import
User
from
django.core.management.base
import
BaseCommand
,
CommandError
from
student.models
import
TestCenterUser
class
Command
(
BaseCommand
):
option_list
=
BaseCommand
.
option_list
+
(
make_option
(
'--client_candidate_id'
,
action
=
'store'
,
dest
=
'client_candidate_id'
,
help
=
'ID we assign a user to identify them to Pearson'
),
make_option
(
'--first_name'
,
action
=
'store'
,
dest
=
'first_name'
,
),
make_option
(
'--last_name'
,
action
=
'store'
,
dest
=
'last_name'
,
),
make_option
(
'--address_1'
,
action
=
'store'
,
dest
=
'address_1'
,
),
make_option
(
'--city'
,
action
=
'store'
,
dest
=
'city'
,
),
make_option
(
'--state'
,
action
=
'store'
,
dest
=
'state'
,
help
=
'Two letter code (e.g. MA)'
),
make_option
(
'--postal_code'
,
action
=
'store'
,
dest
=
'postal_code'
,
),
make_option
(
'--country'
,
action
=
'store'
,
dest
=
'country'
,
help
=
'Three letter country code (ISO 3166-1 alpha-3), like USA'
),
make_option
(
'--phone'
,
action
=
'store'
,
dest
=
'phone'
,
help
=
'Pretty free-form (parens, spaces, dashes), but no country code'
),
make_option
(
'--phone_country_code'
,
action
=
'store'
,
dest
=
'phone_country_code'
,
help
=
'Phone country code, just "1" for the USA'
),
)
args
=
"<student_username>"
help
=
"Create a TestCenterUser entry for a given Student"
@staticmethod
def
is_valid_option
(
option_name
):
base_options
=
set
(
option
.
dest
for
option
in
BaseCommand
.
option_list
)
return
option_name
not
in
base_options
def
handle
(
self
,
*
args
,
**
options
):
username
=
args
[
0
]
print
username
our_options
=
dict
((
k
,
v
)
for
k
,
v
in
options
.
items
()
if
Command
.
is_valid_option
(
k
))
student
=
User
.
objects
.
get
(
username
=
username
)
student
.
test_center_user
=
TestCenterUser
(
**
our_options
)
student
.
test_center_user
.
save
()
common/djangoapps/student/migrations/0020_add_test_center_user.py
0 → 100644
View file @
c9c8b476
This diff is collapsed.
Click to expand it.
common/djangoapps/student/models.py
View file @
c9c8b476
...
...
@@ -8,7 +8,7 @@ Portal servers that hold the canoncial user information and that user
information is replicated to slave Course server pools. Each Course has a set of
servers that serves only its content and has users that are relevant only to it.
We replicate the following tables into the Course DBs where the user is
We replicate the following tables into the Course DBs where the user is
enrolled. Only the Portal servers should ever write to these models.
* UserProfile
* CourseEnrollment
...
...
@@ -41,33 +41,22 @@ import uuid
from
django.conf
import
settings
from
django.contrib.auth.models
import
User
from
django.db
import
models
from
django.db.models.signals
import
post_delete
,
post_save
from
django.dispatch
import
receiver
from
django_countries
import
CountryField
from
django.db.models.signals
import
post_save
from
django.dispatch
import
receiver
from
functools
import
partial
import
comment_client
as
cc
from
django_comment_client.models
import
Role
,
Permission
from
django_comment_client.models
import
Role
import
logging
from
xmodule.modulestore.django
import
modulestore
#from cache_toolbox import cache_model, cache_relation
log
=
logging
.
getLogger
(
__name__
)
class
UserProfile
(
models
.
Model
):
"""This is where we store all the user demographic fields. We have a
"""This is where we store all the user demographic fields. We have a
separate table for this rather than extending the built-in Django auth_user.
Notes:
* Some fields are legacy ones from the first run of 6.002, from which
* Some fields are legacy ones from the first run of 6.002, from which
we imported many users.
* Fields like name and address are intentionally open ended, to account
for international variations. An unfortunate side-effect is that we
...
...
@@ -133,6 +122,72 @@ class UserProfile(models.Model):
def
set_meta
(
self
,
js
):
self
.
meta
=
json
.
dumps
(
js
)
class
TestCenterUser
(
models
.
Model
):
"""This is our representation of the User for in-person testing, and
specifically for Pearson at this point. A few things to note:
* Pearson only supports Latin-1, so we have to make sure that the data we
capture here will work with that encoding.
* While we have a lot of this demographic data in UserProfile, it's much
more free-structured there. We'll try to pre-pop the form with data from
UserProfile, but we'll need to have a step where people who are signing
up re-enter their demographic data into the fields we specify.
* Users are only created here if they register to take an exam in person.
The field names and lengths are modeled on the conventions and constraints
of Pearson's data import system, including oddities such as suffix having
a limit of 255 while last_name only gets 50.
"""
# Our own record keeping...
user
=
models
.
ForeignKey
(
User
,
unique
=
True
,
default
=
None
)
created_at
=
models
.
DateTimeField
(
auto_now_add
=
True
,
db_index
=
True
)
updated_at
=
models
.
DateTimeField
(
auto_now
=
True
,
db_index
=
True
)
# user_updated_at happens only when the user makes a change to their data,
# and is something Pearson needs to know to manage updates. Unlike
# updated_at, this will not get incremented when we do a batch data import.
user_updated_at
=
models
.
DateTimeField
(
db_index
=
True
)
# Unique ID given to us for this User by the Testing Center. It's null when
# we first create the User entry, and is assigned by Pearson later.
candidate_id
=
models
.
IntegerField
(
null
=
True
,
db_index
=
True
)
# Unique ID we assign our user for a the Test Center.
client_candidate_id
=
models
.
CharField
(
max_length
=
50
,
db_index
=
True
)
# Name
first_name
=
models
.
CharField
(
max_length
=
30
,
db_index
=
True
)
last_name
=
models
.
CharField
(
max_length
=
50
,
db_index
=
True
)
middle_name
=
models
.
CharField
(
max_length
=
30
,
blank
=
True
)
suffix
=
models
.
CharField
(
max_length
=
255
,
blank
=
True
)
salutation
=
models
.
CharField
(
max_length
=
50
,
blank
=
True
)
# Address
address_1
=
models
.
CharField
(
max_length
=
40
)
address_2
=
models
.
CharField
(
max_length
=
40
,
blank
=
True
)
address_3
=
models
.
CharField
(
max_length
=
40
,
blank
=
True
)
city
=
models
.
CharField
(
max_length
=
32
,
db_index
=
True
)
# state example: HI -- they have an acceptable list that we'll just plug in
# state is required if you're in the US or Canada, but otherwise not.
state
=
models
.
CharField
(
max_length
=
20
,
blank
=
True
,
db_index
=
True
)
# postal_code required if you're in the US or Canada
postal_code
=
models
.
CharField
(
max_length
=
16
,
blank
=
True
,
db_index
=
True
)
# country is a ISO 3166-1 alpha-3 country code (e.g. "USA", "CAN", "MNG")
country
=
models
.
CharField
(
max_length
=
3
,
db_index
=
True
)
# Phone
phone
=
models
.
CharField
(
max_length
=
35
)
extension
=
models
.
CharField
(
max_length
=
8
,
blank
=
True
,
db_index
=
True
)
phone_country_code
=
models
.
CharField
(
max_length
=
3
,
db_index
=
True
)
fax
=
models
.
CharField
(
max_length
=
35
,
blank
=
True
)
# fax_country_code required *if* fax is present.
fax_country_code
=
models
.
CharField
(
max_length
=
3
,
blank
=
True
)
# Company
company_name
=
models
.
CharField
(
max_length
=
50
,
blank
=
True
)
@property
def
email
(
self
):
return
self
.
user
.
email
## TODO: Should be renamed to generic UserGroup, and possibly
# Given an optional field for type of group
...
...
common/djangoapps/student/views.py
View file @
c9c8b476
...
...
@@ -19,13 +19,13 @@ from django.core.context_processors import csrf
from
django.core.mail
import
send_mail
from
django.core.validators
import
validate_email
,
validate_slug
,
ValidationError
from
django.db
import
IntegrityError
from
django.http
import
HttpResponse
,
Http404
from
django.http
import
HttpResponse
,
Http
ResponseForbidden
,
Http
404
from
django.shortcuts
import
redirect
from
mitxmako.shortcuts
import
render_to_response
,
render_to_string
from
bs4
import
BeautifulSoup
from
django.core.cache
import
cache
from
django_future.csrf
import
ensure_csrf_cookie
from
django_future.csrf
import
ensure_csrf_cookie
,
csrf_exempt
from
student.models
import
(
Registration
,
UserProfile
,
PendingNameChange
,
PendingEmailChange
,
CourseEnrollment
)
...
...
@@ -774,3 +774,26 @@ def accept_name_change(request):
raise
Http404
return
accept_name_change_by_id
(
int
(
request
.
POST
[
'id'
]))
# TODO: This is a giant kludge to give Pearson something to test against ASAP.
# Will need to get replaced by something that actually ties into TestCenterUser
@csrf_exempt
def
test_center_login
(
request
):
if
not
settings
.
MITX_FEATURES
.
get
(
'ENABLE_PEARSON_HACK_TEST'
):
raise
Http404
client_candidate_id
=
request
.
POST
.
get
(
"clientCandidateID"
)
# registration_id = request.POST.get("registrationID")
exit_url
=
request
.
POST
.
get
(
"exitURL"
)
error_url
=
request
.
POST
.
get
(
"errorURL"
)
if
client_candidate_id
==
"edX003671291147"
:
user
=
authenticate
(
username
=
settings
.
PEARSON_TEST_USER
,
password
=
settings
.
PEARSON_TEST_PASSWORD
)
login
(
request
,
user
)
return
redirect
(
'/courses/MITx/6.002x/2012_Fall/courseware/Final_Exam/Final_Exam_Fall_2012/'
)
else
:
return
HttpResponseForbidden
()
lms/djangoapps/courseware/models.py
View file @
c9c8b476
...
...
@@ -108,7 +108,6 @@ class StudentModuleCache(object):
else
:
self
.
cache
=
[]
@classmethod
def
cache_for_descriptor_descendents
(
cls
,
course_id
,
user
,
descriptor
,
depth
=
None
,
descriptor_filter
=
lambda
descriptor
:
True
,
...
...
@@ -138,7 +137,6 @@ class StudentModuleCache(object):
return
descriptors
descriptors
=
get_child_descriptors
(
descriptor
,
depth
,
descriptor_filter
)
return
StudentModuleCache
(
course_id
,
user
,
descriptors
,
select_for_update
)
...
...
lms/envs/aws.py
View file @
c9c8b476
...
...
@@ -79,3 +79,5 @@ XQUEUE_INTERFACE = AUTH_TOKENS['XQUEUE_INTERFACE']
if
'COURSE_ID'
in
ENV_TOKENS
:
ASKBOT_URL
=
"courses/{0}/discussions/"
.
format
(
ENV_TOKENS
[
'COURSE_ID'
])
PEARSON_TEST_USER
=
"pearsontest"
PEARSON_TEST_PASSWORD
=
AUTH_TOKENS
.
get
(
"PEARSON_TEST_PASSWORD"
)
\ No newline at end of file
lms/envs/dev.py
View file @
c9c8b476
...
...
@@ -173,3 +173,8 @@ FILE_UPLOAD_HANDLERS = (
########################### PIPELINE #################################
PIPELINE_SASS_ARGUMENTS
=
'-r {proj_dir}/static/sass/bourbon/lib/bourbon.rb'
.
format
(
proj_dir
=
PROJECT_ROOT
)
########################## PEARSON TESTING ###########################
MITX_FEATURES
[
'ENABLE_PEARSON_HACK_TEST'
]
=
True
PEARSON_TEST_USER
=
"pearsontest"
PEARSON_TEST_PASSWORD
=
"12345"
lms/urls.py
View file @
c9c8b476
...
...
@@ -26,6 +26,11 @@ urlpatterns = ('',
url
(
r'^reject_name_change$'
,
'student.views.reject_name_change'
),
url
(
r'^pending_name_changes$'
,
'student.views.pending_name_changes'
),
url
(
r'^testcenter/login$'
,
'student.views.test_center_login'
),
# url(r'^testcenter/login$', 'student.test_center_views.login'),
# url(r'^testcenter/logout$', 'student.test_center_views.logout'),
url
(
r'^event$'
,
'track.views.user_track'
),
url
(
r'^t/(?P<template>[^/]*)$'
,
'static_template_view.views.index'
),
# TODO: Is this used anymore? What is STATIC_GRAB?
...
...
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