towards supporting python 2 and 3

- use absolute_imports
- make use of six.moves
- use exec instead of execfile
- use list(dict) instead if dict.keys()
This commit is contained in:
j 2016-08-23 12:27:06 +02:00
commit 1468ddbecb
89 changed files with 400 additions and 265 deletions

View file

@ -1,9 +1,10 @@
# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
from __future__ import division, print_function, absolute_import
from django.contrib import admin
import models
from . import models
class ItemAdmin(admin.ModelAdmin):

View file

@ -1,16 +1,18 @@
# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
from __future__ import division, print_function, absolute_import
from datetime import datetime
import unicodedata
from six import string_types
from django.db.models import Q, Manager
from django.conf import settings
from archive.models import Volume
from itemlist.models import List
from django.contrib.auth.models import Group
import models
import utils
from . import utils
from oxdjango.query import QuerySet
from oxdjango.managers import get_operator
@ -29,6 +31,7 @@ def parseCondition(condition, user, owner=None):
}
...
'''
from . import models
k = condition.get('key', '*')
k = {'id': 'public_id'}.get(k, k)
if not k:
@ -119,7 +122,7 @@ def parseCondition(condition, user, owner=None):
else:
value_key = k
if not k.startswith('public_id'):
if isinstance(v, unicode):
if isinstance(v, string_types):
v = unicodedata.normalize('NFKD', v).lower()
if k in facet_keys:
in_find = False
@ -237,6 +240,7 @@ class ItemManager(Manager):
return QuerySet(self.model)
def filter_list(self, qs, l, user):
from . import models
if l != "*":
l = l.split(":")
only_public = True

View file

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
from __future__ import division, with_statement
from __future__ import division, print_function, absolute_import
import json
import os
@ -12,8 +12,9 @@ import unicodedata
import uuid
from datetime import datetime
from glob import glob
from urllib import quote
from six import PY2, string_types
from six.moves.urllib.parse import quote
from django.db import models, transaction, connection
from django.db.models import Q, Sum, Max
from django.conf import settings
@ -26,11 +27,11 @@ from oxdjango import fields
import ox.web.imdb
import ox.image
import managers
import utils
import tasks
from . import managers
from . import utils
from . import tasks
from .timelines import join_tiles
from data_api import external_data
from .data_api import external_data
from annotation.models import Annotation
from archive import extract
@ -40,6 +41,10 @@ from sequence.tasks import get_sequences
from title.models import get_title_sort
import archive.models
if not PY2:
unicode = str
def get_id(info):
q = Item.objects.all()
for key in ('title', 'director', 'year'):
@ -270,7 +275,7 @@ class Item(models.Model):
if key in self.data:
del self.data[key]
else:
k = filter(lambda i: i['id'] == key, settings.CONFIG['itemKeys'])
k = list(filter(lambda i: i['id'] == key, settings.CONFIG['itemKeys']))
ktype = k and k[0].get('type') or ''
if ktype == 'text':
self.data[key] = ox.sanitize_html(data[key])
@ -280,11 +285,11 @@ class Item(models.Model):
self.data[key] = [ox.escape_html(t) for t in data[key]]
elif key in ('episodeTitle', 'seriesTitle', 'episodeDirector', 'seriesYear'):
self.data[key] = ox.escape_html(data[key])
elif isinstance(data[key], basestring):
elif isinstance(data[key], string_types):
self.data[key] = ox.escape_html(data[key])
elif isinstance(data[key], list):
def cleanup(i):
if isinstance(i, basestring):
if isinstance(i, string_types):
i = ox.escape_html(i)
return i
self.data[key] = [cleanup(i) for i in data[key]]
@ -314,9 +319,9 @@ class Item(models.Model):
def expand_connections(self):
c = self.get('connections')
if c:
for t in c.keys():
for t in list(c):
if c[t]:
if isinstance(c[t][0], basestring):
if isinstance(c[t][0], string_types):
c[t] = [{'id': i, 'title': None} for i in c[t]]
ids = [i['id'] for i in c[t]]
known = {}
@ -442,7 +447,7 @@ class Item(models.Model):
def delete_files(self):
path = os.path.join(settings.MEDIA_ROOT, self.path())
if isinstance(path, unicode):
if not isinstance(path, bytes):
path = path.encode('utf-8')
if os.path.exists(path):
shutil.rmtree(path)
@ -498,7 +503,7 @@ class Item(models.Model):
if settings.DATA_SERVICE:
url = self.prefered_poster_url()
external_posters = self.external_data.get('posters', {})
services = external_posters.keys()
services = list(external_posters)
for service in settings.POSTER_PRECEDENCE:
if service in services:
index.append(service)
@ -593,7 +598,7 @@ class Item(models.Model):
if value:
i[key] = value
if 'cast' in i and isinstance(i['cast'][0], basestring):
if 'cast' in i and isinstance(i['cast'][0], string_types):
i['cast'] = [i['cast']]
if 'cast' in i and isinstance(i['cast'][0], list):
i['cast'] = [{'actor': x[0], 'character': x[1]} for x in i['cast']]
@ -639,7 +644,7 @@ class Item(models.Model):
if keys and 'frames' in keys:
i['frames'] = frames
selected_frame = filter(lambda f: f['selected'], frames)
selected_frame = [f for f in frames if f['selected']]
if selected_frame:
i['posterFrame'] = selected_frame[0]['position']
elif self.poster_frame != -1.0:
@ -650,7 +655,7 @@ class Item(models.Model):
if keys:
dkeys = filter(lambda k: k in keys, dkeys)
for key in dkeys:
k = filter(lambda i: i['id'] == key, settings.CONFIG['itemKeys'])
k = list(filter(lambda i: i['id'] == key, settings.CONFIG['itemKeys']))
if isinstance((k and k[0].get('type') or ''), list):
i['%sdescription' % key] = {}
if key == 'name':
@ -760,7 +765,7 @@ class Item(models.Model):
f, created = ItemFind.objects.get_or_create(item=self, key=key)
if isinstance(value, bool):
value = value and 'true' or 'false'
if isinstance(value, basestring):
if isinstance(value, string_types):
value = ox.decode_html(ox.strip_tags(value.strip()))
value = unicodedata.normalize('NFKD', value).lower()
f.value = value
@ -879,7 +884,7 @@ class Item(models.Model):
return sort_value
def set_value(s, name, value):
if isinstance(value, basestring):
if isinstance(value, string_types):
value = ox.decode_html(value.lower())
if not value:
value = None
@ -1011,7 +1016,7 @@ class Item(models.Model):
set_value(s, name, value)
elif sort_type == 'date':
value = self.get(source)
if isinstance(value, basestring):
if isinstance(value, string_types):
value = datetime_safe.datetime.strptime(value, '%Y-%m-%d')
set_value(s, name, value)
@ -1045,6 +1050,7 @@ class Item(models.Model):
current_values = []
else:
current_values = [unicode(current_values)]
filter_map = utils.get_by_id(settings.CONFIG['itemKeys'], key).get('filterMap')
if filter_map:
filter_map = re.compile(filter_map)
@ -1231,7 +1237,7 @@ class Item(models.Model):
return
base = self.path('torrent')
base = os.path.abspath(os.path.join(settings.MEDIA_ROOT, base))
if isinstance(base, unicode):
if not isinstance(base, bytes):
base = base.encode('utf-8')
if os.path.exists(base):
shutil.rmtree(base)
@ -1250,9 +1256,9 @@ class Item(models.Model):
quote(filename.encode('utf-8')),
extension)
video = "%s.%s" % (base, extension)
if isinstance(media_path, unicode):
if not isinstance(media_path, bytes):
media_path = media_path.encode('utf-8')
if isinstance(video, unicode):
if not isinstance(video, bytes):
video = video.encode('utf-8')
media_path = os.path.relpath(media_path, os.path.dirname(video))
os.symlink(media_path, video)
@ -1267,9 +1273,9 @@ class Item(models.Model):
extension = media_path.split('.')[-1]
video = "%s/%s.Part %d.%s" % (base, filename, part, extension)
part += 1
if isinstance(media_path, unicode):
if not isinstance(media_path, bytes):
media_path = media_path.encode('utf-8')
if isinstance(video, unicode):
if not isinstance(video, bytes):
video = video.encode('utf-8')
media_path = os.path.relpath(media_path, os.path.dirname(video))
os.symlink(media_path, video)
@ -1360,7 +1366,7 @@ class Item(models.Model):
def save_poster(self, data):
self.poster.name = self.path('poster.jpg')
poster = self.poster.path
with open(poster, 'w') as f:
with open(poster, 'wb') as f:
f.write(data)
self.poster_height = self.poster.height
self.poster_width = self.poster.width
@ -1425,7 +1431,7 @@ class Item(models.Model):
data = ox.net.read_url(url)
self.save_poster(data)
elif os.path.exists(poster):
with open(poster) as f:
with open(poster, 'rb') as f:
data = f.read()
if data:
self.save_poster(data)
@ -1450,7 +1456,7 @@ class Item(models.Model):
data['oxdbId'] = self.oxdbId or self.oxdb_id() or self.public_id
ox.makedirs(os.path.join(settings.MEDIA_ROOT, self.path()))
p = subprocess.Popen(cmd, stdin=subprocess.PIPE, close_fds=True)
p.communicate(json.dumps(data, default=fields.to_json))
p.communicate(json.dumps(data, default=fields.to_json).encode('utf-8'))
self.clear_poster_cache(poster)
return poster

View file

@ -1,5 +1,7 @@
# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
from __future__ import division, print_function, absolute_import
import os
from datetime import timedelta, datetime
import gzip
@ -15,8 +17,6 @@ from app.utils import limit_rate
from text.models import Text
from taskqueue.models import Task
import models
@periodic_task(run_every=timedelta(days=1), queue='encoding')
def cronjob(**kwargs):
@ -25,6 +25,7 @@ def cronjob(**kwargs):
update_random_clip_sort()
def update_random_sort():
from . import models
if filter(lambda f: f['id'] == 'random', settings.CONFIG['itemKeys']):
random.seed()
ids = [f['item'] for f in models.ItemSort.objects.values('item')]
@ -52,11 +53,13 @@ def update_random_clip_sort():
@task(ignore_results=True, queue='default')
def update_clips(public_id):
from . import models
item = models.Item.objects.get(public_id=public_id)
item.clips.all().update(user=item.user.id)
@task(ignore_results=True, queue='default')
def update_poster(public_id):
from . import models
item = models.Item.objects.get(public_id=public_id)
item.remove_poster()
item.make_poster()
@ -71,22 +74,26 @@ def update_poster(public_id):
@task(ignore_results=True, queue='default')
def update_file_paths(public_id):
from . import models
item = models.Item.objects.get(public_id=public_id)
item.update_file_paths()
@task(ignore_results=True, queue='default')
def update_external(public_id):
from . import models
item = models.Item.objects.get(public_id=public_id)
item.update_external()
@task(queue="encoding")
def update_timeline(public_id):
from . import models
item = models.Item.objects.get(public_id=public_id)
item.update_timeline(async=False)
Task.finish(item)
@task(queue="encoding")
def rebuild_timeline(public_id):
from . import models
i = models.Item.objects.get(public_id=public_id)
for s in i.streams():
s.make_timeline()
@ -94,6 +101,7 @@ def rebuild_timeline(public_id):
@task(queue="encoding")
def load_subtitles(public_id):
from . import models
item = models.Item.objects.get(public_id=public_id)
if item.load_subtitles():
item.update_find()
@ -102,6 +110,7 @@ def load_subtitles(public_id):
@task(ignore_results=True, queue='default')
def update_sitemap(base_url):
from . import models
sitemap = os.path.abspath(os.path.join(settings.MEDIA_ROOT, 'sitemap.xml.gz'))
def absolute_url(url):

View file

@ -53,8 +53,8 @@ def plural_key(term):
def sort_title(title):
title = title.replace(u'Æ', 'Ae')
if isinstance(title, str):
title = unicode(title)
if isinstance(title, bytes):
title = title.decode('utf-8')
title = sort_string(title)
#title

View file

@ -1,13 +1,14 @@
# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
from __future__ import division, print_function
from __future__ import division, print_function, absolute_import
import os.path
import mimetypes
import random
from urlparse import urlparse
from urllib import quote
import time
from six import PY2
from six.moves.urllib.parse import quote, urlparse
from PIL import Image
from django.db.models import Count, Sum
from django.http import HttpResponse, HttpResponseForbidden, Http404
@ -23,9 +24,9 @@ from oxdjango.shortcuts import render_to_json_response, get_object_or_404_json,
from oxdjango.http import HttpFileResponse
import ox
import models
import utils
import tasks
from . import models
from . import utils
from . import tasks
from archive.models import File, Stream
from archive import extract
@ -35,6 +36,8 @@ from changelog.models import add_changelog
from oxdjango.api import actions
if not PY2:
unicode = str
def _order_query(qs, sort, prefix='sort__'):
order_by = []
@ -869,6 +872,7 @@ def timeline(request, id, size, position=-1, format='jpg', mode=None):
modes.pop(modes.index(mode))
prefix = os.path.join(item.timeline_prefix, 'timeline')
position = int(position)
def timeline():
timeline = '%s%s%sp' % (prefix, mode, size)