"""
Managed Property Script for handling YEAST parents of YEAST samples.
@author: Piotr Buczek
"""
import re
""""space that all parents come from (fixed)"""
SPACE = "YEAST_LAB"
"""plasmid_list attribute name"""
ATR_CODE = "code"
"""labels of table columns"""
LINK_LABEL = "link"
CODE_LABEL = "code"
"""action labels"""
ADD_ACTION_LABEL = "Add"
EDIT_ACTION_LABEL = "Edit"
DELETE_ACTION_LABEL = "Delete"
"""helper functions"""
def _createSampleLink(plasmid_list):
"""
Creates sample link XML element for sample with specified 'plasmid_list'. The element will contain
given plasmid_list as 'plasmid_list' attribute apart from standard 'permId' attribute.
If the sample doesn't exist in DB a fake link will be created with the 'plasmid_list' as permId.
@return: sample link XML element as string, e.g.:
- ''
- '
"""
plasmidPath= "/YEAST_LAB/" + plasmid_list
permId = entityInformationProvider().getSamplePermId(SPACE, plasmid_list)
if not permId:
permId = plasmid_list
sampleLink = elementFactory().createSampleLink(permId)
sampleLink.addAttribute(ATR_CODE, plasmid_list)
return sampleLink
"""
Example input:
FRY1, FRY2, FRY3, FRY4
"""
def showRawValueInForms():
return False
def batchColumnNames():
return [CODE_LABEL]
def updateFromRegistrationForm(bindings):
elements = []
for item in bindings:
plasmid_list = item.get('CODE')
sampleLink = _createSampleLink(plasmid_list)
elements.append(sampleLink)
property.value = propertyConverter().convertToString(elements)
def updateFromBatchInput(bindings):
elements = []
input = bindings.get('')
if input is not None:
samples = input.split(',')
for plasmid_list in samples:
sampleLink = _createSampleLink(plasmid_list.strip())
elements.append(sampleLink)
property.value = propertyConverter().convertToString(elements)
def configureUI():
"""Create table builder and add columns."""
tableBuilder = createTableBuilder()
tableBuilder.addHeader(LINK_LABEL)
tableBuilder.addHeader(CODE_LABEL)
"""The property value should contain XML with list of samples. Add a new row for every sample."""
elements = list(propertyConverter().convertToElements(property))
for plasmid in elements:
plasmid_list = plasmid.getAttribute(ATR_CODE, "")
row = tableBuilder.addRow()
row.setCell(LINK_LABEL, plasmid, plasmid_list)
row.setCell(CODE_LABEL, plasmid_list)
"""Specify that the property should be shown in a tab and set the table output."""
property.setOwnTab(True)
uiDescription = property.getUiDescription()
uiDescription.useTableOutput(tableBuilder.getTableModel())
"""
Define and add actions with input fields used to:
1. specify attributes of new yeast parent,
"""
addAction = uiDescription.addTableAction(ADD_ACTION_LABEL)\
.setDescription('Add new plasmid relationship:')
widgets = [
inputWidgetFactory().createTextInputField(CODE_LABEL)\
.setMandatory(True)\
.setValue('FRY')\
.setDescription('Code of yeast parent sample, e.g. "FRY1"')
]
addAction.addInputWidgets(widgets)
"""
2. modify attributes of a selected yeast parent,
"""
editAction = uiDescription.addTableAction(EDIT_ACTION_LABEL)\
.setDescription('Edit selected plasmid relationship:')
# Exactly 1 row needs to be selected to enable action.
editAction.setRowSelectionRequiredSingle()
widgets = [
inputWidgetFactory().createTextInputField(CODE_LABEL)\
.setMandatory(True)\
.setDescription('Code of yeast parent sample, e.g. "FRY1"')
]
editAction.addInputWidgets(widgets)
# Bind field name with column name.
editAction.addBinding(CODE_LABEL, CODE_LABEL)
"""
3. delete selected yeast parents.
"""
deleteAction = uiDescription.addTableAction(DELETE_ACTION_LABEL)\
.setDescription('Are you sure you want to delete selected yeast parent relationships?')
# Delete is enabled when at least 1 row is selected.
deleteAction.setRowSelectionRequired()
def updateFromUI(action):
"""Extract list of elements from old value of the property."""
converter = propertyConverter()
elements = list(converter.convertToElements(property))
"""Implement behaviour of user actions."""
if action.name == ADD_ACTION_LABEL:
"""
For 'add' action create new yeast parent element with values from input fields
and add it to existing elements.
"""
plasmid_list = action.getInputValue(CODE_LABEL)
sampleLink = _createSampleLink(plasmid_list)
elements.append(sampleLink)
elif action.name == EDIT_ACTION_LABEL:
"""
For 'edit' action find the yeast parent element corresponding to selected row
and replace it with an element with values from input fields.
"""
plasmid_list = action.getInputValue(CODE_LABEL)
sampleLink = _createSampleLink(plasmid_list)
selectedRowId = action.getSelectedRows()[0]
elements[selectedRowId] = sampleLink
elif action.name == DELETE_ACTION_LABEL:
"""
For 'delete' action delete yeast parents that correspond to selected rows.
NOTE: As many rows can be deleted at once it is easier to delete them in reversed order.
"""
rowIds = list(action.getSelectedRows())
rowIds.reverse()
for rowId in rowIds:
elements.pop(rowId)
else:
raise ValidationException('action not supported')
"""Update value of the managed property to XML string created from modified list of elements."""
property.value = converter.convertToString(elements)