Advertisement
Guest User

Untitled

a guest
Jan 18th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.02 KB | None | 0 0
  1. def create_promocodes(code_count=1, code=None, code_length=7, **kwargs):  # noqa: C901
  2.     """
  3.    Создание одного или нескольких промокодов.
  4.    Если планируется создание одного промокода, то его код может быть введен с админки руками.
  5.    В случае множественного создания используем генератор промокодов.
  6.    При множественном создании промокода записываем версию генерации - заинкрименченную
  7.    last_version из Discount.
  8.    При создании одного промокода версии генерации увеличивать смысла нет, т.к.
  9.    не должно быть такого, что на одну акцию будет несколько "ручных" промокодов,
  10.    а даже если и будут, то пусть они будут одной версии.
  11.    """
  12.     if code_count == 1:
  13.         if code:
  14.             try:
  15.                 kwargs.update({'code': code})
  16.                 return Promocode.create(**kwargs)
  17.             except peewee.IntegrityError:
  18.                 raise PromocodeExist('This promocode already exists')
  19.             except peewee.InternalError as e:
  20.                 if 'duplicate promocode' in e.args[0]:
  21.                     raise PromocodeExist('This promocode already exists')
  22.         else:
  23.             try:
  24.                 code = generate_code(length=code_length)
  25.                 kwargs.update({'code': code})
  26.                 return Promocode.create(**kwargs)
  27.             except peewee.IntegrityError:
  28.                 logger.error('Looks like non-unique promocode has been generated. Trying again...')
  29.                 return create_promocodes(code_count=code_count,
  30.                                          code_length=code_length, **kwargs)
  31.             except peewee.InternalError as e:
  32.                 if 'duplicate promocode' in e.args[0]:
  33.                     logger.error('Looks like non-unique promocode has been generated. Trying again...')
  34.                     return create_promocodes(code_count=code_count,
  35.                                              code_length=code_length, **kwargs)
  36.     else:
  37.         try:
  38.             discount_id = kwargs['discount']
  39.             discount = Discount.get(id=discount_id)
  40.             discount_current_version = discount.last_version + 1
  41.         except Exception as e:
  42.             logger.error(e)
  43.             return False
  44.  
  45.         data = []
  46.         for i in range(0, code_count):
  47.             d = kwargs.copy()
  48.             d.update({'code': generate_code(length=code_length),
  49.                       'version': discount_current_version})
  50.             data.append(d)
  51.         pr_ids = None
  52.         with database.atomic() as tr:
  53.             try:
  54.                 discount.last_version = discount_current_version
  55.                 discount.save()
  56.                 pr_ids = Promocode.insert_many(data).return_id_list().execute()
  57.             except peewee.IntegrityError as e:
  58.                 logger.error('Looks like some promocodes have been generated as non-unique. '
  59.                              'Rollback and trying again...')
  60.                 logger.error(e)
  61.                 tr.rollback()
  62.                 return create_promocodes(code_count=code_count,
  63.                                          code_length=code_length, **kwargs)
  64.             except peewee.InternalError as e:
  65.                 if 'duplicate promocode' in e.args[0]:
  66.                     logger.error(
  67.                         'Looks like some promocodes have been generated as non-unique. '
  68.                         'Rollback and trying again...')
  69.                     logger.error(e)
  70.                     tr.rollback()
  71.                     return create_promocodes(code_count=code_count,
  72.                                              code_length=code_length, **kwargs)
  73.         return Promocode.get(id=pr_ids.__next__())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement