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'],
                })
Esempio n. 2
0
    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)
Esempio n. 3
0
        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):
Esempio n. 4
0
    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
        })
Esempio n. 5
0
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)
Esempio n. 6
0
        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'