Fixes #3934: Error on OAI-PMH list request.
[wolnelektury.git] / src / wolnelektury / utils.py
index d20039c..c65a172 100644 (file)
@@ -1,26 +1,24 @@
-# -*- coding: utf-8 -*-
 # This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later.
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
 import codecs
 import csv
 # This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later.
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
 import codecs
 import csv
-import cStringIO
+from functools import wraps
+from inspect import getargspec
+from io import BytesIO
 import json
 import os
 import json
 import os
-from functools import wraps
-
 import pytz
 import pytz
-from inspect import getargspec
-
 import re
 import re
+
 from django.core.mail import send_mail
 from django.http import HttpResponse
 from django.core.mail import send_mail
 from django.http import HttpResponse
-from django.template import RequestContext
 from django.template.loader import render_to_string
 from django.utils import timezone
 from django.conf import settings
 from django.utils.translation import ugettext
 
 from django.template.loader import render_to_string
 from django.utils import timezone
 from django.conf import settings
 from django.utils.translation import ugettext
 
+
 tz = pytz.timezone(settings.TIME_ZONE)
 
 
 tz = pytz.timezone(settings.TIME_ZONE)
 
 
@@ -41,7 +39,7 @@ def makedirs(path):
 
 def stringify_keys(dictionary):
     return dict((keyword.encode('ascii'), value)
 
 def stringify_keys(dictionary):
     return dict((keyword.encode('ascii'), value)
-                for keyword, value in dictionary.iteritems())
+                for keyword, value in dictionary.items())
 
 
 def json_encode(obj, sort_keys=True, ensure_ascii=False):
 
 
 def json_encode(obj, sort_keys=True, ensure_ascii=False):
@@ -88,7 +86,7 @@ def ajax(login_required=False, method=None, template=None, permission_required=N
                 if request_params:
                     request_params = dict(
                         (key, json_decode_fallback(value))
                 if request_params:
                     request_params = dict(
                         (key, json_decode_fallback(value))
-                        for key, value in request_params.iteritems()
+                        for key, value in request_params.items()
                         if fun_kwargs or key in fun_params)
                     kwargs.update(stringify_keys(request_params))
                 res = None
                         if fun_kwargs or key in fun_params)
                     kwargs.update(stringify_keys(request_params))
                 res = None
@@ -101,7 +99,7 @@ def ajax(login_required=False, method=None, template=None, permission_required=N
                 try:
                     res = fun(request, **kwargs)
                     if res and template:
                 try:
                     res = fun(request, **kwargs)
                     if res and template:
-                        res = {'html': render_to_string(template, res, RequestContext(request))}
+                        res = {'html': render_to_string(template, res, request=request)}
                 except AjaxError as e:
                     res = {'result': e.args[0]}
             if 'result' not in res:
                 except AjaxError as e:
                     res = {'result': e.args[0]}
             if 'result' not in res:
@@ -130,7 +128,7 @@ class UnicodeCSVWriter(object):
 
     def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
         # Redirect output to a queue
 
     def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
         # Redirect output to a queue
-        self.queue = cStringIO.StringIO()
+        self.queue = BytesIO()
         self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
         self.stream = f
         self.encoder = codecs.getincrementalencoder(encoding)()
         self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
         self.stream = f
         self.encoder = codecs.getincrementalencoder(encoding)()
@@ -155,3 +153,14 @@ class UnicodeCSVWriter(object):
 # the original re.escape messes with unicode
 def re_escape(s):
     return re.sub(r"[(){}\[\].*?|^$\\+-]", r"\\\g<0>", s)
 # the original re.escape messes with unicode
 def re_escape(s):
     return re.sub(r"[(){}\[\].*?|^$\\+-]", r"\\\g<0>", s)
+
+
+BOT_BITS = ['bot', 'slurp', 'spider', 'facebook', 'crawler', 'parser', 'http']
+
+
+def is_crawler(request):
+    user_agent = request.META.get('HTTP_USER_AGENT')
+    if not user_agent:
+        return True
+    user_agent = user_agent.lower()
+    return any(bot_bit in user_agent for bot_bit in BOT_BITS)