Skip to content
This repository was archived by the owner on Jun 30, 2024. It is now read-only.

Commit 24df6db

Browse files
committed
Merge branch 'sahi1l-renameAssignments'
2 parents 5f381ee + f79d051 commit 24df6db

File tree

4 files changed

+126
-19
lines changed

4 files changed

+126
-19
lines changed

controllers/admin.py

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -782,10 +782,14 @@ def createAssignment():
782782
response.headers['content-type'] = 'application/json'
783783
due = None
784784
logger.debug(type(request.vars['name']))
785-
786785
try:
787-
logger.debug("Adding new assignment {} for course".format(request.vars['name'], auth.user.course_id))
788-
newassignID = db.assignments.insert(course=auth.user.course_id, name=request.vars['name'], duedate=datetime.datetime.utcnow() + datetime.timedelta(days=7))
786+
name=request.vars['name']
787+
course=auth.user.course_id
788+
logger.debug("Adding new assignment {} for course".format(request.vars['name'], course))
789+
name_existsQ = len(db((db.assignments.name == name) & (db.assignments.course == course)).select())
790+
if name_existsQ>0:
791+
return json.dumps("EXISTS")
792+
newassignID = db.assignments.insert(course=course, name=name, duedate=datetime.datetime.utcnow() + datetime.timedelta(days=7))
789793
except Exception as ex:
790794
logger.error(ex)
791795
return json.dumps('ERROR')
@@ -796,6 +800,27 @@ def createAssignment():
796800
logger.error(ex)
797801
return json.dumps('ERROR')
798802

803+
@auth.requires(lambda: verifyInstructorStatus(auth.user.course_name, auth.user), requires_login=True)
804+
def renameAssignment():
805+
response.headers['content-type'] = 'application/json'
806+
try:
807+
logger.debug("Renaming {} to {} for course {}.".format(request.vars['original'],request.vars['name'],auth.user.course_id))
808+
assignment_id=request.vars['original']
809+
name=request.vars['name']
810+
course=auth.user.course_id
811+
name_existsQ = len(db((db.assignments.name == name) & (db.assignments.course == course)).select())
812+
if name_existsQ>0:
813+
return json.dumps("EXISTS")
814+
db(db.assignments.id == assignment_id).update(name=name)
815+
except Exception as ex:
816+
logger.error(ex)
817+
return json.dumps('ERROR')
818+
try:
819+
returndict={name: assignment_id}
820+
return json.dumps(returndict)
821+
except Exception as ex:
822+
logger.error(ex)
823+
return json.dumps('ERROR')
799824

800825
@auth.requires(lambda: verifyInstructorStatus(auth.user.course_name, auth.user), requires_login=True)
801826
def questionBank():

static/js/admin.js

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1053,6 +1053,31 @@ function menu_from_editable(
10531053
}
10541054

10551055

1056+
function fillinAssignmentName(target){
1057+
//On the assignments tab, fill in the target with the name of the current assignment
1058+
//Only used by the rename assignment button for now
1059+
select=$("#assignlist")[0]
1060+
$("#"+target).html(select.options[select.selectedIndex].innerHTML)
1061+
}
1062+
//Invoked by the "Rename" button of the "Rename Assignment" dialog
1063+
function renameAssignment(form) {
1064+
var select=$("#assignlist")[0]
1065+
var id=select[select.selectedIndex].value
1066+
var name = form['rename-name'].value;
1067+
data={'name':name,'original':id}
1068+
url='/runestone/admin/renameAssignment';
1069+
jQuery.post(url,data,function(iserror,textStatus,whatever){
1070+
if (iserror=="EXISTS"){
1071+
alert('There already is an assignment called "'+name+'".') //FIX: reopen the dialog box?
1072+
} else if (iserror!='ERROR'){
1073+
//find the assignment
1074+
select=$('#assignlist')[0];
1075+
select.options[select.selectedIndex].innerHTML=name
1076+
} else {
1077+
alert('Error in renaming assignment '+id)
1078+
}
1079+
},'json')
1080+
}
10561081
// Invoked by the "Create" button of the "Create Assignment" dialog.
10571082
function createAssignment(form) {
10581083
var name = form.name.value;
@@ -1061,7 +1086,9 @@ function createAssignment(form) {
10611086
data = {'name': name}
10621087
url = '/runestone/admin/createAssignment';
10631088
jQuery.post(url, data, function (iserror, textStatus, whatever) {
1064-
if (iserror != 'ERROR') {
1089+
if (iserror=="EXISTS"){
1090+
alert('There already is an assignment called "'+name+'".') //FIX: reopen the dialog box?
1091+
} else if (iserror!='ERROR'){
10651092
select = document.getElementById('assignlist');
10661093
newopt = document.createElement('option');
10671094
newopt.value = iserror[name];

tests/test_server.py

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -523,21 +523,50 @@ def test_assignments(test_client, runestone_db_tools, test_user):
523523
test_instructor_1.make_instructor()
524524
test_instructor_1.login()
525525
db = runestone_db_tools.db
526-
526+
name_1 = 'test_assignment_1'
527+
name_2 = 'test_assignment_2'
528+
name_3 = 'test_assignment_3'
529+
527530
# Create an assignment -- using createAssignment
528531
test_client.post('admin/createAssignment',
529-
data=dict(name='test_assignment_1'))
532+
data=dict(name=name_1))
530533

531-
assign = db(
532-
(db.assignments.name == 'test_assignment_1') &
534+
assign1 = db(
535+
(db.assignments.name == name_1) &
533536
(db.assignments.course == test_instructor_1.course.course_id)
534537
).select().first()
535-
assert assign
538+
assert assign1
536539

537-
# Delete an assignment -- using removeassignment
538-
test_client.post('admin/removeassign', data=dict(assignid=assign.id))
539-
assert not db(db.assignments.name == 'test_assignment_1').select().first()
540+
# Make sure you can't create two assignments with the same name
541+
test_client.post('admin/createAssignment',
542+
data=dict(name=name_1))
543+
assert "EXISTS" in test_client.text
540544

545+
# Rename assignment
546+
test_client.post('admin/createAssignment',
547+
data=dict(name=name_2))
548+
assign2 = db(
549+
(db.assignments.name == name_2) &
550+
(db.assignments.course == test_instructor_1.course.course_id)
551+
).select().first()
552+
assert assign2
553+
554+
test_client.post('admin/renameAssignment',
555+
data=dict(name=name_3,original=assign2.id))
556+
assert db(db.assignments.name == name_3).select().first()
557+
assert not db(db.assignments.name == name_2).select().first()
558+
559+
# Make sure you can't rename an assignment to an already used assignment
560+
test_client.post('admin/renameAssignment',
561+
data=dict(name=name_3,original=assign1.id))
562+
assert "EXISTS" in test_client.text
563+
564+
# Delete an assignment -- using removeassignment
565+
test_client.post('admin/removeassign', data=dict(assignid=assign1.id))
566+
assert not db(db.assignments.name == name_1).select().first()
567+
test_client.post('admin/removeassign', data=dict(assignid=assign2.id))
568+
assert not db(db.assignments.name == name_3).select().first()
569+
541570
test_client.post('admin/removeassign', data=dict(assignid=9999999))
542571
assert "Error" in test_client.text
543572

views/admin/assignments.html

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
</script>
3333
<script src="{{=URL('static', 'js/bootstrap-table/bootstrap-table-reorder-rows.js')}}">
3434
</script>
35-
3635
<div class="row">
3736
<div class="col-md-2"></div>
3837
<div class="col-md-8">
@@ -42,8 +41,9 @@ <h4 style="text-align: center;">Assignment</h4>
4241
<option value="{{=assignmentid}}">{{=assignments[assignmentid]}}</option>
4342
{{ pass }}
4443
</select>
45-
<button class="btn" data-target="#addAssignment" data-toggle="modal" style="margin-top: 12px;">+</button>
46-
<button class="btn" onclick="remove_assignment();" style="margin-top: 12px;">-</button>
44+
<button class="btn" data-target="#addAssignment" data-toggle="modal" style="margin-top: 12px;">Add</button>
45+
<button class="btn" onclick="remove_assignment();" style="margin-top: 12px;">Delete</button>
46+
<button class="btn" data-target="#renameAssignment" data-toggle="modal" onclick="fillinAssignmentName('renameName');" style="margin-top: 12px;">Rename</button>
4747
<fieldset>
4848
<legend>Assignment properties</legend>
4949
<span id="totalPoints"></span><br>
@@ -62,14 +62,14 @@ <h4 style="text-align: center;">Assignment</h4>
6262
<div class="col-md-2"></div>
6363
</div>
6464

65-
<!-- Modal -->
66-
<div aria-hidden="true" aria-labelledby="myModalLabel" class="modal fade" id="addAssignment" role="dialog" tabindex="-1">
65+
<!-- Modal: Add -->
66+
<div aria-hidden="true" aria-labelledby="myAddModalLabel" class="modal fade" id="addAssignment" role="dialog" tabindex="-1">
6767
<div class="modal-dialog">
6868
<div class="modal-content">
6969
<!-- Modal Header -->
7070
<div class="modal-header">
7171
<button class="close" data-dismiss="modal" type="button"><span aria-hidden="true">&times;</span> <span class="sr-only">Close</span></button>
72-
<h4 class="modal-title" id="myModalLabel">Create Assignment</h4>
72+
<h4 class="modal-title" id="myAddModalLabel">Create Assignment</h4>
7373
</div><!-- Modal Body -->
7474
<div class="modal-body">
7575
<form role="form">
@@ -80,12 +80,38 @@ <h4 class="modal-title" id="myModalLabel">Create Assignment</h4>
8080
</form>
8181
</div><!-- Modal Footer -->
8282
<div class="modal-footer">
83-
<button class="btn btn-default" data-dismiss="modal" type="button">Close</button>
83+
<button class="btn btn-default" data-dismiss="modal" type="button">Cancel</button>
8484
</div>
8585
</div>
8686
</div>
8787
</div>
8888

89+
<!-- Modal: Rename -->
90+
<div aria-hidden="true" aria-labelledby="myRenameModalLabel" class="modal fade" id="renameAssignment" role="dialog" tabindex="-1">
91+
<div class="modal-dialog">
92+
<div class="modal-content">
93+
<!-- Modal Header -->
94+
<div class="modal-header">
95+
<button class="close" data-dismiss="modal" type="button"><span aria-hidden="true">&times;</span> <span class="sr-only">Close</span></button>
96+
<h4 class="modal-title" id="myRenameModalLabel">Rename Assignment</h4>
97+
</div><!-- Modal Body -->
98+
<div class="modal-body">
99+
<form role="form">
100+
<div class="form-group">
101+
<label for="rename-name">Enter the new name for assignment "<span id="renameName"></span>"</label> <input class="form-control" id="rename-name" placeholder="Enter assignment name" type="text">
102+
</div>
103+
<input class="btn btn-default" data-dismiss="modal" onclick="renameAssignment(this.form)" type="button" value="Rename">
104+
</form>
105+
</div><!-- Modal Footer -->
106+
<div class="modal-footer">
107+
<button class="btn btn-default" data-dismiss="modal" type="button">Cancel</button>
108+
</div>
109+
</div>
110+
</div>
111+
</div>
112+
113+
114+
89115
<div class="row">
90116
<div class="col-md-12" id="leftpanel2" style="visibility: hidden">
91117
<div class="panel-group">

0 commit comments

Comments
 (0)