Showing OPML errors and fixing unicode decode error by sanitizing OPML uploads.

This commit is contained in:
Samuel Clay 2013-08-07 19:46:47 -07:00
parent 687c044b10
commit 4b5fce6ce7
3 changed files with 30 additions and 21 deletions

View file

@ -127,7 +127,8 @@ class OPMLImporter(Importer):
def process(self):
# self.clear_feeds()
outline = opml.from_string(str(self.opml_xml))
outline = opml.from_string(self.opml_xml)
folders = self.get_folders()
try:
folders = self.process_outline(outline, folders)

View file

@ -35,33 +35,32 @@ def opml_upload(request):
if 'file' in request.FILES:
logging.user(request, "~FR~SBOPML upload starting...")
file = request.FILES['file']
xml_opml = file.read()
xml_opml = str(file.read().decode('utf-8', 'ignore'))
try:
uploaded_opml = UploadedOPML.objects.create(user_id=request.user.pk, opml_file=xml_opml)
UploadedOPML.objects.create(user_id=request.user.pk, opml_file=xml_opml)
except (UnicodeDecodeError, InvalidStringData):
uploaded_opml = None
folders = None
code = -1
message = "There was a Unicode decode error when reading your OPML file."
if uploaded_opml:
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 pload 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
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 pload 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)))

View file

@ -608,10 +608,14 @@ _.extend(NEWSBLUR.ReaderIntro.prototype, {
$('.NB-intro-import-delayed', self.$modal).show();
$('.NB-intro-import-restart', self.$modal).hide();
$('.NB-intro-import-message', self.$modal).hide();
} else if (data.code < 0) {
$('.NB-intro-import-delayed', self.$modal).hide();
$('.NB-intro-import-restart', self.$modal).hide();
$('.NB-intro-import-message', self.$modal).show().addClass('NB-error').text(data.message);
} else {
$('.NB-intro-import-delayed', self.$modal).hide();
$('.NB-intro-import-restart', self.$modal).show();
$('.NB-intro-import-message', self.$modal).show().text("All done!");
$('.NB-intro-import-message', self.$modal).show().removeClass('NB-error').text("All done!");
}
}, this));
},
@ -631,6 +635,7 @@ _.extend(NEWSBLUR.ReaderIntro.prototype, {
dataType: 'json',
success: function (data, status) {
NEWSBLUR.assets.load_feeds(function() {
console.log(["opml upload", data, status]);
$loading.removeClass('NB-active');
self.advance_import_carousel(2);
if (data.payload.delayed) {
@ -639,6 +644,10 @@ _.extend(NEWSBLUR.ReaderIntro.prototype, {
$('.NB-intro-import-delayed', self.$modal).show();
$('.NB-intro-import-restart', self.$modal).hide();
$('.NB-intro-import-message', self.$modal).hide();
} else if (data.code < 0) {
$('.NB-intro-import-delayed', self.$modal).hide();
$('.NB-intro-import-restart', self.$modal).show();
$('.NB-intro-import-message', self.$modal).addClass('NB-error').show().text(data.message);
} else {
$('.NB-intro-import-message', self.$modal).text("All done!").removeClass('NB-error').show();
$('.NB-intro-import-delayed', self.$modal).hide();