Revert "123"

This reverts commit 5f25631329.
This commit is contained in:
alorig
2025-11-28 13:04:24 +05:00
parent 5f25631329
commit 10ec7fb33b
9 changed files with 133 additions and 405 deletions

View File

@@ -10,57 +10,16 @@ from django.shortcuts import get_object_or_404
from django.utils import timezone
from typing import Dict, Any, List
from igny8_core.business.content.models import Content
from igny8_core.business.integration.models import SiteIntegration
from igny8_core.models import ContentPost, SiteIntegration
from igny8_core.tasks.wordpress_publishing import (
publish_content_to_wordpress,
bulk_publish_content_to_wordpress
)
@api_view(['POST'])
@permission_classes([IsAuthenticated])
def simple_publish_content(request) -> Response:
"""
Simple publish endpoint that gets content_id from POST body
POST /api/wordpress/publish/
Body: {"content_id": "123"}
"""
content_id = request.data.get('content_id')
if not content_id:
return Response(
{
'success': False,
'message': 'content_id is required',
'error': 'missing_content_id'
},
status=status.HTTP_400_BAD_REQUEST
)
try:
content_id = int(content_id)
except (ValueError, TypeError):
return Response(
{
'success': False,
'message': 'Invalid content_id format',
'error': 'invalid_content_id'
},
status=status.HTTP_400_BAD_REQUEST
)
# Call the main publish function
return publish_single_content_by_id(request, content_id)
@api_view(['POST'])
@permission_classes([IsAuthenticated])
def publish_single_content(request, content_id: int) -> Response:
"""URL-based publish endpoint"""
return publish_single_content_by_id(request, content_id)
def publish_single_content_by_id(request, content_id: int) -> Response:
"""
Publish a single content item to WordPress
@@ -73,7 +32,7 @@ def publish_single_content_by_id(request, content_id: int) -> Response:
}
"""
try:
content = get_object_or_404(Content, id=content_id)
content = get_object_or_404(ContentPost, id=content_id)
# Check permissions
if not request.user.has_perm('content.change_contentpost'):
@@ -86,23 +45,47 @@ def publish_single_content_by_id(request, content_id: int) -> Response:
status=status.HTTP_403_FORBIDDEN
)
# Check if already published
if content.sync_status == 'success':
# Get site integration
site_integration_id = request.data.get('site_integration_id')
force = request.data.get('force', False)
if site_integration_id:
site_integration = get_object_or_404(SiteIntegration, id=site_integration_id)
else:
# Get default WordPress integration for user's organization
site_integration = SiteIntegration.objects.filter(
platform='wordpress',
is_active=True,
# Add organization filter if applicable
).first()
if not site_integration:
return Response(
{
'success': False,
'message': 'No WordPress integration found',
'error': 'no_integration'
},
status=status.HTTP_400_BAD_REQUEST
)
# Check if already published (unless force is true)
if not force and content.wordpress_sync_status == 'success':
return Response(
{
'success': True,
'message': 'Content already published to WordPress',
'data': {
'content_id': content.id,
'wordpress_post_id': content.external_id,
'wordpress_post_url': content.external_url,
'wordpress_post_id': content.wordpress_post_id,
'wordpress_post_url': content.wordpress_post_url,
'status': 'already_published'
}
}
)
# Check if currently syncing
if content.sync_status == 'syncing':
if content.wordpress_sync_status == 'syncing':
return Response(
{
'success': False,
@@ -113,7 +96,7 @@ def publish_single_content_by_id(request, content_id: int) -> Response:
)
# Validate content is ready for publishing
if not content.title or not content.content_html:
if not content.title or not (content.content_html or content.content):
return Response(
{
'success': False,
@@ -123,23 +106,34 @@ def publish_single_content_by_id(request, content_id: int) -> Response:
status=status.HTTP_400_BAD_REQUEST
)
# For now, just simulate successful publishing (simplified version)
content.sync_status = 'success'
content.external_id = f'wp_{content.id}'
content.external_url = f'https://example-site.com/posts/{content.id}/'
content.save(update_fields=['sync_status', 'external_id', 'external_url'])
# Set status to pending and queue the task
content.wordpress_sync_status = 'pending'
content.save(update_fields=['wordpress_sync_status'])
# Get task_id if content is associated with a writer task
task_id = None
if hasattr(content, 'writer_task'):
task_id = content.writer_task.id
# Queue the publishing task
task_result = publish_content_to_wordpress.delay(
content.id,
site_integration.id,
task_id
)
return Response(
{
'success': True,
'message': 'Content published to WordPress successfully',
'message': 'Content queued for WordPress publishing',
'data': {
'content_id': content.id,
'wordpress_post_id': content.external_id,
'wordpress_post_url': content.external_url,
'status': 'published'
'site_integration_id': site_integration.id,
'task_id': task_result.id,
'status': 'queued'
}
}
},
status=status.HTTP_202_ACCEPTED
)
except Exception as e:

View File

@@ -28,46 +28,45 @@ def publish_content_to_wordpress(self, content_id: int, site_integration_id: int
Dict with success status and details
"""
try:
from igny8_core.business.content.models import Content
from igny8_core.business.integration.models import SiteIntegration
from igny8_core.models import ContentPost, SiteIntegration
# Get content and site integration
try:
content = Content.objects.get(id=content_id)
content = ContentPost.objects.get(id=content_id)
site_integration = SiteIntegration.objects.get(id=site_integration_id)
except (Content.DoesNotExist, SiteIntegration.DoesNotExist) as e:
except (ContentPost.DoesNotExist, SiteIntegration.DoesNotExist) as e:
logger.error(f"Content or site integration not found: {e}")
return {"success": False, "error": str(e)}
# Check if content is ready for publishing
if content.sync_status == 'success':
if content.wordpress_sync_status == 'success':
logger.info(f"Content {content_id} already published to WordPress")
return {"success": True, "message": "Already published", "wordpress_post_id": content.external_id}
return {"success": True, "message": "Already published", "wordpress_post_id": content.wordpress_post_id}
if content.sync_status == 'syncing':
if content.wordpress_sync_status == 'syncing':
logger.info(f"Content {content_id} is currently syncing")
return {"success": False, "error": "Content is currently syncing"}
# Update status to syncing
content.sync_status = 'syncing'
content.save(update_fields=['sync_status'])
content.wordpress_sync_status = 'syncing'
content.save(update_fields=['wordpress_sync_status'])
# Prepare content data for WordPress
content_data = {
'content_id': content.id,
'task_id': task_id,
'title': content.title,
'content_html': content.content_html,
'excerpt': '', # Content model doesn't have brief field
'content_html': content.content_html or content.content,
'excerpt': content.brief or '',
'status': 'publish',
'author_email': None, # Content model doesn't have author field
'author_name': None, # Content model doesn't have author field
'published_at': None, # Content model doesn't have published_at field
'seo_title': content.meta_title or '',
'seo_description': content.meta_description or '',
'featured_image_url': None, # Content model doesn't have featured_image field
'sectors': [], # Content model doesn't have sectors field
'clusters': [{'id': content.cluster.id, 'name': content.cluster.name}] if content.cluster else [],
'author_email': content.author.email if content.author else None,
'author_name': content.author.get_full_name() if content.author else None,
'published_at': content.published_at.isoformat() if content.published_at else None,
'seo_title': getattr(content, 'seo_title', ''),
'seo_description': getattr(content, 'seo_description', ''),
'featured_image_url': content.featured_image.url if content.featured_image else None,
'sectors': [{'id': s.id, 'name': s.name} for s in content.sectors.all()],
'clusters': [{'id': c.id, 'name': c.name} for c in content.clusters.all()],
'tags': getattr(content, 'tags', []),
'focus_keywords': getattr(content, 'focus_keywords', [])
}

View File

@@ -35,7 +35,6 @@ urlpatterns = [
path('api/v1/optimizer/', include('igny8_core.modules.optimizer.urls')), # Optimizer endpoints
path('api/v1/publisher/', include('igny8_core.modules.publisher.urls')), # Publisher endpoints
path('api/v1/integration/', include('igny8_core.modules.integration.urls')), # Integration endpoints
path('api/wordpress/', include('igny8_core.urls.wordpress_publishing')), # WordPress publishing endpoints
# OpenAPI Schema and Documentation
path('api/schema/', SpectacularAPIView.as_view(), name='schema'),
path('api/docs/', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'),

View File

@@ -3,7 +3,6 @@ URL configuration for WordPress publishing endpoints
"""
from django.urls import path
from igny8_core.api.wordpress_publishing import (
simple_publish_content,
publish_single_content,
bulk_publish_content,
get_wordpress_status,
@@ -12,11 +11,6 @@ from igny8_core.api.wordpress_publishing import (
)
urlpatterns = [
# Simple publish endpoint (expects content_id in POST body)
path('publish/',
simple_publish_content,
name='simple_publish_content'),
# Single content publishing
path('content/<int:content_id>/publish-to-wordpress/',
publish_single_content,