/// <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));
        }
Example #2
0
        private void RealPolicyInclusionSetter(PolicyPart part)
        {
            var settings = part.Settings.GetModel <PolicyPartSettings>();

            if (settings.IncludePendingPolicy != IncludePendingPolicyOptions.DependsOnContent)
            {
                part.IncludePendingPolicy = settings.IncludePendingPolicy;
            }
        }
Example #3
0
        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);
        }
Example #4
0
        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);
        }
Example #5
0
        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);
            }
        }
Example #6
0
        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());
        }