2011-03-11 11:22:28 -05:00
|
|
|
import datetime
|
2012-08-10 23:15:16 -07:00
|
|
|
import pickle
|
|
|
|
import base64
|
2010-08-16 15:45:35 -04:00
|
|
|
from utils import log as logging
|
2012-08-12 20:34:30 -07:00
|
|
|
from oauth2client.client import OAuth2WebServerFlow, FlowExchangeError
|
2013-05-11 23:39:46 -07:00
|
|
|
from bson.errors import InvalidStringData
|
2011-04-01 17:25:28 -04:00
|
|
|
import uuid
|
2010-06-29 20:16:09 -04:00
|
|
|
from django.contrib.sites.models import Site
|
2014-09-05 10:37:59 -07:00
|
|
|
from django.contrib.auth.models import User
|
2012-08-10 23:15:16 -07:00
|
|
|
# from django.db import IntegrityError
|
2010-06-29 20:16:09 -04:00
|
|
|
from django.http import HttpResponse, HttpResponseRedirect
|
|
|
|
from django.conf import settings
|
2020-06-17 00:37:13 -04:00
|
|
|
from django.urls import reverse
|
2010-07-05 17:11:04 -04:00
|
|
|
from django.contrib.auth import login as login_user
|
|
|
|
from apps.reader.forms import SignupForm
|
|
|
|
from apps.reader.models import UserSubscription
|
2020-06-15 17:53:35 -04:00
|
|
|
from apps.feed_import.models import OAuthToken
|
2012-07-20 19:43:28 -07:00
|
|
|
from apps.feed_import.models import OPMLImporter, OPMLExporter, UploadedOPML
|
2020-06-15 17:53:35 -04:00
|
|
|
from apps.feed_import.tasks import ProcessOPML
|
2010-10-23 13:06:28 -04:00
|
|
|
from utils import json_functions as json
|
2011-03-12 18:13:24 -05:00
|
|
|
from utils.user_functions import ajax_login_required, get_user
|
2012-07-20 19:43:28 -07:00
|
|
|
from utils.feed_functions import TimeoutError
|
2010-06-29 20:16:09 -04:00
|
|
|
|
|
|
|
|
2010-07-24 15:54:25 -04:00
|
|
|
@ajax_login_required
|
2010-06-29 20:16:09 -04:00
|
|
|
def opml_upload(request):
|
|
|
|
xml_opml = None
|
|
|
|
message = "OK"
|
|
|
|
code = 1
|
|
|
|
payload = {}
|
2013-07-03 19:13:54 -07:00
|
|
|
|
2010-06-29 20:16:09 -04:00
|
|
|
if request.method == 'POST':
|
|
|
|
if 'file' in request.FILES:
|
2011-09-16 09:26:22 -07:00
|
|
|
logging.user(request, "~FR~SBOPML upload starting...")
|
2010-06-29 20:16:09 -04:00
|
|
|
file = request.FILES['file']
|
2013-08-07 19:46:47 -07:00
|
|
|
xml_opml = str(file.read().decode('utf-8', 'ignore'))
|
2012-07-20 19:43:28 -07:00
|
|
|
try:
|
2013-08-07 19:46:47 -07:00
|
|
|
UploadedOPML.objects.create(user_id=request.user.pk, opml_file=xml_opml)
|
2013-05-11 23:39:46 -07:00
|
|
|
except (UnicodeDecodeError, InvalidStringData):
|
2012-07-20 19:43:28 -07:00
|
|
|
folders = None
|
2012-07-30 21:39:21 -07:00
|
|
|
code = -1
|
|
|
|
message = "There was a Unicode decode error when reading your OPML file."
|
|
|
|
|
2013-08-07 19:46:47 -07:00
|
|
|
opml_importer = OPMLImporter(xml_opml, request.user)
|
|
|
|
try:
|
|
|
|
folders = opml_importer.try_processing()
|
|
|
|
except TimeoutError:
|
|
|
|
folders = None
|
2021-01-19 17:30:11 -05:00
|
|
|
ProcessOPML.delay(request.user.pk)
|
2013-08-07 19:46:47 -07:00
|
|
|
feed_count = opml_importer.count_feeds_in_opml()
|
2014-12-08 18:44:21 -08:00
|
|
|
logging.user(request, "~FR~SBOPML upload took too long, found %s feeds. Tasking..." % feed_count)
|
2013-08-07 19:46:47 -07:00
|
|
|
payload = dict(folders=folders, delayed=True, feed_count=feed_count)
|
|
|
|
code = 2
|
|
|
|
message = ""
|
|
|
|
except AttributeError:
|
|
|
|
code = -1
|
|
|
|
message = "OPML import failed. Couldn't parse XML file."
|
|
|
|
folders = None
|
2012-07-20 19:43:28 -07:00
|
|
|
|
|
|
|
if folders:
|
2013-08-07 19:46:47 -07:00
|
|
|
code = 1
|
2012-07-20 19:43:28 -07:00
|
|
|
feeds = UserSubscription.objects.filter(user=request.user).values()
|
|
|
|
payload = dict(folders=folders, feeds=feeds)
|
|
|
|
logging.user(request, "~FR~SBOPML Upload: ~SK%s~SN~SB~FR feeds" % (len(feeds)))
|
2021-03-08 19:47:24 -05:00
|
|
|
UserSubscription.queue_new_feeds(request.user)
|
|
|
|
UserSubscription.refresh_stale_feeds(request.user, exclude_new=True)
|
2010-06-29 20:16:09 -04:00
|
|
|
else:
|
|
|
|
message = "Attach an .opml file."
|
|
|
|
code = -1
|
|
|
|
|
2012-07-12 23:44:30 -07:00
|
|
|
return HttpResponse(json.encode(dict(message=message, code=code, payload=payload)),
|
2020-10-12 12:30:40 +07:00
|
|
|
content_type='text/html')
|
2010-06-29 20:16:09 -04:00
|
|
|
|
2011-03-11 11:22:28 -05:00
|
|
|
def opml_export(request):
|
2011-03-12 18:13:24 -05:00
|
|
|
user = get_user(request)
|
2014-09-05 10:37:59 -07:00
|
|
|
now = datetime.datetime.now()
|
2020-06-07 08:04:23 -04:00
|
|
|
if request.GET.get('user_id') and user.is_staff:
|
|
|
|
user = User.objects.get(pk=request.GET['user_id'])
|
2011-03-12 18:13:24 -05:00
|
|
|
exporter = OPMLExporter(user)
|
2011-03-11 11:22:28 -05:00
|
|
|
opml = exporter.process()
|
|
|
|
|
2020-10-12 12:30:40 +07:00
|
|
|
response = HttpResponse(opml, content_type='text/xml')
|
2015-09-14 15:44:14 -07:00
|
|
|
response['Content-Disposition'] = 'attachment; filename=NewsBlur-%s-%s' % (
|
2014-09-05 10:37:59 -07:00
|
|
|
user.username,
|
2012-03-29 23:06:23 +03:00
|
|
|
now.strftime('%Y-%m-%d')
|
2011-03-11 11:22:28 -05:00
|
|
|
)
|
|
|
|
|
|
|
|
return response
|
2012-08-10 23:15:16 -07:00
|
|
|
|