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
9882b30c
Commit
9882b30c
authored
Mar 19, 2012
by
Piotr Mitros
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Unknown changes/pre-git transition
--HG-- branch : pmitros-name-change
parent
7c73d7ef
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
115 additions
and
18 deletions
+115
-18
student/models.py
+11
-1
student/views.py
+98
-14
urls.py
+6
-3
No files found.
student/models.py
View file @
9882b30c
...
...
@@ -12,6 +12,7 @@ import uuid
from
django.db
import
models
from
django.contrib.auth.models
import
User
import
json
#from cache_toolbox import cache_model, cache_relation
...
...
@@ -29,6 +30,15 @@ class UserProfile(models.Model):
meta
=
models
.
CharField
(
blank
=
True
,
max_length
=
255
)
# JSON dictionary for future expansion
courseware
=
models
.
CharField
(
blank
=
True
,
max_length
=
255
,
default
=
'course.xml'
)
def
get_meta
():
try
:
js
=
json
.
reads
(
self
.
meta
)
except
:
js
=
dict
()
return
json
def
set_meta
(
js
):
self
.
meta
=
json
.
dumps
(
js
)
## TODO: Should be renamed to generic UserGroup, and possibly
# Given an optional field for type of group
class
UserTestGroup
(
models
.
Model
):
...
...
@@ -66,7 +76,7 @@ class PendingNameChange(models.Model):
class
PendingEmailChange
(
models
.
Model
):
user
=
models
.
OneToOneField
(
User
,
unique
=
True
,
db_index
=
True
)
new_email
=
models
.
CharField
(
blank
=
True
,
max_length
=
255
,
db_index
=
True
)
activation_key
=
models
.
CharField
((
'activation key'
),
max_length
=
32
,
unique
=
True
,
db_index
=
True
)
#cache_relation(User.profile)
...
...
student/views.py
View file @
9882b30c
...
...
@@ -8,6 +8,7 @@ from django.contrib.auth import logout, authenticate, login
from
django.contrib.auth.forms
import
PasswordResetForm
from
django.contrib.auth.models
import
User
from
django.core.context_processors
import
csrf
from
django.core.mail
import
send_mail
from
django.core.validators
import
validate_email
,
validate_slug
from
django.db
import
connection
from
django.http
import
HttpResponse
,
Http404
...
...
@@ -20,6 +21,8 @@ from django_future.csrf import ensure_csrf_cookie
log
=
logging
.
getLogger
(
"mitx.user"
)
def
csrf_token
(
context
):
''' A csrf token that can be included in a form.
'''
csrf_token
=
context
.
get
(
'csrf_token'
,
''
)
if
csrf_token
==
'NOTPROVIDED'
:
return
''
...
...
@@ -27,6 +30,8 @@ def csrf_token(context):
@ensure_csrf_cookie
def
index
(
request
):
''' Redirects to main page -- info page if user authenticated, or marketing if not
'''
if
settings
.
COURSEWARE_ENABLED
and
request
.
user
.
is_authenticated
():
return
redirect
(
'/info'
)
else
:
...
...
@@ -37,6 +42,7 @@ def index(request):
# Need different levels of logging
@ensure_csrf_cookie
def
login_user
(
request
,
error
=
""
):
''' AJAX request to log in the user. '''
if
'email'
not
in
request
.
POST
or
'password'
not
in
request
.
POST
:
return
HttpResponse
(
json
.
dumps
({
'success'
:
False
,
'error'
:
'Invalid login'
}))
# TODO: User error message
...
...
@@ -78,6 +84,7 @@ def login_user(request, error=""):
@ensure_csrf_cookie
def
logout_user
(
request
):
''' HTTP request to log in the user. Redirects to marketing page'''
logout
(
request
)
# print len(connection.queries), connection.queries
return
redirect
(
'/'
)
...
...
@@ -111,8 +118,6 @@ def create_account(request, post_override=None):
js
[
'value'
]
=
"Error (401 {field}). E-mail us."
.
format
(
field
=
a
)
return
HttpResponse
(
json
.
dumps
(
js
))
if
post_vars
[
'honor_code'
]
!=
u'true'
:
js
[
'value'
]
=
"To enroll, you must follow the honor code."
.
format
(
field
=
a
)
return
HttpResponse
(
json
.
dumps
(
js
))
...
...
@@ -181,16 +186,16 @@ def create_account(request, post_override=None):
'key'
:
r
.
activation_key
,
'site'
:
settings
.
SITE_NAME
}
subject
=
render_to_string
(
'activation_email_subject.txt'
,
d
)
subject
=
render_to_string
(
'
emails/
activation_email_subject.txt'
,
d
)
# Email subject *must not* contain newlines
subject
=
''
.
join
(
subject
.
splitlines
())
message
=
render_to_string
(
'activation_email.txt'
,
d
)
message
=
render_to_string
(
'
emails/
activation_email.txt'
,
d
)
try
:
if
not
settings
.
GENERATE_RANDOM_USER_CREDENTIALS
:
res
=
u
.
email_user
(
subject
,
message
,
settings
.
DEFAULT_FROM_EMAIL
)
except
:
js
[
'value'
]
=
str
(
sys
.
exc_info
())
js
[
'value'
]
=
'Could not send activation e-mail.'
return
HttpResponse
(
json
.
dumps
(
js
))
js
=
{
'success'
:
True
,
...
...
@@ -225,6 +230,8 @@ if settings.GENERATE_RANDOM_USER_CREDENTIALS:
@ensure_csrf_cookie
def
activate_account
(
request
,
key
):
''' When link in activation e-mail is clicked
'''
r
=
Registration
.
objects
.
filter
(
activation_key
=
key
)
if
len
(
r
)
==
1
:
if
not
r
[
0
]
.
user
.
is_active
:
...
...
@@ -257,15 +264,44 @@ def password_reset(request):
def
reactivation_email
(
request
):
''' Send an e-mail to reactivate a deactivated account, or to
resend an activation e-mail '''
pass
email
=
request
.
POST
[
'email'
]
try
:
user
=
User
.
objects
.
get
(
email
=
'email'
)
except
:
# TODO: Type of exception
return
HttpResponse
(
json
.
dumps
({
'success'
:
False
,
'error'
:
'No inactive user with this e-mail exists'
}))
if
user
.
is_active
:
return
HttpResponse
(
json
.
dumps
({
'success'
:
False
,
'error'
:
'User is already active'
}))
reg
=
Registration
.
objects
.
get
(
user
=
user
)
reg
.
register
(
user
)
d
=
{
'name'
:
UserProfile
.
get
(
user
=
user
)
.
name
,
'key'
:
r
.
activation_key
,
'site'
:
settings
.
SITE_NAME
}
subject
=
render_to_string
(
'reactivation_email_subject.txt'
,
d
)
subject
=
''
.
join
(
subject
.
splitlines
())
message
=
render_to_string
(
'reactivation_email.txt'
,
d
)
res
=
u
.
email_user
(
subject
,
message
,
settings
.
DEFAULT_FROM_EMAIL
)
return
HttpResponse
(
json
.
dumps
({
'success'
:
True
}))
@ensure_csrf_cookie
def
change_email_request
(
request
):
## Maske sure it checks for existing e-mail conflicts
''' AJAX call from the profile page. User wants a new e-mail.
'''
## Make sure it checks for existing e-mail conflicts
if
not
request
.
user
.
is_authenticated
:
raise
Http404
if
not
request
.
user
.
check_password
(
request
.
POST
[
'password'
]):
user
=
request
.
user
if
not
user
.
check_password
(
request
.
POST
[
'password'
]):
return
HttpResponse
(
json
.
dumps
({
'success'
:
False
,
'error'
:
'Invalid password'
}))
...
...
@@ -273,15 +309,64 @@ def change_email_request(request):
if
len
(
User
.
objects
.
filter
(
email
=
new_email
))
!=
0
:
## CRITICAL TODO: Handle case for e-mails
return
HttpResponse
(
json
.
dumps
({
'success'
:
False
,
'error'
:
'An account with this e-mail already exists.'
}))
'error'
:
'An account with this e-mail already exists.'
}))
pec_list
=
PendingEmailChange
.
objects
.
filter
(
user
=
request
.
user
)
if
len
(
pec_list
)
==
0
:
pec
=
PendingEmailChange
()
pec
.
user
=
user
else
:
pec
=
pec_list
[
0
]
pec
.
new_email
=
request
.
POST
[
'new_email'
]
pec
.
activation_key
=
uuid
.
uuid4
()
.
hex
pec
.
save
()
if
pec
.
new_email
==
user
.
email
:
pec
.
delete
()
return
HttpResponse
(
json
.
dumps
({
'success'
:
False
,
'error'
:
'Old email is the same as the new email.'
}))
request
.
POST
[
'new_email'
]
d
=
{
'site'
:
settings
.
SITE_NAME
,
'key'
:
pec
.
activation_key
,
'old_email'
:
user
.
email
,
'new_email'
:
pec
.
email
}
subject
=
render_to_string
(
'emails/email_change_subject.txt'
,
d
)
message
=
render_to_string
(
'emails/email_change.txt'
,
d
)
res
=
send_email
(
subject
,
message
,
settings
.
DEFAULT_FROM_EMAIL
,
[
pec
.
email
])
return
HttpResponse
(
json
.
dumps
({
'success'
:
True
}))
@ensure_csrf_cookie
def
change_email_confirm
(
request
):
pass
def
confirm_email_change
(
request
,
key
):
''' User requested a new e-mail. This is called when the activation
link is clicked. We confirm with the old e-mail, and update
'''
try
:
pec
=
PendingEmailChange
.
objects
.
get
(
activation_key
=
key
)
except
:
return
render_to_response
(
"email_invalid_key.html"
)
subject
=
render_to_string
(
'emails/confirm_email_change_subject.txt'
,
d
)
subject
=
''
.
join
(
subject
.
splitlines
())
message
=
render_to_string
(
'emails/confirm_email_change.txt'
,
d
)
user
=
pec
.
user
user
.
email_user
(
subject
,
message
,
DEFAULT_FROM_EMAIL
)
up
=
UserProfile
.
objects
.
get
(
user
=
user
)
meta
=
up
.
get_meta
()
if
'old_emails'
not
in
meta
:
meta
[
'old_emails'
]
=
[]
meta
[
'old_emails'
]
.
append
(
user
.
email
)
up
.
set_meta
(
meta
)
up
.
save
()
user
.
email
=
pec
.
new_email
user
.
save
()
pec
.
delete
()
return
render_to_response
(
"email_change_successful.html"
)
@ensure_csrf_cookie
def
change_name_request
(
request
):
...
...
@@ -294,7 +379,6 @@ def change_name_request(request):
pnc
.
rationale
=
request
.
POST
[
'rationale'
]
pnc
.
save
()
return
HttpResponse
(
json
.
dumps
({
'success'
:
True
}))
@ensure_csrf_cookie
def
change_name_list
(
request
):
...
...
urls.py
View file @
9882b30c
...
...
@@ -8,20 +8,21 @@ import django.contrib.auth.views
# admin.autodiscover()
urlpatterns
=
(
''
,
url
(
r'^$'
,
'student.views.index'
),
# Main marketing page, or redirect to courseware
url
(
r'^email_change$'
,
'student.views.change_email_request'
),
url
(
r'^email_confirm$'
,
'student.views.change_email_confirm'
),
url
(
r'^gradebook$'
,
'courseware.views.gradebook'
),
url
(
r'^event$'
,
'track.views.user_track'
),
url
(
r'^t/(?P<template>[^/]*)$'
,
'static_template_view.views.index'
),
url
(
r'^logout$'
,
'student.views.logout_user'
),
url
(
r'^info$'
,
'util.views.info'
),
url
(
r'^login$'
,
'student.views.login_user'
),
url
(
r'^login/(?P<error>[^/]*)$'
,
'student.views.login_user'
),
url
(
r'^logout$'
,
'student.views.logout_user'
),
url
(
r'^create_account$'
,
'student.views.create_account'
),
url
(
r'^activate/(?P<key>[^/]*)$'
,
'student.views.activate_account'
),
url
(
r'^reactivate/(?P<key>[^/]*)$'
,
'student.views.reactivation_email'
),
url
(
r'^$'
,
'student.views.index'
),
url
(
r'^password_reset/$'
,
'student.views.password_reset'
),
## Obsolete Django views for password resets
## TODO: Replace with Mako-ized views
url
(
r'^password_change/$'
,
django
.
contrib
.
auth
.
views
.
password_change
,
name
=
'auth_password_change'
),
url
(
r'^password_change_done/$'
,
django
.
contrib
.
auth
.
views
.
password_change_done
,
name
=
'auth_password_change_done'
),
url
(
r'^password_reset_confirm/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$'
,
django
.
contrib
.
auth
.
views
.
password_reset_confirm
,
...
...
@@ -30,6 +31,7 @@ urlpatterns = ('',
name
=
'auth_password_reset_complete'
),
url
(
r'^password_reset_done/$'
,
django
.
contrib
.
auth
.
views
.
password_reset_done
,
name
=
'auth_password_reset_done'
),
## Feedback
url
(
r'^send_feedback$'
,
'util.views.send_feedback'
),
)
...
...
@@ -38,6 +40,7 @@ if settings.PERFSTATS:
if
settings
.
COURSEWARE_ENABLED
:
urlpatterns
=
urlpatterns
+
(
url
(
r'^courseware/$'
,
'courseware.views.index'
,
name
=
"courseware"
),
url
(
r'^info$'
,
'util.views.info'
),
url
(
r'^wiki/'
,
include
(
'simplewiki.urls'
)),
url
(
r'^courseware/(?P<course>[^/]*)/(?P<chapter>[^/]*)/(?P<section>[^/]*)/$'
,
'courseware.views.index'
,
name
=
"courseware_section"
),
url
(
r'^courseware/(?P<course>[^/]*)/(?P<chapter>[^/]*)/$'
,
'courseware.views.index'
,
name
=
"courseware_chapter"
),
...
...
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