NewsBlur/apps/feed_import/views.py
2024-04-24 09:50:42 -04:00

102 lines
3.8 KiB
Python

import base64
import datetime
import pickle
import uuid
from bson.errors import InvalidStringData
from django.conf import settings
from django.contrib.auth import login as login_user
from django.contrib.auth.models import User
from django.contrib.sites.models import Site
# from django.db import IntegrityError
from django.http import HttpResponse, HttpResponseRedirect
from django.urls import reverse
from mongoengine.errors import ValidationError
from oauth2client.client import FlowExchangeError, OAuth2WebServerFlow
from apps.feed_import.models import OAuthToken, OPMLExporter, OPMLImporter, UploadedOPML
from apps.feed_import.tasks import ProcessOPML
from apps.reader.forms import SignupForm
from apps.reader.models import UserSubscription
from utils import json_functions as json
from utils import log as logging
from utils.feed_functions import TimeoutError
from utils.user_functions import ajax_login_required, get_user
@ajax_login_required
def opml_upload(request):
xml_opml = None
message = "OK"
code = 1
payload = {}
if request.method == "POST":
if "file" in request.FILES:
logging.user(request, "~FR~SBOPML upload starting...")
file = request.FILES["file"]
xml_opml = file.read()
try:
UploadedOPML.objects.create(user_id=request.user.pk, opml_file=xml_opml)
except (UnicodeDecodeError, ValidationError, InvalidStringData):
folders = None
code = -1
message = "There was a Unicode decode error when reading your OPML file. Ensure it's a text file with a .opml or .xml extension. Is it a zip file?"
opml_importer = OPMLImporter(xml_opml, request.user)
try:
folders = opml_importer.try_processing()
except TimeoutError:
folders = None
ProcessOPML.delay(request.user.pk)
feed_count = opml_importer.count_feeds_in_opml()
logging.user(
request, "~FR~SBOPML upload took too long, found %s feeds. Tasking..." % feed_count
)
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
if folders:
code = 1
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)))
from apps.social.models import MActivity
MActivity.new_opml_import(user_id=request.user.pk, count=len(feeds))
UserSubscription.queue_new_feeds(request.user)
UserSubscription.refresh_stale_feeds(request.user, exclude_new=True)
else:
message = "Attach an .opml file."
code = -1
return HttpResponse(
json.encode(dict(message=message, code=code, payload=payload)), content_type="text/html"
)
def opml_export(request):
user = get_user(request)
now = datetime.datetime.now()
if request.GET.get("user_id") and user.is_staff:
user = User.objects.get(pk=request.GET["user_id"])
exporter = OPMLExporter(user)
opml = exporter.process()
from apps.social.models import MActivity
MActivity.new_opml_export(user_id=user.pk, count=exporter.feed_count)
response = HttpResponse(opml, content_type="text/xml; charset=utf-8")
response["Content-Disposition"] = "attachment; filename=NewsBlur-%s-%s.opml" % (
user.username,
now.strftime("%Y-%m-%d"),
)
return response