Files
igny8/backend/igny8_core/business/publishing/admin.py
2025-12-20 02:46:00 +00:00

118 lines
4.6 KiB
Python

from django.contrib import admin
from django.contrib import messages
from unfold.admin import ModelAdmin
from igny8_core.admin.base import SiteSectorAdminMixin, Igny8ModelAdmin
from .models import PublishingRecord, DeploymentRecord
from import_export.admin import ExportMixin
from import_export import resources
class PublishingRecordResource(resources.ModelResource):
"""Resource class for exporting Publishing Records"""
class Meta:
model = PublishingRecord
fields = ('id', 'content__title', 'site__name', 'sector__name', 'destination',
'status', 'destination_url', 'published_at', 'created_at')
export_order = fields
@admin.register(PublishingRecord)
class PublishingRecordAdmin(ExportMixin, SiteSectorAdminMixin, Igny8ModelAdmin):
resource_class = PublishingRecordResource
list_display = [
'content',
'site',
'sector',
'destination',
'status',
'destination_url',
'published_at',
]
list_filter = ['destination', 'status', 'site']
search_fields = ['content__title', 'destination', 'destination_url']
readonly_fields = ['created_at', 'updated_at']
actions = [
'bulk_retry_failed',
'bulk_cancel_pending',
'bulk_mark_published',
]
def bulk_retry_failed(self, request, queryset):
"""Retry failed publishing records"""
failed_records = queryset.filter(status='failed')
count = failed_records.update(status='pending')
self.message_user(request, f'{count} failed record(s) marked for retry.', messages.SUCCESS)
bulk_retry_failed.short_description = 'Retry failed publishes'
def bulk_cancel_pending(self, request, queryset):
"""Cancel pending publishing records"""
pending = queryset.filter(status__in=['pending', 'publishing'])
count = pending.update(status='failed', error_message='Cancelled by admin')
self.message_user(request, f'{count} publishing record(s) cancelled.', messages.SUCCESS)
bulk_cancel_pending.short_description = 'Cancel pending publishes'
def bulk_mark_published(self, request, queryset):
"""Mark selected records as published"""
from django.utils import timezone
count = queryset.update(status='published', published_at=timezone.now())
self.message_user(request, f'{count} record(s) marked as published.', messages.SUCCESS)
bulk_mark_published.short_description = 'Mark as published'
class DeploymentRecordResource(resources.ModelResource):
"""Resource class for exporting Deployment Records"""
class Meta:
model = DeploymentRecord
fields = ('id', 'site__name', 'sector__name', 'version', 'deployed_version',
'status', 'deployment_url', 'deployed_at', 'created_at')
export_order = fields
@admin.register(DeploymentRecord)
class DeploymentRecordAdmin(ExportMixin, SiteSectorAdminMixin, Igny8ModelAdmin):
resource_class = DeploymentRecordResource
list_display = [
'site',
'sector',
'version',
'deployed_version',
'status',
'deployment_url',
'deployed_at',
]
list_filter = ['status', 'site']
search_fields = ['site__name', 'deployment_url']
readonly_fields = ['created_at', 'updated_at']
actions = [
'bulk_retry_failed',
'bulk_rollback',
'bulk_cancel_pending',
]
actions = [
'bulk_retry_failed',
'bulk_rollback',
'bulk_cancel_pending',
]
def bulk_retry_failed(self, request, queryset):
"""Retry failed deployments"""
failed = queryset.filter(status='failed')
count = failed.update(status='pending', error_message='')
self.message_user(request, f'{count} failed deployment(s) marked for retry.', messages.SUCCESS)
bulk_retry_failed.short_description = 'Retry failed deployments'
def bulk_rollback(self, request, queryset):
"""Rollback selected deployments"""
deployed = queryset.filter(status='deployed')
count = deployed.update(status='rolled_back')
self.message_user(request, f'{count} deployment(s) marked for rollback.', messages.SUCCESS)
bulk_rollback.short_description = 'Rollback deployments'
def bulk_cancel_pending(self, request, queryset):
"""Cancel pending deployments"""
pending = queryset.filter(status__in=['pending', 'deploying'])
count = pending.update(status='failed', error_message='Cancelled by admin')
self.message_user(request, f'{count} deployment(s) cancelled.', messages.SUCCESS)
bulk_cancel_pending.short_description = 'Cancel pending deployments'