Beispiel #1
0
	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
Beispiel #2
0
	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"')
Beispiel #3
0
	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).")
Beispiel #4
0
	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
Beispiel #5
0
	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]))
Beispiel #6
0
	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
Beispiel #7
0
	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
Beispiel #8
0
	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))
Beispiel #9
0
	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))
Beispiel #10
0
	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
Beispiel #11
0
	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('<', '&lt;').replace('>', '&gt;')
			}
			"""
		])
		
		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
Beispiel #12
0
	def do_cleanup(self, *args):
		self._pool.runOperation(sql.interp("DELETE FROM session WHERE timeout < (%s - accessed)", int(time.time())))
Beispiel #13
0
	def do_delete(self):
		self._pool.runOperation(sql.interp("DELETE FROM session WHERE id = %s", self.id()))