2010-07-14 15:31:43 -07:00
using System ;
2011-03-15 19:04:42 -07:00
using System.Xml ;
2010-07-14 15:31:43 -07:00
using Orchard.ContentManagement ;
using Orchard.ContentManagement.Drivers ;
2011-03-14 17:14:03 -07:00
using Orchard.ContentManagement.Handlers ;
2010-12-10 11:12:29 -08:00
using Orchard.Mvc ;
2010-10-25 18:21:19 -07:00
using Orchard.PublishLater.Models ;
using Orchard.PublishLater.Services ;
using Orchard.PublishLater.ViewModels ;
2010-07-14 15:31:43 -07:00
using Orchard.Localization ;
2010-10-26 07:56:56 -07:00
using System.Globalization ;
2011-11-09 16:21:26 -08:00
using Orchard.Services ;
2010-07-14 15:31:43 -07:00
2010-10-25 18:21:19 -07:00
namespace Orchard.PublishLater.Drivers {
2010-07-14 15:31:43 -07:00
public class PublishLaterPartDriver : ContentPartDriver < PublishLaterPart > {
2010-10-13 04:51:15 -07:00
private const string TemplateName = "Parts/PublishLater" ;
2011-10-05 14:48:31 -07:00
private readonly IHttpContextAccessor _httpContextAccessor ;
2010-07-14 15:31:43 -07:00
private readonly IPublishLaterService _publishLaterService ;
2011-11-09 16:21:26 -08:00
private readonly IClock _clock ;
2010-10-26 07:56:56 -07:00
private const string DatePattern = "M/d/yyyy" ;
private const string TimePattern = "h:mm tt" ;
2010-07-14 15:31:43 -07:00
public PublishLaterPartDriver (
IOrchardServices services ,
2011-10-05 14:48:31 -07:00
IHttpContextAccessor httpContextAccessor ,
2011-11-09 16:21:26 -08:00
IPublishLaterService publishLaterService ,
IClock clock ) {
2011-10-05 14:48:31 -07:00
_httpContextAccessor = httpContextAccessor ;
2010-07-14 15:31:43 -07:00
_publishLaterService = publishLaterService ;
2011-11-09 16:21:26 -08:00
_clock = clock ;
2010-07-14 15:31:43 -07:00
T = NullLocalizer . Instance ;
Services = services ;
}
public Localizer T { get ; set ; }
public IOrchardServices Services { get ; set ; }
2010-10-13 04:51:15 -07:00
protected override string Prefix {
get { return "PublishLater" ; }
2010-07-14 15:31:43 -07:00
}
2010-10-13 04:51:15 -07:00
protected override DriverResult Display ( PublishLaterPart part , string displayType , dynamic shapeHelper ) {
return Combined (
ContentShape ( "Parts_PublishLater_Metadata" ,
2010-10-15 18:11:06 -07:00
( ) = > shapeHelper . Parts_PublishLater_Metadata ( ContentPart : part , ScheduledPublishUtc : part . ScheduledPublishUtc . Value ) ) ,
2010-10-13 04:51:15 -07:00
ContentShape ( "Parts_PublishLater_Metadata_Summary" ,
( ) = > shapeHelper . Parts_PublishLater_Metadata_Summary ( ContentPart : part , ScheduledPublishUtc : part . ScheduledPublishUtc . Value ) ) ,
ContentShape ( "Parts_PublishLater_Metadata_SummaryAdmin" ,
( ) = > shapeHelper . Parts_PublishLater_Metadata_SummaryAdmin ( ContentPart : part , ScheduledPublishUtc : part . ScheduledPublishUtc . Value ) )
) ;
2010-07-14 15:31:43 -07:00
}
2010-10-13 04:51:15 -07:00
protected override DriverResult Editor ( PublishLaterPart part , dynamic shapeHelper ) {
2010-10-26 07:56:56 -07:00
// 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 ,
2010-11-04 13:20:46 -07:00
ScheduledPublishDate = part . ScheduledPublishUtc . Value . HasValue & & ! part . IsPublished ( ) ? part . ScheduledPublishUtc . Value . Value . ToLocalTime ( ) . ToString ( DatePattern , CultureInfo . InvariantCulture ) : String . Empty ,
ScheduledPublishTime = part . ScheduledPublishUtc . Value . HasValue & & ! part . IsPublished ( ) ? part . ScheduledPublishUtc . Value . Value . ToLocalTime ( ) . ToString ( TimePattern , CultureInfo . InvariantCulture ) : String . Empty
2010-10-26 07:56:56 -07:00
} ;
2010-10-15 11:55:48 -07:00
return ContentShape ( "Parts_PublishLater_Edit" ,
2010-10-13 04:51:15 -07:00
( ) = > shapeHelper . EditorTemplate ( TemplateName : TemplateName , Model : model , Prefix : Prefix ) ) ;
2010-07-14 15:31:43 -07:00
}
2010-10-13 04:51:15 -07:00
protected override DriverResult Editor ( PublishLaterPart part , IUpdateModel updater , dynamic shapeHelper ) {
2010-07-14 15:31:43 -07:00
var model = new PublishLaterViewModel ( part ) ;
2010-10-26 07:56:56 -07:00
2010-10-13 04:51:15 -07:00
updater . TryUpdateModel ( model , Prefix , null , null ) ;
2010-10-26 07:56:56 -07:00
2011-10-05 14:48:31 -07:00
if ( _httpContextAccessor . Current ( ) . Request . Form [ "submit.Save" ] = = "submit.PublishLater" ) {
2010-12-10 11:12:29 -08:00
if ( ! string . IsNullOrWhiteSpace ( model . ScheduledPublishDate ) & & ! string . IsNullOrWhiteSpace ( model . ScheduledPublishTime ) ) {
DateTime scheduled ;
string parseDateTime = String . Concat ( model . ScheduledPublishDate , " " , model . ScheduledPublishTime ) ;
2010-11-04 13:20:46 -07:00
2010-12-10 11:12:29 -08:00
// 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 ( ) ;
2011-11-09 16:21:26 -08:00
if ( model . ScheduledPublishUtc < _clock . UtcNow ) {
updater . AddModelError ( "ScheduledPublishUtcDate" , T ( "You cannot schedule a publishing date in the past" ) ) ;
}
else {
_publishLaterService . Publish ( model . ContentItem , model . ScheduledPublishUtc . Value ) ;
}
2010-12-10 11:12:29 -08:00
}
else {
updater . AddModelError ( Prefix , T ( "{0} is an invalid date and time" , parseDateTime ) ) ;
}
2010-11-04 13:20:46 -07:00
}
2010-12-10 11:12:29 -08:00
else if ( ! string . IsNullOrWhiteSpace ( model . ScheduledPublishDate ) | | ! string . IsNullOrWhiteSpace ( model . ScheduledPublishTime ) ) {
updater . AddModelError ( Prefix , T ( "Both the date and time need to be specified for when this is to be published. If you don't want to schedule publishing then click Save or Publish Now." ) ) ;
2010-11-04 13:20:46 -07:00
}
}
2010-10-15 11:55:48 -07:00
return ContentShape ( "Parts_PublishLater_Edit" ,
2010-10-13 04:51:15 -07:00
( ) = > shapeHelper . EditorTemplate ( TemplateName : TemplateName , Model : model , Prefix : Prefix ) ) ;
}
2011-03-14 17:14:03 -07:00
2011-03-16 10:32:22 -07:00
protected override void Importing ( PublishLaterPart part , ImportContentContext context ) {
var scheduledUtc = context . Attribute ( part . PartDefinition . Name , "ScheduledPublishUtc" ) ;
if ( scheduledUtc ! = null ) {
part . ScheduledPublishUtc . Value = XmlConvert . ToDateTime ( scheduledUtc , XmlDateTimeSerializationMode . Utc ) ;
}
}
2011-03-14 17:14:03 -07:00
protected override void Exporting ( PublishLaterPart part , ExportContentContext context ) {
2011-03-15 19:04:42 -07:00
var scheduled = part . ScheduledPublishUtc . Value ;
if ( scheduled ! = null ) {
context . Element ( part . PartDefinition . Name )
. SetAttributeValue ( "ScheduledPublishUtc" , XmlConvert . ToString ( scheduled . Value , XmlDateTimeSerializationMode . Utc ) ) ;
}
2011-03-14 17:14:03 -07:00
}
2010-07-14 15:31:43 -07:00
}
}