Example #1
0
    def to_metaweblog(self, application):
        # We're kind of throwing fieldnames at the wall and seeing what sticks,
        # MarsEdit expects different names in the responses to different API
        # calls.

        if self.status == 'publish':
            url = absolute(application.reverse_url('post', self.slug))
        else:
            url = absolute(application.reverse_url('draft', self.slug))

        rv = {
            'title': self.title,
            # Note we're returning the original, not the display version
            'description': self.original,
            'link': url,
            'permaLink': url,
            'categories': [cat.to_metaweblog(application) for cat in self['categories']],
            'mt_keywords': ','.join(self['tags']),
            'dateCreated': self.local_date_created(application),
            'date_created_gmt': self.date_created,
            'postid': str(self.id),
            'id': str(self.id),
            'status': self.status,
        }

        if self.type == 'post':
            rv['post_id'] = str(self.id)
            rv['post_status'] = self.status
        elif self.type == 'page':
            rv['page_id'] = str(self.id)
            rv['page_status'] = self.status

        return rv
Example #2
0
    def get(self, slug=None):
        if slug:
            slug = slug.rstrip('/')

        if not slug:
            this_category = None
        else:
            # Get all the categories and search for one with the right slug,
            # instead of actually querying for the right category, since
            # get_categories() is cached.
            slug = slug.rstrip('/')
            for this_category in self.categories:
                if this_category.slug == slug:
                    break
            else:
                raise tornado.web.HTTPError(404)

        title = opts.blog_name

        if this_category:
            title = '%s - Posts about %s' % (title, this_category.name)

        author = {'name': opts.author_display_name, 'email': opts.author_email}
        if this_category:
            feed_url = absolute(
                self.reverse_url('category-feed', this_category.slug))
        else:
            feed_url = absolute(self.reverse_url('feed'))

        updated = max(max(p.mod, p.date_created) for p in self.posts)

        feed = AtomFeed(
            title=title,
            feed_url=feed_url,
            url=absolute(self.reverse_url('home')),
            author=author,
            updated=updated,
            # TODO: customizable icon, also a 'logo' kwarg
            icon=absolute(self.reverse_url('theme-static', '/theme/static/square96.png')),
            generator=('Motor-Blog', 'https://github.com/ajdavis/motor-blog', '0.1'),
        )

        for post in self.posts:
            url = absolute(self.reverse_url('post', post.slug))
            feed.add(
                title=post.title,
                content=post.body,
                content_type='html',
                summary=post.summary,
                author=author,
                url=url,
                id=url,
                published=post.date_created,
                updated=post.mod)

        self.set_header('Content-Type', 'application/atom+xml; charset=UTF-8')
        self.write(unicode(feed))
        self.finish()
Example #3
0
    def get(self, slug=None):
        if slug:
            slug = slug.rstrip('/')

        if not slug:
            this_category = None
        else:
            # Get all the categories and search for one with the right slug,
            # instead of actually querying for the right category, since
            # get_categories() is cached.
            slug = slug.rstrip('/')
            for this_category in self.categories:
                if this_category.slug == slug:
                    break
            else:
                raise tornado.web.HTTPError(404)

        title = opts.blog_name

        if this_category:
            title = '%s - Posts about %s' % (title, this_category.name)

        author = {'name': opts.author_display_name, 'email': opts.author_email}
        if this_category:
            feed_url = absolute(
                self.reverse_url('category-feed', this_category.slug))
        else:
            feed_url = absolute(self.reverse_url('feed'))

        updated = max(max(p.mod, p.date_created) for p in self.posts)

        feed = AtomFeed(
            title=title,
            feed_url=feed_url,
            url=absolute(self.reverse_url('home')),
            author=author,
            updated=updated,
            # TODO: customizable icon, also a 'logo' kwarg
            icon=absolute(self.reverse_url('theme-static', '/theme/static/square96.png')),
            generator=('Motor-Blog', 'https://github.com/ajdavis/motor-blog', '0.1'),
        )

        for post in self.posts:
            url = absolute(self.reverse_url('post', post.slug))
            feed.add(
                title=post.title,
                content=post.body,
                content_type='html',
                summary=post.summary,
                author=author,
                url=url,
                id=url,
                published=post.date_created,
                updated=post.mod)

        self.set_header('Content-Type', 'application/atom+xml; charset=UTF-8')
        self.write(unicode(feed))
        self.finish()
Example #4
0
 def to_wordpress(self, application):
     url = absolute(application.reverse_url('category', self.slug))
     return {
         'categoryId': str(self.id),
         'categoryName': self.name,
         'htmlUrl': url,
         'rssUrl': url,
     }
Example #5
0
 def _closed(self, result, error):
     if error:
         self.result(xmlrpclib.Fault(500, str(error)))
     else:
         full_link = absolute(
             os.path.join(opts.base_url, 'media', self.mlink))
         self.result({
             'file': self.name, 'url': full_link, 'type': self.media_type})
Example #6
0
    def metaWeblog_newMediaObject(self, blogid, user, password, struct):
        name = struct['name']
        content = struct['bits'].data  # xmlrpclib created a 'Binary' object
        content_type = struct['type']

        mlink = yield self.store_image(name, content, content_type)

        full_link = absolute(os.path.join(opts.base_url, 'media', mlink))

        self.result({'file': name, 'url': full_link, 'type': content_type})
Example #7
0
    def metaWeblog_newMediaObject(self, blogid, user, password, struct):
        name = struct['name']
        content = struct['bits'].data  # xmlrpclib created a 'Binary' object
        content_type = struct['type']

        mlink = yield self.store_image(name, content, content_type)

        full_link = absolute(
            os.path.join(opts.base_url, 'media', mlink))

        self.result({
            'file': name, 'url': full_link, 'type': content_type})
Example #8
0
    def metaWeblog_newMediaObject(self, blogid, user, password, struct):
        name = struct['name']
        content = struct['bits'].data # xmlrpclib created a 'Binary' object
        content_type = struct['type']

        if image.is_retina_filename(name):
            # Store a HiDPI version and a half-sized regular version
            _, width, height = yield motor.Op(self.store_image,
                name, content, content_type, opts.maxwidth * 2)

            regular_name = image.regular_from_retina(name)
            mlink, _, _ = yield motor.Op(self.store_image,
                regular_name, content, content_type, width / 2)
        else:
            mlink, _, _ = yield motor.Op(self.store_image,
                name, content, content_type, opts.maxwidth)

        full_link = absolute(
            os.path.join(opts.base_url, 'media', mlink))
        
        self.result({
            'file': name, 'url': full_link, 'type': content_type})
Example #9
0
    def get(self, slug=None):
        if slug:
            slug = slug.rstrip('/')

        this_category = None
        categories = yield self.get_categories()
        if slug:
            # Get all the categories and search for one with the right slug,
            # instead of actually querying for the right category, since
            # get_categories() is cached.
            slug = slug.rstrip('/')
            for category in categories:
                if category.slug == slug:
                    this_category = category
                    break
            else:
                raise tornado.web.HTTPError(404)

        title = opts.blog_name

        if this_category:
            title = '%s - Posts about %s' % (title, this_category.name)

        author = {'name': opts.author_display_name, 'email': opts.author_email}
        if this_category:
            feed_url = absolute(
                self.reverse_url('category-feed', this_category.slug))
        else:
            feed_url = absolute(self.reverse_url('feed'))

        posts_query = {'status': 'publish', 'type': 'post'}
        if slug:
            slug = slug.rstrip('/')
            posts_query['categories.slug'] = slug

        posts = yield self.get_posts(
            posts_query,
            {'summary': False, 'original': False},
            [('pub_date', -1)],
            0,
            20)

        if posts:
            updated = max(max(p.mod, p.date_created) for p in posts)
        else:
            updated = datetime.datetime.now(tz=self.application.settings['tz'])

        icon = absolute(
            self.reverse_url('theme-static', '/theme/static/square96.png'))

        generator = (
            'Motor-Blog', 'https://github.com/ajdavis/motor-blog', '0.1')

        feed = AtomFeed(
            title=title,
            feed_url=feed_url,
            url=absolute(self.reverse_url('home')),
            author=author,
            updated=updated,
            # TODO: customizable icon, also a 'logo' kwarg
            icon=icon,
            generator=generator)

        for post in posts:
            url = absolute(self.reverse_url('post', post.slug))
            tracking_pixel_url = ga_track_event_url(self.application, url)
            tracking_pixel = '<img src="%s" width="1px" height="1px">' \
                % tracking_pixel_url

            feed.add(
                title=post.title,
                content=post.body + tracking_pixel,
                content_type='html',
                summary=post.summary,
                author=author,
                url=url,
                id=url,
                published=post.date_created,
                # Don't update 'updated' - it seems to make Planet Python
                # re-post my updated items, which is spammy.
                #updated=post.mod,
                updated=post.date_created,
            )

        self.set_header('Content-Type', 'application/atom+xml; charset=UTF-8')
        self.write(unicode(feed))
        self.finish()
Example #10
0
    def get(self, slug=None):
        if slug:
            slug = slug.rstrip('/')

        this_category = None
        if slug:
            # Get all the categories and search for one with the right slug,
            # instead of actually querying for the right category, since
            # get_categories() is cached.
            slug = slug.rstrip('/')
            for category in self.categories:
                if category.slug == slug:
                    this_category = category
                    break
            else:
                raise tornado.web.HTTPError(404)

        title = opts.blog_name

        if this_category:
            title = '%s - Posts about %s' % (title, this_category.name)

        author = {'name': opts.author_display_name, 'email': opts.author_email}
        if this_category:
            feed_url = absolute(
                self.reverse_url('category-feed', this_category.slug))
        else:
            feed_url = absolute(self.reverse_url('feed'))

        if self.posts:
            updated = max(max(p.mod, p.date_created) for p in self.posts)
        else:
            updated = datetime.datetime.now(tz=self.application.settings['tz'])

        referer = self.request.headers.get('referer', '-') # (sic)

        feed = AtomFeed(
            title=title,
            feed_url=feed_url,
            url=absolute(self.reverse_url('home')),
            author=author,
            updated=updated,
            # TODO: customizable icon, also a 'logo' kwarg
            icon=absolute(self.reverse_url('theme-static', '/theme/static/square96.png')),
            generator=('Motor-Blog', 'https://github.com/ajdavis/motor-blog', '0.1'),
        )

        for post in self.posts:
            url = absolute(self.reverse_url('post', post.slug))
            body = post.body + '<img src="%s" width="1px" height="1px">' % ga_track_event_url(
                path=url,
                title=post.title,
                category_name=this_category.name if this_category else 'unknown',
                referer=referer
            )

            feed.add(
                title=post.title,
                content=body,
                content_type='html',
                summary=post.summary,
                author=author,
                url=url,
                id=url,
                published=post.date_created,
                # Don't update 'updated' - it seems to make Planet Python re-post my updated items,
                #    which is spammy.
                #updated=post.mod,
                updated=post.date_created,
            )

        self.set_header('Content-Type', 'application/atom+xml; charset=UTF-8')
        self.write(unicode(feed))
        self.finish()
Example #11
0
 def inserted(_id, error):
     if error:
         self.result(xmlrpclib.Fault(500, str(error)))
     else:
         full_link = absolute(os.path.join(opts.base_url, 'media', mlink))
         self.result({'file': name, 'url': full_link, 'type': media_type})
Example #12
0
        def inserted(_id, error):
            if error:
                raise error

            full_link = absolute(os.path.join(opts.base_url, 'media', mlink))
            self.result({'file': name, 'url': full_link, 'type': media_type})
Example #13
0
def ga_track_event_url(application, path):
    return absolute(
        application.reverse_url('tracking-pixel', path))