Example #1
0
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)
Example #2
0
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)
Example #3
0
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))
Example #4
0
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)
Example #5
0
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))
Example #6
0
    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
Example #7
0
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
Example #8
0
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}))
Example #9
0
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))
Example #10
0
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}))
Example #11
0
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))