Beispiel #1
0
    def render(self, form_data: dict):
        output = io.StringIO()
        if form_data.get('dialect', '-') in csv.list_dialects():
            writer = csv.writer(output, dialect=form_data.get('dialect'))
        else:
            writer = csv.writer(output,
                                quoting=csv.QUOTE_NONNUMERIC,
                                delimiter=",")

        writer.writerow([_('Order code'), _('Name'), _('Telephone')])

        for order in self.event.orders.filter(status__in=form_data['status']):
            row = [order.code]
            try:
                row.append(order.invoice_address.name)
            except InvoiceAddress.DoesNotExist:
                row.append("")
            contact_form_data = json.loads(
                order.meta_info)['contact_form_data']
            if 'telephone' in contact_form_data:
                row.append(contact_form_data['telephone'])
            else:
                row.append("")
            writer.writerow(row)

        return '{}_telephone.csv'.format(
            self.event.slug), 'text/csv', output.getvalue().encode("utf-8")
Beispiel #2
0
def test_dialect_registry():
    assert 'test' not in oldcsv.list_dialects()
    assert oldcsv.list_dialects() == csv.list_dialects()

    class TestD(csv.excel):
        delimiter = ';'

    csv.register_dialect('test', TestD)

    assert 'test' in oldcsv.list_dialects()
    assert oldcsv.list_dialects() == csv.list_dialects()

    assert oldcsv.get_dialect('test').delimiter == ';'
    assert csv.get_dialect('test').delimiter == ';'

    csv.unregister_dialect('test')
    assert 'test' not in oldcsv.list_dialects()
    assert oldcsv.list_dialects() == csv.list_dialects()
Beispiel #3
0
    def render(self, form_data: dict):
        output = io.StringIO()
        if form_data.get('dialect', '-') in csv.list_dialects():
            writer = csv.writer(output, dialect=form_data.get('dialect'))
        else:
            writer = csv.writer(output,
                                quoting=csv.QUOTE_NONNUMERIC,
                                delimiter=",")

        cl = self.event.checkin_lists.get(pk=form_data['list'])

        questions = list(
            Question.objects.filter(event=self.event,
                                    id__in=form_data['questions']))

        cqs = Checkin.objects.filter(
            position_id=OuterRef('pk'),
            list_id=cl.pk).order_by().values('position_id').annotate(
                m=Max('datetime')).values('m')
        qs = OrderPosition.objects.filter(order__event=self.event, ).annotate(
            last_checked_in=Subquery(cqs)).prefetch_related(
                'answers', 'answers__question', 'addon_to__answers',
                'addon_to__answers__question').select_related(
                    'order', 'item', 'variation', 'addon_to')

        if not cl.all_products:
            qs = qs.filter(
                item__in=cl.limit_products.values_list('id', flat=True))

        if cl.subevent:
            qs = qs.filter(subevent=cl.subevent)

        if form_data['sort'] == 'name':
            qs = qs.order_by(
                Coalesce('attendee_name', 'addon_to__attendee_name'))
        elif form_data['sort'] == 'code':
            qs = qs.order_by('order__code')

        headers = [
            _('Order code'),
            _('Attendee name'),
            _('Product'),
            _('Price'),
            _('Checked in')
        ]
        if not cl.include_pending:
            qs = qs.filter(order__status=Order.STATUS_PAID)
        else:
            qs = qs.filter(order__status__in=(Order.STATUS_PAID,
                                              Order.STATUS_PENDING))
            headers.append(_('Paid'))

        if form_data['secrets']:
            headers.append(_('Secret'))

        headers.append(_('E-mail'))

        if self.event.has_subevents:
            headers.append(pgettext('subevent', 'Date'))

        for q in questions:
            headers.append(str(q.question))

        writer.writerow(headers)

        for op in qs:
            last_checked_in = None
            if isinstance(op.last_checked_in, str):  # SQLite
                last_checked_in = dateutil.parser.parse(op.last_checked_in)
            elif op.last_checked_in:
                last_checked_in = op.last_checked_in
            if last_checked_in and not is_aware(last_checked_in):
                last_checked_in = make_aware(last_checked_in, UTC)
            row = [
                op.order.code, op.attendee_name
                or (op.addon_to.attendee_name if op.addon_to else ''),
                str(op.item) +
                (" – " + str(op.variation.value) if op.variation else ""),
                op.price,
                date_format(last_checked_in.astimezone(self.event.timezone),
                            'SHORT_DATETIME_FORMAT') if last_checked_in else ''
            ]
            if cl.include_pending:
                row.append(
                    _('Yes') if op.order.status ==
                    Order.STATUS_PAID else _('No'))
            if form_data['secrets']:
                row.append(op.secret)
            row.append(op.attendee_email
                       or (op.addon_to.attendee_email if op.addon_to else '')
                       or op.order.email or '')
            if self.event.has_subevents:
                row.append(str(op.subevent))
            acache = {}
            if op.addon_to:
                for a in op.addon_to.answers.all():
                    acache[a.question_id] = str(a)
            for a in op.answers.all():
                acache[a.question_id] = str(a)
            for q in questions:
                row.append(acache.get(q.pk, ''))

            writer.writerow(row)

        return '{}_checkin.csv'.format(
            self.event.slug), 'text/csv', output.getvalue().encode("utf-8")
Beispiel #4
0
    def render(self, form_data: dict):
        output = io.StringIO()
        if form_data.get('dialect', '-') in csv.list_dialects():
            writer = csv.writer(output, dialect=form_data.get('dialect'))
        elif form_data.get('dialect', '-') == "semicolon":
            writer = csv.writer(output, dialect='excel', delimiter=';')
        else:
            writer = csv.writer(output, quoting=csv.QUOTE_NONNUMERIC, delimiter=",")

        cl = self.event.checkin_lists.get(pk=form_data['list'])

        questions = list(Question.objects.filter(event=self.event, id__in=form_data['questions']))

        qs = self._get_queryset(cl, form_data)

        name_scheme = PERSON_NAME_SCHEMES[self.event.settings.name_scheme]
        headers = [
            _('Order code'),
            _('Attendee name'),
        ]
        if len(name_scheme['fields']) > 1:
            for k, label, w in name_scheme['fields']:
                headers.append(_('Attendee name: {part}').format(part=label))
        headers += [
            _('Product'), _('Price'), _('Checked in')
        ]
        if not cl.include_pending:
            qs = qs.filter(order__status=Order.STATUS_PAID)
        else:
            qs = qs.filter(order__status__in=(Order.STATUS_PAID, Order.STATUS_PENDING))
            headers.append(_('Paid'))

        if form_data['secrets']:
            headers.append(_('Secret'))

        headers.append(_('E-mail'))

        if self.event.has_subevents:
            headers.append(pgettext('subevent', 'Date'))

        for q in questions:
            headers.append(str(q.question))

        headers.append(_('Company'))
        headers.append(_('Voucher code'))
        writer.writerow(headers)

        for op in qs:
            try:
                ia = op.order.invoice_address
            except InvoiceAddress.DoesNotExist:
                ia = InvoiceAddress()

            last_checked_in = None
            if isinstance(op.last_checked_in, str):  # SQLite
                last_checked_in = dateutil.parser.parse(op.last_checked_in)
            elif op.last_checked_in:
                last_checked_in = op.last_checked_in
            if last_checked_in and not is_aware(last_checked_in):
                last_checked_in = make_aware(last_checked_in, UTC)
            row = [
                op.order.code,
                op.attendee_name or (op.addon_to.attendee_name if op.addon_to else '') or ia.name,
            ]
            if len(name_scheme['fields']) > 1:
                for k, label, w in name_scheme['fields']:
                    row.append(
                        (
                            op.attendee_name_parts or
                            (op.addon_to.attendee_name_parts if op.addon_to else {}) or
                            ia.name_parts
                        ).get(k, '')
                    )
            row += [
                str(op.item) + (" – " + str(op.variation.value) if op.variation else ""),
                op.price,
                date_format(last_checked_in.astimezone(self.event.timezone), 'SHORT_DATETIME_FORMAT')
                if last_checked_in else ''
            ]
            if cl.include_pending:
                row.append(_('Yes') if op.order.status == Order.STATUS_PAID else _('No'))
            if form_data['secrets']:
                row.append(op.secret)
            row.append(op.attendee_email or (op.addon_to.attendee_email if op.addon_to else '') or op.order.email or '')
            if self.event.has_subevents:
                row.append(str(op.subevent))
            acache = {}
            if op.addon_to:
                for a in op.addon_to.answers.all():
                    acache[a.question_id] = str(a)
            for a in op.answers.all():
                acache[a.question_id] = str(a)
            for q in questions:
                row.append(acache.get(q.pk, ''))

            row.append(ia.company)
            row.append(op.voucher.code if op.voucher else "")
            writer.writerow(row)

        return '{}_checkin.csv'.format(self.event.slug), 'text/csv', output.getvalue().encode("utf-8")
Beispiel #5
0
    def render(self, form_data: dict):
        output = io.StringIO()
        if form_data.get('dialect', '-') in csv.list_dialects():
            writer = csv.writer(output, dialect=form_data.get('dialect'))
        elif form_data.get('dialect', '-') == "semicolon":
            writer = csv.writer(output, dialect='excel', delimiter=';')
        else:
            writer = csv.writer(output,
                                quoting=csv.QUOTE_NONNUMERIC,
                                delimiter=",")

        cl = self.event.checkin_lists.get(pk=form_data['list'])

        questions = list(
            Question.objects.filter(event=self.event,
                                    id__in=form_data['questions']))

        qs = self._get_queryset(cl, form_data)

        name_scheme = PERSON_NAME_SCHEMES[self.event.settings.name_scheme]
        headers = [
            _('Order code'),
            _('Attendee name'),
        ]
        if len(name_scheme['fields']) > 1:
            for k, label, w in name_scheme['fields']:
                headers.append(_('Attendee name: {part}').format(part=label))
        headers += [_('Product'), _('Price'), _('Checked in')]
        if not cl.include_pending:
            qs = qs.filter(order__status=Order.STATUS_PAID)
        else:
            qs = qs.filter(order__status__in=(Order.STATUS_PAID,
                                              Order.STATUS_PENDING))
            headers.append(_('Paid'))

        if form_data['secrets']:
            headers.append(_('Secret'))

        headers.append(_('E-mail'))

        if self.event.has_subevents:
            headers.append(pgettext('subevent', 'Date'))

        for q in questions:
            headers.append(str(q.question))

        headers.append(_('Company'))
        headers.append(_('Voucher code'))
        writer.writerow(headers)

        for op in qs:
            try:
                ia = op.order.invoice_address
            except InvoiceAddress.DoesNotExist:
                ia = InvoiceAddress()

            last_checked_in = None
            if isinstance(op.last_checked_in, str):  # SQLite
                last_checked_in = dateutil.parser.parse(op.last_checked_in)
            elif op.last_checked_in:
                last_checked_in = op.last_checked_in
            if last_checked_in and not is_aware(last_checked_in):
                last_checked_in = make_aware(last_checked_in, UTC)
            row = [
                op.order.code,
                op.attendee_name
                or (op.addon_to.attendee_name if op.addon_to else '')
                or ia.name,
            ]
            if len(name_scheme['fields']) > 1:
                for k, label, w in name_scheme['fields']:
                    row.append((op.attendee_name_parts
                                or (op.addon_to.attendee_name_parts
                                    if op.addon_to else {})
                                or ia.name_parts).get(k, ''))
            row += [
                str(op.item) +
                (" – " + str(op.variation.value) if op.variation else ""),
                op.price,
                date_format(last_checked_in.astimezone(self.event.timezone),
                            'SHORT_DATETIME_FORMAT') if last_checked_in else ''
            ]
            if cl.include_pending:
                row.append(
                    _('Yes') if op.order.status ==
                    Order.STATUS_PAID else _('No'))
            if form_data['secrets']:
                row.append(op.secret)
            row.append(op.attendee_email
                       or (op.addon_to.attendee_email if op.addon_to else '')
                       or op.order.email or '')
            if self.event.has_subevents:
                row.append(str(op.subevent))
            acache = {}
            if op.addon_to:
                for a in op.addon_to.answers.all():
                    acache[a.question_id] = str(a)
            for a in op.answers.all():
                acache[a.question_id] = str(a)
            for q in questions:
                row.append(acache.get(q.pk, ''))

            row.append(ia.company)
            row.append(op.voucher.code if op.voucher else "")
            writer.writerow(row)

        return '{}_checkin.csv'.format(
            self.event.slug), 'text/csv', output.getvalue().encode("utf-8")