igny8-wp int
This commit is contained in:
@@ -818,6 +818,11 @@ class ContentViewSet(SiteSectorModelViewSet):
|
||||
request=request
|
||||
)
|
||||
|
||||
# OPTIMISTIC UPDATE: Set status to published immediately for better UX
|
||||
# The Celery task will update external_id and external_url when WordPress responds
|
||||
content.status = 'published'
|
||||
content.save(update_fields=['status', 'updated_at'])
|
||||
|
||||
# Queue publishing task (same as automated flow)
|
||||
try:
|
||||
result = publish_content_to_wordpress.delay(
|
||||
@@ -825,28 +830,123 @@ class ContentViewSet(SiteSectorModelViewSet):
|
||||
site_integration_id=site_integration.id
|
||||
)
|
||||
|
||||
logger.info(f"[ContentViewSet.publish] Queued Celery task {result.id} for content {content.id}")
|
||||
logger.info(f"[ContentViewSet.publish] Queued Celery task {result.id} for content {content.id}, status set to 'published'")
|
||||
|
||||
return success_response(
|
||||
data={
|
||||
'content_id': content.id,
|
||||
'task_id': result.id,
|
||||
'status': 'queued',
|
||||
'status': 'published',
|
||||
'message': 'Publishing queued - content will be published to WordPress shortly'
|
||||
},
|
||||
message='Content publishing queued successfully',
|
||||
message='Content status updated to published and queued for WordPress',
|
||||
request=request,
|
||||
status_code=status.HTTP_202_ACCEPTED
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"[ContentViewSet.publish] Error queuing publish task: {str(e)}", exc_info=True)
|
||||
# Revert status on error
|
||||
content.status = 'review'
|
||||
content.save(update_fields=['status', 'updated_at'])
|
||||
return error_response(
|
||||
error=f"Failed to queue publishing task: {str(e)}",
|
||||
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||||
request=request
|
||||
)
|
||||
|
||||
@action(detail=True, methods=['get'], url_path='wordpress_status', url_name='wordpress_status')
|
||||
def wordpress_status(self, request, pk=None):
|
||||
"""
|
||||
Get WordPress post status for published content.
|
||||
Calls WordPress REST API to get current status.
|
||||
|
||||
GET /api/v1/writer/content/{id}/wordpress_status/
|
||||
Returns: {
|
||||
'wordpress_status': 'publish'|'draft'|'pending'|null,
|
||||
'external_id': 123,
|
||||
'external_url': 'https://...',
|
||||
'last_checked': '2025-11-30T...'
|
||||
}
|
||||
"""
|
||||
import requests
|
||||
from django.utils import timezone
|
||||
from igny8_core.business.integration.models import SiteIntegration
|
||||
import logging
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
content = self.get_object()
|
||||
|
||||
if not content.external_id:
|
||||
return success_response(
|
||||
data={
|
||||
'wordpress_status': None,
|
||||
'external_id': None,
|
||||
'external_url': None,
|
||||
'message': 'Content not published to WordPress yet'
|
||||
},
|
||||
request=request
|
||||
)
|
||||
|
||||
# Get WordPress integration for this content's site
|
||||
try:
|
||||
site_integration = SiteIntegration.objects.filter(
|
||||
site=content.site,
|
||||
platform='wordpress',
|
||||
is_active=True
|
||||
).first()
|
||||
|
||||
if not site_integration:
|
||||
return error_response(
|
||||
error='No active WordPress integration found',
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
request=request
|
||||
)
|
||||
|
||||
# Call WordPress REST API to get post status
|
||||
wordpress_url = f"{site_integration.site_url}/wp-json/igny8/v1/post-status/{content.external_id}/"
|
||||
headers = {
|
||||
'X-IGNY8-API-KEY': site_integration.api_key,
|
||||
}
|
||||
|
||||
response = requests.get(wordpress_url, headers=headers, timeout=10)
|
||||
|
||||
if response.status_code == 200:
|
||||
wp_data = response.json().get('data', {})
|
||||
return success_response(
|
||||
data={
|
||||
'wordpress_status': wp_data.get('post_status'),
|
||||
'external_id': content.external_id,
|
||||
'external_url': content.external_url,
|
||||
'post_title': wp_data.get('post_title'),
|
||||
'post_modified': wp_data.get('post_modified'),
|
||||
'last_checked': timezone.now().isoformat()
|
||||
},
|
||||
request=request
|
||||
)
|
||||
else:
|
||||
logger.error(f"WordPress API error: {response.status_code} - {response.text}")
|
||||
return error_response(
|
||||
error=f'Failed to get WordPress status: {response.status_code}',
|
||||
status_code=status.HTTP_502_BAD_GATEWAY,
|
||||
request=request
|
||||
)
|
||||
|
||||
except requests.RequestException as e:
|
||||
logger.error(f"Request to WordPress failed: {str(e)}")
|
||||
return error_response(
|
||||
error=f'Connection to WordPress failed: {str(e)}',
|
||||
status_code=status.HTTP_502_BAD_GATEWAY,
|
||||
request=request
|
||||
)
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting WordPress status: {str(e)}", exc_info=True)
|
||||
return error_response(
|
||||
error=str(e),
|
||||
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||||
request=request
|
||||
)
|
||||
|
||||
@action(detail=True, methods=['post'], url_path='unpublish', url_name='unpublish', permission_classes=[IsAuthenticatedAndActive, IsEditorOrAbove])
|
||||
def unpublish(self, request, pk=None):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user