def ping_func(source, target): log = logging.getLogger('pingback') log.debug('received pingback from %r to %r' % (source, target)) domain = Site.objects.get_current().domain # fetch the source request, then check if it really pings the target. try: doc = urlopen(source) except (HTTPError, URLError): raise PingbackError(PingbackError.SOURCE_DOES_NOT_EXIST) # does the source refer to the target? soup = BeautifulSoup(doc.read()) mylink = soup.find('a', href=target) if not mylink: raise PingbackError(PingbackError.SOURCE_DOES_NOT_LINK) # grab the title of the pingback source title = soup.find('title') if title: title = strip_tags(unicode(title)) else: title = 'Unknown title' # extract the text around the incoming link content = unicode(mylink.findParent()) i = content.index(unicode(mylink)) content = strip_tags(content) max_length = getattr(settings, 'PINGBACK_RESPONSE_LENGTH', 200) if len(content) > max_length: start = i - max_length / 2 if start < 0: start = 0 end = i + len(unicode(mylink)) + max_length / 2 if end > len(content): end = len(content) content = content[start:end] scheme, server, path, query, fragment = urlsplit(target) # check if the target is valid target if not (server == domain or server.split(':')[0] == domain): return PingbackError.TARGET_IS_NOT_PINGABLE resolver = get_resolver(None) try: func, a, kw = resolver.resolve(path) except urlresolvers.Resolver404: raise PingbackError(PingbackError.TARGET_DOES_NOT_EXIST) url_signatures = resolver.reverse_dict.getlist(func) # stupid workaround because django returns tuple instead of RegexURLPattern registered = False for name in kwargs: if resolver.reverse_dict[name] in url_signatures: registered = True break if not registered: raise PingbackError(PingbackError.TARGET_IS_NOT_PINGABLE) object_resolver = kwargs[name] obj = object_resolver(*a, **kw) content_type = ContentType.objects.get_for_model(obj) try: Pingback.objects.get(url=source, content_type=content_type, object_id=obj.id) raise PingbackError(PingbackError.PINGBACK_ALREADY_REGISTERED) except Pingback.DoesNotExist: pass pb = Pingback(object=obj, url=source, content=content.encode('utf-8'), title=title.encode('utf-8'), approved=True) pb.save() return 'pingback from %s to %s saved' % (source, target)
def ping(source, target): """ Pingback server function. Requires URL of pinger resource and link of pinging resource. Determinition of pingable object by it's url is done by setting settings.PINGBACK_SERVER in the following format:: { 'post_detail': 'pingback.getters.post_get', } Where: - 'post_detail' is name of url - 'pingback.getters.post_get' is name of function, which will return object using parameters, resolved by URL. """ domain = Site.objects.get_current().domain try: doc = urlopen(source) except (HTTPError, URLError): return PingbackError.SOURCE_DOES_NOT_EXIST soup = BeautifulSoup(doc.read()) mylink = soup.find('a', href=target) if not mylink: return PingbackError.SOURCE_DOES_NOT_LINKING # title title = soup.find('title') if title: title = strip_tags(unicode(title)) else: title = 'Unknown title' content = unicode(mylink.findParent()) i = content.index(unicode(mylink)) content = strip_tags(content) max_length = settings.PINGBACK_RESPONSE_LENGTH if len(content) > max_length: start = i - max_length / 2 if start < 0: start = 0 end = i + len(unicode(mylink)) + max_length / 2 if end > len(content): end = len(content) content = content[start:end] scheme, server, path, query, fragment = urlsplit(target) if not (server == domain or server.split(':')[0] == domain): return PingbackError.TARGET_IS_NOT_PINGABLE resolver = ur.RegexURLResolver(r'^/', settings.ROOT_URLCONF) try: func, smth, params = resolver.resolve(path) except ur.Resolver404: return PingbackError.TARGET_DOES_NOT_EXIST name = resolver.reverse_dict[func][-1].name if not name in settings.PINGBACK_SERVER: return PingbackError.TARGET_IS_NOT_PINGABLE getter = settings.PINGBACK_SERVER[name] if not callable(getter): getter = get_callable(getter) obj = getter(**params) ctype = ContentType.objects.get_for_model(obj) try: Pingback.objects.get(url=source, content_type=ctype, object_id=obj.id) return PingbackError.PINGBACK_ALREADY_REGISTERED except Pingback.DoesNotExist: pass pb = Pingback(object=obj, url=source, content=content.encode('utf-8'), title=title.encode('utf-8'), approved=True) pb.save() return 'pingback from %s to %s saved' % (source, target)
def ping_func(source, target): log = logging.getLogger('pingback') log.debug('received pingback from %r to %r' % (source, target)) domain = Site.objects.get_current().domain # fetch the source request, then check if it really pings the target. try: doc = urlopen(source) except (HTTPError, URLError): raise PingbackError(PingbackError.SOURCE_DOES_NOT_EXIST) # does the source refer to the target? soup = BeautifulSoup(doc.read()) mylink = soup.find('a', href=target) if not mylink: raise PingbackError(PingbackError.SOURCE_DOES_NOT_LINK) # grab the title of the pingback source title = soup.find('title') if title: title = strip_tags(unicode(title)) else: title = 'Unknown title' # extract the text around the incoming link content = unicode(mylink.findParent()) i = content.index(unicode(mylink)) content = strip_tags(content) max_length = getattr(settings, 'PINGBACK_RESPONSE_LENGTH', 200) if len(content) > max_length: start = i - max_length/2 if start < 0: start = 0 end = i + len(unicode(mylink)) + max_length/2 if end > len(content): end = len(content) content = content[start:end] scheme, server, path, query, fragment = urlsplit(target) # check if the target is valid target if not (server == domain or server.split(':')[0] == domain): return PingbackError.TARGET_IS_NOT_PINGABLE resolver = get_resolver(None) try: func, a, kw = resolver.resolve(path) except urlresolvers.Resolver404: raise PingbackError(PingbackError.TARGET_DOES_NOT_EXIST) url_signatures = resolver.reverse_dict.getlist(func) # stupid workaround because django returns tuple instead of RegexURLPattern registered = False for name in kwargs: if resolver.reverse_dict[name] in url_signatures: registered = True break if not registered: raise PingbackError(PingbackError.TARGET_IS_NOT_PINGABLE) object_resolver = kwargs[name] obj = object_resolver(*a, **kw) content_type = ContentType.objects.get_for_model(obj) try: Pingback.objects.get(url=source, content_type=content_type, object_id=obj.id) raise PingbackError(PingbackError.PINGBACK_ALREADY_REGISTERED) except Pingback.DoesNotExist: pass pb = Pingback(object=obj, url=source, content=content.encode('utf-8'), title=title.encode('utf-8'), approved=True) pb.save() return 'pingback from %s to %s saved' % (source, target)
def ping(source, target): """ Pingback server function. Requires URL of pinger resource and link of pinging resource. Determinition of pingable object by it's url is done by setting settings.PINGBACK_SERVER in the following format:: { 'post_detail': 'pingback.getters.post_get', } Where: - 'post_detail' is name of url - 'pingback.getters.post_get' is name of function, which will return object using parameters, resolved by URL. """ domain = Site.objects.get_current().domain try: doc = urlopen(source) except (HTTPError, URLError): return PingbackError.SOURCE_DOES_NOT_EXIST soup = BeautifulSoup(doc.read()) mylink = soup.find('a', href=target) if not mylink: return PingbackError.SOURCE_DOES_NOT_LINKING # title title = soup.find('title') if title: title = strip_tags(unicode(title)) else: title = 'Unknown title' content = unicode(mylink.findParent()) i = content.index(unicode(mylink)) content = strip_tags(content) max_length = settings.PINGBACK_RESPONSE_LENGTH if len(content) > max_length: start = i - max_length/2 if start < 0: start = 0 end = i + len(unicode(mylink)) + max_length/2 if end > len(content): end = len(content) content = content[start:end] scheme, server, path, query, fragment = urlsplit(target) if not (server == domain or server.split(':')[0] == domain): return PingbackError.TARGET_IS_NOT_PINGABLE resolver = ur.RegexURLResolver(r'^/', settings.ROOT_URLCONF) try: func, smth, params = resolver.resolve(path) except ur.Resolver404: return PingbackError.TARGET_DOES_NOT_EXIST name = resolver.reverse_dict[func][-1].name if not name in settings.PINGBACK_SERVER: return PingbackError.TARGET_IS_NOT_PINGABLE getter = settings.PINGBACK_SERVER[name] if not callable(getter): getter = get_callable(getter) obj = getter(**params) ctype = ContentType.objects.get_for_model(obj) try: Pingback.objects.get(url=source, content_type=ctype, object_id=obj.id) return PingbackError.PINGBACK_ALREADY_REGISTERED except Pingback.DoesNotExist: pass pb = Pingback(object=obj, url=source, content=content.encode('utf-8'), title=title.encode('utf-8'), approved=True) pb.save() return 'pingback from %s to %s saved' % (source, target)