diff --git a/backend/apimanager/views.py b/backend/apimanager/views.py index 66de62c..f616a63 100644 --- a/backend/apimanager/views.py +++ b/backend/apimanager/views.py @@ -1,5 +1,6 @@ #######################Django related imports#################### import os +import shutil import random from rest_framework import generics, status from rest_framework.views import APIView @@ -104,6 +105,22 @@ class BlogDeleteAPIView(generics.DestroyAPIView): queryset = Blog.objects.all() serializer_class = BlogSerializer lookup_field = 'blog_id' + + def destroy(self, request, *args, **kwargs): + instance = self.get_object() + self.remove_directory(instance) + self.perform_destroy(instance) + return Response(status=status.HTTP_204_NO_CONTENT) + + def remove_directory(self, instance): + print(f"Deleting media files for {instance}") + media_folder = os.path.join(settings.MEDIA_ROOT, 'rangolio_data', 'blog', str(instance.blog_id)) + try: + shutil.rmtree(media_folder) + print(f"Directory '{media_folder}' and all its contents have been removed") + except Exception as e: + print(f"Failed to remove {media_folder}. Reason: {e}") + #################################################################### @@ -162,4 +179,14 @@ class ListMedia(APIView): os.remove(file_path) return Response({'message': 'File deleted successfully'}, status=status.HTTP_204_NO_CONTENT) else: - return Response({'error': 'File not found'}, status=status.HTTP_404_NOT_FOUND) \ No newline at end of file + return Response({'error': 'File not found'}, status=status.HTTP_404_NOT_FOUND) + +class Publish(APIView): + def get(self, request, deploy_type, format=None): + self.create_json() + return Response({"deploy_type": deploy_type}, status=status.HTTP_200_OK) + + def create_json(self): + print(UserData.objects.all()) + print(Category.objects.all()) + print(Blog.objects.all()) diff --git a/backend/backend/urls.py b/backend/backend/urls.py index f3c9694..2cf62a5 100644 --- a/backend/backend/urls.py +++ b/backend/backend/urls.py @@ -33,7 +33,8 @@ from apimanager.views import ( BlogDeleteAPIView, BlogsByCategoryAPIView, MediaUpload, - ListMedia + ListMedia, + Publish ) urlpatterns = [ @@ -53,5 +54,6 @@ urlpatterns = [ path('data/blog/delete//', BlogDeleteAPIView.as_view(), name='blog-delete-view'), path('data/upload/', MediaUpload.as_view(), name='media-upload'), path('data/media///', ListMedia.as_view(), name='list-media'), + path('data/publish//', Publish.as_view(), name='publish'), ] urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \ No newline at end of file diff --git a/frontend/package-lock.json b/frontend/package-lock.json index a8e925f..a63c1a7 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -9,6 +9,7 @@ "version": "0.0.0", "dependencies": { "@fortawesome/fontawesome-svg-core": "^6.5.2", + "@fortawesome/free-brands-svg-icons": "^6.5.2", "@fortawesome/free-solid-svg-icons": "^6.5.2", "@fortawesome/react-fontawesome": "^0.2.0", "@tiptap/extension-blockquote": "^2.3.2", @@ -865,6 +866,18 @@ "node": ">=6" } }, + "node_modules/@fortawesome/free-brands-svg-icons": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.5.2.tgz", + "integrity": "sha512-zi5FNYdmKLnEc0jc0uuHH17kz/hfYTg4Uei0wMGzcoCL/4d3WM3u1VMc0iGGa31HuhV5i7ZK8ZlTCQrHqRHSGQ==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.5.2" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/@fortawesome/free-solid-svg-icons": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.2.tgz", diff --git a/frontend/package.json b/frontend/package.json index 7711352..aa44a4b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -14,6 +14,7 @@ }, "dependencies": { "@fortawesome/fontawesome-svg-core": "^6.5.2", + "@fortawesome/free-brands-svg-icons": "^6.5.2", "@fortawesome/free-solid-svg-icons": "^6.5.2", "@fortawesome/react-fontawesome": "^0.2.0", "@tiptap/extension-blockquote": "^2.3.2", diff --git a/frontend/src/components/editable/blog-list.jsx b/frontend/src/components/editable/blog-list.jsx index 7545e58..b6273d0 100755 --- a/frontend/src/components/editable/blog-list.jsx +++ b/frontend/src/components/editable/blog-list.jsx @@ -1,5 +1,4 @@ import React from 'react'; -import ReactDOM from 'react-dom'; import { useEffect, useState } from 'react'; import EditableDataService from '../../services/editable-data-service'; import CardListViewer from './shared/card-list-viewer'; @@ -11,10 +10,8 @@ import { Row, Col, Button, - CardImg, CardTitle, - CardText, - CardBody + CardBody, } from 'reactstrap'; import { useNavigate, useParams } from 'react-router-dom'; import { faLeftLong } from '@fortawesome/free-solid-svg-icons'; @@ -94,7 +91,7 @@ function BlogList(props) { if (GlobalTheme && ThemeConfig) { return ( - + @@ -122,11 +119,11 @@ return ( itemObject={featuredBlogData} /> : '' } -
+ {categoryData === 'loading' ? : categoryData.blogMetadata.map((item, index) => ( -
-
+ +
-
+ )) } -
+
diff --git a/frontend/src/components/editable/blog.jsx b/frontend/src/components/editable/blog.jsx index aaa1a90..a486617 100755 --- a/frontend/src/components/editable/blog.jsx +++ b/frontend/src/components/editable/blog.jsx @@ -102,7 +102,7 @@ function Blog(props) { - + @@ -118,7 +118,6 @@ function Blog(props) { - = 765 ? '6':''}`}> @@ -158,7 +157,6 @@ function Blog(props) { -
@@ -166,7 +164,6 @@ function Blog(props) {
- @@ -174,7 +171,6 @@ function Blog(props) { -
diff --git a/frontend/src/components/editable/category-list.jsx b/frontend/src/components/editable/category-list.jsx index 98b2d4a..3b99887 100755 --- a/frontend/src/components/editable/category-list.jsx +++ b/frontend/src/components/editable/category-list.jsx @@ -106,7 +106,7 @@ function Blogs(props) { if (GlobalTheme && ThemeConfig) { return ( - +
diff --git a/frontend/src/components/editable/home.jsx b/frontend/src/components/editable/home.jsx index 9d2810e..8c9592e 100755 --- a/frontend/src/components/editable/home.jsx +++ b/frontend/src/components/editable/home.jsx @@ -1,4 +1,4 @@ -import { Container, Spinner, Input, InputGroup, InputGroupText, Button, ButtonGroup, FormFeedback } from 'reactstrap'; +import { Container, Spinner, Input, InputGroup, InputGroupText, Button, ButtonGroup, FormFeedback, Row, Col } from 'reactstrap'; import {useEffect, useState, useRef} from 'react'; import EditorComponent from './shared/tiptap'; import MediaUpload from './shared/media-upload' @@ -52,48 +52,62 @@ function HomePage(props) { }, [profilePhoto]) if (GlobalTheme && ThemeConfig) - return ( - - -
- {UserData.profilePhoto !== "" ? : ""} - - - - -
- <> + return ( + + + + + + + + {UserData.profilePhoto !== "" && ( +
Profile Photo
+ )} + +
+ + + + + + + + +
+ + + - - Name - + Name showError(nameField.current.value, 'nameField')}/> - {nameFieldInvalid ? + {nameFieldInvalid && This field cannot be empty - :''} + } - - - - - - -
-
-
- ); + + + + + + + + + + + + ); } export default HomePage; \ No newline at end of file diff --git a/frontend/src/components/editable/shared/card-list-viewer.jsx b/frontend/src/components/editable/shared/card-list-viewer.jsx index 528afdb..a6cd63f 100755 --- a/frontend/src/components/editable/shared/card-list-viewer.jsx +++ b/frontend/src/components/editable/shared/card-list-viewer.jsx @@ -114,7 +114,7 @@ function CardListViewer(props) { Open this resource - + @@ -154,7 +154,6 @@ function CardListViewer(props) { Unset featured blog - ) } diff --git a/frontend/src/components/editable/shared/navbar.jsx b/frontend/src/components/editable/shared/navbar.jsx index 4bc44bb..d34b773 100755 --- a/frontend/src/components/editable/shared/navbar.jsx +++ b/frontend/src/components/editable/shared/navbar.jsx @@ -2,15 +2,11 @@ import { Navbar, NavbarBrand, - UncontrolledCollapse, - Row, - Col, Nav, NavItem, - NavLink, Container, Spinner, - Button, ButtonGroup, Label, Input + Button, ButtonGroup } from 'reactstrap'; import { useState, useEffect } from 'react'; import EditableMediaService from '../../../services/editable-media-service' diff --git a/frontend/src/components/editable/shared/tiptap-custom-extensions/custom-image-extension.jsx b/frontend/src/components/editable/shared/tiptap-custom-extensions/custom-image-extension.jsx index d44d94b..5ea151a 100644 --- a/frontend/src/components/editable/shared/tiptap-custom-extensions/custom-image-extension.jsx +++ b/frontend/src/components/editable/shared/tiptap-custom-extensions/custom-image-extension.jsx @@ -23,7 +23,7 @@ function ImageNode(props) { return ( -
+
{alt}
diff --git a/frontend/src/components/viewable/blog-list.jsx b/frontend/src/components/viewable/blog-list.jsx index 330f5c4..409f8ce 100755 --- a/frontend/src/components/viewable/blog-list.jsx +++ b/frontend/src/components/viewable/blog-list.jsx @@ -42,19 +42,19 @@ function BlogList(props) { if (GlobalTheme && ThemeConfig) { return ( - - - + + +
- - - - {`Blogs in ${categoryData.name}`} - - - + + + + {`Blogs in ${categoryData.name}`} + + +
{ @@ -70,13 +70,14 @@ function BlogList(props) { itemObject={featuredBlogData} /> : '' } -
+ {categoryData === 'loading' ? : categoryData.blogMetadata.map((item, index) => ( -
-
+ +
-
+ )) } -
+
diff --git a/frontend/src/components/viewable/blog.jsx b/frontend/src/components/viewable/blog.jsx index a4c0e50..a6fb1b7 100755 --- a/frontend/src/components/viewable/blog.jsx +++ b/frontend/src/components/viewable/blog.jsx @@ -9,8 +9,9 @@ import { Container,Row, Col,Spinner, UncontrolledCollapse, Button, ButtonGroup, Card, CardBody } from 'reactstrap'; import { Link, useParams, useNavigate } from 'react-router-dom'; -import { faLeftLong } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faLeftLong, faCopy } from '@fortawesome/free-solid-svg-icons'; +import { faFacebook, faReddit, faXTwitter } from '@fortawesome/free-brands-svg-icons'; function Blog(props) { @@ -103,7 +104,7 @@ function Blog(props) { }) return false; }}> - Copy Link + Copy Link diff --git a/frontend/src/components/viewable/category-list.jsx b/frontend/src/components/viewable/category-list.jsx index 5b69e39..b7c4455 100755 --- a/frontend/src/components/viewable/category-list.jsx +++ b/frontend/src/components/viewable/category-list.jsx @@ -43,7 +43,7 @@ function Blogs(props) { {/* Top Section - Categories */}
- + diff --git a/frontend/src/components/viewable/home.jsx b/frontend/src/components/viewable/home.jsx index f68ac33..51f6ec9 100755 --- a/frontend/src/components/viewable/home.jsx +++ b/frontend/src/components/viewable/home.jsx @@ -1,4 +1,4 @@ -import { Container, Spinner } from 'reactstrap'; +import { Container, Spinner, Row, Col } from 'reactstrap'; import parse from 'html-react-parser'; import MediaService from '../../services/media-service' @@ -30,12 +30,20 @@ function HomePage(props) { return (
- {UserData.profilePhoto !== "" ? : ""} -
- <> + + + + {UserData.profilePhoto !== "" ? : ""} + + + + + +
{introContent}
- -
+ + +
);