def handle(self, *args, **options): client = WebMemberClient() departments = client.get_retail_departments() for d in departments: department, _ = Department.objects.update_or_create( id=d['guid'], defaults={ 'number': d['code'], 'name': d['description'], })
def post(self, request): """ Create a new Gift Certificate. """ serializer = CertificateSerializer(data=request.data, context={'employee': request.user}) serializer.is_valid(raise_exception=True) # Ensure a connection to IBS is possible ibs_client = WebMemberClient() if not ibs_client.ping() and False: return Response(_('Unable to connect to IBS.'), status=http_status.HTTP_400_BAD_REQUEST) certificate_manager = CertificatesManager() batch = certificate_manager.create_certificate_batch( request, serializer.certificate_batch_data, serializer.certificate_data) status, errors = certificate_manager.register_certificate( ibs_client, batch) if status: try: certificate_manager.send_certificate_batch_email(batch, delay=5 * 60) except Exception as e: raven_client.captureException() return Response(errors, status=http_status.HTTP_400_BAD_REQUEST) else: batch.delete() return Response(errors, status=http_status.HTTP_400_BAD_REQUEST) return Response(serializer.data, status=http_status.HTTP_200_OK)
except CorpEventsGalleryImage.DoesNotExist: messages.add_message(request, messages.WARNING, _('Image does not exist.')) edit_url = reverse('corp-site.events-gallery-edit', kwargs={'gallery_pk': self.gallery.pk}) return redirect('{}?edit-images'.format(edit_url)) return response def get_extra_context(self, request, *args, **kwargs): context = super().get_extra_context(request, *args, **kwargs) context.update({'image': self.image}) return context webclient = WebMemberClient('Clublink', 'club1nk') class InventoryLookupView(CMSView): template = 'cms/common/inventory-lookup.jinja' def get_breadcrumbs(self, request, *args, **kwargs): crumbs = super().get_breadcrumbs(request, *args, **kwargs) return crumbs + [('', _('Inventory Lookup'))] def get_extra_context(self, request, *args, **kwargs): context = super().get_extra_context(request, *args, **kwargs) context.update({'form': InventoryLookupForm()}) return context def get(self, request, *args, **kwargs):
def post(self, request): data = request.POST if 'reset' in data: if 'gc_step1_data' in request.session: del request.session['gc_step2_data'] if 'gc_template_group' in request.session: del request.session['gc_template_group'] return redirect(reverse('step2')) if 'group' in data: try: group = self.groups.get(pk=data['group']) request.session['gc_template_group'] = group.name except CertificateGroup.DoesNotExist(): pass else: session_data = [] for tpl in group.templates.all(): for i in range(0, tpl.count): key = str(time.time()) data = {'type': tpl.type.pk} if tpl.club: data['club'] = tpl.club.pk if tpl.club_secondary: data['club_secondary'] = tpl.club_secondary.pk if tpl.quantity: data['quantity'] = str(tpl.quantity) if tpl.note: data['note'] = tpl.note if tpl.message: data['message'] = tpl.message if tpl.power_cart is not None: data['power_cart'] = tpl.power_cart if tpl.expiry_date: data['expiry_date'] = tpl.expiry_date.strftime( '%d/%m/%Y') session_data.append([key, data]) request.session['gc_step2_data'] = session_data return redirect(reverse('step2')) # Pass POSTed data to the forms for key in self.forms: key, new_form = self._create_certificate_form( request.user, self.department, data, self.forms[key].index, key) self.forms.update({key: new_form}) refocus_key = None # Handle Add, Duplicate and Delete requests CERTIFICATE_LIMIT_MESSAGE = _( 'You cannot create more than {limit} certificates').format( limit=settings.CERTIFICATES_BATCH_LIMIT) if 'add' in data: if len(self.forms.items()) < settings.CERTIFICATES_BATCH_LIMIT: refocus_key, new_form = self._create_certificate_form( request.user, self.department, index=len(self.forms) + 1) self.forms.update({refocus_key: new_form}) else: refocus_key = data['add'] messages.warning(request, CERTIFICATE_LIMIT_MESSAGE) elif 'duplicate' in data: duplicate_key = data['duplicate'] form_data = self._get_normalized_form_data( self.forms[duplicate_key], duplicate_key) try: count = int( data.get('duplicate-count-{}'.format(duplicate_key), 1)) except ValueError: count = 1 if len(self.forms.items() ) + count <= settings.CERTIFICATES_BATCH_LIMIT: for i in range(count): new_key, new_form = self._create_certificate_form( request.user, self.department, index=len(self.forms) + 1) new_form.initial = form_data if refocus_key is None: refocus_key = new_key self.forms.update({new_key: new_form}) else: refocus_key = duplicate_key messages.warning(request, CERTIFICATE_LIMIT_MESSAGE) elif 'delete' in data: refocus_key = data['delete'] if len(self.forms.items()) > 1: if refocus_key in self.forms: self.forms.pop(refocus_key) else: messages.warning(request, _('You must have at least one certificate.')) elif 'reload' in data: refocus_key = data['reload'] # Store the form data to the session request.session['gc_step2_data'] = self._forms_to_session_data( self.forms) # Redirect to self if an action was requested if refocus_key: return redirect('{}#gc-{}'.format(reverse('step2'), refocus_key)) # Ensure submitted forms are valid is_valid = self.recipient_form.is_valid() for key in self.forms: is_valid &= self.forms[key].is_valid() ''' NEW: Prevent creation of certificates if there are failures at the IBS level, so that faulty certificates are not created and emailed out. ''' # Ensure a connection to IBS is possible self.ibs_client = WebMemberClient() if not self.ibs_client.ping() and False: messages.warning(request, _('Unable to connect to IBS.')) return redirect(reverse('step2')) elif is_valid: batch = self._create_certificate_batch(request) # Check for a specific type of status status, errors = self._register_certificates(batch) request.session['gc_status'] = status request.session['gc_errors'] = errors request.session['gc_batch_id'] = batch.pk if status and not errors: logger.info('Step 2 Gift Certificates - status but no errors', extra={ 'request': request, 'status': status, 'errors': errors }) try: send_certificate_batch_email(request.build_absolute_uri(), batch) except SMTPException: raven_client.captureException() request.session['gc_emailed_to'] = None else: recipient_email = self.recipient_form.cleaned_data[ 'recipient_email'] request.session['gc_emailed_to'] = recipient_email # Clear form data from session del request.session['gc_step1_data'] del request.session['gc_step2_data'] if 'gc_template_group' in request.session: del request.session['gc_template_group'] else: logger.exception('Error from IBS') batch.delete() return redirect(reverse('confirm')) return render(request, 'certificates/step2.jinja', { 'forms': self.forms, 'groups': self.groups })
class Step2View(View): department = None groups = None recipient_form = None ibs_client = None forms = OrderedDict() def _get_normalized_form_data(self, form, key): """Gets a dict of form data with normalized field names.""" data = {} if form.data else form.initial prefix = 'gc{}-'.format(key) for field_name in form.data: normalized_field_name = field_name[len(prefix):] if field_name in form.data and field_name.startswith( prefix) and form.data[field_name]: data[normalized_field_name] = form.data[field_name] for field_name in data: if field_name == 'quantity': data[field_name] = str(data[field_name]) return data def _forms_to_session_data(self, forms): """Converts an ordered dict of forms to a list of data to be stored in the session.""" session_data = [] for key in forms: data = self._get_normalized_form_data(forms[key], key) # Store a key/data pair in the session data session_data.append([str(key), data]) return session_data def _create_certificate_form(self, user, department, data=None, index=1, key=None): """Creates a new certificate form.""" key = key or time.time() form = CertificateForm(user, department, data, prefix='gc{}'.format(key), index=index) return key, form def _session_data_to_forms(self, user, department, session_data): """Converts session data to an ordered dict of forms.""" forms = OrderedDict() if not session_data: key, form = self._create_certificate_form(user, department) forms.update({key: form}) else: for index, (key, form_data) in enumerate(session_data): for data_key in form_data: if data_key == 'quantity': try: form_data[data_key] = decimal.Decimal( form_data[data_key]) except decimal.InvalidOperation: form_data[data_key] = '' form = CertificateForm(user, department, initial=form_data, prefix='gc{}'.format(key), index=index + 1) forms.update({key: form}) return forms def _create_certificate_batch(self, request): """Creates the certificate objects.""" with transaction.atomic(): batch = CertificateBatch.objects.create( creator=request.user, **self.recipient_form.cleaned_data) # Create certificates for key in self.forms: Certificate.objects.create(batch=batch, **self.forms[key].cleaned_data) return batch def _register_certificates(self, batch): errors = [] # Start from the default scenario status = False try: raven_client.context.activate() response = register_certificate_batch(self.ibs_client, batch) logger.info('Certificate batch response', extra={'response': response}) status = response['CreateTicketsResult'] if status is False: if 'a_sMessage' in response: try: message = ElementTree.fromstring( response['a_sMessage']) except ElementTree.ParseError: errors.append(response['a_sMessage']) else: for child in message: if child.tag == 'Error': errors.append(child.find('ErrorMessage').text) raven_client.context.merge( {'extra': { 'response': response, }}) raven_client.captureMessage('Certificate creation failed.') raven_client.context.clear() except Exception as exc: logger.exception('Register certificate exception') status = False errors = ['An unknown error occured.'] if settings.DEBUG: print(exc) raven_client.captureException() print(status, errors) return (status, errors) def get(self, request): # Store the form data to the session request.session['gc_step2_data'] = self._forms_to_session_data( self.forms) return render(request, 'certificates/step2.jinja', { 'forms': self.forms, 'groups': self.groups }) def post(self, request): data = request.POST if 'reset' in data: if 'gc_step1_data' in request.session: del request.session['gc_step2_data'] if 'gc_template_group' in request.session: del request.session['gc_template_group'] return redirect(reverse('step2')) if 'group' in data: try: group = self.groups.get(pk=data['group']) request.session['gc_template_group'] = group.name except CertificateGroup.DoesNotExist(): pass else: session_data = [] for tpl in group.templates.all(): for i in range(0, tpl.count): key = str(time.time()) data = {'type': tpl.type.pk} if tpl.club: data['club'] = tpl.club.pk if tpl.club_secondary: data['club_secondary'] = tpl.club_secondary.pk if tpl.quantity: data['quantity'] = str(tpl.quantity) if tpl.note: data['note'] = tpl.note if tpl.message: data['message'] = tpl.message if tpl.power_cart is not None: data['power_cart'] = tpl.power_cart if tpl.expiry_date: data['expiry_date'] = tpl.expiry_date.strftime( '%d/%m/%Y') session_data.append([key, data]) request.session['gc_step2_data'] = session_data return redirect(reverse('step2')) # Pass POSTed data to the forms for key in self.forms: key, new_form = self._create_certificate_form( request.user, self.department, data, self.forms[key].index, key) self.forms.update({key: new_form}) refocus_key = None # Handle Add, Duplicate and Delete requests CERTIFICATE_LIMIT_MESSAGE = _( 'You cannot create more than {limit} certificates').format( limit=settings.CERTIFICATES_BATCH_LIMIT) if 'add' in data: if len(self.forms.items()) < settings.CERTIFICATES_BATCH_LIMIT: refocus_key, new_form = self._create_certificate_form( request.user, self.department, index=len(self.forms) + 1) self.forms.update({refocus_key: new_form}) else: refocus_key = data['add'] messages.warning(request, CERTIFICATE_LIMIT_MESSAGE) elif 'duplicate' in data: duplicate_key = data['duplicate'] form_data = self._get_normalized_form_data( self.forms[duplicate_key], duplicate_key) try: count = int( data.get('duplicate-count-{}'.format(duplicate_key), 1)) except ValueError: count = 1 if len(self.forms.items() ) + count <= settings.CERTIFICATES_BATCH_LIMIT: for i in range(count): new_key, new_form = self._create_certificate_form( request.user, self.department, index=len(self.forms) + 1) new_form.initial = form_data if refocus_key is None: refocus_key = new_key self.forms.update({new_key: new_form}) else: refocus_key = duplicate_key messages.warning(request, CERTIFICATE_LIMIT_MESSAGE) elif 'delete' in data: refocus_key = data['delete'] if len(self.forms.items()) > 1: if refocus_key in self.forms: self.forms.pop(refocus_key) else: messages.warning(request, _('You must have at least one certificate.')) elif 'reload' in data: refocus_key = data['reload'] # Store the form data to the session request.session['gc_step2_data'] = self._forms_to_session_data( self.forms) # Redirect to self if an action was requested if refocus_key: return redirect('{}#gc-{}'.format(reverse('step2'), refocus_key)) # Ensure submitted forms are valid is_valid = self.recipient_form.is_valid() for key in self.forms: is_valid &= self.forms[key].is_valid() ''' NEW: Prevent creation of certificates if there are failures at the IBS level, so that faulty certificates are not created and emailed out. ''' # Ensure a connection to IBS is possible self.ibs_client = WebMemberClient() if not self.ibs_client.ping() and False: messages.warning(request, _('Unable to connect to IBS.')) return redirect(reverse('step2')) elif is_valid: batch = self._create_certificate_batch(request) # Check for a specific type of status status, errors = self._register_certificates(batch) request.session['gc_status'] = status request.session['gc_errors'] = errors request.session['gc_batch_id'] = batch.pk if status and not errors: logger.info('Step 2 Gift Certificates - status but no errors', extra={ 'request': request, 'status': status, 'errors': errors }) try: send_certificate_batch_email(request.build_absolute_uri(), batch) except SMTPException: raven_client.captureException() request.session['gc_emailed_to'] = None else: recipient_email = self.recipient_form.cleaned_data[ 'recipient_email'] request.session['gc_emailed_to'] = recipient_email # Clear form data from session del request.session['gc_step1_data'] del request.session['gc_step2_data'] if 'gc_template_group' in request.session: del request.session['gc_template_group'] else: logger.exception('Error from IBS') batch.delete() return redirect(reverse('confirm')) return render(request, 'certificates/step2.jinja', { 'forms': self.forms, 'groups': self.groups }) def dispatch(self, request, *args, **kwargs): # Check for data from Step 1 and validate self.recipient_form = RecipientForm( request.user, request.session.get('gc_step1_data', {})) if not self.recipient_form.is_valid(): messages.warning( request, _('You must complete this step before proceeding.')) return redirect(reverse('step1')) self.department = self.recipient_form.cleaned_data['department'] self.groups = CertificateGroup.objects.filter( department=self.department) # Populate forms from the session self.forms = self._session_data_to_forms( request.user, self.department, request.session.get('gc_step2_data')) return super().dispatch(request, *args, **kwargs)
context = self.get_extra_context(request, *args, **kwargs) return render(request, self.template, context) def dispatch(self, request, *args, **kwargs): response = self.process_request(request, *args, **kwargs) if response: return response return super().dispatch(request, *args, **kwargs) class HomeView(GenericPageView): template = 'corp/home.jinja' webclient = WebMemberClient() class PublicInventoryLookupView(GenericPageView): ''' As you're reading this, you might be wondering... why am I using this non-sense, custom CMS' base view class? Well... it's because the template structure is so intimately tied to the variables in the "get_extra_context", that there is essentially no other way to do this without rewriting a new set of views and base templates. You'll need to make sure to create the object in the DB, or the weird-ass middleware will 400 on not finding this in the DB. Oh yeah... you'll have to create it on both the sites because... reasons... too. ''' template = 'corp/inventory-lookup.jinja'