Example #1
0
        public static List<Tuple<Guid, string, List<Tuple<Guid, string>>>> GetDependingEntityAccess(string metaviewName, Guid[] ids, int deep = 1)
        {
            DynamicEntityRepository repo = new DynamicEntityRepository();
            EntityMetadata metadata = repo.GetEntityMetadataByEntityName(metaviewName);
            List<Guid> dependingEntityMetadataIds = MetadataRepositoty.GetDependingEntityIds(new TableDescription(metadata.SchemaName, metadata.TableName));
            Dictionary<Guid, EntityMetadata> dependingMetadata = dependingEntityMetadataIds.Select(id => new KeyValuePair<Guid, EntityMetadata>(id, repo.GetEntityMetadataByEntityId(id)))
                .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

            var dependingEntities = new List<Tuple<Guid, string, List<Tuple<Guid, string>>>>();

            foreach (var entityMetadata in dependingMetadata)
            {
                FilterCriteriaSet filters = FilterCriteriaSet.Empty;
                AttributeDescription entityCaptionAttribute = OptimaJet.BJet.CommonMethods.GetEntityCaptionAttribute(entityMetadata.Value);

                List<FilterCriteriaSet> filterSets = entityMetadata.Value.PlainAttributes.Where(a => a.IsReference && a.ReferencedSchemaName == metadata.SchemaName && a.ReferencedTableName == metadata.TableName)
                    .Select(a => FilterCriteriaSet.And.In(ids.ToList(), entityMetadata.Value.GetColumn(a))).ToList();

                filterSets.ForEach(f => filters = filters != FilterCriteriaSet.Empty ? filters.Merge(f) : f);

                var entities = repo.GetEntitiesByMetadata(entityMetadata.Value, filters).Entities;
                if (entities == null || entities.Count() == 0)
                    continue;

                var dependingEntity = new Tuple<Guid, string, List<Tuple<Guid, string>>>(
                    entityMetadata.Key,
                    entityMetadata.Value.TableName,
                    new List<Tuple<Guid, string>>(entities.Select(e =>
                        new Tuple<Guid, string>((Guid)e.Id, e.GetProperty(entityCaptionAttribute.PropertyName).ToString())
                        ).ToList()));
                dependingEntities.Add(dependingEntity);

                if (deep > 0)
                    dependingEntities.AddRange(GetDependingEntityAccess(dependingEntity.Item2, dependingEntity.Item3.Select(t => t.Item1).ToArray(), deep - 1));
            }
            return dependingEntities;
        }
Example #2
0
        private static void CopyEntityAccess(dynamic currentBudgetVersion, dynamic newBudgetVersion, Dictionary<object, object> replaceIds)
        {
            var repository = new DynamicEntityRepository();

            var entityAccess = DynamicRepository.GetByEntity("EntityAccess",
                FilterCriteriaSet.And.Equal((Guid) currentBudgetVersion.Id, "BudgetVersionId"));

            foreach (dynamic ea in entityAccess)
            {
                var oldId = ea.Id;
                ea.Id = Guid.NewGuid();
                ea.BudgetVersionId = newBudgetVersion.Id;
                replaceIds.Add(oldId, ea.Id);
                DynamicRepository.InsertByEntity("EntityAccess", new List<dynamic>() {ea});

                CopyEntityAccessChilds("EntityAccessOrganizationalStructure", replaceIds, oldId, ea.Id);
                CopyEntityAccessChilds("EntityAccessEmployee", replaceIds, oldId, ea.Id);
                Dictionary<Guid, dynamic> entityAccessItems = CopyEntityAccessChilds("EntityAccessItem", replaceIds, oldId,
                    ea.Id);
                if (entityAccessItems != null && entityAccessItems.Count > 0)
                {
                    foreach (KeyValuePair<Guid, dynamic> entityAccessItem in entityAccessItems)
                    {
                        List<dynamic> entityAccessItemEntities = DynamicRepository.GetByEntity("EntityAccessItemEntity",
                            FilterCriteriaSet.And.Equal(entityAccessItem.Key, "EntityAccessItemId"));
                        if (entityAccessItemEntities != null && entityAccessItemEntities.Count > 0)
                        {
                            foreach (dynamic entityAccessItemEntity in entityAccessItemEntities)
                            {
                                var old_id = entityAccessItemEntity.Id;
                                entityAccessItemEntity.Id = Guid.NewGuid();
                                entityAccessItemEntity.EntityAccessItemId = entityAccessItem.Value.Id;
                                object newEntityId = null;
                                if (replaceIds.TryGetValue(entityAccessItemEntity.EntityId, out newEntityId))
                                {
                                    EntityMetadata metadata =
                                        repository.GetEntityMetadataByEntityId(entityAccessItem.Value.MetadataEntityId);
                                    var captionProperty = CommonMethods.GetEntityCaptionAttribute(metadata).PropertyName;
                                    var entity = metadata.Get(FilterCriteriaSet.And.Equal(newEntityId,
                                        metadata.PrimaryKeyPropertyName)).FirstOrDefault() as DynamicEntity;
                                    entityAccessItemEntity.EntityId = newEntityId;
                                    if (entity != null)
                                        entityAccessItemEntity.AccessEntityCaption =
                                            entity.GetProperty(captionProperty).ToString();
                                }

                                replaceIds.Add(old_id, entityAccessItemEntity.Id);
                            }
                            DynamicRepository.InsertByEntity("EntityAccessItemEntity", entityAccessItemEntities);
                        }
                    }
                }
            }
        }
Example #3
0
        public static List <Tuple <Guid, string, List <Tuple <Guid, string> > > > GetDependingEntityAccess(string metaviewName, Guid[] ids, int deep = 1)
        {
            DynamicEntityRepository           repo     = new DynamicEntityRepository();
            EntityMetadata                    metadata = repo.GetEntityMetadataByEntityName(metaviewName);
            List <Guid>                       dependingEntityMetadataIds = MetadataRepositoty.GetDependingEntityIds(new TableDescription(metadata.SchemaName, metadata.TableName));
            Dictionary <Guid, EntityMetadata> dependingMetadata          = dependingEntityMetadataIds.Select(id => new KeyValuePair <Guid, EntityMetadata>(id, repo.GetEntityMetadataByEntityId(id)))
                                                                           .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

            var dependingEntities = new List <Tuple <Guid, string, List <Tuple <Guid, string> > > >();

            foreach (var entityMetadata in dependingMetadata)
            {
                FilterCriteriaSet    filters = FilterCriteriaSet.Empty;
                AttributeDescription entityCaptionAttribute = OptimaJet.BJet.CommonMethods.GetEntityCaptionAttribute(entityMetadata.Value);

                List <FilterCriteriaSet> filterSets = entityMetadata.Value.PlainAttributes.Where(a => a.IsReference && a.ReferencedSchemaName == metadata.SchemaName && a.ReferencedTableName == metadata.TableName)
                                                      .Select(a => FilterCriteriaSet.And.In(ids.ToList(), entityMetadata.Value.GetColumn(a))).ToList();

                filterSets.ForEach(f => filters = filters != FilterCriteriaSet.Empty ? filters.Merge(f) : f);

                var entities = repo.GetEntitiesByMetadata(entityMetadata.Value, filters).Entities;
                if (entities == null || entities.Count() == 0)
                {
                    continue;
                }

                var dependingEntity = new Tuple <Guid, string, List <Tuple <Guid, string> > >(
                    entityMetadata.Key,
                    entityMetadata.Value.TableName,
                    new List <Tuple <Guid, string> >(entities.Select(e =>
                                                                     new Tuple <Guid, string>((Guid)e.Id, e.GetProperty(entityCaptionAttribute.PropertyName).ToString())
                                                                     ).ToList()));
                dependingEntities.Add(dependingEntity);

                if (deep > 0)
                {
                    dependingEntities.AddRange(GetDependingEntityAccess(dependingEntity.Item2, dependingEntity.Item3.Select(t => t.Item1).ToArray(), deep - 1));
                }
            }
            return(dependingEntities);
        }