/// <summary>
        /// Publishes a <see cref="T:Tridion.ContentManager.IdentifiableObject"/> to a given <see cref="T:Tridion.ContentManager.CommunicationManagement.PublicationTarget"/> and
        /// with <see cref="T:Tridion.ContentManager.Publishing.PublishPriority"/>
        /// </summary>
        /// <param name="PublishUser"><see cref="T:Tridion.ContentManager.Security.User"/></param>
        /// <param name="Item"><see cref="T:Tridion.ContentManager.IdentifiableObject"/></param>
        /// <param name="Target"><see cref="T:Tridion.ContentManager.CommunicationManagement.PublicationTarget"/></param>
        /// <param name="Priority"><see cref="T:Tridion.ContentManager.Publishing.PublishPriority"/></param>
        /// <param name="startDate"><see cref="T:System.DateTime"/></param>
        public void PublishItem(User PublishUser, IdentifiableObject Item, PublicationTarget Target, PublishPriority Priority, DateTime startDate)
        {
            if (Engine.RenderMode == RenderMode.Publish)
            {
                if (startDate == null)
                {
                    startDate = DateTime.Now;
                }

                using (Session session = new Session(PublishUser.Title))
                {
                    PublishInstruction publishInstruction = new PublishInstruction(session)
                    {
                        StartAt  = startDate,
                        DeployAt = startDate
                    };
                    RenderInstruction renderInstruction = new RenderInstruction(session);

                    renderInstruction.RenderMode         = RenderMode.Publish;
                    publishInstruction.RenderInstruction = renderInstruction;

                    PublishEngine.Publish(new IdentifiableObject[] { session.GetObject(Item.Id) }, publishInstruction, new PublicationTarget[] { Target }, Priority);
                }
            }
        }
        /// <summary>
        /// Determines whether item is published in the current publication context.
        /// </summary>
        /// <param name="identifiableObject">The item <see cref="Tridion.ContentManager.IdentifiableObject"/>.</param>
        /// <param name="publicationTarget">The publication target <see cref="Tridion.ContentManager.CommunicationManagement.PublicationTarget"/>.</param>
        /// <returns>
        ///   <c>true</c> if item is published in current publication context, otherwise <c>false</c>.
        /// </returns>
        public static bool IsPublished(this IdentifiableObject identifiableObject, PublicationTarget publicationTarget)
        {
            if (identifiableObject != null && publicationTarget != null)
                return PublishEngine.IsPublished(identifiableObject, publicationTarget, true);

            return false;
        }
Ejemplo n.º 3
0
        private CurrentMode GetCurrentMode()
        {
            RenderMode renderMode = _engine.RenderMode;

            if (renderMode == RenderMode.Publish)
            {
                return(CurrentMode.Publish);
            }


            if (renderMode == RenderMode.PreviewDynamic)
            {
                if (_engine.PublishingContext.PublicationTarget == null)
                {
                    return(CurrentMode.TemplateBuilder);
                }
                PublicationTarget target = _engine.PublishingContext.PublicationTarget;
                if (target.Id.Equals(TcmUri.UriNull))
                {
                    return(CurrentMode.CmePreview);
                }
                return(CurrentMode.SessionPreview);
            }
            return(CurrentMode.Unknown);
        }
Ejemplo n.º 4
0
        public static bool IsSiteEditEnabled(this PublicationTarget target)
        {
            try
            {
                if (target == null)
                {
                    return(true);
                }
                ApplicationData appData = target.LoadApplicationData("SiteEdit");
                string          data    = Encoding.UTF8.GetString(appData.Data);

                XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.LoadXml(data);

                XmlNamespaceManager nsManager = new XmlNamespaceManager(new NameTable());
                nsManager.AddNamespace("se", "http://www.sdltridion.com/2011/SiteEdit");

                XmlNode seNode = xmlDoc.SelectSingleNode("/se:configuration/se:PublicationTarget/se:EnableSiteEdit",
                                                         nsManager);
                if (seNode != null && seNode.InnerText.Equals("true"))
                {
                    return(true);
                }
                return(false);
            }
            catch (Exception)
            {
                //AAngel: Quick fix to make the pages publishable to live, probably can be done better. They were failing when the target is not Site Edit enabled
                return(false);
            }
        }
        /// <summary>
        /// Check the Publishing queue and determine whether the given TcmUri is already present in the queue.
        /// </summary>
        /// <param name="engine">Engine object</param>
        /// <param name="tcmUri">String representing the tcmuri of the item to check</param>
        /// <param name="state">PublishTransactionState the publish state to filter on</param>
        public static bool IsInPublishingQueue(Engine engine, String tcmUri, PublishTransactionState state)
        {
            Log.Debug(String.Format("Check Publishing queue for item '{0}'", tcmUri));

            Session session = engine.GetSession();
            PublishTransactionsFilter filter = new PublishTransactionsFilter(session);

            filter.PublishTransactionState = state;
            RepositoryLocalObject item = engine.GetObject(tcmUri) as RepositoryLocalObject;

            if (item != null)
            {
                filter.ForRepository = item.ContextRepository;
            }

            PublicationTarget publicationTarget = engine.PublishingContext.PublicationTarget;

            if (publicationTarget != null)
            {
                filter.PublicationTarget = publicationTarget;
            }

            XmlElement          element          = PublishEngine.GetListPublishTransactions(filter);
            XmlNamespaceManager namespaceManager = new XmlNamespaceManager(new NameTable());

            namespaceManager.AddNamespace("tcm", "http://www.tridion.com/ContentManager/5.0");

            String      xPath    = String.Format("tcm:ListPublishTransactions/tcm:Item[@ItemID='{0}']", tcmUri);
            XmlNodeList nodeList = element.SelectNodes(xPath, namespaceManager);

            return(nodeList.Count > 0);
        }
        public static bool IsSiteEditEnabled(this PublicationTarget target)
        {
            try
            {
                if (target == null)
                {
                    return(true);
                }
                ApplicationData appData = target.LoadApplicationData("SiteEdit");
                string          data    = Encoding.UTF8.GetString(appData.Data);
                XmlDocument     xmlDoc  = new XmlDocument();
                xmlDoc.LoadXml(data);

                XmlNamespaceManager nsManager = new XmlNamespaceManager(new NameTable());
                nsManager.AddNamespace("se", "http://www.sdltridion.com/2011/SiteEdit");

                XmlNode seNode = xmlDoc.SelectSingleNode("/se:configuration/se:PublicationTarget/se:EnableSiteEdit",
                                                         nsManager);
                if (seNode != null && seNode.InnerText.Equals("true"))
                {
                    return(true);
                }
                return(false);
            }
            catch (Exception)
            {
                // Quick and dirty fix
                return(false);
            }
        }
        /// <summary>
        /// Get 'current' PublishTransaction. It tries to identify a PublishTransaction from the publish queue that is on the
        /// given TcmUri, Publication, User, etc.
        /// </summary>
        /// <param name="engine">Engine object</param>
        /// <param name="tcmUri">String representing the tcmuri of the item to check</param>
        /// <returns>PublishTransaction if found; or null, otherwise</returns>
        private static PublishTransaction FindPublishTransaction(Engine engine, String tcmUri)
        {
            Log.Debug(String.Format("Find PublishTransaction for item '{0}'", tcmUri));

            PublishTransaction        result  = null;
            Session                   session = engine.GetSession();
            PublishTransactionsFilter filter  = new PublishTransactionsFilter(session);

            filter.PublishTransactionState = PublishTransactionState.Resolving;
            RepositoryLocalObject item = engine.GetObject(tcmUri) as RepositoryLocalObject;

            if (item != null)
            {
                filter.ForRepository = item.ContextRepository;
            }

            PublicationTarget publicationTarget = engine.PublishingContext.PublicationTarget;

            if (publicationTarget != null)
            {
                filter.PublicationTarget = publicationTarget;
            }

            XmlElement element = PublishEngine.GetListPublishTransactions(filter);


            XmlNamespaceManager namespaceManager = new XmlNamespaceManager(new NameTable());

            namespaceManager.AddNamespace("tcm", "http://www.tridion.com/ContentManager/5.0");

            String      xPath    = String.Format("tcm:ListPublishTransactions/tcm:Item[@ItemID='{0}']", tcmUri);
            XmlNodeList nodeList = element.SelectNodes(xPath, namespaceManager);

            String transactionId;

            if (nodeList != null && nodeList.Count == 1)
            {
                transactionId = nodeList[0].Attributes["ID"].Value;
                TcmUri transactionUri = new TcmUri(transactionId);
                result = new PublishTransaction(transactionUri, session);
            }
            else
            {
                foreach (XmlNode node in element.ChildNodes)
                {
                    transactionId = node.Attributes["ID"].Value;
                    TcmUri transactionUri = new TcmUri(transactionId);
                    result = new PublishTransaction(transactionUri, session);
                    if (IsPublishTransactionForTcmUri(result, tcmUri))
                    {
                        break;
                    }
                    result = null;
                }
            }

            Log.Debug("Returning PublishTransaction " + result);
            return(result);
        }
        /// <summary>
        /// Determines whether item is published in the current publication context.
        /// </summary>
        /// <param name="identifiableObject">The item <see cref="Tridion.ContentManager.IdentifiableObject"/>.</param>
        /// <param name="publicationTarget">The publication target <see cref="Tridion.ContentManager.CommunicationManagement.PublicationTarget"/>.</param>
        /// <returns>
        ///   <c>true</c> if item is published in current publication context, otherwise <c>false</c>.
        /// </returns>
        public static bool IsPublished(this IdentifiableObject identifiableObject, PublicationTarget publicationTarget)
        {
            if (identifiableObject != null && publicationTarget != null)
            {
                return(PublishEngine.IsPublished(identifiableObject, publicationTarget, true));
            }

            return(false);
        }
        /// <summary>
        /// Execute the transformation for the specified template
        /// </summary>
        /// <param name="Engine"><see cref="T:Tridion.ContentManager.Templating.Engine"/>.</param>
        /// <param name="Package"><see cref="T:Tridion.ContentManager.Templating.Package"/></param>
        public void Transform(Engine Engine, Package Package)
        {
            try
            {
                mTicksStart = Environment.TickCount;

                mEngine  = Engine;
                mPackage = Package;

                // Actual template transformation
                PreTransform();
                Transform();
                PostTransform();
            }
            catch (Exception ex)
            {
                String exceptionStack = LoggerExtensions.TraceException(ex);

                Logger.Error("TemplateBase.Transform Exception\n" + exceptionStack);

                StringBuilder sb = new StringBuilder();
                sb.AppendLine(ex.Message);
                sb.AppendFormat("Publisher: {0}\n", Environment.MachineName);
                sb.Append(exceptionStack);

                // Re-throw to ensure Tridion knows what happened
                throw new Exception(sb.ToString(), ex);
            }
            // Ensure we always clean up, no matter what happens during the template transformation
            finally
            {
                Logger.Info("{0}: Render time {1:0.00000} seconds @ {2:dd/MM/yyyy hh:mm:ss tt} ", this.GetType().FullName, ProcessedTime / 1000.0, DateTime.Now);

                // Do not cache objects across template transformations
                ItemFieldsFactory.ClearCache();

                // Clear published binaries list if it was used
                if (mPublishedBinaries.IsValueCreated)
                {
                    mPublishedBinaries.Value.Clear();
                }

                mPackage = null;
                mEngine  = null;
                mLogger  = null;

                mComponent         = null;
                mComponentTemplate = null;
                mPage               = null;
                mPageTemplate       = null;
                mRootStructureGroup = null;
                mPublication        = null;
                mPublishTransaction = null;
                mPublishingUser     = null;
                mPublicationTarget  = null;
            }
        }
        /// <summary>
        /// Gets the approved version of the item being rendered for the current target.
        /// </summary>
        /// <param name="item">The item in question.</param>
        /// <param name="target">The target you're publishing to.</param>
        /// <returns>Either the same version or a later version if in workflow and its approval status is high enough for this target</returns>
        private VersionedItem GetApprovedVersionForTarget(VersionedItem item, PublicationTarget target)
        {
            bool isPreview = false;

            if (!item.LockType.HasFlag(LockType.InWorkflow))
            {
                return(item);
            }
            if (target == null)
            {
                isPreview = true;
            }
            if (!isPreview && target.Id == TcmUri.UriNull)
            {
                isPreview = true;
            }
            if (item is Page)
            {
                Page pageInWorkflow =
                    (Page)_engine.GetObject(new TcmUri(item.Id.ItemId, item.Id.ItemType, item.Id.PublicationId, 0));
                if (isPreview)
                {
                    return(pageInWorkflow);
                }
                int targetApprovalStatus;
                if (target.MinApprovalStatus == null)
                {
                    targetApprovalStatus = 0;
                }
                else
                {
                    targetApprovalStatus = target.MinApprovalStatus.Position;
                }

                return(pageInWorkflow.ApprovalStatus.Position >= targetApprovalStatus
                               ? pageInWorkflow
                               : item);
            }
            if (item is Component)
            {
                Component componentInWorkflow =
                    (Component)_engine.GetObject(new TcmUri(item.Id.ItemId, item.Id.ItemType, item.Id.PublicationId, 0));
                if (isPreview)
                {
                    return(componentInWorkflow);
                }
                return(componentInWorkflow.ApprovalStatus.Position >= target.MinApprovalStatus.Position
                           ? componentInWorkflow
                           : item);
            }
            return(item);
        }
        private static string GetPublishedDate(Page page, PublicationTarget target)
        {
            ICollection <PublishInfo> publishInfos = PublishEngine.GetPublishInfo(page);

            foreach (PublishInfo publishInfo in publishInfos)
            {
                if (publishInfo.PublicationTarget == target)
                {
                    return(publishInfo.PublishedAt.GetIso8601Date());
                }
            }
            return("");
        }
Ejemplo n.º 12
0
        public static bool IsPublicationTargetXpmEnabled(PublicationTarget publicationTarget)
        {
            ApplicationData appData = publicationTarget?.LoadApplicationData(SiteEditApplicationId);

            if (appData == null)
            {
                return(false);
            }

            ApplicationDataAdapter ada        = new ApplicationDataAdapter(appData);
            XmlElement             appDataXml = ada.GetAs <XmlElement>();

            return(appDataXml?.SelectSingleNode("self::se:configuration/se:PublicationTarget[se:EnableSiteEdit = 'true']", GetSeNamespaceManager()) != null);
        }
        public void Transform(Engine engine, Package package)
        {
            if (engine.PublishingContext.PublicationTarget == null)
            {
                // Template Builder
                SetValue(package, false);
                return;
            }
            PublicationTarget target = engine.PublishingContext.PublicationTarget;

            if (target.Id == TcmUri.UriNull)
            {
                // Content Manager Preview, we might need markup since this may be UI's Update Preview
                SetValue(package, true);
                return;
            }
            if (target.LoadApplicationData("SiteEdit") == null)
            {
                // No App Data for this target, no SiteEdit
                SetValue(package, false);
                return;
            }

            ApplicationData appData = target.LoadApplicationData("SiteEdit");
            string          data    = Encoding.UTF8.GetString(appData.Data);

            XmlDocument seConfig = new XmlDocument();

            seConfig.LoadXml(data);

            XmlNamespaceManager nsManager = new XmlNamespaceManager(new NameTable());

            nsManager.AddNamespace("se", "http://www.sdltridion.com/2011/SiteEdit");
            XmlNode seNode = seConfig.SelectSingleNode("/se:configuration/se:PublicationTarget/se:EnableSiteEdit", nsManager);

            if (seNode != null && seNode.InnerText.Equals("true"))
            {
                SetValue(package, true);
                return;
            }
            SetValue(package, false);
        }
 public static bool IsPublicationTargetXpmEnabled(PublicationTarget publicationTarget)
 {
     bool enabled = false;
     if (publicationTarget != null)
     {
         ApplicationData appData = publicationTarget.LoadApplicationData(SiteEditApplicationId);
         if (appData != null)
         {
             ApplicationDataAdapter ada = new ApplicationDataAdapter(appData);
             XmlElement appDataXml = ada.GetAs<XmlElement>();
             if (appDataXml != null)
             {
                 if (appDataXml.SelectSingleNode("self::se:configuration/se:PublicationTarget[se:EnableSiteEdit = 'true']", GetSeNamespaceManager()) != null)
                 {
                     enabled = true;
                 }
             }
         }
     }
     return enabled;
 }
Ejemplo n.º 15
0
        public void Transform(Engine engine, Package package)
        {
            _log    = TemplatingLogger.GetLogger(GetType());
            _engine = engine;

            string itemName = string.Empty;

            if (package.GetByName(Package.ComponentName) != null)
            {
                itemName = Package.ComponentName;
            }
            if (package.GetByName(Package.PageName) != null)
            {
                itemName = Package.PageName;
            }

            if (string.IsNullOrEmpty(itemName))
            {
                _log.Debug("Could not determine template type, exiting");
                return;
            }

            VersionedItem item = (VersionedItem)engine.GetObject(package.GetByName(itemName));

            if (item.LockType.HasFlag(LockType.InWorkflow))
            {
                CurrentMode   mode = GetCurrentMode();
                VersionedItem w    = item.GetVersion(0);
                switch (mode)
                {
                case CurrentMode.CmePreview:
                case CurrentMode.TemplateBuilder:
                case CurrentMode.SessionPreview:
                    // return workflow object without comparing to Publication Target Minimum Approval Status
                    package.Remove(package.GetByName(itemName));
                    if (itemName.Equals(Package.ComponentName))
                    {
                        package.PushItem(Package.ComponentName, package.CreateTridionItem(ContentType.Component, w));
                    }
                    else if (itemName.Equals(Package.PageName))
                    {
                        package.PushItem(Package.PageName, package.CreateTridionItem(ContentType.Page, w));
                    }
                    break;

                case CurrentMode.Publish:
                    PublicationTarget target        = _engine.PublishingContext.PublicationTarget;
                    ApprovalStatus    targetStatus  = target.MinApprovalStatus;
                    ApprovalStatus    contentStatus = null;
                    if (w is Component)
                    {
                        contentStatus = ((Component)w).ApprovalStatus;
                    }
                    else if (w is Page)
                    {
                        contentStatus = ((Page)w).ApprovalStatus;
                    }
                    if (contentStatus == null)
                    {
                        _log.Debug("Could not determine approval status of content. Exiting.");
                        return;
                    }
                    bool mustUpdate = false;
                    if (targetStatus == null)
                    {
                        mustUpdate = true;
                    }
                    else
                    {
                        if (contentStatus.Position > targetStatus.Position)
                        {
                            mustUpdate = true;
                        }
                    }

                    if (mustUpdate)
                    {
                        package.Remove(package.GetByName(itemName));
                        if (itemName.Equals(Package.ComponentName))
                        {
                            package.PushItem(Package.ComponentName, package.CreateTridionItem(ContentType.Component, w));
                        }
                        else if (itemName.Equals(Package.PageName))
                        {
                            package.PushItem(Package.PageName, package.CreateTridionItem(ContentType.Page, w));
                        }
                    }
                    break;
                }
            }
        }
        /// <summary>
        /// Gets the approved version of the item being rendered for the current target.
        /// </summary>
        /// <param name="item">The item in question.</param>
        /// <param name="target">The target you're publishing to.</param>
        /// <returns>Either the same version or a later version if in workflow and its approval status is high enough for this target</returns>
        private VersionedItem GetApprovedVersionForTarget(VersionedItem item, PublicationTarget target)
        {
            bool isPreview = false;
            if (!item.LockType.HasFlag(LockType.InWorkflow))
                return item;
            if (target == null)
            {
                isPreview = true;
            }
            if (!isPreview && target.Id == TcmUri.UriNull)
            {
                isPreview = true;
            }
            if (item is Page)
            {
                Page pageInWorkflow =
                    (Page)_engine.GetObject(new TcmUri(item.Id.ItemId, item.Id.ItemType, item.Id.PublicationId, 0));
                if (isPreview) return pageInWorkflow;
                int targetApprovalStatus;
                if (target.MinApprovalStatus == null)
                    targetApprovalStatus = 0;
                else
                    targetApprovalStatus = target.MinApprovalStatus.Position;

                return pageInWorkflow.ApprovalStatus.Position >= targetApprovalStatus
                               ? pageInWorkflow
                               : item;
            }
            if (item is Component)
            {
                Component componentInWorkflow =
                   (Component)_engine.GetObject(new TcmUri(item.Id.ItemId, item.Id.ItemType, item.Id.PublicationId, 0));
                if (isPreview) return componentInWorkflow;
                return componentInWorkflow.ApprovalStatus.Position >= target.MinApprovalStatus.Position
                           ? componentInWorkflow
                           : item;
            }
            return item;
        }
 /// <summary>
 /// Publishes a <see cref="T:Tridion.ContentManager.IdentifiableObject"/> to a given <see cref="T:Tridion.ContentManager.CommunicationManagement.PublicationTarget"/> and
 /// with <see cref="T:Tridion.ContentManager.Publishing.PublishPriority"/>
 /// </summary>
 /// <param name="PublishUser"><see cref="T:Tridion.ContentManager.Security.User"/></param>
 /// <param name="Item"><see cref="T:Tridion.ContentManager.IdentifiableObject"/></param>
 /// <param name="Target"><see cref="T:Tridion.ContentManager.CommunicationManagement.PublicationTarget"/></param>
 /// <param name="Priority"><see cref="T:Tridion.ContentManager.Publishing.PublishPriority"/></param>
 public void PublishItem(User PublishUser, IdentifiableObject Item, PublicationTarget Target, PublishPriority Priority)
 {
     PublishItem(PublishingUser, Item, Engine.PublishingContext.PublicationTarget, PublishTransaction.Priority, DateTime.Now);
 }
 private static string GetPublishedDate(Page page, PublicationTarget target )
 {
     ICollection<PublishInfo> publishInfos = PublishEngine.GetPublishInfo(page);
     foreach (PublishInfo publishInfo in publishInfos)
     {
         if (publishInfo.PublicationTarget == target)
         {
             return publishInfo.PublishedAt.GetIso8601Date();
         }
     }
     return "";
 }
Ejemplo n.º 19
0
 /// <summary>
 /// Check if current Tridion item is published to specified publication target
 /// </summary>
 /// <param name="item"></param>
 /// <param name="publicationTarget"></param>
 /// <returns></returns>
 protected bool IsPublishedToTarget(RepositoryLocalObject item, PublicationTarget publicationTarget)
 {
     Boolean isPublished = false;
     ICollection<PublishInfo> publishInfoList = PublishEngine.GetPublishInfo(item);
     foreach (PublishInfo publishInfo in publishInfoList)
     {
         if (publishInfo.PublicationTarget.Equals(publicationTarget))
         {
             isPublished = true;
             break;
         }
     }
     return isPublished;
 }
        /// <summary>
        /// Retrieve the <see cref="T:Tridion.ContentManager.IdentifiableObject" /> published information
        /// </summary>
        /// <param name="identifiableObject"><see cref="T:Tridion.ContentManager.IdentifiableObject" /></param>
        /// <param name="publicationTarget">Publication target <see cref="T:Tridion.ContentManager.CommunicationManagement.PublicationTarget"/> to filter on.</param>
        /// <returns>
        ///   <see cref="T:Tridion.ContentManager.Publishing.PublishInfo" />
        /// </returns>
        public static IEnumerable <PublishInfo> PublishInfo(this IdentifiableObject identifiableObject, PublicationTarget publicationTarget)
        {
            if (identifiableObject != null && publicationTarget != null)
            {
                ICollection <PublishInfo> publishInfos = PublishEngine.GetPublishInfo(identifiableObject);

                if (publishInfos != null && publishInfos.Count > 0)
                {
                    return(publishInfos.Where(x => x.PublicationTarget.Id == publicationTarget.Id));
                }
            }

            return(new PublishInfo[] { });
        }
        /// <summary>
        /// Returns the last publish date in the given <see cref="T:Tridion.ContentManager.CommunicationManagement.Publication" /> and
        /// given <see cref="T:Tridion.ContentManager.CommunicationManagement.PublicationTarget" />
        /// </summary>
        /// <param name="identifiableObject"><see cref="T:Tridion.ContentManager.ContentManagement.RepositoryLocalObject" /></param>
        /// <param name="publication"><see cref="T:Tridion.ContentManager.CommunicationManagement.Publication" /></param>
        /// <param name="publicationTarget"><see cref="T:Tridion.ContentManager.CommunicationManagement.PublicationTarget" /></param>
        /// <returns>
        /// Returns <see cref="T:System.DateTime" /> or DateTime.MinValue
        /// </returns>
        public static DateTime PublishedAt(this IdentifiableObject identifiableObject, Publication publication, PublicationTarget publicationTarget)
        {
            if (identifiableObject != null && publication != null && publicationTarget != null)
            {
                PublishInfo info = identifiableObject.PublishInfo(publication, publicationTarget).FirstOrDefault();

                if (info != null)
                    return info.PublishedAt;
            }

            return default(DateTime);
        }
        /// <summary>
        /// Returns the last publish date in the given <see cref="T:Tridion.ContentManager.CommunicationManagement.Publication" /> and
        /// given <see cref="T:Tridion.ContentManager.CommunicationManagement.PublicationTarget" />
        /// </summary>
        /// <param name="identifiableObject"><see cref="T:Tridion.ContentManager.ContentManagement.RepositoryLocalObject" /></param>
        /// <param name="publication"><see cref="T:Tridion.ContentManager.CommunicationManagement.Publication" /></param>
        /// <param name="publicationTarget"><see cref="T:Tridion.ContentManager.CommunicationManagement.PublicationTarget" /></param>
        /// <returns>
        /// Returns <see cref="T:System.DateTime" /> or DateTime.MinValue
        /// </returns>
        public static DateTime PublishedAt(this IdentifiableObject identifiableObject, Publication publication, PublicationTarget publicationTarget)
        {
            if (identifiableObject != null && publication != null && publicationTarget != null)
            {
                PublishInfo info = identifiableObject.PublishInfo(publication, publicationTarget).FirstOrDefault();

                if (info != null)
                {
                    return(info.PublishedAt);
                }
            }

            return(default(DateTime));
        }
        /// <summary>
        /// Retrieve the <see cref="T:Tridion.ContentManager.IdentifiableObject" /> published information
        /// </summary>
        /// <param name="Object"><see cref="T:Tridion.ContentManager.IdentifiableObject" /></param>
        /// <param name="PublicationTarget">Publication target <see cref="T:Tridion.ContentManager.CommunicationManagement.PublicationTarget"/> to filter on.</param>
        /// <returns>
        ///   <see cref="T:Tridion.ContentManager.Publishing.PublishInfo" />
        /// </returns>
        public static IEnumerable<PublishInfo> PublishInfo(this IdentifiableObject identifiableObject, Publication publication, PublicationTarget publicationTarget)
        {
            if (identifiableObject != null && publication != null && publicationTarget != null)
            {
                ICollection<PublishInfo> publishInfos = PublishEngine.GetPublishInfo(identifiableObject);

                if (publishInfos != null && publishInfos.Count > 0)
                    return publishInfos.Where(x => x.Publication.Id == publication.Id && x.PublicationTarget.Id == publicationTarget.Id);
            }

            return null;
        }