From c7e49fbfa5c60d1aba8f5d2544cda8c2ad531ea5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Ros?= Date: Tue, 26 Oct 2010 07:56:56 -0700 Subject: [PATCH] Handle local server time and different cultures for PublishLater and ArchiveLater - Does not include jQuery.datepicker localization, currently forced to en-US parsing --HG-- branch : dev --- .../Drivers/ArchiveLaterPartDriver.cs | 18 +++++++--- .../Drivers/PublishLaterPartDriver.cs | 34 +++++++++++++------ .../Orchard.PublishLater/Styles/datetime.css | 4 +-- .../ViewModels/PublishLaterViewModel.cs | 21 ++---------- .../EditorTemplates/Parts/PublishLater.cshtml | 13 +++---- .../PublishLater.Metadata.SummaryAdmin.cshtml | 2 +- 6 files changed, 49 insertions(+), 43 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.ArchiveLater/Drivers/ArchiveLaterPartDriver.cs b/src/Orchard.Web/Modules/Orchard.ArchiveLater/Drivers/ArchiveLaterPartDriver.cs index 53a6da49c..cd5ed2a52 100644 --- a/src/Orchard.Web/Modules/Orchard.ArchiveLater/Drivers/ArchiveLaterPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.ArchiveLater/Drivers/ArchiveLaterPartDriver.cs @@ -5,11 +5,14 @@ using Orchard.ArchiveLater.ViewModels; using Orchard.ContentManagement; using Orchard.ContentManagement.Drivers; using Orchard.Localization; +using System.Globalization; namespace Orchard.ArchiveLater.Drivers { public class ArchiveLaterPartDriver : ContentPartDriver { private const string TemplateName = "Parts/ArchiveLater"; private readonly IArchiveLaterService _archiveLaterService; + private const string DatePattern = "M/d/yyyy"; + private const string TimePattern = "h:mm tt"; public ArchiveLaterPartDriver( IOrchardServices services, @@ -38,8 +41,8 @@ namespace Orchard.ArchiveLater.Drivers { model.ScheduledArchiveUtc = part.ScheduledArchiveUtc.Value; model.ArchiveLater = model.ScheduledArchiveUtc.HasValue; - model.ScheduledArchiveDate = model.ScheduledArchiveUtc.HasValue ? model.ScheduledArchiveUtc.Value.ToLocalTime().ToShortDateString() : String.Empty; - model.ScheduledArchiveTime = model.ScheduledArchiveUtc.HasValue ? model.ScheduledArchiveUtc.Value.ToLocalTime().ToShortTimeString() : String.Empty; + model.ScheduledArchiveDate = model.ScheduledArchiveUtc.HasValue ? model.ScheduledArchiveUtc.Value.ToLocalTime().ToString(DatePattern, CultureInfo.InvariantCulture) : String.Empty; + model.ScheduledArchiveTime = model.ScheduledArchiveUtc.HasValue ? model.ScheduledArchiveUtc.Value.ToLocalTime().ToString(TimePattern, CultureInfo.InvariantCulture) : String.Empty; return ContentShape("Parts_ArchiveLater_Edit", () => shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: model, Prefix: Prefix)); @@ -51,9 +54,16 @@ namespace Orchard.ArchiveLater.Drivers { if (updater.TryUpdateModel(model, Prefix, null, null) ) { if ( model.ArchiveLater ) { DateTime scheduled; - if ( DateTime.TryParse(string.Format("{0} {1}", model.ScheduledArchiveDate, model.ScheduledArchiveTime), out scheduled) ) + string parseDateTime = String.Concat(model.ScheduledArchiveDate, " ", model.ScheduledArchiveTime); + + // use an english culture as it is the one used by jQuery.datepicker by default + if (DateTime.TryParse(parseDateTime, CultureInfo.GetCultureInfo("en-US"), DateTimeStyles.AssumeLocal, out scheduled)) { model.ScheduledArchiveUtc = scheduled.ToUniversalTime(); - _archiveLaterService.ArchiveLater(model.ContentItem, model.ScheduledArchiveUtc.HasValue ? model.ScheduledArchiveUtc.Value : DateTime.MaxValue); + _archiveLaterService.ArchiveLater(model.ContentItem, model.ScheduledArchiveUtc.HasValue ? model.ScheduledArchiveUtc.Value : DateTime.MaxValue); + } + else { + updater.AddModelError(Prefix, T("{0} is an invalid date and time", parseDateTime)); + } } else { _archiveLaterService.RemoveArchiveLaterTasks(model.ContentItem); diff --git a/src/Orchard.Web/Modules/Orchard.PublishLater/Drivers/PublishLaterPartDriver.cs b/src/Orchard.Web/Modules/Orchard.PublishLater/Drivers/PublishLaterPartDriver.cs index 5a7503d3f..a8ba7544a 100644 --- a/src/Orchard.Web/Modules/Orchard.PublishLater/Drivers/PublishLaterPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.PublishLater/Drivers/PublishLaterPartDriver.cs @@ -6,12 +6,16 @@ using Orchard.PublishLater.Models; using Orchard.PublishLater.Services; using Orchard.PublishLater.ViewModels; using Orchard.Localization; +using System.Globalization; +using Orchard.Core.Localization.Services; namespace Orchard.PublishLater.Drivers { public class PublishLaterPartDriver : ContentPartDriver { private const string TemplateName = "Parts/PublishLater"; private readonly ICommonService _commonService; private readonly IPublishLaterService _publishLaterService; + private const string DatePattern = "M/d/yyyy"; + private const string TimePattern = "h:mm tt"; public PublishLaterPartDriver( IOrchardServices services, @@ -42,35 +46,43 @@ namespace Orchard.PublishLater.Drivers { } protected override DriverResult Editor(PublishLaterPart part, dynamic shapeHelper) { - var model = BuildEditorViewModel(part); + // date and time are formatted using the same patterns as DateTimePicker is, preventing other cultures issues + var model = new PublishLaterViewModel(part) { + ScheduledPublishUtc = part.ScheduledPublishUtc.Value, + ScheduledPublishDate = part.ScheduledPublishUtc.Value.HasValue ? part.ScheduledPublishUtc.Value.Value.ToLocalTime().ToString(DatePattern, CultureInfo.InvariantCulture) : String.Empty, + ScheduledPublishTime = part.ScheduledPublishUtc.Value.HasValue ? part.ScheduledPublishUtc.Value.Value.ToLocalTime().ToString(TimePattern, CultureInfo.InvariantCulture) : String.Empty + }; + return ContentShape("Parts_PublishLater_Edit", () => shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: model, Prefix: Prefix)); } protected override DriverResult Editor(PublishLaterPart part, IUpdateModel updater, dynamic shapeHelper) { var model = new PublishLaterViewModel(part); + updater.TryUpdateModel(model, Prefix, null, null); switch (model.Command) { case "PublishNow": _commonService.Publish(model.ContentItem); - //Services.Notifier.Information(T("{0} has been published!", model.ContentItem.TypeDefinition.DisplayName)); break; case "PublishLater": DateTime scheduled; - if (DateTime.TryParse(string.Format("{0} {1}", model.ScheduledPublishUtcDate, model.ScheduledPublishUtcTime), out scheduled)) - model.ScheduledPublishUtc = scheduled; - _publishLaterService.Publish(model.ContentItem, model.ScheduledPublishUtc.HasValue ? model.ScheduledPublishUtc.Value : DateTime.MaxValue); - //Services.Notifier.Information(T("{0} has been scheduled for publishing!", model.ContentItem.TypeDefinition.DisplayName)); + string parseDateTime = String.Concat(model.ScheduledPublishDate, " ", model.ScheduledPublishTime); + + // use an english culture as it is the one used by jQuery.datepicker by default + if (DateTime.TryParse(parseDateTime, CultureInfo.GetCultureInfo("en-US"), DateTimeStyles.AssumeLocal, out scheduled)) { + model.ScheduledPublishUtc = part.ScheduledPublishUtc.Value = scheduled.ToUniversalTime(); + _publishLaterService.Publish(model.ContentItem, model.ScheduledPublishUtc.Value); + } + else { + updater.AddModelError(Prefix, T("{0} is an invalid date and time", parseDateTime)); + } + break; case "SaveDraft": - //Services.Notifier.Information(T("{0} draft has been saved!", model.ContentItem.TypeDefinition.DisplayName)); break; } return ContentShape("Parts_PublishLater_Edit", () => shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: model, Prefix: Prefix)); } - - private static PublishLaterViewModel BuildEditorViewModel(PublishLaterPart part) { - return new PublishLaterViewModel(part); - } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.PublishLater/Styles/datetime.css b/src/Orchard.Web/Modules/Orchard.PublishLater/Styles/datetime.css index dc3a06eba..21684b460 100644 --- a/src/Orchard.Web/Modules/Orchard.PublishLater/Styles/datetime.css +++ b/src/Orchard.Web/Modules/Orchard.PublishLater/Styles/datetime.css @@ -6,9 +6,9 @@ html.dyn input.hinted { color:#ccc; font-style:italic; } -input#PublishLater_ScheduledPublishUtcDate { +input#PublishLater_ScheduledPublishDate { width:50%; } -input#PublishLater_ScheduledPublishUtcTime { +input#PublishLater_ScheduledPublishTime { width:36%; } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.PublishLater/ViewModels/PublishLaterViewModel.cs b/src/Orchard.Web/Modules/Orchard.PublishLater/ViewModels/PublishLaterViewModel.cs index f8f175253..3961d56c4 100644 --- a/src/Orchard.Web/Modules/Orchard.PublishLater/ViewModels/PublishLaterViewModel.cs +++ b/src/Orchard.Web/Modules/Orchard.PublishLater/ViewModels/PublishLaterViewModel.cs @@ -6,8 +6,6 @@ using Orchard.PublishLater.Models; namespace Orchard.PublishLater.ViewModels { public class PublishLaterViewModel { private readonly PublishLaterPart _publishLaterPart; - private string _scheduledPublishUtcTime; - private string _scheduledPublishUtcDate; public PublishLaterViewModel(PublishLaterPart publishLaterPart) { _publishLaterPart = publishLaterPart; @@ -37,23 +35,8 @@ namespace Orchard.PublishLater.ViewModels { public DateTime? ScheduledPublishUtc { get; set; } - public string ScheduledPublishUtcDate { - get { - return !HasPublished && !string.IsNullOrEmpty(_scheduledPublishUtcDate) || !ScheduledPublishUtc.HasValue - ? _scheduledPublishUtcDate - : ScheduledPublishUtc.Value.ToShortDateString(); - } - set { _scheduledPublishUtcDate = value; } - } + public string ScheduledPublishDate { get; set; } - - public string ScheduledPublishUtcTime { - get { - return !HasPublished && !string.IsNullOrEmpty(_scheduledPublishUtcTime) || !ScheduledPublishUtc.HasValue - ? _scheduledPublishUtcTime - : ScheduledPublishUtc.Value.ToShortTimeString(); - } - set { _scheduledPublishUtcTime = value; } - } + public string ScheduledPublishTime { get; set; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.PublishLater/Views/EditorTemplates/Parts/PublishLater.cshtml b/src/Orchard.Web/Modules/Orchard.PublishLater/Views/EditorTemplates/Parts/PublishLater.cshtml index 4147741c9..5b7681ce3 100644 --- a/src/Orchard.Web/Modules/Orchard.PublishLater/Views/EditorTemplates/Parts/PublishLater.cshtml +++ b/src/Orchard.Web/Modules/Orchard.PublishLater/Views/EditorTemplates/Parts/PublishLater.cshtml @@ -21,10 +21,10 @@
- - @Html.EditorFor(m => m.ScheduledPublishUtcDate) - - @Html.EditorFor(m => m.ScheduledPublishUtcTime) + + @Html.EditorFor(m => m.ScheduledPublishDate) + + @Html.EditorFor(m => m.ScheduledPublishTime)
@using(Script.Foot()) { @@ -43,8 +43,9 @@ .blur(function () { var $this = $(this); setTimeout(function () { if (!$this.val()) { $this.addClass("hinted").val($this.data("hint")) } }, 300) }); } }); - $(@(new HtmlString(string.Format("\"#{0}\"", ViewData.TemplateInfo.GetFullHtmlFieldId("ScheduledPublishUtcDate"))))).datepicker({ showAnim: "" }).focus(function () { $(@(new HtmlString(string.Format("\"#{0}\"", ViewData.TemplateInfo.GetFullHtmlFieldId("Command_PublishLater"))))).attr("checked", "checked") }); - $(@(new HtmlString(string.Format("\"#{0}\"", ViewData.TemplateInfo.GetFullHtmlFieldId("ScheduledPublishUtcTime"))))).timepickr().focus(function () { $(@(new HtmlString(string.Format("\"#{0}\"", ViewData.TemplateInfo.GetFullHtmlFieldId("Command_PublishLater"))))).attr("checked", "checked") }); + $('#@ViewData.TemplateInfo.GetFullHtmlFieldId("ScheduledPublishDate")').datepicker({ showAnim: "" }).focus(function () { $('#@ViewData.TemplateInfo.GetFullHtmlFieldId("Command_PublishLater")').attr("checked", "checked") }); + $('#@ViewData.TemplateInfo.GetFullHtmlFieldId("ScheduledPublishTime")').timepickr().focus(function () { $('#@ViewData.TemplateInfo.GetFullHtmlFieldId("Command_PublishLater")').attr("checked", "checked") }); + }) //]]> diff --git a/src/Orchard.Web/Modules/Orchard.PublishLater/Views/Parts/PublishLater.Metadata.SummaryAdmin.cshtml b/src/Orchard.Web/Modules/Orchard.PublishLater/Views/Parts/PublishLater.Metadata.SummaryAdmin.cshtml index da9dd5732..b3163f8d1 100644 --- a/src/Orchard.Web/Modules/Orchard.PublishLater/Views/Parts/PublishLater.Metadata.SummaryAdmin.cshtml +++ b/src/Orchard.Web/Modules/Orchard.PublishLater/Views/Parts/PublishLater.Metadata.SummaryAdmin.cshtml @@ -30,7 +30,7 @@ } else { @T( @T("Scheduled") - @Html.DateTime(((DateTime?)Model.ScheduledPublishUtc).Value, T("M/d/yyyy h:mm tt")) + @Html.DateTime(((DateTime?)Model.ScheduledPublishUtc).Value.ToLocalTime(), T("M/d/yyyy h:mm tt")) } |  } \ No newline at end of file