protected override DriverResult Editor(AuditTrailSettingsPart part, IUpdateModel updater, dynamic shapeHelper) { if (!_authorizer.Authorize(Permissions.ManageAuditTrailSettings)) { return(null); } return(ContentShape("Parts_AuditTrailSettings_Edit", () => { var descriptors = _auditTrailManager.DescribeCategories(); var eventSettings = part.EventSettings.ToList(); var categoriesQuery = from categoryDescriptor in descriptors let eventsQuery = from eventDescriptor in categoryDescriptor.Events let eventSetting = GetOrCreate(eventSettings, eventDescriptor) select new AuditTrailEventSettingsViewModel { Event = eventDescriptor.Event, Name = eventDescriptor.Name, Description = eventDescriptor.Description, IsEnabled = eventDescriptor.IsMandatory || eventSetting.IsEnabled, IsMandatory = eventDescriptor.IsMandatory } select new AuditTrailCategorySettingsViewModel { Category = categoryDescriptor.Category, Name = categoryDescriptor.Name, Events = eventsQuery.ToList() }; var viewModel = new AuditTrailSettingsViewModel { Categories = categoriesQuery.ToList(), EnableClientIpAddressLogging = part.EnableClientIpAddressLogging }; // Update the settings as we may have added new settings. part.EventSettings = eventSettings; if (updater != null) { var eventsDictionary = _auditTrailManager.DescribeProviders().Describe().SelectMany(x => x.Events).ToDictionary(x => x.Event); if (updater.TryUpdateModel(viewModel, Prefix, null, null)) { foreach (var eventSettingViewModel in viewModel.Categories.SelectMany(x => x.Events)) { var eventSetting = eventSettings.First(x => x.EventName == eventSettingViewModel.Event); var descriptor = eventsDictionary[eventSetting.EventName]; eventSetting.IsEnabled = eventSettingViewModel.IsEnabled || descriptor.IsMandatory; } part.EventSettings = eventSettings; part.EnableClientIpAddressLogging = viewModel.EnableClientIpAddressLogging; } } return shapeHelper.EditorTemplate(TemplateName: "Parts.AuditTrailSettings", Model: viewModel, Prefix: Prefix); }).OnGroup("Audit Trail")); }
public async Task <ActionResult> Index(PagerParameters pagerParameters, AuditTrailOrderBy?orderBy = null) { if (!await _authorizationService.AuthorizeAsync(User, AuditTrailPermissions.ViewAuditTrail)) { return(Forbid()); } var siteSettings = await _siteService.GetSiteSettingsAsync(); var pager = new Pager(pagerParameters, siteSettings.PageSize); var filters = Filters.From(QueryHelpers.ParseQuery(Request.QueryString.Value), _updateModelAccessor.ModelUpdater); var searchResult = await _auditTrailManager.GetAuditTrailEventsAsync(pager.Page, pager.PageSize, filters, orderBy ?? AuditTrailOrderBy.DateDescending); if (!_updateModelAccessor.ModelUpdater.ModelState.IsValid) { searchResult.AuditTrailEvents = Enumerable.Empty <AuditTrailEvent>(); } var pagerShape = (await _shapeFactory.New.Pager(pager)).TotalItemCount(searchResult.TotalCount); var eventDescriptors = _auditTrailManager.DescribeCategories() .SelectMany(categoryDescriptor => categoryDescriptor.Events) .ToDictionary(eventDescriptor => eventDescriptor.FullEventName); var auditTrailEventsSummaryViewModel = searchResult.AuditTrailEvents.Select(auditTrailEvent => { var eventDescriptor = eventDescriptors.ContainsKey(auditTrailEvent.FullEventName) ? eventDescriptors[auditTrailEvent.FullEventName] : AuditTrailEventDescriptor.Basic(auditTrailEvent); return(new AuditTrailEventSummaryViewModel { AuditTrailEvent = auditTrailEvent, EventDescriptor = eventDescriptor, CategoryDescriptor = eventDescriptor.CategoryDescriptor, AdditionalColumnsShapes = _auditTrailEventDisplayManager.BuildAdditionalColumnsShapesAsync(auditTrailEvent), SummaryShape = _auditTrailEventDisplayManager.BuildDisplayAsync(auditTrailEvent, "SummaryAdmin"), ActionsShape = _auditTrailEventDisplayManager.BuildActionsAsync(auditTrailEvent, "SummaryAdmin") }); }); return(View(new AuditTrailViewModel { AuditTrailEvents = auditTrailEventsSummaryViewModel, AdditionalColumnNames = await _auditTrailEventDisplayManager.BuildAdditionalColumnNamesShapesAsync(), Pager = pagerShape, OrderBy = orderBy ?? AuditTrailOrderBy.DateDescending, FilterDisplay = await _auditTrailEventDisplayManager.BuildFilterDisplayAsync(filters) })); }
public override async Task <IDisplayResult> EditAsync(AuditTrailSettings settings, BuildEditorContext context) => !await IsAuthorizedToManageAuditTrailSettingsAsync() ? null : Initialize <AuditTrailSettingsViewModel>($"{nameof(AuditTrailSettings)}_Edit", model => { var descriptors = _auditTrailManager.DescribeCategories(); var eventSettings = settings.EventSettings; var categories = descriptors.GroupBy(categoryDescriptor => categoryDescriptor.Category) .Select(categoryDescriptor => new { Category = categoryDescriptor.Key, Name = categoryDescriptor.Select(categoryDescriptor => categoryDescriptor.LocalizedName), Events = categoryDescriptor.SelectMany(categoryDescriptor => categoryDescriptor.Events) }) .Select(categoryDescriptor => new AuditTrailCategorySettingsViewModel { Category = categoryDescriptor.Category, Name = categoryDescriptor.Name.First(), Events = categoryDescriptor.Events.Select(eventDescriptor => { var eventSetting = GetOrCreate(eventSettings.ToList(), eventDescriptor); return(new AuditTrailEventSettingsViewModel { Event = eventDescriptor.FullEventName, Name = eventDescriptor.LocalizedName, Description = eventDescriptor.Description, IsEnabled = eventDescriptor.IsMandatory || eventSetting.IsEnabled, IsMandatory = eventDescriptor.IsMandatory }); }).ToList() }).ToList(); model.Categories = categories; model.EnableClientIpAddressLogging = settings.EnableClientIpAddressLogging; model.BlacklistedContentTypes = _contentDefitinionManager.ListTypeDefinitions() .Select(contentTypeDefiniton => new BlacklistedContentTypesViewModel { Name = contentTypeDefiniton.Name, DisplayName = contentTypeDefiniton.DisplayName, Selected = settings.BlacklistedContentTypeNames.Contains(contentTypeDefiniton.Name) }).OrderBy(contentTypeDefinition => contentTypeDefinition.DisplayName).ToList(); }).Location("Content:1").OnGroup(AuditTrailSettingsGroupId);
public override async Task <IDisplayResult> EditAsync(AuditTrailSettings settings, BuildEditorContext context) { if (!await _authorizationService.AuthorizeAsync(_httpContextAccessor.HttpContext?.User, AuditTrailPermissions.ManageAuditTrailSettings)) { return(null); } return(Initialize <AuditTrailSettingsViewModel>("AuditTrailSettings_Edit", model => { var categories = _auditTrailManager.DescribeCategories(); var settingsGroups = settings.Categories .ToLookup(category => category.Events .FirstOrDefault()?.Category ?? ""); var categoriesViewModel = categories .Select(category => new AuditTrailCategorySettingsViewModel() { Name = category.Name, LocalizedName = category.LocalizedName(_serviceProvider), Events = category.Events.Values .Select(auditTrailEvent => { var settings = settingsGroups[auditTrailEvent.Category] .FirstOrDefault()?.Events .FirstOrDefault(settings => settings.Name == auditTrailEvent.Name); return new AuditTrailEventSettingsViewModel() { Name = auditTrailEvent.Name, Category = auditTrailEvent.Category, LocalizedName = auditTrailEvent.LocalizedName(_serviceProvider), Description = auditTrailEvent.Description(_serviceProvider), IsEnabled = auditTrailEvent.IsMandatory || (settings?.IsEnabled ?? auditTrailEvent.IsEnabledByDefault), IsMandatory = auditTrailEvent.IsMandatory }; }) .ToArray() }) .ToArray(); model.Categories = categoriesViewModel; model.ClientIpAddressAllowed = settings.ClientIpAddressAllowed; }).Location("Content:1#Events").OnGroup(AuditTrailSettingsGroup.Id)); }
public ActionResult Index(PagerParameters pagerParameters, AuditTrailOrderBy?orderBy = null) { if (!_authorizer.Authorize(Permissions.ViewAuditTrail)) { return(new HttpUnauthorizedResult()); } var pager = new Pager(_services.WorkContext.CurrentSite, pagerParameters); var filters = Filters.From(Request.QueryString, this); var pageOfData = _auditTrailManager.GetRecords(pager.Page, pager.PageSize, filters, orderBy ?? AuditTrailOrderBy.DateDescending); // If there's a filter validation error, clear the results. if (!ModelState.IsValid) { pageOfData = new PageOfItems <AuditTrailEventRecord>(Enumerable.Empty <AuditTrailEventRecord>()); } var pagerShape = New.Pager(pager).TotalItemCount(pageOfData.TotalItemCount); var filterDisplay = _auditTrailManager.BuildFilterDisplay(filters); var eventDescriptorsQuery = from c in _auditTrailManager.DescribeCategories() from e in c.Events select e; var eventDescriptors = eventDescriptorsQuery.ToDictionary(x => x.Event); var recordViewModelsQuery = from record in pageOfData let descriptor = eventDescriptors.ContainsKey(record.FullEventName) ? eventDescriptors[record.FullEventName] : AuditTrailEventDescriptor.Basic(record) select new AuditTrailEventSummaryViewModel { Record = record, EventDescriptor = descriptor, CategoryDescriptor = descriptor.CategoryDescriptor, SummaryShape = _displayBuilder.BuildDisplay(record, "SummaryAdmin"), ActionsShape = _displayBuilder.BuildActions(record, "SummaryAdmin"), }; var viewModel = new AuditTrailViewModel { Records = recordViewModelsQuery.ToArray(), Pager = pagerShape, OrderBy = orderBy ?? AuditTrailOrderBy.DateDescending, FilterDisplay = filterDisplay }; return(View(viewModel)); }
public async Task <AuditTrailEventQueryResult> QueryAsync(int page, int pageSize, AuditTrailIndexOptions options) { // Because admin filters can add a different index to the query this must be added as a Query<AuditTrailEvent>() var query = _session.Query <AuditTrailEvent>(collection: AuditTrailEvent.Collection); query = await options.FilterResult.ExecuteAsync(new AuditTrailQueryContext(_serviceProvider, query)); var totalCount = await query.CountAsync(); if (pageSize > 0) { if (page > 1) { query = query.Skip((page - 1) * pageSize); } query = query.Take(pageSize); } var events = await query.ListAsync(); var result = new AuditTrailEventQueryResult { Events = events, TotalCount = totalCount }; options.AuditTrailSorts = _adminListOptions.SortOptions.Values.Where(x => x.SelectListItem != null).Select(opt => opt.SelectListItem(_serviceProvider, opt, options)).ToList(); var categories = _auditTrailManager.DescribeCategories(); options.Categories = categories .Select(category => new SelectListItem(category.LocalizedName(_serviceProvider), category.Name, category.Name == options.Category)) .ToList(); options.Categories.Insert(0, new SelectListItem(S["All categories"], String.Empty, String.IsNullOrEmpty(options.Category))); if (options.CorrelationIdFromRoute) { var firstEvent = result.Events.FirstOrDefault(); if (firstEvent != null) { var currentCategory = categories.FirstOrDefault(x => x.Name == firstEvent.Category); if (currentCategory != null) { options.Events = currentCategory.Events.Values.Select(category => new SelectListItem(category.LocalizedName(_serviceProvider), category.Name, category.Name == options.Category)).ToList(); } } } var localNow = await _localClock.LocalNowAsync; var startOfWeek = CultureInfo.CurrentUICulture.DateTimeFormat.FirstDayOfWeek; options.AuditTrailDates = new List <SelectListItem>() { new SelectListItem(S["Any date"], String.Empty, options.Date == String.Empty), }; var dateTimeValue = ">@now-1"; options.AuditTrailDates.Add(new SelectListItem(S["Last 24 hours"], dateTimeValue, options.Date == dateTimeValue)); dateTimeValue = "@now-2..@now-1"; options.AuditTrailDates.Add(new SelectListItem(S["Previous 48 hours"], dateTimeValue, options.Date == dateTimeValue)); dateTimeValue = $">{localNow.StartOfWeek(CultureInfo.CurrentUICulture.DateTimeFormat.FirstDayOfWeek).LocalDateTime.ToString(DateFormat)}"; options.AuditTrailDates.Add(new SelectListItem(S["This week"], dateTimeValue, options.Date == dateTimeValue)); var start = localNow.StartOfWeek(CultureInfo.CurrentUICulture.DateTimeFormat.FirstDayOfWeek).AddDays(-7).LocalDateTime; var end = start.AddDays(7); dateTimeValue = $"{start.ToString(DateFormat)}..{end.ToString(DateFormat)}"; options.AuditTrailDates.Add(new SelectListItem(S["Last week"], dateTimeValue, options.Date == dateTimeValue)); start = new DateTime(localNow.LocalDateTime.Year, localNow.LocalDateTime.Month, 1); dateTimeValue = $">{start.ToString(DateFormat)}"; options.AuditTrailDates.Add(new SelectListItem(S["This month"], dateTimeValue, options.Date == dateTimeValue)); start = new DateTime(localNow.LocalDateTime.Year, localNow.LocalDateTime.Month, 1).AddMonths(-1); end = start.AddMonths(1); dateTimeValue = $"{start.ToString(DateFormat)}..{end.ToString(DateFormat)}"; options.AuditTrailDates.Add(new SelectListItem(S["Last month"], dateTimeValue, options.Date == dateTimeValue)); options.AuditTrailDates.Add(new SelectListItem(S["Custom date range"], dateTimeValue, options.Date == dateTimeValue)); dateTimeValue = $">{localNow.AddHours(-1).ToString("o")}"; options.AuditTrailDates.Add(new SelectListItem(S["Last hour"], dateTimeValue, options.Date == dateTimeValue)); dateTimeValue = $"{localNow.AddHours(-2).ToString("o")}..{localNow.AddHours(-1).ToString("o")}"; options.AuditTrailDates.Add(new SelectListItem(S["Previous hour"], dateTimeValue, options.Date == dateTimeValue)); options.AuditTrailDates.Add(new SelectListItem(S["Custom time range"], dateTimeValue, options.Date == dateTimeValue)); return(result); }
protected override DriverResult Editor(AuditTrailPart part, IUpdateModel updater, dynamic shapeHelper) { var settings = part.Settings.GetModel <AuditTrailPartSettings>(); var results = new List <DriverResult>(); if (settings.ShowAuditTrailCommentInput) { results.Add(ContentShape("Parts_AuditTrail_Comment", () => { var viewModel = new AuditTrailCommentViewModel(); if (part.ShowComment) { viewModel.Comment = part.Comment; } if (updater != null) { if (updater.TryUpdateModel(viewModel, Prefix, null, null)) { part.Comment = viewModel.Comment; } } return(shapeHelper.EditorTemplate(Model: viewModel, TemplateName: "Parts.AuditTrail.Comment", Prefix: Prefix)); })); } if (_services.Authorizer.Authorize(Permissions.ViewAuditTrail)) { if (settings.ShowAuditTrailLink) { results.Add(ContentShape("Parts_AuditTrail_Link", () => shapeHelper.Parts_AuditTrail_Link())); } if (settings.ShowAuditTrail) { results.Add(ContentShape("Parts_AuditTrail", () => { var pager = new Pager(_services.WorkContext.CurrentSite, null, null); var pageOfData = _auditTrailManager.GetRecords(pager.Page, pager.PageSize, ContentAuditTrailEventProvider.CreateFilters(part.Id, updater)); var pagerShape = shapeHelper.Pager(pager).TotalItemCount(pageOfData.TotalItemCount); var eventDescriptorsQuery = from c in _auditTrailManager.DescribeCategories() from e in c.Events select e; var eventDescriptors = eventDescriptorsQuery.ToArray(); var recordViewModelsQuery = from record in pageOfData let descriptor = eventDescriptors.FirstOrDefault(x => x.Event == record.FullEventName) where descriptor != null select new AuditTrailEventSummaryViewModel { Record = record, EventDescriptor = descriptor, CategoryDescriptor = descriptor.CategoryDescriptor, SummaryShape = _displayBuilder.BuildDisplay(record, "SummaryAdmin"), ActionsShape = _displayBuilder.BuildActions(record, "SummaryAdmin") }; var recordViewModels = recordViewModelsQuery.ToArray(); return(shapeHelper.Parts_AuditTrail(Records: recordViewModels, Pager: pagerShape)); })); } } return(Combined(results.ToArray())); }