diff --git a/FusionIIIT/applications/eis/migrations/0001_initial.py b/FusionIIIT/applications/eis/migrations/0001_initial.py index 265b34ac7..140702a32 100644 --- a/FusionIIIT/applications/eis/migrations/0001_initial.py +++ b/FusionIIIT/applications/eis/migrations/0001_initial.py @@ -277,4 +277,4 @@ class Migration(migrations.Migration): ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), - ] + ] \ No newline at end of file diff --git a/FusionIIIT/applications/iwdModuleV2/api/serializers.py b/FusionIIIT/applications/iwdModuleV2/api/serializers.py index 1b4e04b4a..70d7d9f17 100644 --- a/FusionIIIT/applications/iwdModuleV2/api/serializers.py +++ b/FusionIIIT/applications/iwdModuleV2/api/serializers.py @@ -137,4 +137,51 @@ class Meta: class LetterOfIntentDetailsSerializer(serializers.ModelSerializer): class Meta: model = LetterOfIntentDetails - fields = '__all__' \ No newline at end of file + fields = '__all__' + +class ItemSerializer(serializers.ModelSerializer): + class Meta: + model = Item + fields = '__all__' +class ProposalSerializer(serializers.ModelSerializer): + items = ItemSerializer(many=True) + class Meta: + model = Proposal + fields = '__all__' + + def create(self, validated_data): + items_data = validated_data.pop('items') + proposal = Proposal.objects.create(**validated_data) + total_budget = 0 + for item_data in items_data: + item = Item.objects.create(proposal=proposal, **item_data) + total_budget += item.total_price + proposal.proposal_budget = total_budget + proposal.save() + return proposal + + def update(self, instance, validated_data): + items_data = validated_data.pop('items') + instance.supporting_documents = validated_data.get('supporting_documents', instance.supporting_documents) + instance.status = validated_data.get('status', instance.status) + instance.save() + + total_budget = 0 + for item_data in items_data: + item_id = item_data.get('id') + if item_id: + item = Item.objects.get(id=item_id, proposal=instance) + item.name = item_data.get('name', item.name) + item.description = item_data.get('description', item.description) + item.unit = item_data.get('unit', item.unit) + item.price_per_unit = item_data.get('price_per_unit', item.price_per_unit) + item.total_price = item_data.get('total_price', item.total_price) + item.docs = item_data.get('docs', item.docs) + item.save() + else: + item = Item.objects.create(proposal=instance, **item_data) + total_budget += item.total_price + + instance.proposal_budget = total_budget + instance.save() + return instance \ No newline at end of file diff --git a/FusionIIIT/applications/iwdModuleV2/api/views.py b/FusionIIIT/applications/iwdModuleV2/api/views.py index 069b3fda0..b558fc800 100644 --- a/FusionIIIT/applications/iwdModuleV2/api/views.py +++ b/FusionIIIT/applications/iwdModuleV2/api/views.py @@ -54,8 +54,7 @@ def create_request(request): to create a new request ''' data = request.data - data['requestCreatedBy'] = request.user.username - data['requestCreatedBy'] = request.user.username + data['requestCreatedBy'] = request.user.username serializer = CreateRequestsSerializer(data=data, context={'request': request}) if serializer.is_valid(): @@ -1172,5 +1171,32 @@ def handle_settle_bill_requests(request): return Response({'error': 'Request ID not provided'}, status=status.HTTP_400_BAD_REQUEST) +@api_view(['POST']) +@permission_classes([IsAuthenticated]) +def create_proposal(request): + data = request.data + receiver_desg, receiver_user = data.get('designation').split('|') + serializer = ProposalSerializer(data=request.data) + if serializer.is_valid(): + file_id = create_file( + uploader=request.user.username, + uploader_designation=data.get('role'), + receiver=receiver_user, + receiver_designation=receiver_desg, + src_module="IWD", + src_object_id=str(data.get("id")), + file_extra_JSON={"value": 2}, + attached_file=None + ) + file_instance = File.objects.get(id=file_id) + proposal = serializer.save(created_by=request.user, file=file_instance) + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) +@api_view(['GET']) +@permission_classes([IsAuthenticated]) +def get_proposals(request, request_id): + proposals = Proposal.objects.filter(request_id=request_id) + serializer = ProposalSerializer(proposals, many=True) + return Response(serializer.data, status=status.HTTP_200_OK) diff --git a/FusionIIIT/applications/iwdModuleV2/models.py b/FusionIIIT/applications/iwdModuleV2/models.py index b78b7b3ef..3dd3058d3 100644 --- a/FusionIIIT/applications/iwdModuleV2/models.py +++ b/FusionIIIT/applications/iwdModuleV2/models.py @@ -1,5 +1,7 @@ from django.db import models from datetime import date +#from django.contrib.auth.models import User +from applications.filetracking.models import File # Create your models here. @@ -196,3 +198,21 @@ class Bills(models.Model): class Budget(models.Model): name = models.CharField(max_length=200) budgetIssued = models.IntegerField(default=0) + +class Proposal(models.Model): + request = models.ForeignKey(Requests, on_delete=models.CASCADE, related_name='proposals') + created_by = models.CharField(max_length=200) #models.ForeignKey(User, on_delete=models.CASCADE) + file = models.ForeignKey(File, on_delete=models.CASCADE, null=True, blank=True) + proposal_budget = models.DecimalField(max_digits=15, decimal_places=2, null=True, blank=True) + supporting_documents = models.FileField(upload_to='proposals/', null=True, blank=True) + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + status = models.CharField(max_length=20, choices=[('Pending', 'Pending'), ('Approved', 'Approved'), ('Rejected', 'Rejected')], default='Pending') +class Item(models.Model): + proposal = models.ForeignKey('Proposal', on_delete=models.CASCADE, related_name='items') + name = models.CharField(max_length=255) + description = models.TextField() + unit = models.CharField(max_length=50) + price_per_unit = models.DecimalField(max_digits=10, decimal_places=2) + total_price = models.DecimalField(max_digits=10, decimal_places=2) + docs = models.FileField(upload_to='items/', null=True, blank=True)