Esempio n. 1
0
        public ActionResult Create(ImportProfileModel model)
        {
            if (PathHelper.HasInvalidFileNameChars(model.TempFileName))
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest, "Invalid file name."));
            }

            var importFile = Path.Combine(FileSystemHelper.TempDirTenant(), model.TempFileName.EmptyNull());

            if (System.IO.File.Exists(importFile))
            {
                var profile = _importProfileService.InsertImportProfile(model.TempFileName, model.Name, model.EntityType);

                if (profile != null && profile.Id != 0)
                {
                    var importFileDestination = Path.Combine(profile.GetImportFolder(true, true), model.TempFileName);

                    FileSystemHelper.CopyFile(importFile, importFileDestination, true, true);

                    return(RedirectToAction("Edit", new { id = profile.Id }));
                }
            }
            else
            {
                NotifyError(T("Admin.DataExchange.Import.MissingImportFile"));
            }

            return(RedirectToAction("List"));
        }
Esempio n. 2
0
        public ActionResult Create(ImportProfileModel model)
        {
            if (!Services.Permissions.Authorize(StandardPermissionProvider.ManageImports))
            {
                return(AccessDeniedView());
            }

            var importFile = Path.Combine(FileSystemHelper.TempDir(), model.TempFileName.EmptyNull());

            if (System.IO.File.Exists(importFile))
            {
                var profile = _importProfileService.InsertImportProfile(model.TempFileName, model.Name, model.EntityType);

                if (profile != null && profile.Id != 0)
                {
                    var importFileDestination = Path.Combine(profile.GetImportFolder(true, true), model.TempFileName);

                    FileSystemHelper.Copy(importFile, importFileDestination, true, true);

                    return(RedirectToAction("Edit", new { id = profile.Id }));
                }
            }
            else
            {
                NotifyError(T("Admin.DataExchange.Import.MissingImportFile"));
            }

            return(RedirectToAction("List"));
        }
        public ActionResult Create(ImportProfileModel model)
        {
            if (!Services.Permissions.Authorize(StandardPermissionProvider.ManageImports))
                return AccessDeniedView();

            var importFile = Path.Combine(FileSystemHelper.TempDir(), model.TempFileName.EmptyNull());

            if (System.IO.File.Exists(importFile))
            {
                var profile = _importProfileService.InsertImportProfile(model.TempFileName, model.Name, model.EntityType);

                if (profile != null && profile.Id != 0)
                {
                    var importFileDestination = Path.Combine(profile.GetImportFolder(true, true), model.TempFileName);

                    FileSystemHelper.Copy(importFile, importFileDestination, true, true);

                    return RedirectToAction("Edit", new { id = profile.Id });
                }
            }
            else
            {
                NotifyError(T("Admin.DataExchange.Import.MissingImportFile"));
            }

            return RedirectToAction("List");
        }
Esempio n. 4
0
        public ActionResult List()
        {
            var model = new ImportProfileListModel
            {
                Profiles             = new List <ImportProfileModel>(),
                AvailableEntityTypes = ImportEntityType.Product.ToSelectList(false).ToList()
            };

            var lastHistoryEntries = _scheduleTaskService.GetHistoryEntries(0, int.MaxValue, 0, true, true).ToDictionarySafe(x => x.ScheduleTaskId);
            var profiles           = _importProfileService.GetImportProfiles().ToList();

            foreach (var profile in profiles)
            {
                var profileModel = new ImportProfileModel();
                lastHistoryEntries.TryGetValue(profile.SchedulingTaskId, out var lastHistoryEntry);

                PrepareProfileModel(profileModel, profile, lastHistoryEntry, false);

                profileModel.TaskModel = _adminModelHelper.CreateScheduleTaskModel(profile.ScheduleTask, lastHistoryEntry) ?? new ScheduleTaskModel();

                model.Profiles.Add(profileModel);
            }

            return(View(model));
        }
Esempio n. 5
0
        public async Task <IActionResult> List()
        {
            var model = new ImportProfileListModel();

            var lastExecutionInfos = (await _taskStore.GetExecutionInfoQuery(false)
                                      .ApplyCurrentMachineNameFilter()
                                      .ApplyTaskFilter(0, true)
                                      .ToListAsync())
                                     .ToDictionarySafe(x => x.TaskDescriptorId);

            var profiles = await _db.ImportProfiles
                           .Include(x => x.Task)
                           .AsNoTracking()
                           .OrderBy(x => x.EntityTypeId)
                           .ThenBy(x => x.Name)
                           .ToListAsync();

            foreach (var profile in profiles)
            {
                var profileModel = new ImportProfileModel();

                lastExecutionInfos.TryGetValue(profile.TaskId, out var lastExecutionInfo);
                await PrepareProfileModel(profileModel, profile, lastExecutionInfo, false);

                profileModel.TaskModel = await profile.Task.MapAsync(lastExecutionInfo);

                model.Profiles.Add(profileModel);
            }

            return(View(model));
        }
Esempio n. 6
0
        public async Task <IActionResult> Edit(ImportProfileModel model, bool continueEditing, IFormCollection form)
        {
            var profile = await _db.ImportProfiles
                          .Include(x => x.Task)
                          .FindByIdAsync(model.Id);

            if (profile == null)
            {
                return(NotFound());
            }

            var map           = new ColumnMap();
            var hasErrors     = false;
            var resetMappings = false;

            try
            {
                var propertyKeyPrefix = "ColumnMapping.Property.";
                var allPropertyKeys   = form.Keys.Where(x => x.HasValue() && x.StartsWith(propertyKeyPrefix));

                if (allPropertyKeys.Any())
                {
                    var entityProperties = _importProfileService.GetEntityPropertiesLabels(profile.EntityType);

                    foreach (var key in allPropertyKeys)
                    {
                        var index        = key[propertyKeyPrefix.Length..];
Esempio n. 7
0
        public ActionResult List()
        {
            if (!Services.Permissions.Authorize(StandardPermissionProvider.ManageImports))
            {
                return(AccessDeniedView());
            }

            var model = new ImportProfileListModel
            {
                Profiles             = new List <ImportProfileModel>(),
                AvailableEntityTypes = ImportEntityType.Product.ToSelectList(false).ToList()
            };

            var profiles = _importProfileService.GetImportProfiles().ToList();

            foreach (var profile in profiles)
            {
                var profileModel = new ImportProfileModel();

                PrepareProfileModel(profileModel, profile, false);

                profileModel.TaskModel = profile.ScheduleTask.ToScheduleTaskModel(Services.Localization, _dateTimeHelper, Url);

                model.Profiles.Add(profileModel);
            }

            return(View(model));
        }
Esempio n. 8
0
        public ActionResult Edit(int id)
        {
            if (!_services.Permissions.Authorize(StandardPermissionProvider.ManageImports))
                return AccessDeniedView();

            var profile = _importProfileService.GetImportProfileById(id);
            if (profile == null)
                return RedirectToAction("List");

            var model = new ImportProfileModel();
            PrepareProfileModel(model, profile, true);

            return View(model);
        }
Esempio n. 9
0
        public ActionResult Edit(int id)
        {
            var profile = _importProfileService.GetImportProfileById(id);

            if (profile == null)
            {
                return(RedirectToAction("List"));
            }

            var model = new ImportProfileModel();

            PrepareProfileModel(model, profile, _scheduleTaskService.GetLastHistoryEntryByTaskId(profile.SchedulingTaskId, true), true);

            return(View(model));
        }
Esempio n. 10
0
        public ActionResult CreateUploadFile(ImportEntityType entityType)
        {
            if (!_services.Permissions.Authorize(StandardPermissionProvider.ManageImports))
            {
                return(AccessDeniedView());
            }

            var model = new ImportProfileModel
            {
                EntityType = entityType
            };

            PrepareProfileModel(model, null, true);

            return(View("Create", model));
        }
Esempio n. 11
0
        public async Task <IActionResult> Edit(int id)
        {
            var profile = await _db.ImportProfiles
                          .Include(x => x.Task)
                          .FindByIdAsync(id, false);

            if (profile == null)
            {
                return(NotFound());
            }

            var model             = new ImportProfileModel();
            var lastExecutionInfo = await _taskStore.GetLastExecutionInfoByTaskIdAsync(profile.TaskId, true);

            await PrepareProfileModel(model, profile, lastExecutionInfo, true);

            return(View(model));
        }
Esempio n. 12
0
        public async Task <IActionResult> Create(ImportProfileModel model)
        {
            try
            {
                if (model.TempFileName.HasValue() && !PathUtility.HasInvalidFileNameChars(model.TempFileName))
                {
                    var root          = Services.ApplicationContext.TenantRoot;
                    var tenantTempDir = Services.ApplicationContext.GetTenantTempDirectory();
                    var importFile    = await tenantTempDir.GetFileAsync(model.TempFileName);

                    if (importFile.Exists)
                    {
                        var profile = await _importProfileService.InsertImportProfileAsync(model.TempFileName, model.Name, model.EntityType);

                        if (profile?.Id > 0)
                        {
                            var dir = await _importProfileService.GetImportDirectoryAsync(profile, "Content", true);

                            await root.CopyFileAsync(importFile.SubPath, root.PathCombine(dir.SubPath, importFile.Name), true);

                            await root.TryDeleteFileAsync(importFile.SubPath);

                            return(RedirectToAction("Edit", new { id = profile.Id }));
                        }
                    }
                    else
                    {
                        NotifyError(T("Admin.DataExchange.Import.MissingImportFile"));
                    }
                }
                else
                {
                    NotifyError("Invalid file name.");
                }
            }
            catch (Exception ex)
            {
                NotifyError(ex);
            }

            return(RedirectToAction("List"));
        }
Esempio n. 13
0
        public ActionResult Edit(int id)
        {
            if (!Services.Permissions.Authorize(StandardPermissionProvider.ManageImports))
            {
                return(AccessDeniedView());
            }

            var profile = _importProfileService.GetImportProfileById(id);

            if (profile == null)
            {
                return(RedirectToAction("List"));
            }

            var model = new ImportProfileModel();

            PrepareProfileModel(model, profile, _scheduleTaskService.GetLastHistoryEntryByTaskId(profile.SchedulingTaskId, true), true);

            return(View(model));
        }
        public ActionResult Edit(ImportProfileModel model)
        {
            var importProfile = _importProfileRepository.GetById(model.Id);

            if (ModelState.IsValid)
            {
                importProfile = model.ToEntity(importProfile);
                //always set IsNew to false when saving
                importProfile.IsNew = false;
                _importProfileRepository.Update(importProfile);

                //commit all changes
                this._dbContext.SaveChanges();

                //notification
                SuccessNotification(_localizationService.GetResource("Record.Saved"));
                return(new NullJsonResult());
            }
            else
            {
                return(Json(new { Errors = ModelState.SerializeErrors() }));
            }
        }
Esempio n. 15
0
        public ActionResult Edit(ImportProfileModel model, bool continueEditing, FormCollection form)
        {
            if (!_services.Permissions.Authorize(StandardPermissionProvider.ManageImports))
            {
                return(AccessDeniedView());
            }

            var profile = _importService.GetImportProfileById(model.Id);

            if (profile == null)
            {
                return(RedirectToAction("List"));
            }

            var multipleMapped = new List <string>();
            var map            = new ColumnMap();
            var hasErrors      = false;
            var resetMappings  = false;

            try
            {
                var propertyKeyPrefix = "ColumnMapping.Property.";
                var allPropertyKeys   = form.AllKeys.Where(x => x.HasValue() && x.StartsWith(propertyKeyPrefix));

                if (allPropertyKeys.Any())
                {
                    var entityProperties = _importService.GetImportableEntityProperties(profile.EntityType);

                    foreach (var key in allPropertyKeys)
                    {
                        var index        = key.Substring(propertyKeyPrefix.Length);
                        var property     = form[key];
                        var column       = form["ColumnMapping.Column." + index];
                        var defaultValue = form["ColumnMapping.Default." + index];
                        var result       = true;

                        // ignored properties: column is empty means swap column and property (otherwise mapping impossible)
                        if (column.IsEmpty())
                        {
                            result = map.AddMapping(property, null, null);
                        }
                        else
                        {
                            result = map.AddMapping(column, null, property, defaultValue);
                        }

                        if (!result)
                        {
                            // add warning for ignored, multiple mapped properties
                            multipleMapped.Add("{0} ({1})".FormatInvariant(entityProperties.ContainsKey(property) ? entityProperties[property] : "".NaIfEmpty(), property));
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                hasErrors = true;
                NotifyError(exception, true, false);
            }

            if (!ModelState.IsValid || hasErrors)
            {
                PrepareProfileModel(model, profile, true, map);
                return(View(model));
            }

            profile.Name          = model.Name;
            profile.EntityType    = model.EntityType;
            profile.Enabled       = model.Enabled;
            profile.Skip          = model.Skip;
            profile.Take          = model.Take;
            profile.UpdateOnly    = model.UpdateOnly;
            profile.KeyFieldNames = (model.KeyFieldNames == null ? null : string.Join(",", model.KeyFieldNames));

            try
            {
                if (profile.FileType == ImportFileType.CSV && model.CsvConfiguration != null)
                {
                    var csvConverter = new CsvConfigurationConverter();

                    var oldCsvConfig = csvConverter.ConvertFrom <CsvConfiguration>(profile.FileTypeConfiguration);
                    var oldDelimiter = (oldCsvConfig != null ? oldCsvConfig.Delimiter.ToString() : null);

                    // auto reset mappings cause they are invalid. note: delimiter can be whitespaced, so no oldDelimter.HasValue() etc.
                    resetMappings = (oldDelimiter != model.CsvConfiguration.Delimiter && profile.ColumnMapping.HasValue());

                    profile.FileTypeConfiguration = csvConverter.ConvertTo(model.CsvConfiguration.Clone());
                }
                else
                {
                    profile.FileTypeConfiguration = null;
                }

                if (resetMappings)
                {
                    profile.ColumnMapping = null;
                }
                else
                {
                    var mapConverter = new ColumnMapConverter();
                    profile.ColumnMapping = mapConverter.ConvertTo(map);
                }
            }
            catch (Exception exception)
            {
                hasErrors = true;
                NotifyError(exception, true, false);
            }

            if (!hasErrors)
            {
                _importService.UpdateImportProfile(profile);

                NotifySuccess(T("Admin.Common.DataSuccessfullySaved"));

                if (resetMappings)
                {
                    NotifyWarning(T("Admin.DataExchange.ColumnMapping.Validate.MappingsReset"));
                }
                else if (multipleMapped.Any())
                {
                    NotifyWarning(T("Admin.DataExchange.ColumnMapping.Validate.MultipleMappedIgnored", "<p>" + string.Join("<br />", multipleMapped) + "</p>"));
                }
            }

            return(continueEditing ? RedirectToAction("Edit", new { id = profile.Id }) : RedirectToAction("List"));
        }
Esempio n. 16
0
        private void PrepareProfileModel(ImportProfileModel model, ImportProfile profile, bool forEdit, ColumnMap invalidMap = null)
        {
            model.Id               = profile.Id;
            model.Name             = profile.Name;
            model.EntityType       = profile.EntityType;
            model.Enabled          = profile.Enabled;
            model.Skip             = (profile.Skip == 0 ? (int?)null : profile.Skip);
            model.Take             = (profile.Take == 0 ? (int?)null : profile.Take);
            model.UpdateOnly       = profile.UpdateOnly;
            model.KeyFieldNames    = profile.KeyFieldNames.SplitSafe(",").Distinct().ToArray();
            model.ScheduleTaskId   = profile.SchedulingTaskId;
            model.ScheduleTaskName = profile.ScheduleTask.Name.NaIfEmpty();
            model.IsTaskRunning    = profile.ScheduleTask.IsRunning;
            model.IsTaskEnabled    = profile.ScheduleTask.Enabled;
            model.LogFileExists    = System.IO.File.Exists(profile.GetImportLogPath());
            model.EntityTypeName   = profile.EntityType.GetLocalizedEnum(Services.Localization, Services.WorkContext);

            model.ExistingFileNames = profile.GetImportFiles()
                                      .Select(x => Path.GetFileName(x))
                                      .ToList();

            if (profile.ResultInfo.HasValue())
            {
                model.ImportResult = XmlHelper.Deserialize <SerializableImportResult>(profile.ResultInfo);
            }

            if (!forEdit)
            {
                return;
            }

            CsvConfiguration csvConfiguration = null;

            if (profile.FileType == ImportFileType.CSV)
            {
                var csvConverter = new CsvConfigurationConverter();
                csvConfiguration = csvConverter.ConvertFrom <CsvConfiguration>(profile.FileTypeConfiguration) ?? CsvConfiguration.ExcelFriendlyConfiguration;

                model.CsvConfiguration = new CsvConfigurationModel(csvConfiguration);
            }
            else
            {
                csvConfiguration = CsvConfiguration.ExcelFriendlyConfiguration;
            }

            // common configuration
            var extraData = XmlHelper.Deserialize <ImportExtraData>(profile.ExtraData);

            model.ExtraData.NumberOfPictures = extraData.NumberOfPictures;

            // column mapping
            model.AvailableSourceColumns    = new List <ColumnMappingItemModel>();
            model.AvailableEntityProperties = new List <ColumnMappingItemModel>();
            model.AvailableKeyFieldNames    = new List <SelectListItem>();
            model.ColumnMappings            = new List <ColumnMappingItemModel>();

            try
            {
                string[] availableKeyFieldNames    = null;
                string[] disabledDefaultFieldNames = GetDisabledDefaultFieldNames(profile);
                var      mapConverter = new ColumnMapConverter();
                var      storedMap    = mapConverter.ConvertFrom <ColumnMap>(profile.ColumnMapping);
                var      map          = (invalidMap ?? storedMap) ?? new ColumnMap();

                // property name to localized property name
                var allProperties = _importProfileService.GetImportableEntityProperties(profile.EntityType);

                switch (profile.EntityType)
                {
                case ImportEntityType.Product:
                    availableKeyFieldNames = ProductImporter.SupportedKeyFields;
                    break;

                case ImportEntityType.Category:
                    availableKeyFieldNames = CategoryImporter.SupportedKeyFields;
                    break;

                case ImportEntityType.Customer:
                    availableKeyFieldNames = CustomerImporter.SupportedKeyFields;
                    break;

                case ImportEntityType.NewsLetterSubscription:
                    availableKeyFieldNames = NewsLetterSubscriptionImporter.SupportedKeyFields;
                    break;
                }

                model.AvailableEntityProperties = allProperties
                                                  .Select(x =>
                {
                    var mapping = new ColumnMappingItemModel
                    {
                        Property            = x.Key,
                        PropertyDescription = x.Value,
                        IsDefaultDisabled   = IsDefaultValueDisabled(x.Key, x.Key, disabledDefaultFieldNames)
                    };

                    return(mapping);
                })
                                                  .ToList();

                model.AvailableKeyFieldNames = availableKeyFieldNames
                                               .Select(x =>
                {
                    var item = new SelectListItem {
                        Value = x, Text = x
                    };

                    if (x == "Id")
                    {
                        item.Text = T("Admin.Common.Entity.Fields.Id");
                    }
                    else if (allProperties.ContainsKey(x))
                    {
                        item.Text = allProperties[x];
                    }

                    return(item);
                })
                                               .ToList();

                model.ColumnMappings = map.Mappings
                                       .Select(x =>
                {
                    var mapping = new ColumnMappingItemModel
                    {
                        Column   = x.Value.MappedName,
                        Property = x.Key,
                        Default  = x.Value.Default
                    };

                    if (x.Value.IgnoreProperty)
                    {
                        // explicitly ignore the property
                        mapping.Column  = null;
                        mapping.Default = null;
                    }

                    mapping.PropertyDescription = GetPropertyDescription(allProperties, mapping.Property);
                    mapping.IsDefaultDisabled   = IsDefaultValueDisabled(mapping.Column, mapping.Property, disabledDefaultFieldNames);

                    return(mapping);
                })
                                       .ToList();

                var files = profile.GetImportFiles();
                if (!files.Any())
                {
                    return;
                }

                var filePath = files.First();

                using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    var dataTable = LightweightDataTable.FromFile(Path.GetFileName(filePath), stream, stream.Length, csvConfiguration, 0, 1);

                    foreach (var column in dataTable.Columns.Where(x => x.Name.HasValue()))
                    {
                        string columnWithoutIndex, columnIndex;
                        ColumnMap.ParseSourceName(column.Name, out columnWithoutIndex, out columnIndex);

                        model.AvailableSourceColumns.Add(new ColumnMappingItemModel
                        {
                            Index               = dataTable.Columns.IndexOf(column),
                            Column              = column.Name,
                            ColumnWithoutIndex  = columnWithoutIndex,
                            ColumnIndex         = columnIndex,
                            PropertyDescription = GetPropertyDescription(allProperties, column.Name)
                        });

                        // auto map where field equals property name
                        if (!model.ColumnMappings.Any(x => x.Column == column.Name))
                        {
                            var kvp = allProperties.FirstOrDefault(x => x.Key.IsCaseInsensitiveEqual(column.Name));
                            if (kvp.Key.IsEmpty())
                            {
                                var alternativeName = LightweightDataTable.GetAlternativeColumnNameFor(column.Name);
                                kvp = allProperties.FirstOrDefault(x => x.Key.IsCaseInsensitiveEqual(alternativeName));
                            }

                            if (kvp.Key.HasValue() && !model.ColumnMappings.Any(x => x.Property == kvp.Key))
                            {
                                model.ColumnMappings.Add(new ColumnMappingItemModel
                                {
                                    Column              = column.Name,
                                    Property            = kvp.Key,
                                    PropertyDescription = kvp.Value,
                                    IsDefaultDisabled   = IsDefaultValueDisabled(column.Name, kvp.Key, disabledDefaultFieldNames)
                                });
                            }
                        }
                    }

                    // sorting
                    model.AvailableSourceColumns = model.AvailableSourceColumns
                                                   .OrderBy(x => x.PropertyDescription)
                                                   .ToList();

                    model.AvailableEntityProperties = model.AvailableEntityProperties
                                                      .OrderBy(x => x.PropertyDescription)
                                                      .ToList();

                    model.ColumnMappings = model.ColumnMappings
                                           .OrderBy(x => x.PropertyDescription)
                                           .ToList();
                }
            }
            catch (Exception exception)
            {
                NotifyError(exception, true, false);
            }
        }
        private void PrepareProfileModel(ImportProfileModel model, ImportProfile profile, bool forEdit, ColumnMap invalidMap = null)
        {
            model.Id = profile.Id;
            model.Name = profile.Name;
            model.EntityType = profile.EntityType;
            model.Enabled = profile.Enabled;
            model.Skip = (profile.Skip == 0 ? (int?)null : profile.Skip);
            model.Take = (profile.Take == 0 ? (int?)null : profile.Take);
            model.UpdateOnly = profile.UpdateOnly;
            model.KeyFieldNames = profile.KeyFieldNames.SplitSafe(",").Distinct().ToArray();
            model.ScheduleTaskId = profile.SchedulingTaskId;
            model.ScheduleTaskName = profile.ScheduleTask.Name.NaIfEmpty();
            model.IsTaskRunning = profile.ScheduleTask.IsRunning;
            model.IsTaskEnabled = profile.ScheduleTask.Enabled;
            model.LogFileExists = System.IO.File.Exists(profile.GetImportLogPath());
            model.EntityTypeName = profile.EntityType.GetLocalizedEnum(Services.Localization, Services.WorkContext);

            model.ExistingFileNames = profile.GetImportFiles()
                .Select(x => Path.GetFileName(x))
                .ToList();

            if (profile.ResultInfo.HasValue())
                model.ImportResult = XmlHelper.Deserialize<SerializableImportResult>(profile.ResultInfo);

            if (!forEdit)
                return;

            CsvConfiguration csvConfiguration = null;

            if (profile.FileType == ImportFileType.CSV)
            {
                var csvConverter = new CsvConfigurationConverter();
                csvConfiguration = csvConverter.ConvertFrom<CsvConfiguration>(profile.FileTypeConfiguration) ?? CsvConfiguration.ExcelFriendlyConfiguration;

                model.CsvConfiguration = new CsvConfigurationModel(csvConfiguration);
            }
            else
            {
                csvConfiguration = CsvConfiguration.ExcelFriendlyConfiguration;
            }

            // common configuration
            var extraData = XmlHelper.Deserialize<ImportExtraData>(profile.ExtraData);
            model.ExtraData.NumberOfPictures = extraData.NumberOfPictures;

            // column mapping
            model.AvailableSourceColumns = new List<ColumnMappingItemModel>();
            model.AvailableEntityProperties = new List<ColumnMappingItemModel>();
            model.AvailableKeyFieldNames = new List<SelectListItem>();
            model.ColumnMappings = new List<ColumnMappingItemModel>();

            try
            {
                string[] availableKeyFieldNames = null;
                string[] disabledDefaultFieldNames = GetDisabledDefaultFieldNames(profile);
                var mapConverter = new ColumnMapConverter();
                var storedMap = mapConverter.ConvertFrom<ColumnMap>(profile.ColumnMapping);
                var map = (invalidMap ?? storedMap) ?? new ColumnMap();

                // property name to localized property name
                var allProperties = _importProfileService.GetImportableEntityProperties(profile.EntityType);

                switch (profile.EntityType)
                {
                    case ImportEntityType.Product:
                        availableKeyFieldNames = ProductImporter.SupportedKeyFields;
                        break;
                    case ImportEntityType.Category:
                        availableKeyFieldNames = CategoryImporter.SupportedKeyFields;
                        break;
                    case ImportEntityType.Customer:
                        availableKeyFieldNames = CustomerImporter.SupportedKeyFields;
                        break;
                    case ImportEntityType.NewsLetterSubscription:
                        availableKeyFieldNames = NewsLetterSubscriptionImporter.SupportedKeyFields;
                        break;
                }

                model.AvailableEntityProperties = allProperties
                    .Select(x =>
                    {
                        var mapping = new ColumnMappingItemModel
                        {
                            Property = x.Key,
                            PropertyDescription = x.Value,
                            IsDefaultDisabled = IsDefaultValueDisabled(x.Key, x.Key, disabledDefaultFieldNames)
                        };

                        return mapping;
                    })
                    .ToList();

                model.AvailableKeyFieldNames = availableKeyFieldNames
                    .Select(x =>
                    {
                        var item = new SelectListItem { Value = x, Text = x };

                        if (x == "Id")
                            item.Text = T("Admin.Common.Entity.Fields.Id");
                        else if (allProperties.ContainsKey(x))
                            item.Text = allProperties[x];

                        return item;
                    })
                    .ToList();

                model.ColumnMappings = map.Mappings
                    .Select(x =>
                    {
                        var mapping = new ColumnMappingItemModel
                        {
                            Column = x.Value.MappedName,
                            Property = x.Key,
                            Default = x.Value.Default
                        };

                        if (x.Value.IgnoreProperty)
                        {
                            // explicitly ignore the property
                            mapping.Column = null;
                            mapping.Default = null;
                        }

                        mapping.PropertyDescription = GetPropertyDescription(allProperties, mapping.Property);
                        mapping.IsDefaultDisabled = IsDefaultValueDisabled(mapping.Column, mapping.Property, disabledDefaultFieldNames);

                        return mapping;
                    })
                    .ToList();

                var files = profile.GetImportFiles();
                if (!files.Any())
                    return;

                var filePath = files.First();

                using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    var dataTable = LightweightDataTable.FromFile(Path.GetFileName(filePath), stream, stream.Length, csvConfiguration, 0, 1);

                    foreach (var column in dataTable.Columns.Where(x => x.Name.HasValue()))
                    {
                        string columnWithoutIndex, columnIndex;
                        ColumnMap.ParseSourceName(column.Name, out columnWithoutIndex, out columnIndex);

                        model.AvailableSourceColumns.Add(new ColumnMappingItemModel
                        {
                            Index = dataTable.Columns.IndexOf(column),
                            Column = column.Name,
                            ColumnWithoutIndex = columnWithoutIndex,
                            ColumnIndex = columnIndex,
                            PropertyDescription = GetPropertyDescription(allProperties, column.Name)
                        });

                        // auto map where field equals property name
                        if (!model.ColumnMappings.Any(x => x.Column == column.Name))
                        {
                            var kvp = allProperties.FirstOrDefault(x => x.Key.IsCaseInsensitiveEqual(column.Name));
                            if (kvp.Key.IsEmpty())
                            {
                                var alternativeName = LightweightDataTable.GetAlternativeColumnNameFor(column.Name);
                                kvp = allProperties.FirstOrDefault(x => x.Key.IsCaseInsensitiveEqual(alternativeName));
                            }

                            if (kvp.Key.HasValue() && !model.ColumnMappings.Any(x => x.Property == kvp.Key))
                            {
                                model.ColumnMappings.Add(new ColumnMappingItemModel
                                {
                                    Column = column.Name,
                                    Property = kvp.Key,
                                    PropertyDescription = kvp.Value,
                                    IsDefaultDisabled = IsDefaultValueDisabled(column.Name, kvp.Key, disabledDefaultFieldNames)
                                });
                            }
                        }
                    }

                    // sorting
                    model.AvailableSourceColumns = model.AvailableSourceColumns
                        .OrderBy(x => x.PropertyDescription)
                        .ToList();

                    model.AvailableEntityProperties = model.AvailableEntityProperties
                        .OrderBy(x => x.PropertyDescription)
                        .ToList();

                    model.ColumnMappings = model.ColumnMappings
                        .OrderBy(x => x.PropertyDescription)
                        .ToList();
                }
            }
            catch (Exception exception)
            {
                NotifyError(exception, true, false);
            }
        }
        public ActionResult List()
        {
            if (!Services.Permissions.Authorize(StandardPermissionProvider.ManageImports))
                return AccessDeniedView();

            var model = new ImportProfileListModel
            {
                Profiles = new List<ImportProfileModel>(),
                AvailableEntityTypes = ImportEntityType.Product.ToSelectList(false).ToList()
            };

            var profiles = _importProfileService.GetImportProfiles().ToList();

            foreach (var profile in profiles)
            {
                var profileModel = new ImportProfileModel();

                PrepareProfileModel(profileModel, profile, false);

                profileModel.TaskModel = profile.ScheduleTask.ToScheduleTaskModel(Services.Localization, _dateTimeHelper, Url);

                model.Profiles.Add(profileModel);
            }

            return View(model);
        }
        public ActionResult Edit(ImportProfileModel model, bool continueEditing, FormCollection form)
        {
            if (!Services.Permissions.Authorize(StandardPermissionProvider.ManageImports))
                return AccessDeniedView();

            var profile = _importProfileService.GetImportProfileById(model.Id);
            if (profile == null)
                return RedirectToAction("List");

            var map = new ColumnMap();
            var hasErrors = false;
            var resetMappings = false;

            try
            {
                var propertyKeyPrefix = "ColumnMapping.Property.";
                var allPropertyKeys = form.AllKeys.Where(x => x.HasValue() && x.StartsWith(propertyKeyPrefix));

                if (allPropertyKeys.Any())
                {
                    var entityProperties = _importProfileService.GetImportableEntityProperties(profile.EntityType);

                    foreach (var key in allPropertyKeys)
                    {
                        var index = key.Substring(propertyKeyPrefix.Length);
                        var property = form[key];
                        var column = form["ColumnMapping.Column." + index];
                        var defaultValue = form["ColumnMapping.Default." + index];

                        if (column.IsEmpty())
                        {
                            // tell mapper to explicitly ignore the property
                            map.AddMapping(property, null, property, "[IGNOREPROPERTY]");
                        }
                        else if (!column.IsCaseInsensitiveEqual(property) || defaultValue.HasValue())
                        {
                            if (defaultValue.HasValue() && GetDisabledDefaultFieldNames(profile).Contains(property))
                                defaultValue = null;

                            map.AddMapping(property, null, column, defaultValue);
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                hasErrors = true;
                NotifyError(exception, true, false);
            }

            if (!ModelState.IsValid || hasErrors)
            {
                PrepareProfileModel(model, profile, true, map);
                return View(model);
            }

            profile.Name = model.Name;
            profile.EntityType = model.EntityType;
            profile.Enabled = model.Enabled;
            profile.Skip = model.Skip ?? 0;
            profile.Take = model.Take ?? 0;
            profile.UpdateOnly = model.UpdateOnly;
            profile.KeyFieldNames = (model.KeyFieldNames == null ? null : string.Join(",", model.KeyFieldNames));

            try
            {
                if (profile.FileType == ImportFileType.CSV && model.CsvConfiguration != null)
                {
                    var csvConverter = new CsvConfigurationConverter();

                    var oldCsvConfig = csvConverter.ConvertFrom<CsvConfiguration>(profile.FileTypeConfiguration);
                    var oldDelimiter = (oldCsvConfig != null ? oldCsvConfig.Delimiter.ToString() : null);

                    // auto reset mappings cause they are invalid. note: delimiter can be whitespaced, so no oldDelimter.HasValue() etc.
                    resetMappings = (oldDelimiter != model.CsvConfiguration.Delimiter && profile.ColumnMapping.HasValue());

                    profile.FileTypeConfiguration = csvConverter.ConvertTo(model.CsvConfiguration.Clone());
                }
                else
                {
                    profile.FileTypeConfiguration = null;
                }

                if (resetMappings)
                {
                    profile.ColumnMapping = null;
                }
                else
                {
                    var mapConverter = new ColumnMapConverter();
                    profile.ColumnMapping = mapConverter.ConvertTo(map);
                }

                if (model.ExtraData != null)
                {
                    var extraData = new ImportExtraData
                    {
                        NumberOfPictures = model.ExtraData.NumberOfPictures
                    };

                    profile.ExtraData = XmlHelper.Serialize(extraData);
                }
            }
            catch (Exception exception)
            {
                hasErrors = true;
                NotifyError(exception, true, false);
            }

            if (!hasErrors)
            {
                _importProfileService.UpdateImportProfile(profile);

                NotifySuccess(T("Admin.Common.DataSuccessfullySaved"));

                if (resetMappings)
                {
                    NotifyWarning(T("Admin.DataExchange.ColumnMapping.Validate.MappingsReset"));
                }
            }

            return (continueEditing ? RedirectToAction("Edit", new { id = profile.Id }) : RedirectToAction("List"));
        }
        public ActionResult Edit(int id)
        {
            if (!Services.Permissions.Authorize(StandardPermissionProvider.ManageImports))
                return AccessDeniedView();

            var profile = _importProfileService.GetImportProfileById(id);
            if (profile == null)
                return RedirectToAction("List");

            var model = new ImportProfileModel();
            PrepareProfileModel(model, profile, true);

            return View(model);
        }
Esempio n. 21
0
        public ActionResult Edit(ImportProfileModel model, bool continueEditing, FormCollection form)
        {
            if (!Services.Permissions.Authorize(StandardPermissionProvider.ManageImports))
            {
                return(AccessDeniedView());
            }

            var profile = _importProfileService.GetImportProfileById(model.Id);

            if (profile == null)
            {
                return(RedirectToAction("List"));
            }

            var map           = new ColumnMap();
            var hasErrors     = false;
            var resetMappings = false;

            try
            {
                var propertyKeyPrefix = "ColumnMapping.Property.";
                var allPropertyKeys   = form.AllKeys.Where(x => x.HasValue() && x.StartsWith(propertyKeyPrefix));

                if (allPropertyKeys.Any())
                {
                    var entityProperties = _importProfileService.GetImportableEntityProperties(profile.EntityType);

                    foreach (var key in allPropertyKeys)
                    {
                        var index        = key.Substring(propertyKeyPrefix.Length);
                        var property     = form[key];
                        var column       = form["ColumnMapping.Column." + index];
                        var defaultValue = form["ColumnMapping.Default." + index];

                        if (column.IsEmpty())
                        {
                            // tell mapper to explicitly ignore the property
                            map.AddMapping(property, null, property, "[IGNOREPROPERTY]");
                        }
                        else if (!column.IsCaseInsensitiveEqual(property) || defaultValue.HasValue())
                        {
                            if (defaultValue.HasValue() && GetDisabledDefaultFieldNames(profile).Contains(property))
                            {
                                defaultValue = null;
                            }

                            map.AddMapping(property, null, column, defaultValue);
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                hasErrors = true;
                NotifyError(exception, true, false);
            }

            if (!ModelState.IsValid || hasErrors)
            {
                PrepareProfileModel(model, profile, true, map);
                return(View(model));
            }

            profile.Name          = model.Name;
            profile.EntityType    = model.EntityType;
            profile.Enabled       = model.Enabled;
            profile.Skip          = model.Skip ?? 0;
            profile.Take          = model.Take ?? 0;
            profile.UpdateOnly    = model.UpdateOnly;
            profile.KeyFieldNames = (model.KeyFieldNames == null ? null : string.Join(",", model.KeyFieldNames));

            try
            {
                if (profile.FileType == ImportFileType.CSV && model.CsvConfiguration != null)
                {
                    var csvConverter = new CsvConfigurationConverter();

                    var oldCsvConfig = csvConverter.ConvertFrom <CsvConfiguration>(profile.FileTypeConfiguration);
                    var oldDelimiter = (oldCsvConfig != null ? oldCsvConfig.Delimiter.ToString() : null);

                    // auto reset mappings cause they are invalid. note: delimiter can be whitespaced, so no oldDelimter.HasValue() etc.
                    resetMappings = (oldDelimiter != model.CsvConfiguration.Delimiter && profile.ColumnMapping.HasValue());

                    profile.FileTypeConfiguration = csvConverter.ConvertTo(model.CsvConfiguration.Clone());
                }
                else
                {
                    profile.FileTypeConfiguration = null;
                }

                if (resetMappings)
                {
                    profile.ColumnMapping = null;
                }
                else
                {
                    var mapConverter = new ColumnMapConverter();
                    profile.ColumnMapping = mapConverter.ConvertTo(map);
                }

                if (model.ExtraData != null)
                {
                    var extraData = new ImportExtraData
                    {
                        NumberOfPictures = model.ExtraData.NumberOfPictures
                    };

                    profile.ExtraData = XmlHelper.Serialize(extraData);
                }
            }
            catch (Exception exception)
            {
                hasErrors = true;
                NotifyError(exception, true, false);
            }

            if (!hasErrors)
            {
                _importProfileService.UpdateImportProfile(profile);

                NotifySuccess(T("Admin.Common.DataSuccessfullySaved"));

                if (resetMappings)
                {
                    NotifyWarning(T("Admin.DataExchange.ColumnMapping.Validate.MappingsReset"));
                }
            }

            return(continueEditing ? RedirectToAction("Edit", new { id = profile.Id }) : RedirectToAction("List"));
        }
Esempio n. 22
0
        private void PrepareProfileModel(ImportProfileModel model, ImportProfile profile, bool forEdit, ColumnMap invalidMap = null)
        {
            if (profile == null)
            {
                if (model.Name.IsEmpty())
                {
                    var defaultNames = T("Admin.DataExchange.Import.DefaultProfileNames").Text.SplitSafe(";");

                    model.Name = defaultNames.SafeGet((int)model.EntityType);
                }

                model.ExistingFileNames = new List <string>();
                return;
            }

            model.Id                = profile.Id;
            model.Name              = profile.Name;
            model.EntityType        = profile.EntityType;
            model.Enabled           = profile.Enabled;
            model.Skip              = profile.Skip;
            model.Take              = profile.Take;
            model.UpdateOnly        = profile.UpdateOnly;
            model.KeyFieldNames     = profile.KeyFieldNames.SplitSafe(",").Distinct().ToArray();
            model.ScheduleTaskId    = profile.SchedulingTaskId;
            model.ScheduleTaskName  = profile.ScheduleTask.Name.NaIfEmpty();
            model.IsTaskRunning     = profile.ScheduleTask.IsRunning;
            model.IsTaskEnabled     = profile.ScheduleTask.Enabled;
            model.LogFileExists     = System.IO.File.Exists(profile.GetImportLogPath());
            model.EntityTypeName    = profile.EntityType.GetLocalizedEnum(_services.Localization, _services.WorkContext);
            model.UnspecifiedString = T("Common.Unspecified");
            model.AddNewString      = T("Common.AddNew");
            model.DeleteString      = T("Common.Delete");
            model.IgnoreString      = T("Admin.Common.Ignore");

            model.ExistingFileNames = profile.GetImportFiles()
                                      .Select(x => Path.GetFileName(x))
                                      .ToList();

            if (profile.ResultInfo.HasValue())
            {
                model.ImportResult = XmlHelper.Deserialize <SerializableImportResult>(profile.ResultInfo);
            }

            if (!forEdit)
            {
                return;
            }

            CsvConfiguration csvConfiguration = null;

            if (profile.FileType == ImportFileType.CSV)
            {
                var csvConverter = new CsvConfigurationConverter();
                csvConfiguration = csvConverter.ConvertFrom <CsvConfiguration>(profile.FileTypeConfiguration) ?? CsvConfiguration.ExcelFriendlyConfiguration;

                model.CsvConfiguration = new CsvConfigurationModel(csvConfiguration);
            }
            else
            {
                csvConfiguration = CsvConfiguration.ExcelFriendlyConfiguration;
            }

            // column mapping
            model.AvailableSourceColumns    = new List <ColumnMappingItemModel>();
            model.AvailableEntityProperties = new List <SelectListItem>();
            model.AvailableKeyFieldNames    = new List <SelectListItem>();
            model.ColumnMappings            = new List <ColumnMappingItemModel>();

            try
            {
                string[] availableKeyFieldNames = null;
                var      mapConverter           = new ColumnMapConverter();
                var      storedMap         = mapConverter.ConvertFrom <ColumnMap>(profile.ColumnMapping);
                var      hasStoredMappings = (storedMap != null && storedMap.Mappings.Any());
                var      map = (invalidMap ?? storedMap) ?? new ColumnMap();

                // property name to localized property name
                var allProperties = _importService.GetImportableEntityProperties(profile.EntityType);

                switch (profile.EntityType)
                {
                case ImportEntityType.Product:
                    availableKeyFieldNames = ProductImporter.SupportedKeyFields;
                    break;

                case ImportEntityType.Category:
                    availableKeyFieldNames = CategoryImporter.SupportedKeyFields;
                    break;

                case ImportEntityType.Customer:
                    availableKeyFieldNames = CustomerImporter.SupportedKeyFields;
                    break;

                case ImportEntityType.NewsLetterSubscription:
                    availableKeyFieldNames = NewsLetterSubscriptionImporter.SupportedKeyFields;
                    break;
                }

                model.AvailableEntityProperties = allProperties
                                                  .Select(x => new SelectListItem {
                    Value = x.Key, Text = x.Value
                })
                                                  .OrderBy(x => x.Text)
                                                  .ToList();

                model.AvailableKeyFieldNames = availableKeyFieldNames
                                               .Select(x =>
                {
                    var item = new SelectListItem {
                        Value = x, Text = x
                    };

                    if (x == "Id")
                    {
                        item.Text = T("Admin.Common.Entity.Fields.Id");
                    }
                    else if (allProperties.ContainsKey(x))
                    {
                        item.Text = allProperties[x];
                    }

                    return(item);
                })
                                               .ToList();

                model.ColumnMappings = map.Mappings
                                       .Select(x =>
                {
                    var mapping = new ColumnMappingItemModel
                    {
                        Column   = (x.Value.Property.IsEmpty() ? null : x.Key),
                        Property = (x.Value.Property.IsEmpty() ? x.Key : x.Value.Property),
                        Default  = x.Value.Default
                    };

                    // add localized to make mappings sortable
                    if (allProperties.ContainsKey(mapping.Property))
                    {
                        mapping.ColumnLocalized = allProperties[mapping.Property];
                    }

                    return(mapping);
                })
                                       .ToList();

                var files = profile.GetImportFiles();
                if (!files.Any())
                {
                    return;
                }

                var filePath = files.First();

                using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    var dataTable = LightweightDataTable.FromFile(Path.GetFileName(filePath), stream, stream.Length, csvConfiguration, 0, 1);

                    foreach (var column in dataTable.Columns.Where(x => x.Name.HasValue()))
                    {
                        string columnWithoutIndex, columnIndex;
                        ColumnMap.ParseSourceColumn(column.Name, out columnWithoutIndex, out columnIndex);

                        var mapModel = new ColumnMappingItemModel
                        {
                            Index              = dataTable.Columns.IndexOf(column),
                            Column             = column.Name,
                            ColumnWithoutIndex = columnWithoutIndex,
                            ColumnIndex        = columnIndex,
                            ColumnLocalized    = (allProperties.ContainsKey(column.Name) ? allProperties[column.Name] : column.Name)
                        };

                        model.AvailableSourceColumns.Add(mapModel);

                        // auto map where field equals property name
                        if (!hasStoredMappings && !model.ColumnMappings.Any(x => x.Column == column.Name))
                        {
                            var kvp = allProperties.FirstOrDefault(x => x.Key.IsCaseInsensitiveEqual(column.Name));

                            if (kvp.Key.HasValue())
                            {
                                model.ColumnMappings.Add(new ColumnMappingItemModel
                                {
                                    Column          = column.Name,
                                    Property        = kvp.Key,
                                    ColumnLocalized = kvp.Value
                                });
                            }
                            else
                            {
                                var alternativeName = LightweightDataTable.GetAlternativeColumnNameFor(column.Name);
                                kvp = allProperties.FirstOrDefault(x => x.Key.IsCaseInsensitiveEqual(alternativeName));

                                if (kvp.Key.HasValue())
                                {
                                    model.ColumnMappings.Add(new ColumnMappingItemModel
                                    {
                                        Column          = column.Name,
                                        Property        = kvp.Key,
                                        ColumnLocalized = kvp.Value
                                    });
                                }
                            }
                        }
                    }

                    // sorting
                    model.AvailableSourceColumns = model.AvailableSourceColumns
                                                   .OrderBy(x => x.ColumnLocalized)
                                                   .ToList();

                    model.ColumnMappings = model.ColumnMappings
                                           .OrderBy(x => x.ColumnLocalized)
                                           .ToList();
                }
            }
            catch (Exception exception)
            {
                NotifyError(exception, true, false);
            }
        }