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