private void SaveProjects(BaseCamp basecampManager) { var projects = basecampManager.Projects; var step = 50.0 / projects.Count(); var projectEngine = _engineFactory.GetProjectEngine(); var participantEngine = _engineFactory.GetParticipantEngine(); foreach (var project in projects.Where(x => _withClosed ? true : x.Status == "active")) { try { Status.LogInfo(string.Format(SettingsResource.ImportProjectStarted, project.Name)); Status.ProjectProgress += step; var newProject = new Project() { Status = project.Status == "active" ? ProjectStatus.Open : ProjectStatus.Closed, Title = ReplaceLineSeparator(project.Name), Description = project.Description, Responsible = _initiatorId, Private = true }; projectEngine.SaveOrUpdate(newProject, true); Participant prt = participantEngine.GetByID(newProject.Responsible); projectEngine.AddToTeam(newProject, prt, true); foreach (var wrapper in project.People.SelectMany(user => NewUsersID.Where(wrapper => user.ID == wrapper.inBasecamp))) { prt = participantEngine.GetByID(wrapper.inProjects); projectEngine.AddToTeam(newProject, prt, true); //check permission var user = project.People.ToList().Find(p => p.ID == wrapper.inBasecamp); if (user!=null) { if (!user.HasAccessToNewProjects) { switch (user.CanPost) { case 1: projectEngine.SetTeamSecurity(newProject, prt, ProjectTeamSecurity.Messages, true); projectEngine.SetTeamSecurity(newProject, prt, ProjectTeamSecurity.Files, true); projectEngine.SetTeamSecurity(newProject, prt, ProjectTeamSecurity.Tasks, false); projectEngine.SetTeamSecurity(newProject, prt, ProjectTeamSecurity.Milestone, false); break; case 2: projectEngine.SetTeamSecurity(newProject, prt, ProjectTeamSecurity.Messages, true); projectEngine.SetTeamSecurity(newProject, prt, ProjectTeamSecurity.Files, true); projectEngine.SetTeamSecurity(newProject, prt, ProjectTeamSecurity.Tasks, true); projectEngine.SetTeamSecurity(newProject, prt, ProjectTeamSecurity.Milestone, false); break; case 3: projectEngine.SetTeamSecurity(newProject, prt, ProjectTeamSecurity.Messages, true); projectEngine.SetTeamSecurity(newProject, prt, ProjectTeamSecurity.Files, true); projectEngine.SetTeamSecurity(newProject, prt, ProjectTeamSecurity.Tasks, true); projectEngine.SetTeamSecurity(newProject, prt, ProjectTeamSecurity.Milestone, true); break; } } } } NewProjectsID.Add(new ProjectIDWrapper() { inBasecamp = project.ID, inProjects = newProject.ID }); } catch (Exception e) { Status.LogError(string.Format(SettingsResource.FailedToSaveProject, project.Name), e); LogError(string.Format("project '{0}' failed", project.Name), e); NewProjectsID.RemoveAll(x => x.inBasecamp == project.ID); } } //Select only suceeded projects var projectsToProcess = projects.Where(x => NewProjectsID.Count(y => y.inBasecamp == x.ID) > 0).ToList(); step = 50.0 / projectsToProcess.Count; foreach (var project in projectsToProcess) { Status.LogInfo(string.Format(SettingsResource.ImportProjectDataStarted, project.Name)); Status.ProjectProgress += step; SaveMilestones(project.Milestones); var messages = project.RecentMessages; foreach (var message in messages) { SaveMessages(message); } var todoLists = project.ToDoLists; foreach (var todoList in todoLists) { SaveTasks(todoList); } SaveFileCategories(project.Categories); SaveTimeSpends(project.TimeEntries); Attachments.AddRange(project.Attachments); } }
private void SaveFiles(BaseCamp basecampManeger, IEnumerable<IAttachment> attachments) { var step = 100.0 / attachments.Count(); Status.LogInfo(string.Format(SettingsResource.ImportFileStarted, attachments.Count())); //select last version foreach (var attachment in attachments.GroupBy(a => a.Collection).Select(g => g.OrderByDescending(a => a.Vers).FirstOrDefault())) { Status.FileProgress += step; try { HttpWebRequest HttpWReq = basecampManeger.Service.GetRequest(attachment.DownloadUrl); using (HttpWebResponse HttpWResp = (HttpWebResponse)HttpWReq.GetResponse()) { if (attachment.ByteSize > SetupInfo.MaxUploadSize) break; var file = new ASC.Files.Core.File(); file.FolderID = attachment.CategoryID != -1 ? FindFileCategory(attachment.CategoryID) : FileEngine2.GetRoot(FindProject(attachment.ProjectID)); file.Title = attachment.Name; file.ContentLength = attachment.ByteSize; file.ContentType = MimeMapping.GetMimeMapping(attachment.Name); file.CreateBy = FindUser(attachment.AuthorID); file.CreateOn = attachment.CreatedOn.ToUniversalTime(); if (file.Title.LastIndexOf('\\') != -1) file.Title = file.Title.Substring(file.Title.LastIndexOf('\\') + 1); file = FileEngine2.SaveFile(file, HttpWResp.GetResponseStream()); if ("Post".Equals(attachment.OwnerType,StringComparison.OrdinalIgnoreCase) ) { try { var messageId = FindMessage(attachment.OwnerID); FileEngine2.AttachFileToMessage(messageId, file.ID);//It's not critical } catch (Exception e) { LogError(string.Format("not critical. attaching file '{0}' to message failed", attachment.Name), e); } } NewFilesID.Add(new FileIDWrapper { inBasecamp = attachment.ID, inProjects = file.ID, version = attachment.Vers, collection = attachment.Collection }); } } catch (Exception e) { try { Status.LogError(string.Format(SettingsResource.FailedToSaveFile, attachment.Name), e); LogError(string.Format("file '{0}' failed", attachment.Name), e); NewFilesID.RemoveAll(x => x.inBasecamp == attachment.ID && x.version == attachment.Vers); } catch (Exception ex) { LogError(string.Format("file remove after error failed"), ex); } } } }
private void SaveUsers(BaseCamp basecampManager) { var employees = basecampManager.People; var step = 100.0 / employees.Count(); foreach (var person in employees.Where(x => _withClosed ? true : !x.Deleted)) { try { Status.UserProgress += step; Guid userID = FindUserByEmail(person.EmailAddress); if (userID.Equals(Guid.Empty)) { UserInfo userInfo = new UserInfo() { Email = person.EmailAddress, FirstName = person.FirstName, LastName = person.LastName, Title = person.Title, Status = person.Deleted ? EmployeeStatus.Terminated : EmployeeStatus.Active, }; if (!string.IsNullOrEmpty(person.PhoneNumberMobile)) userInfo.AddSocialContact(SocialContactsManager.ContactType_mobphone, person.PhoneNumberMobile); if (!string.IsNullOrEmpty(person.PhoneNumberHome)) userInfo.AddSocialContact(SocialContactsManager.ContactType_phone, person.PhoneNumberHome); if (!string.IsNullOrEmpty(person.PhoneNumberOffice)) userInfo.AddSocialContact(SocialContactsManager.ContactType_phone, person.PhoneNumberOffice); if (!string.IsNullOrEmpty(person.PhoneNumberFax)) userInfo.AddSocialContact(SocialContactsManager.ContactType_phone, person.PhoneNumberFax); if (!string.IsNullOrEmpty(person.ImHandle)) switch (person.ImService) { case "MSN": userInfo.AddSocialContact(SocialContactsManager.ContactType_msn, person.ImHandle); break; case "ICQ": userInfo.AddSocialContact(SocialContactsManager.ContactType_icq, person.ImHandle); break; case "Yahoo": userInfo.AddSocialContact(SocialContactsManager.ContactType_yahoo, person.ImHandle); break; case "Jabber": userInfo.AddSocialContact(SocialContactsManager.ContactType_jabber, person.ImHandle); break; case "Skype": userInfo.AddSocialContact(SocialContactsManager.ContactType_skype, person.ImHandle); break; case "Google": userInfo.AddSocialContact(SocialContactsManager.ContactType_gmail, person.ImHandle); break; } var newUserInfo = UserManagerWrapper.AddUser(userInfo, UserManagerWrapper.GeneratePassword(),false,!_disableNotifications); if (person.Administrator) CoreContext.UserManager.AddUserIntoGroup(newUserInfo.ID, ASC.Core.Users.Constants.GroupAdmin.ID); NewUsersID.Add(new UserIDWrapper() { inBasecamp = person.ID, inProjects = newUserInfo.ID }); //save user avatar const string emptyAvatar = "http://asset1.37img.com/global/missing/avatar.png?r=3";//TODO:?!!! Wtf??!! if (person.AvatarUrl != emptyAvatar) UserPhotoManager.SaveOrUpdatePhoto(newUserInfo.ID, StreamFile(person.AvatarUrl)); } else { NewUsersID.Add(new UserIDWrapper() { inBasecamp = person.ID, inProjects = userID }); } } catch (Exception e) { Status.LogError(string.Format(SettingsResource.FailedToSaveUser, person.EmailAddress), e); LogError(string.Format("user '{0}' failed", person.EmailAddress), e); NewUsersID.RemoveAll(x => x.inBasecamp == person.ID); } } }