diff --git a/.github/workflows/super-linter.yml b/.github/workflows/super-linter.yml new file mode 100644 index 0000000..acee01e --- /dev/null +++ b/.github/workflows/super-linter.yml @@ -0,0 +1,29 @@ +# This workflow executes several linters on changed files based on languages used in your code base whenever +# you push a code or open a pull request. +# +# You can adjust the behavior by modifying this file. +# For more information, see: +# https://github.com/github/super-linter +name: Lint Code Base + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] +jobs: + run-lint: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + # Full git history is needed to get a proper list of changed files within `super-linter` + fetch-depth: 0 + + - name: Lint Code Base + uses: github/super-linter@v4 + env: + VALIDATE_ALL_CODEBASE: false + DEFAULT_BRANCH: "master" + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/lvlgg_backend/blog/migrations/0002_rename_data_posted_blog_date_posted_alter_blog_id.py b/lvlgg_backend/blog/migrations/0002_rename_data_posted_blog_date_posted_alter_blog_id.py new file mode 100644 index 0000000..83833db --- /dev/null +++ b/lvlgg_backend/blog/migrations/0002_rename_data_posted_blog_date_posted_alter_blog_id.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2 on 2024-02-15 20:57 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0001_initial'), + ] + + operations = [ + migrations.RenameField( + model_name='blog', + old_name='data_posted', + new_name='date_posted', + ), + migrations.AlterField( + model_name='blog', + name='id', + field=models.AutoField(primary_key=True, serialize=False), + ), + ] diff --git a/lvlgg_backend/blog/migrations/0003_alter_blog_author.py b/lvlgg_backend/blog/migrations/0003_alter_blog_author.py new file mode 100644 index 0000000..198b13c --- /dev/null +++ b/lvlgg_backend/blog/migrations/0003_alter_blog_author.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2 on 2024-02-15 23:06 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0002_rename_data_posted_blog_date_posted_alter_blog_id'), + ] + + operations = [ + migrations.AlterField( + model_name='blog', + name='author', + field=models.TextField(default='EMPTY'), + ), + ] diff --git a/lvlgg_backend/blog/migrations/0004_alter_blog_author.py b/lvlgg_backend/blog/migrations/0004_alter_blog_author.py new file mode 100644 index 0000000..c2d986a --- /dev/null +++ b/lvlgg_backend/blog/migrations/0004_alter_blog_author.py @@ -0,0 +1,21 @@ +# Generated by Django 5.0.2 on 2024-02-25 01:26 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0003_alter_blog_author'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AlterField( + model_name='blog', + name='author', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/lvlgg_backend/blog/migrations/0005_alter_blog_author.py b/lvlgg_backend/blog/migrations/0005_alter_blog_author.py new file mode 100644 index 0000000..bef7f9c --- /dev/null +++ b/lvlgg_backend/blog/migrations/0005_alter_blog_author.py @@ -0,0 +1,18 @@ +# Generated by Django 5.0.2 on 2024-02-25 02:10 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0004_alter_blog_author'), + ] + + operations = [ + migrations.AlterField( + model_name='blog', + name='author', + field=models.TextField(default='None'), + ), + ] diff --git a/lvlgg_backend/blog/migrations/0006_alter_blog_author.py b/lvlgg_backend/blog/migrations/0006_alter_blog_author.py new file mode 100644 index 0000000..495d702 --- /dev/null +++ b/lvlgg_backend/blog/migrations/0006_alter_blog_author.py @@ -0,0 +1,21 @@ +# Generated by Django 5.0.2 on 2024-02-25 04:45 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0005_alter_blog_author'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AlterField( + model_name='blog', + name='author', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/lvlgg_backend/blog/models.py b/lvlgg_backend/blog/models.py index b7d9ea5..fe9f671 100644 --- a/lvlgg_backend/blog/models.py +++ b/lvlgg_backend/blog/models.py @@ -5,10 +5,10 @@ # Create your models here. class Blog(models.Model): + id = models.AutoField(primary_key=True) title = models.CharField(max_length=255) content = models.TextField() - data_posted = models.DateTimeField(default=timezone.now) + date_posted = models.DateTimeField(default=timezone.now) author = models.ForeignKey(Client, on_delete=models.CASCADE, null=True) - def __str__(self): return self.title diff --git a/lvlgg_backend/blog/tests.py b/lvlgg_backend/blog/tests.py index 7ce503c..bec335a 100644 --- a/lvlgg_backend/blog/tests.py +++ b/lvlgg_backend/blog/tests.py @@ -1,3 +1,212 @@ +import json + from django.test import TestCase +from django.test.client import Client +from account.models import Client +from blog.models import Blog +from django.urls import reverse # Create your tests here. + +class BlogViewTestCase(TestCase): + + def setUp(self): + # Create a Client instance + self.client_user = Client.objects.create(username="user1", email="user1@example.com", password="testpassword", firstname="Jerry", lastname="Tom") + # Verify that the Client instance is created + self.assertIsNotNone(self.client_user) + # Verify that the primary key is retrieved correctly + self.assertIsNotNone(self.client_user.pk) + # Save the primary key for later use + self.user_pk = self.client_user.pk + + self.blog_post = Blog.objects.create( + title="Sample Blog Post", + content="This is a sample blog post content.", + author=self.client_user, # Use the previously created Client instance as the author + ) + self.assertIsNotNone(self.blog_post) + self.assertIsNotNone(self.blog_post.pk) + self.blog_pk = self.blog_post.pk + + + def test_post_blog(self): + """ + Test creating a new blog + """ + payload = { + "content": "Stuff for a bloggggg", + "title": "My Title", + "author": self.user_pk + } + + url = "/blog/create_blog/" + + response = self.client.post(url, payload, content_type="application/json") + self.assertEqual(response.status_code, 200) + + payload['title'] = "" + response = self.client.post(url, payload, content_type="application/json") + self.assertEqual(response.status_code, 400) + payload['title'] = "My title" + + payload['content'] = "" + response = self.client.post(url, payload, content_type="application/json") + self.assertEqual(response.status_code, 400) + payload['content'] = "Stuff for my bloggggg" + + payload['author'] = 1000000 + response = self.client.post(url, payload, content_type="application/json") + self.assertEqual(response.status_code, 404) + + def test_get_blogs(self): + """ + Test getting all blogs + """ + # Create a blog first + payload = { + "content": "Stuff for a bloggggg", + "title": "My Title", + "author": self.user_pk + } + create_url = "/blog/create_blog/" + response = self.client.post(create_url, payload, content_type="application/json") + self.assertEqual(response.status_code, 200) + + # Retrieve list of blogs + get_url = "/blog/getlist/" + response = self.client.get(get_url) + + # Check response status code + self.assertEqual(response.status_code, 200) + + # Parse JSON response + data = json.loads(response.content.decode('utf-8')) + + # Check if the response contains a 'blogs' key + self.assertIn('blogs', data) + + # Get the list of blogs from the response + blogs = data['blogs'] + + # Check if the returned list is not empty + self.assertTrue(blogs) + + # Check the structure of each blog in the list + for blog in blogs: + self.assertIn('id', blog) + self.assertIn('title', blog) + self.assertIn('content', blog) + self.assertIn('date_posted', blog) + self.assertIn('author', blog) + + first_blog = blogs[1] + self.assertEqual(first_blog['content'], payload['content']) + self.assertEqual(first_blog['title'], payload['title']) + self.assertEqual(first_blog['author'], payload['author']) + + def test_get_blogs_empty(self): + """ + Test getting all blogs when there are no blogs + """ + url = f"/blog/delete_blog/{self.blog_pk}/" + response = self.client.delete(url) + self.assertEqual(response.status_code, 200) + + # Retrieve list of blogs + get_url = "/blog/getlist/" + response = self.client.get(get_url) + + # Check response status code + self.assertEqual(response.status_code, 200) + + # Parse JSON response + data = json.loads(response.content.decode('utf-8')) + + # Check if the response contains a 'blogs' key + self.assertIn('blogs', data) + + # Get the list of blogs from the response + blogs = data['blogs'] + + # Check if the returned list is empty + self.assertFalse(blogs) # or self.assertEqual(len(blogs), 0) as an alternative + + def test_update_blog(self): + """ + Test updating a blog + """ + + update_url = f"/blog/update_blog/{self.blog_pk}/" + + update = { + "content": "I updated the blog guys", + "title": "My Title V2", + } + + response = self.client.put(update_url, update, content_type="application/json") + self.assertEqual(response.status_code, 200) + + update['content'] = '' + response = self.client.put(update_url, update, content_type="application/json") + self.assertEqual(response.status_code, 400) + update['content'] = 'I updated the blog Guys' + + update['title'] = '' + response = self.client.put(update_url, update, content_type="application/json") + self.assertEqual(response.status_code, 400) + update['title'] = 'My Title V2' + + def test_update_blog_fail(self): + """ + Test updating a blog when using a bad pk + """ + key = 99 + update_url = f"/blog/update_blog/{key}/" + + update = { + "content": "I updated the blog guys", + "title": "My Title V2", + } + + response = self.client.put(update_url, update, content_type="application/json") + self.assertEqual(response.status_code, 404) + + def test_specific_get(self): + """ + Test getting a specific blog + """ + get_url = f"/blog/get_blog/{self.blog_pk}/" + response = self.client.get(get_url) + + # Check response status code + self.assertEqual(response.status_code, 200) + + # Parse JSON response + data = json.loads(response.content.decode('utf-8')) + + self.assertEqual(data['content'], "This is a sample blog post content.") + self.assertEqual(data['title'], "Sample Blog Post") + + get_url = "/blog/get_blog/99/" + response = self.client.get(get_url) + + # Check response status code + self.assertEqual(response.status_code, 500) + + def test_delete(self): + """ + Test deleting a specific blog + """ + url = f"/blog/delete_blog/{self.blog_pk}/" + response = self.client.delete(url) + self.assertEqual(response.status_code, 200) + + def test_delete_fail(self): + """ + Test Deleting a specific blog a bad pk + """ + key = 99 + url = f"/blog/delete_blog/{key}/" + response = self.client.delete(url) + self.assertEqual(response.status_code, 404) diff --git a/lvlgg_backend/blog/urls.py b/lvlgg_backend/blog/urls.py index 70d6ad5..53cb3e8 100644 --- a/lvlgg_backend/blog/urls.py +++ b/lvlgg_backend/blog/urls.py @@ -1,7 +1,10 @@ -# accounts/urls.py from django.urls import path -from .views import BlogDetailView +from .views import * urlpatterns = [ - path("blog/", BlogDetailView.as_view()), -] + path("create_blog/", Blogs.as_view()), + path("getlist/", Blogs.as_view()), + path("delete_blog//", Blogs.as_view()), + path("get_blog//", GetBlogs.as_view()), + path("update_blog//", Blogs.as_view()), +] \ No newline at end of file diff --git a/lvlgg_backend/blog/views.py b/lvlgg_backend/blog/views.py index 3b80e36..1cad101 100644 --- a/lvlgg_backend/blog/views.py +++ b/lvlgg_backend/blog/views.py @@ -1,8 +1,94 @@ -from django.shortcuts import render +from django.http import JsonResponse, Http404 +from django.shortcuts import get_object_or_404 +from django.views.decorators.http import require_http_methods +from django.core import serializers from django.views import View +from account.models import Client +import json +from .models import Blog +class Blogs(View): + def post(self, request): + data = json.loads(request.body.decode('utf-8')) + title = data.get('title') + content = data.get('content') + author_id = data.get('author') + + if not all([title, content, author_id]): + return JsonResponse({'error': 'Incomplete data provided'}, status=400) + + try: + # Retrieve the Client instance based on author_id + author = Client.objects.get(pk=author_id) + except Client.DoesNotExist: + # Handle case where no Client matches the provided author_id + return JsonResponse({'error': 'Author not found'}, status=404) -# Create your views here. -class BlogDetailView(View): + try: + blog = Blog.objects.create( + title=title, + content=content, + author=author # Pass the Client instance, not the ID + ) + return JsonResponse({'message': 'Blog created successfully'}, status=200) + except Exception as e: + return JsonResponse({'error': str(e)}, status=500) + + def delete(self, request, pk): + # Handle DELETE request to delete a specific blog + try: + # Attempt to retrieve the blog with the provided primary key + blog = get_object_or_404(Blog, pk=pk) + + # Delete the blog + blog.delete() + + # Return a success message + return JsonResponse({'message': 'Blog deleted successfully'}) + except Http404: + return JsonResponse({'error': 'No Primary Key found'}, status=404) + except Exception as e: + # Handle any unexpected errors + return JsonResponse({'error': str(e)}, status=500) + + def put(self, request, pk): + try: + blog = get_object_or_404(Blog, pk=pk) + data = json.loads(request.body.decode('utf-8')) + title = data.get('title') + content = data.get('content') + if not all([title, content]): + return JsonResponse({'error': 'Incomplete data provided'}, status=400) + blog.title = title + blog.content = content + blog.save() + return JsonResponse({'message': 'Blog updated successfully'}) + except Http404: + return JsonResponse({'error': 'No Primary Key found'}, status=404) + except Exception as e: + return JsonResponse({'error': str(e)}, status=500) - pass + def get(self, request): + # Query all blog instances + blogs = Blog.objects.all() + + # Convert each blog instance into a dictionary + blogs_list = list(blogs.values('id', 'title', 'content', 'date_posted', 'author')) + + # Return the list as a JSON response + return JsonResponse({'blogs': blogs_list}) + + +class GetBlogs(View): + def get(self, request, pk): + try: + # Attempt to retrieve the specific blog by primary key and convert it into a dictionary + blog = Blog.objects.filter(pk=pk).values('id', 'title', 'content', 'date_posted', 'author').first() + + # Return the blog as a JSON response + return JsonResponse(blog) + + except Blog.DoesNotExist: + return JsonResponse({'error': 'Blog not found'}, status=404) + except Exception as e: + return JsonResponse({'error': str(e)}, status=500) \ No newline at end of file diff --git a/lvlgg_backend/comment/__init__.py b/lvlgg_backend/comment/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lvlgg_backend/comment/admin.py b/lvlgg_backend/comment/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/lvlgg_backend/comment/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/lvlgg_backend/comment/apps.py b/lvlgg_backend/comment/apps.py new file mode 100644 index 0000000..c364f39 --- /dev/null +++ b/lvlgg_backend/comment/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class CommentConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'comment' diff --git a/lvlgg_backend/comment/migrations/0001_initial.py b/lvlgg_backend/comment/migrations/0001_initial.py new file mode 100644 index 0000000..6df8730 --- /dev/null +++ b/lvlgg_backend/comment/migrations/0001_initial.py @@ -0,0 +1,25 @@ +# Generated by Django 5.0.2 on 2024-02-24 21:32 + +import django.utils.timezone +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Comment', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('content', models.TextField()), + ('date_posted', models.DateTimeField(default=django.utils.timezone.now)), + ('author', models.TextField(default='EMPTY')), + ('blogId', models.TextField(default='EMPTY')), + ], + ), + ] diff --git a/lvlgg_backend/comment/migrations/0002_alter_comment_blogid.py b/lvlgg_backend/comment/migrations/0002_alter_comment_blogid.py new file mode 100644 index 0000000..a4c1207 --- /dev/null +++ b/lvlgg_backend/comment/migrations/0002_alter_comment_blogid.py @@ -0,0 +1,20 @@ +# Generated by Django 5.0.2 on 2024-02-25 01:26 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0004_alter_blog_author'), + ('comment', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='comment', + name='blogId', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='blog.blog'), + ), + ] diff --git a/lvlgg_backend/comment/migrations/0003_alter_comment_author.py b/lvlgg_backend/comment/migrations/0003_alter_comment_author.py new file mode 100644 index 0000000..8a0e4d4 --- /dev/null +++ b/lvlgg_backend/comment/migrations/0003_alter_comment_author.py @@ -0,0 +1,21 @@ +# Generated by Django 5.0.2 on 2024-02-25 18:29 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('comment', '0002_alter_comment_blogid'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AlterField( + model_name='comment', + name='author', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/lvlgg_backend/comment/migrations/__init__.py b/lvlgg_backend/comment/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lvlgg_backend/comment/models.py b/lvlgg_backend/comment/models.py new file mode 100644 index 0000000..f0d1299 --- /dev/null +++ b/lvlgg_backend/comment/models.py @@ -0,0 +1,15 @@ +from django.db import models +from django.utils import timezone +from account.models import Client +from blog.models import Blog + + +# Create your models here. +class Comment(models.Model): + id = models.AutoField(primary_key=True) + content = models.TextField() + date_posted = models.DateTimeField(default=timezone.now) + author = models.ForeignKey(Client, on_delete=models.CASCADE, null=True) + blogId = models.ForeignKey(Blog, on_delete=models.CASCADE, null=True) + def __str__(self): + return self.title diff --git a/lvlgg_backend/comment/tests.py b/lvlgg_backend/comment/tests.py new file mode 100644 index 0000000..0bd534d --- /dev/null +++ b/lvlgg_backend/comment/tests.py @@ -0,0 +1,155 @@ +import json + +from django.test import TestCase +from django.test.client import Client +from account.models import Client +from blog.models import Blog +from comment.models import Comment +from django.urls import reverse + +# Create your tests here. + +class CommentViewTestCase(TestCase): + + def setUp(self): + # Create a Client instance + self.client_user = Client.objects.create(username="user1", email="user1@example.com", password="testpassword", firstname="Jerry", lastname="Tom") + self.assertIsNotNone(self.client_user) + self.assertIsNotNone(self.client_user.pk) + self.user_pk = self.client_user.pk + + self.blog_post = Blog.objects.create( + title="Sample Blog Post", + content="This is a sample blog post content.", + author=self.client_user, + ) + self.assertIsNotNone(self.blog_post) + self.assertIsNotNone(self.blog_post.pk) + self.blog_pk = self.blog_post.pk + + self.comment_post = Comment.objects.create( + content = "I am the Comment", + blogId = self.blog_post, + author = self.client_user + ) + self.assertIsNotNone(self.comment_post) + self.assertIsNotNone(self.comment_post.pk) + self.comment_pk = self.comment_post.pk + + + def test_post_comment(self): + """ + Test creating a new comment + """ + payload = { + "content": "I am commenting on a post", + "blog": self.blog_pk, + "author": self.user_pk + } + + url = "/comment/create_comment/" + + response = self.client.post(url, payload, content_type="application/json") + self.assertEqual(response.status_code, 200) + + payload['content'] = '' + response = self.client.post(url, payload, content_type="application/json") + self.assertEqual(response.status_code, 400) + payload['content'] = 'I am commenting on a post' + + def test_get_comments(self): + """ + Test getting all comments for a blog + """ + url = f"/comment/get_comments/{self.blog_pk}/" + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + + comments = json.loads(response.content.decode('utf-8'))['comments'] + + self.assertTrue(comments) + + for comment in comments: + self.assertIn('id', comment) + self.assertIn('content', comment) + self.assertIn('author', comment) + self.assertIn('blogId', comment) + + first_comment = comments[0] + expected_content = "I am the Comment" + self.assertEqual(first_comment['content'], expected_content) + + def test_get_comments_empty(self): + """ + Test getting all comments for a blog when a blog has no comments + """ + url = f"/comment/delete_comment/{self.comment_pk}/" + response = self.client.delete(url) + self.assertEqual(response.status_code, 200) + + url = f"/comment/get_comments/{self.comment_pk}/" + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + + # Parse JSON response + data = json.loads(response.content.decode('utf-8')) + + # Extract comments list + comments = data.get('comments', []) + + # Check that comments list is empty + self.assertFalse(comments, "Comments list should be empty") + + # If the comments list is not empty, fail the test + if comments: + self.fail("Comments list is not empty") + + def test_update_comment(self): + """ + Test updating a comment + """ + update = { + "content": "I update a comment on a post", + } + + url = f"/comment/update_comment/{self.comment_pk}/" + + response = self.client.put(url, update, content_type="application/json") + self.assertEqual(response.status_code, 200) + + update['content'] = "" + response = self.client.put(url, update, content_type="application/json") + self.assertEqual(response.status_code, 400) + + def test_update_comment_fail(self): + """ + Test updating a comment with wrong pk + """ + update = { + "content": "I update a comment on a post", + } + key = 99 + url = f"/comment/update_comment/{key}/" + + response = self.client.put(url, update, content_type="application/json") + self.assertEqual(response.status_code, 404) + + def test_delete_comment(self): + """ + Test deleting a comment + """ + + url = f"/comment/delete_comment/{self.comment_pk}/" + + response = self.client.delete(url) + self.assertEqual(response.status_code, 200) + + def test_delete_comment_fail(self): + """ + Test deleting a comment with incorrect pk + """ + key = 99 + url = f"/comment/delete_comment/{key}/" + + response = self.client.delete(url) + self.assertEqual(response.status_code, 404) diff --git a/lvlgg_backend/comment/urls.py b/lvlgg_backend/comment/urls.py new file mode 100644 index 0000000..559d790 --- /dev/null +++ b/lvlgg_backend/comment/urls.py @@ -0,0 +1,10 @@ +from django.urls import path +from .views import * + +urlpatterns = [ + path("create_comment/", Comments.as_view()), + path("get_comments//", Comments.as_view()), + path("delete_comment//", Comments.as_view()), + path("get_comment//", Comments.as_view()), + path("update_comment//", Comments.as_view()), +] \ No newline at end of file diff --git a/lvlgg_backend/comment/views.py b/lvlgg_backend/comment/views.py new file mode 100644 index 0000000..dc562c2 --- /dev/null +++ b/lvlgg_backend/comment/views.py @@ -0,0 +1,70 @@ +from django.http import JsonResponse, Http404 +from account.models import Client +from blog.models import Blog +from django.shortcuts import get_object_or_404 +from django.views.decorators.http import require_http_methods +from django.views import View +import json +from .models import Comment + +class Comments(View): + + def post(self, request): + data = json.loads(request.body.decode('utf-8')) + content = data.get('content') + author_id = data.get('author') + blog_id = data.get('blog') + + if not content: + return JsonResponse({'error': 'Content is required'}, status=400) + + try: + + # Retrieve the Client instance based on author_id + author = Client.objects.get(pk=author_id) + # Retrieve the Blog instance based on blog_id + blog = Blog.objects.get(pk=blog_id) + + comment = Comment.objects.create( + content=content, + author=author, + blogId=blog, + ) + return JsonResponse({'message': 'Comment created successfully'}, status=200) + except Exception as e: + return JsonResponse({'error': str(e)}, status=500) + + def get(self, request, blog_Id): + comments = Comment.objects.filter(blogId=blog_Id) + comments_list = list(comments.values('id','content','date_posted','author','blogId')) + return JsonResponse({'comments':comments_list}) + + + def delete(self, request, pk): + try: + comment = get_object_or_404(Comment, pk=pk) + comment.delete() + return JsonResponse({'message': 'Comment deleted successfully'}, status=200) + except Http404: + return JsonResponse({'error': 'No Primary Key found'}, status=404) + except Exception as e: + return JsonResponse({'error': str(e)}, status=500) + + # Assuming you want to update comments as well + def put(self, request, pk): + try: + comment = get_object_or_404(Comment, pk=pk) + data = json.loads(request.body.decode('utf-8')) + content = data.get('content') + if not content: + return JsonResponse({'error': 'Content is required'}, status=400) + comment.content = content + # Optionally update other fields like author or blog if needed + comment.save() + return JsonResponse({'message': 'Comment updated successfully'}, status=200) + except Http404: + return JsonResponse({'error': 'No Primary Key found'}, status=404) + except Exception as e: + return JsonResponse({'error': str(e)}, status=500) + + diff --git a/lvlgg_backend/lvlgg_backend/settings.py b/lvlgg_backend/lvlgg_backend/settings.py index 89ae48b..b46cc58 100644 --- a/lvlgg_backend/lvlgg_backend/settings.py +++ b/lvlgg_backend/lvlgg_backend/settings.py @@ -10,9 +10,8 @@ https://docs.djangoproject.com/en/4.2/ref/settings/ """ -import os -import sys from pathlib import Path +import os # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent @@ -41,20 +40,29 @@ "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", - "corsheaders", + 'corsheaders', + 'comment.apps.CommentConfig', ] MIDDLEWARE = [ + 'corsheaders.middleware.CorsMiddleware', "django.middleware.security.SecurityMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", - "corsheaders.middleware.CorsMiddleware", "django.middleware.common.CommonMiddleware", - "django.middleware.csrf.CsrfViewMiddleware", + #"django.middleware.csrf.CsrfViewMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware", "django.contrib.messages.middleware.MessageMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", ] +CORS_ALLOWED_ORIGINS = [ + 'http://localhost:3000', +] + +CSRF_TRUSTED_ORIGINS = [ + 'http://localhost:3000', +] + ROOT_URLCONF = "lvlgg_backend.urls" TEMPLATES = [ @@ -91,12 +99,6 @@ } -if ( - "test" in sys.argv or "test\_coverage" in sys.argv -): # Covers regular testing and django-coverage - DATABASES["default"]["ENGINE"] = "django.db.backends.sqlite3" - DATABASES["default"]["NAME"] = ":memory:" - # Password validation # https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators @@ -139,13 +141,4 @@ DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" - AUTH_USER_MODEL = "account.Client" - -AUTHENTICATION_BACKENDS = ["account.backends.AccountBackend"] - -CORS_ALLOW_ALL_ORIGINS = True - -CORS_ALLOWED_ORIGINS = [ - 'http://localhost:3000', -] diff --git a/lvlgg_backend/lvlgg_backend/urls.py b/lvlgg_backend/lvlgg_backend/urls.py index 5074981..cbe2e2d 100644 --- a/lvlgg_backend/lvlgg_backend/urls.py +++ b/lvlgg_backend/lvlgg_backend/urls.py @@ -22,4 +22,5 @@ path("admin/", admin.site.urls), path("account/", include("account.urls")), path("blog/", include("blog.urls")), + path("comment/",include("comment.urls")) ]