diff options
Diffstat (limited to 'mediagoblin/tools')
-rw-r--r-- | mediagoblin/tools/exif.py | 25 | ||||
-rw-r--r-- | mediagoblin/tools/licenses.py | 37 | ||||
-rw-r--r-- | mediagoblin/tools/mail.py | 32 | ||||
-rw-r--r-- | mediagoblin/tools/pagination.py | 7 | ||||
-rw-r--r-- | mediagoblin/tools/theme.py | 8 |
5 files changed, 74 insertions, 35 deletions
diff --git a/mediagoblin/tools/exif.py b/mediagoblin/tools/exif.py index fafd987d..2215fb0c 100644 --- a/mediagoblin/tools/exif.py +++ b/mediagoblin/tools/exif.py @@ -19,6 +19,11 @@ import six from exifread import process_file from exifread.utils import Ratio +try: + from PIL import Image +except ImportError: + import Image + from mediagoblin.processing import BadMediaFail from mediagoblin.tools.translate import pass_to_ugettext as _ @@ -61,12 +66,12 @@ def exif_fix_image_orientation(im, exif_tags): # Rotate image if 'Image Orientation' in exif_tags: rotation_map = { - 3: 180, - 6: 270, - 8: 90} + 3: Image.ROTATE_180, + 6: Image.ROTATE_270, + 8: Image.ROTATE_90} orientation = exif_tags['Image Orientation'].values[0] if orientation in rotation_map: - im = im.rotate( + im = im.transpose( rotation_map[orientation]) return im @@ -175,18 +180,14 @@ def get_gps_data(tags): pass try: - gps_data['direction'] = ( - lambda d: - float(d.num) / float(d.den) - )(tags['GPS GPSImgDirection'].values[0]) + direction = tags['GPS GPSImgDirection'].values[0] + gps_data['direction'] = safe_gps_ratio_divide(direction) except KeyError: pass try: - gps_data['altitude'] = ( - lambda a: - float(a.num) / float(a.den) - )(tags['GPS GPSAltitude'].values[0]) + altitude = tags['GPS GPSAltitude'].values[0] + gps_data['altitude'] = safe_gps_ratio_divide(altitude) except KeyError: pass diff --git a/mediagoblin/tools/licenses.py b/mediagoblin/tools/licenses.py index a964980e..2aff7f20 100644 --- a/mediagoblin/tools/licenses.py +++ b/mediagoblin/tools/licenses.py @@ -20,28 +20,45 @@ License = namedtuple("License", ["abbreviation", "name", "uri"]) SORTED_LICENSES = [ License("All rights reserved", "No license specified", ""), + License("CC BY 4.0", "Creative Commons Attribution 4.0 International", + "https://creativecommons.org/licenses/by/4.0/"), + License("CC BY-SA 4.0", + "Creative Commons Attribution-ShareAlike 4.0 International", + "https://creativecommons.org/licenses/by-sa/4.0/"), + License("CC BY-ND 4.0", + "Creative Commons Attribution-NoDerivs 4.0 International", + "https://creativecommons.org/licenses/by-nd/4.0/"), + License("CC BY-NC 4.0", + "Creative Commons Attribution-NonCommercial 4.0 International", + "https://creativecommons.org/licenses/by-nc/4.0/"), + License("CC BY-NC-SA 4.0", + "Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International", + "https://creativecommons.org/licenses/by-nc-sa/4.0/"), + License("CC BY-NC-ND 4.0", + "Creative Commons Attribution-NonCommercial-NoDerivs 4.0 International", + "https://creativecommons.org/licenses/by-nc-nd/4.0/"), License("CC BY 3.0", "Creative Commons Attribution Unported 3.0", - "http://creativecommons.org/licenses/by/3.0/"), + "https://creativecommons.org/licenses/by/3.0/"), License("CC BY-SA 3.0", - "Creative Commons Attribution-ShareAlike Unported 3.0", - "http://creativecommons.org/licenses/by-sa/3.0/"), + "Creative Commons Attribution-ShareAlike 3.0 Unported", + "https://creativecommons.org/licenses/by-sa/3.0/"), License("CC BY-ND 3.0", "Creative Commons Attribution-NoDerivs 3.0 Unported", - "http://creativecommons.org/licenses/by-nd/3.0/"), + "https://creativecommons.org/licenses/by-nd/3.0/"), License("CC BY-NC 3.0", - "Creative Commons Attribution-NonCommercial Unported 3.0", - "http://creativecommons.org/licenses/by-nc/3.0/"), + "Creative Commons Attribution-NonCommercial 3.0 Unported", + "https://creativecommons.org/licenses/by-nc/3.0/"), License("CC BY-NC-SA 3.0", "Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported", - "http://creativecommons.org/licenses/by-nc-sa/3.0/"), + "https://creativecommons.org/licenses/by-nc-sa/3.0/"), License("CC BY-NC-ND 3.0", "Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported", - "http://creativecommons.org/licenses/by-nc-nd/3.0/"), + "https://creativecommons.org/licenses/by-nc-nd/3.0/"), License("CC0 1.0", "Creative Commons CC0 1.0 Universal", - "http://creativecommons.org/publicdomain/zero/1.0/"), + "https://creativecommons.org/publicdomain/zero/1.0/"), License("Public Domain","Public Domain", - "http://creativecommons.org/publicdomain/mark/1.0/"), + "https://creativecommons.org/publicdomain/mark/1.0/"), ] # dict {uri: License,...} to enable fast license lookup by uri. Ideally, diff --git a/mediagoblin/tools/mail.py b/mediagoblin/tools/mail.py index c11e392b..3dc180d8 100644 --- a/mediagoblin/tools/mail.py +++ b/mediagoblin/tools/mail.py @@ -16,6 +16,8 @@ from __future__ import print_function, unicode_literals +import socket +import logging import six import smtplib import sys @@ -54,6 +56,14 @@ EMAIL_TEST_INBOX = [] EMAIL_TEST_MBOX_INBOX = [] +class MailError(Exception): + """ General exception for mail errors """ + + +class NoSMTPServerError(MailError): + pass + + class FakeMhost(object): """ Just a fake mail host so we can capture and test messages @@ -101,13 +111,27 @@ def send_email(from_addr, to_addrs, subject, message_body): else: smtp_init = smtplib.SMTP - mhost = smtp_init( - mg_globals.app_config['email_smtp_host'], - mg_globals.app_config['email_smtp_port']) + try: + mhost = smtp_init( + mg_globals.app_config['email_smtp_host'], + mg_globals.app_config['email_smtp_port']) + except socket.error as original_error: + error_message = "Couldn't contact mail server on <{}>:<{}>".format( + mg_globals.app_config['email_smtp_host'], + mg_globals.app_config['email_smtp_port']) + logging.debug(original_error) + raise NoSMTPServerError(error_message) # SMTP.__init__ Issues SMTP.connect implicitly if host if not mg_globals.app_config['email_smtp_host']: # e.g. host = '' - mhost.connect() # We SMTP.connect explicitly + try: + mhost.connect() # We SMTP.connect explicitly + except socket.error as original_error: + error_message = "Couldn't contact mail server on <{}>:<{}>".format( + mg_globals.app_config['email_smtp_host'], + mg_globals.app_config['email_smtp_port']) + logging.debug(original_error) + raise NoSMTPServerError(error_message) try: mhost.starttls() diff --git a/mediagoblin/tools/pagination.py b/mediagoblin/tools/pagination.py index a525caf7..db5f69fb 100644 --- a/mediagoblin/tools/pagination.py +++ b/mediagoblin/tools/pagination.py @@ -14,13 +14,12 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. -import urllib import copy from math import ceil, floor from itertools import count from werkzeug.datastructures import MultiDict -from six.moves import zip +from six.moves import range, urllib, zip PAGINATION_DEFAULT_PER_PAGE = 30 @@ -86,7 +85,7 @@ class Pagination(object): def iter_pages(self, left_edge=2, left_current=2, right_current=5, right_edge=2): last = 0 - for num in xrange(1, self.pages + 1): + for num in range(1, self.pages + 1): if num <= left_edge or \ (num > self.page - left_current - 1 and \ num < self.page + right_current) or \ @@ -107,7 +106,7 @@ class Pagination(object): new_get_params['page'] = page_no return "%s?%s" % ( - base_url, urllib.urlencode(new_get_params)) + base_url, urllib.parse.urlencode(new_get_params)) def get_page_url(self, request, page_no): """ diff --git a/mediagoblin/tools/theme.py b/mediagoblin/tools/theme.py index 97b041a6..79fd91e1 100644 --- a/mediagoblin/tools/theme.py +++ b/mediagoblin/tools/theme.py @@ -68,7 +68,7 @@ def register_themes(app_config, builtin_dir=BUILTIN_THEME_DIR): themedata = themedata_for_theme_dir(themedir, abs_themedir) registry[themedir] = themedata - + # Built-in themes if os.path.exists(builtin_dir): _install_themes_in_dir(builtin_dir) @@ -79,11 +79,9 @@ def register_themes(app_config, builtin_dir=BUILTIN_THEME_DIR): _install_themes_in_dir(theme_install_dir) current_theme_name = app_config.get('theme') - if current_theme_name \ - and registry.has_key(current_theme_name): + try: current_theme = registry[current_theme_name] - else: + except KeyError: current_theme = None return registry, current_theme - |