From 75c5c1ce749370adb1898a735c201ad537e72fdb Mon Sep 17 00:00:00 2001
From: Piotr Mitros <pmitros@mitx.mit.edu>
Date: Tue, 20 Mar 2012 22:27:30 -0400
Subject: [PATCH] Name changes work, but meta storage not tested

---
 djangoapps/student/views.py | 55 +++++++++++++++++++++++++++----------
 templates/name_changes.html | 32 ++++++++++++++++++++-
 templates/profile.html      |  9 +++---
 urls.py                     |  4 +++
 4 files changed, 80 insertions(+), 20 deletions(-)

diff --git a/djangoapps/student/views.py b/djangoapps/student/views.py
index 5983ccab12b..aa3d0fb326f 100644
--- a/djangoapps/student/views.py
+++ b/djangoapps/student/views.py
@@ -383,8 +383,11 @@ def change_name_request(request):
     if not request.user.is_authenticated:
         raise Http404
     
-    pnc = PendingNameChange()
-    pnc.user = request.User
+    try: 
+        pnc = PendingNameChange.objects.get(user = request.user)
+    except:
+        pnc = PendingNameChange()
+    pnc.user = request.user
     pnc.new_name = request.POST['new_name']
     pnc.rationale = request.POST['rationale']
     if len(pnc.new_name)<2:
@@ -395,37 +398,59 @@ def change_name_request(request):
     return HttpResponse(json.dumps({'success':True})) 
 
 @ensure_csrf_cookie
-def change_name_list(request):
+def pending_name_changes(request):
+    print request.user.is_staff, request.user
     if not request.user.is_staff:
+        print "AAAA"
         raise Http404
 
     changes = list(PendingNameChange.objects.all())
-    json = [{'new_name': c.new_name, 
-             'rationale':c.rationale, 
-             'old_name':UserProfile.Objects.get(username=c.user).name, 
-             'email':c.user.email,
-             'id':c.id} for c in changes]
-    return render_to_response('name_changes.html', json) 
+    js = {'students' : [{'new_name': c.new_name, 
+                         'rationale':c.rationale, 
+                         'old_name':UserProfile.objects.get(user=c.user).name, 
+                         'email':c.user.email,
+                         'uid':c.user.id,
+                         'cid':c.id} for c in changes]}
+    return render_to_response('name_changes.html', js) 
 
 @ensure_csrf_cookie
-def change_name_reject(request):
+def reject_name_change(request):
     ''' Course staff clicks 'reject' on a given name change '''
     if not request.user.is_staff:
         raise Http404
 
-    pnc = PendingNameChange.objects.get(id = int(request.POST['id']))
+    try: 
+        pnc = PendingNameChange.objects.get(id = int(request.POST['id']))
+    except: 
+        return HttpResponse(json.dumps({'success':False, 'error':'Invalid ID'})) 
+
     pnc.delete()
     return HttpResponse(json.dumps({'success':True})) 
 
 @ensure_csrf_cookie
-def change_name_accept(request):
+def accept_name_change(request):
     ''' Course staff clicks 'accept' on a given name change '''
-    pnc = PendingNameChange.objects.get(id = int(request.POST['id']))
+    if not request.user.is_staff:
+        raise Http404
+
+    try: 
+        pnc = PendingNameChange.objects.get(id = int(request.POST['id']))
+    except: 
+        return HttpResponse(json.dumps({'success':False, 'error':'Invalid ID'})) 
 
     u = pnc.user
     up = UserProfile.objects.get(user=u)
-    up.name = pnc.name
+
+    # Save old name
+    meta = up.get_meta()
+    print meta
+    if 'old_names' not in meta:
+        meta['old_names'] = []
+    meta['old_names'].append(up.name)
+    up.set_meta(meta)
+
+    up.name = pnc.new_name
     up.save()
     pnc.delete()
-    return HttpResponse(json.dumps({'success':True})) 
 
+    return HttpResponse(json.dumps({'success':True})) 
diff --git a/templates/name_changes.html b/templates/name_changes.html
index d123fdb55c5..1316084c340 100644
--- a/templates/name_changes.html
+++ b/templates/name_changes.html
@@ -1,12 +1,42 @@
 <%inherit file="main.html" />
 <%include file="navigation.html" args="active_page=''" />
 <section class="main-content">
+<script>
+function name_confirm(id) {
+  postJSON('/accept_name_change',{"id":id},
+            function(data){
+          if(data.success){
+            $("#div"+id).html("Accepted");
+          } else {
+            alert('Error');
+          }
+     });
+}
+
+function name_deny(id) {
+  postJSON('/reject_name_change',{"id":id},
+            function(data){
+          if(data.success){
+            $("#div"+id).html("Rejected");
+          } else {
+            alert('Error');
+          }
+     });
+}
+</script>
+
 <div class="gradebook-wrapper">
   <section class="gradebook-content">
   <h1>Pending name changes</h1>
   <table>
   % for s in students:
-  <tr><td><a href=/profile/${s.uid}/>${s.oldname}</td><td>${s.newname}</td><td onclick="update({$s.uid});">[Change]</td></tr>
+  <tr>
+    <td><a href=/profile/${s['uid']}/>${s['old_name']}</td>
+    <td>${s['new_name']|h}</td>
+    <td>${s['email']|h}</td>
+    <td>${s['rationale']|h}</td>
+    <td><span id="div${s['cid']}"><span onclick="name_confirm(${s['cid']});">[Confirm]</span>
+    <span onclick="name_deny(${s['cid']});">[Reject]</span></span></td></tr>
   % endfor
   </table>
   </section>
diff --git a/templates/profile.html b/templates/profile.html
index 9b79ce9780d..9c76ac9b2cf 100644
--- a/templates/profile.html
+++ b/templates/profile.html
@@ -102,13 +102,13 @@ $(function() {
       var new_name = $('#new_name_field').val();
       var rationale = $('#name_rationale_field').val();
 
-      postJSON('/change_email',{"new_name":new_name, 
+      postJSON('/change_name',{"new_name":new_name, 
                                 "rationale":rationale},
                function(data){
           if(data.success){
-            $("#change_email").html("Request submitted. We'll send you an e-mail if we approve the change or need further information.");
+            $("#apply_name_change").html("Request submitted. We'll send you an e-mail if we approve the change or need further information.");
           } else {
-            $("#change_email_error").html(data.error);
+            $("#apply_name_change_error").html(data.error);
           }
        });
        log_event("profile", {"type":"name_change_request", 
@@ -190,7 +190,7 @@ $(function() {
         </li>
 
         <li>
-          E-mail: <strong>${email}</strong> <a href="#change_email" rel="leanModal" class="edit-email">Edit</a>
+          E-mail: <strong>${email}</strong> <a href="#change_email" rel="leanModal" class="edit-email">Change</a>
         </li>
         <li>
           Location: <div id="location_sub">${location}</div><div id="description"></div> <a href="#" id="change_location">Edit</a>
@@ -249,6 +249,7 @@ $(function() {
 
 <div id="change_email" class="leanModal_box">
   <h1>Change e-mail</h1> 
+  <div id="apply_name_change_error"></div>
   <form id="change_email_form">
     <div id="change_email_error"> </div>
     <fieldset>
diff --git a/urls.py b/urls.py
index 2488e77e246..8a2ef623652 100644
--- a/urls.py
+++ b/urls.py
@@ -11,6 +11,10 @@ urlpatterns = ('',
     url(r'^$', 'student.views.index'), # Main marketing page, or redirect to courseware
     url(r'^change_email$', 'student.views.change_email_request'),
     url(r'^email_confirm/(?P<key>[^/]*)$', 'student.views.confirm_email_change'),
+    url(r'^change_name$', 'student.views.change_name_request'),
+    url(r'^accept_name_change$', 'student.views.accept_name_change'),
+    url(r'^reject_name_change$', 'student.views.reject_name_change'),
+    url(r'^pending_name_changes$', 'student.views.pending_name_changes'),
     url(r'^gradebook$', 'courseware.views.gradebook'),
     url(r'^event$', 'track.views.user_track'),
     url(r'^t/(?P<template>[^/]*)$', 'static_template_view.views.index'),
-- 
GitLab