Ejemplo n.º 1
0
 def get_queryset(self):
     try:
         return Resources.shortlist()
     except Resources.QueryError:
         logger.warning(f"Query error | {self.__class__.__name__}",
                        exc_info=True)
         raise QueryError()
Ejemplo n.º 2
0
 def post(self, request, *args, **kwargs):
     data = request.data
     try:
         ids = data['ids']
     except KeyError as ex:
         logger.warning(f"'id' not specified | {self.__class__.__name__}")
         raise NoParameterSpecified('ids')
     if not isinstance(ids, list):
         logger.warning(
             f"'ids' has wrong type. Type: {type(ids)} | {self.__class__.__name__}"
         )
         raise ParameterExceptions(detail="'ids' must be list object.")
     try:
         Resources.bulk_delete(ids, request.user)
     except Resources.UpdateError:
         logger.warning("Update error | {self.__class__.__name__}")
         raise UpdateError()
     return Response(data={'correct': True},
                     status=status.HTTP_202_ACCEPTED)
Ejemplo n.º 3
0
 def get_object(self):
     s_id = self.kwargs['s_id']
     try:
         resource = Resources.get(s_id)
     except Resource.DoesNotExist:
         logger.warning(
             f"Can`t get object 'Specification' with id: {s_id}. | {self.__class__.__name__}",
             exc_info=True)
         raise Http404()
     self.check_object_permissions(request=self.request, obj=resource)
Ejemplo n.º 4
0
    def get_object(self):
        r_id = self.kwargs['r_id']
        try:
            resource = Resources.get(r_id)
        except Resource.DoesNotExist:
            logger.warning(
                f"Can`t get object 'Resource'. | {self.__class__.__name__}",
                exc_info=True)
            raise Http404()

        return resource
Ejemplo n.º 5
0
    def get_object(self):
        r_id = self.kwargs['r_id']
        try:
            resource = Resources.detail(r_id)
        except Resources.ResourceDoesNotExist:
            logger.warning(
                f"Can`t get object 'Resource' with id: {r_id} | {self.__class__.__name__}"
            )
            raise Http404()

        return resource
Ejemplo n.º 6
0
    def build_set(cls, specification, amount, from_resources=False, user=None):
        try:
            with transaction.atomic():
                if not isinstance(specification, Specification):
                    if from_resources:
                        specification = Specification.objects.prefetch_related(
                            'res_specs',
                            'res_specs__resource').get(id=specification)
                    else:
                        specification = Specification.objects.get(
                            id=specification)

                resources = []
                actions = []

                operator = Operator.objects.get_or_create_operator(user)
                if from_resources:
                    for res_spec in specification.res_specs.all():
                        resource = res_spec.resource

                        if resource.amount < float(
                                res_spec.amount) * float(amount):
                            raise cls.CantBuildSet()

                        else:
                            action = Resources.change_amount(
                                resource,
                                -float(res_spec.amount) * float(amount),
                                operator, False)
                            resources.append(resource)
                            actions.append(action)

                    Resource.objects.bulk_update(resources, fields=['amount'])

                    value = 'from_resources=True'
                else:
                    value = 'from_resources=False'

                specification.amount += amount
                specification.save()
        except DatabaseError as ex:
            logger.error(f"Error while building set. | {cls.__name__}",
                         exc_info=True)
            raise cls.CantBuildSet()
Ejemplo n.º 7
0
    def edit(cls,
             specification,
             name: str = None,
             product_id: str = None,
             price: float = None,
             coefficient: float = None,
             resource_to_add: List[Dict[str, str]] = None,
             resource_to_delete: List[str] = None,
             category_name: str = None,
             storage_amount: int = None,
             user=None):
        try:
            with transaction.atomic():

                specification = cls.get(specification)
                operator = Operator.objects.get_or_create_operator(user)

                value_data = []

                # Model field block

                # ----------
                if name is not None:
                    specification.name = name
                    value_data.append(f"name={name}")

                if product_id is not None:
                    specification.product_id = product_id
                    value_data.append(f"product_id={product_id}")

                # -----------

                # Setting category, price, coefficient, amount block

                # -----------
                actions = []
                if category_name is not None:
                    if category_name != "":
                        category = SpecificationCategory.objects.get_or_create(
                            name=category_name)[0]
                        category, category_action = cls.set_category(
                            specification, category, operator, False)
                        actions.append(category_action)
                        value_data.append(f"category={category_name}")

                        if category.coefficient is not None:
                            coefficient, coefficient_action = cls.set_coefficient(
                                specification, category.coefficient, operator,
                                False)
                    else:
                        specification.category = None

                if price is not None:
                    _, price_action = cls.set_price(specification, price,
                                                    operator, False)
                    actions.append(price_action)

                if coefficient is not None:
                    _, coefficient_action = cls.set_coefficient(
                        specification, coefficient, operator, False)
                    actions.append(coefficient_action)

                if storage_amount is not None:
                    _, amount_action = cls.set_amount(specification,
                                                      storage_amount, operator,
                                                      False)
                    actions.append(amount_action)
                # -----------

                # Resource block

                # -----------
                if resource_to_delete is not None and len(
                        resource_to_delete) != 0:
                    SpecificationResource.objects.filter(
                        specification=specification,
                        resource_id__in=resource_to_delete).delete()

                if resource_to_add is not None and len(resource_to_add) != 0:
                    res_specs = []
                    _resources = []
                    for resource in resource_to_add:
                        res = Resource.objects.get(id=resource['id'])
                        res_specs.append(
                            SpecificationResource.objects.create(
                                resource_id=resource['id'],
                                amount=resource['amount'],
                                specification=specification))
                        _resources.append({
                            'resources_create': res,
                            'amount': resource['amount']
                        })

                try:
                    res_specs = SpecificationResource.objects.select_related(
                        'resource').filter(specification=specification)
                    for res_spec in res_specs:
                        res = res_spec.resource

                    specification.resources = res_specs

                except SpecificationResource.DoesNotExist:
                    raise Resources.ResourceDoesNotExist()
        except DatabaseError as ex:
            logger.error(f"Specification edit error. | {cls.__name__}",
                         exc_info=True)
            raise cls.EditError()

        return specification
Ejemplo n.º 8
0
 def get(self, request, *args, **kwargs):
     return Response(data={'count': Resources.expired_count()},
                     status=status.HTTP_200_OK)
Ejemplo n.º 9
0
 def get_queryset(self):
     try:
         return Resources.providers()
     except Resources.QueryError:
         logger.warning(f"Query error | ProviderListView")
         raise QueryError()
Ejemplo n.º 10
0
 def get_queryset(self):
     try:
         return Resources.list()
     except Resources.QueryError:
         logger.warning(f"Query error | ResourceListView")
         raise QueryError()