# -*- coding: utf-8 -*- from django.shortcuts import render_to_response, get_list_or_404, get_object_or_404 from django.contrib.auth.decorators import login_required from django.template import RequestContext from django.core.cache import cache from apps.rss_feeds.models import Feed from apps.reader.models import UserSubscription, UserSubscriptionFolders from utils import json import utils.opml as opml from django.contrib.auth.models import User from django.http import HttpResponse, HttpRequest from django.core import serializers from pprint import pprint from django.db import IntegrityError import datetime import codecs def opml_upload(request): xml_opml = None message = "OK" code = 1 if request.method == 'POST': if 'file' in request.FILES: file = request.FILES['file'] xml_opml = file.read() opml_importer = OPMLImporter(xml_opml, request.user) folders = opml_importer.process() feeds = UserSubscription.objects.filter(user=user).values() data = json.encode(dict(message=message, code=code, payload=dict(folders=folders, feeds=feeds))) return HttpResponse(data, mimetype='text/plain') class OPMLImporter: def __init__(self, opml_xml, user): self.user = user self.opml_xml = opml_xml def process(self): outline = opml.from_string(self.opml_xml) folders = self.process_outline(outline) UserSubscriptionFolders.objects.create(user=self.user, folders=json.encode(folders)) return folders def process_outline(self, outline): folders = [] for item in outline: if not hasattr(item, 'xmlUrl'): folder = item print 'New Folder: %s' % folder.text folders.append({folder.text: self.process_outline(folder)}) elif hasattr(item, 'xmlUrl'): feed = item print '\t%s - %s - %s' % (feed.title, feed.htmlUrl, feed.xmlUrl,) feed_data = dict(feed_address=feed.xmlUrl, feed_link=feed.htmlUrl, feed_title=feed.title) # feeds.append(feed_data) feed_db, _ = Feed.objects.get_or_create(feed_address=feed.xmlUrl, defaults=dict(**feed_data)) us, _ = UserSubscription.objects.get_or_create(feed=feed_db, user=self.user) folders.append(feed_db.pk) return folders if __name__ == '__main__': opml_string = """ mySubscriptions """ user = User.objects.get(username='conesus') opml_importer = OPMLImporter(opml_string, user) data = opml_importer.process() print data