def get_id(self, increment=1, use_locks=True): """ Get a new GUID. If you pass the optional increment parameter, the next GUID returned by this function will be that much higher, allowing multi- master code to request ranges of IDs in advance, or for efficiency. If GUIDs are disabled for this Factory, return None. """ if not(self.uses_guids()): return None if(use_locks): self.store.pool.runOperation('LOCK TABLES `%s` WRITE' % self.guid_table) result = self.store.pool.runQuery('SELECT `guid` FROM `%s`' % self.guid_table) if(result is None or len(result) == 0): guid = 1 self.store.pool.runOperation(sql.interp('INSERT INTO `%s` VALUES (%%s)' % self.guid_table, guid + increment)) else: guid = result[0]['guid'] self.store.pool.runOperation(sql.interp('UPDATE `%s` SET `guid` = %%s' % self.guid_table, guid + increment)) if(use_locks): result = self.store.pool.runOperation('UNLOCK TABLES') return guid
def test_multiple_perms(self): u = user.User() u.username = '******' u.first = 'Phil' u.last = 'Christensen' u.crypt = sql.RAW("ENCRYPT('phil')") self.store.save(u) r = user.Role() r.name = 'Authenticated User' self.store.save(r) self.store.pool.runOperation(sql.interp("INSERT INTO user_role (user_id, role_id) VALUES (%s, %s)", u.get_id(), r.get_id())) p = user.Permission() p.name = 'view item' self.store.save(p) self.store.pool.runOperation(sql.interp("INSERT INTO role_permission (role_id, permission_id) VALUES (%s, %s)", r.get_id(), p.get_id())) p = user.Permission() p.name = 'edit item' self.store.save(p) self.store.pool.runOperation(sql.interp("INSERT INTO role_permission (role_id, permission_id) VALUES (%s, %s)", r.get_id(), p.get_id())) self.failUnless(u.is_allowed('view item'), 'User cannot "view item"') self.failUnless(u.is_allowed('edit item'), 'User cannot "edit item"') self.failUnless(u.is_allowed(['view item', 'edit item']), 'User cannot "view item" and "edit item"')
def test_cache(self): self.store.ensure_factory('page', force=True, use_cache=True) self.failUnless(self.store._factories['page'].use_cache, "Caching wasn't turned on properly") s = storable.Storable('page') s.code = 'url-code' s.content = 'The quick brown fox jumps over the lazy dog.' s.title = 'Old School' self.store.fetch_id(s) x = self.store.load_one('page', {'id':s.get_id()}); self.failIf(x, 'Found unexpected object in DB.') self.store.save(s) t = self.store.load_one('page', {'id':s.get_id()}); self.failUnless(t, 'Cache is saving empty results.') t.title = 'a whole new title' u = self.store.load_one('page', {'id':s.get_id()}); self.failUnlessEqual(u.title, 'a whole new title', "Didn't get cached object when expected (1).") self.store.pool.runOperation(sql.interp("UPDATE page SET title = 'Old School' WHERE id = %s", s.get_id())) v = self.store.load_one('page', {'id':s.get_id()}); self.failIfEqual(v.title, 'Old School', "Didn't get cached object when expected (2).")
def get_element(self, req, style, storable): """ @see: L{modu.editable.define.definition.get_element()} """ store = storable.get_store() value = self['fvalue'] label = self['flabel'] table = self['ftable'] where = self.get('fwhere', 'WHERE %s = %%s' % q(value)) args = [getattr(storable, self.get_column_name(), None)] if(callable(where)): where = where(req, storable) args = [] if(isinstance(where, dict)): where = sql.build_where(where) args = [] foreign_label_query = "SELECT %s, %s FROM %s %s" % (q(value), q(label), q(table), where) foreign_label_query = sql.interp(foreign_label_query, *args) results = store.pool.runQuery(foreign_label_query) frm = form.FormNode(self.name) frm(type='label') if(results): frm(value=results[0][label]) return frm
def get_search_value(self, value, req, frm): """ @see: L{modu.editable.define.definition.get_search_value()} """ value = value.value if(value is ''): return None style = self.get('search_style', 'substring') if(style not in SEARCH_STYLES): raise ValueError('Invalid search style: %r' % style) if(style == 'fulltext'): return sql.RAW(sql.interp("MATCH(%%s) AGAINST (%s)", [value])) elif(style == 'exact'): return value else: return sql.RAW(sql.interp("INSTR(%%s, %s)", [value]))
def get_element(self, req, style, storable): """ @see: L{modu.editable.define.definition.get_element()} """ store = storable.get_store() label = None value = None label_col = self.get('flabel', 'title') value_col = 'id' table = getattr(storable, 'item_table', None) if not(table): table = self.get('ftable') item_value = getattr(storable, self.get_column_name(), None) if(table is None or item_value is None): results = None else: # We select * in case the particular item doesn't have a title field foreign_label_query = "SELECT * FROM %s WHERE %s = %%s" % (table, value_col) foreign_label_query = sql.interp(foreign_label_query, [item_value]) results = store.pool.runQuery(foreign_label_query) if(results): value = results[0][value_col] label = results[0].get(label_col, '(label not found)') frm = form.FormNode(self.name) suffix = '' prefix = '' if(style == 'listing'): frm(type='hidden', value=value) if(table and value): label = tags.a(href=req.get_path(req.prepath, 'detail', table, value))[label] frm(type='label', value=label) else: if not(label): label = '(no link available)' frm(type='hidden', value=value) if(table and value): prefix = tags.a(href=req.get_path(req.prepath, 'detail', table, value))[label] else: prefix = label frm(prefix=prefix, suffix=suffix) return frm
def get_element(self, req, style, storable): """ @see: L{modu.editable.define.definition.get_element()} """ mlabel = self.get('flabel', '') if(mlabel.find('.') == -1): mlabel = 'm.%s' % q(mlabel) mlabel = self.get('flabel_sql', mlabel) where = self.get('fwhere', '') if(callable(where)): where = where(req, storable) if(isinstance(where, dict)): where = sql.build_where(where) ntom_query = """SELECT m.%s AS value, %s AS label, COALESCE(n2m.%s, n2m.%s = 1, 0) AS selected FROM %s m LEFT JOIN %s n2m ON m.%s = n2m.%s AND n2m.%s = %%s %s ORDER BY label""" % (self['fvalue'], mlabel, self['ntof_f_id'], self['ntof_f_id'], q(self['ftable']), q(self['ntof']), self.get('fvalue', 'id'), self['ntof_f_id'], self['ntof_n_id'], where) store = storable.get_store() results = store.pool.runQuery(sql.interp(ntom_query, storable.get_id())) if(style == 'listing' or self.get('read_only', False)): def _default_formatter(req_ignored, style_ignored, storable_ignored, result): return ', '.join([item['label'] for item in result if item['selected']]) formatter = self.get('formatter', _default_formatter) label_value = formatter(req, style, storable, results) return form.FormNode(self.name)(type='label', value=label_value) values = [item['value'] for item in results if item['selected']] options = OrderedDict([(item['value'], item['label']) for item in results]) frm = form.FormNode(self.name) frm(type='select', multiple=True, value=values, options=options) return frm
def test_interp_args_list(self): query = sql.interp("SELECT * FROM some_table WHERE a IN %s AND b = %s", [1,2,3], 'something') expecting = "SELECT * FROM some_table WHERE a IN (1,2,3) AND b = 'something'" self.failUnlessEqual(query, expecting, 'Got "%s" when expecting "%s"' % (sql, expecting))
def test_interp_args_1(self): query = sql.interp("SELECT * FROM some_table WHERE a = %s AND b = %s", 1, 'something') expecting = "SELECT * FROM some_table WHERE a = %s AND b = %s" % (1, repr('something')) self.failUnlessEqual(query, expecting, 'Got "%s" when expecting "%s"' % (sql, expecting))
def get_element(self, req, style, storable): """ @see: L{modu.editable.define.definition.get_element()} """ mlabel = self.get('flabel', '') if(mlabel.find('.') == -1): mlabel = 'm.%s' % mlabel mlabel = self.get('flabel_sql', mlabel) where = self.get('fwhere', '') if(callable(where)): where = where(storable) elif(isinstance(where, dict)): where = sql.build_where(where) limit = 'LIMIT %d' % self.get('limit_choices', 20) ntom_query = """SELECT m.%s AS value, %s AS label FROM %s m INNER JOIN %s n2m ON m.%s = n2m.%s AND n2m.%s = %%s %s ORDER BY label %s""" % (self['fvalue'], q(mlabel), q(self['ftable']), q(self['ntof']), self.get('fvalue', 'id'), self['ntof_f_id'], self['ntof_n_id'], where, limit) store = storable.get_store() results = store.pool.runQuery(sql.interp(ntom_query, storable.get_id())) if(style == 'listing' or self.get('read_only', False)): label_value = ', '.join([result['label'] for result in results]) return form.FormNode(self.name)(type='label', value=label_value) options = dict([(str(result['value']), result['label']) for result in results]) form_name = '%s-form' % storable.get_table() ac_id = '%s-%s-autocomplete' % (form_name, self.name) select_id = '%s-foreign-select' % self.name ac_url = req.get_path(req.prepath, 'autocomplete', storable.get_table(), self.name) + '?time=' + str(time.time()) hidden_options = '' for value in options: hidden_options += tags.input(type='hidden', name='%s[%s]' % (form_name, self.name), value=value) select_frm = form.FormNode('%s-select-view' % self.name) select_frm(type='select', options=options, size=self.get('size', 5), multiple=None, suffix=hidden_options + '<br/>', attributes={'id':select_id}) prefs = 'autoFill:1, selectFirst:1, matchSubset:0, selectOnly:1, extraParams:{t:%d}, minChars:%d' % (int(time.time()), self.get('min_chars', 3)) # ac_js = '$(document).ready(function(){$("#%s").autocomplete("%s", {onItemSelect:add_foreign_item("%s", "%s"), %s});});' % (ac_id, ac_url, form_name, self.name, prefs) ac_js = """ $(document).ready(function(){ $("#%s").autocomplete("%s", {%s}); $("#%s").result(add_foreign_item("%s", "%s")); }); """ % (ac_id, ac_url, prefs, ac_id, form_name, self.name) ac_controls = tags.script(type='text/javascript')[ac_js] ac_field = form.FormNode('%s-autocomplete' % self.name) ac_field(type='textfield', weight=10, attributes={'id':ac_id}, suffix=ac_controls) req.content.report('header', tags.style(type="text/css")[ """@import '%s';""" % req.get_path('/assets/jquery/jquery.autocomplete.css')]) assets.activate_jquery(req) req.content.report('header', tags.script(type="text/javascript", src=req.get_path("/assets/jquery/jquery.autocomplete.js"))['']) req.content.report('header', tags.script(type="text/javascript", src=req.get_path("/assets/editable-autocomplete.js"))['']) frm = form.FormNode('%s-ac-fieldset' % self.name)(type='fieldset', style='brief') frm[select_frm.name] = select_frm frm[ac_field.name] = ac_field return frm
def get_element(self, req, style, storable): """ @see: L{modu.editable.define.definition.get_element()} """ form_name = '%s-form' % storable.get_table() ac_id = '%s-%s-autocomplete' % (form_name, self.name) ac_cb_id = '%s-%s-ac-callback' % (form_name, self.name) ac_url = req.get_path(req.prepath, 'autocomplete', storable.get_table(), self.name) prefs = """ autoFill:1, selectFirst:1, matchSubset:0, selectOnly:1, formatItem:formatItem, extraParams:{t:%d}, minChars:%d""" % (int(time.time()), self.get('min_chars', 3)) #ac_javascript = '$("#%s").autocomplete("%s", ' #ac_javascript += '{onItemSelect:select_item("%s"), %s});' #ac_javascript = ac_javascript % (ac_id, ac_url, ac_cb_id, prefs) ac_javascript = '$("#%s").autocomplete("%s", {%s});' % (ac_id, ac_url, prefs) ac_javascript += '$("#%s").result(select_item_handler("%s"));' % (ac_id, ac_cb_id) ac_javascript = tags.script(type='text/javascript')[ac_javascript] ac_field = form.FormNode('%s-autocomplete' % self.name) ac_field(type='textfield', weight=0, attributes={'id':ac_id}, suffix=ac_javascript) value_field = form.FormNode(self.name) value_field(type='hidden', weight=2, value=getattr(storable, self.get_column_name(), None), attributes={'id':ac_cb_id}) store = storable.get_store() value = self['fvalue'] label = self['flabel'] table = self['ftable'] if(hasattr(storable, self.get_column_name())): query = 'SELECT %s FROM %s WHERE %s = %%s' % (q(label), q(table), q(value)) field_value = getattr(storable, self.get_column_name()) if(field_value is not None): results = store.pool.runQuery(sql.interp(query, field_value)) if(results): ac_field(value=results[0][label]) else: value_field(value=0) else: value_field(value=0) if(style == 'listing' or self.get('read_only', False)): return form.FormNode(self.name)(type='label', value=ac_field.attr('value', '')) req.content.report('header', tags.style(type="text/css")[ """@import '%s';""" % req.get_path('/assets/jquery/jquery.autocomplete.css')]) req.content.report('header', tags.script(type="text/javascript")[ """ function formatItem(item, index, totalItems){ return item[0].replace('<', '<').replace('>', '>') } """ ]) assets.activate_jquery(req) req.content.report('header', tags.script(type="text/javascript", src=req.get_path("/assets/jquery/jquery.autocomplete.js"))['']) req.content.report('header', tags.script(type="text/javascript", src=req.get_path("/assets/editable-autocomplete.js"))['']) frm = form.FormNode('%s-ac-fieldset' % self.name)(type='fieldset', style='brief') frm[ac_field.name] = ac_field frm[value_field.name] = value_field return frm
def do_cleanup(self, *args): self._pool.runOperation(sql.interp("DELETE FROM session WHERE timeout < (%s - accessed)", int(time.time())))
def do_delete(self): self._pool.runOperation(sql.interp("DELETE FROM session WHERE id = %s", self.id()))