Skip to content

Commit e23f2c5

Browse files
feat: project backend routes (#18)
* chore: skeleton for projects drf crud * chore: rm tfile * feat: project crud * added fetch all projects * added url to get projects and other misc changes to views in reguards to fetching data * fix: get all projects route --------- Co-authored-by: ColumnSkunky <[email protected]>
1 parent 362f2c7 commit e23f2c5

File tree

7 files changed

+107
-2
lines changed

7 files changed

+107
-2
lines changed

backend/bitmatch/bitmatch/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
"rest_framework",
5959
"corsheaders",
6060
"userauth",
61+
"projects",
6162
"a3",
6263
"a4",
6364
]

backend/bitmatch/bitmatch/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,5 @@
2323
path('admin/', admin.site.urls),
2424
path('a3/', include('a3.urls')),
2525
path('a4/', include('a4.urls')),
26+
path('projects/', include('projects.urls')),
2627
]
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Generated by Django 5.1.6 on 2025-03-04 06:58
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
initial = True
9+
10+
dependencies = [
11+
]
12+
13+
operations = [
14+
migrations.CreateModel(
15+
name='Project',
16+
fields=[
17+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
18+
('group', models.CharField(max_length=255)),
19+
('match_percentage', models.FloatField()),
20+
('title', models.CharField(max_length=255)),
21+
('institution', models.CharField(max_length=255)),
22+
('description', models.TextField()),
23+
('followers', models.IntegerField(default=0)),
24+
('likes', models.IntegerField(default=0)),
25+
('positions', models.JSONField(default=list)),
26+
('image_url', models.URLField(blank=True, null=True)),
27+
],
28+
),
29+
]

backend/bitmatch/projects/models.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,17 @@
11
from django.db import models
22

3+
# TODO: PROJECTS MODEL
34
# Create your models here.
5+
class Project(models.Model):
6+
group = models.CharField(max_length=255)
7+
match_percentage = models.FloatField()
8+
title = models.CharField(max_length=255)
9+
institution = models.CharField(max_length=255)
10+
description = models.TextField()
11+
followers = models.IntegerField(default=0)
12+
likes = models.IntegerField(default=0)
13+
positions = models.JSONField(default=list)
14+
image_url = models.URLField(blank=True, null=True)
15+
16+
def __str__(self):
17+
return self.title
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from rest_framework import serializers
2+
from .models import Project
3+
4+
class ProjectSerializer(serializers.ModelSerializer):
5+
class Meta:
6+
model = Project
7+
fields = '__all__'

backend/bitmatch/projects/urls.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from django.urls import path
2+
from .views import ProjectCRUDView, get_projects
3+
4+
urlpatterns = [
5+
path('', get_projects, name='get_projects'), # Fetch all projects
6+
path('create/', ProjectCRUDView.as_view(), name='project-create'), # Create project
7+
path('<int:pk>/', ProjectCRUDView.as_view(), name='project-detail'), # Read, Update, Delete project by ID
8+
]

backend/bitmatch/projects/views.py

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,48 @@
1-
from django.shortcuts import render
1+
from rest_framework import status
2+
from rest_framework.response import Response
3+
from rest_framework.views import APIView
4+
from django.shortcuts import get_object_or_404
5+
from .models import Project
6+
from .serializers import ProjectSerializer
7+
from rest_framework.permissions import AllowAny
8+
from rest_framework.decorators import api_view, permission_classes
29

3-
# Create your views here.
10+
# Fetch all projects
11+
@api_view(['GET'])
12+
@permission_classes([AllowAny])
13+
def get_projects(request):
14+
projects = Project.objects.all()
15+
serializer = ProjectSerializer(projects, many=True)
16+
return Response(serializer.data)
17+
18+
# DRF CRUD views for Project model
19+
class ProjectCRUDView(APIView):
20+
permission_classes = [AllowAny]
21+
# Create a new project (POST)
22+
def post(self, request):
23+
serializer = ProjectSerializer(data=request.data)
24+
if serializer.is_valid():
25+
serializer.save()
26+
return Response(serializer.data, status=status.HTTP_201_CREATED)
27+
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
28+
29+
# Get a single project by ID (GET)
30+
def get(self, request, pk):
31+
project = get_object_or_404(Project, pk=pk)
32+
serializer = ProjectSerializer(project)
33+
return Response(serializer.data)
34+
35+
# Update an existing project by ID (PUT)
36+
def put(self, request, pk):
37+
project = get_object_or_404(Project, pk=pk)
38+
serializer = ProjectSerializer(project, data=request.data)
39+
if serializer.is_valid():
40+
serializer.save()
41+
return Response(serializer.data)
42+
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
43+
44+
# Delete a project by ID (DELETE)
45+
def delete(self, request, pk):
46+
project = get_object_or_404(Project, pk=pk)
47+
project.delete()
48+
return Response({"message": "Project deleted"}, status=status.HTTP_204_NO_CONTENT)

0 commit comments

Comments
 (0)