Example #1
0
def export_registrations(request, event):
    import re, tablib
    registrations = event.registrations.filter(id__in=request.POST.getlist('selection')).prefetch_related('payment','payment__processor').order_by('registered')
    data = format_registration_data(event, registrations)
    fields = ['registered','first_name','last_name','email','admin_notes','status']
    if event.form_fields:
        fields += [field['name'] for field in event.form_fields if 'layout' not in field['type'] and field['name'] in request.POST.getlist('custom_fields')]
    fields += request.POST.getlist('payment_fields')
    for processor in event.payment_processors.all():
        fields += request.POST.getlist('processor_%d'%processor.id)
    
    #get rid of fields that aren't available
    fields = [field for field in fields if data['fields'].has_key(field)]
    
    #add headers
    dataset = tablib.Dataset(headers=[data['fields'][field].get('label',field) for field in fields])
    
    #write data
    for row in data['data']:
        dataset.append([form_value(row.get(field,'')) for field in fields])

    filetype = request.POST.get('format','xls')
    filetype = filetype if filetype in ['xls','xlsx','csv','tsv','json'] else 'xls'
    content_types = {'xls':'application/vnd.ms-excel','csv':'text/csv','tsv':'text/tsv','json':'text/json','xlsx':'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'}
    response_kwargs = {
            'content_type': content_types[filetype]
        }
    filename = "%s_registrations_%s.%s"%(re.sub('[^0-9a-zA-Z_]+', '', event.title.replace(' ','_')) ,timezone.now().strftime("%Y_%m_%d__%H_%M"),filetype)
    response = HttpResponse(getattr(dataset, filetype), **response_kwargs)
    response['Content-Disposition'] = 'attachment; filename={0}'.format(filename)
    return response
Example #2
0
def export_registrations(request, event):
    import re
#     print request.POST.getlist('selection')
    registrations = event.registrations.filter(id__in=request.POST.getlist('selection')).prefetch_related('payment','payment__processor')
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename="%s_registrations_%s.csv"'%(re.sub('[^0-9a-zA-Z_]+', '', event.title.replace(' ','_')) ,timezone.now().strftime("%Y_%m_%d__%H_%M"))
    data = format_registration_data(event, registrations)
    
    writer = csv.writer(response)

    fields = ['registered','first_name','last_name','email','status']
    if event.form_fields:
        fields += [field['name'] for field in event.form_fields if 'layout' not in field['type'] and field['name'] in request.POST.getlist('custom_fields')]
    fields += request.POST.getlist('payment_fields')
    for processor in event.payment_processors.all():
        fields += request.POST.getlist('processor_%d'%processor.id)
    
    #get rid of fields that aren't available
    fields = [field for field in fields if data['fields'].has_key(field)]
    
    #write headers
    writer.writerow([data['fields'][field].get('label',field) for field in fields])
    
    #write data
    for row in data['data']:
        writer.writerow([form_value(row.get(field,'')) for field in fields])
    

    return response
Example #3
0
def format_registration_data(event,registrations,encode_utf8=True):
    form_fields = []
    if event.form_fields:
        form_fields = [field for field in event.form_fields if 'layout' not in field['type']]
    reg_data = {
                'fields':{'registered':{'label':'Registered','type':'datetime'},
                          'first_name':{'label':'First Name'},
                          'last_name':{'label':'Last Name'},
                          'email':{'label':'Email'},
                          'status':{'label':'Status'},
                          'payment.price':{'label':'Price'},
                          'payment.processor':{'label':'Processor'},
                          'payment.status':{'label':'Payment Status'},
                          'payment.paid_at':{'label':'Paid at'},
                          'payment.amount':{'label':'Amount'},
                          'payment.external_id':{'label':'External_id'},
                          },
                'data':[]
                }
    for field in form_fields:
        reg_data['fields'][field['name']]={'label':field['label'],'type':field['type']}
    
    for processor in event.payment_processors.all():
        exportable_fields = processor.get_processor().exportable_fields
        for name,label in exportable_fields.iteritems():
            reg_data['fields']['processor_%d_%s'%(processor.id,name)] = {'label':label}
    
    for r in registrations:
        data = {'registered':r.registered.strftime('%Y-%m-%d %H:%M'), 'first_name':r.first_name, 'last_name':r.last_name, 'email': r.email, 'status':r.status}

        #Add custom form field values
        for field in form_fields:
            data[field['name']] = r.get_form_value(field['name'])
        
        payment = r.get_payment()

        #Add selected payment fields
        if payment:
            data.update({'payment.price':r.price.name,'payment.processor':payment.processor,'payment.status':payment.status,'payment.paid_at':payment.paid_at,'payment.amount':payment.amount, 'payment.external_id':payment.external_id})
            #Add selected payment processor fields
            for processor in event.payment_processors.all():
                exportable_fields = processor.get_processor().exportable_fields
                for name,label in exportable_fields.iteritems():
                    if payment.data:
                        val = payment.data.get(name,None)
                        if val:
                            data['processor_%d_%s'%(processor.id,name)] = val
        if encode_utf8:
            for key, val in data.iteritems():
                data[key] = unicode(form_value(val)).encode("utf-8") if val else None
        reg_data['data'].append(data)
    return reg_data
Example #4
0
def format_registration_data(event, registrations, encode_utf8=True):
    form_fields = []
    if event.form_fields:
        form_fields = [
            field for field in event.form_fields
            if 'layout' not in field['type']
        ]
    reg_data = {
        'fields': {
            'registered': {
                'label': 'Registered',
                'type': 'datetime'
            },
            'id': {
                'label': 'Registration ID'
            },
            'first_name': {
                'label': 'First Name'
            },
            'last_name': {
                'label': 'Last Name'
            },
            'email': {
                'label': 'Email'
            },
            'department': {
                'label': 'Department'
            },
            'status': {
                'label': 'Status'
            },
            'admin_notes': {
                'label': 'Admin Notes'
            },
            'payment.price': {
                'label': 'Price'
            },
            'payment.processor': {
                'label': 'Processor'
            },
            'payment.status': {
                'label': 'Payment Status'
            },
            'payment.paid_at': {
                'label': 'Paid at'
            },
            'payment.amount': {
                'label': 'Amount'
            },
            'payment.coupon': {
                'label': 'Coupon code'
            },
            'payment.refunded': {
                'label': 'Refunded'
            },
            'payment.external_id': {
                'label': 'External_id'
            },
            'payment.admin_notes': {
                'label': 'Payment admin notes'
            }
        },
        'data': []
    }
    for field in form_fields:
        reg_data['fields'][field['name']] = {
            'label': field['label'],
            'type': field['type']
        }

    for processor in event.payment_processors.all():
        exportable_fields = processor.get_processor().exportable_fields
        for name, label in exportable_fields.iteritems():
            reg_data['fields']['processor_%d_%s' % (processor.id, name)] = {
                'label': label
            }

    for r in registrations:
        data = {
            'registered': r.registered.strftime('%Y-%m-%d %H:%M'),
            'id': r.id,
            'first_name': r.first_name,
            'last_name': r.last_name,
            'email': r.email,
            'department': r.department,
            'status': r.status,
            'admin_notes': r.admin_notes
        }

        #Add custom form field values
        for field in form_fields:
            data[field['name']] = r.get_form_value(field['name'])

        payment = r.get_payment()

        #Add selected payment fields
        if payment:
            data.update({
                'payment.price': r.price.name,
                'payment.processor': payment.processor,
                'payment.status': payment.status,
                'payment.paid_at': payment.paid_at,
                'payment.amount': payment.amount,
                'payment.coupon': r.price.coupon_code,
                'payment.refunded': payment.refunded,
                'payment.external_id': payment.external_id,
                'payment.admin_notes': payment.admin_notes
            })
            #Add selected payment processor fields
            for processor in event.payment_processors.all():
                exportable_fields = processor.get_processor().exportable_fields
                for name, label in exportable_fields.iteritems():
                    if payment.data:
                        val = payment.data.get(name, None)
                        if val:
                            data['processor_%d_%s' %
                                 (processor.id, name)] = val
        elif r.price:
            data.update({'payment.price': r.price.name})
            if True:  #r.price.amount == 0:
                data.update({'payment.amount': r.price.amount})
        if encode_utf8:
            for key, val in data.iteritems():
                data[key] = unicode(form_value(val)).encode(
                    "utf-8") if val is not None else None
        reg_data['data'].append(data)
    return reg_data