Skip to content

Commit

Permalink
Merge 24.11 to 24.12
Browse files Browse the repository at this point in the history
  • Loading branch information
labkey-teamcity committed Dec 3, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
2 parents cb51718 + fad05c4 commit 614c596
Showing 6 changed files with 598 additions and 29 deletions.
20 changes: 19 additions & 1 deletion WNPRC_EHR/resources/queries/wnprc/animal_requests.js
Original file line number Diff line number Diff line change
@@ -90,6 +90,24 @@ function onAfterInsert(helper,errors,row){
function onAfterUpdate(helper,errors,row,oldRow){
var rowid = row.rowId;
var hostName = 'https://' + LABKEY.serverName;
console.log ("animal_requests.js: New request updated, rowid: "+ rowid);
console.log("animal_requests.js: New request updated, rowid: "+ rowid);

if ("QCStateLabel" in row) {
delete row.QCState;
row["qcstate"] = row["QCStateLabel"];
delete row.QCStateLabel;
}
if ("QCStateLabel" in oldRow) {
oldRow["qcstate"] = oldRow["QCStateLabel"];
delete oldRow.QCStateLabel;
}

if ("_publicData" in row) {
delete row._publicData;
}
if ("_publicData" in oldRow) {
delete oldRow._publicData;
}

WNPRC.Utils.getJavaHelper().sendAnimalRequestNotificationUpdate(rowid, row, oldRow, hostName);
}
3 changes: 2 additions & 1 deletion WNPRC_EHR/src/org/labkey/wnprc_ehr/WNPRC_EHRModule.java
Original file line number Diff line number Diff line change
@@ -392,7 +392,8 @@ public void registerNotifications() {
new ColonyAlertsLiteNotificationRevamp(this),
new BloodOverdrawTriggerNotification(this),
new EmptyNotificationRevamp(this),
new AnimalRequestUpdateNotificationRevamp(this)
new AnimalRequestUpdateNotificationRevamp(this),
new TreatmentAlertsNotificationRevamp(this)
);

for (Notification notification : notifications)
Original file line number Diff line number Diff line change
@@ -81,18 +81,17 @@ public String getMessageBodyHTML(Container c, User u) {

// Prints all tables.
if (myBloodDrawNotificationObject.resultsByArea.isEmpty()) {
messageBody.append("There are no scheduled blood draws for this group today.");
messageBody.append("There are no scheduled blood draws today.");
}
else {
messageBody.append("<p><b>REMAINING INCOMPLETE TOTALS:</b><br>\n");
messageBody.append("Animal Care: " + myBloodDrawNotificationObject.numIncompleteAnimalCare + "</br>\n");
messageBody.append("Research Staff: " + myBloodDrawNotificationObject.numIncompleteResearchStaff + "</br>\n");
messageBody.append("SPI: " + myBloodDrawNotificationObject.numIncompleteSPI + "</br>\n");
messageBody.append("Vet Staff: " + myBloodDrawNotificationObject.numIncompleteVetStaff + "</p>");
messageBody.append(myBloodDrawNotificationObject.printTablesAsHTML());
}

// // Creates table.
// String[] myTableColumns = new String[]{"Id", "Blood Remaining", "Project Assignment", "Completion Status", "Group", "Other Groups Drawing Blood Today"};
// NotificationToolkit.NotificationRevampTable myTable = new NotificationToolkit.NotificationRevampTable(myTableColumns, myBloodDrawNotificationObject.myTableData);
// myTable.rowColors = myBloodDrawNotificationObject.myTableRowColors;
// messageBody.append(myTable.createBasicHTMLTable());

return messageBody.toString();
}

@@ -105,8 +104,11 @@ public static class BloodDrawsTodayObject {
NotificationToolkit.DateToolkit dateToolkit = new NotificationToolkit.DateToolkit();

ArrayList<String[]> myTableData = new ArrayList<>(); // List of all blood draws as [[id, blood remaining, project assignment, completion status, assigned to]]
// ArrayList<String> myTableRowColors = new ArrayList<>(); // List of all row colors (same length as myTableData).
HashMap<String, HashMap<String, ArrayList<String[]>>> resultsByArea = new HashMap<>(); // Area(Room(List of draws))
Integer numIncompleteSPI = 0;
Integer numIncompleteAnimalCare = 0;
Integer numIncompleteVetStaff = 0;
Integer numIncompleteResearchStaff = 0;


//Gets all info for the BloodDrawNotificationObject.
@@ -145,31 +147,37 @@ public static class BloodDrawsTodayObject {

// Updates id.
myCurrentRow[0] = result.get("id");

// Updates blood remaining.
myCurrentRow[1] = result.get("BloodRemaining/AvailBlood");

// Updates project status (this checks if animal is assigned to a project).
if (!result.get("qcstate/label").equals("Request: Denied") && !result.get("projectStatus").isEmpty()) {
myCurrentRow[2] = "UNASSIGNED";
}
else {
myCurrentRow[2] = "";
}

// Updates completion status (this checks if blood draw has been completed).
if (!result.get("qcstate/label").equals("Completed")) {
myCurrentRow[3] = "INCOMPLETE";
}
else {
myCurrentRow[3] = "";
}

// Updates the current group assigned to this animal.
myCurrentRow[4] = result.get("billedby/title");

// Updates the current area.
if (!result.get("Id/curLocation/area").isEmpty()) {
myCurrentRow[6] = result.get("Id/curLocation/area");
}
else {
myCurrentRow[6] = "Unknown Area";
}

// Updates the current room.
if (!result.get("Id/curLocation/room").isEmpty()) {
myCurrentRow[7] = result.get("Id/curLocation/room");
@@ -191,18 +199,6 @@ else if (availBlood <= bloodThreshold) {
myCurrentRow[8] = "orange";
}
}
// String currentRowColor = "white";
// if (!result.get("BloodRemaining/AvailBlood").isEmpty()) {
// Float availBlood = Float.parseFloat(result.get("BloodRemaining/AvailBlood"));
// if (availBlood <= 0) {
// // If blood draw is over limit, color it red.
// currentRowColor = "red";
// }
// else if (availBlood <= bloodThreshold) {
// // If blood draw is over threshold limit, color it orange.
// currentRowColor = "orange";
// }
// }

// Adds the current row to myTableData (based on group being queried).
if (assignmentGroup.equals("animalCare")) {
@@ -234,6 +230,24 @@ else if (assignmentGroup.equals("vetStaff")) {
myTableData.add(myCurrentRow);
}
}

// Updates number of incomplete draws.
if (assignmentGroup.equals("all")) {
if (myCurrentRow[3].equals("INCOMPLETE")) {
if (result.get("billedby/title").equals("SPI")) {
numIncompleteSPI++;
}
else if (result.get("billedby/title").equals("Animal Care")) {
numIncompleteAnimalCare++;
}
else if (result.get("billedby/title").equals("Research Staff")) {
numIncompleteResearchStaff++;
}
else if (result.get("billedby/title").equals("Vet Staff")) {
numIncompleteVetStaff++;
}
}
}
}

//Goes through each draw to find draws scheduled for more than one group, then updates myTableData with information.
Original file line number Diff line number Diff line change
@@ -69,17 +69,13 @@ public String getMessageBodyHTML(Container c, User u) {

// Creates table.
if (myBloodDrawNotificationObject.resultsByArea.isEmpty()) {
messageBody.append("There are no scheduled blood draws for this group today.");
notificationToolkit.sendEmptyNotificationRevamp(c, u, "Blood Draws Today (Vet Staff)");
return null;
}
else {
messageBody.append(myBloodDrawNotificationObject.printTablesAsHTML());
return messageBody.toString();
}

// String[] myTableColumns = new String[]{"Id", "Blood Remaining", "Project Assignment", "Completion Status", "Group", "Other Groups Drawing Blood Today"};
// NotificationToolkit.NotificationRevampTable myTable = new NotificationToolkit.NotificationRevampTable(myTableColumns, myBloodDrawNotificationObject.myTableData);
// myTable.rowColors = myBloodDrawNotificationObject.myTableRowColors;
// messageBody.append(myTable.createBasicHTMLTable());

return messageBody.toString();
}
}
Original file line number Diff line number Diff line change
@@ -27,6 +27,8 @@
import java.sql.ResultSet;

import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
@@ -40,6 +42,8 @@

import javax.script.ScriptEngine;

import static org.labkey.api.search.SearchService._log;


/**
* Created by Alex Schmidt on 12/27/23.
@@ -96,6 +100,12 @@ public String getMessageBodyHTML(Container c, User u) {
final StringBuilder messageBody = new StringBuilder();
ColonyInformationObject myColonyAlertObject = new ColonyInformationObject(c, u, "colonyAlert");

// Creates CSS.
messageBody.append(styleToolkit.beginStyle());
messageBody.append(styleToolkit.setBasicTableStyle());
messageBody.append(styleToolkit.setHeaderRowBackgroundColor("#d9d9d9"));
messageBody.append(styleToolkit.endStyle());

//Begins message info.
messageBody.append("<p> This email contains a series of automatic alerts about the colony. It was run on: " + dateToolkit.getCurrentTime() + ".</p>");

@@ -372,6 +382,19 @@ public String getMessageBodyHTML(Container c, User u) {
messageBody.append(notificationToolkit.createHyperlink("<p>Click here to view them<br>\n", myColonyAlertObject.totalFinalizedRecordsWithFutureDatesURLView));
messageBody.append("<hr>\n");
}
//38. Find any animals assigned to an inactivated project or deactivated protocol.
if (!myColonyAlertObject.animalsWithInvalidProjectOrProtocol.isEmpty()) {
// Creates HTML table to return.
String[] myTableColumns = new String[]{"Id", "Project", "Project End Date", "Protocol", "Protocol End Date"};
NotificationToolkit.NotificationRevampTable myTable = new NotificationToolkit.NotificationRevampTable(myTableColumns, myColonyAlertObject.animalsWithInvalidProjectOrProtocol);

// Displays message.
messageBody.append("<b>WARNING: There are " + myColonyAlertObject.animalsWithInvalidProjectOrProtocol.size() + " living animals with inactivated projects or deactivated protocols.</b><br>");
messageBody.append(myTable.createBasicHTMLTable());
messageBody.append(notificationToolkit.createHyperlink("<p>Click here to view all Assignments.<br>\n", myColonyAlertObject.animalsWithInvalidProjectOrProtocolURLView));
messageBody.append("<hr>\n");

}

//Returns string.
return messageBody.toString();
@@ -468,6 +491,8 @@ public ColonyInformationObject(Container currentContainer, User currentUser, Str
getPrenatalDeathsInLastFiveDays();
//37. Find the total finalized records with future dates.
getTotalFinalizedRecordsWithFutureDates();
//38. Find any animals assigned to an inactivated project or deactivated protocol.
getAnimalsWithInvalidProjectOrProtocol();
}
else if (alertType.equals("colonyManagement")) {
// 1. Find all living animals without a weight.
@@ -1355,6 +1380,83 @@ private void getProtocolsNearingAnimalLimitPercentage() {
this.protocolsNearingAnimalLimitPercentage = returnArray;
this.protocolsNearingAnimalLimitPercentageURLView = viewQueryURL;
}

// Find any animals assigned to an inactivated project or deactivated protocol.
ArrayList<String[]> animalsWithInvalidProjectOrProtocol = new ArrayList<>(); //
String animalsWithInvalidProjectOrProtocolURLView;
private void getAnimalsWithInvalidProjectOrProtocol() {
// Creates filter.
SimpleFilter myFilter = new SimpleFilter("Id/Dataset/Demographics/calculated_status", "Alive", CompareType.EQUAL);
// myFilter.addCondition("project/protocol", "", CompareType.NONBLANK);
// Gets columns to retrieve.
String[] targetColumns = new String[]{"id", "project", "project/protocol", "project/enddate", "project/protocol/enddate"};
// Runs query.
ArrayList<HashMap<String, String>> returnArray = notificationToolkit.getTableMultiRowMultiColumnWithFieldKeys(c, u, "study", "Assignment", myFilter, null, targetColumns);

// Sets up a Try/Catch block to catch date parsing errors.
try {
// Sets variables.
SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd");
Date formattedCurrentDate = myFormat.parse(dateToolkit.getCurrentTime());

for (HashMap<String, String> result : returnArray) {
// 0: ID
// 1: Project
// 2: Project End Date
// 3: Protocol
// 4: Protocol End Date
String[] myCurrentRow = new String[5];
myCurrentRow[1] = "";
myCurrentRow[2] = "";
myCurrentRow[3] = "";
myCurrentRow[4] = "";

// Retrieves row data.
String currentID = result.get("id");
String currentProject = result.get("project");
String currentProtocol = result.get("project/protocol");
String currentProjectEnd = result.get("project/enddate");
String currentProtocolEnd = result.get("project/protocol/enddate");
Boolean projectOrProtocolExpired = false;

// Adds id.
myCurrentRow[0] = currentID;
// Checks project.
if (currentProject != null && currentProjectEnd != null) {
if (!currentProject.isEmpty() && !currentProjectEnd.isEmpty()) {
Date formattedProjectEnd = myFormat.parse(currentProjectEnd);
if (formattedCurrentDate.compareTo(formattedProjectEnd) > 0) {
myCurrentRow[1] = currentProject;
myCurrentRow[2] = currentProjectEnd;
projectOrProtocolExpired = true;
}
}
}
// Checks protocol.
if (currentProtocol != null && currentProtocolEnd != null) {
if (!currentProtocol.isEmpty() && !currentProtocolEnd.isEmpty()) {
Date formattedProtocolEnd = myFormat.parse(currentProtocolEnd);
if (formattedCurrentDate.compareTo(formattedProtocolEnd) > 0) {
myCurrentRow[3] = currentProtocol;
myCurrentRow[4] = currentProtocolEnd;
projectOrProtocolExpired = true;
}
}
}

// Adds row to return list if there is an expired project or protocol.
if (projectOrProtocolExpired) {
animalsWithInvalidProjectOrProtocol.add(myCurrentRow);
}
}
}
catch (ParseException e) {
_log.error("There was a parsing exception for: ColonyAlertsNotificationRevamp->getAnimalsWithInvalidProjectOrProtocol", e);
}

// Creates url link to the assignments table.
this.animalsWithInvalidProjectOrProtocolURLView = notificationToolkit.createQueryURL(c, "execute", "study", "Assignment", null);
}
}
}

Loading

0 comments on commit 614c596

Please sign in to comment.