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'], )
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)
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)
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
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
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)
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
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)