Ejemplo n.º 1
0
 def create_coupon_and_vouchers(self, cleaned_voucher_data):
     return create_coupon_product(
         benefit_type=cleaned_voucher_data['benefit_type'],
         benefit_value=cleaned_voucher_data['benefit_value'],
         catalog=cleaned_voucher_data['coupon_catalog'],
         catalog_query=cleaned_voucher_data['catalog_query'],
         category=cleaned_voucher_data['category'],
         code=cleaned_voucher_data['code'],
         course_catalog=cleaned_voucher_data['course_catalog'],
         course_seat_types=cleaned_voucher_data['course_seat_types'],
         email_domains=cleaned_voucher_data['email_domains'],
         end_datetime=cleaned_voucher_data['end_datetime'],
         enterprise_customer=cleaned_voucher_data['enterprise_customer'],
         enterprise_customer_catalog=cleaned_voucher_data['enterprise_customer_catalog'],
         max_uses=cleaned_voucher_data['max_uses'],
         note=cleaned_voucher_data['note'],
         partner=cleaned_voucher_data['partner'],
         price=cleaned_voucher_data['price'],
         quantity=cleaned_voucher_data['quantity'],
         start_datetime=cleaned_voucher_data['start_datetime'],
         title=cleaned_voucher_data['title'],
         voucher_type=cleaned_voucher_data['voucher_type'],
         program_uuid=cleaned_voucher_data['program_uuid'],
         site=self.request.site,
         sales_force_id=cleaned_voucher_data['sales_force_id'],
     )
Ejemplo n.º 2
0
    def create_custom_coupon(self,
                             benefit_value=100,
                             code='',
                             max_uses=None,
                             note=None,
                             quantity=1,
                             title='Tešt Čoupon'):
        """Create a custom test coupon product."""

        return create_coupon_product(benefit_type=Benefit.PERCENTAGE,
                                     benefit_value=benefit_value,
                                     catalog=self.catalog,
                                     catalog_query=None,
                                     category=self.category,
                                     code=code,
                                     course_catalog=None,
                                     course_seat_types=None,
                                     email_domains=None,
                                     end_datetime='2020-1-1',
                                     enterprise_customer=None,
                                     max_uses=max_uses,
                                     note=note,
                                     partner=self.partner,
                                     price=100,
                                     quantity=quantity,
                                     start_datetime='2015-1-1',
                                     title=title,
                                     voucher_type=Voucher.ONCE_PER_CUSTOMER,
                                     program_uuid=None,
                                     site=self.site)
Ejemplo n.º 3
0
    def create(self, request, *args, **kwargs):
        """Adds coupon to the user's basket.

        Expects request array to contain all the necessary data (listed out below).
        This information is then used to create a coupon product, add to a
        basket and create an order from it.

        Arguments:
            request (HttpRequest): With parameters title, client,
            stock_record_ids, start_date, end_date, code, benefit_type, benefit_value,
            voucher_type, quantity, price, category, note and invoice data in the body.

        Returns:
            200 if the order was created successfully; the basket ID is included in the response
                body along with the order ID and payment information.
            400 if a custom code is received that already exists,
                if a course mode is selected that is not supported.
            401 if an unauthenticated request is denied permission to access the endpoint.
            429 if the client has made requests at a rate exceeding that allowed by the configured rate limit.
            500 if an error occurs when attempting to create a coupon.
        """
        try:
            with transaction.atomic():
                try:
                    cleaned_voucher_data = self.clean_voucher_request_data(
                        request)
                except ValidationError as error:
                    logger.exception('Failed to create coupon. %s',
                                     error.message)
                    # FIXME This should ALWAYS return 400.
                    return Response(error.message, status=error.code or 400)

                try:
                    coupon_product = create_coupon_product(
                        benefit_type=cleaned_voucher_data['benefit_type'],
                        benefit_value=cleaned_voucher_data['benefit_value'],
                        catalog=cleaned_voucher_data['coupon_catalog'],
                        catalog_query=cleaned_voucher_data['catalog_query'],
                        category=cleaned_voucher_data['category'],
                        code=cleaned_voucher_data['code'],
                        course_catalog=cleaned_voucher_data['course_catalog'],
                        course_seat_types=cleaned_voucher_data[
                            'course_seat_types'],
                        email_domains=cleaned_voucher_data['email_domains'],
                        end_datetime=cleaned_voucher_data['end_datetime'],
                        enterprise_customer=cleaned_voucher_data[
                            'enterprise_customer'],
                        enterprise_customer_catalog=cleaned_voucher_data[
                            'enterprise_customer_catalog'],
                        max_uses=cleaned_voucher_data['max_uses'],
                        note=cleaned_voucher_data['note'],
                        partner=cleaned_voucher_data['partner'],
                        price=cleaned_voucher_data['price'],
                        quantity=cleaned_voucher_data['quantity'],
                        start_datetime=cleaned_voucher_data['start_datetime'],
                        title=cleaned_voucher_data['title'],
                        voucher_type=cleaned_voucher_data['voucher_type'],
                        program_uuid=cleaned_voucher_data['program_uuid'],
                        site=self.request.site)
                except (KeyError, IntegrityError) as error:
                    logger.exception('Coupon creation failed!')
                    return Response(str(error),
                                    status=status.HTTP_400_BAD_REQUEST)

                basket = prepare_basket(request, [coupon_product])

                # Create an order now since payment is handled out of band via an invoice.
                client, __ = BusinessClient.objects.get_or_create(
                    name=request.data.get('client'))
                invoice_data = self.create_update_data_dict(
                    data=request.data,
                    fields=Invoice.UPDATEABLE_INVOICE_FIELDS)
                response_data = self.create_order_for_invoice(
                    basket,
                    coupon_id=coupon_product.id,
                    client=client,
                    invoice_data=invoice_data)

                return Response(response_data, status=status.HTTP_200_OK)
        except ValidationError as e:
            raise serializers.ValidationError(e.message)
Ejemplo n.º 4
0
    def create_coupon(self, benefit_type=Benefit.PERCENTAGE, benefit_value=100, catalog=None, catalog_query=None,
                      client=None, code='', course_seat_types=None, email_domains=None, enterprise_customer=None,
                      enterprise_customer_catalog=None, max_uses=None, note=None, partner=None, price=100, quantity=5,
                      title='Test coupon', voucher_type=Voucher.SINGLE_USE, course_catalog=None, program_uuid=None,
                      start_datetime=None, end_datetime=None):
        """Helper method for creating a coupon.

        Arguments:
            benefit_type(str): The voucher benefit type
            benefit_value(int): The voucher benefit value
            catalog(Catalog): Catalog of courses for which the coupon applies
            catalog_query(str): Course query string
            client (BusinessClient):  Optional business client object
            code(str): Custom coupon code
            course_catalog (int): Course catalog id from Discovery Service
            course_seat_types(str): A string of comma-separated list of seat types
            enterprise_customer (str): Hex-encoded UUID for an Enterprise Customer object from the Enterprise app.
            enterprise_customer_catalog (str): UUID for an Enterprise Customer Catalog from the Enterprise app.
            email_domains(str): A comma seperated list of email domains
            max_uses (int): Number of Voucher max uses
            note (str): Coupon note.
            partner(Partner): Partner used for creating a catalog
            price(int): Price of the coupon
            quantity (int): Number of vouchers to be created and associated with the coupon
            title(str): Title of the coupon
            voucher_type (str): Voucher type
            program_uuid (str): Program UUID

        Returns:
            coupon (Coupon)

        """
        if partner is None:
            partner = PartnerFactory(name='Tester')
        if client is None:
            client, __ = BusinessClient.objects.get_or_create(name='Test Client')
        if (catalog is None and not enterprise_customer_catalog and not
                ((catalog_query or course_catalog or program_uuid) and course_seat_types)):
            catalog = Catalog.objects.create(partner=partner)
        if code != '':
            quantity = 1

        with mock.patch(
                "ecommerce.extensions.voucher.utils.get_enterprise_customer",
                mock.Mock(return_value={'name': 'Fake enterprise'})):
            coupon = create_coupon_product(
                benefit_type=benefit_type,
                benefit_value=benefit_value,
                catalog=catalog,
                catalog_query=catalog_query,
                category=self.category,
                code=code,
                course_catalog=course_catalog,
                course_seat_types=course_seat_types,
                email_domains=email_domains,
                end_datetime=end_datetime or (datetime.datetime.now() + datetime.timedelta(days=500)),
                enterprise_customer=enterprise_customer,
                enterprise_customer_catalog=enterprise_customer_catalog,
                max_uses=max_uses,
                note=note,
                partner=partner,
                price=price,
                quantity=quantity,
                start_datetime=start_datetime or datetime.datetime(2015, 1, 1),
                title=title,
                voucher_type=voucher_type,
                program_uuid=program_uuid,
                site=self.site
            )

        request = RequestFactory()
        request.site = self.site
        request.user = UserFactory()
        request.COOKIES = {}
        request.GET = {}

        self.basket = prepare_basket(request, [coupon])

        view = CouponViewSet()
        view.request = request

        self.response_data = view.create_order_for_invoice(self.basket, coupon_id=coupon.id, client=client)
        coupon.client = client

        return coupon
Ejemplo n.º 5
0
    def create_coupon(self, benefit_type=Benefit.PERCENTAGE, benefit_value=100, catalog=None,
                      catalog_query=None, client=None, code='', course_seat_types=None, email_domains=None,
                      max_uses=None, note=None, partner=None, price=100, quantity=5, title='Test coupon',
                      voucher_type=Voucher.SINGLE_USE):
        """Helper method for creating a coupon.

        Arguments:
            benefit_type(str): The voucher benefit type
            benefit_value(int): The voucher benefit value
            catalog(Catalog): Catalog of courses for which the coupon applies
            catalog_query(str): Course query string
            code(str): Custom coupon code
            course_seat_types(str): A string of comma-separated list of seat types
            email_domains(str): A comma seperated list of email domains
            partner(Partner): Partner used for creating a catalog
            price(int): Price of the coupon
            title(str): Title of the coupon

        Returns:
            coupon (Coupon)

        """
        if partner is None:
            partner = PartnerFactory(name='Tester')
        if client is None:
            client, __ = BusinessClient.objects.get_or_create(name='Test Client')
        if catalog is None and not (catalog_query and course_seat_types):
            catalog = Catalog.objects.create(partner=partner)
        if code is not '':
            quantity = 1

        coupon = create_coupon_product(
            benefit_type=benefit_type,
            benefit_value=benefit_value,
            catalog=catalog,
            catalog_query=catalog_query,
            category=self.category,
            code=code,
            course_seat_types=course_seat_types,
            email_domains=email_domains,
            end_datetime=datetime.date(2020, 1, 1),
            max_uses=max_uses,
            note=note,
            partner=partner,
            price=price,
            quantity=quantity,
            start_datetime=datetime.date(2015, 1, 1),
            title=title,
            voucher_type=voucher_type
        )

        request = RequestFactory()
        request.site = self.site
        request.user = factories.UserFactory()
        request.COOKIES = {}

        self.basket = prepare_basket(request, coupon)

        view = CouponViewSet()
        view.request = request

        self.response_data = view.create_order_for_invoice(self.basket, coupon_id=coupon.id, client=client)
        coupon.client = client

        return coupon
Ejemplo n.º 6
0
    def create(self, request, *args, **kwargs):
        """Adds coupon to the user's basket.

        Expects request array to contain all the necessary data (listed out below).
        This information is then used to create a coupon product, add to a
        basket and create an order from it.

        Arguments:
            request (HttpRequest): With parameters title, client,
            stock_record_ids, start_date, end_date, code, benefit_type, benefit_value,
            voucher_type, quantity, price, category, note and invoice data in the body.

        Returns:
            200 if the order was created successfully; the basket ID is included in the response
                body along with the order ID and payment information.
            400 if a custom code is received that already exists,
                if a course mode is selected that is not supported.
            401 if an unauthenticated request is denied permission to access the endpoint.
            429 if the client has made requests at a rate exceeding that allowed by the configured rate limit.
            500 if an error occurs when attempting to create a coupon.
        """
        category_data = request.data.get('category')
        code = request.data.get('code')
        course_seat_types = request.data.get('course_seat_types')
        max_uses = request.data.get('max_uses')
        partner = request.site.siteconfiguration.partner
        stock_record_ids = request.data.get('stock_record_ids')
        voucher_type = request.data.get('voucher_type')

        with transaction.atomic():
            if code:
                try:
                    Voucher.objects.get(code=code)
                    return Response(
                        'A coupon with code {code} already exists.'.format(
                            code=code),
                        status=status.HTTP_400_BAD_REQUEST)
                except Voucher.DoesNotExist:
                    pass

            if course_seat_types:
                course_seat_types = prepare_course_seat_types(
                    course_seat_types)

            try:
                category = Category.objects.get(name=category_data['name'])
            except Category.DoesNotExist:
                return Response('Category {category_name} not found.'.format(
                    category_name=category_data['name']),
                                status=status.HTTP_404_NOT_FOUND)
            except KeyError:
                return Response('Invalid Coupon Category data.',
                                status=status.HTTP_400_BAD_REQUEST)

            # Maximum number of uses can be set for each voucher type and disturb
            # the predefined behaviours of the different voucher types. Therefor
            # here we enforce that the max_uses variable can't be used for SINGLE_USE
            # voucher types.
            if max_uses and voucher_type != Voucher.SINGLE_USE:
                max_uses = int(max_uses)
            else:
                max_uses = None

            # When a black-listed course mode is received raise an exception.
            # Audit modes do not have a certificate type and therefore will raise
            # an AttributeError exception.
            if stock_record_ids:
                seats = Product.objects.filter(
                    stockrecords__id__in=stock_record_ids)
                for seat in seats:
                    try:
                        if seat.attr.certificate_type in settings.BLACK_LIST_COUPON_COURSE_MODES:
                            return Response('Course mode not supported',
                                            status=status.HTTP_400_BAD_REQUEST)
                    except AttributeError:
                        return Response('Course mode not supported',
                                        status=status.HTTP_400_BAD_REQUEST)

                stock_records_string = ' '.join(
                    str(id) for id in stock_record_ids)
                coupon_catalog, __ = get_or_create_catalog(
                    name='Catalog for stock records: {}'.format(
                        stock_records_string),
                    partner=partner,
                    stock_record_ids=stock_record_ids)
            else:
                coupon_catalog = None

            coupon_product = create_coupon_product(
                benefit_type=request.data.get('benefit_type'),
                benefit_value=request.data.get('benefit_value'),
                catalog=coupon_catalog,
                catalog_query=request.data.get('catalog_query'),
                category=category,
                code=code,
                course_seat_types=course_seat_types,
                email_domains=request.data.get('email_domains'),
                end_datetime=dateutil.parser.parse(
                    request.data.get('end_datetime')),
                max_uses=max_uses,
                note=request.data.get('note'),
                partner=partner,
                price=request.data.get('price'),
                quantity=request.data.get('quantity'),
                start_datetime=dateutil.parser.parse(
                    request.data.get('start_datetime')),
                title=request.data.get('title'),
                voucher_type=voucher_type)

            basket = prepare_basket(request, coupon_product)

            # Create an order now since payment is handled out of band via an invoice.
            client, __ = BusinessClient.objects.get_or_create(
                name=request.data.get('client'))
            invoice_data = self.create_update_data_dict(
                data=request.data, fields=Invoice.UPDATEABLE_INVOICE_FIELDS)
            response_data = self.create_order_for_invoice(
                basket,
                coupon_id=coupon_product.id,
                client=client,
                invoice_data=invoice_data)

            return Response(response_data, status=status.HTTP_200_OK)
Ejemplo n.º 7
0
    def create_coupon(self, benefit_type=Benefit.PERCENTAGE, benefit_value=100, catalog=None,
                      catalog_query=None, client=None, code='', course_seat_types=None, email_domains=None,
                      enterprise_customer=None, max_uses=None, note=None, partner=None, price=100, quantity=5,
                      title='Test coupon', voucher_type=Voucher.SINGLE_USE, course_catalog=None):
        """Helper method for creating a coupon.

        Arguments:
            benefit_type(str): The voucher benefit type
            benefit_value(int): The voucher benefit value
            catalog(Catalog): Catalog of courses for which the coupon applies
            catalog_query(str): Course query string
            client (BusinessClient):  Optional business client object
            code(str): Custom coupon code
            course_catalog (int): Course catalog id from Catalog Service
            course_seat_types(str): A string of comma-separated list of seat types
            enterprise_customer (str): Hex-encoded UUID for an Enterprise Customer object from the Enterprise app.
            email_domains(str): A comma seperated list of email domains
            max_uses (int): Number of Voucher max uses
            note (str): Coupon note.
            partner(Partner): Partner used for creating a catalog
            price(int): Price of the coupon
            quantity (int): Number of vouchers to be created and associated with the coupon
            title(str): Title of the coupon
            voucher_type (str): Voucher type

        Returns:
            coupon (Coupon)

        """
        if partner is None:
            partner = PartnerFactory(name='Tester')
        if client is None:
            client, __ = BusinessClient.objects.get_or_create(name='Test Client')
        if catalog is None and not (catalog_query and course_seat_types):
            catalog = Catalog.objects.create(partner=partner)
        if code is not '':
            quantity = 1

        coupon = create_coupon_product(
            benefit_type=benefit_type,
            benefit_value=benefit_value,
            catalog=catalog,
            catalog_query=catalog_query,
            category=self.category,
            code=code,
            course_catalog=course_catalog,
            course_seat_types=course_seat_types,
            email_domains=email_domains,
            end_datetime=datetime.datetime(2020, 1, 1),
            enterprise_customer=enterprise_customer,
            max_uses=max_uses,
            note=note,
            partner=partner,
            price=price,
            quantity=quantity,
            start_datetime=datetime.datetime(2015, 1, 1),
            title=title,
            voucher_type=voucher_type
        )

        request = RequestFactory()
        request.site = self.site
        request.user = factories.UserFactory()
        request.COOKIES = {}

        self.basket = prepare_basket(request, coupon)

        view = CouponViewSet()
        view.request = request

        self.response_data = view.create_order_for_invoice(self.basket, coupon_id=coupon.id, client=client)
        coupon.client = client

        return coupon
Ejemplo n.º 8
0
    def create(self, request, *args, **kwargs):
        """Adds coupon to the user's basket.

        Expects request array to contain all the necessary data (listed out below).
        This information is then used to create a coupon product, add to a
        basket and create an order from it.

        Arguments:
            request (HttpRequest): With parameters title, client,
            stock_record_ids, start_date, end_date, code, benefit_type, benefit_value,
            voucher_type, quantity, price, category, note and invoice data in the body.

        Returns:
            200 if the order was created successfully; the basket ID is included in the response
                body along with the order ID and payment information.
            400 if a custom code is received that already exists,
                if a course mode is selected that is not supported.
            401 if an unauthenticated request is denied permission to access the endpoint.
            429 if the client has made requests at a rate exceeding that allowed by the configured rate limit.
            500 if an error occurs when attempting to create a coupon.
        """
        try:
            with transaction.atomic():
                try:
                    cleaned_voucher_data = self.clean_voucher_request_data(request)
                except ValidationError as error:
                    logger.exception('Failed to create coupon. %s', error.message)
                    return Response(error.message, status=error.code)

                try:
                    coupon_product = create_coupon_product(
                        benefit_type=cleaned_voucher_data['benefit_type'],
                        benefit_value=cleaned_voucher_data['benefit_value'],
                        catalog=cleaned_voucher_data['coupon_catalog'],
                        catalog_query=cleaned_voucher_data['catalog_query'],
                        category=cleaned_voucher_data['category'],
                        code=cleaned_voucher_data['code'],
                        course_catalog=cleaned_voucher_data['course_catalog'],
                        course_seat_types=cleaned_voucher_data['course_seat_types'],
                        email_domains=cleaned_voucher_data['email_domains'],
                        end_datetime=cleaned_voucher_data['end_datetime'],
                        enterprise_customer=cleaned_voucher_data['enterprise_customer'],
                        max_uses=cleaned_voucher_data['max_uses'],
                        note=cleaned_voucher_data['note'],
                        partner=cleaned_voucher_data['partner'],
                        price=cleaned_voucher_data['price'],
                        quantity=cleaned_voucher_data['quantity'],
                        start_datetime=cleaned_voucher_data['start_datetime'],
                        title=cleaned_voucher_data['title'],
                        voucher_type=cleaned_voucher_data['voucher_type'],
                    )
                except (KeyError, IntegrityError) as error:
                    return Response(str(error), status=status.HTTP_400_BAD_REQUEST)

                basket = prepare_basket(request, coupon_product)

                # Create an order now since payment is handled out of band via an invoice.
                client, __ = BusinessClient.objects.get_or_create(name=request.data.get('client'))
                invoice_data = self.create_update_data_dict(data=request.data, fields=Invoice.UPDATEABLE_INVOICE_FIELDS)
                response_data = self.create_order_for_invoice(
                    basket, coupon_id=coupon_product.id, client=client, invoice_data=invoice_data
                )

                return Response(response_data, status=status.HTTP_200_OK)
        except ValidationError as e:
            raise serializers.ValidationError(e.message)