def configure(self, request): form = FeedImportForm() if request.method == 'POST' and form.validate(request.form): feed = request.files.get('feed') if form.data['download_url']: if not form.data['download_url'].endswith('.tpxa'): error = _(u"Don't pass a real feed URL, it should be a " u"regular URL where you're serving the file " u"generated with the textpress_exporter.py script") flash(error, 'error') return self.render_admin_page('import_textpress.html', form=form.as_widget(), bugs_link=BUGS_LINK) try: feed = urllib.urlopen(form.data['download_url']) except Exception, e: error = _(u'Error downloading from URL: %s') % e flash(error, 'error') return self.render_admin_page('import_textpress.html', form=form.as_widget(), bugs_link=BUGS_LINK) elif not feed: return redirect_to('import/feed') try: blog = parse_feed(feed) except Exception, e: log.exception(_(u'Error parsing uploaded file')) print repr(e) flash(_(u'Error parsing feed: %s') % e, 'error')
def show_config(req): """Request handler that provides an admin page with the configuration for the pygments plugin. So far this only allows changing the style. """ active_style = get_current_style() styles = sorted([(x, x.title()) for x in STYLES]) form = ConfigurationForm(initial=dict(style=active_style)) form.fields['style'].choices = styles if req.method == 'POST' and form.validate(req.form): active_style = form['style'] if 'apply' in req.form: req.app.cfg.change_single('pygments_support/style', active_style) flash(_('Pygments theme changed successfully.'), 'configure') return redirect_to('pygments_support/config') preview_formatter = get_formatter(active_style, preview=True) add_header_snippet('<style type="text/css">\n%s\n</style>' % escape(preview_formatter.get_style_defs())) example = highlight(EXAMPLE, get_lexer_by_name('html+jinja'), preview_formatter) return render_admin_response('admin/pygments_support.html', 'options.pygments_support', example=example, form=form.as_widget())
def login(request): """Show a login page.""" if request.user.is_somebody: return redirect_to('account/index') form = LoginForm() if request.method == 'POST' and form.validate(request.form): request.login(form['user'], form['permanent']) if request.user.is_admin: return form.redirect('admin/index') return form.redirect('account/index') return render_response('account/login.html', form=form.as_widget())
def profile(request): form = EditProfileForm(request.user) if request.method == 'POST': if request.form.get('cancel'): return form.redirect('account/index') elif request.form.get('delete'): return redirect_to('account/delete') elif form.validate(request.form): form.save_changes() db.commit() flash(_(u'Your profile was updated successfully.'), 'info') return form.redirect('account/index') return render_account_response('account/edit_profile.html', 'profile', form=form.as_widget())
def dispatch_content_type(req): """Show the post for a specific content type.""" slug = req.path[1:] # feed for the post if slug.endswith('/feed.atom'): slug = slug[:-10] want_feed = True else: want_feed = False post = Post.query.filter_by(slug=slug).first() if post is None: # if the post does not exist, check if a post with a trailing slash # exists. If it does, redirect to that post. This is allows users # to emulate folders and to get relative links working. if not slug.endswith('/'): real_post = Post.query.filter_by(slug=slug + '/').first() if real_post is None: raise NotFound() # if we want the feed, we don't want a redirect elif want_feed: post = real_post else: return redirect_to(real_post) else: raise NotFound() # make sure the current user can access that page. if not post.can_read(): raise Forbidden() # feed requested? jump to the feed page if want_feed: return atom_feed(req, post=post) # create the comment form form = NewCommentForm(post, req.user) if post.comments_enabled or post.comments: add_link('alternate', post.comment_feed_url, 'application/atom+xml', _(u'Comments Feed')) # now dispatch to the correct view handler = req.app.content_type_handlers.get(post.content_type) if handler is None: log.warn('No handler for the content type %r found.' % post.content_type) raise NotFound() return handler(req, post, form)
def show_akismet_config(req): """Show the akismet control panel.""" form = ConfigurationForm(initial=dict( api_key=req.app.cfg['akismet_spam_filter/apikey'])) if req.method == 'POST' and form.validate(req.form): if form.has_changed: req.app.cfg.change_single('akismet_spam_filter/apikey', form['api_key']) if form['api_key']: flash(_('Akismet has been successfully enabled.'), 'ok') else: flash(_('Akismet disabled.'), 'ok') return redirect_to('akismet_spam_filter/config') return render_admin_response('admin/akismet_spam_filter.html', 'options.akismet_spam_filter', form=form.as_widget())
def configure(self, request): form = WordPressImportForm() if request.method == 'POST' and form.validate(request.form): dump = request.files.get('dump') if form.data['download_url']: try: dump = open_url(form.data['download_url']).stream except Exception, e: error = _(u'Error downloading from URL: %s') % e elif not dump: return redirect_to('import/wordpress') try: blog = parse_feed(dump) except Exception, e: log.exception(_(u'Error parsing uploaded file')) flash(_(u'Error parsing uploaded file: %s') % e, 'error')
def show_akismet_config(req): """Show the akismet control panel.""" form = ConfigurationForm(initial=dict( api_key=req.app.cfg['akismet_spam_filter/apikey'] )) if req.method == 'POST' and form.validate(req.form): if form.has_changed: req.app.cfg.change_single('akismet_spam_filter/apikey', form['api_key']) if form['api_key']: flash(_('Akismet has been successfully enabled.'), 'ok') else: flash(_('Akismet disabled.'), 'ok') return redirect_to('akismet_spam_filter/config') return render_admin_response('admin/akismet_spam_filter.html', 'options.akismet_spam_filter', form=form.as_widget())
def configure(self, request): form = FeedImportForm() if request.method == 'POST' and form.validate(request.form): feed = request.files.get('feed') if form.data['download_url']: try: feed = open_url(form.data['download_url']).stream except Exception, e: log.exception(_('Error downloading feed')) flash(_(u'Error downloading from URL: %s') % e, 'error') if not feed: return redirect_to('import/feed') try: blog = parse_feed(feed) except Exception, e: log.exception(_(u'Error parsing uploaded file')) flash(_(u'Error parsing feed: %s') % e, 'error')
def configure(self, request): form = WordPressImportForm() if request.method == 'POST' and form.validate(request.form): dump = request.files.get('dump') if form.data['download_url']: try: dump = open_url(form.data['download_url']).stream except Exception, e: log.exception(_('Error downloading feed')) flash(_(u'Error downloading from URL: %s') % e, 'error') if not dump: return redirect_to('import/wordpress') try: blog = parse_feed(dump) except Exception, e: raise log.exception(_(u'Error parsing uploaded file')) flash(_(u'Error parsing uploaded file: %s') % e, 'error')
def show_config(req): """The configuration form.""" form = ConfigurationForm(initial=dict((k, req.app.cfg['typography/' + k]) for k in ConfigurationForm.fields)) if req.method == 'POST' and form.validate(req.form): if form.has_changed: t = req.app.cfg.edit() for key, value in form.data.iteritems(): t['typography/' + key] = value try: t.commit() except IOError: flash(_('Typography settings could not be changed.'), 'error') else: flash(_('Typography settings changed.'), 'configure') return redirect_to('typography/config') return render_admin_response('admin/typography.html', 'options.typography', form=form.as_widget())
def help(req, page=''): """Show help page.""" from zine.docs import load_page, get_resource rv = load_page(req.app, page) if rv is None: resource = get_resource(req.app, page) if resource is None: return render_account_response('account/help.html', 'system.help', not_found=True) return resource parts, is_index = rv ends_with_slash = not page or page.endswith('/') if is_index and not ends_with_slash: return redirect_to('account/help', page=page + '/') elif not is_index and ends_with_slash: raise NotFound() return render_account_response('account/help.html', 'system.help', **parts)
def show_config(req): """The configuration form.""" form = ConfigurationForm(initial=dict( (k, req.app.cfg['typography/' + k]) for k in ConfigurationForm.fields)) if req.method == 'POST' and form.validate(req.form): if form.has_changed: t = req.app.cfg.edit() for key, value in form.data.iteritems(): t['typography/' + key] = value try: t.commit() except IOError: flash(_('Typography settings could not be changed.'), 'error') else: flash(_('Typography settings changed.'), 'configure') return redirect_to('typography/config') return render_admin_response('admin/typography.html', 'options.typography', form=form.as_widget())
def create_if_valid(self, req): """The one-trick pony for commenting. Passed a req it tries to use the req data to submit a comment to the post. If the req is not a post req or the form is invalid the return value is None, otherwise a redirect response to the new comment. """ if req.method != 'POST' or not self.validate(req.form): return # if we don't have errors let's save it and emit an # `before-comment-saved` event so that plugins can do # block comments so that administrators have to approve it comment = self.make_comment() #! use this event to block comments before they are saved. This #! is useful for antispam and other ways of moderation. emit_event('before-comment-saved', req, comment) # Moderate Comment? Now that the spam check any everything # went through the processing we explicitly set it to # unmodereated if the blog configuration demands that if not comment.blocked and comment.requires_moderation: comment.status = COMMENT_UNMODERATED comment.blocked_msg = _(u'Comment waiting for approval') #! this is sent directly after the comment was saved. Useful if #! you want to send mail notifications or whatever. emit_event('after-comment-saved', req, comment) # Commit so that make_visible_for_request can access the comment id. db.commit() # Still allow the user to see his comment if it's blocked if comment.blocked: comment.make_visible_for_request(req) return redirect_to(self.post)
feed = open_url(form.data['download_url']).stream except Exception, e: log.exception(_('Error downloading feed')) flash(_(u'Error downloading from URL: %s') % e, 'error') if not feed: return redirect_to('import/feed') try: blog = parse_feed(feed) except Exception, e: log.exception(_(u'Error parsing uploaded file')) flash(_(u'Error parsing feed: %s') % e, 'error') else: self.enqueue_dump(blog) flash(_(u'Added imported items to queue.')) return redirect_to('admin/import') return self.render_admin_page('admin/import_feed.html', form=form.as_widget()) class Extension(object): """Extensions are instanciated for each parsing process.""" feed_types = frozenset() def __init__(self, app, parser, root): self.app = app self.parser = parser self.root = root def handle_root(self, blog):