예제 #1
0
파일: views.py 프로젝트: fiam/blangoblog
    def pingback_ping(self):
        source = self.params[0]
        target = self.params[1]
        slug = target.split('/')[-2]
        try:
            entry = Entry.objects.get(slug=slug)
            if not entry.allow_comments:
                raise Entry.DoesNotExist
        except Entry.DoesNotExist:
            return XmlRpcDispatcher.fault(33, 'The specified URI cannot be used as target')

        try:
            Comment.objects.get(entry=entry, type__in=['P', 'T'], author_uri=source)
            return XmlRpcDispatcher.fault(48, 'The pingback has already been registered')
        except Comment.DoesNotExist:
            pass

        s = Spider(source)
        if not s.backlinks(target):
            if s.code == 200:
                return XmlRpcDispatcher.fault(17, 'The source URI does not contain a link to the target URI')

            return XmlRpcDispatcher.fault(16, 'The source URI does not exist')

        Comment.objects.create(entry=entry, type='P',
                author=hostname_from_uri(source, http=False),
                author_uri=source, body='')

        return XmlRpcDispatcher.pingback_reply('Pingback stored')
예제 #2
0
파일: models.py 프로젝트: fiam/blangoblog
 def ping(self):
     r = re.compile('<a.*?href=["\'](.*?)["\'].*?>', re.I | re.S)
     for anchor in r.finditer(self.body_html):
         link = anchor.group(1)
         if link.startswith(settings.BLANGO_URL):
             continue
         s = Spider(link)
         if not s.trackback(title=self.title,
                 url=self.get_absolute_url(),
                 excerpt=self.body_html,
                 page_name=settings.BLANGO_TITLE):
             s.pingback(self.get_absolute_url())
예제 #3
0
파일: models.py 프로젝트: fiam/blangoblog
    def save(self, *args, **kwargs):
        spider = Spider(self.link)
        if 'html' in spider.oembed:
            self.pre_html = '<div class="entry-embed">%s</div>' % \
                spider.oembed['html']
        elif spider.oembed.get('type') == 'photo':
            self.pre_html = '<div class="entry-embed"><img alt="%(title)s" ' \
                    'src="%(url)s" width="%(width)s" height="%(height)s" />' \
                    '</div>' % spider.oembed
        elif not self.thumbnail:
            thumbnail = None
            thumbnail_size = (0, 0)
            required_attrs = ('src', 'alt', 'width', 'height')
            for img in spider.soup.xpath('//img'):
                if all (k in img.attrib for k in required_attrs):
                    width, height = int(img.get('width')), int(img.get('height'))
                    if width * height > reduce(lambda x, y: x * y, thumbnail_size):
                        thumbnail = img
                        thumbnail_size = (width, height)
            # Try to fetch a thumbnail
            if thumbnail is not None:
                THUMBNAIL_SIZE = 150
                img_url = thumbnail.get('src')
                img_data = spider.fetch(img_url)
                im = Image.open(StringIO(img_data))
                im.thumbnail((THUMBNAIL_SIZE, THUMBNAIL_SIZE))
                buf = StringIO()
                im.save(buf, format=im.format)
                self.thumbnail.save(os.path.basename(img_url),
                                    ContentFile(buf.getvalue()))
                buf.close()

        result = urlparse.urlparse(self.link)
        self.post_html = _('<h4>From <a href="%s">%s</a></h4>') % \
                (self.link, result.netloc)
        if not self.title:
            self.title = spider.oembed.get('title') or spider.get_title()
        super(LinkEntry, self).save(*args, **kwargs)
예제 #4
0
파일: views.py 프로젝트: fiam/blangoblog
def trackback_view(request, entry_id):
    title = request.POST.get('title')
    excerpt = request.POST.get('excerpt', '')
    url = request.POST.get('url')
    blog_name = request.POST.get('blog_name')

    if not url:
        return HttpResponse('''<?xml version="1.0" encoding="utf-8"?>
                <response>
                    <error>1</error>
                    <message>No URL specified</message>
                </response>''', mimetype='text/xml')
    if len(url) > 1024:
        return HttpResponse('''<?xml version="1.0" encoding="utf-8"?>
                <response>
                    <error>1</error>
                    <message>Entity Too Large</message>
                </response>''', mimetype='text/xml')

    if not is_absolute_link(url):
        return HttpResponse('''<?xml version="1.0" encoding="utf-8"?>
                <response>
                    <error>1</error>
                    <message>URL must match https?://.*</message>
                </response>''', mimetype='text/xml')
    
    entry = get_object_or_404(Entry, pk=entry_id)

    if not entry.allow_comments:
        return HttpResponse('''<?xml version="1.0" encoding="utf-8"?>
                <response>
                    <error>1</error>
                    <message>Trackbacks are not allowed for this entry</message>
                </response>''', mimetype='text/xml')


    try:
        Comment.objects.get(entry=entry, type__in=['T', 'P'], author_uri=url)
        return HttpResponse('''<?xml version="1.0" encoding="utf-8"?>
                <response>
                    <error>1</error>
                    <message>Trackback already registered</message>
                </response>''', mimetype='text/xml')
    except Comment.DoesNotExist:
        pass

    s = Spider(url)
    if not s.backlinks(entry.get_absolute_url()):
        return HttpResponse('''<?xml version="1.0" encoding="utf-8"?>
                <response>
                    <error>1</error>
                    <message>URL doesn't link back</message>
                </response>''', mimetype='text/xml')

    if not blog_name:
        blog_name = url.split('/')[2]

    if title:
        excerpt = '%s\n\n%s' % (title, excerpt)

    Comment.objects.create(entry=entry, author=blog_name, author_uri=url, body=excerpt, type='T')

    return HttpResponse('''<?xml version="1.0" encoding="utf-8"?>
                <response>
                    <error>0</error>
                </response>''')