Ejemplo n.º 1
0
    def create(self, request, *args, **kwargs):
        """
        :param request: Request
        :return: Response
        """
        # Prepare variables
        file = request.FILES.get('file')
        tmp_path = os.path.join(settings.MEDIA_ROOT, 'tmp')
        fss = FileSystemStorage(tmp_path)
        file_name = fss.save(file.name, file)
        file_path = fss.path(file_name)
        file_extension = file_name.split('.')[-1]

        # Check extension
        if file_extension not in ['csv']:
            return Response(data=['Unsupported file extension.'], status=status.HTTP_400_BAD_REQUEST)

        fields = ['title', 'serial', 'category', 'desc', 'status',]

        # Read data from uploaded file
        with open(file_path, 'r') as f:
            item_interfaces = []
            reader = csv.reader(f)

            for i, row in enumerate(reader):
                # Get column indexes
                if i == 0:
                    columns = {}
                    for f in fields:
                        if f in row:
                            columns[f] = row.index(f)
                    continue
                if not columns:
                    raise serializers.ValidationError({'Error': 'CSV column error'})

                # Prepare data
                data = {field: row[idx] for field, idx in columns.items()}
                data['creator'] = request.user
                data['key'] = "none"

                serializer = self.get_serializer(data=data)
                if not serializer.is_valid():
                    response_data = {'line': i + 1, 'errors': serializer.errors}
                    return Response(response_data, status.HTTP_400_BAD_REQUEST)
                item_interface = ItemInterface()
                for k, v in data.items():
                    setattr(item_interface, k, v)

                item_serializer = ItemSerializer(data=data, context={'request': request})
                item_interface.is_valid = item_serializer.is_valid()
                item_interface.errors = item_serializer.errors if not item_interface.is_valid else ''

                item_interfaces.append(item_interface)

            ItemInterface.objects.bulk_create(item_interfaces)

        # Remove uploaded file
        shutil.rmtree(tmp_path)

        return Response(status=status.HTTP_201_CREATED)
Ejemplo n.º 2
0
    def perform_update(self, serializer):
        serializer.save()

        data = serializer.data
        data['key'] = "none"
        for k in ['id', 'is_valid', 'errors']:
            data.pop(k)

        item_serializer = ItemSerializer(data=data, context={'request': self.request})

        instance = serializer.instance
        instance.is_valid = item_serializer.is_valid()
        instance.errors = item_serializer.errors if not instance.is_valid else ''
        instance.save()
Ejemplo n.º 3
0
def copy_data(request):
    fields = [
        'title',
        'serial',
        'category',
        'desc',
        'status',
    ]

    # Get item interfaces
    item_interfaces = ItemInterface.objects.filter(creator=request.user,
                                                   is_valid=True)
    for item_interface in item_interfaces:
        # Prepare data
        data = {f: getattr(item_interface, f) for f in fields}
        data['key'] = "none"
        data['user'] = item_interface.creator_id
        item_serializer = ItemSerializer(data=data,
                                         context={'request': request})
        if item_serializer.is_valid():
            # Create Item
            added_item = item_serializer.save()
            try:
                trans = Transaction(user_from=None,
                                    user_to_id=item_interface.creator_id,
                                    item_id=added_item.id)
                trans.save()
            except Exception as e:
                print(e)

            # Delete Item Interface
            item_interface.delete()

        else:
            # Update instance
            item_interface.is_valid = False
            item_interface.errors = item_serializer.errors
            item_interface.save()

    return Response(status=status.HTTP_204_NO_CONTENT)
Ejemplo n.º 4
0
def copy_data(request):
    fields = ['title', 'serial', 'category', 'desc', 'status', ]

    # Get item interfaces
    item_interfaces = ItemInterface.objects.filter(creator=request.user, is_valid=True)
    for item_interface in item_interfaces:
        # Prepare data
        data = {f: getattr(item_interface, f) for f in fields}
        data['key'] = "none"
        item_serializer = ItemSerializer(data=data, context={'request': request})
        if item_serializer.is_valid():
            # Create Item
            item_serializer.save()

            # Delete Item Interface
            item_interface.delete()

        else:
            # Update instance
            item_interface.is_valid = False
            item_interface.errors = item_serializer.errors
            item_interface.save()

    return Response(status=status.HTTP_204_NO_CONTENT)