Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/master' into attendance-backen…
Browse files Browse the repository at this point in the history
…d-updates
  • Loading branch information
davidpbauer committed Apr 9, 2024
2 parents ab86c33 + 1957a40 commit 1ebcf60
Show file tree
Hide file tree
Showing 15 changed files with 250 additions and 34 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@
import org.sakaiproject.attendance.api.model.AttendanceGrade;
import org.sakaiproject.attendance.api.model.AttendanceSite;

import java.util.List;
import java.util.Map;

/**
* A Provider which sends grades to the Gradebook
*
Expand All @@ -31,7 +34,7 @@ public interface AttendanceGradebookProvider {
* Create a new External Assessment in the Gradebook
* @param aS, the AttendanceSite
*/
boolean create(AttendanceSite aS);
boolean create(AttendanceSite aS, String categoryId);

/**
* Remove an External Assessment from the Gradebook
Expand All @@ -43,7 +46,7 @@ public interface AttendanceGradebookProvider {
* Updates the external Assessment in the Gradebook
* @param aS
*/
boolean update(AttendanceSite aS);
boolean update(AttendanceSite aS, String categoryId);

/**
* Sends an AttendanceGrade to the Gradebook
Expand All @@ -52,6 +55,12 @@ public interface AttendanceGradebookProvider {
*/
boolean sendToGradebook(AttendanceGrade ag);

boolean doesGradebookHaveCategories(String gbUID);

Map<String,String> getGradebookCategories(String gbUID);

Long getCategoryForItem(String gbUID,Long aSID);

/**assignment defined with the provided title
* @param gbUID
* @param title
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import org.sakaiproject.attendance.api.model.stats.AttendanceItemStats;
import org.sakaiproject.attendance.api.model.stats.AttendanceStats;
import org.sakaiproject.attendance.api.model.stats.AttendanceUserStats;
import org.sakaiproject.entity.api.EntityProducer;

/**
* The brains of the operation.
Expand All @@ -32,7 +33,7 @@
* @author David Bauer [dbauer1 (at) udayton (dot) edu]
* @author Steve Swinsburg ([email protected])
*/
public interface AttendanceLogic {
public interface AttendanceLogic extends EntityProducer {

/**
* Gets the AttendanceSite by Sakai Site ID
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,13 @@
import org.sakaiproject.attendance.api.model.AttendanceSite;
import org.sakaiproject.attendance.api.util.AttendanceConstants;
import org.sakaiproject.grading.api.AssessmentNotFoundException;
import org.sakaiproject.grading.api.CategoryDefinition;
import org.sakaiproject.grading.api.ConflictingAssignmentNameException;
import org.sakaiproject.grading.api.GradingService;
import org.sakaiproject.tool.api.ToolManager;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
Expand All @@ -53,7 +56,7 @@ public void init() {
/**
* {@inheritDoc}
*/
public boolean create(AttendanceSite aS) {
public boolean create(AttendanceSite aS, String categoryId) {
if(log.isDebugEnabled()) {
log.debug("create Gradebook");
}
Expand All @@ -63,10 +66,13 @@ public boolean create(AttendanceSite aS) {
String siteID = aS.getSiteID();

String appName = AttendanceConstants.SAKAI_TOOL_NAME;

Long categoryIdNumber = null;
if(categoryId != null){
categoryIdNumber = Long.valueOf(categoryId);
}
String aSUID = getAttendanceUID(aS);
try {
gradingService.addExternalAssessment(siteID, aSUID, null, aS.getGradebookItemName(), aS.getMaximumGrade(), null, appName, null, false, null);// add it to the gradebook
gradingService.addExternalAssessment(siteID, aSUID, null, aS.getGradebookItemName(), aS.getMaximumGrade(), null, appName, null, false, categoryIdNumber);// add it to the gradebook

Map<String, String> scores = attendanceLogic.getAttendanceGradeScores();
gradingService.updateExternalAssessmentScoresString(siteID, aSUID, scores);
Expand Down Expand Up @@ -103,16 +109,19 @@ public boolean remove(AttendanceSite aS) {
/**
* {@inheritDoc}
*/
public boolean update(AttendanceSite aS) {
public boolean update(AttendanceSite aS, String categoryId) {
if(log.isDebugEnabled()) {
log.debug("Updating GB for AS " + aS.getSiteID());
}

Long categoryIdNumber = null;
if(categoryId != null){
categoryIdNumber = Long.valueOf(categoryId);
}
String siteID = aS.getSiteID();
String aUID = getAttendanceUID(aS);
if(gradingService.isExternalAssignmentDefined(siteID, aUID)) {
try {
gradingService.updateExternalAssessment(siteID, aUID, null, null, aS.getGradebookItemName(), aS.getMaximumGrade(), null, false);
gradingService.updateExternalAssessment(siteID, aUID, null, null, aS.getGradebookItemName(), categoryIdNumber, aS.getMaximumGrade(), null, false);
return true;
} catch (ConflictingAssignmentNameException e) {
log.warn("Failed to update AttendanceSite for site " + siteID + " in Gradebook", e);
Expand Down Expand Up @@ -145,13 +154,29 @@ public boolean sendToGradebook(final AttendanceGrade aG) {
return true;
} else {
//does not exist, add to GB and add all grades
return create(aS);
return create(aS,null);
}
}

return false;
}

public Map<String,String> getGradebookCategories(String gbUID){
if(!doesGradebookHaveCategories(gbUID)){
return null;
}
Map<String,String> categoryMap = new HashMap<>();
List<CategoryDefinition> categories = gradingService.getCategoryDefinitions(gbUID);
for(CategoryDefinition d: categories){
categoryMap.put(d.getId().toString(),d.getName());
}
return categoryMap;
}

public boolean doesGradebookHaveCategories(String gbUID){
return gradingService.isCategoriesEnabled(gbUID);
}

/**
* {@inheritDoc}
*/
Expand All @@ -170,6 +195,16 @@ private boolean isAssessmentDefined(String gbUID, String id) {
return gradingService.isExternalAssignmentDefined(gbUID, id);
}

public Long getCategoryForItem(String gbUID,Long aSID){
Long category = null;
try {
category = gradingService.getExternalAssessmentCategoryId(gbUID,getAttendanceUID(aSID));
} catch (AssessmentNotFoundException g){
//just return Null.
}
return category;
}

//this is hacky
private String getAttendanceUID(AttendanceSite aS) {
return getAttendanceUID(aS.getId());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@
import org.sakaiproject.attendance.api.model.stats.AttendanceStats;
import org.sakaiproject.attendance.api.model.stats.AttendanceUserStats;
import org.sakaiproject.attendance.api.repository.*;
import org.sakaiproject.entity.api.EntityManager;
import org.sakaiproject.entity.api.EntityTransferrer;
import org.sakaiproject.user.api.User;

/**
Expand All @@ -42,7 +44,7 @@
*/
@Slf4j
@Setter
public class AttendanceLogicImpl implements AttendanceLogic {
public class AttendanceLogicImpl implements AttendanceLogic, EntityTransferrer {

private AttendanceEventRepository attendanceEventRepository;

Expand All @@ -60,11 +62,27 @@ public class AttendanceLogicImpl implements AttendanceLogic {

private AttendanceGradebookProvider attendanceGradebookProvider;

private EntityManager entityManager;

/**
* {@inheritDoc}
*/
public AttendanceSite getAttendanceSite(String siteID) {
return attendanceSiteRepository.findBySiteId(siteID);
AttendanceSite attendanceSite = attendanceSiteRepository.findBySiteId(siteID);

if (attendanceSite == null) {
attendanceSite = new AttendanceSite(siteID);

// This will create the site and add statuses to the new site
if (!addSite(attendanceSite)) {
return null;
}

// We need to re-load the AttendanceSite because of the status creation above
attendanceSite = attendanceSiteRepository.findBySiteId(siteID);
}

return attendanceSite;
}

/**
Expand All @@ -81,14 +99,8 @@ public AttendanceSite updateAttendanceSite(AttendanceSite aS) throws IllegalArgu
* {@inheritDoc}
*/
public AttendanceSite getCurrentAttendanceSite() {
final String currentSiteID = sakaiProxy.getCurrentSiteId();

AttendanceSite currentAttendanceSite = getAttendanceSite(currentSiteID);
if (currentAttendanceSite == null) {
currentAttendanceSite = addSite(new AttendanceSite(currentSiteID));
}
generateMissingAttendanceStatusesForSite(currentAttendanceSite);
return currentAttendanceSite;
String currentSiteID = sakaiProxy.getCurrentSiteId();
return getAttendanceSite(currentSiteID);
}

/**
Expand Down Expand Up @@ -481,8 +493,14 @@ public Double regrade(AttendanceGrade attendanceGrade, boolean saveGrade) {
return grade;
}

private AttendanceSite addSite(AttendanceSite s) {
return attendanceSiteRepository.save(s);
private boolean addSite(AttendanceSite s) {
AttendanceSite attendanceSite = attendanceSiteRepository.save(s);
if (attendanceSite != null) {
generateMissingAttendanceStatusesForSite(s);
return true;
}

return false;
}

private List<AttendanceGrade> generateAttendanceGrades(AttendanceSite aS) {
Expand Down Expand Up @@ -653,4 +671,55 @@ private Double grade(String userId, AttendanceSite attendanceSite) {
// Don't allow negative total points
return Math.max(totalPoints, 0D);
}

@Override
public Map<String, String> transferCopyEntities(String fromContext, String toContext, List<String> ids, List<String> transferOptions) {
return transferCopyEntities(fromContext, toContext, ids, transferOptions, false);
}

@Override
public String[] myToolIds() {
return new String[]{ "sakai.attendance" };
}

@Override
public Map<String, String> transferCopyEntities(String fromContext, String toContext, List<String> ids, List<String> transferOptions, boolean cleanup) {
Map<String, String> transversalMap = new HashMap<>();
AttendanceSite fromSite = getAttendanceSite(fromContext);
AttendanceSite toSite = getAttendanceSite(toContext);

if (cleanup) {
// TODO: implement deleting all content in toContext
// Maybe wait until soft delete is confirmed everywhere
}

try {
// TODO: consider bringing over the statuses from the original site

List<AttendanceEvent> fromEvents = getAttendanceEventsForSite(fromSite);
for (AttendanceEvent fromEvent : fromEvents) {
AttendanceEvent toEvent = new AttendanceEvent();
toEvent.setAttendanceSite(toSite);
toEvent.setName(fromEvent.getName());

if (fromEvent.getStartDateTime() != null) {
toEvent.setStartDateTime(fromEvent.getStartDateTime());
}

addAttendanceEventNow(toEvent);
log.info("transferCopyEntities: new attendance event ({})", toEvent.getName());

transversalMap.put("attendance/" + fromEvent.getId(), "attendance/" + toEvent.getId());
}
} catch (Exception e) {
log.error("transferCopyEntities error", e);
}

return transversalMap;
}

@Override
public void updateEntityReferences(String toContext, Map<String, String> transversalMap) {
return;
}
}
1 change: 1 addition & 0 deletions impl/src/webapp/WEB-INF/components.xml
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
<property name="gradingRuleRepository" ref="org.sakaiproject.attendance.api.repository.GradingRuleRepository" />
<property name="sakaiProxy" ref="org.sakaiproject.attendance.logic.SakaiProxy" />
<property name="attendanceGradebookProvider" ref="org.sakaiproject.attendance.api.AttendanceGradebookProvider" />
<property name="entityManager" ref="org.sakaiproject.entity.api.EntityManager" />
</bean>

<!-- PDFEventExporter -->
Expand Down
11 changes: 11 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,17 @@
<artifactId>wicket-extensions</artifactId>
<version>6.21.0</version>
</dependency>
<dependency>
<groupId>commons-configuration</groupId>
<artifactId>commons-configuration</artifactId>
<version>1.10</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ attendance.settings.grading.max.points.possible = Total Points Possible
attendance.settings.grading.is.grade.shown = Allow students to see their grade within this tool
attendance.settings.grading.send.to.gradebook = Send grades to the Gradebook
attendance.settings.grading.gradebook.item.name = Gradebook Item Name

attendance.settings.grading.gradebook.category = Gradebook Category
attendance.settings.grading.mode = Grading Mode
attendance.settings.grading.manually = Manually grade students' attendance.
attendance.settings.grading.auto = Define rules to automatically grade attendance.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
<div class="page-header">
<h1 wicket:id="addItemTitle" class="overHeaderSpan" />
</div>
<div wicket:id="addEditItemFeedback"></div>
<div class="addItemLine">
<label wicket:for="name">
<wicket:message key="attendance.add.label.name" />
Expand All @@ -48,4 +49,4 @@ <h1 wicket:id="addItemTitle" class="overHeaderSpan" />
</form>
</wicket:extend>
</body>
</html>
</html>
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.*;
import org.sakaiproject.attendance.api.model.AttendanceEvent;
import org.sakaiproject.attendance.tool.util.AttendanceFeedbackPanel;
import org.sakaiproject.attendance.tool.util.PlaceholderBehavior;
import org.sakaiproject.wicket.component.SakaiDateTimeField;

Expand Down Expand Up @@ -37,6 +38,7 @@ public EventInputPage(final IModel<AttendanceEvent> event) {

private Form<?> createEventInputForm() {
Form<?> eventForm = new Form<Void>("event");
eventForm.add(new AttendanceFeedbackPanel("addEditItemFeedback"));
eventForm.add(new Label("addItemTitle", getString("event.add")));
AjaxSubmitLink submit = createSubmitLink("submit", eventForm, false);
submit.add(new Label("submitLabel", new ResourceModel("attendance.add.create")));
Expand Down Expand Up @@ -145,4 +147,4 @@ public void setNextPage(String canonicalName){
public String getNextPage(){
return this.nextPage;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ <h2><wicket:message key="attendance.export.importHeader" /></h2>
</fieldset>

<div class="act">
<button type="submit" wicket:id="submitLink" ><wicket:message key="attendance.export.importButton" /></button>
<button type="submit" id="import-button" wicket:id="submitLink" disabled><wicket:message key="attendance.export.importButton" /></button>
</div>
</form>
</div>
Expand Down
Loading

0 comments on commit 1ebcf60

Please sign in to comment.