Handle publishing in UTC

This commit is contained in:
kjac
2016-03-22 19:35:40 +01:00
parent 8f7024c32a
commit 9336f4508a
3 changed files with 45 additions and 8 deletions
@@ -142,8 +142,8 @@ namespace Archetype.Models
internal bool IsDisabled()
{
return Disabled
|| (ReleaseDate.HasValue && ReleaseDate > DateTime.Now)
|| (ExpireDate.HasValue && DateTime.Now > ExpireDate);
|| (ReleaseDate.HasValue && ReleaseDate > DateTime.UtcNow)
|| (ExpireDate.HasValue && DateTime.UtcNow > ExpireDate);
}
#endregion
@@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using Archetype.Extensions;
using Archetype.Models;
using ClientDependency.Core;
using Newtonsoft.Json;
using Umbraco.Core;
@@ -175,6 +176,10 @@ namespace Archetype.PropertyEditors
var uploadedFiles = editorValue.AdditionalData.ContainsKey("files") ? editorValue.AdditionalData["files"] as IEnumerable<ContentItemFile> : null;
foreach (var fieldset in archetype.Fieldsets)
{
// make sure the publishing dates are in UTC
fieldset.ReleaseDate = EnsureUtcDate(fieldset.ReleaseDate);
fieldset.ExpireDate = EnsureUtcDate(fieldset.ExpireDate);
// assign an id to the fieldset if it has none (e.g. newly created fieldset)
fieldset.Id = fieldset.Id == Guid.Empty ? Guid.NewGuid() : fieldset.Id;
// find the corresponding fieldset in the current Archetype value (if any)
@@ -237,6 +242,20 @@ namespace Archetype.PropertyEditors
? new ArchetypePropertyEditor()
: (PropertyEditor) new TextboxPropertyEditor();
}
/// <summary>
/// Ensures that a datetime is in UTC
/// </summary>
/// <param name="dateTime">The datetime</param>
/// <returns>The datetime in UTC (or null if it's not set)</returns>
private DateTime? EnsureUtcDate(DateTime? dateTime)
{
if(dateTime.HasValue == false || dateTime.Value.Kind == DateTimeKind.Utc)
{
return dateTime;
}
return new DateTime(dateTime.Value.Ticks, DateTimeKind.Utc);
}
}
#endregion
+24 -6
View File
@@ -281,6 +281,8 @@ angular.module("umbraco").controller("Imulus.ArchetypeController", function ($sc
if ($scope.canPublish() === false) {
return false;
}
// NOTE: all comparison is done in local datetime
// - that's fine because the selected local datetimes will be converted to UTC datetimes when submitted
if (fieldset.expireDateModel && fieldset.expireDateModel.value) {
// an expired release affects the fieldset
return moment() > moment(fieldset.expireDateModel.value);
@@ -321,16 +323,18 @@ angular.module("umbraco").controller("Imulus.ArchetypeController", function ($sc
}
function addCustomPropertiesToFieldset(fieldset) {
// create models for publish configuration
// create models for publish configuration (utilizing the built-in datepicker data type)
// NOTE: all datetimes must be converted from UTC to local
fieldset.releaseDateModel = {
alias: _.uniqueId("archetypeReleaseDate_"),
view: "datepicker",
value: fieldset.releaseDate
value: fromUtc(fieldset.releaseDate)
};
fieldset.expireDateModel = {
alias: _.uniqueId("archetypeExpireDate_"),
view: "datepicker",
value: fieldset.expireDate
value: fromUtc(fieldset.expireDate)
};
}
@@ -555,10 +559,24 @@ angular.module("umbraco").controller("Imulus.ArchetypeController", function ($sc
}
$scope.submitWatcherOnSubmit = function () {
_.each($scope.model.value.fieldsets, function(fieldset) {
// extract the publish configuration from the fieldsets
fieldset.releaseDate = fieldset.releaseDateModel.value;
fieldset.expireDate = fieldset.expireDateModel.value;
// extract the publish configuration from the fieldsets (and convert local datetimes to UTC)
fieldset.releaseDate = toUtc(fieldset.releaseDateModel.value);
fieldset.expireDate = toUtc(fieldset.expireDateModel.value);
});
$scope.$broadcast("archetypeFormSubmitting");
}
function toUtc(date) {
if (!date) {
return null;
}
return moment(date, "YYYY-MM-DD HH:mm:ss").utc().toDate();
}
function fromUtc(date) {
if (!date) {
return null;
}
return moment(moment.utc(date).toDate()).format("YYYY-MM-DD HH:mm:ss")
}
});