package org.iatoki.judgels.uriel.controllers;
import com.google.common.collect.ImmutableList;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.iatoki.judgels.play.IdentityUtils;
import org.iatoki.judgels.play.InternalLink;
import org.iatoki.judgels.play.LazyHtml;
import org.iatoki.judgels.play.Page;
import org.iatoki.judgels.play.controllers.AbstractJudgelsController;
import org.iatoki.judgels.play.views.html.layouts.subtabLayout;
import org.iatoki.judgels.play.views.html.layouts.heading3Layout;
import org.iatoki.judgels.play.views.html.layouts.messageView;
import org.iatoki.judgels.jophiel.Jophiel;
import org.iatoki.judgels.uriel.Contest;
import org.iatoki.judgels.uriel.ContestContestantStatus;
import org.iatoki.judgels.uriel.ContestNotFoundException;
import org.iatoki.judgels.uriel.ContestPermissions;
import org.iatoki.judgels.uriel.services.ContestContestantService;
import org.iatoki.judgels.uriel.services.ContestService;
import org.iatoki.judgels.uriel.ContestTeam;
import org.iatoki.judgels.uriel.ContestTeamCoach;
import org.iatoki.judgels.uriel.forms.ContestTeamCoachCreateForm;
import org.iatoki.judgels.uriel.ContestTeamCoachNotFoundException;
import org.iatoki.judgels.uriel.forms.ContestTeamCoachUploadForm;
import org.iatoki.judgels.uriel.ContestTeamMember;
import org.iatoki.judgels.uriel.forms.ContestTeamMemberCreateForm;
import org.iatoki.judgels.uriel.ContestTeamMemberNotFoundException;
import org.iatoki.judgels.uriel.forms.ContestTeamMemberUploadForm;
import org.iatoki.judgels.uriel.ContestTeamNotFoundException;
import org.iatoki.judgels.uriel.forms.ContestTeamUpsertForm;
import org.iatoki.judgels.uriel.UploadResult;
import org.iatoki.judgels.uriel.services.ContestSupervisorService;
import org.iatoki.judgels.uriel.services.ContestTeamService;
import org.iatoki.judgels.uriel.services.UserService;
import org.iatoki.judgels.uriel.controllers.securities.Authenticated;
import org.iatoki.judgels.uriel.controllers.securities.HasRole;
import org.iatoki.judgels.uriel.controllers.securities.LoggedIn;
import org.iatoki.judgels.uriel.views.html.contest.team.listCreateTeamsView;
import org.iatoki.judgels.uriel.views.html.contest.team.listScreenedTeamsView;
import org.iatoki.judgels.uriel.views.html.contest.team.updateTeamView;
import org.iatoki.judgels.uriel.views.html.contest.team.viewTeamView;
import org.iatoki.judgels.uriel.views.html.uploadResultView;
import play.data.Form;
import play.db.jpa.Transactional;
import play.filters.csrf.AddCSRFToken;
import play.filters.csrf.RequireCSRFCheck;
import play.i18n.Messages;
import play.mvc.Http;
import play.mvc.Result;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
@Authenticated(value = {LoggedIn.class, HasRole.class})
@Singleton
@Named
public class ContestTeamController extends AbstractJudgelsController {
private static final long PAGE_SIZE = 1000;
private final Jophiel jophiel;
private final ContestService contestService;
private final ContestTeamService contestTeamService;
private final ContestContestantService contestContestantService;
private final ContestSupervisorService contestSupervisorService;
private final UserService userService;
@Inject
public ContestTeamController(Jophiel jophiel, ContestService contestService, ContestTeamService contestTeamService, ContestContestantService contestContestantService, ContestSupervisorService contestSupervisorService, UserService userService) {
this.jophiel = jophiel;
this.contestService = contestService;
this.contestTeamService = contestTeamService;
this.contestContestantService = contestContestantService;
this.contestSupervisorService = contestSupervisorService;
this.userService = userService;
}
@Transactional
public Result startTeam(long contestId, long contestTeamId) throws ContestNotFoundException, ContestTeamNotFoundException {
Contest contest = contestService.findContestById(contestId);
ContestTeam contestTeam = contestTeamService.findContestTeamByContestTeamId(contestTeamId);
if (contestTeam.getContestJid().equals(contest.getJid()) && ContestControllerUtils.getInstance().isAllowedToStartContestAsCoach(contest, contestTeam)) {
contestTeamService.startTeamAsCoach(contest.getJid(), contestTeam.getJid());
return redirect(routes.ContestTeamController.viewScreenedTeams(contest.getId()));
} else {
return ContestControllerUtils.getInstance().tryEnteringContest(contest);
}
}
@Transactional(readOnly = true)
@AddCSRFToken
public Result viewTeams(long contestId) throws ContestNotFoundException {
return listCreateTeams(contestId, 0, "id", "asc", "");
}
@Transactional(readOnly = true)
@AddCSRFToken
public Result listCreateTeams(long contestId, long pageIndex, String orderBy, String orderDir, String filterString) throws ContestNotFoundException {
Contest contest = contestService.findContestById(contestId);
if (ContestControllerUtils.getInstance().isSupervisorOrAbove(contest)) {
Page<ContestTeam> contestTeams = contestTeamService.pageContestTeamsByContestJid(contest.getJid(), pageIndex, PAGE_SIZE, orderBy, orderDir, filterString);
boolean canUpdate = isAllowedToSuperviseContestants(contest);
Form<ContestTeamUpsertForm> form = Form.form(ContestTeamUpsertForm.class);
return showListCreateTeam(contestTeams, pageIndex, orderBy, orderDir, filterString, canUpdate, form, contest);
} else {
return ContestControllerUtils.getInstance().tryEnteringContest(contest);
}
}
@Transactional(readOnly = true)
public Result viewScreenedTeams(long contestId) throws ContestNotFoundException {
return listScreenedTeams(contestId, 0, "id", "asc");
}
@Transactional(readOnly = true)
public Result listScreenedTeams(long contestId, long pageIndex, String orderBy, String orderDir) throws ContestNotFoundException {
Contest contest = contestService.findContestById(contestId);
if (contestTeamService.isUserCoachInAnyTeamByContestJid(contest.getJid(), IdentityUtils.getUserJid())) {
Page<ContestTeam> contestTeams = contestTeamService.pageContestTeamsByContestJidAndCoachJid(contest.getJid(), IdentityUtils.getUserJid(), pageIndex, PAGE_SIZE, orderBy, orderDir);
return showListScreenedTeams(contestTeams, contest, pageIndex, orderBy, orderDir, ContestControllerUtils.getInstance().isAllowedToStartAnyContestAsCoach(contest));
} else {
return ContestControllerUtils.getInstance().tryEnteringContest(contest);
}
}
@Transactional
@RequireCSRFCheck
public Result postCreateTeam(long contestId, long pageIndex, String orderBy, String orderDir, String filterString) throws ContestNotFoundException {
Contest contest = contestService.findContestById(contestId);
if (isAllowedToSuperviseContestants(contest)) {
Form<ContestTeamUpsertForm> form = Form.form(ContestTeamUpsertForm.class).bindFromRequest();
if (form.hasErrors() || form.hasGlobalErrors()) {
Page<ContestTeam> contestTeams = contestTeamService.pageContestTeamsByContestJid(contest.getJid(), pageIndex, PAGE_SIZE, orderBy, orderDir, filterString);
boolean canUpdate = isAllowedToSuperviseContestants(contest);
return showListCreateTeam(contestTeams, pageIndex, orderBy, orderDir, filterString, canUpdate, form, contest);
} else {
ContestTeamUpsertForm contestTeamUpsertForm = form.get();
Http.MultipartFormData body = request().body().asMultipartFormData();
Http.MultipartFormData.FilePart teamImage = body.getFile("teamImage");
if (teamImage != null) {
try {
contestTeamService.createContestTeam(contest.getId(), contestTeamUpsertForm.name, teamImage.getFile(), FilenameUtils.getExtension(teamImage.getFilename()));
} catch (IOException e) {
Page<ContestTeam> contestTeams = contestTeamService.pageContestTeamsByContestJid(contest.getJid(), pageIndex, PAGE_SIZE, orderBy, orderDir, filterString);
boolean canUpdate = isAllowedToSuperviseContestants(contest);
form.reject("team.avatar.error.cantUpdate");
return showListCreateTeam(contestTeams, pageIndex, orderBy, orderDir, filterString, canUpdate, form, contest);
}
} else {
contestTeamService.createContestTeam(contest.getId(), contestTeamUpsertForm.name);
}
ControllerUtils.getInstance().addActivityLog("Create team " + contestTeamUpsertForm.name + " in contest " + contest.getName() + ".");
return redirect(routes.ContestTeamController.viewTeams(contest.getId()));
}
} else {
return ContestControllerUtils.getInstance().tryEnteringContest(contest);
}
}
@Transactional(readOnly = true)
@AddCSRFToken
public Result updateTeam(long contestId, long contestTeamId) throws ContestNotFoundException, ContestTeamNotFoundException {
Contest contest = contestService.findContestById(contestId);
ContestTeam contestTeam = contestTeamService.findContestTeamByContestTeamId(contestTeamId);
if (isAllowedToSuperviseContestants(contest) && contestTeam.getContestJid().equals(contest.getJid())) {
ContestTeamUpsertForm contestTeamUpsertForm = new ContestTeamUpsertForm(contestTeam);
Form<ContestTeamUpsertForm> form = Form.form(ContestTeamUpsertForm.class).fill(contestTeamUpsertForm);
ControllerUtils.getInstance().addActivityLog("Try to update team " + contestTeam.getName() + " in contest " + contest.getName() + " <a href=\"" + "http://" + Http.Context.current().request().host() + Http.Context.current().request().uri() + "\">link</a>.");
return showUpdateTeam(form, contest, contestTeam);
} else {
return ContestControllerUtils.getInstance().tryEnteringContest(contest);
}
}
@Transactional
@RequireCSRFCheck
public Result postUpdateTeam(long contestId, long contestTeamId) throws ContestNotFoundException, ContestTeamNotFoundException {
Contest contest = contestService.findContestById(contestId);
ContestTeam contestTeam = contestTeamService.findContestTeamByContestTeamId(contestTeamId);
if (isAllowedToSuperviseContestants(contest) && contestTeam.getContestJid().equals(contest.getJid())) {
Form<ContestTeamUpsertForm> form = Form.form(ContestTeamUpsertForm.class).bindFromRequest();
if (form.hasErrors() || form.hasGlobalErrors()) {
return showUpdateTeam(form, contest, contestTeam);
} else {
ContestTeamUpsertForm contestTeamUpsertForm = form.get();
Http.MultipartFormData body = request().body().asMultipartFormData();
Http.MultipartFormData.FilePart teamImage = body.getFile("teamImage");
if (teamImage != null) {
try {
contestTeamService.updateContestTeam(contestTeam.getId(), contestTeamUpsertForm.name, teamImage.getFile(), FilenameUtils.getExtension(teamImage.getFilename()));
} catch (IOException e) {
form.reject("team.avatar.error.cantUpdate");
return showUpdateTeam(form, contest, contestTeam);
}
} else {
contestTeamService.updateContestTeam(contestTeam.getId(), contestTeamUpsertForm.name);
}
ControllerUtils.getInstance().addActivityLog("Update team " + contestTeam.getName() + " in contest " + contest.getName() + ".");
return redirect(routes.ContestTeamController.viewTeams(contest.getId()));
}
} else {
return ContestControllerUtils.getInstance().tryEnteringContest(contest);
}
}
@Transactional(readOnly = true)
@AddCSRFToken
public Result viewTeam(long contestId, long contestTeamId) throws ContestNotFoundException, ContestTeamNotFoundException {
Contest contest = contestService.findContestById(contestId);
ContestTeam contestTeam = contestTeamService.findContestTeamByContestTeamId(contestTeamId);
if (ContestControllerUtils.getInstance().isSupervisorOrAbove(contest) && contestTeam.getContestJid().equals(contest.getJid())) {
Form<ContestTeamCoachCreateForm> form = Form.form(ContestTeamCoachCreateForm.class);
Form<ContestTeamCoachUploadForm> form2 = Form.form(ContestTeamCoachUploadForm.class);
Form<ContestTeamMemberCreateForm> form3 = Form.form(ContestTeamMemberCreateForm.class);
Form<ContestTeamMemberUploadForm> form4 = Form.form(ContestTeamMemberUploadForm.class);
ControllerUtils.getInstance().addActivityLog("View team " + contestTeam.getName() + " in contest " + contest.getName() + " <a href=\"" + "http://" + Http.Context.current().request().host() + Http.Context.current().request().uri() + "\">link</a>.");
return showViewTeam(form, form2, form3, form4, contest, contestTeam, contestTeamService.findContestTeamCoachesByTeamJid(contestTeam.getJid()), contestTeamService.findContestTeamMembersByTeamJid(contestTeam.getJid()), isAllowedToSuperviseContestants(contest));
} else {
return ContestControllerUtils.getInstance().tryEnteringContest(contest);
}
}
@Transactional
@RequireCSRFCheck
public Result postCreateTeamCoach(long contestId, long contestTeamId) throws ContestNotFoundException, ContestTeamNotFoundException {
Contest contest = contestService.findContestById(contestId);
ContestTeam contestTeam = contestTeamService.findContestTeamByContestTeamId(contestTeamId);
if (isAllowedToSuperviseContestants(contest) && contestTeam.getContestJid().equals(contest.getJid())) {
Form<ContestTeamCoachCreateForm> form = Form.form(ContestTeamCoachCreateForm.class).bindFromRequest();
if (form.hasErrors() || form.hasGlobalErrors()) {
Form<ContestTeamCoachUploadForm> form2 = Form.form(ContestTeamCoachUploadForm.class);
Form<ContestTeamMemberCreateForm> form3 = Form.form(ContestTeamMemberCreateForm.class);
Form<ContestTeamMemberUploadForm> form4 = Form.form(ContestTeamMemberUploadForm.class);
return showViewTeam(form, form2, form3, form4, contest, contestTeam, contestTeamService.findContestTeamCoachesByTeamJid(contestTeam.getJid()), contestTeamService.findContestTeamMembersByTeamJid(contestTeam.getJid()), true);
} else {
ContestTeamCoachCreateForm contestTeamCoachCreateForm = form.get();
try {
String userJid = jophiel.verifyUsername(contestTeamCoachCreateForm.username);
if (userJid != null) {
if (!contestTeamService.isUserCoachByUserJidAndTeamJid(userJid, contestTeam.getJid())) {
if (!contestContestantService.isContestContestantInContestByUserJid(contest.getJid(), userJid)) {
contestTeamService.createContestTeamCoach(contestTeam.getJid(), userJid);
userService.upsertUserFromJophielUserJid(userJid);
ControllerUtils.getInstance().addActivityLog("Add " + contestTeamCoachCreateForm.username + " as coach on team " + contestTeam.getName() + " in contest " + contest.getName() + ".");
return redirect(routes.ContestTeamController.viewTeam(contest.getId(), contestTeam.getId()));
} else {
form.reject("error.team.userAlreadyAContestant");
Form<ContestTeamCoachUploadForm> form2 = Form.form(ContestTeamCoachUploadForm.class);
Form<ContestTeamMemberCreateForm> form3 = Form.form(ContestTeamMemberCreateForm.class);
Form<ContestTeamMemberUploadForm> form4 = Form.form(ContestTeamMemberUploadForm.class);
return showViewTeam(form, form2, form3, form4, contest, contestTeam, contestTeamService.findContestTeamCoachesByTeamJid(contestTeam.getJid()), contestTeamService.findContestTeamMembersByTeamJid(contestTeam.getJid()), true);
}
} else {
form.reject("error.team.userAlreadyACoach");
Form<ContestTeamCoachUploadForm> form2 = Form.form(ContestTeamCoachUploadForm.class);
Form<ContestTeamMemberCreateForm> form3 = Form.form(ContestTeamMemberCreateForm.class);
Form<ContestTeamMemberUploadForm> form4 = Form.form(ContestTeamMemberUploadForm.class);
return showViewTeam(form, form2, form3, form4, contest, contestTeam, contestTeamService.findContestTeamCoachesByTeamJid(contestTeam.getJid()), contestTeamService.findContestTeamMembersByTeamJid(contestTeam.getJid()), true);
}
} else {
form.reject("error.team.userNotFound");
Form<ContestTeamCoachUploadForm> form2 = Form.form(ContestTeamCoachUploadForm.class);
Form<ContestTeamMemberCreateForm> form3 = Form.form(ContestTeamMemberCreateForm.class);
Form<ContestTeamMemberUploadForm> form4 = Form.form(ContestTeamMemberUploadForm.class);
return showViewTeam(form, form2, form3, form4, contest, contestTeam, contestTeamService.findContestTeamCoachesByTeamJid(contestTeam.getJid()), contestTeamService.findContestTeamMembersByTeamJid(contestTeam.getJid()), true);
}
} catch (IOException e) {
form.reject("error.team.userNotFound");
Form<ContestTeamCoachUploadForm> form2 = Form.form(ContestTeamCoachUploadForm.class);
Form<ContestTeamMemberCreateForm> form3 = Form.form(ContestTeamMemberCreateForm.class);
Form<ContestTeamMemberUploadForm> form4 = Form.form(ContestTeamMemberUploadForm.class);
return showViewTeam(form, form2, form3, form4, contest, contestTeam, contestTeamService.findContestTeamCoachesByTeamJid(contestTeam.getJid()), contestTeamService.findContestTeamMembersByTeamJid(contestTeam.getJid()), true);
}
}
} else {
return ContestControllerUtils.getInstance().tryEnteringContest(contest);
}
}
@Transactional
@RequireCSRFCheck
public Result postUploadTeamCoach(long contestId, long contestTeamId) throws ContestNotFoundException, ContestTeamNotFoundException {
Contest contest = contestService.findContestById(contestId);
ContestTeam contestTeam = contestTeamService.findContestTeamByContestTeamId(contestTeamId);
if (isAllowedToSuperviseContestants(contest) && contestTeam.getContestJid().equals(contest.getJid())) {
ImmutableList.Builder<UploadResult> failedUploadsBuilder = ImmutableList.builder();
Http.MultipartFormData body = request().body().asMultipartFormData();
Http.MultipartFormData.FilePart file;
file = body.getFile("usernames");
if (file != null) {
File userFile = file.getFile();
try {
String[] usernames = FileUtils.readFileToString(userFile).split("\n");
for (String username : usernames) {
try {
String userJid = jophiel.verifyUsername(username);
if (userJid != null) {
if (!contestTeamService.isUserCoachByUserJidAndTeamJid(userJid, contestTeam.getJid())) {
if (!contestContestantService.isContestContestantInContestByUserJid(contest.getJid(), userJid)) {
userService.upsertUserFromJophielUserJid(userJid);
contestTeamService.createContestTeamCoach(contestTeam.getJid(), userJid);
} else {
failedUploadsBuilder.add(new UploadResult(username, Messages.get("error.team.userAlreadyAContestant")));
}
} else {
failedUploadsBuilder.add(new UploadResult(username, Messages.get("error.team.userAlreadyACoach")));
}
} else {
failedUploadsBuilder.add(new UploadResult(username, Messages.get("error.team.userNotFound")));
}
} catch (IOException e) {
failedUploadsBuilder.add(new UploadResult(username, Messages.get("error.team.userNotFound")));
}
}
ControllerUtils.getInstance().addActivityLog("Upload contest team coaches in contest " + contest.getName() + ".");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
List<UploadResult> failedUploads = failedUploadsBuilder.build();
return showUploadTeamCoach(failedUploads, contest, contestTeam);
} else {
return ContestControllerUtils.getInstance().tryEnteringContest(contest);
}
}
@Transactional
public Result removeTeamCoach(long contestId, long contestTeamId, long contestTeamCoachId) throws ContestNotFoundException, ContestTeamNotFoundException, ContestTeamCoachNotFoundException {
Contest contest = contestService.findContestById(contestId);
ContestTeam contestTeam = contestTeamService.findContestTeamByContestTeamId(contestTeamId);
ContestTeamCoach contestTeamCoach = contestTeamService.findContestTeamCoachByContestTeamCoachId(contestTeamCoachId);
if (isAllowedToSuperviseContestants(contest) && contestTeam.getContestJid().equals(contest.getJid()) && contestTeamCoach.getTeamJid().equals(contestTeam.getJid())) {
contestTeamService.removeContestTeamCoachByContestTeamCoachId(contestTeamCoach.getId());
ControllerUtils.getInstance().addActivityLog("Remove " + contestTeamCoach.getCoachJid() + " from coach on team " + contestTeam.getName() + " in contest " + contest.getName() + ".");
return redirect(routes.ContestTeamController.viewTeam(contest.getId(), contestTeam.getId()));
} else {
return ContestControllerUtils.getInstance().tryEnteringContest(contest);
}
}
@Transactional
@RequireCSRFCheck
public Result postCreateTeamMember(long contestId, long contestTeamId) throws ContestNotFoundException, ContestTeamNotFoundException {
Contest contest = contestService.findContestById(contestId);
ContestTeam contestTeam = contestTeamService.findContestTeamByContestTeamId(contestTeamId);
if (isAllowedToSuperviseContestants(contest) && contestTeam.getContestJid().equals(contest.getJid())) {
Form<ContestTeamMemberCreateForm> form3 = Form.form(ContestTeamMemberCreateForm.class).bindFromRequest();
if (form3.hasErrors() || form3.hasGlobalErrors()) {
Form<ContestTeamCoachCreateForm> form = Form.form(ContestTeamCoachCreateForm.class);
Form<ContestTeamCoachUploadForm> form2 = Form.form(ContestTeamCoachUploadForm.class);
Form<ContestTeamMemberUploadForm> form4 = Form.form(ContestTeamMemberUploadForm.class);
return showViewTeam(form, form2, form3, form4, contest, contestTeam, contestTeamService.findContestTeamCoachesByTeamJid(contestTeam.getJid()), contestTeamService.findContestTeamMembersByTeamJid(contestTeam.getJid()), true);
} else {
ContestTeamMemberCreateForm contestTeamMemberCreateForm = form3.get();
try {
String userJid = jophiel.verifyUsername(contestTeamMemberCreateForm.username);
if (userJid != null) {
if (!contestTeamService.isUserInAnyTeamByContestJid(contest.getJid(), userJid)) {
if (!contestContestantService.isContestContestantInContestByUserJid(contest.getJid(), userJid)) {
contestContestantService.createContestContestant(contest.getId(), userJid, ContestContestantStatus.APPROVED);
}
contestTeamService.createContestTeamMember(contestTeam.getJid(), userJid);
ControllerUtils.getInstance().addActivityLog("Add " + contestTeamMemberCreateForm.username + " as member on team " + contestTeam.getName() + " in contest " + contest.getName() + ".");
return redirect(routes.ContestTeamController.viewTeam(contest.getId(), contestTeam.getId()));
} else {
form3.reject("error.team.userAlreadyHasTeam");
Form<ContestTeamCoachCreateForm> form = Form.form(ContestTeamCoachCreateForm.class);
Form<ContestTeamCoachUploadForm> form2 = Form.form(ContestTeamCoachUploadForm.class);
Form<ContestTeamMemberUploadForm> form4 = Form.form(ContestTeamMemberUploadForm.class);
return showViewTeam(form, form2, form3, form4, contest, contestTeam, contestTeamService.findContestTeamCoachesByTeamJid(contestTeam.getJid()), contestTeamService.findContestTeamMembersByTeamJid(contestTeam.getJid()), true);
}
} else {
form3.reject("error.team.userNotFound");
Form<ContestTeamCoachCreateForm> form = Form.form(ContestTeamCoachCreateForm.class);
Form<ContestTeamCoachUploadForm> form2 = Form.form(ContestTeamCoachUploadForm.class);
Form<ContestTeamMemberUploadForm> form4 = Form.form(ContestTeamMemberUploadForm.class);
return showViewTeam(form, form2, form3, form4, contest, contestTeam, contestTeamService.findContestTeamCoachesByTeamJid(contestTeam.getJid()), contestTeamService.findContestTeamMembersByTeamJid(contestTeam.getJid()), true);
}
} catch (IOException e) {
form3.reject("error.team.userNotFound");
Form<ContestTeamCoachCreateForm> form = Form.form(ContestTeamCoachCreateForm.class);
Form<ContestTeamCoachUploadForm> form2 = Form.form(ContestTeamCoachUploadForm.class);
Form<ContestTeamMemberUploadForm> form4 = Form.form(ContestTeamMemberUploadForm.class);
return showViewTeam(form, form2, form3, form4, contest, contestTeam, contestTeamService.findContestTeamCoachesByTeamJid(contestTeam.getJid()), contestTeamService.findContestTeamMembersByTeamJid(contestTeam.getJid()), true);
}
}
} else {
return ContestControllerUtils.getInstance().tryEnteringContest(contest);
}
}
@Transactional
@RequireCSRFCheck
public Result postUploadTeamMember(long contestId, long contestTeamId) throws ContestNotFoundException, ContestTeamNotFoundException {
Contest contest = contestService.findContestById(contestId);
ContestTeam contestTeam = contestTeamService.findContestTeamByContestTeamId(contestTeamId);
if (isAllowedToSuperviseContestants(contest) && contestTeam.getContestJid().equals(contest.getJid())) {
ImmutableList.Builder<UploadResult> failedUploadsBuilder = ImmutableList.builder();
Http.MultipartFormData body = request().body().asMultipartFormData();
Http.MultipartFormData.FilePart file;
file = body.getFile("usernames");
if (file != null) {
File userFile = file.getFile();
try {
String[] usernames = FileUtils.readFileToString(userFile).split("\n");
for (String username : usernames) {
try {
String userJid = jophiel.verifyUsername(username);
if (userJid != null) {
if (!contestTeamService.isUserInAnyTeamByContestJid(contest.getJid(), userJid)) {
if (!contestContestantService.isContestContestantInContestByUserJid(contest.getJid(), userJid)) {
contestContestantService.createContestContestant(contest.getId(), userJid, ContestContestantStatus.APPROVED);
}
contestTeamService.createContestTeamMember(contestTeam.getJid(), userJid);
} else {
failedUploadsBuilder.add(new UploadResult(username, Messages.get("error.team.userAlreadyHasTeam")));
}
} else {
failedUploadsBuilder.add(new UploadResult(username, Messages.get("error.team.userNotFound")));
}
} catch (IOException e) {
failedUploadsBuilder.add(new UploadResult(username, Messages.get("error.team.userNotFound")));
}
}
ControllerUtils.getInstance().addActivityLog("Upload contest team members in contest " + contest.getName() + ".");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
List<UploadResult> failedUploads = failedUploadsBuilder.build();
return showUploadTeamMember(failedUploads, contest, contestTeam);
} else {
return ContestControllerUtils.getInstance().tryEnteringContest(contest);
}
}
@Transactional
public Result removeTeamMember(long contestId, long contestTeamId, long contestTeamMemberId) throws ContestNotFoundException, ContestTeamNotFoundException, ContestTeamMemberNotFoundException {
Contest contest = contestService.findContestById(contestId);
ContestTeam contestTeam = contestTeamService.findContestTeamByContestTeamId(contestTeamId);
ContestTeamMember contestTeamMember = contestTeamService.findContestTeamMemberByContestTeamMemberId(contestTeamMemberId);
if (isAllowedToSuperviseContestants(contest) && contestTeam.getContestJid().equals(contest.getJid()) && contestTeamMember.getTeamJid().equals(contestTeam.getJid())) {
contestTeamService.removeContestTeamMemberByContestTeamMemberId(contestTeamMember.getId());
ControllerUtils.getInstance().addActivityLog("Remove " + contestTeamMember.getMemberJid() + " from member on team " + contestTeam.getName() + " in contest " + contest.getName() + ".");
return redirect(routes.ContestTeamController.viewTeam(contest.getId(), contestTeam.getId()));
} else {
return ContestControllerUtils.getInstance().tryEnteringContest(contest);
}
}
private Result showListCreateTeam(Page<ContestTeam> contestTeams, long pageIndex, String orderBy, String orderDir, String filterString, boolean canUpdate, Form<ContestTeamUpsertForm> form, Contest contest){
LazyHtml content = new LazyHtml(listCreateTeamsView.render(contest.getId(), contestTeams, pageIndex, orderBy, orderDir, filterString, canUpdate, form, ContestControllerUtils.getInstance().hasContestBegun(contest)));
content.appendLayout(c -> heading3Layout.render(Messages.get("team.list"), c));
appendSubtabsLayout(content, contest);
ContestControllerUtils.getInstance().appendTabsLayout(content, contest);
ControllerUtils.getInstance().appendSidebarLayout(content);
appendBreadcrumbsLayout(content, contest,
new InternalLink(Messages.get("team.list"), routes.ContestTeamController.viewTeams(contest.getId()))
);
ControllerUtils.getInstance().appendTemplateLayout(content, "Contest - Teams");
ControllerUtils.getInstance().addActivityLog("List all teams in contest " + contest.getName() + " <a href=\"" + "http://" + Http.Context.current().request().host() + Http.Context.current().request().uri() + "\">link</a>.");
return ControllerUtils.getInstance().lazyOk(content);
}
private Result showListScreenedTeams(Page<ContestTeam> contestTeams, Contest contest, long pageIndex, String orderBy, String orderDir, boolean isAllowedToStartContest){
LazyHtml content = new LazyHtml(listScreenedTeamsView.render(contest.getId(), contestTeams, pageIndex, orderBy, orderDir, isAllowedToStartContest));
content.appendLayout(c -> heading3Layout.render(Messages.get("team.list"), c));
ContestControllerUtils.getInstance().appendTabsLayout(content, contest);
ControllerUtils.getInstance().appendSidebarLayout(content);
appendBreadcrumbsLayout(content, contest,
new InternalLink(Messages.get("team.list"), routes.ContestTeamController.viewTeams(contest.getId()))
);
ControllerUtils.getInstance().appendTemplateLayout(content, "Contest - Teams");
ControllerUtils.getInstance().addActivityLog("List all screened teams in contest " + contest.getName() + " <a href=\"" + "http://" + Http.Context.current().request().host() + Http.Context.current().request().uri() + "\">link</a>.");
return ControllerUtils.getInstance().lazyOk(content);
}
private Result showUpdateTeam(Form<ContestTeamUpsertForm> form, Contest contest, ContestTeam contestTeam){
LazyHtml content = new LazyHtml(updateTeamView.render(contest.getId(), contestTeam.getId(), form));
content.appendLayout(c -> heading3Layout.render(Messages.get("team.update"), c));
content.appendLayout(c -> subtabLayout.render(ImmutableList.of(new InternalLink(Messages.get("contestant.contestants"), routes.ContestContestantController.viewContestants(contest.getId())), new InternalLink(Messages.get("team.teams"), routes.ContestTeamController.viewTeams(contest.getId()))), c));
ContestControllerUtils.getInstance().appendTabsLayout(content, contest);
ControllerUtils.getInstance().appendSidebarLayout(content);
appendBreadcrumbsLayout(content, contest,
new InternalLink(Messages.get("team.teams"), routes.ContestTeamController.viewTeams(contest.getId())),
new InternalLink(Messages.get("team.update"), routes.ContestTeamController.updateTeam(contest.getId(), contestTeam.getId()))
);
ControllerUtils.getInstance().appendTemplateLayout(content, "Contest - Team - Update");
return ControllerUtils.getInstance().lazyOk(content);
}
private Result showViewTeam(Form<ContestTeamCoachCreateForm> form, Form<ContestTeamCoachUploadForm> form2, Form<ContestTeamMemberCreateForm> form3, Form<ContestTeamMemberUploadForm> form4, Contest contest, ContestTeam contestTeam, List<ContestTeamCoach> contestTeamCoaches, List<ContestTeamMember> contestTeamMembers, boolean canUpdate) {
LazyHtml content = new LazyHtml(viewTeamView.render(contest.getId(), contestTeam, form, form2, form3, form4, contestTeamCoaches, contestTeamMembers, canUpdate, jophiel.getAutoCompleteEndPoint()));
content.appendLayout(c -> heading3Layout.render(Messages.get("team.view"), c));
content.appendLayout(c -> subtabLayout.render(ImmutableList.of(new InternalLink(Messages.get("contestant.contestants"), routes.ContestContestantController.viewContestants(contest.getId())), new InternalLink(Messages.get("team.teams"), routes.ContestTeamController.viewTeams(contest.getId()))), c));
ContestControllerUtils.getInstance().appendTabsLayout(content, contest);
ControllerUtils.getInstance().appendSidebarLayout(content);
appendBreadcrumbsLayout(content, contest,
new InternalLink(Messages.get("team.teams"), routes.ContestTeamController.viewTeams(contest.getId())),
new InternalLink(Messages.get("team.view"), routes.ContestTeamController.viewTeam(contest.getId(), contestTeam.getId()))
);
ControllerUtils.getInstance().appendTemplateLayout(content, "Contest - Team - View");
return ControllerUtils.getInstance().lazyOk(content);
}
private Result showUploadTeamCoach(List<UploadResult> failedUploads, Contest contest, ContestTeam contestTeam) {
LazyHtml content;
if (failedUploads.size() > 0) {
content = new LazyHtml(uploadResultView.render(failedUploads));
} else {
content = new LazyHtml(messageView.render(Messages.get("contest.team.coach.upload.success")));
}
content.appendLayout(c -> heading3Layout.render(Messages.get("contest.team.coach.upload.result"), c));
content.appendLayout(c -> subtabLayout.render(ImmutableList.of(new InternalLink(Messages.get("contestant.contestants"), routes.ContestContestantController.viewContestants(contest.getId())), new InternalLink(Messages.get("team.teams"), routes.ContestTeamController.viewTeams(contest.getId()))), c));
ContestControllerUtils.getInstance().appendTabsLayout(content, contest);
ControllerUtils.getInstance().appendSidebarLayout(content);
appendBreadcrumbsLayout(content, contest,
new InternalLink(Messages.get("team.teams"), routes.ContestTeamController.viewTeams(contest.getId())),
new InternalLink(Messages.get("team.view"), routes.ContestTeamController.viewTeam(contest.getId(), contestTeam.getId()))
);
ControllerUtils.getInstance().appendTemplateLayout(content, "Contest - Teams - Upload Coach Result");
return ControllerUtils.getInstance().lazyOk(content);
}
private Result showUploadTeamMember(List<UploadResult> failedUploads, Contest contest, ContestTeam contestTeam) {
LazyHtml content;
if (failedUploads.size() > 0) {
content = new LazyHtml(uploadResultView.render(failedUploads));
} else {
content = new LazyHtml(messageView.render(Messages.get("contest.team.member.upload.success")));
}
content.appendLayout(c -> heading3Layout.render(Messages.get("contest.team.member.upload.result"), c));
content.appendLayout(c -> subtabLayout.render(ImmutableList.of(new InternalLink(Messages.get("contestant.contestants"), routes.ContestContestantController.viewContestants(contest.getId())), new InternalLink(Messages.get("team.teams"), routes.ContestTeamController.viewTeams(contest.getId()))), c));
ContestControllerUtils.getInstance().appendTabsLayout(content, contest);
ControllerUtils.getInstance().appendSidebarLayout(content);
appendBreadcrumbsLayout(content, contest,
new InternalLink(Messages.get("team.teams"), routes.ContestTeamController.viewTeams(contest.getId())),
new InternalLink(Messages.get("team.view"), routes.ContestTeamController.viewTeam(contest.getId(), contestTeam.getId()))
);
ControllerUtils.getInstance().appendTemplateLayout(content, "Contest - Teams - Upload Member Result");
return ControllerUtils.getInstance().lazyOk(content);
}
private void appendSubtabsLayout(LazyHtml content, Contest contest) {
ImmutableList.Builder<InternalLink> internalLinks = ImmutableList.builder();
internalLinks.add(new InternalLink(Messages.get("contestant.contestants"), routes.ContestContestantController.viewContestants(contest.getId())));
internalLinks.add(new InternalLink(Messages.get("team.teams"), routes.ContestTeamController.viewTeams(contest.getId())));
if (contest.requiresPassword()) {
internalLinks.add(new InternalLink(Messages.get("contestant.passwords"), routes.ContestContestantController.viewContestantPasswords(contest.getId())));
}
content.appendLayout(c -> subtabLayout.render(internalLinks.build(), c));
}
private void appendBreadcrumbsLayout(LazyHtml content, Contest contest, InternalLink... lastLinks) {
ControllerUtils.getInstance().appendBreadcrumbsLayout(content,
ContestControllerUtils.getInstance().getContestBreadcrumbsBuilder(contest)
.add(new InternalLink(Messages.get("contestant.contestants"), routes.ContestController.jumpToContestants(contest.getId())))
.addAll(Arrays.asList(lastLinks))
.build()
);
}
private boolean isAllowedToSuperviseContestants(Contest contest) {
return ControllerUtils.getInstance().isAdmin() || ContestControllerUtils.getInstance().isManager(contest) || (ContestControllerUtils.getInstance().isSupervisor(contest) && contestSupervisorService.findContestSupervisorByContestJidAndUserJid(contest.getJid(), IdentityUtils.getUserJid()).getContestPermission().isAllowed(ContestPermissions.CONTESTANT));
}
}