PageRenderTime 21ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/ svn-cassiopeia --username yuuma.tomita@gmail.com/cas_helper/xldb/sheet_model/table.py

http://svn-cassiopeia.googlecode.com/
Python | 181 lines | 176 code | 1 blank | 4 comment | 0 complexity | 35611d6996af0385a825ff19c5d9e743 MD5 | raw file
  1. #!/usr/bin/env python
  2. #coding:utf8
  3. import os
  4. from collections import namedtuple
  5. #_make(iterable), _asdict(), _replace(kwargs), _fields http://www.python.jp/doc/nightly/library/collections.html
  6. """
  7. EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')
  8. for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))):
  9. print emp.name, emp.title
  10. """
  11. import tempfile, os, json, codecs, copy
  12. class Table(list):
  13. def __init__(self, rawItems=None):
  14. self.extend(ItemFactory.constract(rawItems))
  15. self.roots = [item for item in self if not item.parent]
  16. @property
  17. def max_depth(self):
  18. return max([item.depth for item in self.flatitems])
  19. def dump(self):
  20. for item in self:
  21. print unicode(item)
  22. def json_dump(self):
  23. pass
  24. @staticmethod
  25. def load_source_from_sheet(connector):
  26. return ItemFactory.load_source_from_sheet(connector)
  27. class Priority(list):
  28. def __init__(self, rawItems=None):
  29. self.extend(rawItems)
  30. @staticmethod
  31. def load_source_from_sheet(connector):
  32. return TableItemPriority.load_source_from_sheet(connector)
  33. class TableItem(object):
  34. def __init__(self, value, depth=0, order=0, parent=None, **k):
  35. self.value = value
  36. self.order = order
  37. self.parent = parent
  38. self.children = []
  39. self.depth = depth
  40. @property
  41. def parent(self):
  42. return self.__parent
  43. @parent.setter
  44. def parent(self, parent):
  45. self.__parent = parent
  46. if parent:
  47. parent.children.append(self)
  48. return parent
  49. @property
  50. def item_id(self):
  51. item = self
  52. make_id_from = lambda item: u'({0}){1}'.format(str(item.order).zfill(2), item.value)
  53. res = [make_id_from(item)]
  54. while item.parent:
  55. item = item.parent
  56. res.append(make_id_from(item))
  57. return ', '.join(reversed(res))
  58. #unicode?repr?????????
  59. def __repr__(self):
  60. return u'<MenuItem:o={0}, d={1}, vlen={2}>'.format(str(self.order).zfill(2), self.depth, len(self.value))
  61. def __unicode__(self):
  62. return u'<(o={0}, d={1}, v={2} ({3})>'.format(str(self.order).zfill(2), self.depth, self.value, self.item_id)
  63. class TableItemFactory(object):
  64. RawItem = namedtuple('RawItem', 'value col_order row_order')
  65. @staticmethod
  66. def constract(rawItems):
  67. resItems = []
  68. parentItem = None
  69. check_depth = 0
  70. for item in rawItems:
  71. while item.depth != check_depth: #???? item.depth == check_depth????parentItem?????
  72. if item.depth != 0:
  73. parentItem = parentItem.parent
  74. check_depth = parentItem.depth + 1
  75. else:
  76. parentItem = None
  77. break
  78. currentItem = MenuItem(item.value, item.depth, item.order, parentItem)
  79. resItems.append(currentItem)
  80. #???? #???item???item????????
  81. parentItem = currentItem
  82. check_depth = parentItem.depth + 1
  83. return resItems
  84. @classmethod
  85. def getRawItemsFrom(cls, raw_source, separator='.'):
  86. res = []
  87. order = 0
  88. for line in raw_source.splitlines():
  89. if line:
  90. value = line.replace(separator, '')
  91. depth_counter = 0
  92. while line.startswith(separator):
  93. depth_counter += 1
  94. line = line[1:]
  95. res.append(cls.RawItem(value, depth_counter, order))
  96. order += 1
  97. return res
  98. @classmethod
  99. def load_source_from_sheet(cls, connector): #????????????Sheet???????.pattern????
  100. raw_data = connector.get_raw_data(u'????????', 'C3') #??????connector????????????
  101. _e = lambda start, end: enumerate(range(end - start), start) #(5, 0),(6, 1),,/(row, row_order)
  102. RawItem = cls.RawItem
  103. rawItems = []
  104. for row, row_order in _e(connector.start_row, connector.end_row):
  105. for col, col_order in _e(connector.start_col, connector.end_col):
  106. val = connector.sheet.cell(row, col).value
  107. if val:
  108. print u'val:{0}, col_order:{1} , row_order:{2}'.format(val, col_order, row_order)
  109. rawItems.append(RawItem(val, col_order, row_order))
  110. return rawItems
  111. class TableItemPriority(TableItemFactory):
  112. RawItem = namedtuple('RawItem', 'priority emargence importance')
  113. @classmethod
  114. def load_source_from_sheet(cls, connector): #????????????Sheet???????.pattern????
  115. raw_data = connector.get_raw_data(u'????????', 'C3') #??????connector????????????
  116. _e = lambda start, end: enumerate(range(end - start), start) #(5, 0),(6, 1),,/(row, row_order)
  117. RawItem = cls.RawItem
  118. rawItems = []
  119. for row, row_order in _e(connector.start_row, connector.end_row):
  120. for col, col_order in _e(connector.start_col, connector.end_col):
  121. val = connector.sheet.cell(row, col).value
  122. if val:
  123. print u'val:{0}, col_order:{1} , row_order:{2}'.format(val, col_order+1, row_order+1)
  124. rawItems.append(RawItem(val, col_order+1, row_order+1))
  125. return rawItems
  126. ur""" test section
  127. #base row data
  128. import xldb.sheetutils
  129. reload(xldb.sheetutils)
  130. Connector = xldb.sheetutils.Connector
  131. _dir = ur'D:\Orant\dev\cas\????????????\????????????\kin_re\helpdesk\setting_docs'
  132. _file = ur'priority_matrix.xls'
  133. connector = Connector(_dir, _file)
  134. connector.get_raw_data(u'????????', 'C3')
  135. import xldb.sheet_model.table
  136. reload(xldb.sheet_model.table)
  137. TableItemFactory = xldb.sheet_model.table.TableItemFactory
  138. TableItemFactory.load_source_from_sheet(connector)
  139. TableItemPriority = xldb.sheet_model.table.TableItemPriority
  140. TableItemPriority.load_source_from_sheet(connector)
  141. MultiMenu = xldb.multi_menu.MultiMenu
  142. ItemFactory = xldb.multi_menu.ItemFactory
  143. menu = MultiMenu(ItemFactory.getRawItemsFrom(source))
  144. menu
  145. menu.items['a'].children
  146. menu.items['b'].parent
  147. menu.items['b'].item_id
  148. for item in menu: print unicode(item)
  149. import xldb.sheetutils
  150. reload(xldb.sheetutils)
  151. Connector = xldb.sheetutils.Connector
  152. _dir = ur'D:\Orant\dev\cas\????????????\????????????\kin_re\helpdesk\setting_docs'
  153. _file = ur'priority_matrix.xls'
  154. dataset = Connector(_dir, _file).get_source(u'????????', 'C3', pattern='Priority')
  155. """