~openerp/openerp-client-rpc-com-lib/rows

« back to all changes in this revision

Viewing changes to openerprows/rows.py

  • Committer: Vo Minh Thu
  • Date: 2011-04-19 20:23:48 UTC
  • Revision ID: vmt@openerp.com-20110419202348-1a14chzvz0usswlx
criteria to domain conversion.

Show diffs side-by-side

added added

removed removed

Lines of Context:
73
73
    self.rows = rows
74
74
    self.name = name
75
75
    self.qids = ids # stands for query ids, None means all ids.
76
 
    self.crit = crit
 
76
    self.crit = crit or criteria()
77
77
 
78
78
    # for the iterator behavior
79
79
    self.show_timing = False # TODO
80
80
    self.show_debugging = False
81
81
    self.elements = None
82
 
    self.to_return = 0
 
82
    self.to_return = 0 # to implement __iter__/next
83
83
 
84
84
  def __iter__(self):
85
85
    return self
90
90
      self.force()
91
91
    if self.to_return < len(self.elements):
92
92
      self.to_return += 1
93
 
      return self.elements[self.to_return - 1]
 
93
      return self.elements[self.to_return - 1] # TODO something better than a list?
94
94
    self.to_return = 0 # TODO make it reusable (iterated multiple times)
95
95
    raise StopIteration
96
96
 
107
107
      if self.crit is None:
108
108
        print("  and no criteria")
109
109
      else:
110
 
        print("  and criteria", self.crit) # TODO actually use the crit.
 
110
        print("  and criteria", self.crit)
111
111
    # TODO warning if qids == []
112
112
 
 
113
    domain = self.crit.domain()
 
114
 
113
115
    if self.qids is None:
114
 
      ids = self.rows.execute(self.name, 'search', [])
 
116
      ids = self.rows.execute(self.name, 'search', domain)
 
117
    elif self.crit.ast is not True:
 
118
      ids = self.rows.execute(self.name, 'search',
 
119
        ['&'] + domain + [('id', 'in', tuple(self.qids))])
115
120
    else:
116
121
      ids = self.qids
117
 
    self.elements = [adict(self.name, x) for x in self.rows.execute(self.name, 'read', ids, [])]
 
122
    self.elements = [adict(self.name, x) for x in
 
123
      self.rows.execute(self.name, 'read', ids, [])]
118
124
 
119
125
    if self.show_debugging:
120
126
      print("  results in", len(self.elements), "elements.")
136
142
      raise rows_exception
137
143
 
138
144
  # TODO overload using int() and string
 
145
  # TODO indicing should be like indicing a list?
139
146
  def __getitem__(self, id):
140
147
    return adict(self.name,
141
148
      self.rows.execute(self.name, 'read', [id], [])[0]) # TODO make a read or a write/update depending on the next (if any) operation.
147
154
    return self.rows.execute(self.name, 'search', []) # TODO return a iterator that performs the query only when iterated.
148
155
 
149
156
  def where(self, crit):
150
 
    new_crit = crit
151
 
    if self.crit is not None:
152
 
      new_crit = self.crit & crit
153
 
    return rows_model(self.rows, self.name, self.qids, new_crit)
 
157
    return rows_model(self.rows, self.name, self.qids, self.crit & crit)
154
158
 
155
159
# TODO error cases/messages
156
160
class adict(object):