public override IEnumerable <ValidationResult> Validate(TriodionRuleCreateEditModel model) { var errors = ValidateDayRule(model); if (model.DaysFromEaster < -363 || model.DaysFromEaster > 363) { errors.Add(new ValidationResult("Количество дней от Пасхи должно варьироваться в пределах одного календарного года (-364..364)", new List <string>() { "DayWorships" })); } //проверяем на уникальность DaysFromEaster TriodionRule found = null; if (model.Mode == ModelMode.Create) { //если объект создается, Id = Id версии Устава, //значит ищем TriodionRule с таким же DaysFromEaster found = DbContext.Set <TriodionRule>() .FirstOrDefault(c => c.DaysFromEaster == model.DaysFromEaster && c.TypiconVersion.TypiconId == model.Id && c.TypiconVersion.BDate == null && c.TypiconVersion.EDate == null); } else { //Edit //сначала находим сам редактируемый объект found = DbContext.Set <TriodionRule>().FirstOrDefault(c => c.Id == model.Id); if (found?.DaysFromEaster == model.DaysFromEaster) { //если значения DaysFromEaster найденного объекта и редактируемой модели равны, //значит ошибки нет found = null; } else if (found != null) { //ищем дальше found = DbContext.Set <TriodionRule>() .FirstOrDefault(c => c.TypiconVersionId == found.TypiconVersionId && c.DaysFromEaster == model.DaysFromEaster); } } if (found != null) { errors.Add(new ValidationResult("В Уставе уже есть Правило Триоди с заданным значением Количества дней от Пасхи", new List <string>() { "DaysFromEaster" })); } return(errors); }
public void CheckMenology_False() { DayRule rule = new TriodionRule(); var modifiedRule = new ModifiedRule() { DayRule = rule }; Assert.IsFalse(TypeEqualsOrSubclassOf <MenologyRule> .Is(modifiedRule.DayRule)); }
public TriodionRule FindTriodionRule(int daysFromEaster) { TriodionRule result = (TriodionRule)ChildElements.AsQueryable(). FirstOrDefault(c => ((c is TriodionRule) && ((c as TriodionRule).Day.DaysFromEaster == daysFromEaster))); if (result == null) { foreach (TypiconFolder folder in Folders) { result = folder.FindTriodionRule(daysFromEaster); if (result != null) { return(result); } } } return(result); }
private void MigrateTriodionDaysAndRules(TypiconVersion typiconEntity) { Console.WriteLine("MigrateTriodionDaysAndRules()"); Timer timer = new Timer(); timer.Start(); //TypiconFolderEntity folder = new TypiconFolderEntity() { Name = "Триодь" }; //typiconEntity.RulesFolder.AddFolder(folder); foreach (ScheduleDBDataSet.TriodionRow row in _sh.DataSet.Triodion.Rows) { //CreateItemTextRequest req = new CreateItemTextRequest(); //req.Text = row.Name; //req.Name = "Name1"; //req.Style.IsBold = row.IsNameBold; //ItemTextCollection itemTextCol = XmlHelper.CreateItemTextCollection(req); DayWorship dayWorship = new DayWorship() { WorshipName = new ItemTextStyled() }; dayWorship.WorshipName.IsBold = row.IsNameBold; dayWorship.WorshipName.AddOrUpdate(DEFAULT_LANGUAGE, row.Name); //DayWorship dayWorship = new DayWorship() //{ // WorshipName = new ItemFakeText() { StringExpression = row.Name } //}; TriodionDay day = new TriodionDay() { //Name = row.Name, //DayName = itemTextCol, DaysFromEaster = (int)row.DayFromEaster, }; day.AppendDayService(dayWorship); //day.Sign = _dbContext.Set<Sign>().Get(c => c.Id == row.SignID); _dbContext.Set <TriodionDay>().Add(day); string folderPath = Path.Combine(FOLDER_PATH, TYPICON_NAME, "Triodion"); FileReader fileReader = new FileReader(folderPath); TriodionRule rule = new TriodionRule() { //Name = day.Name, DaysFromEaster = day.DaysFromEaster, TypiconVersionId = typiconEntity.Id, //Owner = typiconEntity, //IsAddition = true, Template = typiconEntity.Signs.First(c => c.SignName.FirstOrDefault(DEFAULT_LANGUAGE).Text == row.ServiceSignsRow.Name), RuleDefinition = fileReader.Read(row.DayFromEaster.ToString()), ModRuleDefinition = fileReader.Read(row.DayFromEaster.ToString(), "mod") }; rule.DayRuleWorships = new List <DayRuleWorship>() { new DayRuleWorship() { DayRule = rule, DayWorship = dayWorship, Order = 1 } }; //folder.AddRule(rule); typiconEntity.TriodionRules.Add(rule); } timer.Stop(); Console.WriteLine(timer.GetStringValue()); //_unitOfWork.Commit(); }
private void MigrateTriodionDaysAndRules(TypiconEntity typiconEntity) { Console.WriteLine("MigrateTriodionDaysAndRules()"); Timer timer = new Timer(); timer.Start(); //TypiconFolderEntity folder = new TypiconFolderEntity() { Name = "Триодь" }; //typiconEntity.RulesFolder.AddFolder(folder); foreach (ScheduleDBDataSet.TriodionRow row in _sh.DataSet.Triodion.Rows) { //CreateItemTextRequest req = new CreateItemTextRequest(); //req.Text = row.Name; //req.Name = "Name1"; //req.Style.IsBold = row.IsNameBold; //ItemTextCollection itemTextCol = XmlHelper.CreateItemTextCollection(req); DayWorship dayWorship = new DayWorship() { WorshipName = new ItemTextStyled() }; dayWorship.WorshipName.Style.IsBold = row.IsNameBold; dayWorship.WorshipName.AddElement("cs-ru", row.Name); //DayWorship dayWorship = new DayWorship() //{ // WorshipName = new ItemFakeText() { StringExpression = row.Name } //}; TriodionDay day = new TriodionDay() { //Name = row.Name, //DayName = itemTextCol, DaysFromEaster = (int)row.DayFromEaster, }; day.AppendDayService(dayWorship); //day.Sign = _unitOfWork.Repository<Sign>().Get(c => c.Id == row.SignID); _unitOfWork.Repository <TriodionDay>().Insert(day); string folderPath = Path.Combine(Properties.Settings.Default.FolderPath, typiconEntity.Name, "Triodion"); FileReader fileReader = new FileReader(folderPath); TriodionRule rule = new TriodionRule() { //Name = day.Name, DaysFromEaster = day.DaysFromEaster, Owner = typiconEntity, //IsAddition = true, Template = typiconEntity.Signs.First(c => c.SignName["cs-ru"] == row.ServiceSignsRow.Name), RuleDefinition = fileReader.Read(row.DayFromEaster.ToString()), }; rule.DayRuleWorships = new List <DayRuleWorship>() { new DayRuleWorship() { DayRule = rule, DayWorship = dayWorship } }; //folder.AddRule(rule); typiconEntity.TriodionRules.Add(rule); } timer.Stop(); Console.WriteLine(timer.GetStringValue()); //_unitOfWork.Commit(); }
/// <summary> /// Из трех правил выбирает главное и составляет коллекцию богослужебных текстов. /// Считаем, что ModifiedRule не является ДОПОЛНЕНИЕМ /// </summary> /// <param name="modifiedRule"></param> /// <param name="menologyRule"></param> /// <param name="triodionRule"></param> /// <returns>Правило для обработки, список текстов богослужений</returns> private (DayRule MajorRule, IEnumerable <DayWorship> Menologies, IEnumerable <DayWorship> Triodions, bool ModifiedIsUsed) CalculatePriorities(ModifiedRule modifiedRule, MenologyRule menologyRule, TriodionRule triodionRule) { //Приоритет Минеи IDayRule menologyToCompare = SetValues(menologyRule , out int menologyPriority , TypeEqualsOrSubclassOf <MenologyRule> .Is(modifiedRule?.DayRule)); //Приоритет Триоди IDayRule triodionToCompare = SetValues(triodionRule , out int triodionPriority , TypeEqualsOrSubclassOf <TriodionRule> .Is(modifiedRule?.DayRule)); IDayRule SetValues(DayRule dr, out int p, bool typeEqualsOrSubclassOf) { IDayRule r = null; p = int.MaxValue; if (typeEqualsOrSubclassOf) { r = modifiedRule;//.DayRule; p = modifiedRule.Priority; } else if (dr != null) { r = dr; p = dr.Template.Priority; } return(r); }; IDayRule majorRule = null; var menologies = new List <DayWorship>(); var triodions = new List <DayWorship>(); int result = menologyPriority - triodionPriority; //сравниваем switch (result) { case 1: case 0: //senior Triodion, junior Menology majorRule = triodionToCompare; menologies.AddRange(menologyToCompare.DayWorships); triodions.AddRange(triodionToCompare.DayWorships); break; case -1: //senior Menology, junior Triodion majorRule = menologyToCompare; menologies.AddRange(menologyToCompare.DayWorships); triodions.AddRange(triodionToCompare.DayWorships); break; default: if (result < -1) { //только Минея majorRule = menologyToCompare; menologies.AddRange(menologyToCompare.DayWorships); } else { //только Триодь majorRule = triodionToCompare; triodions.AddRange(triodionToCompare.DayWorships); } break; } //Вводим переменную для того, чтобы затем обнулить ссылку на ModifiedRule bool modifiedRuleIsUsed = false; //если это измененное правило, то возвращаем правило, на которое оно указывает if (majorRule is ModifiedRule mr) { majorRule = mr.DayRule; modifiedRuleIsUsed = true; } return(majorRule as DayRule, menologies, triodions, modifiedRuleIsUsed); }
public void IsTwoSaints_Test() { ServiceSequenceHandler handler = new ServiceSequenceHandler() { Settings = new RuleHandlerSettings() { Date = DateTime.Today } }; string folderPath = Path.Combine(TestContext.CurrentContext.TestDirectory, @"TestData"); var reader = new FileReader(folderPath); string xml = reader.Read("IsTwoSaints_Simple.xml"); //Ektenis element = RuleFactory.CreateElement(xml) as Ektenis; //Минея - попразднество, 1 святой MenologyRule rule = TypiconVersion.GetMenologyRule(new DateTime(2017, 09, 28)); rule.RuleDefinition = xml; handler.Settings.Menologies = rule.DayWorships.ToList(); rule.GetRule <ExecContainer>(Serializer).Interpret(handler); var model = handler.ActualWorshipChildElements; //EktenisViewModel model = rule.GetRule<EktenisRule>(TestRuleSerializer.Root).CreateViewModel(handler) as EktenisViewModel; Assert.AreEqual(1, model.Count); //Триодь, Минея - 1 святой rule = TypiconVersion.GetMenologyRule(new DateTime(2017, 3, 16)); rule.RuleDefinition = xml; TriodionRule triodRule = TypiconVersion.GetTriodionRule(-20); handler.Settings.Menologies = rule.DayWorships.ToList(); handler.Settings.Triodions = triodRule.DayWorships.ToList(); handler.ClearResult(); rule.GetRule <ExecContainer>(Serializer).Interpret(handler); model = handler.ActualWorshipChildElements; //model = rule.GetRule<EktenisRule>(TestRuleSerializer.Root).CreateViewModel(handler) as EktenisViewModel; Assert.AreEqual(1, model.Count); //а теперь находим правило НЕ праздничное, 2 святых rule = TypiconVersion.GetMenologyRule(new DateTime(2017, 5, 31)); rule.RuleDefinition = xml; handler.Settings.Menologies = rule.DayWorships.ToList(); handler.ClearResult(); rule.GetRule <ExecContainer>(Serializer).Interpret(handler); model = handler.ActualWorshipChildElements; //model = rule.GetRule<EktenisRule>(TestRuleSerializer.Root).CreateViewModel(handler) as EktenisViewModel; Assert.AreEqual(2, model.Count); }
public void IsTwoSaints_Test() { EFUnitOfWork _unitOfWork = new EFUnitOfWork(); //BookStorage.Instance = BookStorageFactory.Create(); GetTypiconEntityResponse resp = new TypiconEntityService(_unitOfWork).GetTypiconEntity(1); TypiconEntity typiconEntity = resp.TypiconEntity; ServiceSequenceHandler handler = new ServiceSequenceHandler() { Settings = new RuleHandlerSettings() { Language = LanguageSettingsFactory.Create("cs-ru"), Date = DateTime.Today } }; string folderPath = Path.Combine(TestContext.CurrentContext.TestDirectory, @"TestData"); FileReader reader = new FileReader(folderPath); string xml = reader.Read("IsTwoSaints_Simple.xml"); //Ektenis element = RuleFactory.CreateElement(xml) as Ektenis; //Минея - попразднество, 1 святой MenologyRule rule = typiconEntity.GetMenologyRule(new DateTime(2017, 09, 28)); rule.RuleDefinition = xml; handler.Settings.Rule = rule; handler.Settings.DayWorships = rule.DayWorships; rule.GetRule(TestRuleSerializer.Root).Interpret(handler); var model = handler.GetResult(); //EktenisViewModel model = rule.GetRule<EktenisRule>(TestRuleSerializer.Root).CreateViewModel(handler) as EktenisViewModel; Assert.AreEqual(1, model.FirstOrDefault()?.Count); //Триодь, Минея - 1 святой rule = typiconEntity.GetMenologyRule(new DateTime(2017, 3, 16)); rule.RuleDefinition = xml; TriodionRule triodRule = typiconEntity.GetTriodionRule(-20); rule.DayWorships.AddRange(triodRule.DayWorships); handler.Settings.Rule = rule; handler.Settings.DayWorships = rule.DayWorships; handler.ClearResult(); rule.GetRule(TestRuleSerializer.Root).Interpret(handler); model = handler.GetResult(); //model = rule.GetRule<EktenisRule>(TestRuleSerializer.Root).CreateViewModel(handler) as EktenisViewModel; Assert.AreEqual(1, model.FirstOrDefault()?.Count); //а теперь находим правило НЕ праздничное, 2 святых rule = typiconEntity.GetMenologyRule(new DateTime(2017, 5, 31)); rule.RuleDefinition = xml; handler.Settings.Rule = rule; handler.Settings.DayWorships = rule.DayWorships; handler.ClearResult(); rule.GetRule(TestRuleSerializer.Root).Interpret(handler); model = handler.GetResult(); //model = rule.GetRule<EktenisRule>(TestRuleSerializer.Root).CreateViewModel(handler) as EktenisViewModel; Assert.AreEqual(2, model.FirstOrDefault()?.Count); }
/// <summary> /// Из трех правил выбирает главное и составляет коллекцию богослужебных текстов. /// Считаем, что ModifiedRule не является ДОПОЛНЕНИЕМ /// </summary> /// <param name="modifiedRule"></param> /// <param name="menologyRule"></param> /// <param name="triodionRule"></param> /// <returns>Правило для обработки, список текстов богослужений</returns> private (DayRule, IEnumerable <DayWorship>) CalculatePriorities(ModifiedRule modifiedRule, MenologyRule menologyRule, TriodionRule triodionRule) { //Приоритет Минеи IDayRule menologyToCompare = SetValues(menologyRule, out int menologyPriority, typeof(MenologyRule)); //Приоритет Триоди IDayRule triodionToCompare = SetValues(triodionRule, out int triodionPriority, typeof(TriodionRule)); IDayRule SetValues(DayRule dr, out int p, Type t) { IDayRule r = null; p = int.MaxValue; if (modifiedRule?.RuleEntity.GetType().Equals(t) == true) { r = modifiedRule; p = modifiedRule.Priority; } else if (dr != null) { r = dr; p = dr.Template.Priority; } return(r); }; var rulesList = new List <IDayRule>(); int result = menologyPriority - triodionPriority; //сравниваем switch (result) { case 1: case 0: //senior Triodion, junior Menology rulesList.Add(triodionToCompare); rulesList.Add(menologyToCompare); break; case -1: //senior Menology, junior Triodion rulesList.Add(menologyToCompare); rulesList.Add(triodionToCompare); break; default: if (result < -1) { //только Минея rulesList.Add(menologyToCompare); } else { //только Триодь rulesList.Add(triodionToCompare); } break; } //формируем список текстов List <DayWorship> dayWorships = new List <DayWorship>(); rulesList.ForEach(c => dayWorships.AddRange(c.DayWorships)); //находим главное правило var rule = rulesList.First(); //если это измененное правило, то возвращаем правило, на которое оно указывает if (rule is ModifiedRule) { rule = (rule as ModifiedRule).RuleEntity; } return(rule as DayRule, dayWorships); }