Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
83 commits
Select commit Hold shift + click to select a range
b29c196
Add hello API endpoint
kreesh09 Mar 3, 2026
6481bc1
GET API using hexagonal architecture
kreesh09 Mar 4, 2026
3bbcdc4
readme updated
kreeeesh17 Mar 5, 2026
22a3450
week2- REST API product model created
kreeeesh17 Mar 11, 2026
f3609e4
week2- REST API product model created
kreeeesh17 Mar 11, 2026
3f6e12e
readme updated
kreeeesh17 Mar 11, 2026
58b4c0a
readme updated
kreeeesh17 Mar 11, 2026
e9c17fb
readme updated
kreeeesh17 Mar 11, 2026
653a89c
readme updated
kreeeesh17 Mar 11, 2026
dc274bf
readme updated
kreeeesh17 Mar 16, 2026
47b7ee0
week-3 updated
kreeeesh17 Mar 17, 2026
a6f021d
week-3 updated
kreeeesh17 Mar 17, 2026
55b9222
week-3 updated
kreeeesh17 Mar 17, 2026
a95e8e6
week-3 updated
kreeeesh17 Mar 17, 2026
9360c5b
week-3 updated
kreeeesh17 Mar 17, 2026
1b66261
week-3 updated
kreeeesh17 Mar 17, 2026
7c98808
readme-updated
kreeeesh17 Mar 17, 2026
5dd0990
readme-updated
kreeeesh17 Mar 17, 2026
7e48682
readme-updated
kreeeesh17 Mar 17, 2026
72c453d
week-3 completed
kreeeesh17 Mar 18, 2026
075af12
week4- started
kreeeesh17 Mar 18, 2026
1a7b211
week2 - Pagination added
kreeeesh17 Mar 21, 2026
7ec0fd7
week3 - completed
kreeeesh17 Mar 21, 2026
646e039
week4 - updated
kreeeesh17 Mar 21, 2026
07efff7
week4 - updated
kreeeesh17 Mar 21, 2026
2cbd900
week4 - csv_helper created
kreeeesh17 Mar 22, 2026
c516a71
week4 - csv_helper created
kreeeesh17 Mar 22, 2026
d7401c9
week4 - models created
kreeeesh17 Mar 22, 2026
e322336
week4 - repository created
kreeeesh17 Mar 22, 2026
d4540df
week4 - serializers created
kreeeesh17 Mar 22, 2026
430e651
week4 - serializers created
kreeeesh17 Mar 22, 2026
abc449f
week4 - service updated
kreeeesh17 Mar 22, 2026
61a7c9c
week4 - service updated
kreeeesh17 Mar 22, 2026
2693623
week4 - service completed
kreeeesh17 Mar 22, 2026
a015fa5
week4 - service completed
kreeeesh17 Mar 22, 2026
01d0d1e
week4 - pagination completed
kreeeesh17 Mar 22, 2026
9d23472
week4 - views completed
kreeeesh17 Mar 22, 2026
b0ac418
week4 - views completed
kreeeesh17 Mar 22, 2026
ce1256d
week4 - urls completed
kreeeesh17 Mar 22, 2026
5c9cd9d
week4 - updated
kreeeesh17 Mar 22, 2026
0b3058c
week4 - completed
kreeeesh17 Mar 22, 2026
4e223cb
migration script completed
kreeeesh17 Mar 28, 2026
ceae03b
migration script completed
kreeeesh17 Mar 28, 2026
33815cd
week4 - updated
kreeeesh17 Mar 28, 2026
0393964
readme updated
kreeeesh17 Mar 28, 2026
d96527d
readme updated
kreeeesh17 Mar 28, 2026
4a19e05
week4 - seeding added
kreeeesh17 Mar 28, 2026
09e11ff
readme updated
kreeeesh17 Mar 28, 2026
c32479d
readme updated
kreeeesh17 Mar 28, 2026
d36ceb3
week5 - started
kreeeesh17 Mar 30, 2026
40ea1c6
week5 - dashboard created
kreeeesh17 Mar 30, 2026
42e2925
week5 - dashboard created
kreeeesh17 Mar 30, 2026
65b3e04
week5 - notebook created
kreeeesh17 Mar 30, 2026
7b5d733
week5 - completed
kreeeesh17 Mar 30, 2026
5c29375
readme updated
kreeeesh17 Mar 30, 2026
7fe0051
readme updated
kreeeesh17 Mar 30, 2026
d4f68bc
week6 - api key added
kreeeesh17 Mar 30, 2026
6523706
week6 - task1 completed
kreeeesh17 Mar 31, 2026
5ec5995
readme updated
kreeeesh17 Mar 31, 2026
98da952
week6 - schema added
kreeeesh17 Mar 31, 2026
f9b9336
week6 - task 2 and 3 completed
kreeeesh17 Mar 31, 2026
a576ad7
week6 - task 4 completed
kreeeesh17 Mar 31, 2026
5e9a913
readme updated
kreeeesh17 Mar 31, 2026
3224195
adv task completed
kreeeesh17 Mar 31, 2026
08ea835
week7 - embeddings created
kreeeesh17 Apr 1, 2026
a68b3b9
week7 - semantic search created
kreeeesh17 Apr 1, 2026
50f166b
week7 - task_2 completed
kreeeesh17 Apr 1, 2026
1bae749
week7 - task_3 completed
kreeeesh17 Apr 1, 2026
fd71b65
week7 - task_4 completed
kreeeesh17 Apr 2, 2026
eea9485
week7 - adv_task completed
kreeeesh17 Apr 2, 2026
f798ca2
week7 - adv_tasks completed
kreeeesh17 Apr 3, 2026
8b30275
readme updated
kreeeesh17 Apr 3, 2026
2361e92
week8 - started
kreeeesh17 Apr 7, 2026
2ddb334
week8 - updated
kreeeesh17 Apr 7, 2026
e2553a2
week8 - rag pipeline created
kreeeesh17 Apr 7, 2026
ad38401
week8 - updated
kreeeesh17 Apr 7, 2026
a393e3e
week8 - task 5 completed
kreeeesh17 Apr 7, 2026
c3d1d02
week8 - completed
kreeeesh17 Apr 7, 2026
724adc7
readme updated
kreeeesh17 Apr 7, 2026
b6260b8
week9_10 - task_1 completed
kreeeesh17 May 12, 2026
6813ee1
week9_10 - agent created
kreeeesh17 May 14, 2026
75e67ca
week9_10 - eval and langsmith added
kreeeesh17 May 14, 2026
37fe4fb
week9_10 - readme updated
kreeeesh17 May 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
719 changes: 710 additions & 9 deletions backend/python/README.md

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions backend/python/django_app/adapters/api/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.urls import path
from .views import hello_world

urlpatterns = [
path("hello-world/", hello_world, name="hello-world")
]
9 changes: 9 additions & 0 deletions backend/python/django_app/adapters/api/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from django.http import JsonResponse
from django_app.application.greeter_service import greet


def hello_world(request):
# url is /hello-world/?name="Kreesh" it returns Kreesh
name = request.GET.get("name")
message = greet(name)
return JsonResponse({"message": message})
8 changes: 8 additions & 0 deletions backend/python/django_app/application/greeter_service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# implement port contract using domain logic
# use case, what should happen when someone calls this feature

from django_app.domain.greeting import greeting


def greet(name):
return greeting(name)
10 changes: 10 additions & 0 deletions backend/python/django_app/domain/greeting.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# domain : core logic

def greeting(name):
if name == None:
name = ""
name = name.strip()
if (name == ""):
return "Hello, World!"
else:
return "Hello, "+name+"!"
4 changes: 4 additions & 0 deletions backend/python/django_app/ports/greeter.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# ports : core sys communicates with outside world

def greet(name):
return "PORT ONLY - implement in application"
10 changes: 10 additions & 0 deletions backend/python/django_app/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,11 @@
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"rest_framework",
"week2",
"week3.apps.Week3Config",
"django_filters",
"week4.apps.Week4Config"
]

MIDDLEWARE = [
Expand Down Expand Up @@ -121,3 +126,8 @@
# https://docs.djangoproject.com/en/6.0/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"

REST_FRAMEWORK = {
"DEFAULT_PAGINATION_CLASS": "week4.pagination.Week4Pagination",
"PAGE_SIZE": 5,
}
27 changes: 22 additions & 5 deletions backend/python/django_app/urls.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,28 @@
# django_app/urls.py

from django.contrib import admin
from django.urls import path
from django.http import HttpResponse
from django.urls import path, include
from django.http import JsonResponse


def hello_name(request):
"""
A simple view that returns 'Hello, {name}' in JSON format.
Uses a query parameter named 'name'.
"""
# Get 'name' from the query string, default to 'World' if missing
name = request.GET.get("name", "World")
return JsonResponse({"message": f"Hello, {name}!"})

def hello_world(request):
return HttpResponse("Hello, world! This is our interneers-lab Django server.")

urlpatterns = [
path('admin/', admin.site.urls),
path('hello/', hello_world),
path('hello/', hello_name),
# Example usage: /hello/?name=Bob
# returns {"message": "Hello, Bob!"}
path("", include("django_app.adapters.api.urls")),
path("week2/", include("week2.urls")),
path("week3/", include("week3.urls")),
path("week4/", include("week4.urls")),

]
18 changes: 18 additions & 0 deletions backend/python/requirements.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,20 @@
Django==6.0.2
pymongo==4.16.0
streamlit
pandas
numpy
matplotlib
scikit-learn
sentence-transformers
mongoengine
python-dotenv
google-genai
pydantic
langchain
langchain-core
langchain-community
langchain-text-splitters
langchain-chroma
langsmith
chromadb
langchain-google-genai
Empty file.
3 changes: 3 additions & 0 deletions backend/python/week2/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.contrib import admin

# Register your models here.
5 changes: 5 additions & 0 deletions backend/python/week2/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from django.apps import AppConfig


class Week2Config(AppConfig):
name = "week2"
Empty file.
24 changes: 24 additions & 0 deletions backend/python/week2/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from django.db import models
from decimal import Decimal


class Product:
def __init__(self, id, name, description, category, price, brand, quantity):
self.id = id
self.name = name
self.description = description
self.category = category
self.price = Decimal(str(price))
self.brand = brand
self.quantity = quantity

def to_dict(self):
return {
"id": self.id,
"name": self.name,
"description": self.description,
"category": self.category,
"price": str(self.price),
"brand": self.brand,
"quantity": self.quantity,
}
47 changes: 47 additions & 0 deletions backend/python/week2/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# serializer :
# 1.> validate incoming API data
# 2.> converts data into clean python format


from rest_framework import serializers


class ProductSerializer(serializers.Serializer):
# id is generated by store therefore read only therefore user should not send ID
id = serializers.IntegerField(read_only=True)
name = serializers.CharField(max_length=200)
description = serializers.CharField()
category = serializers.CharField(max_length=100)
price = serializers.DecimalField(max_digits=10, decimal_places=2)
# brand is optional even if client sends {brand = ""} then also it will work
brand = serializers.CharField(
max_length=100, required=False, allow_blank=True)
quantity = serializers.IntegerField()

# custom validations

# {name = { }} should be rejected
def validate_name(self, value):
if not value.strip():
raise serializers.ValidationError("Name cannot be empty")
return value

def validate_category(self, value):
if not value.strip():
raise serializers.ValidationError("Category cannot be empty.")
return value

def validate_price(self, value):
if value <= 0:
raise serializers.ValidationError("Price must be greater than 0.")
return value

def validate_quantity(self, value):
if value < 0:
raise serializers.ValidationError("Quantity cannot be negative.")
return value

def validate_brand(self, value):
if value != "" and not value.strip():
raise serializers.ValidationError("Brand cannot be only spaces.")
return value
61 changes: 61 additions & 0 deletions backend/python/week2/store.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# store.py : temporary in-memory database

from .models import Product


class ProductStore:
def __init__(self):
self.products = {}
self.next_id = 1

# creating new data

def create(self, data):
# it is python object not JSON
product = Product(
id=self.next_id,
name=data["name"],
description=data["description"],
category=data["category"],
price=data["price"],
brand=data.get("brand", ""),
quantity=data["quantity"],
)
self.products[self.next_id] = product
self.next_id += 1
return product

# getting existing data

def get(self, product_id):
return self.products.get(product_id)

# listing all data

def list_all(self):
return list(self.products.values())

# updating data

def update(self, product_id, data):
product = self.products.get(product_id)
if not product:
return None
product.name = data["name"]
product.description = data["description"]
product.category = data["category"]
product.price = data["price"]
product.brand = data.get("brand", "")
product.quantity = data["quantity"]
return product

# deleting data

def delete(self, product_id):
if product_id in self.products:
del self.products[product_id]
return True
return False


product_store = ProductStore()
3 changes: 3 additions & 0 deletions backend/python/week2/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.test import TestCase

# Create your tests here.
10 changes: 10 additions & 0 deletions backend/python/week2/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from django.urls import path

from .views import ProductDetailAPIView, ProductListCreateAPIView

urlpatterns = [
path("products/", ProductListCreateAPIView.as_view(),
name="product-list-create"),
path("products/<int:product_id>/",
ProductDetailAPIView.as_view(), name="product-detail"),
]
117 changes: 117 additions & 0 deletions backend/python/week2/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
# view : code that runs when a client hits an endpoint i.e receives http request and decides what to do
# eg GET/products/, PUT/products/1

from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView
from .serializers import ProductSerializer
from .store import product_store


class ProductListCreateAPIView(APIView):
# list all product
def get(self, request):
products = product_store.list_all()
# manual pagination
page = request.query_params.get("page", "1")
page_size = request.query_params.get("page_size", "5")
if not page.isdigit() or not page_size.isdigit():
return Response(
{"error": "page and page_size must be integers"}, status=status.HTTP_400_BAD_REQUEST
)

page = int(page)
page_size = int(page_size)
if page <= 0 or page_size <= 0:
return Response(
{"error": "page and page_size must be greater than 0"}, status=status.HTTP_400_BAD_REQUEST
)

total_items = len(products)
start = (page-1)*page_size
end = start + page_size
paginated_products = products[start: end]
product_data = []

for product in paginated_products:
product_data.append(product.to_dict())

serializer = ProductSerializer(product_data, many=True)

if end < total_items:
next_page = page + 1
else:
next_page = None

if page > 1:
previous_page = page-1
else:
previous_page = None

return Response(
{
"count": total_items,
"page": page,
"page_size": page_size,
"next_page": next_page,
"previous_page": previous_page,
"results": serializer.data,
}, status=status.HTTP_200_OK
)

# product_data = []
# for product in products:
# product_data.append(product.to_dict())
# # output serialisation
# # without many = true DRF would expect one product
# serializer = ProductSerializer(product_data, many=True)
# # Response(product_data, status=status.HTTP_200_OK) is also valid
# return Response(serializer.data, status=status.HTTP_200_OK)

# create a product

def post(self, request):
# input serialisation
serializer = ProductSerializer(data=request.data)
if serializer.is_valid():
product = product_store.create(serializer.validated_data)
response_serializer = ProductSerializer(product.to_dict())
return Response(response_serializer.data, status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


class ProductDetailAPIView(APIView):
# get specific product
def get(self, request, product_id):
product = product_store.get(product_id)
if not product:
return Response({"error": "Product not found"}, status=status.HTTP_404_NOT_FOUND)
else:
serializer = ProductSerializer(product.to_dict())
return Response(serializer.data, status=status.HTTP_200_OK)

# update one product
def put(self, request, product_id):
existing_product = product_store.get(product_id)
if not existing_product:
return Response({"error": "Product not found"}, status=status.HTTP_404_NOT_FOUND,)
else:
# validate new data first
serializer = ProductSerializer(data=request.data)
if (serializer.is_valid()):
updated_product = product_store.update(
product_id, serializer.validated_data)
response_serializer = ProductSerializer(
updated_product.to_dict())
return Response(response_serializer.data, status=status.HTTP_200_OK)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

# delete data
def delete(self, request, product_id):
deleted = product_store.delete(product_id)
if not deleted:
return Response({"error": "Product not found."}, status=status.HTTP_404_NOT_FOUND,)
else:
return Response(status=status.HTTP_204_NO_CONTENT)
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"name":"Local: db_connection","url":"c:\\Users\\Kreesh\\OneDrive\\Desktop\\Rippling\\interneers-lab\\backend\\python\\week3\\db_connection.py","tests":[{"id":1773758364094,"input":"","output":""}],"interactive":false,"memoryLimit":1024,"timeLimit":3000,"srcPath":"c:\\Users\\Kreesh\\OneDrive\\Desktop\\Rippling\\interneers-lab\\backend\\python\\week3\\db_connection.py","group":"local","local":true}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IDE debug file accidentally committed to repository

Low Severity

A Competitive Programming Helper (CPH) VS Code extension file was accidentally committed. It contains local filesystem paths (e.g., c:\\Users\\Kreesh\\OneDrive\\Desktop\\Rippling\\...) exposing the developer's personal directory structure. This file serves no purpose in the repository and leaks local environment details.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 8b30275. Configure here.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bugbot Autofix determined this is a false positive.

The .cph debug file and its containing week3 path are not tracked or present in this repository.

You can send follow-ups to the cloud agent here.

Empty file.
Loading