/// <summary> /// Get pending policies: policies for which the user has not yet expressed his opinion /// </summary> /// <param name="context">Context of the showing content</param> /// <param name="part">the PolicyPart that describe which policies should be checked</param> /// <returns>The IContentQuery that returns the list of the pending policies</returns> private IContentQuery GetPendingPolicies(LoadContentContext context, PolicyPart part) { var loggedUser = _workContext.GetContext().CurrentUser; int currentLanguageId; IContentQuery <PolicyTextInfoPart> query; if (context.ContentItem.As <LocalizationPart>() != null && context.ContentItem.As <LocalizationPart>().Culture != null && context.ContentItem.As <LocalizationPart>().Culture.Id > 0) { currentLanguageId = context.ContentItem.As <LocalizationPart>().Culture.Id; } else { //Nel caso di contenuto senza Localizationpart prendo la CurrentCulture currentLanguageId = _cultureManager.GetCultureByName(_workContext.GetContext().CurrentCulture).Id; } query = _contentManager.Query <PolicyTextInfoPart>().Join <LocalizationPartRecord>().Where(w => w.CultureId == currentLanguageId || w.CultureId == 0); //recupero solo le Policy Pendenti, alle quali l'utente non ha risposto ancora IContentQuery <PolicyTextInfoPart, PolicyTextInfoPartRecord> items; if (loggedUser != null) { var answeredIds = loggedUser.As <UserPolicyPart>().UserPolicyAnswers.Select(s => s.PolicyTextInfoPartRecord.Id).ToArray(); items = query.Where <PolicyTextInfoPartRecord>(w => !answeredIds.Contains(w.Id)); } else { IList <PolicyForUserViewModel> answers = _policyServices.GetCookieOrVolatileAnswers(); var answeredIds = answers.Select(s => s.PolicyTextId).ToArray(); items = query.Where <PolicyTextInfoPartRecord>(w => !answeredIds.Contains(w.Id)); } var settings = part.Settings.GetModel <PolicyPartSettings>(); if (!settings.PolicyTextReferences.Contains("{All}")) { int[] filterIds; string[] filterComplexIds = _policyServices.GetPoliciesForContent(part); if (filterComplexIds != null) { if (filterComplexIds.Length == 1) { filterComplexIds = filterComplexIds[0].Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); } filterIds = filterComplexIds.Select(s => { int id = 0; int.TryParse(s.Replace("{", "").Replace("}", ""), out id); return(id); }).ToArray(); items = items.Where <PolicyTextInfoPartRecord>(w => filterIds.Contains(w.Id)); } } return(items.OrderByDescending(x => x.Priority)); }
private void RealPolicyInclusionSetter(PolicyPart part) { var settings = part.Settings.GetModel <PolicyPartSettings>(); if (settings.IncludePendingPolicy != IncludePendingPolicyOptions.DependsOnContent) { part.IncludePendingPolicy = settings.IncludePendingPolicy; } }
public IEnumerable <int> GetPendingPolicyIds(PolicyPart part) { RealPolicyInclusionSetter(part); if (!IsPolicyIncluded(part)) { return(null); } var loggedUser = _workContext.GetContext().CurrentUser; // get the name of a culture to pass to find policies string cultureName = null; if (part.As <LocalizationPart>() != null && part.As <LocalizationPart>().Culture != null && part.As <LocalizationPart>().Culture.Id > 0) { cultureName = part.As <LocalizationPart>().Culture.Culture; } else { //Nel caso di contenuto senza Localizationpart prendo la CurrentCulture cultureName = _workContext.GetContext().CurrentCulture; } var policyIds = GetPolicyIds(cultureName); // figure out which policies the user has not answered var answeredIds = loggedUser != null ? loggedUser .As <UserPolicyPart>().UserPolicyAnswers.Select(s => s.PolicyTextInfoPartRecord.Id) : GetCookieOrVolatileAnswers() .Select(s => s.PolicyTextId); var items = policyIds.Where(p => !answeredIds.Contains(p)); var settings = part.Settings.GetModel <PolicyPartSettings>(); if (!settings.PolicyTextReferences.Contains("{All}")) { string[] filterComplexIds = GetPoliciesForContent(part); if (filterComplexIds != null) { if (filterComplexIds.Length == 1) { filterComplexIds = filterComplexIds[0] .Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); } var filterIds = filterComplexIds.Select(s => { int id = 0; int.TryParse(s.Replace("{", "").Replace("}", ""), out id); return(id); }).ToArray(); items = items.Where(p => filterIds.Contains(p)); } } return(items); }
private bool IsPolicyIncluded(PolicyPart part) { var settings = part.Settings.GetModel <PolicyPartSettings>(); if (settings.IncludePendingPolicy == IncludePendingPolicyOptions.Yes) { return(true); } else if (settings.IncludePendingPolicy == IncludePendingPolicyOptions.DependsOnContent && part.IncludePendingPolicy == IncludePendingPolicyOptions.Yes) { return(true); } return(false); }
public string[] GetPoliciesForContent(PolicyPart part) { var settings = part.Settings.GetModel <PolicyPartSettings>(); if (settings.PolicyTextReferences != null && !settings.PolicyTextReferences.Contains("{DependsOnContent}")) { return(settings.PolicyTextReferences); } else if (part.PolicyTextReferences != null && !part.PolicyTextReferences.Contains("{All}")) { return(part.PolicyTextReferences); } else { return(null); } }
public IList <UserPolicyAnswerWithContent> BuildEditorForPolicies(PolicyPart policyPart) { var associatedPolicies = _policyServices.GetPoliciesForContent(policyPart); //Reading policies Ids for that content. Ids are in strings i.e. "{12}" if (associatedPolicies.Count() == 0) { return(new List <UserPolicyAnswerWithContent>()); } var contentPolicies = _policyServices.GetPolicies(null, associatedPolicies.Select(x => Convert.ToInt32(x.Substring(1, x.Length - 2) /*Strips {} chars*/)).ToArray()); return(contentPolicies.Select(x => new UserPolicyAnswerWithContent { PolicyAnswer = false, PolicyId = x.Id, UserHaveToAccept = x.UserHaveToAccept, PolicyText = x.ContentItem, Policy = new PolicyTextViewModel { Type = x.PolicyType, Title = x.As <TitlePart>()?.Title, Body = x.As <BodyPart>()?.Text } }).ToList()); }