public async Task <IActionResult> EditLabExecutionAsync(AdminLabExecution labExecutionData)
    {
        // Check input
        if (!ModelState.IsValid || !(labExecutionData.LabExecution.PreStart < labExecutionData.LabExecution.Start &&
                                     labExecutionData.LabExecution.Start < labExecutionData.LabExecution.End))
        {
            AddStatusMessage(_localizer["EditLabExecutionAsync:InvalidInput"], StatusMessageTypes.Error);
            return(await ShowEditLabExecutionFormAsync(null, null, labExecutionData));
        }

        try
        {
            // Retrieve edited labExecution from database and apply changes
            var labExecution = await _labExecutionService.GetLabExecutionAsync(labExecutionData.LabExecution.GroupId, labExecutionData.LabExecution.LabId, HttpContext.RequestAborted);

            labExecution.PreStart = labExecutionData.LabExecution.PreStart;
            labExecution.Start    = labExecutionData.LabExecution.Start;
            labExecution.End      = labExecutionData.LabExecution.End;
            await _labExecutionService.UpdateLabExecutionAsync(labExecution, HttpContext.RequestAborted);

            AddStatusMessage(_localizer["EditLabExecutionAsync:Success"], StatusMessageTypes.Success);
        }
        catch (InvalidOperationException ex)
        {
            _logger.LogError(ex, "Edit lab execution");
            AddStatusMessage(_localizer["EditLabExecutionAsync:UnknownError"], StatusMessageTypes.Error);
            return(await ShowEditLabExecutionFormAsync(null, null, labExecutionData));
        }

        return(await RenderLabExecutionListAsync());
    }
    public async Task <IActionResult> ShowCreateLabExecutionForGroupFormAsync(AdminLabExecution labExecutionData = null)
    {
        // Pass lists
        ViewData["Labs"] = await _labService.GetLabsAsync().ToListAsync();

        ViewData["Groups"] = await _userService.GetGroupsAsync().ToListAsync();

        return(await RenderAsync(ViewType.CreateForGroup, labExecutionData));
    }
    public async Task <IActionResult> CreateLabExecutionForSlotAsync(AdminLabExecution labExecutionData)
    {
        // Check input
        if (!ModelState.IsValid ||
            !await _labService.LabExistsAsync(labExecutionData.LabExecution.LabId, HttpContext.RequestAborted) ||
            !await _slotService.SlotExistsAsync(labExecutionData.SlotId, HttpContext.RequestAborted) ||
            !(labExecutionData.LabExecution.PreStart < labExecutionData.LabExecution.Start &&
              labExecutionData.LabExecution.Start < labExecutionData.LabExecution.End))
        {
            AddStatusMessage(_localizer["CreateLabExecutionForSlotAsync:InvalidInput"], StatusMessageTypes.Error);
            return(await ShowCreateLabExecutionForSlotFormAsync(labExecutionData));
        }

        try
        {
            // Start lab for each of the groups
            foreach (var group in await _userService.GetGroupsInSlotAsync(labExecutionData.SlotId).ToListAsync())
            {
                try
                {
                    var labExecution = new LabExecution
                    {
                        GroupId  = group.Id,
                        LabId    = labExecutionData.LabExecution.LabId,
                        PreStart = labExecutionData.LabExecution.PreStart,
                        Start    = labExecutionData.LabExecution.Start,
                        End      = labExecutionData.LabExecution.End
                    };
                    await _labExecutionService.CreateLabExecutionAsync(labExecution, labExecutionData.OverrideExisting, HttpContext.RequestAborted);
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex, "Create lab execution for group in slot");
                    AddStatusMessage(_localizer["CreateLabExecutionForSlotAsync:ErrorGroup", group.Id, group.DisplayName], StatusMessageTypes.Warning);
                }
            }

            AddStatusMessage(_localizer["CreateLabExecutionForSlotAsync:Success"], StatusMessageTypes.Success);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Create lab execution for slot");
            AddStatusMessage(_localizer["CreateLabExecutionForSlotAsync:UnknownError"], StatusMessageTypes.Error);
            return(await ShowCreateLabExecutionForSlotFormAsync(labExecutionData));
        }

        return(await RenderLabExecutionListAsync());
    }
    public async Task <IActionResult> CreateLabExecutionForGroupAsync(AdminLabExecution labExecutionData)
    {
        // Check input
        if (!ModelState.IsValid ||
            !await _labService.LabExistsAsync(labExecutionData.LabExecution.LabId, HttpContext.RequestAborted) ||
            !await _userService.GroupExistsAsync(labExecutionData.LabExecution.GroupId, HttpContext.RequestAborted) ||
            !(labExecutionData.LabExecution.PreStart < labExecutionData.LabExecution.Start &&
              labExecutionData.LabExecution.Start < labExecutionData.LabExecution.End))
        {
            AddStatusMessage(_localizer["CreateLabExecutionForGroupAsync:InvalidInput"], StatusMessageTypes.Error);
            return(await ShowCreateLabExecutionForGroupFormAsync(labExecutionData));
        }

        // Start lab for group
        try
        {
            var labExecution = new LabExecution
            {
                GroupId  = labExecutionData.LabExecution.GroupId,
                LabId    = labExecutionData.LabExecution.LabId,
                PreStart = labExecutionData.LabExecution.PreStart,
                Start    = labExecutionData.LabExecution.Start,
                End      = labExecutionData.LabExecution.End
            };
            await _labExecutionService.CreateLabExecutionAsync(labExecution, labExecutionData.OverrideExisting, HttpContext.RequestAborted);

            AddStatusMessage(_localizer["CreateLabExecutionForGroupAsync:Success"], StatusMessageTypes.Success);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Create lab execution for group");
            AddStatusMessage(_localizer["CreateLabExecutionForGroupAsync:UnknownError"], StatusMessageTypes.Error);
            return(await ShowCreateLabExecutionForGroupFormAsync(labExecutionData));
        }

        return(await RenderLabExecutionListAsync());
    }
    private async Task <IActionResult> ShowEditLabExecutionFormAsync(int?groupId, int?labId, AdminLabExecution labExecutionData = null)
    {
        // Retrieve by ID, if no object from a failed POST was passed
        if (groupId != null && labId != null)
        {
            labExecutionData = new AdminLabExecution
            {
                LabExecution = await _labExecutionService.GetLabExecutionAsync(groupId.Value, labId.Value, HttpContext.RequestAborted)
            };
            if (labExecutionData.LabExecution == null)
            {
                AddStatusMessage(_localizer["ShowEditLabExecutionFormAsync:NotFound"], StatusMessageTypes.Error);
                return(await RenderLabExecutionListAsync());
            }
        }

        if (labExecutionData?.LabExecution == null)
        {
            AddStatusMessage(_localizer["ShowEditLabExecutionFormAsync:MissingParameter"], StatusMessageTypes.Error);
            return(await RenderLabExecutionListAsync());
        }

        return(await RenderAsync(ViewType.Edit, labExecutionData));
    }