Skip to content

SAK-51136 Assignments surface the release status in list view #13475

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -506,7 +506,7 @@ public interface AssignmentService extends EntityProducer {
* respectively graded is true and ungraded is false or null for both.
* @return int count of submissions for the specified assignment.
*/
public int countSubmissions(String assignmentRef, Boolean graded);
public int countSubmissions(String assignmentRef, Boolean graded, Boolean gradeReleased);

/**
* Access the grades spreadsheet for the reference, either for an assignment or all assignments in a context.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ AssignmentSubmission newSubmission(String assignmentId,
* @param userSubmission if not null adds the requirement that the submission's userSubmission field matches this value
* @return
*/
long countAssignmentSubmissions(String assignmentId, Boolean graded, Boolean hasSubmissionDate, Boolean userSubmission, List<String> userIds);
long countAssignmentSubmissions(String assignmentId, Boolean graded, Boolean gradeReleased, Boolean hasSubmissionDate, Boolean userSubmission, List<String> userIds);

void resetAssignment(Assignment assignment);

Expand Down
2 changes: 2 additions & 0 deletions assignment/api/src/resources/assignment.properties
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,7 @@ gen.pos = Post
gen.position = Position
gen.pre = Preview
gen.relea = Released
gen.released = Released
gen.resub = Re-submitted
gen.retu = Return
gen.backtolist = Back to list
Expand Down Expand Up @@ -371,6 +372,7 @@ listassig.filter.PUB_INACTIVE=Published - Inactive
listassig.searchgroup = Search group
listassig.sorbynum1 = Sort by number of total submissions
listassig.sorbynum2 = Sort by number of ungraded submissions
listassig.sorbynum3 = Sort by number of grades released
listassig.sorbyope=Sort by open date
listassig.sorbysec = Sort by section
list.sorbysta = Sort by status
Expand Down
2 changes: 2 additions & 0 deletions assignment/api/src/resources/assignment_es.properties
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,7 @@ gen.pos=Enviar
gen.position=Posici\u00f3n
gen.pre=Vista preliminar
gen.relea=Publicado
gen.released=Publicados
gen.resub=Reenviada
gen.retu=Corregir
gen.backtolist=Volver a la lista
Expand Down Expand Up @@ -370,6 +371,7 @@ listassig.filter.PUB_INACTIVE=Publicado - Inactivo
listassig.searchgroup=Buscar grupo
listassig.sorbynum1=Ordenar por n\u00famero total de env\u00edos
listassig.sorbynum2=Ordenar por n\u00famero de env\u00edos sin calificar
listassig.sorbynum3=Ordenar por n\u00famero de notas publicadas
listassig.sorbyope=Ordenar por fecha de apertura.
listassig.sorbysec=Ordenar por secci\u00f3n
list.sorbysta=Ordenar por estado
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2244,7 +2244,7 @@ public List<User> getSortedGroupUsers(Group g) {
}

@Override
public int countSubmissions(String assignmentReference, Boolean graded) {
public int countSubmissions(String assignmentReference, Boolean graded, Boolean gradeReleased) {
String assignmentId = AssignmentReferenceReckoner.reckoner().reference(assignmentReference).reckon().getId();
try {
Assignment assignment = getAssignment(assignmentId);
Expand All @@ -2266,7 +2266,7 @@ public int countSubmissions(String assignmentReference, Boolean graded) {
}
List<String> userIds = allowAddSubmissionUsers.stream().map(User::getId).collect(Collectors.toList());
// if the assignment is non-electronic don't include submission date or is user submission
return (int) assignmentRepository.countAssignmentSubmissions(assignmentId, graded, !isNonElectronic, !isNonElectronic, userIds);
return (int) assignmentRepository.countAssignmentSubmissions(assignmentId, graded, gradeReleased, !isNonElectronic, !isNonElectronic, userIds);
} catch (Exception e) {
log.warn("Couldn't count submissions for assignment reference {}, {}", assignmentReference, e.getMessage());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,7 @@ public long countAssignmentsBySite(String siteId) {
}

@Override
public long countAssignmentSubmissions(String assignmentId, Boolean graded, Boolean hasSubmissionDate, Boolean userSubmission, List<String> userIds) {
public long countAssignmentSubmissions(String assignmentId, Boolean graded, Boolean gradeReleased, Boolean hasSubmissionDate, Boolean userSubmission, List<String> userIds) {
Criteria criteria = geCurrentSession().createCriteria(AssignmentSubmission.class)
.setProjection(Projections.countDistinct("id"))
.add(Restrictions.eq("assignment.id", assignmentId))
Expand All @@ -281,6 +281,9 @@ public long countAssignmentSubmissions(String assignmentId, Boolean graded, Bool
if (graded != null) {
criteria.add(Restrictions.eq("graded", graded));
}
if (gradeReleased != null) {
criteria.add(Restrictions.eq("gradeReleased", gradeReleased));
}
if (hasSubmissionDate != null) {
criteria.add(hasSubmissionDate ? Restrictions.isNotNull("dateSubmitted") : Restrictions.isNull("dateSubmitted"));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1305,7 +1305,7 @@ public void countSubmissions() {

Assert.assertThat(assignment.getSubmissions().size(), is(10)); // ensure we have 10 submissions created

int count = assignmentService.countSubmissions(assignmentReference, false);
int count = assignmentService.countSubmissions(assignmentReference, false, false);
Assert.assertThat(count, is(0)); // currently none of the submissions are submitted should be 0

// submit 5 submissions
Expand All @@ -1320,7 +1320,7 @@ public void countSubmissions() {
}
});

int countSubmitted = assignmentService.countSubmissions(assignmentReference, false);
int countSubmitted = assignmentService.countSubmissions(assignmentReference, false, false);
Assert.assertThat(countSubmitted, is(5)); // should have 5 submissions submitted

// grade 2 submitted submissions
Expand All @@ -1334,12 +1334,15 @@ public void countSubmissions() {
}
});

int countGraded = assignmentService.countSubmissions(assignmentReference, true);
int countGraded = assignmentService.countSubmissions(assignmentReference, true, false);
Assert.assertThat(countGraded, is(2)); // should have 2 submissions graded

when(securityService.unlockUsers(AssignmentServiceConstants.SECURE_ADD_ASSIGNMENT_SUBMISSION, assignmentReference)).thenReturn(new ArrayList<>());
int countNoUsers = assignmentService.countSubmissions(assignmentReference, false);
int countNoUsers = assignmentService.countSubmissions(assignmentReference, false, false);
Assert.assertThat(countNoUsers, is(0)); // should have 0 submissions submitted

int countReleased = assignmentService.countSubmissions(assignmentReference, false, true);
Assert.assertThat(countReleased, is(0)); // should have 0 submissions released
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -448,6 +448,10 @@ public class AssignmentAction extends PagedResourceActionII {
* sort by assignment number of ungraded submissions
*/
private static final String SORTED_BY_NUM_UNGRADED = "num_ungraded";
/**
* sort by assignment number of released grades
*/
private static final String SORTED_BY_NUM_RELEASED = "num_released";
/**
* sort by assignment submission grade
*/
Expand Down Expand Up @@ -16079,11 +16083,11 @@ public int compare(Object o1, Object o2) {
// sort by numbers of submissions
Assignment assignment1 = (Assignment) o1;
String assignment1reference = AssignmentReferenceReckoner.reckoner().assignment(assignment1).reckon().getReference();
int subNum1 = assignment1.getDraft() ? -1 : assignmentService.countSubmissions(assignment1reference, null);
int subNum1 = assignment1.getDraft() ? -1 : assignmentService.countSubmissions(assignment1reference, null, null);

Assignment assignment2 = (Assignment) o2;
String assignment2reference = AssignmentReferenceReckoner.reckoner().assignment(assignment2).reckon().getReference();
int subNum2 = assignment2.getDraft() ? -1 : assignmentService.countSubmissions(assignment2reference, null);
int subNum2 = assignment2.getDraft() ? -1 : assignmentService.countSubmissions(assignment2reference, null, null);

result = (subNum1 > subNum2) ? 1 : -1;

Expand Down Expand Up @@ -16113,6 +16117,29 @@ public int compare(Object o1, Object o2) {

result = (ungraded1 > ungraded2) ? 1 : -1;

} else if (m_criteria.equals(SORTED_BY_NUM_RELEASED)) {
// sort by assignment number of released grades

// initialize
int released1 = 0;
int released2 = 0;

Iterator submissions1 = assignmentService.getSubmissions((Assignment) o1).iterator();
while (submissions1.hasNext()) {
AssignmentSubmission submission1 = (AssignmentSubmission) submissions1.next();

if (!submission1.getGradeReleased()) released1++;
}

Iterator submissions2 = assignmentService.getSubmissions((Assignment) o2).iterator();
while (submissions2.hasNext()) {
AssignmentSubmission submission2 = (AssignmentSubmission) submissions2.next();

if (!submission2.getGradeReleased()) released2++;
}

result = (released1 > released2) ? 1 : -1;

} else if (m_criteria.equals(SORTED_BY_GRADE) || m_criteria.equals(SORTED_BY_SUBMISSION_STATUS)) {
AssignmentSubmission submission1 = getSubmission(((Assignment) o1).getId(), m_user, "compare", null);
String grade1 = " ";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +285,17 @@
#end
</a>
#end
/
<a href="javascript:void(0)" onclick="location='#toolLinkParam("$action" "doSort" "criteria=num_released")'; return false;" title="$tlang.getString("listassig.sorbynum3")">$tlang.getString("gen.released")</a>
#if ($sortedBy.equals("num_released"))
<a href="javascript:void(0)" onclick="location='#toolLinkParam("$action" "doSort" "criteria=num_released")'; return false;" title="$tlang.getString("listassig.sorbynum3")">
#if ($sortedAsc.equals("true"))
<i id="sortascendingungradedsubmissions" class="fa fa-sort-asc" aria-hidden="true" title="$tlang.getString("gen.sorasc")"></i>
#else
<i id="sortdescendingungradedsubmissions" class="fa fa-sort-desc" aria-hidden="true" title="$tlang.getString("gen.sordes")"></i>
#end
</a>
#end
</th>
#end
#end
Expand Down Expand Up @@ -632,11 +643,21 @@
<td headers="num_submissions" class="specialLink d-none d-sm-table-cell">
## not show the link for draft assignment
#if (!$assignment.Draft && $!service.allowGradeSubmission($assignmentReference))
#set($ungradedNumber = $!service.countSubmissions($assignmentReference, false))
#set($totalNumber = $!service.countSubmissions($assignmentReference, null))
#set($ungradedNumber = $!service.countSubmissions($assignmentReference, false, null))
#set($totalNumber = $!service.countSubmissions($assignmentReference, null, null))
#set($releasedNumber = $!service.countSubmissions($assignmentReference, null, true))
<div class="spinnerBesideContainer">
<a name="asnActionLink" href="javascript:void(0)" onclick="if(ASN.allowClick(this)){ SPNR.insertSpinnerAfter( this, null, null ); window.location='#toolLinkParam("$action" "doGrade_assignment" "assignmentId=$formattedText.escapeUrl($assignmentReference)")'; }" >
<span class="skip"> #if ($gradeScale != 1)$!tlang.getString("gen.assign.gra")#else$!tlang.getString("viewsubmissions")#end : $formattedText.escapeHtml($!assignment.Title). </span> <span class="skip">$!tlang.getString("gen.subm2"): </span>$!totalNumber/<span class="skip">$!tlang.getString("ungra"): </span>$!ungradedNumber
<a
name="asnActionLink"
href="javascript:void(0)"
onclick="if(ASN.allowClick(this)){ SPNR.insertSpinnerAfter( this, null, null ); window.location='#toolLinkParam("$action" "doGrade_assignment" "assignmentId=$formattedText.escapeUrl($assignmentReference)")'; }"
>
<span class="skip">
#if ($gradeScale != 1)$!tlang.getString("gen.assign.gra")
#else$!tlang.getString("viewsubmissions")
#end : $formattedText.escapeHtml($!assignment.Title). </span>
<span class="skip">
$!tlang.getString("gen.subm2"): </span>$!totalNumber/<span class="skip">$!tlang.getString("ungra"): </span>$!ungradedNumber/<span class="skip">$!tlang.getString("gen.released"): </span>$!releasedNumber
</a>
</div>
#end
Expand Down
Loading