package controllers;
import static play.data.Form.form;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import models.Collection;
import models.Organisation;
import models.Target;
import models.User;
import org.apache.commons.lang3.StringUtils;
import play.Logger;
import play.data.DynamicForm;
import play.mvc.Result;
import play.mvc.Security;
import uk.bl.Const;
import uk.bl.Const.ReportQaStatusType;
import uk.bl.api.Utils;
import views.html.reports.reportsqa;
import com.avaje.ebean.Page;
/**
* Manage reports.
*/
@Security.Authenticated(SecuredController.class)
public class ReportQaController extends AbstractController {
/**
* Display the report.
*/
public static Result index() {
return redirect(routes.ReportQaController.targets(0, "title", "asc", "qaed", -1L, -1L, Utils.INSTANCE.getCurrentDate(), "", -1L));
}
public static Result switchReportQaTab(String status) {
Logger.debug("switchReportQaTab() status: " + status);
return redirect(routes.ReportQaController.targets(0, "title", "asc", status, -1L, -1L, Utils.INSTANCE.getCurrentDate(), "", -1L));
}
/**
* This method enables searching for given URL and redirection in order to add new entry
* if required.
* @return
*/
public static Result search() {
DynamicForm requestData = form().bindFromRequest();
String action = requestData.get("action");
int pageNo = Integer.parseInt(requestData.get("p"));
String sort = requestData.get("s");
String order = requestData.get("o");
int pageSize = Integer.parseInt(requestData.get("pageSize"));
Long curatorId = Long.parseLong(requestData.get("curator"));
Long organisationId = Long.parseLong(requestData.get("organisation"));
Long collectionId = Long.parseLong(requestData.get("collection"));
String status = requestData.get("status");
String startDate = requestData.get("startDate");
Logger.debug("startDate: " + startDate);
String endDate = requestData.get("endDate");
if (StringUtils.isEmpty(action)) {
return badRequest("You must provide a valid action");
} else {
if (Const.EXPORT.equals(action)) {
List<Target> exportTargets = new ArrayList<Target>();
Page<Target> page = Target.pageReportsQa(pageNo, 10, sort, order, status, curatorId, organisationId,
startDate, endDate, collectionId);
int rowCount = page.getTotalRowCount();
Page<Target> pageAll = Target.pageReportsQa(pageNo, rowCount, sort, order, status, curatorId, organisationId,
startDate, endDate, collectionId);
exportTargets.addAll(pageAll.getList());
Logger.debug("export report QA size: " + exportTargets.size() + ", status: " + status);
export(exportTargets, Const.EXPORT_TARGETS_REPORTS_QA);
return redirect(routes.ReportQaController.targets(pageNo, sort, order, status, curatorId, organisationId,
startDate, endDate, collectionId));
}
else if (Const.SEARCH.equals(action)) {
return redirect(routes.ReportQaController.targets(pageNo, sort, order, status, curatorId, organisationId,
startDate, endDate, collectionId));
} else {
return badRequest("This action is not allowed");
}
}
}
/**
* This method exports selected targets to CSV file.
* @param list of Target objects
* @param file name
* @return
*/
public static void export(List<Target> targetList, String fileName) {
Logger.debug("export() targetList size: " + targetList.size());
StringWriter sw = new StringWriter();
sw.append("Target title");
sw.append(Const.CSV_SEPARATOR);
sw.append("Target URL");
sw.append(Const.CSV_SEPARATOR);
sw.append("Date requested");
sw.append(Const.CSV_SEPARATOR);
sw.append(Const.CSV_LINE_END);
if (targetList != null && targetList.size() > 0) {
Iterator<Target> itr = targetList.iterator();
while (itr.hasNext()) {
Target target = itr.next();
sw.append(target.title);
sw.append(Const.CSV_SEPARATOR);
sw.append(target.fieldUrl());
sw.append(Const.CSV_SEPARATOR);
sw.append(target.updatedAt.toString());
sw.append(Const.CSV_SEPARATOR);
sw.append(Const.CSV_LINE_END);
}
}
Utils.INSTANCE.generateCsvFile(fileName, sw.toString());
}
/**
* Display the paginated list of targets.
*
* @param page Current page number (starts from 0)
* @param sortBy Column to be sorted
* @param order Sort order (either asc or desc)
* @param status The type of report QA e.g. awaiting QA, with no QA issues...
* @param curator Author of the target
* @param organisation The author's organisation
* @param startDate The start date for filtering
* @param endDate The end date for filtering
* @param collection The associated collection
*/
public static Result targets(int pageNo, String sortBy, String order, String status, Long curatorId,
Long organisationId, String startDate, String endDate, Long collectionId) {
Logger.debug("ReportsQa.targets()");
User user = User.findByEmail(request().username());
Page<Target> pages = Target.pageReportsQa(pageNo, 10, sortBy, order, status, curatorId, organisationId, startDate, endDate, collectionId);
List<User> users = User.findAll();
List<Organisation> organisations = Organisation.findAllSorted();
List<Collection> collections = Collection.findAllCollections();
ReportQaStatusType[] reportQaStatusTypes = ReportQaStatusType.values();
return ok(
reportsqa.render(
"ReportsQa",
user,
pages,
sortBy,
order,
status,
curatorId,
organisationId,
startDate,
endDate,
collectionId,
users,
organisations,
collections,
reportQaStatusTypes)
);
}
}