Skip to content

Commit e5a5368

Browse files
Added Inventory module API's (#1748)
* Backend PR #2 (#2) * inventory model created with other basic files * inventory model migrations file created * inventory model migrations file created * last commit * Dashboard client (#4) * inventory model created with other basic files * inventory model migrations file created * inventory model migrations file created * last commit * Update views and models * Update views and models * added the backend code of inventory add product and fetching it (#5) * add section queryset * fix section api * add section queryset * added section api * itemcount api * add section queryset * added section api * added the overview page api * transfer product api * updated tranfer api and model * Revert models without migrations This reverts commit 2d6405e. * Revert models without migrations This reverts commit da2cff4. * Backend Code of Request Page added (#1) * added backend code of request page * Delete FusionIIIT/applications/academic_procedures/migrations/0002_auto_20250324_1610.py * Delete FusionIIIT/applications/eis/migrations/0002_auto_20250324_1610.py * Delete FusionIIIT/applications/inventory/migrations/0002_inventoryrequest.py * Delete FusionIIIT/applications/inventory/migrations/0003_auto_20250324_1647.py * Delete FusionIIIT/applications/inventory/migrations/0004_auto_20250324_1649.py * Delete FusionIIIT/applications/inventory/migrations/0005_auto_20250324_1715.py * Delete FusionIIIT/applications/programme_curriculum/migrations/0002_auto_20250324_1610.py * Delete FusionIIIT/applications/scholarships/migrations/0002_auto_20250324_1610.py * feat: Updated inventory model * chore: removed unnecessary code
1 parent ca9250f commit e5a5368

File tree

15 files changed

+290
-0
lines changed

15 files changed

+290
-0
lines changed

FusionIIIT/Fusion/settings/common.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@
141141
'applications.income_expenditure',
142142
'applications.hr2',
143143
'applications.department',
144+
'applications.inventory',
144145
'applications.iwdModuleV2',
145146
'allauth',
146147
'allauth.account',

FusionIIIT/Fusion/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
url(r'^finance/', include('applications.finance_accounts.urls')),
5757
url(r'^purchase-and-store/', include('applications.ps1.urls')),
5858
url(r'^gymkhana/', include('applications.gymkhana.urls')),
59+
url(r'^inventory/', include('applications.inventory.urls')),
5960
url(r'^library/', include('applications.library.urls')),
6061
url(r'^establishment/', include('applications.establishment.urls')),
6162
url(r'^ocms/', include('applications.online_cms.urls')),

FusionIIIT/applications/globals/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,7 @@ class ModuleAccess(models.Model):
335335
placement_cell = models.BooleanField(default=False)
336336
visitor_hostel = models.BooleanField(default=False)
337337
phc = models.BooleanField(default=False)
338+
inventory_management = models.BooleanField(default=False)
338339

339340
def __str__(self):
340341
return self.designation

FusionIIIT/applications/inventory/__init__.py

Whitespace-only changes.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from django.contrib import admin
2+
from .models import Item, DepartmentInfo, SectionInfo
3+
4+
admin.site.register(Item)
5+
admin.site.register(DepartmentInfo)
6+
admin.site.register(SectionInfo)
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
from rest_framework import serializers
2+
from applications.inventory.models import Item, DepartmentInfo, SectionInfo, InventoryRequest
3+
4+
# Serializer for Item
5+
class ItemSerializer(serializers.ModelSerializer):
6+
class Meta:
7+
model = Item
8+
fields = ['item_id', 'item_name', 'quantity', 'type', 'unit'] # Fields to serialize
9+
10+
11+
# Serializer for DepartmentInfo
12+
class DepartmentInfoSerializer(serializers.ModelSerializer):
13+
class Meta:
14+
model = DepartmentInfo
15+
fields = ['department_id', 'department_name', 'item_name', 'quantity'] # Fields to serialize
16+
17+
18+
# Serializer for SectionInfo
19+
class SectionInfoSerializer(serializers.ModelSerializer):
20+
class Meta:
21+
model = SectionInfo
22+
fields = ['section_id', 'section_name', 'item_name', 'quantity'] # Fields to serialize
23+
24+
25+
# -------------- NEW SERIALIZER --------------
26+
class InventoryRequestSerializer(serializers.ModelSerializer):
27+
"""
28+
Serializer for InventoryRequest model
29+
"""
30+
class Meta:
31+
model = InventoryRequest
32+
fields = [
33+
'request_id',
34+
'date',
35+
'item_name',
36+
'department_name',
37+
'approval_status',
38+
'purpose',
39+
'specifications'
40+
]
41+
# or simply: fields = '__all__'
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from django.urls import path, include
2+
from rest_framework.routers import DefaultRouter
3+
from . import views
4+
5+
router = DefaultRouter()
6+
router.register(r'items', views.ItemViewSet)
7+
router.register(r'departments', views.DepartmentInfoViewSet)
8+
router.register(r'sections', views.SectionInfoViewSet)
9+
router.register(r'requests', views.InventoryRequestViewSet, basename='inventoryrequest')
10+
11+
urlpatterns = [
12+
path('api/', include(router.urls)),
13+
]
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
from rest_framework import viewsets, filters
2+
from rest_framework.views import APIView
3+
from rest_framework.response import Response
4+
from django.db.models import Sum
5+
from rest_framework.permissions import IsAuthenticated
6+
from django.db.models import Q
7+
from ..models import Item, DepartmentInfo, SectionInfo, InventoryRequest
8+
from .serializers import (
9+
ItemSerializer,
10+
DepartmentInfoSerializer,
11+
SectionInfoSerializer,
12+
InventoryRequestSerializer
13+
)
14+
15+
class ItemViewSet(viewsets.ModelViewSet):
16+
queryset = Item.objects.all()
17+
serializer_class = ItemSerializer
18+
19+
class DepartmentInfoViewSet(viewsets.ModelViewSet):
20+
queryset = DepartmentInfo.objects.all()
21+
serializer_class = DepartmentInfoSerializer
22+
permission_classes = [IsAuthenticated]
23+
filter_backends = [filters.SearchFilter]
24+
search_fields = ['department_name']
25+
26+
def get_queryset(self):
27+
queryset = super().get_queryset()
28+
department = self.request.query_params.get('department', None)
29+
if department:
30+
# Case-insensitive filtering
31+
queryset = queryset.filter(department_name__iexact=department)
32+
else:
33+
# Return an empty queryset if no department is provided
34+
queryset = queryset.none()
35+
return queryset
36+
37+
class SectionInfoViewSet(viewsets.ModelViewSet):
38+
queryset = SectionInfo.objects.all()
39+
serializer_class = SectionInfoSerializer
40+
permission_classes = [IsAuthenticated]
41+
filter_backends = [filters.SearchFilter]
42+
search_fields = ['section_name']
43+
44+
def get_queryset(self):
45+
queryset = super().get_queryset()
46+
section = self.request.query_params.get('section', None)
47+
if section:
48+
# Case-insensitive filtering
49+
queryset = queryset.filter(section_name__iexact=section)
50+
else:
51+
# Return an empty queryset if no section is provided
52+
queryset = queryset.none()
53+
return queryset
54+
55+
class InventoryRequestViewSet(viewsets.ModelViewSet):
56+
"""
57+
ViewSet for managing InventoryRequest objects.
58+
"""
59+
queryset = InventoryRequest.objects.all()
60+
serializer_class = InventoryRequestSerializer
61+
permission_classes = [IsAuthenticated]
62+
63+
class ItemCountView(APIView):
64+
permission_classes = [IsAuthenticated]
65+
66+
def get(self, request):
67+
try:
68+
# Aggregating total quantity for departments and sections
69+
department_total = DepartmentInfo.objects.aggregate(total_quantity=Sum('quantity'))['total_quantity'] or 0
70+
section_total = SectionInfo.objects.aggregate(total_quantity=Sum('quantity'))['total_quantity'] or 0
71+
72+
return Response({
73+
"department_total_quantity": department_total,
74+
"section_total_quantity": section_total,
75+
})
76+
except Exception as e:
77+
return Response({"error": str(e)}, status=500)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from django.apps import AppConfig
2+
3+
4+
class inventoryConfig(AppConfig):
5+
6+
name = 'inventory'
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# Generated by Django 3.1.5 on 2024-11-17 16:33
2+
3+
from django.db import migrations, models
4+
5+
class Migration(migrations.Migration):
6+
7+
initial = True
8+
9+
dependencies = [
10+
]
11+
12+
operations = [
13+
migrations.CreateModel(
14+
name='DepartmentInfo',
15+
fields=[
16+
('department_id', models.AutoField(primary_key=True, serialize=False)),
17+
('department_name', models.CharField(max_length=100)),
18+
('item_name', models.CharField(max_length=100)),
19+
('quantity', models.PositiveIntegerField(default=0)),
20+
],
21+
),
22+
migrations.CreateModel(
23+
name='Item',
24+
fields=[
25+
('item_id', models.AutoField(primary_key=True, serialize=False)),
26+
('item_name', models.CharField(max_length=100)),
27+
('quantity', models.PositiveIntegerField(default=0)),
28+
('type', models.CharField(choices=[('Consumable', 'Consumable'), ('Non-Consumable', 'Non-Consumable')], max_length=20)),
29+
('unit', models.CharField(max_length=50)),
30+
],
31+
),
32+
migrations.CreateModel(
33+
name='SectionInfo',
34+
fields=[
35+
('section_id', models.AutoField(primary_key=True, serialize=False)),
36+
('section_name', models.CharField(max_length=100)),
37+
('item_name', models.CharField(max_length=100)),
38+
('quantity', models.PositiveIntegerField(default=0)),
39+
],
40+
),
41+
]

0 commit comments

Comments
 (0)