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