def update_mailbox(request, mailbox_slug): """ updates a mailbox's info """ ctx = request.context couchdb = ctx.get_couchdb_server() try: dbname = ctx.get_database_name(mailbox_slug) mb = couchdb[dbname] if not is_mailbox(mb): return HttpResponse(status=404) if not ctx.user.has_perm(PERM_UPDATE, mb): return HttpResponse(status=401) info = _mailbox_info_json(request) mbinfo = MailboxInfo.get(mb) try: mbinfo.user_update(info) except: return HttpResponse(status=400) mbinfo.store(mb) return HttpResponse() except ResourceNotFound: return HttpResponse(status=404)
def _get_opml(request, mb): """ build OPML doc from feed type subscriptions in the mailbox. """ info = MailboxInfo.get(mb) root = etree.Element("opml", version="1.0") head = etree.Element("head") root.append(head) title = etree.Element("title") title.text = info.title or mb.name head.append(title) body = etree.Element("body") root.append(body) for sub in FeedSubscription.view(mb, FeedSubscription.by_type, startkey=FEED_SUBSCRIPTION_TYPE, endkey=FEED_SUBSCRIPTION_TYPE, include_docs=True): attrs = { 'id': sub.id, 'xmlUrl': sub['url'], 'type': 'rss', 'title': sub.get('title', sub['url']) } body.append(etree.Element("outline", **attrs)) return etree.tostring(root)
def _render_messages(request, mailbox, messages, next_params=None): ctx = request.context entries = [] for message in messages: renderer = _get_hatom_renderer(message, request) if renderer is not None: entries.append(renderer) info = MailboxInfo.get(mailbox) mailbox_slug = request.context.get_mailbox_slug(mailbox.name) ctx = {} ctx['mailbox'] = mailbox ctx['mailbox_slug'] = mailbox_slug ctx['mailbox_title'] = info.title or mailbox_slug ctx['entries'] = entries if next_params: q = dict(request.GET) q.update(next_params) qs = '' for k, v in q.items(): qs += '&%s=%s' % (quote_plus(k), quote_plus(v)) next_link = request.path + '?' + qs[1:] ctx['next_link'] = next_link return render_to_response('radar/view_mailbox.html', TemplateContext(request, ctx))
def create_mailbox(request, mailbox_slug): """ create a mailbox. request.POST may contain a json object with initial mailbox info. """ if not request.context.user.has_perm(PERM_CREATE_MAILBOX): return HttpResponse(status=401) try: info = None if request.body: try: info = _mailbox_info_json(request) except: return HttpResponse(status=400) ctx = request.context dbname = ctx.get_database_name(mailbox_slug) mb = _create_mailbox(ctx.get_couchdb_server(), dbname) if info is not None and len(info) > 0: mbinfo = MailboxInfo.get(mb) for k, v in info.items(): setattr(mbinfo, k, v) mbinfo.store(mb) return HttpResponse(status=201) except PreconditionFailed: return HttpResponse(status=409)
def manage_subscriptions(request, mailbox_slug): ctx = request.context mb = ctx.get_mailbox(mailbox_slug) if mb is None: return HttpResponse(status=404) if not ctx.user.has_perm(PERM_READ, mb): return handle_unauth(request) info = MailboxInfo.get(mb) subs = [] for sub in Subscription.view(mb, Subscription.by_type, include_docs=True): subs.append(sub) ctx = {} ctx['mailbox'] = mb ctx['mailbox_slug'] = mailbox_slug ctx['mailbox_title'] = info.title or mailbox_slug ctx['subscriptions'] = sorted(subs, key=attrgetter('title')) if request.headers.get('X-Requested-With') == 'XMLHttpRequest': return render_to_response('radar/subscriptions_table.html', TemplateContext(request, ctx)) else: return render_to_response('radar/subscriptions.html', TemplateContext(request, ctx))
def test_mailbox_update(self): mb = self.create_test_mailbox() slug = get_mailbox_slug(self.config, mb.name) mb_url = self.url_for('mailbox_rest', mailbox_slug=slug) c = self.get_test_app() self.login_as_admin(c) new_title = "The Test Mailbox's New Title" mbinfo = MailboxInfo.get(mb) assert mbinfo.title != new_title c.post(mb_url, json.dumps({'title': new_title}), content_type="application/json", status=200) mbinfo = MailboxInfo.get(mb) assert mbinfo.title == new_title
def _render_atom_feed(request, mb, messages): entries = [] for message in messages: renderer = _get_atom_renderer(message, request) if renderer is not None: entries.append(renderer) info = MailboxInfo.get(mb) # absolute url for requested feed feed_url = request.url template_info = TemplateContext(request, {'id': feed_url, 'self_link': feed_url, 'updated': datetime.utcnow(), # XXX 'title': info.title or request.context.get_mailbox_slug(mb.name), 'entries': entries, }) res = HttpResponse(content_type='application/atom+xml') res.charset = 'utf-8' res.unicode_body = request.context.render('radar/atom/atom.xml', template_info) res.headers['etag'] = get_mailbox_etag(mb) return res
def list_mailboxes(request): ctx = request.context mailboxes = [] for mb in ctx.iter_mailboxes(): slug = ctx.get_mailbox_slug(mb.name) info = MailboxInfo.get(mb) mailboxes.append({ 'slug': slug, 'title': info.title or slug }) return render_to_response('radar/list_mailboxes.html', TemplateContext(request, {'mailboxes': mailboxes}))
def manage_subscriptions(request, mailbox_slug): ctx = request.context mb = ctx.get_mailbox(mailbox_slug) if mb is None: return HttpResponse(status=404) info = MailboxInfo.get(mb) ctx = {} ctx['mailbox_slug'] = mailbox_slug ctx['mailbox_title'] = info.title or mailbox_slug return render_to_response('radar/subscriptions.html', TemplateContext(request, ctx))
def list_mailboxes(request): ctx = request.context mailboxes = [] for mb in ctx.iter_mailboxes(): if not ctx.user.has_perm(PERM_READ, mb): continue slug = ctx.get_mailbox_slug(mb.name) info = MailboxInfo.get(mb) mailboxes.append({ 'slug': slug, 'title': info.title or 'Untitled', 'db': mb }) return render_to_response('radar/list_mailboxes.html', TemplateContext(request, {'mailboxes': mailboxes}))
def view_mailbox(request, mailbox_slug): ctx = request.context mb = ctx.get_mailbox(mailbox_slug) if mb is None: return HttpResponse(status=404) params = {'limit': 10, 'include_docs': True, 'reduce': False, 'descending': True} info = MailboxInfo.get(mb) items = Message.view(mb, Message.by_timestamp, **params) ctx = {} ctx['mailbox_slug'] = mailbox_slug ctx['mailbox_title'] = info.title or mailbox_slug ctx['items'] = items return render_to_response('radar/view_mailbox.html', TemplateContext(request, ctx))