def export_model_as_excel(modeladmin, request, queryset): has_name_fields = [ 'village', 'cell', 'sector', 'health_centre', 'referral_hospital', 'district', 'province', 'role' ] is_date_fields = ['date_of_birth', 'dob', 'join_date'] workbook = xlwt.Workbook() sheet_name = "%s" % (queryset.model.__name__.lower(), ) sheet = workbook.add_sheet(sheet_name) if hasattr(modeladmin, 'exportable_fields'): field_list = modeladmin.exportable_fields #field_list = field_list.__add__(('village__code', 'cell__code', )) else: # Copy modeladmin.list_display to remove action_checkbox field_list = modeladmin.list_display[:] #field_list.remove('action_checkbox') response = HttpResponse(mimetype="application/ms-excel") response[ 'Content-Disposition'] = 'attachment; filename=%s.xls' % sheet_name row = col = 0 for f in field_list: if f.__contains__('__code'): sheet.write(row, col, f.upper()) else: sheet.write( row, col, admin_util.label_for_field(f, queryset.model, modeladmin).upper()) col = col + 1 row = row + 1 for obj in queryset: excel_line_values = [] col = 0 for field in field_list: if field.__contains__('__code'): field_obj, attr, value = admin_util.lookup_field( field.replace('__code', ''), obj, modeladmin) if value: value = value.code else: field_obj, attr, value = admin_util.lookup_field( field, obj, modeladmin) try: if field in has_name_fields: sheet.write(row, col, value.name) elif field in is_date_fields: sheet.write( row, col, "%d/%d/%d" % (value.day, value.month, value.year)) else: sheet.write(row, col, value) except Exception, e: try: sheet.write(row, col, value) except: sheet.write(row, col, "NULL") col = col + 1 row = row + 1
def doccontext(fieldset): # it's an iterator :( errors = "" field_ = None help_text = "" heading = "" for line in fieldset: for fieldw in line: # stupid django readonly fields :( bleeee if getattr(fieldw, 'is_readonly', False): field, obj, model_admin = (fieldw.field['field'], fieldw.form.instance, fieldw.model_admin) f, attr, value = lookup_field(field, obj, model_admin) if fieldw.field['name'].lower() == "help_text": help_text = value elif fieldw.field['name'].lower() == "heading": heading = value else: if fieldw.field.name.lower() == "context": field_ = fieldw.field errors = field_.errors field_.allow_tags = True return {'classes': fieldset.classes, 'errors': errors, 'heading': heading, 'field': field_, 'help_text': help_text}
def _getrepr(self, name, instance): try: f, attr, value = lookup_field(name, instance, self.model_admin) except (AttributeError, ObjectDoesNotExist): result_repr = self.get_value(instance, name, sites.settings.DJPCMS_EMPTY_VALUE) else: if f is None: allow_tags = getattr(attr, 'allow_tags', False) boolean = getattr(attr, 'boolean', False) if boolean: allow_tags = True result_repr = _boolean_icon(value) else: result_repr = force_str(value) # Strip HTML tags in the resulting text, except if the # function has an "allow_tags" attribute set to True. if not allow_tags: result_repr = escape(result_repr) else: result_repr = mark_safe(result_repr) else: if value is None: result_repr = sites.settings.DJPCMS_EMPTY_VALUE if isinstance(f.rel, models.ManyToOneRel): result_repr = escape(getattr(instance, f.name)) else: result_repr = display_for_field(value, f) return result_repr
def export_model_as_csv(modeladmin, request, queryset): if hasattr(modeladmin, 'exportable_fields'): field_list = modeladmin.exportable_fields else: # Copy modeladmin.list_display to remove action_checkbox field_list = modeladmin.list_display[:] #field_list.remove('action_checkbox') response = HttpResponse(mimetype='text/csv') response[ 'Content-Disposition'] = 'attachment; filename=%s-%s-export-%s.csv' % ( __package__.lower(), queryset.model.__name__.lower(), datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S'), ) writer = csv.writer(response) writer.writerow([ admin_util.label_for_field(f, queryset.model, modeladmin) for f in field_list ], ) for obj in queryset: csv_line_values = [] for field in field_list: field_obj, attr, value = admin_util.lookup_field( field, obj, modeladmin) csv_line_values.append(value) writer.writerow(csv_line_values) return response
def field_contents_foreign_linked(admin_field): """Return the .contents attribute of the admin_field, and if it is a foreign key, wrap it in a link to the admin page for that object. Use by replacing '{{ field.contents }}' in an admin template (e.g. fieldset.html) with '{{ field|field_contents_foreign_linked }}'. """ fieldname = admin_field.field['field'] displayed = admin_field.contents() obj = admin_field.form.instance if not hasattr(admin_field.model_admin, 'linked_readonly_fields') or fieldname not in admin_field \ .model_admin \ .linked_readonly_fields: return displayed try: fieldtype, attr, value = lookup_field(fieldname, obj, admin_field.model_admin) except ObjectDoesNotExist: fieldtype = None if isinstance(fieldtype, ForeignKey): try: url = admin_url(value) except NoReverseMatch: url = None if url: displayed = "<a href='%s'>%s</a>" % (url, displayed) return mark_safe(displayed)
def export_model_as_csv(modeladmin, request, queryset): if hasattr(modeladmin, 'exportable_fields'): field_list = modeladmin.exportable_fields else: # Copy modeladmin.list_display to remove action_checkbox field_list = modeladmin.list_display[:] field_list.remove('action_checkbox') response = HttpResponse(mimetype='text/csv') response['Content-Disposition'] = 'attachment; filename=%s-%s-export-%s.csv' % ( __package__.lower(), queryset.model.__name__.lower(), datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S'), ) writer = csv.writer(response) writer.writerow( [admin_util.label_for_field(f, queryset.model, modeladmin) for f in field_list], ) for obj in queryset: csv_line_values = [] for field in field_list: field_obj, attr, value = admin_util.lookup_field(field, obj, modeladmin) csv_line_values.append(value) writer.writerow(csv_line_values) return response
def export_as_csv(modeladmin, request, queryset): response = HttpResponse(content_type='text/csv') response[ 'Content-Disposition'] = 'attachment; filename=%s.csv' % unicode( modeladmin.opts).replace('.', '_') writer = csv.writer(response) if header: fields_header = [] for field_name in fields: text, attr = label_for_field(field_name, modeladmin.model, model_admin=modeladmin, return_attr=True) fields_header.append(text.capitalize()) writer.writerow(fields_header) for obj in queryset: line = [] for field_name in fields: f, attr, value = lookup_field(field_name, obj, modeladmin) if f is None or f.auto_created: result_repr = force_unicode(value) else: if isinstance(f.rel, models.ManyToOneRel): field_val = getattr(obj, f.name) if field_val is None: result_repr = '-' else: result_repr = field_val else: result_repr = display_for_field(value, f) line.append(strip_tags(result_repr)) writer.writerow(line) return response
def export_as_csv(modeladmin, request, queryset): """ Generic csv export admin action. based on http://djangosnippets.org/snippets/1697/ """ model = modeladmin.model if fields: field_names = set(fields) else: field_names = set([field.name for field in model._meta.fields]) if exclude: excludeset = set(exclude) field_names = field_names - excludeset response = HttpResponse(mimetype='text/csv') response['Content-Disposition'] = 'attachment; filename=%s.csv' % ( unicode(model._meta).replace('.', '_'),) writer = csv.writer(response) if header: write_encoded(writer, (label_for_field(field, model, modeladmin) for field in field_names)) for obj in queryset: write_encoded(writer, (lookup_field(field, obj, modeladmin)[2] for field in field_names)) return response
def contents_or_fk_link(field): """ Return field contents or link to related object if foreign key field Example Usage:: {% load relatives %} {{ field|contents_or_fk_link }} """ contents = field.contents() field_name = field.field['field'] obj = field.form.instance try: related_obj = getattr(obj, field_name) except ObjectDoesNotExist: return contents else: model_field = lookup_field(field_name, obj, field.model_admin)[0] if getattr(model_field, 'rel') and hasattr(related_obj, '_meta'): try: return mark_safe('<a href="%s">%s</a>' % (get_admin_url(related_obj), contents)) except NoReverseMatch: pass return contents
def get_simple_value(obj, field_name): try: f, attr, value = lookup_field(field_name, obj) except (AttributeError, ObjectDoesNotExist): result_repr = EMPTY_CHANGELIST_VALUE else: if f is None: allow_tags = getattr(attr, 'allow_tags', False) boolean = getattr(attr, 'boolean', False) if boolean: allow_tags = True result_repr = _boolean_icon(value) else: result_repr = smart_unicode(value) if not allow_tags: result_repr = escape(result_repr) else: result_repr = mark_safe(result_repr) else: if value is None: result_repr = EMPTY_CHANGELIST_VALUE if isinstance(f.rel, models.ManyToOneRel): result_repr = escape(getattr(obj, f.name)) else: result_repr = display_for_field(value, f) if force_unicode(result_repr) == '': result_repr = mark_safe(' ') result_repr = conditional_escape(result_repr) return mark_safe(result_repr)
def items_for_result(cl, result): """ Generates the actual list of data. """ pk = cl.lookup_opts.pk.attname for field_name in cl.list_display: row_class = '' try: f, attr, value = lookup_field(field_name, result, cl.model_admin) except (AttributeError, ObjectDoesNotExist): result_repr = EMPTY_CHANGELIST_VALUE else: if f is None: if field_name == u'action_checkbox': continue result_repr = mark_safe(smart_unicode(value)) else: if isinstance(f.rel, models.ManyToOneRel): field_val = getattr(result, f.name) if field_val is None: result_repr = EMPTY_CHANGELIST_VALUE else: result_repr = escape(field_val) else: result_repr = display_for_field(value, f) if force_unicode(result_repr) == '': result_repr = mark_safe('-') result_repr = conditional_escape(result_repr) yield mark_safe(u'%s' % result_repr)
def field_contents_foreign_linked(admin_field): """Return the .contents attribute of the admin_field, and if it is a foreign key, wrap it in a link to the admin page for that object. Use by replacing '{{ field.contents }}' in an admin template (e.g. fieldset.html) with '{{ field|field_contents_foreign_linked }}'. """ fieldname = admin_field.field['field'] displayed = admin_field.contents() obj = admin_field.form.instance if not hasattr(admin_field.model_admin, 'linked_readonly_fields') or fieldname not in admin_field \ .model_admin \ .linked_readonly_fields: return displayed try: fieldtype, attr, value = lookup_field(fieldname, obj, admin_field.model_admin) except ObjectDoesNotExist: fieldtype = None if isinstance(fieldtype, ForeignKey): try: url = admin_url(value) except NoReverseMatch: url = None if url: displayed = u"<a href='%s'>%s</a>" % (url, displayed) return mark_safe(displayed)
def export_as_csv(modeladmin, request, queryset): response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename=%s.csv' % unicode(modeladmin.opts).replace('.', '_') writer = csv.writer(response) if header: fields_header = [] for field_name in fields: text, attr = label_for_field( field_name, modeladmin.model, model_admin=modeladmin, return_attr=True ) fields_header.append(text.capitalize()) writer.writerow(fields_header) for obj in queryset: line = [] for field_name in fields: f, attr, value = lookup_field(field_name, obj, modeladmin) if f is None or f.auto_created: result_repr = force_unicode(value) else: if isinstance(f.rel, models.ManyToOneRel): field_val = getattr(obj, f.name) if field_val is None: result_repr = '-' else: result_repr = field_val else: result_repr = display_for_field(value, f) line.append(strip_tags(result_repr)) writer.writerow(line) return response
def contents(self): from django.contrib.admin.templatetags.admin_list import _boolean_icon from django.contrib.admin.views.main import EMPTY_CHANGELIST_VALUE field, obj, model_admin = self.field, self.form.instance, self.model_admin try: f, attr, value = lookup_field(field, obj, model_admin) except (AttributeError, ObjectDoesNotExist): result_repr = EMPTY_CHANGELIST_VALUE else: if f is None: boolean = getattr(attr, "boolean", False) if boolean: result_repr = _boolean_icon(value) else: result_repr = smart_unicode(value) if getattr(attr, "allow_tags", False): result_repr = mark_safe(result_repr) else: if value is None: result_repr = EMPTY_CHANGELIST_VALUE elif isinstance(f.rel, ManyToManyRel): result_repr = ", ".join(map(unicode, value.all())) else: result_repr = display_for_field(value, f) return conditional_escape(result_repr)
def contents(self): from django.contrib.admin.templatetags.admin_list import _boolean_icon from django.contrib.admin.views.main import EMPTY_CHANGELIST_VALUE field, obj, model_admin = self.field[ 'field'], self.form.instance, self.model_admin try: f, attr, value = lookup_field(field, obj, model_admin) except (AttributeError, ValueError, ObjectDoesNotExist): result_repr = EMPTY_CHANGELIST_VALUE else: if f is None: boolean = getattr(attr, "boolean", False) if boolean: result_repr = _boolean_icon(value) else: result_repr = smart_unicode(value) if getattr(attr, "allow_tags", False): result_repr = mark_safe(result_repr) else: if value is None: result_repr = EMPTY_CHANGELIST_VALUE elif isinstance(f.rel, ManyToManyRel): result_repr = ", ".join(map(unicode, value.all())) else: result_repr = display_for_field(value, f) return conditional_escape(result_repr)
def serialize(obj, field): f, attr, value = lookup_field(field, obj, modeladmin) value = value if value is not None else '' if type(value) == date: value = value.strftime('%d.%m.%Y') if type(value) == bool: value = 1 if value else 0 return force_unicode(value).encode('utf-8')
def export_model_as_excel(modeladmin, request, queryset): has_name_fields = ['village', 'cell', 'sector', 'health_centre', 'referral_hospital', 'district', 'province','role'] is_date_fields = ['date_of_birth', 'dob', 'join_date'] workbook = xlwt.Workbook() sheet_name = "%s" % ( queryset.model.__name__.lower(), ) sheet = workbook.add_sheet(sheet_name) if hasattr(modeladmin, 'exportable_fields'): field_list = modeladmin.exportable_fields #field_list = field_list.__add__(('village__code', 'cell__code', )) else: # Copy modeladmin.list_display to remove action_checkbox field_list = modeladmin.list_display[:] #field_list.remove('action_checkbox') response = HttpResponse(mimetype = "application/ms-excel") response['Content-Disposition'] = 'attachment; filename=%s.xls' % sheet_name row = col = 0 for f in field_list: if f.__contains__('__code'): sheet.write(row , col, f.upper()) else: sheet.write(row , col, admin_util.label_for_field(f, queryset.model, modeladmin).upper()) col = col + 1 row = row + 1 for obj in queryset: excel_line_values = [] col = 0 for field in field_list: if field.__contains__('__code'): field_obj, attr, value = admin_util.lookup_field(field.replace('__code', ''), obj, modeladmin) if value: value = value.code else: field_obj, attr, value = admin_util.lookup_field(field, obj, modeladmin) try: if field in has_name_fields: sheet.write(row, col, value.name) elif field in is_date_fields: sheet.write(row, col, "%d/%d/%d" % (value.day, value.month, value.year)) else: sheet.write(row, col, value) except Exception, e: try: sheet.write(row, col, value) except: sheet.write(row, col, "NULL") col = col + 1 row = row + 1
def contents(self): from django.contrib.admin.templatetags.admin_list import _boolean_icon from django.contrib.admin.views.main import EMPTY_CHANGELIST_VALUE field, obj, model_admin = self.field[ 'field'], self.form.instance, self.model_admin try: f, attr, value = lookup_field(field, obj, model_admin) except (AttributeError, ValueError, ObjectDoesNotExist), e: result_repr = EMPTY_CHANGELIST_VALUE
def get_user_permission(request, permission_module): if request.user.is_superuser: return True else: if request.user.staff_set.all()[0].permission: data = lookup_field(permission_module, request.user.staff_set.all()[0].permission) return data[-1] else: return False
def export_model_as_csv(modeladmin, request, queryset): if hasattr(modeladmin, 'exportable_fields'): field_list = modeladmin.exportable_fields else: # Copy modeladmin.list_display to remove action_checkbox field_list = modeladmin.list_display[:] #field_list.remove('action_checkbox') response = HttpResponse(mimetype='text/csv') response[ 'Content-Disposition'] = 'attachment; filename=%s-%s-export-%s.csv' % ( __package__.lower(), queryset.model.__name__.lower(), datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S'), ) writer = csv.writer(response) writer.writerow([f.upper() for f in field_list], ) for obj in queryset: csv_line_values = [] for field in field_list: if field.__contains__('__code'): field_obj, attr, value = admin_util.lookup_field( field.replace('__code', ''), obj, modeladmin) if value: value = value.code else: field_obj, attr, value = admin_util.lookup_field( field, obj, modeladmin) try: if field in has_name_fields: csv_line_values.append(value.name) elif field in is_date_fields: csv_line_values.append( "%d/%d/%d" % (value.day, value.month, value.year)) else: csv_line_values.append('%s' % value) except Exception, e: try: csv_line_values.append('%s' % value) except: csv_line_values.append("NULL") writer.writerow(csv_line_values)
def export_model_as_csv(modeladmin, request, queryset): if hasattr(modeladmin, 'exportable_fields'): field_list = modeladmin.exportable_fields else: # Copy modeladmin.list_display to remove action_checkbox field_list = modeladmin.list_display[:] #field_list.remove('action_checkbox') response = HttpResponse(mimetype='text/csv') response['Content-Disposition'] = 'attachment; filename=%s-%s-export-%s.csv' % ( __package__.lower(), queryset.model.__name__.lower(), datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S'), ) writer = csv.writer(response) writer.writerow( [f.upper() for f in field_list], ) for obj in queryset: csv_line_values = [] for field in field_list: if field.__contains__('__code'): field_obj, attr, value = admin_util.lookup_field(field.replace('__code', ''), obj, modeladmin) if value: value = value.code else: field_obj, attr, value = admin_util.lookup_field(field, obj, modeladmin) try: if field in has_name_fields: csv_line_values.append(value.name) elif field in is_date_fields: csv_line_values.append("%d/%d/%d" % (value.day, value.month, value.year)) else: csv_line_values.append('%s' % value) except Exception, e: try: csv_line_values.append('%s' % value) except: csv_line_values.append("NULL") writer.writerow(csv_line_values)
def test_values_from_lookup_field(self): """ Regression test for #12654: lookup_field """ SITE_NAME = 'example.com' TITLE_TEXT = 'Some title' CREATED_DATE = datetime.min ADMIN_METHOD = 'admin method' SIMPLE_FUNCTION = 'function' INSTANCE_ATTRIBUTE = 'attr' class MockModelAdmin(object): def get_admin_value(self, obj): return ADMIN_METHOD simple_function = lambda obj: SIMPLE_FUNCTION article = Article( site=Site(domain=SITE_NAME), title=TITLE_TEXT, created=CREATED_DATE, ) article.non_field = INSTANCE_ATTRIBUTE verifications = ( ('site', SITE_NAME), ('created', localize(CREATED_DATE)), ('title', TITLE_TEXT), ('get_admin_value', ADMIN_METHOD), (simple_function, SIMPLE_FUNCTION), ('test_from_model', article.test_from_model()), ('non_field', INSTANCE_ATTRIBUTE) ) mock_admin = MockModelAdmin() for name, value in verifications: field, attr, resolved_value = lookup_field(name, article, mock_admin) if field is not None: resolved_value = display_for_field(resolved_value, field) self.assertEqual(value, resolved_value)
def inline_items_for_result(inline, result): """ Generates the actual list of data for the inline. """ list_display = inline.list_display if inline.list_display else ( '__unicode__', ) ret = '' for field_name in list_display: row_class = mark_safe(' class="column"') try: f, attr, value = lookup_field(field_name, result, inline) except ObjectDoesNotExist: result_repr = '' else: if f is None: allow_tags = getattr(attr, 'allow_tags', False) boolean = getattr(attr, 'boolean', False) if boolean: allow_tags = True result_repr = display_for_value(value, boolean) # Strip HTML tags in the resulting text, except if the # function has an "allow_tags" attribute set to True. if allow_tags: result_repr = mark_safe(result_repr) else: if isinstance(f.rel, models.ManyToOneRel): field_val = getattr(result, f.name) if field_val is None: result_repr = '' else: result_repr = field_val else: result_repr = display_for_field(value, f) if force_text(result_repr) == '': result_repr = mark_safe(' ') ret += format_html(u'<span{0}>{1}</span>', row_class, result_repr) return ret
def test_values_from_lookup_field(self): """ Regression test for #12654: lookup_field """ SITE_NAME = "example.com" TITLE_TEXT = "Some title" CREATED_DATE = datetime.min ADMIN_METHOD = "admin method" SIMPLE_FUNCTION = "function" INSTANCE_ATTRIBUTE = "attr" class MockModelAdmin(object): def get_admin_value(self, obj): return ADMIN_METHOD simple_function = lambda obj: SIMPLE_FUNCTION article = Article(site=Site(domain=SITE_NAME), title=TITLE_TEXT, created=CREATED_DATE) article.non_field = INSTANCE_ATTRIBUTE verifications = ( ("site", SITE_NAME), ("created", localize(CREATED_DATE)), ("title", TITLE_TEXT), ("get_admin_value", ADMIN_METHOD), (simple_function, SIMPLE_FUNCTION), ("test_from_model", article.test_from_model()), ("non_field", INSTANCE_ATTRIBUTE), ) mock_admin = MockModelAdmin() for name, value in verifications: field, attr, resolved_value = lookup_field(name, article, mock_admin) if field is not None: resolved_value = display_for_field(resolved_value, field) self.assertEqual(value, resolved_value)
def inline_items_for_result(inline, result): """ Generates the actual list of data for the inline. """ list_display = inline.list_display if inline.list_display else ('__unicode__',) ret = '' for field_name in list_display: row_class = mark_safe(' class="column"') try: f, attr, value = lookup_field(field_name, result, inline) except ObjectDoesNotExist: result_repr = '' else: if f is None: allow_tags = getattr(attr, 'allow_tags', False) boolean = getattr(attr, 'boolean', False) if boolean: allow_tags = True result_repr = display_for_value(value, boolean) # Strip HTML tags in the resulting text, except if the # function has an "allow_tags" attribute set to True. if allow_tags: result_repr = mark_safe(result_repr) else: if isinstance(f.rel, models.ManyToOneRel): field_val = getattr(result, f.name) if field_val is None: result_repr = '' else: result_repr = field_val else: result_repr = display_for_field(value, f) if force_text(result_repr) == '': result_repr = mark_safe(' ') ret += format_html('<span{0}>{1}</span>', row_class, result_repr) return ret
def get_result_and_row_class(cl, field_name, result): row_class = '' try: f, attr, value = lookup_field(field_name, result, cl.model_admin) except ObjectDoesNotExist: result_repr = EMPTY_CHANGELIST_VALUE else: if f is None: if field_name == 'action_checkbox': row_class = mark_safe(' class="action-checkbox"') allow_tags = getattr(attr, 'allow_tags', False) boolean = getattr(attr, 'boolean', False) if boolean: allow_tags = True result_repr = display_for_value(value, boolean) # Strip HTML tags in the resulting text, except if the # function has an "allow_tags" attribute set to True. if allow_tags: result_repr = mark_safe(result_repr) if isinstance(value, (datetime.date, datetime.time)): row_class = mark_safe(' class="nowrap"') else: if isinstance(f.rel, models.ManyToOneRel): field_val = getattr(result, f.name) if field_val is None: result_repr = EMPTY_CHANGELIST_VALUE else: result_repr = field_val else: result_repr = display_for_field(value, f) if isinstance(f, (models.DateField, models.TimeField, models.ForeignKey)): row_class = mark_safe(' class="nowrap"') if force_str(result_repr) == '': result_repr = mark_safe(' ') return result_repr, row_class
def serialize(field, obj): f, attr, value = util.lookup_field(field, obj, modeladmin) if f is not None and not isinstance(f, models.BooleanField): value = util.display_for_field(value, f) return force_unicode(value).encode('utf-8')
def get_field_value(field, obj): f, attr, value = lookup_field(field, obj) return value
def iitems_for_result(cl, result, form, context=None): """ Generates the actual list of data. """ def handle_link(): if field_name in model_admin.list_display_rel_links: if admin_order_field: linked_object = iter_get_attr(result, admin_order_field.replace("__", ".")) else: linked_object = getattr(result, field_name) # f.rel.to return mark_safe(cl.url_for_obj(context["request"], linked_object)) return mark_safe("") first = True pk = cl.lookup_opts.pk.attname model_admin = cl.model_admin for field_name in cl.list_display: row_class = "" result_repr = "" cell_filter_menu = "" cell_menu_items = [] try: f, attr, value = lookup_field(field_name, result, cl.model_admin) except (AttributeError, ObjectDoesNotExist): result_repr = EMPTY_CHANGELIST_VALUE else: admin_order_field = getattr(attr, "admin_order_field", None) if f is None: # no field maybe modeladmin method if field_name == u"action_checkbox": row_class = " action-checkbox" allow_tags = getattr(attr, "allow_tags", False) boolean = getattr(attr, "boolean", False) if boolean: allow_tags = True result_repr = _boolean_icon(value) else: result_repr = smart_unicode(value) # Strip HTML tags in the resulting text, except if the # function has an "allow_tags" attribute set to True. if not allow_tags: result_repr = escape(result_repr) else: result_repr = mark_safe(result_repr) else: if isinstance(f.rel, models.ManyToOneRel): field_val = getattr(result, f.name) if field_val is None: result_repr = EMPTY_CHANGELIST_VALUE else: result_repr = escape(field_val) else: result_repr = display_for_field(value, f) if ( isinstance(f, models.DateField) or isinstance(f, models.TimeField) or isinstance(f, models.ForeignKey) ): row_class = " nowrap" # link = handle_link() cell_menu_items = [] if field_name in model_admin.list_display_rel_links: if admin_order_field: linked_object = iter_get_attr(result, admin_order_field.replace("__", ".")) else: linked_object = getattr(result, field_name) # f.rel.to if linked_object and isinstance(linked_object, Model): if model_admin.has_change_permission(context["request"], linked_object): view = "%s:%s_%s_change" % ( model_admin.admin_site.app_name, linked_object._meta.app_label, linked_object.__class__.__name__.lower(), ) url = reverse(view, args=[int(linked_object.pk)]) elif model_admin.has_view_permission(context["request"], linked_object): url = "view/%s/" % quote(getattr(linked_object, linked_object._meta.pk_attname)) cell_menu_items.append([url, _("Jump to detail")]) if hasattr(model_admin, "cell_filter") and field_name in model_admin.cell_filter: cell_menu_items.extend(get_items_cell_filter(cl, field_name, result)) cell_filter_menu = smart_unicode(mark_safe(get_popup_menu(cell_menu_items))) if row_class: row_class = ' class="%s"' % row_class if force_unicode(result_repr) == "": result_repr = mark_safe(" ") # menu = mark_safe('%s%s' % (link, conditional_escape( cell_filter_menu ))) menu = conditional_escape(cell_filter_menu) # If list_display_links not defined, add the link tag to the first field if (first and not cl.list_display_links) or field_name in cl.list_display_links: table_tag = {True: "th", False: "td"}[first] first = False url = cl.url_for_result(result) # Convert the pk to something that can be used in Javascript. # Problem cases are long ints (23L) and non-ASCII strings. if cl.to_field: attr = str(cl.to_field) else: attr = pk value = result.serializable_value(attr) result_id = repr(force_unicode(value))[1:] yield mark_safe( u'<%s%s>%s<a href="%s"%s>%s</a></%s>' % ( table_tag, row_class, menu, url, ( cl.is_popup and ' onclick="opener.dismissRelatedLookupPopup(window, %s); return false;"' % result_id or "" ), conditional_escape(result_repr), table_tag, ) ) else: # By default the fields come from ModelAdmin.list_editable, but if we pull # the fields out of the form instead of list_editable custom admins # can provide fields on a per request basis if form and field_name in form.fields: bf = form[field_name] result_repr = mark_safe(force_unicode(bf.errors) + force_unicode(bf)) yield mark_safe(u"<td%s>%s</td>" % (row_class, result_repr)) else: yield mark_safe(u"<td>%s<span%s>%s</span></td>" % (menu, row_class, result_repr)) if form and not form[cl.model._meta.pk.name].is_hidden: yield mark_safe(u"<td>%s</td>" % force_unicode(form[cl.model._meta.pk.name]))
def items_for_result(cl, result, form,is_tag): """ Generates the actual list of data. """ first = True pk = cl.lookup_opts.pk.attname opts=cl.opts for ct ,field_name in enumerate(cl.list_display): row_class = '' try: f, attr, value = lookup_field(field_name, result, cl.model_admin) except (AttributeError, ObjectDoesNotExist): result_repr = EMPTY_CHANGELIST_VALUE else: if f is None: allow_tags = getattr(attr, 'allow_tags', False) boolean = getattr(attr, 'boolean', False) if boolean: allow_tags = True result_repr = _boolean_icon(value) else: result_repr = smart_unicode(value) # Strip HTML tags in the resulting text, except if the # function has an "allow_tags" attribute set to True. if not allow_tags: result_repr = escape(result_repr) else: result_repr = mark_safe(result_repr) else: if value is None: result_repr = EMPTY_CHANGELIST_VALUE if isinstance(f.rel, models.ManyToOneRel): result_repr = escape(getattr(result, f.name)) else: result_repr = display_for_field(value, f) if isinstance(f, models.DateField) or isinstance(f, models.TimeField): row_class = ' class="nowrap"' if isinstance(f, models.DecimalField): row_class = row_class+' alt="price"' if force_unicode(result_repr) == '': result_repr = mark_safe(' ') # If list_display_links not defined, add the link tag to the first field if (first and not cl.list_display_links) or field_name in cl.list_display_links: table_tag = {True:'td', False:'td'}[first] first = False url = cl.url_for_result(result) if is_tag: url = opts.app_label.lower()+'/'+opts.object_name.lower()+'/'+cl.url_for_result(result) if cl.is_popup: url+='?_popup=1' # Convert the pk to something that can be used in Javascript. # Problem cases are long ints (23L) and non-ASCII strings. if cl.to_field: attr = str(cl.to_field) else: attr = pk value = result.serializable_value(attr) result_id = repr(force_unicode(value))[1:] yield mark_safe(u'<%s%s><a href="%s"%s>%s</a></%s>' % \ (table_tag, row_class, url, '', conditional_escape(result_repr), table_tag)) else: # By default the fields come from ModelAdmin.list_editable, but if we pull # the fields out of the form instead of list_editable custom admins # can provide fields on a per request basis if form and field_name in form.fields: bf = form[field_name] result_repr = mark_safe(force_unicode(bf.errors) + force_unicode(bf)) else: result_repr = conditional_escape(result_repr) # This is used to write a class hidden-phone for bootstrap2 if ct >3: row_class = addHtmlAttr(row_class,'class','hidden-phone') yield mark_safe(u'<td%s>%s</td>' % (row_class, result_repr)) if form and not form[cl.model._meta.pk.name].is_hidden: yield mark_safe(u'<td>%s</td>' % force_unicode(form[cl.model._meta.pk.name]))
def mptt_items_for_result(cl, result, form): """ Generates the actual list of data. """ first = True pk = cl.lookup_opts.pk.attname ##### MPTT ADDITION START # figure out which field to indent mptt_indent_field = getattr(cl.model_admin, 'mptt_indent_field', None) if not mptt_indent_field: for field_name in cl.list_display: try: f = cl.lookup_opts.get_field(field_name) except models.FieldDoesNotExist: if (mptt_indent_field is None and field_name != 'action_checkbox'): mptt_indent_field = field_name else: # first model field, use this one mptt_indent_field = field_name break ##### MPTT ADDITION END # figure out how much to indent mptt_level_indent = getattr(cl.model_admin, 'mptt_level_indent', MPTT_ADMIN_LEVEL_INDENT) for field_name in cl.list_display: row_class = '' try: f, attr, value = lookup_field(field_name, result, cl.model_admin) except (AttributeError, ObjectDoesNotExist): result_repr = EMPTY_CHANGELIST_VALUE else: if f is None: if field_name == 'action_checkbox': row_class = ' class="action-checkbox"' allow_tags = getattr(attr, 'allow_tags', False) boolean = getattr(attr, 'boolean', False) if boolean: allow_tags = True result_repr = _boolean_icon(value) else: result_repr = smart_text(value) # Strip HTML tags in the resulting text, except if the # function has an "allow_tags" attribute set to True. if not allow_tags: result_repr = escape(result_repr) else: result_repr = mark_safe(result_repr) else: if isinstance(f.rel, models.ManyToOneRel): field_val = getattr(result, f.name) if field_val is None: result_repr = EMPTY_CHANGELIST_VALUE else: result_repr = escape(field_val) else: result_repr = display_for_field(value, f) if isinstance(f, models.DateField)\ or isinstance(f, models.TimeField)\ or isinstance(f, models.ForeignKey): row_class = ' class="nowrap"' if force_text(result_repr) == '': result_repr = mark_safe(' ') ##### MPTT ADDITION START if field_name == mptt_indent_field: level = getattr(result, result._mptt_meta.level_attr) padding_attr = ' style="padding-left:%spx"' % ( 5 + mptt_level_indent * level) else: padding_attr = '' ##### MPTT ADDITION END # If list_display_links not defined, add the link tag to the first field if (first and not cl.list_display_links ) or field_name in cl.list_display_links: table_tag = {True: 'th', False: 'td'}[first] first = False url = cl.url_for_result(result) # Convert the pk to something that can be used in Javascript. # Problem cases are long ints (23L) and non-ASCII strings. if cl.to_field: attr = str(cl.to_field) else: attr = pk value = result.serializable_value(attr) result_id = repr(force_text(value))[1:] ##### MPTT SUBSTITUTION START yield mark_safe('<%s%s%s><a href="%s"%s>%s</a></%s>' % \ (table_tag, row_class, padding_attr, url, (cl.is_popup and ' onclick="opener.dismissRelatedLookupPopup(window, %s); return false;"' % result_id or ''), conditional_escape(result_repr), table_tag)) ##### MPTT SUBSTITUTION END else: # By default the fields come from ModelAdmin.list_editable, but if we pull # the fields out of the form instead of list_editable custom admins # can provide fields on a per request basis if (form and field_name in form.fields and not (field_name == cl.model._meta.pk.name and form[cl.model._meta.pk.name].is_hidden)): bf = form[field_name] result_repr = mark_safe(force_text(bf.errors) + force_text(bf)) else: result_repr = conditional_escape(result_repr) ##### MPTT SUBSTITUTION START yield mark_safe('<td%s%s>%s</td>' % (row_class, padding_attr, result_repr)) ##### MPTT SUBSTITUTION END if form and not form[cl.model._meta.pk.name].is_hidden: yield mark_safe('<td>%s</td>' % force_text(form[cl.model._meta.pk.name]))
def items_for_result(cl, result, form): """ Generates the actual list of data. @jjdelc: This has been shamelessly copied from original django.contrib.admin.templatetags.admin_list.items_for_result in order to alter the dispay for the first element """ first = True pk = cl.lookup_opts.pk.attname for field_name in cl.list_display: row_class = '' try: f, attr, value = lookup_field(field_name, result, cl.model_admin) except (AttributeError, ObjectDoesNotExist): result_repr = EMPTY_CHANGELIST_VALUE else: if f is None: allow_tags = getattr(attr, 'allow_tags', False) boolean = getattr(attr, 'boolean', False) if boolean: allow_tags = True result_repr = _boolean_icon(value) else: result_repr = smart_unicode(value) # Strip HTML tags in the resulting text, except if the # function has an "allow_tags" attribute set to True. if not allow_tags: result_repr = escape(result_repr) else: result_repr = mark_safe(result_repr) else: if value is None: result_repr = EMPTY_CHANGELIST_VALUE if isinstance(f.rel, models.ManyToOneRel): result_repr = escape(getattr(result, f.name)) else: result_repr = display_for_field(value, f) if isinstance(f, models.DateField) or isinstance( f, models.TimeField): row_class = ' class="nowrap"' if force_unicode(result_repr) == '': result_repr = mark_safe(' ') # If list_display_links not defined, add the link tag to the first field if (first and not cl.list_display_links ) or field_name in cl.list_display_links: table_tag = {True: 'th', False: 'td'}[first] # This spacer indents the nodes based on their depth spacer = '<span class="spacer"> </span>' * ( result.get_depth() - 1) if first else '' # This shows a collapse or expand link for nodes with childs collapse = '<a href="#" title="" class="collapse expanded">-</a>' if result.get_children_count( ) > 0 else '<span class="collapse"> </span>' # Add a <td/> before the first col to show the drag handler drag_handler = '' if first: drag_handler = '<td class="drag-handler"><span> </span></td>' first = False url = cl.url_for_result(result) # Convert the pk to something that can be used in Javascript. # Problem cases are long ints (23L) and non-ASCII strings. if cl.to_field: attr = str(cl.to_field) else: attr = pk value = result.serializable_value(attr) result_id = repr(force_unicode(value))[1:] yield mark_safe(u'%s<%s%s>%s %s <a href="%s"%s>%s</a></%s>' % \ (drag_handler, table_tag, row_class, spacer, collapse, url, (cl.is_popup and ' onclick="opener.dismissRelatedLookupPopup(window, %s); return false;"' % result_id or ''), conditional_escape(result_repr), table_tag)) else: # By default the fields come from ModelAdmin.list_editable, but if we pull # the fields out of the form instead of list_editable custom admins # can provide fields on a per request basis if form and field_name in form.fields: bf = form[field_name] result_repr = mark_safe( force_unicode(bf.errors) + force_unicode(bf)) else: result_repr = conditional_escape(result_repr) yield mark_safe(u'<td%s>%s</td>' % (row_class, result_repr)) if form and not form[cl.model._meta.pk.name].is_hidden: yield mark_safe(u'<td>%s</td>' % force_unicode(form[cl.model._meta.pk.name]))
def items_for_result(cl, result, form): """ Generates the actual list of data. """ first = True pk = cl.lookup_opts.pk.attname for field_name in cl.list_display: row_classes = ['field-%s' % field_name] try: f, attr, value = lookup_field(field_name, result, cl.model_admin) except ObjectDoesNotExist: result_repr = EMPTY_CHANGELIST_VALUE else: if f is None: if field_name == 'action_checkbox': row_classes = ['action-checkbox'] allow_tags = getattr(attr, 'allow_tags', False) boolean = getattr(attr, 'boolean', False) if boolean: allow_tags = True result_repr = display_for_value(value, boolean) # Strip HTML tags in the resulting text, except if the # function has an "allow_tags" attribute set to True. if allow_tags: result_repr = mark_safe(result_repr) if isinstance(value, (datetime.date, datetime.time)): row_classes.append('nowrap') else: if isinstance(f.rel, models.ManyToOneRel): field_val = getattr(result, f.name) if field_val is None: result_repr = EMPTY_CHANGELIST_VALUE else: result_repr = field_val else: result_repr = display_for_field(value, f) if isinstance(f, (models.DateField, models.TimeField, models.ForeignKey)): row_classes.append('nowrap') if force_text(result_repr) == '': result_repr = mark_safe(' ') row_class = mark_safe(' class="%s"' % ' '.join(row_classes)) # If list_display_links not defined, add the link tag to the first field if (first and not cl.list_display_links) or field_name in cl.list_display_links: table_tag = 'th' if first else 'td' first = False # Display link to the result's change_view if the url exists, else # display just the result's representation. try: url = cl.url_for_result(result) except NoReverseMatch: link_or_text = result_repr else: url = add_preserved_filters({'preserved_filters': cl.preserved_filters, 'opts': cl.opts}, url) # Convert the pk to something that can be used in Javascript. # Problem cases are long ints (23L) and non-ASCII strings. if cl.to_field: attr = str(cl.to_field) else: attr = pk value = result.serializable_value(attr) result_id = escapejs(value) link_or_text = format_html( '<a href="{0}"{1}>{2}</a>', url, format_html(' onclick="opener.dismissRelatedLookupPopup(window, '{0}'); return false;"', result_id) if cl.is_popup else '', result_repr) yield format_html('<{0}{1}>{2}</{3}>', table_tag, row_class, link_or_text, table_tag) else: # By default the fields come from ModelAdmin.list_editable, but if we pull # the fields out of the form instead of list_editable custom admins # can provide fields on a per request basis if (form and field_name in form.fields and not ( field_name == cl.model._meta.pk.name and form[cl.model._meta.pk.name].is_hidden)): bf = form[field_name] result_repr = mark_safe(force_text(bf.errors) + force_text(bf)) yield format_html('<td{0}>{1}</td>', row_class, result_repr) if form and not form[cl.model._meta.pk.name].is_hidden: yield format_html('<td>{0}</td>', force_text(form[cl.model._meta.pk.name]))
def csv_value(field_name, obj, modeladmin): f, attr, value = lookup_field(field_name, obj, modeladmin) return unicode(display_for_value(value)).encode('utf-8', 'replace')
def export_model_as_excel_xlsx(modeladmin, request, queryset): has_name_fields = ['village', 'cell', 'sector', 'health_centre', 'referral_hospital', 'district', 'province','role', 'type', 'location', 'nation'] is_date_fields = ['date_of_birth', 'dob', 'join_date', 'date', 'edd_date' , 'edd_anc2_date' , 'edd_anc3_date', 'edd_anc4_date' , 'edd_pnc1_date' , 'edd_pnc2_date' , 'edd_pnc3_date' ,'created'] is_person_fields = ['reporter', 'patient'] sheet_name = "%s" % ( queryset.model.__name__.lower(), ) # create a workbook in memory output = StringIO.StringIO() workbook = xlsxwriter.Workbook(output) sheet = workbook.add_worksheet(sheet_name) if hasattr(modeladmin, 'exportable_fields'): field_list = modeladmin.exportable_fields else: # Copy modeladmin.list_display to remove action_checkbox field_list = modeladmin.list_display[:] #field_list.remove('action_checkbox') #response = HttpResponse(mimetype = "application/ms-excel") #response['Content-Disposition'] = 'attachment; filename=%s.xlsx' % sheet_name row = col = 0 last_col = [] for f in field_list: sheet.write(row , col, admin_util.label_for_field(f, queryset.model, modeladmin).upper()) col = col + 1 row = row + 1 for obj in queryset: excel_line_values = [] col = 0 for field in field_list: field_obj, attr, value = admin_util.lookup_field(field, obj, modeladmin) try: if field in has_name_fields: sheet.write(row, col, value.name) elif field in is_date_fields: sheet.write(row, col, "%d/%d/%d" % (value.day, value.month, value.year)) elif field in is_person_fields: sheet.write(row, col, "%s" % (value.national_id)) else: sheet.write(row, col, value) except Exception, e: try: sheet.write(row, col, value) except: sheet.write(row, col, "NULL") col = col + 1 if queryset.model.__name__ == 'Report': details = obj.fields.all() #print row,col, "BEFORE" if details: for d in details: lc = [lc for lc in last_col if lc['name'] == d.type.key] mcol = col if lc: mcol = lc[0]['index']#;print mcol,d if d.type.has_value: sheet.write(row,mcol, d.value) else: sheet.write(row,mcol, d.type.description) else: li = [lc for lc in last_col if lc['index'] == col] if li: mcol = last_col[len(last_col)-1]['index']+1 #print mcol, d last_col.append({'name': d.type.key, 'index': mcol}) sheet.write(0, mcol, d.type.key) if d.type.has_value: sheet.write(row,mcol, d.value) else: sheet.write(row,mcol, d.type.description) col = col+1 #print last_col #print row,col, "AFTER" row = row + 1
def items_for_result(cl, result, form): """ Generates the actual list of data. """ first = True pk = cl.lookup_opts.pk.attname for field_name in cl.list_display: row_class = '' try: f, attr, value = lookup_field(field_name, result, cl.model_admin) except ObjectDoesNotExist: result_repr = EMPTY_CHANGELIST_VALUE else: if f is None: if field_name == 'action_checkbox': row_class = mark_safe(' class="action-checkbox"') allow_tags = getattr(attr, 'allow_tags', False) boolean = getattr(attr, 'boolean', False) if boolean: allow_tags = True result_repr = display_for_value(value, boolean) # Strip HTML tags in the resulting text, except if the # function has an "allow_tags" attribute set to True. if allow_tags: result_repr = mark_safe(result_repr) if isinstance(value, (datetime.date, datetime.time)): row_class = mark_safe(' class="nowrap"') else: if isinstance(f.rel, models.ManyToOneRel): field_val = getattr(result, f.name) if field_val is None: result_repr = EMPTY_CHANGELIST_VALUE else: result_repr = field_val else: result_repr = display_for_field(value, f) if isinstance(f, (models.DateField, models.TimeField, models.ForeignKey)): row_class = mark_safe(' class="nowrap"') if force_text(result_repr) == '': result_repr = mark_safe(' ') # If list_display_links not defined, add the link tag to the first field if (first and not cl.list_display_links) or field_name in cl.list_display_links: table_tag = {True:'th', False:'td'}[first] first = False url = cl.url_for_result(result) # Convert the pk to something that can be used in Javascript. # Problem cases are long ints (23L) and non-ASCII strings. if cl.to_field: attr = str(cl.to_field) else: attr = pk value = result.serializable_value(attr) result_id = repr(force_text(value))[1:] yield format_html('<{0}{1}><a href="{2}"{3}>{4}</a></{5}>', table_tag, row_class, url, format_html(' onclick="opener.dismissRelatedLookupPopup(window, {0}); return false;"', result_id) if cl.is_popup else '', result_repr, table_tag) else: # By default the fields come from ModelAdmin.list_editable, but if we pull # the fields out of the form instead of list_editable custom admins # can provide fields on a per request basis if (form and field_name in form.fields and not ( field_name == cl.model._meta.pk.name and form[cl.model._meta.pk.name].is_hidden)): bf = form[field_name] result_repr = mark_safe(force_text(bf.errors) + force_text(bf)) yield format_html('<td{0}>{1}</td>', row_class, result_repr) if form and not form[cl.model._meta.pk.name].is_hidden: yield format_html('<td>{0}</td>', force_text(form[cl.model._meta.pk.name]))
def export_reports_to_xlsx_on_disk(reports): # Create a workbook and add a worksheet. has_name_fields = ['village', 'cell', 'sector', 'health_centre', 'referral_hospital', 'district', 'province','role', 'type', 'location', 'nation'] is_date_fields = ['date_of_birth', 'dob', 'join_date', 'date', 'edd_date' , 'edd_anc2_date' , \ 'edd_anc3_date', 'edd_anc4_date' , 'edd_pnc1_date' , 'edd_pnc2_date' , 'edd_pnc3_date' ,'created'] is_person_fields = ['reporter', 'patient'] sheet_name = "%s" % ( reports.model.__name__.lower(), ) filename = "%s.xlsx" % sheet_name workbook = xlsxwriter.Workbook(filename) sheet = workbook.add_worksheet(sheet_name) ##DATE FORMAT date_format = workbook.add_format({'num_format': 'mmmm dd yyyy'}) field_list = [f.name for f in Report._meta.fields] row = col = 0 last_col = [] for f in field_list: sheet.write(row , col, f.upper()) col = col + 1 row = row + 1 for obj in reports: col = 0 for field in field_list: field_obj, attr, value = admin_util.lookup_field(field, obj, ReportAdmin) try: if field in has_name_fields: sheet.write(row, col, value.name) elif field in is_date_fields: try: sheet.write_datetime(row, col, value, date_format) except: sheet.write_datetime(row, col, value.date(), date_format) elif field in is_person_fields: sheet.write(row, col, "%s" % (value.national_id)) else: sheet.write(row, col, value) except Exception, e: try: sheet.write(row, col, value) except: sheet.write(row, col, "NULL") col = col + 1 details = obj.fields.all() #print row,col, "BEFORE" try: if details: for d in details: lc = [lc for lc in last_col if lc['name'] == d.type.key] mcol = col if lc: mcol = lc[0]['index']#;print mcol,d if d.type.has_value: sheet.write(row,mcol, d.value) else: sheet.write(row,mcol, d.type.description) else: li = [lc for lc in last_col if lc['index'] == col] if li: mcol = last_col[len(last_col)-1]['index']+1 #print mcol, d last_col.append({'name': d.type.key, 'index': mcol}) sheet.write(0, mcol, d.type.key) if d.type.has_value: sheet.write_number(row,mcol, d.value) else: sheet.write(row,mcol, d.type.description) col = col+1 except Exception, e: print e continue
def mptt_items_for_result(cl, result, form): """ Generates the actual list of data. """ first = True pk = cl.lookup_opts.pk.attname ##### MPTT ADDITION START # figure out which field to indent mptt_indent_field = getattr(cl.model_admin, 'mptt_indent_field', None) if not mptt_indent_field: for field_name in cl.list_display: try: f = cl.lookup_opts.get_field(field_name) except models.FieldDoesNotExist: if (mptt_indent_field is None and field_name != 'action_checkbox'): mptt_indent_field = field_name else: # first model field, use this one mptt_indent_field = field_name break ##### MPTT ADDITION END # figure out how much to indent mptt_level_indent = getattr(cl.model_admin, 'mptt_level_indent', MPTT_ADMIN_LEVEL_INDENT) for field_name in cl.list_display: row_class = '' try: f, attr, value = lookup_field(field_name, result, cl.model_admin) except (AttributeError, ObjectDoesNotExist): result_repr = EMPTY_CHANGELIST_VALUE else: if f is None: if field_name == 'action_checkbox': row_class = ' class="action-checkbox"' allow_tags = getattr(attr, 'allow_tags', False) boolean = getattr(attr, 'boolean', False) if boolean: allow_tags = True result_repr = _boolean_icon(value) else: result_repr = smart_text(value) # Strip HTML tags in the resulting text, except if the # function has an "allow_tags" attribute set to True. if not allow_tags: result_repr = escape(result_repr) else: result_repr = mark_safe(result_repr) else: if isinstance(f.rel, models.ManyToOneRel): field_val = getattr(result, f.name) if field_val is None: result_repr = EMPTY_CHANGELIST_VALUE else: result_repr = escape(field_val) else: result_repr = display_for_field(value, f) if isinstance(f, models.DateField)\ or isinstance(f, models.TimeField)\ or isinstance(f, models.ForeignKey): row_class = ' class="nowrap"' if force_text(result_repr) == '': result_repr = mark_safe(' ') ##### MPTT ADDITION START if field_name == mptt_indent_field: level = getattr(result, result._mptt_meta.level_attr) padding_attr = ' style="padding-left:%spx"' % (5 + mptt_level_indent * level) else: padding_attr = '' ##### MPTT ADDITION END # If list_display_links not defined, add the link tag to the first field if (first and not cl.list_display_links) or field_name in cl.list_display_links: table_tag = {True: 'th', False: 'td'}[first] first = False url = cl.url_for_result(result) # Convert the pk to something that can be used in Javascript. # Problem cases are long ints (23L) and non-ASCII strings. if cl.to_field: attr = str(cl.to_field) else: attr = pk value = result.serializable_value(attr) result_id = repr(force_text(value))[1:] ##### MPTT SUBSTITUTION START yield mark_safe('<%s%s%s><a href="%s"%s>%s</a></%s>' % \ (table_tag, row_class, padding_attr, url, (cl.is_popup and ' onclick="opener.dismissRelatedLookupPopup(window, %s); return false;"' % result_id or ''), conditional_escape(result_repr), table_tag)) ##### MPTT SUBSTITUTION END else: # By default the fields come from ModelAdmin.list_editable, but if we pull # the fields out of the form instead of list_editable custom admins # can provide fields on a per request basis if (form and field_name in form.fields and not ( field_name == cl.model._meta.pk.name and form[cl.model._meta.pk.name].is_hidden)): bf = form[field_name] result_repr = mark_safe(force_text(bf.errors) + force_text(bf)) else: result_repr = conditional_escape(result_repr) ##### MPTT SUBSTITUTION START yield mark_safe('<td%s%s>%s</td>' % (row_class, padding_attr, result_repr)) ##### MPTT SUBSTITUTION END if form and not form[cl.model._meta.pk.name].is_hidden: yield mark_safe('<td>%s</td>' % force_text(form[cl.model._meta.pk.name]))
def export_as_xls(modeladmin, request, queryset): """ Generic xls export admin action. """ if queryset.count() > settings.EXPORT_RECORDS_LIMIT: messages.error( request, "Can't export more then %s Records in one go. Narrow down your criteria using filters or search" % str(settings.EXPORT_RECORDS_LIMIT)) return HttpResponseRedirect(request.path_info) fields = [] #PUT THE LIST OF FIELD NAMES YOU DON'T WANT TO EXPORT exclude_fields = [] #foreign key related fields extras = [''] if not request.user.is_staff: raise PermissionDenied for f in modeladmin.list_display: if f not in exclude_fields: fields.append(f) fields.extend(extras) opts = modeladmin.model._meta wb = Workbook() ws0 = wb.add_sheet('0') col = 0 field_names = [] # write header row for field in fields: ws0.write(0, col, field) field_names.append(field) col = col + 1 row = 1 # Write data rows for obj in queryset: col = 0 for field in field_names: if field in extras: try: val = [eval('obj.' + field) ] #eval sucks but easiest way to deal except: val = ['None'] else: try: val = lookup_field(field, obj, modeladmin) except: val = ['None'] if not val[-1] == None: if isinstance(val[-1], bool): ws0.write(row, col, strip_tags(str(val[-1]))) elif not isinstance(val[-1], str) and not isinstance( val[-1], unicode): ws0.write(row, col, strip_tags(val[-1].__unicode__())) elif val[-1]: ws0.write(row, col, strip_tags(val[-1])) else: ws0.write(row, col, strip_tags('')) col = col + 1 row = row + 1 wb.save('/tmp/output.xls') response = HttpResponse(open('/tmp/output.xls', 'r').read(), content_type='application/ms-excel') response['Content-Disposition'] = 'attachment; filename=%s.xls' % unicode( opts).replace('.', '_') return response
def export_as_xls(modeladmin, request, queryset): """ Generic xls export admin action. """ if queryset.count() > settings.EXPORT_RECORDS_LIMIT: messages.error(request, "Can't export more then %s Records in one go. Narrow down your criteria using filters or search" % str(settings.EXPORT_RECORDS_LIMIT)) return HttpResponseRedirect(request.path_info) fields = [] #PUT THE LIST OF FIELD NAMES YOU DON'T WANT TO EXPORT exclude_fields = [] #foreign key related fields extras = [''] if not request.user.is_staff: raise PermissionDenied for f in modeladmin.list_display: if f not in exclude_fields: fields.append(f) fields.extend(extras) opts = modeladmin.model._meta wb = Workbook() ws0 = wb.add_sheet('0') col = 0 field_names = [] # write header row for field in fields: ws0.write(0, col, field) field_names.append(field) col = col + 1 row = 1 # Write data rows for obj in queryset: col = 0 for field in field_names: if field in extras: try: val = [eval('obj.'+field)] #eval sucks but easiest way to deal except : val = ['None'] else: try: val = lookup_field(field, obj, modeladmin) except : val = ['None'] if not val[-1] == None: if isinstance(val[-1], bool): ws0.write(row, col, strip_tags(str(val[-1]))) elif not isinstance(val[-1], str) and not isinstance(val[-1], unicode): if type(val[-1]) == int: ws0.write(row, col, val[-1].__str__()) else: ws0.write(row, col, strip_tags(val[-1].__unicode__())) elif val[-1]: ws0.write(row, col, strip_tags(val[-1])) else: ws0.write(row, col, strip_tags('')) col = col + 1 row = row + 1 wb.save('/tmp/output.xls') response = HttpResponse(open('/tmp/output.xls','r').read(), content_type='application/ms-excel') response['Content-Disposition'] = 'attachment; filename=%s.xls' % unicode(opts).replace('.', '_') return response
def items_for_result(cl, result, form): """ Generates the actual list of data. """ first = True pk = cl.lookup_opts.pk.attname for field_name in cl.list_display: row_class = '' try: f, attr, value = lookup_field(field_name, result, cl.model_admin) except (AttributeError, ObjectDoesNotExist): result_repr = EMPTY_CHANGELIST_VALUE else: if f is None: if field_name == u'action_checkbox': row_class = ' class="action-checkbox"' allow_tags = getattr(attr, 'allow_tags', False) boolean = getattr(attr, 'boolean', False) if boolean: allow_tags = True result_repr = _boolean_icon(value) else: result_repr = smart_unicode(value) # Strip HTML tags in the resulting text, except if the # function has an "allow_tags" attribute set to True. if not allow_tags: result_repr = escape(result_repr) else: result_repr = mark_safe(result_repr) else: if isinstance(f.rel, models.ManyToOneRel): field_val = getattr(result, f.name) if field_val is None: result_repr = EMPTY_CHANGELIST_VALUE else: result_repr = escape(field_val) else: result_repr = display_for_field(value, f) if isinstance(f, models.DateField)\ or isinstance(f, models.TimeField)\ or isinstance(f, models.ForeignKey): row_class = ' class="nowrap"' if force_unicode(result_repr) == '': result_repr = mark_safe(' ') # If list_display_links not defined, add the link tag to the first field if (first and not cl.list_display_links ) or field_name in cl.list_display_links: table_tag = {True: 'th', False: 'td'}[first] first = False url = cl.url_for_result(result) # Convert the pk to something that can be used in Javascript. # Problem cases are long ints (23L) and non-ASCII strings. if cl.to_field: attr = str(cl.to_field) else: attr = pk value = result.serializable_value(attr) result_id = repr(force_unicode(value))[1:] yield mark_safe(u'<%s%s><a href="%s"%s>%s</a></%s>' % \ (table_tag, row_class, url, (cl.is_popup and ' onclick="opener.dismissRelatedLookupPopup(window, %s); return false;"' % result_id or ''), conditional_escape(result_repr), table_tag)) else: # By default the fields come from ModelAdmin.list_editable, but if we pull # the fields out of the form instead of list_editable custom admins # can provide fields on a per request basis if (form and field_name in form.fields and not (field_name == cl.model._meta.pk.name and form[cl.model._meta.pk.name].is_hidden)): bf = form[field_name] result_repr = mark_safe( force_unicode(bf.errors) + force_unicode(bf)) else: result_repr = conditional_escape(result_repr) yield mark_safe(u'<td%s>%s</td>' % (row_class, result_repr)) if form and not form[cl.model._meta.pk.name].is_hidden: yield mark_safe(u'<td>%s</td>' % force_unicode(form[cl.model._meta.pk.name]))
def items_for_result(cl, result, form): """ Generates the actual list of data. @jjdelc: This has been shamelessly copied from original django.contrib.admin.templatetags.admin_list.items_for_result in order to alter the dispay for the first element """ first = True pk = cl.lookup_opts.pk.attname for field_name in cl.list_display: row_class = '' try: f, attr, value = lookup_field(field_name, result, cl.model_admin) except (AttributeError, ObjectDoesNotExist): result_repr = EMPTY_CHANGELIST_VALUE else: if f is None: allow_tags = getattr(attr, 'allow_tags', False) boolean = getattr(attr, 'boolean', False) if boolean: allow_tags = True result_repr = _boolean_icon(value) else: result_repr = smart_unicode(value) # Strip HTML tags in the resulting text, except if the # function has an "allow_tags" attribute set to True. if not allow_tags: result_repr = escape(result_repr) else: result_repr = mark_safe(result_repr) else: if value is None: result_repr = EMPTY_CHANGELIST_VALUE if isinstance(f.rel, models.ManyToOneRel): result_repr = escape(getattr(result, f.name)) else: result_repr = display_for_field(value, f) if (isinstance(f, models.DateField) or isinstance(f, models.TimeField)): row_class = ' class="nowrap"' if force_unicode(result_repr) == '': result_repr = mark_safe(' ') # If list_display_links not defined, add the link tag to the # first field if ((first and not cl.list_display_links) or field_name in cl.list_display_links): table_tag = {True: 'th', False: 'td'}[first] # This spacer indents the nodes based on their depth if first: spacer = '<span class="spacer"> </span>' * ( result.get_depth() - 1) else: spacer = '' # This shows a collapse or expand link for nodes with childs if result.get_children_count(): collapse = ('<a href="#" title="" class="collapse expanded">' '-</a>') else: collapse = '<span class="collapse"> </span>' # Add a <td/> before the first col to show the drag handler drag_handler = '' if first: drag_handler = ('<td class="drag-handler">' '<span> </span></td>') first = False url = cl.url_for_result(result) # Convert the pk to something that can be used in Javascript. # Problem cases are long ints (23L) and non-ASCII strings. if cl.to_field: attr = str(cl.to_field) else: attr = pk value = result.serializable_value(attr) result_id = repr(force_unicode(value))[1:] onclickstr = ( ' onclick="opener.dismissRelatedLookupPopup(window, %s);' ' return false;"') yield mark_safe( u'%s<%s%s>%s %s <a href="%s"%s>%s</a></%s>' % ( drag_handler, table_tag, row_class, spacer, collapse, url, (cl.is_popup and onclickstr % result_id or ''), conditional_escape(result_repr), table_tag)) else: # By default the fields come from ModelAdmin.list_editable, but # if we pull the fields out of the form instead of # list_editable custom admins can provide fields on a per # request basis if form and field_name in form.fields: bf = form[field_name] result_repr = mark_safe( force_unicode(bf.errors) + force_unicode(bf)) else: result_repr = conditional_escape(result_repr) yield mark_safe(u'<td%s>%s</td>' % (row_class, result_repr)) if form and not form[cl.model._meta.pk.name].is_hidden: yield mark_safe( u'<td>%s</td>' % force_unicode(form[cl.model._meta.pk.name]))
def items_for_result(cl, result, form): """ Generates the actual list of data. """ first = True pk = cl.lookup_opts.pk.attname for field_name in cl.list_display: row_class = '' try: f, attr, value = lookup_field(field_name, result, cl.model_admin) except (AttributeError, ObjectDoesNotExist): result_repr = EMPTY_CHANGELIST_VALUE else: if f is None: allow_tags = getattr(attr, 'allow_tags', False) boolean = getattr(attr, 'boolean', False) if boolean: allow_tags = True result_repr = _boolean_icon(value) else: result_repr = smart_unicode(value) # Strip HTML tags in the resulting text, except if the # function has an "allow_tags" attribute set to True. if not allow_tags: result_repr = escape(result_repr) else: result_repr = mark_safe(result_repr) else: if value is None: result_repr = EMPTY_CHANGELIST_VALUE if isinstance(f.rel, models.ManyToOneRel): result_repr = escape(getattr(result, f.name)) else: result_repr = display_for_field(value, f) if isinstance(f, models.DateField) or isinstance(f, models.TimeField): row_class = ' class="nowrap"' if force_unicode(result_repr) == '': result_repr = mark_safe(' ') # If list_display_links not defined, add the link tag to the first field if (first and not cl.list_display_links) or field_name in cl.list_display_links: table_tag = {True:'th', False:'td'}[first] first = False url = cl.url_for_result(result) # Convert the pk to something that can be used in Javascript. # Problem cases are long ints (23L) and non-ASCII strings. if cl.to_field: attr = str(cl.to_field) else: attr = pk value = result.serializable_value(attr) result_id = repr(force_unicode(value))[1:] yield mark_safe(u'<%s%s><a href="%s"%s>%s</a></%s>' % \ (table_tag, row_class, url, (cl.is_popup and ' onclick="opener.dismissRelatedLookupPopup(window, %s); return false;"' % result_id or ''), conditional_escape(result_repr), table_tag)) else: # By default the fields come from ModelAdmin.list_editable, but if we pull # the fields out of the form instead of list_editable custom admins # can provide fields on a per request basis if form and field_name in form.fields: bf = form[field_name] result_repr = mark_safe(force_unicode(bf.errors) + force_unicode(bf)) else: result_repr = conditional_escape(result_repr) yield mark_safe(u'<td%s>%s</td>' % (row_class, result_repr)) if form and not form[cl.model._meta.pk.name].is_hidden: yield mark_safe(u'<td>%s</td>' % force_unicode(form[cl.model._meta.pk.name]))
def items_for_result(cl, result, form): """ Generates the actual list of data. """ first = True pk = cl.lookup_opts.pk.attname for field_name in cl.list_display: row_classes = ['field-%s' % field_name] try: f, attr, value = lookup_field(field_name, result, cl.model_admin) except ObjectDoesNotExist: result_repr = EMPTY_CHANGELIST_VALUE else: if f is None: if field_name == 'action_checkbox': row_classes = ['action-checkbox'] allow_tags = getattr(attr, 'allow_tags', False) boolean = getattr(attr, 'boolean', False) if boolean: allow_tags = True result_repr = display_for_value(value, boolean) # Strip HTML tags in the resulting text, except if the # function has an "allow_tags" attribute set to True. if allow_tags: result_repr = mark_safe(result_repr) if isinstance(value, (datetime.date, datetime.time)): row_classes.append('nowrap') else: if isinstance(f.rel, models.ManyToOneRel): field_val = getattr(result, f.name) if field_val is None: result_repr = EMPTY_CHANGELIST_VALUE else: result_repr = field_val else: result_repr = display_for_field(value, f) if isinstance( f, (models.DateField, models.TimeField, models.ForeignKey)): row_classes.append('nowrap') if force_text(result_repr) == '': result_repr = mark_safe(' ') row_class = mark_safe(' class="%s"' % ' '.join(row_classes)) # If list_display_links not defined, add the link tag to the first field if (first and not cl.list_display_links ) or field_name in cl.list_display_links: table_tag = 'th' if first else 'td' first = False # Display link to the result's change_view if the url exists, else # display just the result's representation. try: url = cl.url_for_result(result) except NoReverseMatch: link_or_text = result_repr else: url = add_preserved_filters( { 'preserved_filters': cl.preserved_filters, 'opts': cl.opts }, url) # Convert the pk to something that can be used in Javascript. # Problem cases are long ints (23L) and non-ASCII strings. if cl.to_field: attr = str(cl.to_field) else: attr = pk value = result.serializable_value(attr) result_id = escapejs(value) link_or_text = format_html( '<a href="{0}"{1}>{2}</a>', url, format_html( ' onclick="opener.dismissRelatedLookupPopup(window, '{0}'); return false;"', result_id) if cl.is_popup else '', result_repr) yield format_html('<{0}{1}>{2}</{3}>', table_tag, row_class, link_or_text, table_tag) else: # By default the fields come from ModelAdmin.list_editable, but if we pull # the fields out of the form instead of list_editable custom admins # can provide fields on a per request basis if (form and field_name in form.fields and not (field_name == cl.model._meta.pk.name and form[cl.model._meta.pk.name].is_hidden)): bf = form[field_name] result_repr = mark_safe(force_text(bf.errors) + force_text(bf)) yield format_html('<td{0}>{1}</td>', row_class, result_repr) if form and not form[cl.model._meta.pk.name].is_hidden: yield format_html('<td>{0}</td>', force_text(form[cl.model._meta.pk.name]))