diff --git a/pandora/annotation/managers.py b/pandora/annotation/managers.py
index 5010bd3e..65c16bc6 100644
--- a/pandora/annotation/managers.py
+++ b/pandora/annotation/managers.py
@@ -3,7 +3,7 @@
import unicodedata
from django.db.models import Q, Manager
-from ox.django.query import QuerySet
+from oxdjango.query import QuerySet
from item.utils import decode_id
diff --git a/pandora/annotation/views.py b/pandora/annotation/views.py
index 3520bb72..0f71c907 100644
--- a/pandora/annotation/views.py
+++ b/pandora/annotation/views.py
@@ -6,11 +6,11 @@ from django.conf import settings
import ox
from ox.utils import json
-from ox.django.decorators import login_required_json
-from ox.django.shortcuts import render_to_json_response, get_object_or_404_json, json_response, HttpErrorJson
+from oxdjango.decorators import login_required_json
+from oxdjango.shortcuts import render_to_json_response, get_object_or_404_json, json_response, HttpErrorJson
-from ox.django.api import actions
+from oxdjango.api import actions
from item import utils
from item.models import Item
diff --git a/pandora/app/views.py b/pandora/app/views.py
index 3fd0cd80..417fb557 100644
--- a/pandora/app/views.py
+++ b/pandora/app/views.py
@@ -7,8 +7,8 @@ from django.shortcuts import render, redirect
from django.conf import settings
from django.http import HttpResponse
-from ox.django.shortcuts import json_response, render_to_json_response
-from ox.django.decorators import login_required_json
+from oxdjango.shortcuts import json_response, render_to_json_response
+from oxdjango.decorators import login_required_json
import ox
from ox.utils import json, ET
@@ -18,7 +18,7 @@ import models
from user.models import init_user
from changelog.models import add_changelog
-from ox.django.api import actions
+from oxdjango.api import actions
def intro(request):
return render(request, 'intro.html', {'settings': settings})
diff --git a/pandora/archive/migrations/0001_initial.py b/pandora/archive/migrations/0001_initial.py
index 653119e6..1acc3379 100644
--- a/pandora/archive/migrations/0001_initial.py
+++ b/pandora/archive/migrations/0001_initial.py
@@ -6,7 +6,7 @@ import archive.models
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
-import ox.django.fields
+import oxdjango.fields
class Migration(migrations.Migration):
@@ -35,7 +35,7 @@ class Migration(migrations.Migration):
('version', models.CharField(default=b'', max_length=255, null=True)),
('size', models.BigIntegerField(default=0)),
('duration', models.FloatField(null=True)),
- ('info', ox.django.fields.DictField(default={})),
+ ('info', oxdjango.fields.DictField(default={})),
('video_codec', models.CharField(max_length=255)),
('pixel_format', models.CharField(max_length=255)),
('display_aspect_ratio', models.CharField(max_length=255)),
@@ -96,11 +96,11 @@ class Migration(migrations.Migration):
('media', models.FileField(blank=True, default=None, upload_to=archive.models.get_path)),
('available', models.BooleanField(default=False)),
('oshash', models.CharField(db_index=True, max_length=16, null=True)),
- ('info', ox.django.fields.DictField(default={})),
+ ('info', oxdjango.fields.DictField(default={})),
('duration', models.FloatField(default=0)),
('aspect_ratio', models.FloatField(default=0)),
- ('cuts', ox.django.fields.TupleField(default=[])),
- ('color', ox.django.fields.TupleField(default=[])),
+ ('cuts', oxdjango.fields.TupleField(default=[])),
+ ('color', oxdjango.fields.TupleField(default=[])),
('volume', models.FloatField(default=0)),
('error', models.TextField(blank=True, default=b'')),
('file', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='streams', to='archive.File')),
diff --git a/pandora/archive/models.py b/pandora/archive/models.py
index a10dc86a..abc171ad 100644
--- a/pandora/archive/models.py
+++ b/pandora/archive/models.py
@@ -12,7 +12,7 @@ from django.contrib.auth.models import User
from django.db import models
from django.db.models.signals import pre_delete
-from ox.django import fields
+from oxdjango import fields
import ox
import ox.iso
diff --git a/pandora/archive/views.py b/pandora/archive/views.py
index 3d031dab..48d17c69 100644
--- a/pandora/archive/views.py
+++ b/pandora/archive/views.py
@@ -4,22 +4,21 @@ from __future__ import division
import os.path
from datetime import datetime
-from django import forms
from django.shortcuts import get_object_or_404, redirect, render
from django.conf import settings
from django.db.models import Count, Q
+from celery.utils import get_full_cls_name
+from celery.backends import default_backend
import ox
-from ox.utils import json
-from ox.django.decorators import login_required_json
-from ox.django.shortcuts import render_to_json_response, get_object_or_404_json, json_response
-from ox.django.views import task_status
+from oxdjango.decorators import login_required_json
+from oxdjango.shortcuts import render_to_json_response, get_object_or_404_json, json_response
from item import utils
from item.models import get_item, Item
from item.views import parse_query
import item.tasks
-from ox.django.api import actions
+from oxdjango.api import actions
from changelog.models import add_changelog
import models
@@ -358,7 +357,21 @@ def taskStatus(request, data):
task_id = data['taskId']
else:
task_id = data['task_id']
- response = task_status(request, task_id)
+ response = json_response(status=200, text='ok')
+ status = default_backend.get_status(task_id)
+ res = default_backend.get_result(task_id)
+ response['data'] = {
+ 'id': task_id,
+ 'status': status,
+ 'result': res
+ }
+ if status in default_backend.EXCEPTION_STATES:
+ traceback = default_backend.get_traceback(task_id)
+ response['data'].update({
+ 'result': str(res.args[0]),
+ 'exc': get_full_cls_name(res.__class__),
+ 'traceback': traceback
+ })
return render_to_json_response(response)
actions.register(taskStatus, cache=False)
diff --git a/pandora/changelog/managers.py b/pandora/changelog/managers.py
index 3a3151bc..ac227dd7 100644
--- a/pandora/changelog/managers.py
+++ b/pandora/changelog/managers.py
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
from django.db.models import Q, Manager
-from ox.django.query import QuerySet
+from oxdjango.query import QuerySet
from item.utils import decode_id
diff --git a/pandora/changelog/migrations/0001_initial.py b/pandora/changelog/migrations/0001_initial.py
index e76c111c..fc7c599e 100644
--- a/pandora/changelog/migrations/0001_initial.py
+++ b/pandora/changelog/migrations/0001_initial.py
@@ -5,7 +5,7 @@ from __future__ import unicode_literals
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
-import ox.django.fields
+import oxdjango.fields
class Migration(migrations.Migration):
@@ -23,7 +23,7 @@ class Migration(migrations.Migration):
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created', models.DateTimeField(auto_now_add=True)),
('type', models.CharField(db_index=True, max_length=255)),
- ('value', ox.django.fields.DictField(default={})),
+ ('value', oxdjango.fields.DictField(default={})),
],
),
migrations.CreateModel(
@@ -31,7 +31,7 @@ class Migration(migrations.Migration):
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('action', models.CharField(db_index=True, max_length=255)),
- ('data', ox.django.fields.DictField(default={})),
+ ('data', oxdjango.fields.DictField(default={})),
('created', models.DateTimeField(db_index=True)),
('changeid', models.TextField()),
('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='changelog', to=settings.AUTH_USER_MODEL)),
diff --git a/pandora/changelog/models.py b/pandora/changelog/models.py
index d7f28fe2..f52585e4 100644
--- a/pandora/changelog/models.py
+++ b/pandora/changelog/models.py
@@ -6,7 +6,7 @@ from datetime import datetime
from django.contrib.auth.models import User
from django.db import models
-from ox.django import fields
+from oxdjango import fields
import ox
import websocket
diff --git a/pandora/changelog/views.py b/pandora/changelog/views.py
index 3d92aabd..6695d8a8 100644
--- a/pandora/changelog/views.py
+++ b/pandora/changelog/views.py
@@ -4,10 +4,10 @@ from __future__ import division
import ox
-from ox.django.decorators import admin_required_json
-from ox.django.shortcuts import render_to_json_response, json_response
+from oxdjango.decorators import admin_required_json
+from oxdjango.shortcuts import render_to_json_response, json_response
-from ox.django.api import actions
+from oxdjango.api import actions
from item import utils
from user.decorators import capability_required_json
diff --git a/pandora/clip/managers.py b/pandora/clip/managers.py
index 728d50a1..d855ccbc 100644
--- a/pandora/clip/managers.py
+++ b/pandora/clip/managers.py
@@ -5,7 +5,7 @@ import unicodedata
from django.db.models import Q, Manager
from django.conf import settings
-from ox.django.query import QuerySet
+from oxdjango.query import QuerySet
from item.utils import decode_id, get_by_id
diff --git a/pandora/clip/views.py b/pandora/clip/views.py
index c9f17b09..af7907c3 100644
--- a/pandora/clip/views.py
+++ b/pandora/clip/views.py
@@ -4,9 +4,9 @@ from __future__ import division
from django.conf import settings
from ox.utils import json
-from ox.django.shortcuts import render_to_json_response, json_response
+from oxdjango.shortcuts import render_to_json_response, json_response
-from ox.django.api import actions
+from oxdjango.api import actions
from annotation.models import Annotation
from item.models import Item
diff --git a/pandora/document/managers.py b/pandora/document/managers.py
index 2ea50795..283a148a 100644
--- a/pandora/document/managers.py
+++ b/pandora/document/managers.py
@@ -3,7 +3,7 @@
from django.db.models import Q, Manager
import ox
-from ox.django.query import QuerySet
+from oxdjango.query import QuerySet
def parseCondition(condition, user, item=None):
'''
diff --git a/pandora/document/views.py b/pandora/document/views.py
index c2c36129..66a01e59 100644
--- a/pandora/document/views.py
+++ b/pandora/document/views.py
@@ -6,10 +6,10 @@ from glob import glob
import ox
from ox.utils import json
-from ox.django.api import actions
-from ox.django.decorators import login_required_json
-from ox.django.http import HttpFileResponse
-from ox.django.shortcuts import render_to_json_response, get_object_or_404_json, json_response, HttpErrorJson
+from oxdjango.api import actions
+from oxdjango.decorators import login_required_json
+from oxdjango.http import HttpFileResponse
+from oxdjango.shortcuts import render_to_json_response, get_object_or_404_json, json_response, HttpErrorJson
from django import forms
from django.db.models import Sum
diff --git a/pandora/edit/managers.py b/pandora/edit/managers.py
index 8727f59d..7d0fe874 100644
--- a/pandora/edit/managers.py
+++ b/pandora/edit/managers.py
@@ -2,7 +2,7 @@
# vi:si:et:sw=4:sts=4:ts=4
from django.db.models import Q, Manager
-from ox.django.query import QuerySet
+from oxdjango.query import QuerySet
def parseCondition(condition, user):
diff --git a/pandora/edit/migrations/0001_initial.py b/pandora/edit/migrations/0001_initial.py
index cb4e3a58..3028e2a0 100644
--- a/pandora/edit/migrations/0001_initial.py
+++ b/pandora/edit/migrations/0001_initial.py
@@ -6,7 +6,7 @@ from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import edit.models
-import ox.django.fields
+import oxdjango.fields
class Migration(migrations.Migration):
@@ -47,10 +47,10 @@ class Migration(migrations.Migration):
('status', models.CharField(default=b'private', max_length=20)),
('description', models.TextField(default=b'')),
('rightslevel', models.IntegerField(db_index=True, default=0)),
- ('query', ox.django.fields.DictField(default={b'static': True})),
+ ('query', oxdjango.fields.DictField(default={b'static': True})),
('type', models.CharField(default=b'static', max_length=255)),
('icon', models.ImageField(blank=True, default=None, null=True, upload_to=edit.models.get_icon_path)),
- ('poster_frames', ox.django.fields.TupleField(default=[], editable=False)),
+ ('poster_frames', oxdjango.fields.TupleField(default=[], editable=False)),
('subscribed_users', models.ManyToManyField(related_name='subscribed_edits', to=settings.AUTH_USER_MODEL)),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='edits', to=settings.AUTH_USER_MODEL)),
],
diff --git a/pandora/edit/models.py b/pandora/edit/models.py
index d1945926..e39d5805 100644
--- a/pandora/edit/models.py
+++ b/pandora/edit/models.py
@@ -11,7 +11,7 @@ from urllib import quote
import tempfile
import ox
-from ox.django.fields import DictField, TupleField
+from oxdjango.fields import DictField, TupleField
from django.conf import settings
from django.db import models, transaction
from django.db.models import Max
diff --git a/pandora/edit/views.py b/pandora/edit/views.py
index 413e4c2f..34400a2e 100644
--- a/pandora/edit/views.py
+++ b/pandora/edit/views.py
@@ -5,12 +5,12 @@ import os
import re
import ox
-from ox.django.decorators import login_required_json
-from ox.django.shortcuts import render_to_json_response, get_object_or_404_json, json_response
+from oxdjango.decorators import login_required_json
+from oxdjango.shortcuts import render_to_json_response, get_object_or_404_json, json_response
from django.db import transaction
from django.db.models import Max
-from ox.django.http import HttpFileResponse
-from ox.django.api import actions
+from oxdjango.http import HttpFileResponse
+from oxdjango.api import actions
from django.conf import settings
from item import utils
diff --git a/pandora/entity/managers.py b/pandora/entity/managers.py
index f1518e58..03bede0b 100644
--- a/pandora/entity/managers.py
+++ b/pandora/entity/managers.py
@@ -3,7 +3,7 @@
from django.db.models import Q, Manager
import ox
-from ox.django.query import QuerySet
+from oxdjango.query import QuerySet
def namePredicate(op, value):
diff --git a/pandora/entity/migrations/0001_initial.py b/pandora/entity/migrations/0001_initial.py
index 8a42e100..943f375e 100644
--- a/pandora/entity/migrations/0001_initial.py
+++ b/pandora/entity/migrations/0001_initial.py
@@ -5,7 +5,7 @@ from __future__ import unicode_literals
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
-import ox.django.fields
+import oxdjango.fields
class Migration(migrations.Migration):
@@ -36,8 +36,8 @@ class Migration(migrations.Migration):
('modified', models.DateTimeField(auto_now=True)),
('type', models.CharField(max_length=255)),
('name', models.CharField(max_length=255)),
- ('alternativeNames', ox.django.fields.TupleField(default=[])),
- ('data', ox.django.fields.DictField(default={}, editable=False)),
+ ('alternativeNames', oxdjango.fields.TupleField(default=[])),
+ ('data', oxdjango.fields.DictField(default={}, editable=False)),
('matches', models.IntegerField(default=0)),
('name_sort', models.CharField(max_length=255, null=True)),
('name_find', models.TextField(default=b'')),
diff --git a/pandora/entity/models.py b/pandora/entity/models.py
index 90bf44eb..0b912614 100644
--- a/pandora/entity/models.py
+++ b/pandora/entity/models.py
@@ -14,7 +14,7 @@ from django.db.models.signals import pre_delete, post_init
from django.conf import settings
import ox
-from ox.django import fields
+from oxdjango import fields
from person.models import get_name_sort
from item.utils import get_by_id
diff --git a/pandora/entity/views.py b/pandora/entity/views.py
index ed81b87e..76561cbd 100644
--- a/pandora/entity/views.py
+++ b/pandora/entity/views.py
@@ -4,10 +4,10 @@ from __future__ import division
import ox
from ox.utils import json
-from ox.django.api import actions
-from ox.django.decorators import login_required_json
-from ox.django.http import HttpFileResponse
-from ox.django.shortcuts import render_to_json_response, get_object_or_404_json, json_response, HttpErrorJson
+from oxdjango.api import actions
+from oxdjango.decorators import login_required_json
+from oxdjango.http import HttpFileResponse
+from oxdjango.shortcuts import render_to_json_response, get_object_or_404_json, json_response, HttpErrorJson
from django import forms
from django.conf import settings
diff --git a/pandora/event/managers.py b/pandora/event/managers.py
index ca214f11..336e9e23 100644
--- a/pandora/event/managers.py
+++ b/pandora/event/managers.py
@@ -3,7 +3,7 @@
import unicodedata
from django.db.models import Q, Manager
-from ox.django.query import QuerySet
+from oxdjango.query import QuerySet
from item.utils import decode_id
diff --git a/pandora/event/migrations/0001_initial.py b/pandora/event/migrations/0001_initial.py
index 2834a433..4cf26703 100644
--- a/pandora/event/migrations/0001_initial.py
+++ b/pandora/event/migrations/0001_initial.py
@@ -3,7 +3,7 @@
from __future__ import unicode_literals
from django.db import migrations, models
-import ox.django.fields
+import oxdjango.fields
class Migration(migrations.Migration):
@@ -26,7 +26,7 @@ class Migration(migrations.Migration):
('name_sort', models.CharField(db_index=True, max_length=255, null=True)),
('name_find', models.TextField(default=b'')),
('wikipediaId', models.CharField(blank=True, max_length=1000)),
- ('alternativeNames', ox.django.fields.TupleField(default=[])),
+ ('alternativeNames', oxdjango.fields.TupleField(default=[])),
('start', models.CharField(default=b'', max_length=255)),
('startTime', models.BigIntegerField(default=None, null=True)),
('end', models.CharField(default=b'', max_length=255)),
diff --git a/pandora/event/models.py b/pandora/event/models.py
index 4bf951f4..81a528e6 100644
--- a/pandora/event/models.py
+++ b/pandora/event/models.py
@@ -5,7 +5,7 @@ from __future__ import division, with_statement
from django.db import models, transaction
from django.contrib.auth.models import User
import ox
-from ox.django import fields
+from oxdjango import fields
from annotation.models import Annotation, get_matches, get_super_matches
from item.models import Item
diff --git a/pandora/event/views.py b/pandora/event/views.py
index deb7db8b..4513196a 100644
--- a/pandora/event/views.py
+++ b/pandora/event/views.py
@@ -7,10 +7,10 @@ from django.conf import settings
import ox
from ox.utils import json
-from ox.django.decorators import login_required_json
-from ox.django.shortcuts import render_to_json_response, get_object_or_404_json, json_response
+from oxdjango.decorators import login_required_json
+from oxdjango.shortcuts import render_to_json_response, get_object_or_404_json, json_response
-from ox.django.api import actions
+from oxdjango.api import actions
from item import utils
from changelog.models import add_changelog
diff --git a/pandora/item/managers.py b/pandora/item/managers.py
index 485f11ed..a3e2a171 100644
--- a/pandora/item/managers.py
+++ b/pandora/item/managers.py
@@ -12,7 +12,7 @@ from django.contrib.auth.models import Group
import models
import utils
-from ox.django.query import QuerySet
+from oxdjango.query import QuerySet
def get_operator(op, type='str'):
return {
diff --git a/pandora/item/migrations/0001_initial.py b/pandora/item/migrations/0001_initial.py
index 021e910a..ef095583 100644
--- a/pandora/item/migrations/0001_initial.py
+++ b/pandora/item/migrations/0001_initial.py
@@ -6,7 +6,7 @@ from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import item.models
-import ox.django.fields
+import oxdjango.fields
class Migration(migrations.Migration):
@@ -62,9 +62,9 @@ class Migration(migrations.Migration):
('level', models.IntegerField(db_index=True)),
('public_id', models.CharField(blank=True, max_length=128, unique=True)),
('oxdbId', models.CharField(blank=True, max_length=42, null=True, unique=True)),
- ('external_data', ox.django.fields.DictField(default={}, editable=False)),
- ('data', ox.django.fields.DictField(default={}, editable=False)),
- ('json', ox.django.fields.DictField(default={}, editable=False)),
+ ('external_data', oxdjango.fields.DictField(default={}, editable=False)),
+ ('data', oxdjango.fields.DictField(default={}, editable=False)),
+ ('json', oxdjango.fields.DictField(default={}, editable=False)),
('poster', models.ImageField(blank=True, default=None, upload_to=item.models.get_poster_path)),
('poster_source', models.TextField(blank=True)),
('poster_height', models.IntegerField(default=0)),
@@ -72,7 +72,7 @@ class Migration(migrations.Migration):
('poster_frame', models.FloatField(default=-1)),
('icon', models.ImageField(blank=True, default=None, upload_to=item.models.get_icon_path)),
('torrent', models.FileField(blank=True, default=None, max_length=1000, upload_to=item.models.get_torrent_path)),
- ('stream_info', ox.django.fields.DictField(default={}, editable=False)),
+ ('stream_info', oxdjango.fields.DictField(default={}, editable=False)),
('stream_aspect', models.FloatField(default=1.3333333333333333)),
],
),
diff --git a/pandora/item/models.py b/pandora/item/models.py
index 0fa59332..0fd1eae8 100644
--- a/pandora/item/models.py
+++ b/pandora/item/models.py
@@ -22,7 +22,7 @@ from django.db.models.signals import pre_delete
from django.utils import datetime_safe
import ox
-from ox.django import fields
+from oxdjango import fields
import ox.web.imdb
import ox.image
diff --git a/pandora/item/views.py b/pandora/item/views.py
index 7acd6fdf..9c3cc93a 100644
--- a/pandora/item/views.py
+++ b/pandora/item/views.py
@@ -18,9 +18,9 @@ from django.conf import settings
from ox.utils import json, ET
-from ox.django.decorators import login_required_json
-from ox.django.shortcuts import render_to_json_response, get_object_or_404_json, json_response
-from ox.django.http import HttpFileResponse
+from oxdjango.decorators import login_required_json
+from oxdjango.shortcuts import render_to_json_response, get_object_or_404_json, json_response
+from oxdjango.http import HttpFileResponse
import ox
import models
@@ -33,7 +33,7 @@ from clip.models import Clip
from user.models import has_capability
from changelog.models import add_changelog
-from ox.django.api import actions
+from oxdjango.api import actions
def _order_query(qs, sort, prefix='sort__'):
@@ -241,7 +241,7 @@ def find(request, data):
r = {}
if m:
if not isinstance(m, dict):
- m = json.loads(m, object_hook=ox.django.fields.from_json)
+ m = json.loads(m, object_hook=oxdjango.fields.from_json)
for p in _p:
r[p] = m.get(p)
if 'clip_qs' in query:
diff --git a/pandora/itemlist/managers.py b/pandora/itemlist/managers.py
index eef5d6d9..2e95e321 100644
--- a/pandora/itemlist/managers.py
+++ b/pandora/itemlist/managers.py
@@ -3,7 +3,7 @@
from django.db.models import Q, Manager
-from ox.django.query import QuerySet
+from oxdjango.query import QuerySet
def parseCondition(condition, user):
'''
diff --git a/pandora/itemlist/migrations/0001_initial.py b/pandora/itemlist/migrations/0001_initial.py
index f41745a4..d4581e17 100644
--- a/pandora/itemlist/migrations/0001_initial.py
+++ b/pandora/itemlist/migrations/0001_initial.py
@@ -6,7 +6,7 @@ from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import itemlist.models
-import ox.django.fields
+import oxdjango.fields
class Migration(migrations.Migration):
@@ -27,13 +27,13 @@ class Migration(migrations.Migration):
('modified', models.DateTimeField(auto_now=True)),
('name', models.CharField(max_length=255)),
('status', models.CharField(default=b'private', max_length=20)),
- ('query', ox.django.fields.DictField(default={b'static': True})),
+ ('query', oxdjango.fields.DictField(default={b'static': True})),
('type', models.CharField(default=b'static', max_length=255)),
('description', models.TextField(default=b'')),
('icon', models.ImageField(blank=True, default=None, upload_to=itemlist.models.get_icon_path)),
('view', models.TextField(default=itemlist.models.get_listview)),
- ('sort', ox.django.fields.TupleField(default=itemlist.models.get_listsort, editable=False)),
- ('poster_frames', ox.django.fields.TupleField(default=[], editable=False)),
+ ('sort', oxdjango.fields.TupleField(default=itemlist.models.get_listsort, editable=False)),
+ ('poster_frames', oxdjango.fields.TupleField(default=[], editable=False)),
('numberofitems', models.IntegerField(default=0)),
],
),
diff --git a/pandora/itemlist/models.py b/pandora/itemlist/models.py
index e869874a..54820219 100644
--- a/pandora/itemlist/models.py
+++ b/pandora/itemlist/models.py
@@ -12,7 +12,7 @@ from django.contrib.auth.models import User
from django.conf import settings
import ox
-from ox.django.fields import DictField, TupleField
+from oxdjango.fields import DictField, TupleField
from archive import extract
import managers
diff --git a/pandora/itemlist/views.py b/pandora/itemlist/views.py
index 6696a03e..bf9f3001 100644
--- a/pandora/itemlist/views.py
+++ b/pandora/itemlist/views.py
@@ -8,13 +8,13 @@ from django.db.models import Max, Sum
from django.db import transaction
from django.conf import settings
from ox.utils import json
-from ox.django.decorators import login_required_json
-from ox.django.shortcuts import render_to_json_response, get_object_or_404_json, json_response
-from ox.django.http import HttpFileResponse
+from oxdjango.decorators import login_required_json
+from oxdjango.shortcuts import render_to_json_response, get_object_or_404_json, json_response
+from oxdjango.http import HttpFileResponse
import models
-from ox.django.api import actions
+from oxdjango.api import actions
from item import utils
from item.models import Item
from user.tasks import update_numberoflists
diff --git a/pandora/log/managers.py b/pandora/log/managers.py
index 1775fe27..98f75064 100644
--- a/pandora/log/managers.py
+++ b/pandora/log/managers.py
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
from django.db.models import Q, Manager
-from ox.django.query import QuerySet
+from oxdjango.query import QuerySet
from item.utils import decode_id
diff --git a/pandora/log/views.py b/pandora/log/views.py
index 890a3770..48592d94 100644
--- a/pandora/log/views.py
+++ b/pandora/log/views.py
@@ -5,10 +5,10 @@ from __future__ import division
import ox
from ox.utils import json
-from ox.django.decorators import admin_required_json
-from ox.django.shortcuts import render_to_json_response, json_response
+from oxdjango.decorators import admin_required_json
+from oxdjango.shortcuts import render_to_json_response, json_response
-from ox.django.api import actions
+from oxdjango.api import actions
from item import utils
diff --git a/pandora/news/managers.py b/pandora/news/managers.py
index acf04515..aa332167 100644
--- a/pandora/news/managers.py
+++ b/pandora/news/managers.py
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
from django.db.models import Q, Manager
-from ox.django.query import QuerySet
+from oxdjango.query import QuerySet
from item.utils import decode_id
diff --git a/pandora/news/views.py b/pandora/news/views.py
index 07808929..f6cef078 100644
--- a/pandora/news/views.py
+++ b/pandora/news/views.py
@@ -4,11 +4,11 @@ from __future__ import division
import ox
from ox.utils import json
-from ox.django.decorators import login_required_json
-from ox.django.shortcuts import render_to_json_response, get_object_or_404_json, json_response
+from oxdjango.decorators import login_required_json
+from oxdjango.shortcuts import render_to_json_response, get_object_or_404_json, json_response
-from ox.django.api import actions
+from oxdjango.api import actions
from changelog.models import add_changelog
import models
diff --git a/pandora/oxdjango/__init__.py b/pandora/oxdjango/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/pandora/oxdjango/api/__init__.py b/pandora/oxdjango/api/__init__.py
new file mode 100644
index 00000000..cf410f8b
--- /dev/null
+++ b/pandora/oxdjango/api/__init__.py
@@ -0,0 +1 @@
+from actions import actions
diff --git a/pandora/oxdjango/api/actions.py b/pandora/oxdjango/api/actions.py
new file mode 100644
index 00000000..850ece41
--- /dev/null
+++ b/pandora/oxdjango/api/actions.py
@@ -0,0 +1,135 @@
+# -*- coding: utf-8 -*-
+# vi:si:et:sw=4:sts=4:ts=4
+from __future__ import division, with_statement
+import inspect
+import sys
+
+from django.conf import settings
+
+from ..shortcuts import render_to_json_response, json_response
+
+def autodiscover():
+ # Register api actions from all installed apps
+ from importlib import import_module
+ from django.utils.module_loading import module_has_submodule
+ for app in settings.INSTALLED_APPS:
+ if app != 'api':
+ mod = import_module(app)
+ try:
+ import_module('%s.views'%app)
+ except:
+ if module_has_submodule(mod, 'views'):
+ raise
+
+def trim(docstring):
+ if not docstring:
+ return ''
+ # Convert tabs to spaces (following the normal Python rules)
+ # and split into a list of lines:
+ lines = docstring.expandtabs().splitlines()
+ # Determine minimum indentation (first line doesn't count):
+ indent = sys.maxint
+ for line in lines[1:]:
+ stripped = line.lstrip()
+ if stripped:
+ indent = min(indent, len(line) - len(stripped))
+ # Remove indentation (first line is special):
+ trimmed = [lines[0].strip()]
+ if indent < sys.maxint:
+ for line in lines[1:]:
+ trimmed.append(line[indent:].rstrip())
+ # Strip off trailing and leading blank lines:
+ while trimmed and not trimmed[-1]:
+ trimmed.pop()
+ while trimmed and not trimmed[0]:
+ trimmed.pop(0)
+ # Return a single string:
+ return '\n'.join(trimmed)
+
+
+class ApiActions(dict):
+ properties = {}
+ versions = {}
+ def __init__(self):
+
+ def api(request, data):
+ '''
+ Returns a list of all api actions
+ takes {
+ code: boolean, // if true, return source code (optional)
+ docs: boolean // if true, return doc strings (optional)
+ }
+ returns {
+ actions: {
+ name: {
+ cache: boolean, // if false, don't cache results
+ code: string, // source code
+ doc: string // doc strings
+ },
+ ... // more actions
+ }
+ }
+ '''
+ docs = data.get('docs', False)
+ code = data.get('code', False)
+ version = getattr(request, 'version', None)
+ if version:
+ _actions = self.versions.get(version, {}).keys()
+ _actions = list(set(_actions + self.keys()))
+ else:
+ _actions = self.keys()
+ _actions.sort()
+ actions = {}
+ for a in _actions:
+ actions[a] = self.properties[a]
+ if docs:
+ actions[a]['doc'] = self.doc(a, version)
+ if code:
+ actions[a]['code'] = self.code(a, version)
+ response = json_response({'actions': actions})
+ return render_to_json_response(response)
+ self.register(api)
+
+ def doc(self, name, version=None):
+ if version:
+ f = self.versions[version].get(name, self.get(name))
+ else:
+ f = self[name]
+ return trim(f.__doc__)
+
+ def code(self, name, version=None):
+ if version:
+ f = self.versions[version].get(name, self.get(name))
+ else:
+ f = self[name]
+ if name != 'api' and hasattr(f, 'func_closure') and f.func_closure:
+ fc = filter(lambda c: hasattr(c.cell_contents, '__call__'), f.func_closure)
+ f = fc[len(fc)-1].cell_contents
+ info = f.func_code.co_filename[len(settings.PROJECT_ROOT)+1:]
+ info = u'%s:%s' % (info, f.func_code.co_firstlineno)
+ return info, trim(inspect.getsource(f))
+
+ def register(self, method, action=None, cache=True, version=None):
+ if not action:
+ action = method.func_name
+ if version:
+ if not version in self.versions:
+ self.versions[version] = {}
+ self.versions[version][action] = method
+ else:
+ self[action] = method
+ self.properties[action] = {'cache': cache}
+
+ def unregister(self, action):
+ if action in self:
+ del self[action]
+
+actions = ApiActions()
+
+def error(request, data):
+ '''
+ This action is used to test API error codes. It should return a 503 error.
+ '''
+ success = error_is_success
+ return render_to_json_response({})
+actions.register(error)
diff --git a/pandora/oxdjango/api/urls.py b/pandora/oxdjango/api/urls.py
new file mode 100644
index 00000000..5346a984
--- /dev/null
+++ b/pandora/oxdjango/api/urls.py
@@ -0,0 +1,13 @@
+# -*- coding: utf-8 -*-
+# vi:si:et:sw=4:sts=4:ts=4
+
+from django.conf.urls import url
+
+import views
+
+import actions
+actions.autodiscover()
+
+urlpatterns = [
+ url(r'^$', views.api),
+]
diff --git a/pandora/oxdjango/api/views.py b/pandora/oxdjango/api/views.py
new file mode 100644
index 00000000..43591edd
--- /dev/null
+++ b/pandora/oxdjango/api/views.py
@@ -0,0 +1,54 @@
+# -*- coding: utf-8 -*-
+# vi:si:et:sw=4:sts=4:ts=4
+from __future__ import division, with_statement
+
+import json
+
+from django.shortcuts import render_to_response
+from django.template import RequestContext
+from django.conf import settings
+
+from ..shortcuts import render_to_json_response, json_response
+
+from actions import actions
+
+def api(request):
+ if request.META['REQUEST_METHOD'] == "OPTIONS":
+ response = render_to_json_response({'status': {'code': 200,
+ 'text': 'use POST'}})
+ response['Access-Control-Allow-Origin'] = '*'
+ return response
+ if request.META['REQUEST_METHOD'] != "POST" or (
+ not 'action' in request.POST and request.META.get('CONTENT_TYPE') != 'application/json'
+ ):
+ methods = actions.keys()
+ api = []
+ for f in sorted(methods):
+ api.append({'name': f,
+ 'doc': actions.doc(f).replace('\n', '
\n')})
+ context = RequestContext(request, {
+ 'api': api,
+ 'settings': settings,
+ 'sitename': settings.SITENAME
+ })
+ return render_to_response('api.html', context)
+ if request.META.get('CONTENT_TYPE') == 'application/json':
+ r = json.loads(request.body)
+ action = r['action']
+ data = r.get('data', {})
+ else:
+ action = request.POST['action']
+ data = json.loads(request.POST.get('data', '{}'))
+ version = getattr(request, 'version', None)
+ if version:
+ f = actions.versions.get(version, {}).get(action, actions.get(action))
+ else:
+ f = actions.get(action)
+ if f:
+ response = f(request, data)
+ else:
+ response = render_to_json_response(json_response(status=400,
+ text='Unknown action %s' % action))
+ response['Access-Control-Allow-Origin'] = '*'
+ return response
+
diff --git a/pandora/oxdjango/decorators.py b/pandora/oxdjango/decorators.py
new file mode 100644
index 00000000..98aa9dd8
--- /dev/null
+++ b/pandora/oxdjango/decorators.py
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+# vi:si:et:sw=4:sts=4:ts=4
+
+try:
+ from django.contrib.auth.decorators import wraps
+except:
+ from django.utils.functional import wraps
+from shortcuts import render_to_json_response
+
+def login_required_json(function=None):
+ """
+ Decorator for views that checks that the user is logged in
+ return json error if not logged in.
+ """
+
+ def _wrapped_view(request, *args, **kwargs):
+ if request.user.is_authenticated():
+ return function(request, *args, **kwargs)
+ return render_to_json_response({'status': {'code': 401, 'text': 'login required'}})
+ return wraps(function)(_wrapped_view)
+
+def admin_required_json(function=None):
+ """
+ Decorator for views that checks that the user is logged in
+ return json error if not logged in.
+ """
+
+ def _wrapped_view(request, *args, **kwargs):
+ if request.user.is_authenticated() and request.user.profile.get_level() == 'admin':
+ return function(request, *args, **kwargs)
+ return render_to_json_response({'status': {'code': 403, 'text': 'permission denied'}})
+ return wraps(function)(_wrapped_view)
diff --git a/pandora/oxdjango/fields.py b/pandora/oxdjango/fields.py
new file mode 100644
index 00000000..31f957e1
--- /dev/null
+++ b/pandora/oxdjango/fields.py
@@ -0,0 +1,99 @@
+# -*- coding: utf-8 -*-
+# vi:si:et:sw=4:sts=4:ts=4
+import time
+import datetime
+import copy
+
+from django.db import models
+from django.utils import datetime_safe
+from six import string_types
+
+from ox.utils import json
+
+
+def to_json(python_object):
+ if isinstance(python_object, datetime.datetime):
+ if python_object.year < 1900:
+ tt = python_object.timetuple()
+ value = '%d-%02d-%02dT%02d:%02d%02dZ' % tuple(list(tt)[:6])
+ else:
+ value = python_object.strftime('%Y-%m-%dT%H:%M:%SZ')
+ return {'__class__': 'datetime.datetime',
+ '__value__': value}
+ if isinstance(python_object, datetime_safe.datetime):
+ return {'__class__': 'datetime.datetime',
+ '__value__': python_object.strftime('%Y-%m-%dT%H:%M:%SZ')}
+ if isinstance(python_object, time.struct_time):
+ return {'__class__': 'time.asctime',
+ '__value__': time.asctime(python_object)}
+ try:
+ if isinstance(python_object, bytes):
+ return {'__class__': 'bytes',
+ '__value__': list(python_object)}
+ except:
+ pass
+ raise TypeError(repr(python_object) + ' is not JSON serializable')
+
+def from_json(json_object):
+ if '__class__' in json_object:
+ if json_object['__class__'] == 'bytes':
+ return bytes(json_object['__value__'])
+ if json_object['__class__'] == 'datetime_safe.datetime' \
+ or json_object['__class__'] == 'datetime.datetime':
+ return datetime_safe.datetime.strptime(json_object['__value__'], '%Y-%m-%dT%H:%M:%SZ')
+ if json_object['__class__'] == 'time.asctime':
+ return time.strptime(json_object['__value__'])
+ return json_object
+
+class DictField(models.TextField):
+ _type = dict
+
+ def loads(self, value):
+ return json.loads(value, object_hook=from_json)
+
+ def dumps(self, obj):
+ return json.dumps(obj, default=to_json, ensure_ascii=False)
+
+ def from_db_value(self, value, expression, connection, context):
+ if value is None:
+ return value
+ if isinstance(value, self._type):
+ return value
+ try:
+ value = self.loads(value)
+ except:
+ raise Exception('failed to parse value: %s' % value)
+ if value is not None:
+ assert isinstance(value, self._type)
+ return value
+
+ def get_prep_value(self, value):
+ if isinstance(value, self._type):
+ value = self.dumps(value)
+ if value is not None:
+ assert isinstance(value, string_types)
+ value = models.TextField.get_prep_value(self, value)
+ return value
+
+ def get_default(self):
+ if self.has_default():
+ if callable(self.default):
+ return self.default()
+ return copy.deepcopy(self.default)
+ return super(DictField, self).get_default()
+
+class TupleField(DictField):
+ _type = (tuple, list)
+
+ def loads(self, value):
+ value = DictField.loads(self, value)
+ if isinstance(value, list):
+ value = tuple(value)
+ return value
+
+try:
+ from south.modelsinspector import add_introspection_rules
+ add_introspection_rules([], ["^oxdjango\.fields\.DictField"])
+ add_introspection_rules([], ["^oxdjango\.fields\.TupleField"])
+except:
+ pass
diff --git a/pandora/oxdjango/http.py b/pandora/oxdjango/http.py
new file mode 100644
index 00000000..aa76a651
--- /dev/null
+++ b/pandora/oxdjango/http.py
@@ -0,0 +1,58 @@
+# -*- coding: utf-8 -*-
+# vi:si:et:sw=4:sts=4:ts=4
+import os
+import mimetypes
+from datetime import datetime, timedelta
+from six.moves.urllib.parse import quote
+
+from django.http import HttpResponse, Http404
+from django.conf import settings
+
+
+def HttpFileResponse(path, content_type=None, filename=None):
+ if not os.path.exists(path):
+ raise Http404
+ if not content_type:
+ content_type = mimetypes.guess_type(path)[0]
+ if not content_type:
+ content_type = 'application/octet-stream'
+
+ if getattr(settings, 'XACCELREDIRECT', False):
+ response = HttpResponse()
+ response['Content-Length'] = os.stat(path).st_size
+
+ for PREFIX in ('STATIC', 'MEDIA'):
+ root = getattr(settings, PREFIX+'_ROOT', '')
+ url = getattr(settings, PREFIX+'_URL', '')
+ if root and path.startswith(root):
+ path = url + path[len(root)+1:]
+ if not isinstance(path, bytes):
+ path = path.encode('utf-8')
+ response['X-Accel-Redirect'] = path
+ if content_type:
+ response['Content-Type'] = content_type
+ elif getattr(settings, 'XSENDFILE', False):
+ response = HttpResponse()
+ if not isinstance(path, bytes):
+ path = path.encode('utf-8')
+ response['X-Sendfile'] = path
+ if content_type:
+ response['Content-Type'] = content_type
+ response['Content-Length'] = os.stat(path).st_size
+ else:
+ response = HttpResponse(open(path), content_type=content_type)
+ if filename:
+ if not isinstance(filename, bytes):
+ filename = filename.encode('utf-8')
+ response['Content-Disposition'] = "attachment; filename*=UTF=8''%s" % quote(filename)
+
+ response['Expires'] = datetime.strftime(datetime.utcnow() + timedelta(days=1), "%a, %d-%b-%Y %H:%M:%S GMT")
+
+ def allow_access():
+ for key in ('X-Accel-Redirect', 'X-Sendfile'):
+ if key in response:
+ del response[key]
+ response['Access-Control-Allow-Origin'] = '*'
+ response.allow_access = allow_access
+ return response
+
diff --git a/pandora/oxdjango/middleware.py b/pandora/oxdjango/middleware.py
new file mode 100644
index 00000000..0eccf475
--- /dev/null
+++ b/pandora/oxdjango/middleware.py
@@ -0,0 +1,15 @@
+# -*- coding: utf-8 -*-
+# vi:si:et:sw=4:sts=4:ts=4
+
+from .shortcuts import HttpErrorJson, render_to_json_response
+
+class ExceptionMiddleware(object):
+ def process_exception(self, request, exception):
+ if isinstance(exception, HttpErrorJson):
+ return render_to_json_response(exception.response)
+ return None
+
+class ChromeFrameMiddleware(object):
+ def process_response(self, request, response):
+ response['X-UA-Compatible'] = 'chrome=1'
+ return response
diff --git a/pandora/oxdjango/query.py b/pandora/oxdjango/query.py
new file mode 100644
index 00000000..5a7e43de
--- /dev/null
+++ b/pandora/oxdjango/query.py
@@ -0,0 +1,58 @@
+# -*- coding: utf-8 -*-
+# vi:si:et:sw=4:sts=4:ts=4
+
+from django.db.models.sql import Query
+from django.db.models.sql.compiler import SQLCompiler
+from django.db import connections
+import django.db.models.query
+
+'''
+models.py:
+-----------------------------------
+from oxdjango.query import QuerySet
+
+class Manager(models.Manager):
+ def get_query_set(self):
+ return QuerySet(self.model)
+
+class Model(models.Model):
+ ...
+ objects = Manager()
+'''
+
+class NullLastSQLCompiler(SQLCompiler):
+
+ def get_order_by(self):
+ result = super(NullLastSQLCompiler, self).get_order_by()
+ if self.query.nulls_last and result \
+ and self.connection.vendor == 'postgresql':
+ return [(expr, (sql + ' NULLS LAST', params, is_ref))
+ for (expr, (sql, params, is_ref)) in result]
+ return result
+
+class NullsLastQuery(Query):
+ nulls_last = False
+
+ def clone(self, *args, **kwargs):
+ obj = super(NullsLastQuery, self).clone(*args, **kwargs)
+ obj.nulls_last = self.nulls_last
+ return obj
+
+ def get_compiler(self, using=None, connection=None):
+ if using is None and connection is None:
+ raise ValueError("Need either using or connection")
+ if using:
+ connection = connections[using]
+ return NullLastSQLCompiler(self, connection, using)
+
+class QuerySet(django.db.models.query.QuerySet):
+
+ def __init__(self, model=None, query=None, using=None, **kwargs):
+ super(QuerySet, self).__init__(model=model, query=query, using=None, **kwargs)
+ self.query = query or NullsLastQuery(self.model)
+
+ def order_by(self, *args, **kwargs):
+ nulls_last = kwargs.pop('nulls_last', False)
+ obj = super(QuerySet, self).order_by(*args, **kwargs)
+ obj.query.nulls_last = nulls_last
+ return obj
diff --git a/pandora/oxdjango/shortcuts.py b/pandora/oxdjango/shortcuts.py
new file mode 100644
index 00000000..3f01ed1e
--- /dev/null
+++ b/pandora/oxdjango/shortcuts.py
@@ -0,0 +1,49 @@
+# -*- coding: utf-8 -*-
+# vi:si:et:sw=4:sts=4:ts=4
+from __future__ import print_function
+import datetime
+from django.utils import datetime_safe
+from django.http import HttpResponse, Http404
+import json
+from django.conf import settings
+
+class HttpErrorJson(Http404):
+ def __init__(self, response):
+ self.response = response
+
+def json_response(data=None, status=200, text='ok'):
+ if not data:
+ data = {}
+ return {'status': {'code': status, 'text': text}, 'data': data}
+
+def _to_json(python_object):
+ if isinstance(python_object, datetime.datetime):
+ if python_object.year < 1900:
+ tt = python_object.timetuple()
+ return '%d-%02d-%02dT%02d:%02d%02dZ' % tuple(list(tt)[:6])
+ return python_object.strftime('%Y-%m-%dT%H:%M:%SZ')
+ if isinstance(python_object, datetime_safe.datetime):
+ return python_object.strftime('%Y-%m-%dT%H:%M:%SZ')
+ raise TypeError(u'%s %s is not JSON serializable' % (repr(python_object), type(python_object)))
+
+def render_to_json_response(dictionary, content_type="text/json", status=200):
+ indent=None
+ if settings.DEBUG:
+ content_type = "text/javascript"
+ indent = 2
+ if getattr(settings, 'JSON_DEBUG', False):
+ print(json.dumps(dictionary, indent=2, default=_to_json, ensure_ascii=False).encode('utf-8'))
+
+ return HttpResponse(json.dumps(dictionary, indent=indent, default=_to_json,
+ ensure_ascii=False).encode('utf-8'), content_type=content_type, status=status)
+
+def get_object_or_404_json(klass, *args, **kwargs):
+ from django.shortcuts import _get_queryset
+ queryset = _get_queryset(klass)
+ try:
+ return queryset.get(*args, **kwargs)
+ except queryset.model.DoesNotExist:
+ response = {'status': {'code': 404,
+ 'text': '%s not found' % queryset.model._meta.object_name}}
+ raise HttpErrorJson(response)
+
diff --git a/pandora/oxdjango/utils.py b/pandora/oxdjango/utils.py
new file mode 100644
index 00000000..60eb896c
--- /dev/null
+++ b/pandora/oxdjango/utils.py
@@ -0,0 +1,47 @@
+# -*- coding: utf-8 -*-
+# vi:si:et:sw=4:sts=4:ts=4
+from django.http import HttpResponse,Http404
+from django.core.servers.basehttp import FileWrapper
+from django.conf import settings
+
+import mimetypes
+import os
+
+def basic_sendfile(fname,download_name=None):
+ if not os.path.exists(fname):
+ raise Http404
+
+ wrapper = FileWrapper(open(fname,"r"))
+
+ content_type = mimetypes.guess_type(fname)[0]
+ response = HttpResponse(wrapper, content_type=content_type)
+ response['Content-Length'] = os.path.getsize(fname)
+
+ if download_name:
+ response['Content-Disposition'] = "attachment; filename=%s"%download_name
+
+ return response
+
+def x_sendfile(fname,download_name=None):
+ if not os.path.exists(fname):
+ raise Http404
+
+ content_type = mimetypes.guess_type(fname)[0]
+ response = HttpResponse('', content_type=content_type)
+ response['Content-Length'] = os.path.getsize(fname)
+ response['X-Sendfile'] = fname
+
+ if download_name:
+ response['Content-Disposition'] = "attachment; filename=%s"%download_name
+
+ return response
+
+try:
+ __sendfile = getattr(settings,'SENDFILE',False) == 'x_sendfile'
+except:
+ __sendfile = False
+if __sendfile == 'x_sendfile':
+ sendfile = x_sendfile
+else:
+ sendfile = basic_sendfile
+
diff --git a/pandora/person/managers.py b/pandora/person/managers.py
index a0704a6a..7e8e800b 100644
--- a/pandora/person/managers.py
+++ b/pandora/person/managers.py
@@ -3,7 +3,7 @@
import unicodedata
from django.db.models import Q, Manager
-from ox.django.query import QuerySet
+from oxdjango.query import QuerySet
from item.utils import decode_id
diff --git a/pandora/person/migrations/0001_initial.py b/pandora/person/migrations/0001_initial.py
index 6bb8a2ac..c4cb6f28 100644
--- a/pandora/person/migrations/0001_initial.py
+++ b/pandora/person/migrations/0001_initial.py
@@ -3,7 +3,7 @@
from __future__ import unicode_literals
from django.db import migrations, models
-import ox.django.fields
+import oxdjango.fields
class Migration(migrations.Migration):
@@ -23,7 +23,7 @@ class Migration(migrations.Migration):
('sortsortname', models.CharField(max_length=200)),
('edited', models.BooleanField(default=False)),
('numberofnames', models.IntegerField(default=0)),
- ('aliases', ox.django.fields.TupleField(default=[])),
+ ('aliases', oxdjango.fields.TupleField(default=[])),
('imdbId', models.CharField(blank=True, max_length=7)),
('wikipediaId', models.CharField(blank=True, max_length=1000)),
],
diff --git a/pandora/person/models.py b/pandora/person/models.py
index 8cb165c7..7cf9c58a 100644
--- a/pandora/person/models.py
+++ b/pandora/person/models.py
@@ -6,7 +6,7 @@ import unicodedata
from django.db import models
-from ox.django import fields
+from oxdjango import fields
import ox
from item import utils
diff --git a/pandora/person/views.py b/pandora/person/views.py
index 0dff6abc..e91fedc2 100644
--- a/pandora/person/views.py
+++ b/pandora/person/views.py
@@ -5,10 +5,10 @@ from __future__ import division
import ox
from ox.utils import json
-from ox.django.decorators import admin_required_json
-from ox.django.shortcuts import render_to_json_response, get_object_or_404_json, json_response
+from oxdjango.decorators import admin_required_json
+from oxdjango.shortcuts import render_to_json_response, get_object_or_404_json, json_response
-from ox.django.api import actions
+from oxdjango.api import actions
from item import utils
import models
diff --git a/pandora/place/managers.py b/pandora/place/managers.py
index 9dd1a2b7..d61e6034 100644
--- a/pandora/place/managers.py
+++ b/pandora/place/managers.py
@@ -3,7 +3,7 @@
import unicodedata
from django.db.models import Q, Manager
-from ox.django.query import QuerySet
+from oxdjango.query import QuerySet
from item.utils import decode_id
diff --git a/pandora/place/migrations/0001_initial.py b/pandora/place/migrations/0001_initial.py
index 1851fded..5af18e53 100644
--- a/pandora/place/migrations/0001_initial.py
+++ b/pandora/place/migrations/0001_initial.py
@@ -5,7 +5,7 @@ from __future__ import unicode_literals
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
-import ox.django.fields
+import oxdjango.fields
class Migration(migrations.Migration):
@@ -27,7 +27,7 @@ class Migration(migrations.Migration):
('modified', models.DateTimeField(auto_now=True)),
('defined', models.BooleanField(default=True)),
('name', models.CharField(max_length=1024)),
- ('alternativeNames', ox.django.fields.TupleField(default=[])),
+ ('alternativeNames', oxdjango.fields.TupleField(default=[])),
('name_sort', models.CharField(db_index=True, max_length=200)),
('name_find', models.TextField(default=b'', editable=False)),
('geoname', models.CharField(max_length=1024, null=True)),
diff --git a/pandora/place/models.py b/pandora/place/models.py
index 9de33c10..981442ee 100644
--- a/pandora/place/models.py
+++ b/pandora/place/models.py
@@ -5,7 +5,7 @@ from __future__ import division, with_statement
from django.db import models, transaction
from django.contrib.auth.models import User
import ox
-from ox.django import fields
+from oxdjango import fields
import managers
from annotation.models import Annotation, get_matches, get_super_matches
diff --git a/pandora/place/views.py b/pandora/place/views.py
index 94714fd8..0040abfa 100644
--- a/pandora/place/views.py
+++ b/pandora/place/views.py
@@ -8,10 +8,10 @@ from django.conf import settings
import ox
from ox.utils import json
-from ox.django.decorators import login_required_json
-from ox.django.shortcuts import render_to_json_response, get_object_or_404_json, json_response
+from oxdjango.decorators import login_required_json
+from oxdjango.shortcuts import render_to_json_response, get_object_or_404_json, json_response
-from ox.django.api import actions
+from oxdjango.api import actions
from item import utils
from changelog.models import add_changelog
diff --git a/pandora/sequence/managers.py b/pandora/sequence/managers.py
index 74aa359c..11ef401b 100644
--- a/pandora/sequence/managers.py
+++ b/pandora/sequence/managers.py
@@ -2,7 +2,7 @@
# vi:si:et:sw=4:sts=4:ts=4
from django.db.models import Q, Manager
-from ox.django.query import QuerySet
+from oxdjango.query import QuerySet
from item.utils import decode_id
diff --git a/pandora/sequence/views.py b/pandora/sequence/views.py
index 78609158..c873e139 100644
--- a/pandora/sequence/views.py
+++ b/pandora/sequence/views.py
@@ -3,9 +3,9 @@
from __future__ import division
from ox.utils import json
-from ox.django.shortcuts import render_to_json_response, json_response
+from oxdjango.shortcuts import render_to_json_response, json_response
-from ox.django.api import actions
+from oxdjango.api import actions
from item.models import Item
from item import utils
diff --git a/pandora/settings.py b/pandora/settings.py
index b8056bb8..9bfc204c 100644
--- a/pandora/settings.py
+++ b/pandora/settings.py
@@ -97,8 +97,8 @@ MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
- 'ox.django.middleware.ExceptionMiddleware',
- 'ox.django.middleware.ChromeFrameMiddleware',
+ 'oxdjango.middleware.ExceptionMiddleware',
+ 'oxdjango.middleware.ChromeFrameMiddleware',
'user.middleware.UpdateSession',
)
diff --git a/pandora/text/managers.py b/pandora/text/managers.py
index de117a63..515825b5 100644
--- a/pandora/text/managers.py
+++ b/pandora/text/managers.py
@@ -2,7 +2,7 @@
# vi:si:et:sw=4:sts=4:ts=4
from django.db.models import Q, Manager
-from ox.django.query import QuerySet
+from oxdjango.query import QuerySet
def parseCondition(condition, user):
'''
diff --git a/pandora/text/migrations/0001_initial.py b/pandora/text/migrations/0001_initial.py
index b60b3b49..92269bae 100644
--- a/pandora/text/migrations/0001_initial.py
+++ b/pandora/text/migrations/0001_initial.py
@@ -5,7 +5,7 @@ from __future__ import unicode_literals
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
-import ox.django.fields
+import oxdjango.fields
import text.models
@@ -39,8 +39,8 @@ class Migration(migrations.Migration):
('rightslevel', models.IntegerField(db_index=True, default=0)),
('icon', models.ImageField(blank=True, default=None, upload_to=text.models.get_icon_path)),
('text', models.TextField(default=b'')),
- ('embeds', ox.django.fields.TupleField(default=[])),
- ('poster_frames', ox.django.fields.TupleField(default=[], editable=False)),
+ ('embeds', oxdjango.fields.TupleField(default=[])),
+ ('poster_frames', oxdjango.fields.TupleField(default=[], editable=False)),
('uploading', models.BooleanField(default=False)),
('file', models.FileField(blank=True, default=None, null=True, upload_to=text.models.get_path)),
('subscribed_users', models.ManyToManyField(related_name='subscribed_texts', to=settings.AUTH_USER_MODEL)),
diff --git a/pandora/text/models.py b/pandora/text/models.py
index 3c3504a9..99e6a75f 100644
--- a/pandora/text/models.py
+++ b/pandora/text/models.py
@@ -13,7 +13,7 @@ from django.contrib.auth.models import User
from django.conf import settings
from django.db.models.signals import pre_delete
import ox
-from ox.django.fields import TupleField
+from oxdjango.fields import TupleField
from archive import extract
from archive.chunk import save_chunk
diff --git a/pandora/text/views.py b/pandora/text/views.py
index 5a1026a1..b2482a83 100644
--- a/pandora/text/views.py
+++ b/pandora/text/views.py
@@ -6,10 +6,10 @@ import re
import ox
from ox.utils import json
-from ox.django.api import actions
-from ox.django.decorators import login_required_json
-from ox.django.http import HttpFileResponse
-from ox.django.shortcuts import render_to_json_response, get_object_or_404_json, json_response
+from oxdjango.api import actions
+from oxdjango.decorators import login_required_json
+from oxdjango.http import HttpFileResponse
+from oxdjango.shortcuts import render_to_json_response, get_object_or_404_json, json_response
from django import forms
from django.db.models import Sum, Max
from django.conf import settings
diff --git a/pandora/title/managers.py b/pandora/title/managers.py
index 911783cf..4bf73739 100644
--- a/pandora/title/managers.py
+++ b/pandora/title/managers.py
@@ -2,7 +2,7 @@
# vi:si:et:sw=4:sts=4:ts=4
import unicodedata
from django.db.models import Q, Manager
-from ox.django.query import QuerySet
+from oxdjango.query import QuerySet
from item.utils import decode_id
diff --git a/pandora/title/views.py b/pandora/title/views.py
index 3f9df607..66d7c4e1 100644
--- a/pandora/title/views.py
+++ b/pandora/title/views.py
@@ -6,10 +6,10 @@ import unicodedata
import ox
from ox.utils import json
-from ox.django.decorators import admin_required_json
-from ox.django.shortcuts import render_to_json_response, get_object_or_404_json, json_response
+from oxdjango.decorators import admin_required_json
+from oxdjango.shortcuts import render_to_json_response, get_object_or_404_json, json_response
-from ox.django.api import actions
+from oxdjango.api import actions
from item import utils
from user.decorators import capability_required_json
from changelog.models import add_changelog
diff --git a/pandora/tv/views.py b/pandora/tv/views.py
index 4636bc2b..2a7a3823 100644
--- a/pandora/tv/views.py
+++ b/pandora/tv/views.py
@@ -4,10 +4,10 @@ from __future__ import division
import models
from ox.utils import json
-from ox.django.shortcuts import render_to_json_response, json_response
+from oxdjango.shortcuts import render_to_json_response, json_response
from itemlist.views import get_list_or_404_json
-from ox.django.api import actions
+from oxdjango.api import actions
def tv(request, data):
'''
diff --git a/pandora/urls.py b/pandora/urls.py
index 98a644d9..898e7691 100644
--- a/pandora/urls.py
+++ b/pandora/urls.py
@@ -3,7 +3,7 @@
import os
from django.conf.urls import url, include
-from ox.django.http import HttpFileResponse
+from oxdjango.http import HttpFileResponse
from django.conf import settings
import django.views
@@ -14,7 +14,7 @@ admin.autodiscover()
import app.monkey_patch
-import ox.django.api.urls
+import oxdjango.api.urls
import app.views
import archive.views
@@ -40,7 +40,7 @@ urlpatterns = [
url(r'^api/upload/?$', archive.views.firefogg_upload),
url(r'^url=(?P.*)$', app.views.redirect_url),
url(r'^file/(?P.*)$', archive.views.lookup_file),
- url(r'^api/?', include(ox.django.api.urls)),
+ url(r'^api/?', include(oxdjango.api.urls)),
url(r'^resetUI$', user.views.reset_ui),
url(r'^documents/(?P[A-Z0-9]+)/(?P\d*)p(?P[\d,]*).jpg$', document.views.thumbnail),
url(r'^documents/(?P[A-Z0-9]+)/(?P.*?\.[^\d]{3})$', document.views.file),
diff --git a/pandora/user/decorators.py b/pandora/user/decorators.py
index 2629ba75..e5e3029e 100644
--- a/pandora/user/decorators.py
+++ b/pandora/user/decorators.py
@@ -4,7 +4,7 @@ try:
from django.contrib.auth.decorators import wraps
except:
from django.utils.functional import wraps
-from ox.django.shortcuts import render_to_json_response, json_response
+from oxdjango.shortcuts import render_to_json_response, json_response
def capability_required_json(capability):
def capability_required(function=None):
diff --git a/pandora/user/managers.py b/pandora/user/managers.py
index 4c2a4d8a..bfdc064a 100644
--- a/pandora/user/managers.py
+++ b/pandora/user/managers.py
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
from django.db.models import Q, Manager
-from ox.django.query import QuerySet
+from oxdjango.query import QuerySet
from django.conf import settings
def parseCondition(condition, user):
diff --git a/pandora/user/migrations/0001_initial.py b/pandora/user/migrations/0001_initial.py
index 7a06a917..b24fba28 100644
--- a/pandora/user/migrations/0001_initial.py
+++ b/pandora/user/migrations/0001_initial.py
@@ -6,7 +6,7 @@ import datetime
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
-import ox.django.fields
+import oxdjango.fields
class Migration(migrations.Migration):
@@ -31,7 +31,7 @@ class Migration(migrations.Migration):
('useragent', models.CharField(max_length=4096, null=True)),
('windowsize', models.CharField(max_length=255, null=True)),
('screensize', models.CharField(max_length=255, null=True)),
- ('info', ox.django.fields.DictField(default={})),
+ ('info', oxdjango.fields.DictField(default={})),
('location', models.CharField(max_length=255, null=True)),
('location_sort', models.CharField(max_length=255, null=True)),
('system', models.CharField(max_length=255, null=True)),
@@ -49,8 +49,8 @@ class Migration(migrations.Migration):
('level', models.IntegerField(default=1)),
('files_updated', models.DateTimeField(default=datetime.datetime.now)),
('newsletter', models.BooleanField(default=True)),
- ('ui', ox.django.fields.DictField(default={})),
- ('preferences', ox.django.fields.DictField(default={})),
+ ('ui', oxdjango.fields.DictField(default={})),
+ ('preferences', oxdjango.fields.DictField(default={})),
('notes', models.TextField(default=b'')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='profile', to=settings.AUTH_USER_MODEL, unique=True)),
],
diff --git a/pandora/user/models.py b/pandora/user/models.py
index c0a0777c..6f7d1c1f 100644
--- a/pandora/user/models.py
+++ b/pandora/user/models.py
@@ -11,7 +11,7 @@ from django.contrib.gis.geoip import GeoIP
import ox
-from ox.django.fields import DictField
+from oxdjango.fields import DictField
from ox.utils import json
from itemlist.models import List, Position
diff --git a/pandora/user/views.py b/pandora/user/views.py
index d7d91b62..c07a4a5f 100644
--- a/pandora/user/views.py
+++ b/pandora/user/views.py
@@ -15,12 +15,12 @@ from django.db.models import Max
from django.contrib.auth.models import User, Group
from django.contrib.sessions.models import Session
-from ox.django.shortcuts import render_to_json_response, json_response, get_object_or_404_json
-from ox.django.decorators import login_required_json
+from oxdjango.shortcuts import render_to_json_response, json_response, get_object_or_404_json
+from oxdjango.decorators import login_required_json
import ox
-from ox.django.api import actions
+from oxdjango.api import actions
from item.models import Access, Item
from item import utils
from changelog.models import add_changelog