private static PaginatedSearchRequestDto BuildSearchDTO(AssociationUpdateRequest request, ApplicationAssociationDefinition association, AttributeHolder cruddata)
        {
            var searchRequest = new PaginatedSearchRequestDto(100, PaginatedSearchRequestDto.DefaultPaginationOptions);

            if (request.SearchDTO == null)
            {
                request.SearchDTO = PaginatedSearchRequestDto.DefaultInstance(null);
            }
            searchRequest.PageNumber = request.SearchDTO.PageNumber;
            searchRequest.PageSize   = request.SearchDTO.PageSize;
            //avoids pagination unless the association renderer defines so (lookup)
            searchRequest.ShouldPaginate   = association.IsPaginated();
            searchRequest.NeedsCountUpdate = association.IsPaginated();
            var valueSearchString = request.ValueSearchString;

            if (association.IsLazyLoaded() && !request.HasClientSearch())
            {
                if ((cruddata == null || cruddata.GetAttribute(association.Target) == null))
                {
                    //we should not update lazy dependant associations except in one case:
                    //there´s a default value in place already for the dependent association
                    // in that case, we would need to return a 1-value list to show on screen
                    return(null);
                }
                //this will force that the search would be made only on that specific value
                //ex: autocomplete server, lookups that depend upon another association
                valueSearchString = cruddata.GetAttribute(association.Target) as string;
            }

            if (request.AssociationKey != null)
            {
                // If association has a schema key defined, the searchDTO will be filled on client, so just copy it from request
                searchRequest.SearchParams = request.SearchDTO.SearchParams;
                searchRequest.SearchValues = request.SearchDTO.SearchValues;
            }
            else
            {
                if (!String.IsNullOrWhiteSpace(valueSearchString))
                {
                    searchRequest.AppendSearchParam(association.EntityAssociation.PrimaryAttribute().To);
                    searchRequest.AppendSearchValue("%" + valueSearchString + "%");
                }
                if (!String.IsNullOrWhiteSpace(request.LabelSearchString))
                {
                    AppendSearchLabelString(request, association, searchRequest);
                }
            }
            return(searchRequest);
        }
Example #2
0
        /// <summary>
        /// This is needed to fill the locations of an asset on the screen as soon as its selected
        /// </summary>
        /// <param name="application"></param>
        /// <param name="request"></param>
        /// <param name="currentData"></param>
        /// <returns></returns>
        protected override IDictionary <string, BaseAssociationUpdateResult> DoUpdateAssociation(ApplicationMetadata application, AssociationUpdateRequest request, AttributeHolder currentData)
        {
            var defaultResult = base.DoUpdateAssociation(application, request, currentData);

            if (!"asset".Equals(request.TriggerFieldName))
            {
                return(defaultResult);
            }
            var assetLocation = (string)currentData.GetAttribute("asset_.location");
            var userId        = (string)currentData.GetAttribute("asset_.aucisowner_.person_.personid");

            if (userId != null && (application.Schema.SchemaId.StartsWith("install") || application.Schema.SchemaId.Equals("update")))
            {
                var userIdRequest = new AssociationUpdateRequest {
                    ValueSearchString    = userId,
                    AssociationFieldName = "person_"
                };
                var userIdResult = base.DoUpdateAssociation(application, userIdRequest, currentData);
                defaultResult.Add("person_", userIdResult["person_"]);
            }

            string locationToUse;
            var    suffix   = "FromLocation";
            var    sections = application.Schema.GetDisplayable <ApplicationSection>(typeof(ApplicationSection));

            if (sections.Any(s => s.Id == "specifylocationfrom"))
            {
                locationToUse = (string)currentData.GetAttribute("fromlocation");
            }
            else if (sections.Any(s => s.Id == "specifylocationto"))
            {
                locationToUse = (string)currentData.GetAttribute("tolocation");
                suffix        = "ToLocation";
            }
            else
            {
                //no need to perform an extra query here
                return(defaultResult);
            }

            var extraAssociationOptions = GetLocationOptionsFromAssetLocation(locationToUse, assetLocation, suffix);

            foreach (var lookupAssociationUpdateResult in extraAssociationOptions)
            {
                defaultResult.Add(lookupAssociationUpdateResult);
            }
            return(defaultResult);
        }
        /// <summary>
        ///  this is used for both autocompleteserver or lookup to peform the search on the server based upon the labe string
        /// </summary>
        /// <param name="request"></param>
        /// <param name="association"></param>
        /// <param name="searchRequest"></param>
        private static void AppendSearchLabelString(AssociationUpdateRequest request,
                                                    ApplicationAssociationDefinition association, PaginatedSearchRequestDto searchRequest)
        {
            var sbParam = new StringBuilder("(");
            var sbValue = new StringBuilder();

            foreach (var labelField in association.LabelFields)
            {
                sbParam.Append(labelField).Append(SearchUtils.SearchParamOrSeparator);
                sbValue.Append("%" + request.LabelSearchString + "%").Append(SearchUtils.SearchValueSeparator);
            }

            sbParam.Remove(sbParam.Length - SearchUtils.SearchParamOrSeparator.Length, SearchUtils.SearchParamOrSeparator.Length);
            sbValue.Remove(sbValue.Length - SearchUtils.SearchValueSeparator.Length, SearchUtils.SearchValueSeparator.Length);
            sbParam.Append(")");
            searchRequest.AppendSearchEntry(sbParam.ToString(), sbValue.ToString());
        }
        public async Task <IActionResult> UpdateAssociation([EntityId] AssociationUpdateRequest request)
        {
            //Recupero l'elemento dal business layer
            var entity = BasicLayer.GetAssociation(request.AssociationId);

            //modifica solo se admin o se utente richiedente è lo stesso che ha creato
            if (entity == null)
            {
                return(NotFound());
            }

            //Aggiornamento dell'entità
            entity.Name            = request.Name;
            entity.Classifications = request.Classifications;
            entity.Categories      = request.Categories;
            entity.Divisions       = request.Divisions;

            entity.FirstPenaltyLabel         = request.FirstPenaltyLabel;
            entity.HitOnNonThreatPointDown   = request.HitOnNonThreatPointDown;
            entity.FirstProceduralPointDown  = request.FirstProceduralPointDown;
            entity.SecondPenaltyLabel        = request.SecondPenaltyLabel;
            entity.SecondProceduralPointDown = request.SecondProceduralPointDown;
            entity.ThirdPenaltyLabel         = request.ThirdPenaltyLabel;
            entity.ThirdProceduralPointDown  = request.ThirdProceduralPointDown;
            entity.SoRoles = request.SoRoles;

            //Salvataggio
            var validations = await BasicLayer.UpdateAssociation(entity, PlatformUtils.GetIdentityUserId(User));

            if (validations.Count > 0)
            {
                return(BadRequest(validations));
            }

            //Confermo
            return(Ok(ContractUtils.GenerateContract(entity)));
        }
Example #5
0
        public GenericResponseResult <IDictionary <string, BaseAssociationUpdateResult> > UpdateAssociation(string application,
                                                                                                            [FromUri] AssociationUpdateRequest request, JObject currentData)
        {
            var user = SecurityFacade.CurrentUser();

            if (null == user)
            {
                throw new HttpResponseException(HttpStatusCode.Unauthorized);
            }
            ContextLookuper.FillContext(request.Key);
            var applicationMetadata = MetadataProvider
                                      .Application(application)
                                      .ApplyPolicies(request.Key, user, ClientPlatform.Web);

            var baseDataSet = DataSetProvider.LookupAsBaseDataSet(application);


            var response = baseDataSet.UpdateAssociations(applicationMetadata, request, currentData);

            return(response);
        }
        protected virtual IDictionary <string, BaseAssociationUpdateResult> DoUpdateAssociation(ApplicationMetadata application, AssociationUpdateRequest request,
                                                                                                AttributeHolder cruddata)
        {
            var before = LoggingUtil.StartMeasuring(Log, "starting update association options fetching for application {0} schema {1}", application.Name, application.Schema.Name);
            IDictionary <string, BaseAssociationUpdateResult> resultObject =
                new Dictionary <string, BaseAssociationUpdateResult>();
            ISet <string> associationsToUpdate = null;

            // Check if 'self' (for lazy load) or 'dependant' (for dependant combos) association update
            if (!String.IsNullOrWhiteSpace(request.AssociationFieldName))
            {
                associationsToUpdate = new HashSet <String> {
                    request.AssociationFieldName
                };
            }
            else if (!String.IsNullOrWhiteSpace(request.TriggerFieldName))
            {
                var triggerFieldName = request.TriggerFieldName;
                if (!application.Schema.DependantFields.TryGetValue(triggerFieldName, out associationsToUpdate))
                {
                    throw new InvalidOperationException();
                }
            }

            if (associationsToUpdate == null)
            {
                return(resultObject);
            }

            var tasks = new List <Task>();
            var ctx   = ContextLookuper.LookupContext();

            //there might be some associations/optionfields to be updated after the first value is selected
            foreach (var associationToUpdate in associationsToUpdate)
            {
                var association = application.Schema.Associations.FirstOrDefault(f => (
                                                                                     EntityUtil.IsRelationshipNameEquals(f.AssociationKey, associationToUpdate)));
                if (association == null)
                {
                    var optionField = application.Schema.OptionFields.First(f => f.AssociationKey == associationToUpdate);
                    tasks.Add(Task.Factory.NewThread(c => {
                        Quartz.Util.LogicalThreadContext.SetData("context", c);
                        var data = _dynamicOptionFieldResolver.ResolveOptions(application, optionField, cruddata);
                        resultObject.Add(optionField.AssociationKey, new LookupAssociationUpdateResult(data, 100, PaginatedSearchRequestDto.DefaultPaginationOptions));
                    }, ctx));
                }
                else
                {
                    var associationApplicationMetadata =
                        ApplicationAssociationResolver.GetAssociationApplicationMetadata(association);

                    var searchRequest = BuildSearchDTO(request, association, cruddata);

                    if (searchRequest == null)
                    {
                        //this would only happen if association is lazy and there´s no default value
                        //(cause we´d need to fetch one-value list for displaying)
                        continue;
                    }
                    var threadSafeContext = new ContextHolderWithSearchDto(ctx, searchRequest);
                    tasks.Add(Task.Factory.NewThread(c => {
                        Quartz.Util.LogicalThreadContext.SetData("context", threadSafeContext.Context);
                        var options = _associationOptionResolver.ResolveOptions(application, cruddata, association,
                                                                                threadSafeContext.Dto);

                        resultObject.Add(association.AssociationKey,
                                         new LookupAssociationUpdateResult(searchRequest.TotalCount, searchRequest.PageNumber,
                                                                           searchRequest.PageSize, options, associationApplicationMetadata, PaginatedSearchRequestDto.DefaultPaginationOptions));
                    }, threadSafeContext));
                }
            }

            Task.WaitAll(tasks.ToArray());

            if (Log.IsDebugEnabled)
            {
                var keys = String.Join(",", resultObject.Keys.Where(k => resultObject[k].AssociationData != null));
                Log.Debug(LoggingUtil.BaseDurationMessageFormat(before,
                                                                "Finished execution of options fetching. Resolved collections: {0}", keys));
            }
            return(resultObject);
        }
        public GenericResponseResult <IDictionary <string, BaseAssociationUpdateResult> > UpdateAssociations(ApplicationMetadata application,
                                                                                                             AssociationUpdateRequest request, JObject currentData)
        {
            var entityMetadata = MetadataProvider.Entity(application.Entity);
            var cruddata       = EntityBuilder.BuildFromJson <CrudOperationData>(typeof(CrudOperationData), entityMetadata,
                                                                                 application, currentData, request.Id);

            if (EagerAssociationTrigger.Equals(request.TriggerFieldName))
            {
                request.AssociationsToFetch = AssociationHelper.AllButSchema;
                return(new GenericResponseResult <IDictionary <string, BaseAssociationUpdateResult> >(BuildAssociationOptions(cruddata, application, request)));
            }
            return(new GenericResponseResult <IDictionary <string, BaseAssociationUpdateResult> >(DoUpdateAssociation(application, request, cruddata)));
        }