def compose_url(self, **kwargs): if self.url and callable(self.url): return call_with_appropriate(self.url, kwargs) bound_column = kwargs.get("bound_column", None) record = kwargs["record"] if self.reverse_args.get("viewname", None) is not None: return self.call_reverse(record=record) if bound_column is None and self.accessor is None: accessor = Accessor("") else: accessor = Accessor(self.accessor if self.accessor is not None else bound_column.name) context = accessor.resolve(record) if not hasattr(context, "get_absolute_url"): if hasattr(record, "get_absolute_url"): context = record else: raise TypeError( "for linkify=True, '{}' must have a method get_absolute_url".format( str(context) ) ) return context.get_absolute_url()
def accessor(): x = Accessor('0') Assert('B') == x.resolve('Brad') x = Accessor('1') Assert('r') == x.resolve('Brad') x = Accessor('2.upper') Assert('A') == x.resolve('Brad') x = Accessor('2.upper.__len__') Assert(1) == x.resolve('Brad') x = Accessor('') Assert('Brad') == x.resolve('Brad')
def accessor(): x = Accessor('0') assert 'B' == x.resolve('Brad') x = Accessor('1') assert 'r' == x.resolve('Brad') x = Accessor('2.upper') assert 'A' == x.resolve('Brad') x = Accessor('2.upper.__len__') assert 1 == x.resolve('Brad') x = Accessor('') assert 'Brad' == x.resolve('Brad')
class VLANGroupTable(BaseTable): pk = ToggleColumn() name = tables.Column(linkify=True) site = tables.LinkColumn(viewname="dcim:site", args=[Accessor("site__slug")]) vlan_count = LinkedCountColumn(viewname="ipam:vlan_list", url_params={"group": "slug"}, verbose_name="VLANs") actions = ButtonsColumn(model=VLANGroup, prepend_template=VLANGROUP_ADD_VLAN) class Meta(BaseTable.Meta): model = VLANGroup fields = ("pk", "name", "site", "vlan_count", "slug", "description", "actions") default_columns = ("pk", "name", "site", "vlan_count", "description", "actions")
class CircuitTable(BaseTable): pk = ToggleColumn() cid = tables.LinkColumn(verbose_name='ID') provider = tables.LinkColumn('circuits:provider', args=[Accessor('provider.slug')]) status = tables.TemplateColumn(template_code=STATUS_LABEL, verbose_name='Status') tenant = tables.TemplateColumn(template_code=COL_TENANT) termination_a = CircuitTerminationColumn(orderable=False, verbose_name='A Side') termination_z = CircuitTerminationColumn(orderable=False, verbose_name='Z Side') class Meta(BaseTable.Meta): model = Circuit fields = ('pk', 'cid', 'status', 'type', 'provider', 'tenant', 'termination_a', 'termination_z', 'description')
class VLANGroupTable(BaseTable): pk = ToggleColumn() name = tables.LinkColumn(verbose_name='Name') site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site') vlan_count = tables.Column(verbose_name='VLANs') slug = tables.Column(verbose_name='Slug') actions = tables.TemplateColumn(template_code=VLANGROUP_ACTIONS, attrs={'td': { 'class': 'text-right' }}, verbose_name='') class Meta(BaseTable.Meta): model = VLANGroup fields = ('pk', 'name', 'site', 'vlan_count', 'slug', 'actions')
class AggregateTable(BaseTable): pk = ToggleColumn() prefix = tables.LinkColumn('ipam:aggregate', args=[Accessor('pk')], verbose_name='Aggregate') rir = tables.Column(verbose_name='RIR') child_count = tables.Column(verbose_name='Prefixes') get_utilization = tables.TemplateColumn(UTILIZATION_GRAPH, orderable=False, verbose_name='Utilization') date_added = tables.DateColumn(format="Y-m-d", verbose_name='Added') description = tables.Column(orderable=False, verbose_name='Description') class Meta(BaseTable.Meta): model = Aggregate fields = ('pk', 'prefix', 'rir', 'child_count', 'get_utilization', 'date_added', 'description')
class VirtualChassisTable(BaseTable): pk = ToggleColumn() name = tables.Column( accessor=Accessor('master__name'), linkify=True ) member_count = tables.Column( verbose_name='Members' ) tags = TagColumn( url_name='dcim:virtualchassis_list' ) class Meta(BaseTable.Meta): model = VirtualChassis fields = ('pk', 'name', 'domain', 'member_count', 'tags') default_columns = ('pk', 'name', 'domain', 'member_count')
class SiteTable(BaseTable): pk = ToggleColumn() name = tables.LinkColumn('dcim:site', args=[Accessor('slug')], verbose_name='Name') facility = tables.Column(verbose_name='Facility') tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')], verbose_name='Tenant') asn = tables.Column(verbose_name='ASN') rack_count = tables.Column(accessor=Accessor('count_racks'), orderable=False, verbose_name='Racks') device_count = tables.Column(accessor=Accessor('count_devices'), orderable=False, verbose_name='Devices') prefix_count = tables.Column(accessor=Accessor('count_prefixes'), orderable=False, verbose_name='Prefixes') vlan_count = tables.Column(accessor=Accessor('count_vlans'), orderable=False, verbose_name='VLANs') circuit_count = tables.Column(accessor=Accessor('count_circuits'), orderable=False, verbose_name='Circuits') class Meta(BaseTable.Meta): model = Site fields = ('pk', 'name', 'facility', 'tenant', 'asn', 'rack_count', 'device_count', 'prefix_count', 'vlan_count', 'circuit_count')
class DevicePowerPortTable(PowerPortTable): name = tables.TemplateColumn( template_code= '<i class="mdi mdi-power-plug-outline"></i> <a href="{{ record.get_absolute_url }}">' '{{ value }}</a>', order_by=Accessor('_name'), attrs={'td': { 'class': 'text-nowrap' }}) actions = ButtonsColumn(model=PowerPort, buttons=('edit', 'delete'), prepend_template=POWERPORT_BUTTONS) class Meta(DeviceComponentTable.Meta): model = PowerPort fields = ( 'pk', 'id', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description', 'mark_connected', 'cable', 'cable_color', 'link_peer', 'connection', 'tags', 'actions', ) default_columns = ( 'pk', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description', 'cable', 'connection', 'actions', ) row_attrs = {'class': get_cabletermination_row_class}
class ConsoleServerPortTable(DeviceComponentTable, PathEndpointTable): device = tables.Column( linkify={ 'viewname': 'dcim:device_consoleserverports', 'args': [Accessor('device_id')], } ) tags = TagColumn( url_name='dcim:consoleserverport_list' ) class Meta(DeviceComponentTable.Meta): model = ConsoleServerPort fields = ( 'pk', 'name', 'device', 'label', 'type', 'speed', 'description', 'mark_connected', 'cable', 'cable_color', 'cable_peer', 'connection', 'tags', ) default_columns = ('pk', 'name', 'device', 'label', 'type', 'speed', 'description')
class PowerPanelTable(BaseTable): pk = ToggleColumn() name = tables.LinkColumn() site = tables.LinkColumn(viewname="dcim:site", args=[Accessor("site__slug")]) powerfeed_count = LinkedCountColumn( viewname="dcim:powerfeed_list", url_params={"power_panel_id": "pk"}, verbose_name="Feeds", ) tags = TagColumn(url_name="dcim:powerpanel_list") class Meta(BaseTable.Meta): model = PowerPanel fields = ("pk", "name", "site", "rack_group", "powerfeed_count", "tags") default_columns = ("pk", "name", "site", "rack_group", "powerfeed_count")
class DeviceTypeTable(BaseTable): pk = ToggleColumn() model = tables.LinkColumn('dcim:devicetype', args=[Accessor('pk')], verbose_name='Device Type') is_full_depth = tables.BooleanColumn(verbose_name='Full Depth') is_console_server = tables.BooleanColumn(verbose_name='CS') is_pdu = tables.BooleanColumn(verbose_name='PDU') is_network_device = tables.BooleanColumn(verbose_name='Net') subdevice_role = tables.TemplateColumn(SUBDEVICE_ROLE_TEMPLATE, verbose_name='Subdevice Role') instance_count = tables.Column(verbose_name='Instances') class Meta(BaseTable.Meta): model = DeviceType fields = ('pk', 'model', 'manufacturer', 'part_number', 'u_height', 'is_full_depth', 'is_console_server', 'is_pdu', 'is_network_device', 'subdevice_role', 'instance_count')
class PowerPortTable(DeviceComponentTable, PathEndpointTable): device = tables.Column( linkify={ 'viewname': 'dcim:device_powerports', 'args': [Accessor('device_id')], } ) tags = TagColumn( url_name='dcim:powerport_list' ) class Meta(DeviceComponentTable.Meta): model = PowerPort fields = ( 'pk', 'id', 'name', 'device', 'label', 'type', 'description', 'mark_connected', 'maximum_draw', 'allocated_draw', 'cable', 'cable_color', 'link_peer', 'connection', 'tags', 'created', 'last_updated', ) default_columns = ('pk', 'name', 'device', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description')
class VirtualMachineTable(BaseTable): pk = ToggleColumn() name = tables.LinkColumn() status = tables.TemplateColumn( template_code=VIRTUALMACHINE_STATUS ) cluster = tables.LinkColumn( viewname='virtualization:cluster', args=[Accessor('cluster.pk')] ) role = ColoredLabelColumn() tenant = tables.TemplateColumn( template_code=COL_TENANT ) class Meta(BaseTable.Meta): model = VirtualMachine fields = ('pk', 'name', 'status', 'cluster', 'role', 'tenant', 'vcpus', 'memory', 'disk')
class RackGroupTable(BaseTable): pk = ToggleColumn() name = tables.LinkColumn() site = tables.LinkColumn(viewname='dcim:site', args=[Accessor('site.slug')], verbose_name='Site') rack_count = tables.Column(verbose_name='Racks') slug = tables.Column() actions = tables.TemplateColumn( template_code=RACKGROUP_ACTIONS, attrs={'td': { 'class': 'text-right noprint' }}, verbose_name='') class Meta(BaseTable.Meta): model = RackGroup fields = ('pk', 'name', 'site', 'rack_count', 'slug', 'actions')
def verbose_name(self): ''' Return the verbose name for this column. In order of preference, this will return: 1) The column's explicitly defined `verbose_name` 2) The titlised model's `verbose_name` (if applicable) 3) Fallback to the titlised column name. Any `verbose_name` that was not passed explicitly in the column definition is returned titlised in keeping with the Django convention of `verbose_name` being defined in lowercase and uppercased/titlised as needed by the application. If the table is using queryset data, then use the corresponding model field's `~.db.Field.verbose_name`. If it's traversing a relationship, then get the last field in the accessor (i.e. stop when the relationship turns from ORM relationships to object attributes [e.g. person.upper should stop at person]). ''' # Favor an explicit defined verbose_name if self.column.verbose_name is not None: return self.column.verbose_name # This is our reasonable fallback, should the next section not result # in anything useful. name = self.name.replace('_', ' ') # Try to use a model field's verbose_name if hasattr(self.table.data, 'queryset') and hasattr( self.table.data.queryset, 'model'): model = self.table.data.queryset.model field = Accessor(self.accessor).get_field(model) if field: if hasattr(field, 'field'): name = field.field.verbose_name else: name = getattr(field, 'verbose_name', field.name) # If verbose_name was mark_safe()'d, return intact to keep safety if isinstance(name, SafeData): return name return title(name)
class SiteDetailTable(SiteTable): rack_count = tables.Column(accessor=Accessor('count_racks'), orderable=False, verbose_name='Racks') device_count = tables.Column(accessor=Accessor('count_devices'), orderable=False, verbose_name='Devices') prefix_count = tables.Column(accessor=Accessor('count_prefixes'), orderable=False, verbose_name='Prefixes') vlan_count = tables.Column(accessor=Accessor('count_vlans'), orderable=False, verbose_name='VLANs') circuit_count = tables.Column(accessor=Accessor('count_circuits'), orderable=False, verbose_name='Circuits') vm_count = tables.Column(accessor=Accessor('count_vms'), orderable=False, verbose_name='VMs') class Meta(SiteTable.Meta): fields = ( 'pk', 'name', 'facility', 'region', 'tenant', 'asn', 'rack_count', 'device_count', 'prefix_count', 'vlan_count', 'circuit_count', 'vm_count', )
class DeviceFrontPortTable(FrontPortTable): name = tables.TemplateColumn( template_code= '<i class="mdi mdi-square-rounded{% if not record.cable %}-outline{% endif %}"></i> ' '<a href="{{ record.get_absolute_url }}">{{ value }}</a>', order_by=Accessor('_name'), attrs={'td': { 'class': 'text-nowrap' }}) actions = ButtonsColumn(model=FrontPort, buttons=('edit', 'delete'), prepend_template=FRONTPORT_BUTTONS) class Meta(DeviceComponentTable.Meta): model = FrontPort fields = ( 'pk', 'id', 'name', 'label', 'type', 'rear_port', 'rear_port_position', 'description', 'mark_connected', 'cable', 'cable_color', 'link_peer', 'tags', 'actions', ) default_columns = ( 'pk', 'name', 'label', 'type', 'rear_port', 'rear_port_position', 'description', 'cable', 'link_peer', 'actions', ) row_attrs = {'class': get_cabletermination_row_class}
def __init__( self, verbose_name=None, accessor=None, default=None, visible=True, orderable=None, attrs=None, order_by=None, empty_values=None, localize=None, footer=None, exclude_from_export=False, ): if not (accessor is None or isinstance(accessor, six.string_types) or callable(accessor)): raise TypeError("accessor must be a string or callable, not %s" % type(accessor).__name__) if callable(accessor) and default is not None: raise TypeError( "accessor must be string when default is used, not callable") self.accessor = Accessor(accessor) if accessor else None self._default = default self.verbose_name = verbose_name self.visible = visible self.orderable = orderable self.attrs = attrs or getattr(self, "attrs", {}) # massage order_by into an OrderByTuple or None order_by = (order_by, ) if isinstance(order_by, six.string_types) else order_by self.order_by = OrderByTuple( order_by) if order_by is not None else None if empty_values is not None: self.empty_values = empty_values self.localize = localize self.creation_counter = Column.creation_counter Column.creation_counter += 1 self._footer = footer self.exclude_from_export = exclude_from_export
class VLANGroupTable(BaseTable): pk = ToggleColumn() name = tables.Column(linkify=True) site = tables.LinkColumn( viewname='dcim:site', args=[Accessor('site__slug')] ) vlan_count = tables.Column( verbose_name='VLANs' ) actions = ButtonsColumn( model=VLANGroup, prepend_template=VLANGROUP_ADD_VLAN ) class Meta(BaseTable.Meta): model = VLANGroup fields = ('pk', 'name', 'site', 'vlan_count', 'slug', 'description', 'actions') default_columns = ('pk', 'name', 'site', 'vlan_count', 'description', 'actions')
class DeviceTypeTable(BaseTable): pk = ToggleColumn() model = tables.LinkColumn( viewname='dcim:devicetype', args=[Accessor('pk')], verbose_name='Device Type' ) is_full_depth = BooleanColumn(verbose_name='Full Depth') instance_count = tables.TemplateColumn( template_code=DEVICETYPE_INSTANCES_TEMPLATE, verbose_name='Instances' ) class Meta(BaseTable.Meta): model = DeviceType fields = ( 'pk', 'model', 'manufacturer', 'part_number', 'u_height', 'is_full_depth', 'subdevice_role', 'instance_count', )
class InterfaceConnectionTable(BaseTable): device_a = tables.LinkColumn('dcim:device', accessor=Accessor('interface_a.device'), args=[Accessor('interface_a.device.pk')], verbose_name='Device A') interface_a = tables.LinkColumn('dcim:interface', accessor=Accessor('interface_a'), args=[Accessor('interface_a.pk')], verbose_name='Interface A') device_b = tables.LinkColumn('dcim:device', accessor=Accessor('interface_b.device'), args=[Accessor('interface_b.device.pk')], verbose_name='Device B') interface_b = tables.LinkColumn('dcim:interface', accessor=Accessor('interface_b'), args=[Accessor('interface_b.pk')], verbose_name='Interface B') class Meta(BaseTable.Meta): model = InterfaceConnection fields = ('device_a', 'interface_a', 'device_b', 'interface_b')
class BaseInterfaceTable(BaseTable): enabled = BooleanColumn() ip_addresses = tables.TemplateColumn( template_code=INTERFACE_IPADDRESSES, orderable=False, verbose_name='IP Addresses' ) fhrp_groups = tables.TemplateColumn( accessor=Accessor('fhrp_group_assignments'), template_code=INTERFACE_FHRPGROUPS, orderable=False, verbose_name='FHRP Groups' ) untagged_vlan = tables.Column(linkify=True) tagged_vlans = TemplateColumn( template_code=INTERFACE_TAGGED_VLANS, orderable=False, verbose_name='Tagged VLANs' )
class RearPortTable(DeviceComponentTable, CableTerminationTable): device = tables.Column( linkify={ 'viewname': 'dcim:device_rearports', 'args': [Accessor('device_id')], } ) color = ColorColumn() tags = TagColumn( url_name='dcim:rearport_list' ) class Meta(DeviceComponentTable.Meta): model = RearPort fields = ( 'pk', 'id', 'name', 'device', 'label', 'type', 'color', 'positions', 'description', 'mark_connected', 'cable', 'cable_color', 'link_peer', 'tags', 'created', 'last_updated', ) default_columns = ('pk', 'name', 'device', 'label', 'type', 'color', 'description')
class DeviceRoleTable(tables.Table): device_count = tables.TemplateColumn( template_code=DEVICEROLE_DEVICE_COUNT, accessor=Accessor('devices.count'), orderable=False, verbose_name='Devices' ) color = tables.TemplateColumn(COLOR_LABEL, verbose_name='Label') # slug = tables.Column(verbose_name='Slug') actions = tables.TemplateColumn( template_code=DEVICEROLE_ACTIONS, attrs={'td': {'class': 'text-right noprint'}}, verbose_name='' ) class Meta: model = DeviceRole fields = ('name', 'device_count', 'color', 'description', 'actions') attrs = {'class': 'table table-hover table-headings', }
def verbose_name(self): """ Return the verbose name for this column. In order of preference, this will return: 1) The column's explicitly defined `verbose_name` 2) The model's `verbose_name` with the first letter capitalized (if applicable) 3) Fall back to the column name, with first letter capitalized. Any `verbose_name` that was not passed explicitly in the column definition is returned with the first character capitalized in keeping with the Django convention of `verbose_name` being defined in lowercase and uppercased as needed by the application. If the table is using `QuerySet` data, then use the corresponding model field's `~.db.Field.verbose_name`. If it is traversing a relationship, then get the last field in the accessor (i.e. stop when the relationship turns from ORM relationships to object attributes [e.g. person.upper should stop at person]). """ # Favor an explicit defined verbose_name if self.column.verbose_name is not None: return self.column.verbose_name # This is our reasonable fall back, should the next section not result # in anything useful. name = self.name.replace("_", " ") # Try to use a model field's verbose_name model = self._table.data.model if model: field = Accessor(self.accessor).get_field(model) if field: if hasattr(field, "field"): name = field.field.verbose_name else: name = getattr(field, "verbose_name", field.name) # If verbose_name was mark_safe()'d, return intact to keep safety if isinstance(name, SafeData): return name return ucfirst(name)
class IPAddressDetailTable(IPAddressTable): nat_inside = tables.LinkColumn('ipam:ipaddress', args=[Accessor('nat_inside.pk')], orderable=False, verbose_name='NAT (Inside)') class Meta(IPAddressTable.Meta): fields = ( 'pk', 'address', 'vrf', 'status', 'role', 'tenant', 'nat_inside', 'parent', 'interface', 'description', )
class VLANGroupTable(BaseTable): pk = ToggleColumn() name = tables.Column(linkify=True) site = tables.LinkColumn(viewname='dcim:site', args=[Accessor('site.slug')]) vlan_count = tables.Column(verbose_name='VLANs') actions = tables.TemplateColumn( template_code=VLANGROUP_ACTIONS, attrs={'td': { 'class': 'text-right noprint' }}, verbose_name='') class Meta(BaseTable.Meta): model = VLANGroup fields = ('pk', 'name', 'site', 'vlan_count', 'slug', 'description', 'actions') default_columns = ('pk', 'name', 'site', 'vlan_count', 'description', 'actions')
class PrefixTable(BaseTable): pk = ToggleColumn() status = tables.TemplateColumn(STATUS_LABEL, verbose_name='Status') prefix = tables.TemplateColumn(PREFIX_LINK, verbose_name='Prefix') vrf = tables.TemplateColumn(VRF_LINK, verbose_name='VRF') tenant = tables.TemplateColumn(TENANT_LINK, verbose_name='Tenant') site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site') role = tables.Column(verbose_name='Role') description = tables.Column(orderable=False, verbose_name='Description') class Meta(BaseTable.Meta): model = Prefix fields = ('pk', 'prefix', 'status', 'vrf', 'tenant', 'site', 'role', 'description') row_attrs = { 'class': lambda record: 'success' if not record.pk else '', }
class CircuitSearchTable(SearchTable): cid = tables.LinkColumn(verbose_name='ID') provider = tables.LinkColumn('circuits:provider', args=[Accessor('provider.slug')]) tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')]) a_side = tables.LinkColumn( 'dcim:site', accessor=Accessor('termination_a.site'), args=[Accessor('termination_a.site.slug')] ) z_side = tables.LinkColumn( 'dcim:site', accessor=Accessor('termination_z.site'), args=[Accessor('termination_z.site.slug')] ) class Meta(SearchTable.Meta): model = Circuit fields = ('cid', 'type', 'provider', 'tenant', 'a_side', 'z_side', 'description')
class DeviceInterfaceTable(InterfaceTable): name = tables.TemplateColumn( template_code='<i class="mdi mdi-{% if record.mgmt_only %}wrench{% elif record.is_lag %}reorder-horizontal' '{% elif record.is_virtual %}circle{% elif record.is_wireless %}wifi{% else %}ethernet' '{% endif %}"></i> <a href="{{ record.get_absolute_url }}">{{ value }}</a>', order_by=Accessor('_name'), attrs={'td': {'class': 'text-nowrap'}} ) parent = tables.Column( linkify=True ) bridge = tables.Column( linkify=True ) lag = tables.Column( linkify=True, verbose_name='LAG' ) actions = ButtonsColumn( model=Interface, buttons=('edit', 'delete'), prepend_template=INTERFACE_BUTTONS ) class Meta(DeviceComponentTable.Meta): model = Interface fields = ( 'pk', 'id', 'name', 'label', 'enabled', 'type', 'parent', 'bridge', 'lag', 'mgmt_only', 'mtu', 'mode', 'mac_address', 'wwn', 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'description', 'mark_connected', 'cable', 'cable_color', 'wireless_link', 'wireless_lans', 'link_peer', 'connection', 'tags', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'actions', ) order_by = ('name',) default_columns = ( 'pk', 'name', 'label', 'enabled', 'type', 'parent', 'lag', 'mtu', 'mode', 'description', 'ip_addresses', 'cable', 'connection', 'actions', ) row_attrs = { 'class': get_interface_row_class, 'data-name': lambda record: record.name, 'data-enabled': get_interface_state_attribute, }
class NoSessionTable(BaseTable): class Meta(BaseTable.Meta): model = Child order_by = ( 'name_last_text', 'name_first_text', ) #fields = ('id', 'name_last_text', 'name_first_text', 'gender_type', 'dob_early', 'disability', 'age_dec', 'eng_heard') fields = ('id', 'name_last_text', 'name_first_text', 'gender_type', 'dob_early', 'disability', 'age_in_months', 'eng_heard', 'last_time_contacted') id = OpenColumn('child_detail', icon='child', kwargs={'pk': Accessor('id')}, attrs={'a': { 'class': 'btn btn-primary btn-sm' }}, verbose_name='Action', orderable=False) disability = tables.columns.TemplateColumn( attrs={'th': { 'class': 'text-search' }}, verbose_name='Disability', template_name='study/column_multi_disability.html', orderable=False) dob_early = tables.columns.Column(attrs={'th': {'class': 'filter'}}) gender_type = tables.columns.Column(attrs={'th': {'class': 'filter'}}) last_time_contacted = tables.columns.Column(empty_values=()) def __init__(self, *args, **kwargs): if 'current_study' in kwargs: self.study = kwargs.pop('current_study') super(NoSessionTable, self).__init__(*args, **kwargs) def render_last_time_contacted(self, record): contact_time = record.get_last_time_contacted(self.study) if contact_time is None: return '' else: return contact_time
def test_calling_methods(self): x = Accessor('2.upper') assert 'A' == x.resolve('Brad') x = Accessor('2.upper.__len__') assert 1 == x.resolve('Brad')
def test_index_lookup(self): x = Accessor('0') assert 'B' == x.resolve('Brad') x = Accessor('1') assert 'r' == x.resolve('Brad')