def edit(self, mediaid, **kwargs): """Display a EDIT form.""" tmpl_context.form = f_edit lang = tmpl_context.lang media = DBSession.query(Media).get(mediaid.decode()) tags = ', '.join([t.name[lang] for t in media.tags]) fargs = dict( mediaid=media.id, id_=media.id, mediatype_=media.type, uri=media.uri, languageid=media.language_id, version=media.version, modified=media.data[0].modified, name=media.name[''], description=media.description[''], tagids=tags, ) languages = [(l.id, l.name) for l in DBSession.query(Language)] data = media.data[0] DataHistory = data.__history_mapper__.class_ query = DBSession.query(DataHistory).filter_by(id=data.id) versions = range(query.count(), 0, -1) versions.insert(0, int(data.version)) fcargs = dict( languageid=dict(options=languages), version=dict(options=versions), ) return dict(title='%s %s' % (_('Edit media:'), media.id), args=fargs, child_args=fcargs)
def settings(self): """Return a form to edit settings""" tmpl_context.f_settings = f_settings lang = tmpl_context.lang query = DBSession.query(Setting) settings = dict([('v_%s' % s.id, s.value) for s in query]) fargs = settings querymedia = DBSession.query(Media).filter_by(type=u'image') media_list = [('', '')] media_list.extend([(m.id, m.name[lang]) for m in querymedia]) link_list = [('', '')] link_list.extend([(l.id, l.name[lang]) for l in DBSession.query(Link)]) cc_list = [ ('', ''), ('cc by', 'CC Attribution'), ('cc by-sa', 'CC Attribution Share Alike'), ('cc by-nd', 'CC Attribution No Derivatives'), ('cc by-nc', 'CC Attribution Non-Commercial'), ('cc by-nc-sa', 'CC Attribution Non-Commercial Share Alike'), ('cc by-nc-nd', 'CC Attribution Non-Commercial No Derivatives'), ] fcargs = dict(v_logo_media=dict(options=media_list), v_banner_media=dict(options=media_list), v_banner_link=dict(options=link_list), v_theme = dict(options=G.themes), v_cc = dict(options=cc_list), ) return dict(args=fargs, child_args=fcargs, path=('admin', 'settings'))
def edit(self, linkid, **kwargs): """Display a EDIT form.""" tmpl_context.form = f_edit lang = tmpl_context.lang link = DBSession.query(Link).get(linkid.decode()) tags = ', '.join([t.name[lang] for t in link.tags]) fargs = dict(linkid=link.id, id_=link.id, uri=link.uri, languageid=link.language_id, version=link.version, modified=link.data[0].modified, name=link.name[''], description=link.description[''], tagids=tags, ) languages = [(l.id, l.name) for l in DBSession.query(Language)] data = link.data[0] DataHistory = data.__history_mapper__.class_ query = DBSession.query(DataHistory).filter_by(id=data.id) versions = range(query.count(), 0, -1) versions.insert(0, int(data.version)) fcargs = dict( languageid=dict(options=languages), version=dict(options=versions), ) return dict(title='%s %s' % (_('Edit link:'), link.id), args=fargs, child_args=fcargs)
def get_all(self, tag=[], max_results=None, mode='all'): """Return a list of media""" settings = dict([(s.id, s.value) for s in DBSession.query(Setting)]) if max_results is None: max_results = int(settings.get('max_results', 0)) else: max_results = int(max_results) tmpl_context.w_object_title = w_object_title tmpl_context.w_media = w_media query = DBSession.query(Media) query = query.join(Media.associable).filter_by(published=True) query = query.order_by(desc(Media.created)) tot_results = query.count() if max_results: media = query[0:max_results] more_results = max(tot_results - max_results, 0) else: media = query.all() more_results = False if tag: tagids = isinstance(tag, list) and tag or [tag] tagstring = ', '.join(tagids) tags = set(tags_from_string(tagstring, create=False)) if mode == 'all': media = [obj for obj in media if set(obj.tags) >= (tags)] elif mode == 'any': media = [obj for obj in media if set(obj.tags) & (tags)] return dict(media=media, recent=find_recent(), path=('media', ''), more_results=more_results)
def get_all(self, tag=[], max_results=None, mode='all'): """Return a list of links""" settings = dict([(s.id, s.value) for s in DBSession.query(Setting)]) if max_results is None: max_results = int(settings.get('max_results', 0)) else: max_results = int(max_results) tmpl_context.w_object_title = w_object_title tmpl_context.w_link = w_link query = DBSession.query(Link) query = query.join(Link.associable).filter_by(published=True) query = query.order_by(desc(Link.created)) tot_results = query.count() if max_results: links = query[0:max_results] more_results = max(tot_results - max_results, 0) else: links = query.all() more_results = False if tag: tagids = isinstance(tag, list) and tag or [tag] tagstring = ', '.join(tagids) tags = set(tags_from_string(tagstring, create=False)) if mode == 'all': links = [obj for obj in links if set(obj.tags) >= (tags)] elif mode == 'any': links = [obj for obj in links if set(obj.tags) & (tags)] return dict(links=links, recent=find_recent(), path=('links', ''), more_results=more_results)
def put(self, linkid, name, uri, languageid, description=None, tagids=None, version=None, modified=None): """Edit a link""" lang = tmpl_context.lang or DBSession.query(Language).first().id link = DBSession.query(Link).get(linkid.decode()) modified = False if link.uri != uri: link.uri = uri modified = True if link.name[languageid] != name: link.name[languageid] = name modified = True if link.description[languageid] != description: link.description[languageid] = description modified = True tags = tags_from_string(tagids, lang=lang) if link.tags != tags: link.tags[:] = tags modified = True if modified: link.data[languageid].modified = datetime.datetime.now() flash('%s %s' % (_('Updated Link:'), link.id), 'ok') else: flash('%s %s' % (_('Link is unchanged:'), link.id), 'info') return dict(redirect_to=url('/admin/link/'))
def edit(self, articleid, pagestringid, **kwargs): """Display a EDIT form.""" tmpl_context.form = f_edit article = DBSession.query(Article).get(articleid.decode()) page = article.pages[pagestringid] fargs = dict( pageid=page.id, id_=page.id, languageid=page.language_id, version=page.version, modified=page.data[0].modified, name=page.name[''], text=page.text[''], ) languages = [(l.id, l.name) for l in DBSession.query(Language)] data = page.data[0] DataHistory = data.__history_mapper__.class_ query = DBSession.query(DataHistory).filter_by(id=data.id) versions = range(query.count(), 0, -1) versions.insert(0, int(data.version)) fcargs = dict( languageid=dict(options=languages), version=dict(options=versions), ) return dict(title='%s %s' % (_('Edit page:'), page.string_id), args=fargs, child_args=fcargs)
def settings(self): """Return a form to edit settings""" tmpl_context.f_settings = f_settings lang = tmpl_context.lang query = DBSession.query(Setting) settings = dict([('v_%s' % s.id, s.value) for s in query]) fargs = settings querymedia = DBSession.query(Media).filter_by(type=u'image') media_list = [('', '')] media_list.extend([(m.id, m.name[lang]) for m in querymedia]) link_list = [('', '')] link_list.extend([(l.id, l.name[lang]) for l in DBSession.query(Link)]) cc_list = [ ('', ''), ('cc by', 'CC Attribution'), ('cc by-sa', 'CC Attribution Share Alike'), ('cc by-nd', 'CC Attribution No Derivatives'), ('cc by-nc', 'CC Attribution Non-Commercial'), ('cc by-nc-sa', 'CC Attribution Non-Commercial Share Alike'), ('cc by-nc-nd', 'CC Attribution Non-Commercial No Derivatives'), ] fcargs = dict( v_logo_media=dict(options=media_list), v_banner_media=dict(options=media_list), v_banner_link=dict(options=link_list), v_theme=dict(options=G.themes), v_cc=dict(options=cc_list), ) return dict(args=fargs, child_args=fcargs, path=('admin', 'settings'))
def put(self, pageid, name, languageid, text=None, version=None, modified=None): """Edit a page""" lang = tmpl_context.lang or DBSession.query(Language).first().id page = DBSession.query(Page).get(pageid) modified = False if page.name[languageid] != name: page.name[languageid] = name modified = True if page.text[languageid] != text: page.text[languageid] = text modified = True if modified: page.data[languageid].modified = datetime.datetime.now() flash('%s %s' % (_('Updated Page:'), page.string_id), 'ok') else: flash('%s %s' % (_('Page is unchanged:'), page.string_id), 'info') return dict(redirect_to=url('/article/%s/edit' % page.article.id))
def edit(self, articleid, pagestringid, **kwargs): """Display a EDIT form.""" tmpl_context.form = f_edit article = DBSession.query(Article).get(articleid.decode()) page = article.pages[pagestringid] fargs = dict(pageid=page.id, id_=page.id, languageid=page.language_id, version=page.version, modified=page.data[0].modified, name=page.name[''], text=page.text[''], ) languages = [(l.id, l.name) for l in DBSession.query(Language)] data = page.data[0] DataHistory = data.__history_mapper__.class_ query = DBSession.query(DataHistory).filter_by(id=data.id) versions = range(query.count(), 0, -1) versions.insert(0, int(data.version)) fcargs = dict( languageid=dict(options=languages), version=dict(options=versions), ) return dict(title='%s %s' % (_('Edit page:'), page.string_id), args=fargs, child_args=fcargs)
def new(self, articleid, **kwargs): """Display a NEW form.""" tmpl_context.form = f_new article = DBSession.query(Article).get(articleid.decode()) fargs = dict(articleid=article.id) lang_list = [(l.id, l.name) for l in DBSession.query(Language)] fcargs = dict(languageid=dict(options=lang_list)) return dict(title=_('Create a new Page'), args=fargs, child_args=fcargs)
def new(self, articleid, **kwargs): """Display a NEW form.""" tmpl_context.form = f_new article = DBSession.query(Article).get(articleid.decode()) fargs = dict(articleid=article.id) lang_list = [(l.id, l.name) for l in DBSession.query(Language)] fcargs = dict(languageid=dict(options=lang_list)) return dict(title=_('Create a new Page'), args=fargs, child_args=fcargs)
def edit(self, tagid, **kwargs): """Display a EDIT form.""" tmpl_context.form = f_edit tag = DBSession.query(Tag).get(tagid.decode()) fargs = dict(tagid=tag.id, id_=tag.id, languageid=tag.language_id, name=tag.name[''], ) languages = [(l.id, l.name) for l in DBSession.query(Language)] fcargs = dict(languageid=dict(options=languages)) return dict(title='%s %s' % (_('Edit tag:'), tag.id), args=fargs, child_args=fcargs)
def post(self, title, categoryid, languageid, text=None, tagids=None): """create a new Article""" user = tmpl_context.user lang = tmpl_context.lang or DBSession.query(Language).first().id category = DBSession.query(Category).get(categoryid) article = Article(title, category, languageid, user, text) DBSession.add(article) tags = tags_from_string(tagids, lang=lang) article.tags[:] = tags flash('%s %s' % (_('Created Article:'), article.id), 'ok') return dict(redirect_to=url('/admin/article/'))
def new(self, **kwargs): """Display a NEW form.""" tmpl_context.form = f_new lang = tmpl_context.lang fargs = dict() cat_list = [(c.id, c.name[lang]) for c in DBSession.query(Category)] lang_list = [(l.id, l.name) for l in DBSession.query(Language)] fcargs = dict(categoryid=dict(options=cat_list), languageid=dict(options=lang_list)) return dict(title=_('Create a new Article'), args=fargs, child_args=fcargs)
def edit(self, categoryid, **kwargs): """Display a EDIT form.""" tmpl_context.form = f_edit lang = tmpl_context.lang category = DBSession.query(Category).get(categoryid.decode()) fargs = dict(categoryid=category.id, id_=category.id, languageid=category.language_id, name=category.name[lang], description=category.description[lang]) languages = [(l.id, l.name) for l in DBSession.query(Language)] fcargs = dict(languageid=dict(options=languages)) return dict(title='%s %s' % (_('Edit Category:'), category.id), args=fargs, child_args=fcargs)
def get_page(pageid): """Return a page given its id or its article/string_id path""" try: if isinstance(pageid, int) or pageid.isdigit(): page = DBSession.query(Page).get(pageid) elif '/' in pageid: articleid, pageid = pageid.split('/') query = DBSession.query(Page) query = query.filter_by(string_id=pageid, article_id=articleid) page = query.one() else: page = None except NoResultFound, MultipleResultsFound: page = None
def get_page(pageid): """Return a page given its id or its article/string_id path""" try: if isinstance(pageid, int) or pageid.isdigit(): page = DBSession.query(Page).get(pageid) elif '/' in pageid: articleid, pageid = pageid.split('/') query = DBSession.query(Page) query = query.filter_by(string_id=pageid, article_id=articleid) page = query.one() else: page = None except NoResultFound, MultipleResultsFound: page = None
def edit(self, categoryid, **kwargs): """Display a EDIT form.""" tmpl_context.form = f_edit lang = tmpl_context.lang category = DBSession.query(Category).get(categoryid.decode()) fargs = dict(categoryid=category.id, id_=category.id, languageid=category.language_id, name=category.name[lang], description=category.description[lang]) languages = [(l.id, l.name) for l in DBSession.query(Language)] fcargs = dict(languageid=dict(options=languages)) return dict(title='%s %s' % (_('Edit Category:'), category.id), args=fargs, child_args=fcargs)
def _fill_db(self): tadm = DBSession.query(User).filter_by(user_name=u'test_admin').one() language = Language(u'xx', u'test language') DBSession.add(language) DBSession.flush() languageid = language.id return languageid, tadm
def post_delete(self, commentid): """Delete a Comment""" comment = DBSession.query(Comment).get(commentid) DBSession.delete(comment) flash('%s %s' % (_('Deleted Comment:'), comment.id), 'ok') return dict(redirect_to=url('/admin/comment/'))
def approve(self, commentid): """Approve a comment and make it visible""" comment = DBSession.query(Comment).get(commentid) comment.status = 'approved' flash('%s %s' % (_('Approved Comment:'), comment.id), 'ok') redirect(url('/admin/comment'))
def translation(self, tagid, value): """Return a tag translation""" tag = DBSession.query(Tag).get(tagid.decode()) name = tag.name[value] return dict(name=name)
def revoke(self, commentid): """Revoke comment approval and make it invisible""" comment = DBSession.query(Comment).get(commentid) comment.status = 'waiting' flash('%s %s' % (_('Revoked approval for Comment:'), comment.id), 'ok') redirect(url('/admin/comment'))
def spam(self, commentid): """Mark a comment as spam""" comment = DBSession.query(Comment).get(commentid) comment.status = 'spam' flash('%s %s' % (_('Comment marked as spam:'), comment.id), 'ok') redirect(url('/admin/comment'))
def post(self, associableid, name, email, text, came_from='/'): """create a new Comment""" associable = DBSession.query(Associable).get(associableid) comment = Comment(name, email, text) associable.comments.append(comment) flash('%s %s' % (_('Created Comment:'), comment.header), 'ok') return dict(redirect_to=url(came_from))
def test_post_delete(self): """controllers.link.Controller.post_delete is working properly""" languageid, linkid = self._fill_db() environ = {'REMOTE_USER': '******'} response = self.app.delete('/link?linkid=%s' % linkid, extra_environ=environ, status=200) assert_true('parent.location = "/admin/link/";' in response.body, 'should be redirected to "/admin/link/" via javascript') link = DBSession.query(Link).get(linkid.decode()) assert_true(link is None, 'Link "1" should have been deleted from the db') linkdata = DBSession.query(LinkData).filter_by(parent_id=None).all() assert_false(linkdata, 'orphaned LinkData should have been deleted from the db')
def test_banner_set(self): """controllers.admin.Controller.banner_set is working properly""" languageid, tadm = self._fill_db() media = Media(u'image', u'test image', u'/test.png', tadm, u'xx', u'random text') DBSession.add(media) link = Link(u'test link', u'http://example.com', tadm, u'xx', u'random text') DBSession.add(link) DBSession.flush() mediaid = media.id linkid = link.id transaction.commit() environ = {'REMOTE_USER': '******'} response = self.app.post('/admin/banner_set', dict(mediaid=mediaid, linkid=linkid, ), extra_environ=environ, status=302) #redirected = response.follow(extra_environ=environ, status=200) bc = DBSession.query(BannerContent).first() eq_(bc.media_id, mediaid) eq_(bc.link_id, linkid)
def test_post_delete(self): """controllers.tag.Controller.post_delete is working properly""" languageid, tagid = self._fill_db() environ = {'REMOTE_USER': '******'} response = self.app.delete('/tag?tagid=%s' % tagid, extra_environ=environ, status=200) assert_true('parent.location = "/admin/tag/";' in response.body, 'should be redirected to "/admin/tag/" via javascript') tag = DBSession.query(Tag).get(tagid.decode()) assert_true(tag is None, 'Tag should have been deleted from the db') tagdata = DBSession.query(TagData).filter_by(parent_id=None).all() assert_false(tagdata, 'orphaned TagData should have been deleted from the db')
def revoke(self, commentid): """Revoke comment approval and make it invisible""" comment = DBSession.query(Comment).get(commentid) comment.status = 'waiting' flash('%s %s' % (_('Revoked approval for Comment:'), comment.id), 'ok') redirect(url('/admin/comment'))
def post_delete(self, languageid): """Delete a Language""" language = DBSession.query(Language).get(languageid.decode()) DBSession.delete(language) flash('%s %s' % (_('Deleted Language:'), language.id), 'ok') return dict(redirect_to=url('/admin/language/'))
def spam(self, commentid): """Mark a comment as spam""" comment = DBSession.query(Comment).get(commentid) comment.status = 'spam' flash('%s %s' % (_('Comment marked as spam:'), comment.id), 'ok') redirect(url('/admin/comment'))
def post_delete(self, commentid): """Delete a Comment""" comment = DBSession.query(Comment).get(commentid) DBSession.delete(comment) flash('%s %s' % (_('Deleted Comment:'), comment.id), 'ok') return dict(redirect_to=url('/admin/comment/'))
def approve(self, commentid): """Approve a comment and make it visible""" comment = DBSession.query(Comment).get(commentid) comment.status = 'approved' flash('%s %s' % (_('Approved Comment:'), comment.id), 'ok') redirect(url('/admin/comment'))
def post_delete(self, languageid): """Delete a Language""" language = DBSession.query(Language).get(languageid.decode()) DBSession.delete(language) flash('%s %s' % (_('Deleted Language:'), language.id), 'ok') return dict(redirect_to=url('/admin/language/'))
def test_post_delete(self): """controllers.tag.Controller.post_delete is working properly""" languageid, tagid = self._fill_db() environ = {'REMOTE_USER': '******'} response = self.app.delete('/tag?tagid=%s' % tagid, extra_environ=environ, status=200) assert_true('parent.location = "/admin/tag/";' in response.body, 'should be redirected to "/admin/tag/" via javascript') tag = DBSession.query(Tag).get(tagid.decode()) assert_true(tag is None, 'Tag should have been deleted from the db') tagdata = DBSession.query(TagData).filter_by(parent_id=None).all() assert_false(tagdata, 'orphaned TagData should have been deleted from the db')
def post(self, associableid, name, email, text, came_from='/'): """create a new Comment""" associable = DBSession.query(Associable).get(associableid) comment = Comment(name, email, text) associable.comments.append(comment) flash('%s %s' % (_('Created Comment:'), comment.header), 'ok') return dict(redirect_to=url(came_from))
def tags_from_string(s, create=True, lang=None): if lang is None: lang = DBSession.query(Language).first().id alltags = dict([(t.id, t) for t in DBSession.query(Tag)]) alltagsdata = dict([(d.name, d) for d in DBSession.query(TagData)]) tagnames = s and s.split(', ') or [] tags = [] for tagname in tagnames: if tagname in alltags: tag = alltags[tagname] elif tagname in alltagsdata: tag = alltagsdata[tagname].parent elif create: tag = Tag(tagname, lang) DBSession.add(tag) tags.append(tag) return tags
def unspam(self, commentid): """Remove the spam mark from a comment""" comment = DBSession.query(Comment).get(commentid) comment.status = 'waiting' flash('%s %s' % (_('Removed spam mark from Comment:'), comment.id), 'ok') redirect(url('/admin/comment'))
def edit(self, articleid, **kwargs): """Return a page to edit an article and all its pages""" tmpl_context.f_edit = f_edit lang = tmpl_context.lang article = DBSession.query(Article).get(articleid.decode()) tags = ', '.join([t.name[lang] for t in article.tags]) fargs = dict(articleid=article.id, id_=article.id, title_=article.title[''], categoryid=article.category_id, tagids=tags, ) categories = [(c.id, c.name[lang]) for c in DBSession.query(Category)] fcargs = dict(categoryid=dict(options=categories), ) return dict(article=article, page=('admin', None), args=fargs, child_args=fcargs)
def translation(self, categoryid, value): """Return a category translation""" category = DBSession.query(Category).get(categoryid.decode()) name = category.name[value] description = category.description[value] return dict(name=name, description=description)
def test_post_delete(self): """controllers.category.Controller.post_delete is working properly""" languageid, categoryid = self._fill_db() environ = {'REMOTE_USER': '******'} response = self.app.delete('/category?categoryid=%s' % categoryid, extra_environ=environ, status=200) assert_true('parent.location = "/admin/category/";' in response.body, 'should be redirected to "/admin/category/" via javascript') cat = DBSession.query(Category).get(categoryid.decode()) assert_true(cat is None, 'Category should have been deleted from the db') query = DBSession.query(CategoryData) categorydata = query.filter_by(parent_id=None).all() assert_false(categorydata, 'orphaned CategoryData should have been deleted from the db')
def translation(self, articleid, value): """Return a article translation""" article = DBSession.query(Article).get(articleid.decode()) title = article.title[value] text = article.text[value] return dict(title=title, text=text)
def tags_from_string(s, create=True, lang=None): if lang is None: lang = DBSession.query(Language).first().id alltags = dict([(t.id, t) for t in DBSession.query(Tag)]) alltagsdata = dict([(d.name, d) for d in DBSession.query(TagData)]) tagnames = s and s.split(', ') or [] tags = [] for tagname in tagnames: if tagname in alltags: tag = alltags[tagname] elif tagname in alltagsdata: tag = alltagsdata[tagname].parent elif create: tag = Tag(tagname, lang) DBSession.add(tag) tags.append(tag) return tags
def unspam(self, commentid): """Remove the spam mark from a comment""" comment = DBSession.query(Comment).get(commentid) comment.status = 'waiting' flash('%s %s' % (_('Removed spam mark from Comment:'), comment.id), 'ok') redirect(url('/admin/comment'))
def translation(self, categoryid, value): """Return a category translation""" category = DBSession.query(Category).get(categoryid.decode()) name = category.name[value] description = category.description[value] return dict(name=name, description=description)
def test_post_delete(self): """controllers.link.Controller.post_delete is working properly""" languageid, linkid = self._fill_db() environ = {'REMOTE_USER': '******'} response = self.app.delete('/link?linkid=%s' % linkid, extra_environ=environ, status=200) assert_true('parent.location = "/admin/link/";' in response.body, 'should be redirected to "/admin/link/" via javascript') link = DBSession.query(Link).get(linkid.decode()) assert_true(link is None, 'Link "1" should have been deleted from the db') linkdata = DBSession.query(LinkData).filter_by(parent_id=None).all() assert_false(linkdata, 'orphaned LinkData should have been deleted from the db')
def post_delete(self, tagid): """Delete a Tag""" tag = DBSession.query(Tag).get(tagid.decode()) for tagdata in tag.data: DBSession.delete(tagdata) DBSession.delete(tag) flash('%s %s' % (_('Deleted Tag:'), tag.id), 'ok') return dict(redirect_to=url('/admin/tag/'))
def new(self, **kwargs): """Display a NEW form.""" tmpl_context.form = f_new fargs = dict() lang_list = [(l.id, l.name) for l in DBSession.query(Language).all()] fcargs = dict(languageid=dict(options=lang_list)) return dict(title=_('Create a new Category'), args=fargs, child_args=fcargs)
def new(self, **kwargs): """Display a NEW form.""" tmpl_context.form = f_new fargs = dict() lang_list = [(l.id, l.name) for l in DBSession.query(Language).all()] fcargs = dict(languageid=dict(options=lang_list)) return dict(title=_('Create a new Tag'), args=fargs, child_args=fcargs)
def edit(self, languageid, **kwargs): """Display a EDIT form.""" tmpl_context.form = f_edit language = DBSession.query(Language).get(languageid.decode()) fargs = dict(languageid=language.id, id_=language.id, name=language.name) fcargs = dict() return dict(title='%s %s' % (_('Edit Language:'), language.id), args=fargs, child_args=fcargs)
def post_delete(self, categoryid): """Delete a Category""" category = DBSession.query(Category).get(categoryid.decode()) for categorydata in category.data: DBSession.delete(categorydata) DBSession.delete(category) flash('%s %s' % (_('Deleted Category:'), category.id), 'ok') return dict(redirect_to=url('/admin/category/'))