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); }
/// <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))); }
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))); }