Skip to content

Commit fe83b60

Browse files
authored
Merge pull request #313 from ODM2/Beta_2.0.1
date_format
2 parents 89e9c09 + 23c4e14 commit fe83b60

File tree

5 files changed

+195
-92
lines changed

5 files changed

+195
-92
lines changed

odmtools/controller/frmDataTable.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,14 @@ def __init__(self, parent, **kwargs):
1313
self.memDB = None
1414
DataTable.__init__(self, parent, **kwargs)
1515

16+
def init(self, memDB):
17+
self.memDB = memDB
18+
self.olvDataTable.init(self.memDB)
1619

17-
def init_publishers(self):
1820
Publisher.subscribe(self.onChangeSelection, "changeTableSelection")
1921
Publisher.subscribe(self.onRefresh, "refreshTable")
2022
Publisher.subscribe(self.olvDataTable.onDeselectAll, "deselectAllDataTable")
2123

22-
def init(self, memDB):
23-
self.memDB = memDB
24-
self.olvDataTable.init(self.memDB)
25-
self.init_publishers()
26-
2724
def onItemSelected(self, event):
2825
pass
2926

odmtools/controller/olvDataTable.py

Lines changed: 82 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ def __init__(self, parent, **kwargs):
2020
self.sortedColumnIndex = -1
2121
self.currentItem = None
2222
self.dataframe = None
23+
self.annotations = None
24+
self.annotations_grouped = {}
2325

2426
def init(self, memDB):
2527
self.memDB = memDB
@@ -28,21 +30,59 @@ def init(self, memDB):
2830
self.oddRowsBackColor = wx.Colour(191, 217, 217)
2931

3032
self.dataframe = self.memDB.getDataValuesDF()
31-
sort_by_index = list(self.dataframe.columns).index("valuedatetime")
33+
self.annotations = self.memDB.get_annotations()
34+
35+
sort_by_index = self.dataframe.columns.tolist().index("valuedatetime")
3236
self.dataframe.sort_values(self.dataframe.columns[sort_by_index], inplace=True)
33-
self.dataObjects = self.dataframe.values.tolist()
37+
38+
self.annotations_grouped = self.__group_annotations()
39+
self.dataObjects = self.__merge_dataframe_with_annotations()
40+
41+
col = self.memDB.get_columns_with_annotations()
42+
3443
columns = \
3544
[ColumnDefn(x.strip(), align="left", valueGetter=i, minimumWidth=125, width=125,
36-
stringConverter='%Y-%m-%d %H:%M:%S' if "valuedatetime" == x.lower() else '%s')
37-
for x, i in self.memDB.getEditColumns()]
45+
stringConverter='%Y-%m-%d %H:%M:%S' if "valuedatetime" == x.lower() else '%s')
46+
for x, i in col]
47+
3848
self.SetColumns(columns)
3949

4050

4151
self.SetObjectGetter(self.ObjectGetter)
42-
self.SetItemCount(len(self.dataframe))
52+
self.SetItemCount(len(self.dataObjects))
53+
54+
def __merge_dataframe_with_annotations(self):
55+
data_list = self.dataframe.values.tolist()
56+
data = data_list
57+
58+
for key, value in self.annotations_grouped.iteritems():
59+
for i in range(0, len(data_list)):
60+
if key in data[i]:
61+
data[i].append(value)
62+
break
63+
64+
return data
65+
66+
def __group_annotations(self):
67+
"""
68+
Ideally, this method should only be called once. Use self.grouped_annotations after calling this method
69+
:return:
70+
"""
71+
anno_list = self.annotations.values.tolist()
72+
73+
anno = {}
74+
for i in range(0, len(anno_list)):
75+
value_id = anno_list[i][1]
76+
annotation_code = anno_list[i][-1]
77+
if value_id in anno:
78+
anno[value_id].append(annotation_code)
79+
else:
80+
anno[value_id] = [annotation_code]
81+
82+
return anno
4383

4484
def EnableSorting(self):
45-
self.Bind(wx.EVT_LIST_COL_CLICK, self.onColSelected)
85+
self.Bind(wx.EVT_LIST_COL_CLICK, self.on_column_selected)
4686
if not self.smallImageList:
4787
self.SetImageLists()
4888
if (not self.smallImageList.HasName(ObjectListView.NAME_DOWN_IMAGE) and
@@ -56,40 +96,58 @@ def ObjectGetter(self, index):
5696
"""
5797
return self.dataObjects[index % len(self.dataObjects)]
5898

59-
def onColSelected(self, evt):
99+
def on_column_selected(self, event):
60100
"""
61101
Allows users to sort by clicking on columns
62102
"""
63-
if isinstance(self.dataframe, pd.DataFrame):
64-
if self.dataframe.empty:
65-
return
66-
else:
67-
if not self.dataframe:
68-
return
103+
if not isinstance(self.dataframe, pd.DataFrame):
104+
return
105+
106+
if self.dataframe.empty:
107+
return
69108

70-
logger.debug("Column: %s" % evt.m_col)
71-
self.sortColumn(evt.m_col)
109+
if not len(self.dataObjects):
110+
return
111+
112+
self.sortColumn(event.Column)
72113

73114
def sortColumn(self, selected_column):
115+
self.sortAscending = not self.sortAscending
116+
74117
oldSortColumnIndex = self.sortedColumnIndex
75118
self.sortedColumnIndex = selected_column
76-
ascending = self.sortAscending
77-
if ascending:
78-
self.dataframe.sort_values(self.dataframe.columns[selected_column], inplace=True)
79-
self.sortAscending = False
80-
elif not ascending:
81-
self.dataframe.sort_values(self.dataframe.columns[selected_column], ascending=False, inplace=True)
82-
self.sortAscending = True
83119

84120
self._UpdateColumnSortIndicators(selected_column, oldSortColumnIndex)
85121

86-
self.dataObjects = self.dataframe.values.tolist()
87-
if self.GetItemCount:
122+
if selected_column >= len(self.dataframe.columns):
123+
self.dataObjects = self.sort_columns_by_annotation_code(reverse=self.sortAscending)
124+
else:
125+
self.dataframe.sort_values(self.dataframe.columns[selected_column], ascending=self.sortAscending, inplace=True)
126+
self.dataObjects = self.__merge_dataframe_with_annotations()
127+
128+
if self.GetItemCount():
88129
itemFrom = self.GetTopItem()
89130
itemTo = self.GetTopItem() + 1 + self.GetCountPerPage()
90131
itemTo = min(itemTo, self.GetItemCount() - 1)
91132
self.RefreshItems(itemFrom, itemTo)
92133

134+
def sort_columns_by_annotation_code(self, reverse=False):
135+
rows_with_annotation = []
136+
rows_without_annotation = []
137+
138+
column_number_of_dataframe = len(self.dataframe.columns)
139+
140+
for i in self.dataObjects:
141+
if len(i) > column_number_of_dataframe:
142+
rows_with_annotation.append(i)
143+
else:
144+
rows_without_annotation.append(i)
145+
146+
if reverse:
147+
return rows_without_annotation + rows_with_annotation
148+
else:
149+
return rows_with_annotation + rows_without_annotation
150+
93151
def onItemSelected(self, event):
94152
"""
95153

odmtools/gui/mnuRibbon.py

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ def _init_ctrls(self, prnt):
129129

130130
# -------------------------------------------------------------------------------
131131
editPage = RB.RibbonPage(self, wx.ID_ANY, "Edit")
132+
# editPage.Bind(wx.EVT_ENTER_WINDOW, self.on_mouse_enter)
132133

133134
main_panel = RB.RibbonPanel(editPage, wx.ID_ANY, "Main", wx.NullBitmap, wx.DefaultPosition, wx.DefaultSize,
134135
RB.RIBBON_PANEL_NO_AUTO_MINIMISE)
@@ -204,14 +205,28 @@ def _init_ctrls(self, prnt):
204205
self.CurrPage = 1
205206
self.SetActivePageByIndex(self.CurrPage)
206207

207-
self.bindEvents()
208+
self.__bind_events()
208209
self.initPubSub()
209210

210211
def __init__(self, parent, id, name):
211212
self.parent = parent
212213
self._init_ctrls(parent)
213214

214-
def bindEvents(self):
215+
def on_mouse_enter(self, event):
216+
ribbon_panel = event.GetEventObject().GetParent()
217+
ribbon_panel._hovered = True
218+
219+
self.Refresh()
220+
event.Skip()
221+
222+
def on_mouse_leave(self, event):
223+
ribbon_panel = event.GetEventObject().GetParent()
224+
ribbon_panel._hovered = False
225+
226+
self.Refresh()
227+
event.Skip()
228+
229+
def __bind_events(self):
215230
###Docking Window Selection
216231
self.Bind(RB.EVT_RIBBONBUTTONBAR_CLICKED, self.onDocking, id=wxID_RIBBONVIEWTABLE)
217232
self.Bind(RB.EVT_RIBBONBUTTONBAR_CLICKED, self.onDocking, id=wxID_RIBBONVIEWSERIES)
@@ -262,6 +277,24 @@ def bindEvents(self):
262277
###Ribbon Event
263278
self.Bind(RB.EVT_RIBBONBAR_PAGE_CHANGED, self.onFileMenu, id=wxID_PANEL1)
264279

280+
# ENTER
281+
self.main_bar.Bind(wx.EVT_ENTER_WINDOW, self.on_mouse_enter) # 1
282+
self.edit_bar.Bind(wx.EVT_ENTER_WINDOW, self.on_mouse_enter) # 2
283+
self.record_bar.Bind(wx.EVT_ENTER_WINDOW, self.on_mouse_enter) # 3
284+
self.PlotsOptions_bar.Bind(wx.EVT_ENTER_WINDOW, self.on_mouse_enter) # 4
285+
self.plots_bar.Bind(wx.EVT_ENTER_WINDOW, self.on_mouse_enter) # 5
286+
self.dateTime_buttonbar.Bind(wx.EVT_ENTER_WINDOW, self.on_mouse_enter) # 6
287+
self.scriptBar.Bind(wx.EVT_ENTER_WINDOW, self.on_mouse_enter) # 7
288+
289+
# LEAVE
290+
self.main_bar.Bind(wx.EVT_LEAVE_WINDOW, self.on_mouse_leave) # 1
291+
self.edit_bar.Bind(wx.EVT_LEAVE_WINDOW, self.on_mouse_leave) # 2
292+
self.record_bar.Bind(wx.EVT_LEAVE_WINDOW, self.on_mouse_leave) # 3
293+
self.PlotsOptions_bar.Bind(wx.EVT_LEAVE_WINDOW, self.on_mouse_leave) # 4
294+
self.plots_bar.Bind(wx.EVT_LEAVE_WINDOW, self.on_mouse_leave) # 5
295+
self.dateTime_buttonbar.Bind(wx.EVT_LEAVE_WINDOW, self.on_mouse_leave) # 6
296+
self.scriptBar.Bind(wx.EVT_LEAVE_WINDOW, self.on_mouse_leave) # 7
297+
265298
def initPubSub(self):
266299
Publisher.subscribe(self.toggleEditButtons, "EnableEditButtons")
267300
Publisher.subscribe(self.enableButtons, "EnablePlotButtons")

odmtools/odmdata/memory_database.py

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ def __init__(self, taskserver=None):
2525
self.df = None
2626
# Series_Service handles remote database
2727
self.series_service = None
28+
self.results_annotations = None
2829

2930
# Memory_service handles in memory database
3031
sm = ServiceManager()
@@ -43,18 +44,14 @@ def __init__(self, taskserver=None):
4344
#self.annotation_list = pd.DataFrame() columns =['ResultID', 'ValueDateTime', 'ValueID', 'AnnotationID')
4445
#send in engine
4546

46-
4747
def reset_edit(self):
4848
sm = ServiceManager()
4949
self.mem_service = sm.get_series_service(conn_string="sqlite:///:memory:")
5050
setSchema(self.mem_service._session_factory.engine)
5151

52-
5352
def set_series_service(self, service):
5453
self.series_service = service
5554

56-
57-
5855
##############
5956
# DB Queries
6057
##############
@@ -77,6 +74,13 @@ def getDataValuesDF(self):
7774
logging.debug("done updating memory dataframe")
7875
return self.df
7976

77+
def get_annotations(self):
78+
result_id = self.df.resultid[0]
79+
setSchema(self.series_service._session_factory.engine)
80+
annotation = self.series_service.get_annotations_by_result(resultid=result_id)
81+
self.results_annotations = annotation
82+
return self.results_annotations
83+
8084
def getDataValues(self):
8185
# TODO: fix me! this commit location is only temoporarily. should be flushing so that we can restore
8286
self.mem_service._session.commit()
@@ -94,6 +98,27 @@ def getEditColumns(self):
9498
return [(x, i) for (i, x) in enumerate(columns)]
9599
# return [(x, i) for (i, x) in enumerate(self.df.columns)]
96100

101+
def get_columns_with_annotations(self):
102+
"""
103+
If results_annotations has not been set then
104+
:return:
105+
"""
106+
107+
if self.results_annotations is None or self.df is None:
108+
print "self.df and self.results_annotations must be a pandas dataframe. Currently they are None"
109+
return []
110+
111+
columns = []
112+
columns.extend(self.df.columns.tolist())
113+
114+
annotation_columns = self.results_annotations.columns.tolist()
115+
index = annotation_columns.index("annotationcode")
116+
annotation_code_column = annotation_columns[index]
117+
118+
columns.append(annotation_code_column)
119+
120+
return [(x, i) for (i, x) in enumerate(columns)]
121+
97122
def getDataValuesforGraph(self, seriesID, noDataValue, startDate=None, endDate=None):
98123
return self.series_service.get_plot_values(seriesID, noDataValue, startDate, endDate)
99124

@@ -250,7 +275,7 @@ def initEditValues(self, seriesID):
250275
logger.debug("Load series from db")
251276

252277
self.series = self.series_service.get_series(seriesID)
253-
self.df = self.series_service.get_values(series_id= seriesID)
278+
self.df = self.series_service.get_values(series_id=seriesID)
254279

255280
self.editLoaded = True
256281

0 commit comments

Comments
 (0)