/*==========================================================================*\ | $Id: CourseAndAssignmentSubmissionsAssistant.java,v 1.6 2012/05/09 16:24:22 stedwar2 Exp $ |*-------------------------------------------------------------------------*| | Copyright (C) 2006-2012 Virginia Tech | | This file is part of Web-CAT. | | Web-CAT is free software; you can redistribute it and/or modify | it under the terms of the GNU Affero General Public License as published | by the Free Software Foundation; either version 3 of the License, or | (at your option) any later version. | | Web-CAT is distributed in the hope that it will be useful, | but WITHOUT ANY WARRANTY; without even the implied warranty of | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | GNU General Public License for more details. | | You should have received a copy of the GNU Affero General Public License | along with Web-CAT; if not, see <http://www.gnu.org/licenses/>. \*==========================================================================*/ package org.webcat.grader.objectquery; import org.webcat.core.Course; import org.webcat.core.CourseOffering; import org.webcat.core.Department; import org.webcat.core.EOBase; import org.webcat.core.Semester; import org.webcat.core.WCComponent; import org.webcat.grader.Assignment; import org.webcat.ui.WCTreeModel; import org.webcat.ui.generators.JavascriptGenerator; import org.webcat.ui.util.ComponentIDGenerator; import org.webcat.woextensions.WCFetchSpecification; import com.webobjects.appserver.WOActionResults; import com.webobjects.appserver.WOContext; import com.webobjects.appserver.WOResponse; import com.webobjects.eocontrol.EOGenericRecord; import com.webobjects.eocontrol.EOQualifier; import com.webobjects.foundation.NSArray; import er.extensions.eof.ERXQ; import er.extensions.eof.ERXS; //------------------------------------------------------------------------- /** * A simplified query assistant that allows the user to select all the * submissions from one or more assignment offerings that are common across * a specified set of course offerings. * * @author Tony Allevato * @author Last changed by $Author: stedwar2 $ * @version $Revision: 1.6 $, $Date: 2012/05/09 16:24:22 $ */ public class CourseAndAssignmentSubmissionsAssistant extends WCComponent { //~ Constructor ........................................................... // ---------------------------------------------------------- /** * Create a new object. * @param context the page's context */ public CourseAndAssignmentSubmissionsAssistant(WOContext context) { super(context); } //~ KVC Attributes (must be public) ....................................... public String objectType; public CourseAndAssignmentSubmissionsModel model; public Assignment assignment; public int index; public CourseTreeModel courseModel; public AssignmentTreeModel assignmentModel; public ComponentIDGenerator idFor; public Object courseTreeItem; public Object assignmentTreeItem; //~ Public Nested Classes ................................................. // ---------------------------------------------------------- public class CourseTreeModel extends WCTreeModel<Object> { //~ Public Methods .................................................... // ---------------------------------------------------------- @SuppressWarnings("unchecked") public NSArray childrenOfObject(Object item) { NSArray children = null; if (item == null) { children = allSemesters(); } else if (item instanceof Semester) { children = courseOfferingsForSemester((Semester) item); } return children; } // ---------------------------------------------------------- @Override public String persistentIdOfObject(Object item) { if (item instanceof EOGenericRecord) { EOGenericRecord record = (EOGenericRecord) item; return "id_" + record.entityName() + "_" + record.valueForKey("id"); } else { return null; } } // ---------------------------------------------------------- private NSArray<Semester> allSemesters() { return Semester.objectsMatchingQualifier(localContext(), null, Semester.year.asc().then(Semester.season.asc())); } // ---------------------------------------------------------- private NSArray<CourseOffering> courseOfferingsForSemester( Semester semester) { NSArray<CourseOffering> offerings = EOBase.accessibleBy(user()).filtered( CourseOffering.offeringsForSemester(localContext(), semester)); return ERXS.sorted(offerings, ERXS.ascInsensitive( CourseOffering.COURSE_KEY + "." + Course.DEPARTMENT_KEY + "." + Department.ABBREVIATION_KEY), CourseOffering.courseNumber.asc(), CourseOffering.crn.asc()); } } // ---------------------------------------------------------- public class AssignmentTreeModel extends WCTreeModel<Object> { //~ Public Methods .................................................... // ---------------------------------------------------------- @SuppressWarnings("unchecked") public NSArray childrenOfObject(Object item) { NSArray children = null; if (item == null) { children = model.selectedCourses(); } else if (item instanceof Course) { children = assignmentsForCourseOfferings( (Course)item, CourseOffering.course.is((Course)item) .filtered(model.selectedCourseOfferings())); } return children; } // ---------------------------------------------------------- @Override public String persistentIdOfObject(Object item) { if (item instanceof EOGenericRecord) { EOGenericRecord record = (EOGenericRecord) item; return "id_" + record.entityName() + "_" + record.valueForKey("id"); } else { return null; } } // ---------------------------------------------------------- private NSArray<Assignment> assignmentsForCourseOfferings( Course course, NSArray<CourseOffering> courses) { if (courses.size() == 0) { @SuppressWarnings("unchecked") NSArray<Assignment> result = NSArray.EmptyArray; return result; } WCFetchSpecification<Assignment> fetchSpec = new WCFetchSpecification<Assignment>( Assignment.ENTITY_NAME, ERXQ.containsObject(Assignment.COURSES_KEY, course), Assignment.name.ascInsensitives()); fetchSpec.setUsesDistinct(true); EOQualifier qualifier = ERXQ.containsObject( Assignment.COURSE_OFFERINGS_KEY, courses.get(0)); for (int i = 1; i < courses.size(); i++) { qualifier = ERXQ.and(qualifier, ERXQ.containsObject( Assignment.COURSE_OFFERINGS_KEY, courses.get(i))); } qualifier = ERXQ.and(qualifier, EOBase.accessibleBy(user())); return EOQualifier.filteredArrayWithQualifier( Assignment.objectsWithFetchSpecification( localContext(), fetchSpec), qualifier); } // ---------------------------------------------------------- protected void selectionDidChange() { model.setSelectedAssignmentModelItems( assignmentModel.selectedObjects().allObjects()); } } //~ Public Methods ........................................................ // ---------------------------------------------------------- public void appendToResponse(WOResponse response, WOContext context) { idFor = new ComponentIDGenerator(this); courseModel = new CourseTreeModel(); assignmentModel = new AssignmentTreeModel(); super.appendToResponse(response, context); } // ---------------------------------------------------------- public String titleOfCourseTreeItem() { if (courseTreeItem instanceof Semester) { Semester semester = (Semester) courseTreeItem; return semester.name(); } else if (courseTreeItem instanceof CourseOffering) { CourseOffering co = (CourseOffering) courseTreeItem; return co.deptNumberAndName(); } else { return null; } } // ---------------------------------------------------------- public String titleOfAssignmentTreeItem() { if (assignmentTreeItem instanceof Course) { Course course = (Course) assignmentTreeItem; return course.deptNumberAndName(); } else if (assignmentTreeItem instanceof Assignment) { Assignment thisAssignment = (Assignment) assignmentTreeItem; return thisAssignment.titleString(); } else { return null; } } // ---------------------------------------------------------- public String onCourseTreeSelectionChangedScript() { return idFor.get("courseTreeSelectionChanged") + "(this);"; } // ---------------------------------------------------------- public WOActionResults courseTreeSelectionChanged() { assignmentModel.rearrangeObjects(); model.setSelectedCourseModelItems( courseModel.selectedObjects().allObjects()); return new JavascriptGenerator().refresh(idFor.get("assignmentPane")); } // ---------------------------------------------------------- public void pruneAssignmentsFromUnselectedCourses() { model.pruneAssignmentsFromUnselectedCourses(); } }