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
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
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
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