Add ability to set featured blogs
This commit is contained in:
parent
74beddbc38
commit
136980b379
@ -1,8 +1,3 @@
|
|||||||
from django.contrib.auth import get_user_model, authenticate, login, logout
|
|
||||||
from django.contrib.auth.models import User
|
|
||||||
from django.db.models import Q
|
|
||||||
from django.urls import reverse
|
|
||||||
from django.utils import timezone
|
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from .models import (
|
from .models import (
|
||||||
UserData,
|
UserData,
|
||||||
@ -59,7 +54,7 @@ class BlogSerializer(serializers.ModelSerializer):
|
|||||||
|
|
||||||
|
|
||||||
class UnifiedCategoryBlogSerializer(serializers.ModelSerializer):
|
class UnifiedCategoryBlogSerializer(serializers.ModelSerializer):
|
||||||
blog_metadata = serializers.SerializerMethodField() # Custom field for related blogs
|
blog_metadata = serializers.SerializerMethodField()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Category
|
model = Category
|
||||||
@ -74,22 +69,18 @@ class UnifiedCategoryBlogSerializer(serializers.ModelSerializer):
|
|||||||
]
|
]
|
||||||
|
|
||||||
def get_blog_metadata(self, obj):
|
def get_blog_metadata(self, obj):
|
||||||
# Serializes all blogs related to the category, assuming `blogs` as the related_name
|
|
||||||
blogs = obj.blogs.all()
|
blogs = obj.blogs.all()
|
||||||
return [{
|
return [{
|
||||||
'blog_id': blog.blog_id, # Using UUID
|
'blog_id': blog.blog_id,
|
||||||
'name': blog.name,
|
'name': blog.name,
|
||||||
'description': blog.description,
|
'description': blog.description,
|
||||||
'cover_image': blog.cover_image,
|
'cover_image': blog.cover_image,
|
||||||
'tagline': blog.tagline,
|
'tagline': blog.tagline,
|
||||||
'parent_category': blog.parent_category.category_id
|
'parent_category': blog.parent_category.category_id
|
||||||
# Assuming parent_category is a reference to a Category object
|
|
||||||
} for blog in blogs]
|
} for blog in blogs]
|
||||||
|
|
||||||
def to_representation(self, instance):
|
def to_representation(self, instance):
|
||||||
representation = super().to_representation(instance)
|
representation = super().to_representation(instance)
|
||||||
# Set a featured blog based on some logic, e.g., the first blog
|
|
||||||
representation['featured_id'] = instance.blogs.first().blog_id if instance.blogs.exists() else None
|
|
||||||
return representation
|
return representation
|
||||||
|
|
||||||
class MediaSerializer(serializers.Serializer):
|
class MediaSerializer(serializers.Serializer):
|
||||||
|
|||||||
@ -81,6 +81,15 @@ function BlogList(props) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const updateFeaturedBlog = (featuredId) => {
|
||||||
|
EditableDataService.updateData(`/data/category/update/${categoryID}/`, {"featured_id": featuredId}).then(response=>{
|
||||||
|
if (featuredId)
|
||||||
|
props.notificationToggler('Blog set as featured')
|
||||||
|
else props.notificationToggler('Featured blog removed')
|
||||||
|
loadBlogs()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
if (GlobalTheme && ThemeConfig) {
|
if (GlobalTheme && ThemeConfig) {
|
||||||
return (
|
return (
|
||||||
<Container fluid className={`mb-2 p-0 ${ThemeConfig[GlobalTheme].background}`}>
|
<Container fluid className={`mb-2 p-0 ${ThemeConfig[GlobalTheme].background}`}>
|
||||||
@ -105,6 +114,8 @@ return (
|
|||||||
<CardListViewer
|
<CardListViewer
|
||||||
key={item.blog_id} // Ensuring keys are unique and correct
|
key={item.blog_id} // Ensuring keys are unique and correct
|
||||||
totalItems={categoryData.blogMetadata.length}
|
totalItems={categoryData.blogMetadata.length}
|
||||||
|
featuredBlog={categoryData.featuredBlog}
|
||||||
|
updateFeaturedBlog={updateFeaturedBlog}
|
||||||
cardType={"smallCard"}
|
cardType={"smallCard"}
|
||||||
resourceType={"blog"}
|
resourceType={"blog"}
|
||||||
textColor={ThemeConfig[GlobalTheme].textColor}
|
textColor={ThemeConfig[GlobalTheme].textColor}
|
||||||
|
|||||||
@ -101,7 +101,7 @@ function Blog(props) {
|
|||||||
return (
|
return (
|
||||||
<Container fluid className={`${ThemeConfig[GlobalTheme].background}`}>
|
<Container fluid className={`${ThemeConfig[GlobalTheme].background}`}>
|
||||||
<ModalComponent modalText={modalText} modalTitle={modalTitle} modal={modal} toggle={toggle} confirmAction={deleteResource}/>
|
<ModalComponent modalText={modalText} modalTitle={modalTitle} modal={modal} toggle={toggle} confirmAction={deleteResource}/>
|
||||||
<MediaUpload setMedia={setCoverImage} notificationToggler={props.notificationToggler} modal={fileModal} toggle={toggleFileModal} resourceType='homepage' resourceId='homepage'></MediaUpload>
|
<MediaUpload setMedia={setCoverImage} notificationToggler={props.notificationToggler} modal={fileModal} toggle={toggleFileModal} resourceType='blog' resourceId={blogData.id}></MediaUpload>
|
||||||
<Col xs="3" className="d-none d-md-block"><Button color={ThemeConfig[GlobalTheme].buttonColor} onClick={() => navigate(`/categories/${blogData.parentCategory}`)} className="ms-5" outline><FontAwesomeIcon icon={faLeftLong}/></Button></Col>
|
<Col xs="3" className="d-none d-md-block"><Button color={ThemeConfig[GlobalTheme].buttonColor} onClick={() => navigate(`/categories/${blogData.parentCategory}`)} className="ms-5" outline><FontAwesomeIcon icon={faLeftLong}/></Button></Col>
|
||||||
<CategoryBar currentPage={blogData.parentCategory} GlobalTheme={GlobalTheme} ThemeConfig={ThemeConfig}/>
|
<CategoryBar currentPage={blogData.parentCategory} GlobalTheme={GlobalTheme} ThemeConfig={ThemeConfig}/>
|
||||||
<Row className="mb-4">
|
<Row className="mb-4">
|
||||||
|
|||||||
@ -79,7 +79,7 @@ function Blogs(props) {
|
|||||||
const addNewCategory = () => {
|
const addNewCategory = () => {
|
||||||
EditableDataService.createData('/data/category/create/', {
|
EditableDataService.createData('/data/category/create/', {
|
||||||
"name": "Enter name",
|
"name": "Enter name",
|
||||||
"featured_blog": "",
|
"featured_id": "",
|
||||||
"description": "Enter description",
|
"description": "Enter description",
|
||||||
"tagline": "Enter tagline",
|
"tagline": "Enter tagline",
|
||||||
"cover_image": ""
|
"cover_image": ""
|
||||||
|
|||||||
@ -139,6 +139,22 @@ function CardListViewer(props) {
|
|||||||
</CardText>
|
</CardText>
|
||||||
</Link>
|
</Link>
|
||||||
</CardBody>
|
</CardBody>
|
||||||
|
<ButtonGroup>
|
||||||
|
<Button
|
||||||
|
outline
|
||||||
|
active={itemObject.id === props.featuredBlog}
|
||||||
|
onClick={() => props.updateFeaturedBlog(itemObject.id)}
|
||||||
|
>
|
||||||
|
Set this as featured
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
outline
|
||||||
|
onClick={() => props.updateFeaturedBlog('')}
|
||||||
|
>
|
||||||
|
Unset featured blog
|
||||||
|
</Button>
|
||||||
|
</ButtonGroup>
|
||||||
|
|
||||||
</Card>
|
</Card>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user