Skip to content
Open
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 @@ -34,6 +34,7 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Array;
import java.sql.Time;
import java.text.ParseException;
import java.util.*;
Expand All @@ -54,6 +55,7 @@ public class CourseViewController {
@Inject TermService termService;
@Inject TeachingAssignmentService teachingAssignmentService;
@Inject InstructorService instructorService;
@Inject BudgetScenarioService budgetScenarioService;
@Inject DataWarehouseRepository dwRepository;
@Inject Authorizer authorizer;

Expand Down Expand Up @@ -881,4 +883,87 @@ public View downloadExcel(@PathVariable long workgroupId, @PathVariable long yea
return null;
}
}

@RequestMapping(value = "/api/courseView/workgroups/{workgroupId}/years/{year}/courses/{courseId}/sectionGroups/{sectionGroupId}/convert/{sequencePattern}", method = RequestMethod.POST, produces="application/json")
@ResponseBody
public List<Object> convertCourseOffering(@PathVariable Long workgroupId, @PathVariable Long year, @PathVariable Long courseId, @PathVariable Long sectionGroupId, @PathVariable String sequencePattern, HttpServletResponse httpResponse) {
authorizer.hasWorkgroupRole(workgroupId, "academicPlanner");
Schedule schedule = this.scheduleService.findByWorkgroupIdAndYear(workgroupId, year);

Course existingCourse = courseService.getOneById(courseId);

Course course = new Course();
course.setSubjectCode(existingCourse.getSubjectCode());
course.setCourseNumber(existingCourse.getCourseNumber());
course.setSequencePattern(sequencePattern);
course.setTitle(existingCourse.getTitle());
course.setEffectiveTermCode(existingCourse.getEffectiveTermCode());
course.setSchedule(schedule);
course.setUnitsHigh(existingCourse.getUnitsHigh());
course.setUnitsLow(existingCourse.getUnitsLow());

Course newCourse = courseService.findOrCreateByCourse(course);

SectionGroup sectionGroup = sectionGroupService.getOneById(sectionGroupId);


for(BudgetScenario budgetScenario : budgetScenarioService.findbyWorkgroupIdAndYear(workgroupId, year) ){
// Do not update budget requests
if(!budgetScenario.getIsBudgetRequest()){
SectionGroupCost existingSectionGroupCost = sectionGroupCostService.findBySubjectCodeAndCourseNumberAndSequencePatternAndBudgetScenarioIdAndTermCode(
existingCourse.getSubjectCode(),
existingCourse.getCourseNumber(),
sectionGroup.getCourse().getSequencePattern(),
budgetScenario.getId(),
sectionGroup.getTermCode()
);
if(existingSectionGroupCost != null){
SectionGroupCost conflictingSectionGroupCost = sectionGroupCostService.findBySubjectCodeAndCourseNumberAndSequencePatternAndBudgetScenarioIdAndTermCode(
existingCourse.getSubjectCode(),
existingCourse.getCourseNumber(),
sequencePattern,
budgetScenario.getId(),
sectionGroup.getTermCode()
);
if(conflictingSectionGroupCost == null){
existingSectionGroupCost.setSequencePattern(sequencePattern);
existingSectionGroupCost.setDisabled(false);
sectionGroupCostService.update(existingSectionGroupCost);
} else if (conflictingSectionGroupCost.isDisabled()){
sectionGroupCostService.delete(conflictingSectionGroupCost.getId());
existingSectionGroupCost.setSequencePattern(sequencePattern);
sectionGroupCostService.update(existingSectionGroupCost);
}
}
}
}

Long seatCount = new Long(0);
for(Section oldSection : sectionGroup.getSections()){
seatCount += oldSection.getSeats();
sectionService.deleteWithCascade(oldSection);
}


sectionGroup.setCourse(newCourse);
sectionGroup.setPlannedSeats(seatCount.intValue());
SectionGroup newSectionGroup = sectionGroupService.save(sectionGroup);

Section section = new Section();
if(sequencePattern.length() > 1){
section.setSequenceNumber(sequencePattern);
} else {
section.setSequenceNumber(sequencePattern+"01");
}
section.setSeats(seatCount);
section.setSectionGroup(sectionGroup);
sectionService.save(section);

if (newCourse != null) {
return Arrays.asList(newCourse, newSectionGroup);
} else {
httpResponse.setStatus(HttpStatus.BAD_REQUEST.value());
return null;
}
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package edu.ucdavis.dss.ipa.repositories;

import edu.ucdavis.dss.ipa.entities.Activity;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;

import javax.transaction.Transactional;
import java.util.List;

public interface ActivityRepository extends CrudRepository<Activity, Long> {
Expand Down Expand Up @@ -49,4 +51,9 @@ List<Activity> findByWorkgroupIdAndYearAndTermCode(
@Param("workgroupId") long workgroupId,
@Param("year") long year,
@Param("termCode") String termCode);

@Modifying
@Transactional
@Query(value="delete from Activity a WHERE a.id = ?1")
void deleteById(long activityId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,21 @@ public interface SectionGroupCostRepository extends CrudRepository<SectionGroupC
List<SectionGroupCost> findbyWorkgroupIdAndYear(@Param("workgroupId") long workgroupId, @Param("year") long year);

SectionGroupCost findBySubjectCodeAndCourseNumberAndSequencePatternAndBudgetScenarioIdAndTermCode(String subjectCode, String courseNumber, String sequencePattern, long id, String termCode);

@Query( " SELECT DISTINCT sgc" +
" FROM SectionGroupCost sgc, BudgetScenario bs, Budget b, Schedule s" +
" WHERE sgc.budgetScenario = bs" +
" AND bs.budget = b" +
" AND b.schedule = s" +
" AND s.workgroup.id = :workgroupId" +
" AND s.year = :year" +
" AND sgc.courseNumber = :courseNumber" +
" AND sgc.sequencePattern = :sequencePattern" +
" AND sgc.subjectCode = :subjectCode" )
List<SectionGroupCost> findBySectionGroupDetails(
@Param("workgroupId") long workgroupId,
@Param("year") long year,
@Param("courseNumber") String courseNumber,
@Param("sequencePattern") String sequencePattern,
@Param("subjectCode") String subjectCode);
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package edu.ucdavis.dss.ipa.repositories;

import edu.ucdavis.dss.ipa.entities.Section;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;

import javax.transaction.Transactional;
import java.util.List;

public interface SectionRepository extends CrudRepository<Section, Long> {
Expand Down Expand Up @@ -53,4 +55,9 @@ Section findBySectionGroupIdAndSequenceNumber(
List<Section> findVisibleByWorkgroupIdAndYear(
@Param("workgroupId") long workgroupId,
@Param("year") long year);

@Modifying
@Transactional
@Query(value="delete from Section s WHERE s.id = ?1")
void deleteById(long sectionId);
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
package edu.ucdavis.dss.ipa.repositories;

import edu.ucdavis.dss.ipa.entities.SyncAction;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;

public interface SyncActionRepository extends CrudRepository<SyncAction, Long> {
import javax.transaction.Transactional;

public interface SyncActionRepository extends CrudRepository<SyncAction, Long> {
@Modifying
@Transactional
@Query(value="delete from SyncAction sa WHERE sa.id = ?1")
void deleteById(long syncActionId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,6 @@ public interface SectionGroupCostService {
void delete(Long sectionGroupCostId);

SectionGroupCost updateFromSectionGroup(SectionGroup sectionGroup, BudgetScenario liveDataScenario);

List<SectionGroupCost> findBySectionGroupDetails(long workgroupId, long year, String courseNumber, String sequencePattern, String subjectCode);
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,6 @@ public interface SectionService {
List<Section> findVisibleByWorkgroupIdAndYear(long workgroupId, long year);

boolean hasValidSequenceNumber (Section section);

void deleteWithCascade(Section section);
}
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,9 @@ public SectionGroupCost update(SectionGroupCost sectionGroupCostDTO) {

originalSectionGroupCost.setInstructor(instructorRepository.findById(sectionGroupCostDTO.getInstructorIdentification()));
originalSectionGroupCost.setOriginalInstructor(instructorRepository.findById(sectionGroupCostDTO.getOriginalInstructorIdentification()));
originalSectionGroupCost.setInstructorType(instructorTypeRepository.findById(sectionGroupCostDTO.getInstructorType().getId()));
if(sectionGroupCostDTO.getInstructorType() != null){
originalSectionGroupCost.setInstructorType(instructorTypeRepository.findById(sectionGroupCostDTO.getInstructorType().getId()));
}
if(sectionGroupCostDTO.getReasonCategory() != null){
originalSectionGroupCost.setReasonCategory(reasonCategoryRepository.findById(sectionGroupCostDTO.getReasonCategory().getId()));
}
Expand Down Expand Up @@ -263,4 +265,16 @@ public SectionGroupCost updateFromSectionGroup(SectionGroup sectionGroup, Budget

return sectionGroupCost;
}

@Override
public List<SectionGroupCost> findBySectionGroupDetails(long workgroupId, long year, String courseNumber, String sequencePattern, String subjectCode) {
return this.sectionGroupCostRepository.findBySectionGroupDetails(
workgroupId,
year,
courseNumber,
sequencePattern,
subjectCode
);
}

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package edu.ucdavis.dss.ipa.services.jpa;

import edu.ucdavis.dss.ipa.entities.*;
import edu.ucdavis.dss.ipa.repositories.ActivityRepository;
import edu.ucdavis.dss.ipa.repositories.SectionRepository;
import edu.ucdavis.dss.ipa.repositories.SyncActionRepository;
import edu.ucdavis.dss.ipa.services.*;
import org.springframework.stereotype.Service;

Expand All @@ -14,6 +16,8 @@
public class JpaSectionService implements SectionService {

@Inject SectionRepository sectionRepository;
@Inject SyncActionRepository syncActionRepository;
@Inject ActivityRepository activityRepository;

@Override
public Section save(@Valid Section section) {
Expand Down Expand Up @@ -42,7 +46,7 @@ public Section getOneById(Long id) {
public Section updateSequenceNumber(Long sectionId, String newSequencePattern) {
Section section = this.getOneById(sectionId);

if (newSequencePattern == null || newSequencePattern.length() == 0) {
if (newSequencePattern == null || newSequencePattern.length() == 0 || section == null) {
return null;
}

Expand Down Expand Up @@ -114,4 +118,17 @@ public boolean hasValidSequenceNumber (Section section) {

return true;
}

@Override
@Transactional
public void deleteWithCascade(Section section) {
for(SyncAction syncAction : section.getSyncActions()){
sectionRepository.deleteById(syncAction.getId());
}
for(Activity activity : section.getActivities()){
System.err.println("Deleting activity " + activity.getId());
activityRepository.deleteById(activity.getId());
}
sectionRepository.deleteById(section.getId());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public final class ActivityLogFormatter {

// Fields to audit in course view for course
HashMap<String, Boolean> courseViewCourse = new HashMap<String, Boolean>();
courseViewCourse.put("sequencePattern", true);
courseView.put("Course", courseViewCourse);

// Fields to audit in course view for section
Expand All @@ -30,8 +31,14 @@ public final class ActivityLogFormatter {
courseViewSectionGroup.put("plannedSeats", true);
courseViewSectionGroup.put("readerAppointments", true);
courseViewSectionGroup.put("teachingAssistantAppointments", true);
courseViewSectionGroup.put("course", true);
courseView.put("SectionGroup", courseViewSectionGroup);

// Fields to audit in course view for sectionGroupCost
HashMap<String, Boolean> courseViewSectionGroupCost = new HashMap<String, Boolean>();
courseViewSectionGroupCost.put("sequencePattern", true);
courseView.put("SectionGroupCost", courseViewSectionGroupCost);

HashMap<String, Boolean> courseViewTeachingAssignment = new HashMap<String, Boolean>();
courseView.put("TeachingAssignment", courseViewTeachingAssignment);
temp.put("courseViewController", courseView);
Expand Down Expand Up @@ -273,6 +280,8 @@ public static String getFormattedModule(String moduleNameRaw, Object obj, String
return "Support Staff Assignments";
} else if (obj instanceof Schedule && (propName.equals("supportStaffSupportCallReviewOpen") || propName.equals("instructorSupportCallReviewOpen"))) {
return "Support Staff Assignments";
} else if (obj instanceof SectionGroupCost && propName.equals("sequencePattern")){
return "Budget";
} else {
return ActivityLogFormatter.getFormattedModule(moduleNameRaw, obj);
}
Expand Down Expand Up @@ -685,6 +694,8 @@ public static String getFormattedPropName(String prop){
return "TAs";
case "supportStaffSupportCallReviewOpen":
return "Student Review";
case "sequencePattern":
return "Sequence Pattern";
default:
return prop;
}
Expand Down Expand Up @@ -718,6 +729,9 @@ public static String getFormattedPropValue(String propName, Object obj){
} else if (obj instanceof ExpenseItemType) {
ExpenseItemType expenseItemType = (ExpenseItemType) obj;
return expenseItemType.getDescription();
} else if (obj instanceof Course){
Course course = (Course) obj;
return course.getSubjectCode() + " " + course.getCourseNumber() + " - " + course.getSequencePattern();
} else {
if(obj != null){
return obj.toString();
Expand Down Expand Up @@ -756,6 +770,8 @@ public static Boolean isAudited(String module, String entity, String endpoint){
return true;
} else if (entity.equals("TeachingAssignment") && endpoint.equals("courses" )){
return true;
} else if ((entity.equals("SectionGroup") || entity.equals("Course") || entity.equals("SectionGroupCost")) && endpoint.equals("convert")){
return true;
} else if (entity.endsWith("y") && (entity.toLowerCase().substring(0, entity.length() - 1) + "ies").equals(endpoint) ) {
return true;
}
Expand Down