Skip to content

Commit

Permalink
feat: updates to activity admin management
Browse files Browse the repository at this point in the history
  • Loading branch information
yokwejuste committed Mar 1, 2024
1 parent 3c3b04b commit a533305
Show file tree
Hide file tree
Showing 3 changed files with 127 additions and 36 deletions.
131 changes: 95 additions & 36 deletions zubhub_backend/zubhub/activities/admin.py
Original file line number Diff line number Diff line change
@@ -1,49 +1,108 @@
from django.conf import settings
from django.contrib import admin
from django.contrib import messages

from .models import Activity


def make_unpublished(modeladmin, request, queryset):
"""
This function is used to unpublish selected activities
"""
queryset.update(publish=False)
messages.success(request, "Selected records were unpublished successfully.")


make_unpublished.short_description = "Unpublish selected activities"


def make_published(modeladmin, request, queryset):
"""
This function is used to publish selected activities
"""
queryset = queryset.filter(publish=False)
queryset.update(publish=True)
messages.success(request, "Selected records were published successfully.")


make_published.short_description = "Publish selected activities"


def delete_selected(modeladmin, request, queryset):
"""
This function is used to delete selected activities
"""
queryset.delete()
messages.success(request, "Selected records were deleted successfully.")


delete_selected.short_description = "Delete selected activities"
from .models import Activity, ActivityImage, ActivityMakingStep, Image
from .tasks import delete_file_task


class ActivityAdmin(admin.ModelAdmin):
list_display = ('title', 'id', 'created_on', 'publish')
list_filter = ('created_on', 'publish',)
search_fields = ('title', 'id', 'category',)
ordering = ['-created_on']
actions = [make_unpublished, delete_selected, make_published]
actions = ['publish', 'un_publish', 'delete_selected']

def un_publish(self, request, queryset):
"""
This function is used to unpublish selected activities
"""
queryset.update(publish=False)
messages.success(request, "Selected records were unpublished successfully.")

def publish(self, request, queryset):
"""
This function is used to publish selected activities
"""
queryset = queryset.filter(publish=False)
queryset.update(publish=True)
messages.success(request, "Selected records were published successfully.")

def delete_selected(self, request, queryset):
"""
This function is used to delete selected activities
"""
queryset.delete()
messages.success(request, "Selected records were deleted successfully.")

un_publish.short_description = "Unpublish selected activities"
publish.short_description = "Publish selected activities"
delete_selected.short_description = "Delete selected activities"

def get_readonly_fields(self, request, obj=None):
return ['id', 'created_on', 'views_count', 'saved_by', 'views']

def save_model(self, request, obj, form, change):
super().save_model(request, obj, form, change)

if change:
old = Activity.objects.get(pk=obj.pk)
new = Activity.objects.get(pk=obj.pk)

if (old.video.find("cloudinary.com") > -1 or old.video.startswith(
"{0}://{1}".format(settings.DEFAULT_MEDIA_SERVER_PROTOCOL,
settings.DEFAULT_MEDIA_SERVER_DOMAIN))) and old.video != new.video:
delete_file_task.delay(old.video)


class ActivityImageAdmin(admin.ModelAdmin):
search_fields = ['activity__title', 'activity__id', 'image__public_id']
list_display = ['activity', 'image']

def delete_model(self, request, obj):
"""
This function is used to delete the activity image
"""
delete_file_task.delay(obj.image.file_url)
obj.delete()

def delete_queryset(self, request, queryset):
"""
This function is used to delete the activity image
"""
for obj in queryset:
delete_file_task.delay(obj.image.file_url)
queryset.delete()


class ImageAdmin(admin.ModelAdmin):
search_fields = ['public_id']
list_display = ['public_id', 'file_url']

def delete_model(self, request, obj):
"""
This function is used to delete the image
"""
delete_file_task.delay(obj.file_url)
obj.delete()


class ActivityMakingStepAdmin(admin.ModelAdmin):
search_fields = ['activity__title', 'title']
list_display = ['activity', 'title']
list_filter = ['activity', 'title']

def delete_model(self, request, obj):
"""
This function is used to delete the activity making step
"""
for img in obj.image.all():
delete_file_task.delay(img.file_url)
img.delete()
obj.delete()


admin.site.register(Activity, ActivityAdmin)
admin.site.register(ActivityImage, ActivityImageAdmin)
admin.site.register(Image, ImageAdmin)
admin.site.register(ActivityMakingStep, ActivityMakingStepAdmin)
15 changes: 15 additions & 0 deletions zubhub_backend/zubhub/activities/signals.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import os
from django.conf import settings
from django.db.models.signals import pre_delete
from django.dispatch import receiver
from .models import Activity, ActivityImage, Image

@receiver(pre_delete, sender=Activity)
def delete_activity_images(sender, instance, **kwargs):
ActivityImage.objects.filter(activity=instance).delete()

images = Image.objects.filter(activity=instance)
for image in images:
if os.path.isfile(os.path.join(settings.MEDIA_ROOT, str(image.file))):
os.remove(os.path.join(settings.MEDIA_ROOT, str(image.file)))
images.delete()
17 changes: 17 additions & 0 deletions zubhub_backend/zubhub/activities/tasks.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from random import uniform
from celery import shared_task


@shared_task(bind=True, acks_late=True, max_retries=10)
def delete_file_task(self, url):
from zubhub.utils import delete_file_from_media_server
try:
res = delete_file_from_media_server(url)

res = res.json()
if res["result"] != "ok" and res["result"]['HTTPStatusCode'] != 204:
raise Exception()

except Exception as e:
raise self.retry(exc=e, countdown=int(
uniform(2, 4) ** self.request.retries))

0 comments on commit a533305

Please sign in to comment.