diff --git a/apps/feed_import/tests.py b/apps/feed_import/tests.py index af5ac283c..6b23ead30 100644 --- a/apps/feed_import/tests.py +++ b/apps/feed_import/tests.py @@ -47,21 +47,4 @@ class ImportTest(TestCase): # Verify user now has feeds subs = UserSubscription.objects.filter(user=user) self.assertEquals(subs.count(), 0) - - def test_google_reader_import(self): - self.client.login(username='conesus', password='test') - user = User.objects.get(username='conesus') - f = open(os.path.join(os.path.dirname(__file__), 'fixtures/google_reader.xml')) - xml = f.read() - f.close() - - reader_importer = GoogleReaderImporter(user, xml=xml) - reader_importer.import_feeds() - - subs = UserSubscription.objects.filter(user=user) - self.assertEquals(subs.count(), 66) - - usf = UserSubscriptionFolders.objects.get(user=user) - # print json.decode(usf.folders) - self.assertEquals(json.decode(usf.folders), [{u'Tech': [4, 5, 2, 9, 10, 12, 13, 14, 20, 23, 24, 26, 27, 28, 31, 32, 33, 34, 48, 49, 62, 64]}, 1, 2, 3, 6, {u'Blogs': [1, 3, 25, 29, 30, 39, 40, 41, 50, 55, 57, 58, 59, 60, 66]}, {u'Blogs \u2014 Tumblrs': [5, 21, 37, 38, 53, 54, 63, 65]}, {u'Blogs \u2014 The Bloglets': [6, 16, 22, 35, 51, 56]}, {u'New York': [7, 8, 17, 18, 19, 36, 45, 47, 52, 61]}, {u'Cooking': [11, 15, 42, 43, 46]}, 44]) - \ No newline at end of file + \ No newline at end of file diff --git a/apps/feed_import/urls.py b/apps/feed_import/urls.py index 147d97ca7..d37ea106d 100644 --- a/apps/feed_import/urls.py +++ b/apps/feed_import/urls.py @@ -4,9 +4,4 @@ from apps.feed_import import views urlpatterns = patterns('apps.feed_import.views', url(r'^opml_upload/?$', views.opml_upload, name='opml-upload'), url(r'^opml_export/?$', views.opml_export, name='opml-export'), - url(r'^authorize/?$', views.reader_authorize, name='google-reader-authorize'), - url(r'^callback/?$', views.reader_callback, name='google-reader-callback'), - url(r'^signup/?$', views.import_signup, name='import-signup'), - url(r'^import_from_google_reader/?$', views.import_from_google_reader, name='import-from-google-reader'), - url(r'^import_starred_stories_from_google_reader/?$', views.import_starred_stories_from_google_reader, name='import-starred-stories-from-google-reader') ) diff --git a/apps/feed_import/views.py b/apps/feed_import/views.py index 0a4608799..c21f3ac17 100644 --- a/apps/feed_import/views.py +++ b/apps/feed_import/views.py @@ -66,7 +66,6 @@ def opml_upload(request): payload = dict(folders=folders, feeds=feeds) logging.user(request, "~FR~SBOPML Upload: ~SK%s~SN~SB~FR feeds" % (len(feeds))) - request.session['import_from_google_reader'] = False else: message = "Attach an .opml file." code = -1 @@ -91,194 +90,3 @@ def opml_export(request): return response -def reader_authorize(request): - ip = request.META.get('HTTP_X_FORWARDED_FOR', None) or request.META.get('REMOTE_ADDR', "") - reader_importer = GoogleReaderImporter(request.user) - if reader_importer.test(): - logging.user(request, "~BB~FW~SBSkipping Google Reader import, already tokened") - return render_to_response('social/social_connect.xhtml', { - }, context_instance=RequestContext(request)) - - domain = Site.objects.get_current().domain - STEP2_URI = "http://%s%s" % ( - (domain + '.com') if not domain.endswith('.com') else domain, - reverse('google-reader-callback'), - ) - - FLOW = OAuth2WebServerFlow( - client_id=settings.GOOGLE_OAUTH2_CLIENTID, - client_secret=settings.GOOGLE_OAUTH2_SECRET, - scope="http://www.google.com/reader/api", - redirect_uri=STEP2_URI, - user_agent='NewsBlur Pro, www.newsblur.com', - approval_prompt="force", - ) - logging.user(request, "~BB~FW~SBAuthorize Google Reader import - %s" % ( - request.META.get('HTTP_X_FORWARDED_FOR', None) or request.META.get('REMOTE_ADDR', ""), - )) - - authorize_url = FLOW.step1_get_authorize_url(redirect_uri=STEP2_URI) - response = render_to_response('social/social_connect.xhtml', { - 'next': authorize_url, - }, context_instance=RequestContext(request)) - - # Save request token and delete old tokens - auth_token_dict = dict() - if request.user.is_authenticated(): - OAuthToken.objects.filter(user=request.user).delete() - auth_token_dict['user'] = request.user - else: - OAuthToken.objects.filter(session_id=request.session.session_key).delete() - OAuthToken.objects.filter(remote_ip=ip).delete() - auth_token_dict['uuid'] = str(uuid.uuid4()) - auth_token_dict['session_id'] = request.session.session_key - auth_token_dict['remote_ip'] = ip - OAuthToken.objects.create(**auth_token_dict) - - response.set_cookie('newsblur_reader_uuid', str(uuid.uuid4())) - return response - -def reader_callback(request): - ip = request.META.get('HTTP_X_FORWARDED_FOR', None) or request.META.get('REMOTE_ADDR', "") - domain = Site.objects.get_current().domain - STEP2_URI = "http://%s%s" % ( - (domain + '.com') if not domain.endswith('.com') else domain, - reverse('google-reader-callback'), - ) - FLOW = OAuth2WebServerFlow( - client_id=settings.GOOGLE_OAUTH2_CLIENTID, - client_secret=settings.GOOGLE_OAUTH2_SECRET, - scope="http://www.google.com/reader/api", - redirect_uri=STEP2_URI, - user_agent='NewsBlur Pro, www.newsblur.com', - ) - FLOW.redirect_uri = STEP2_URI - - http = httplib2.Http() - http.disable_ssl_certificate_validation = True - try: - credential = FLOW.step2_exchange(request.REQUEST) - except FlowExchangeError: - logging.info(" ***> [%s] Bad token from Google Reader." % (request.user,)) - return render_to_response('social/social_connect.xhtml', { - 'error': 'There was an error trying to import from Google Reader. Trying again will probably fix the issue.' - }, context_instance=RequestContext(request)) - - user_token = None - if request.user.is_authenticated(): - user_token = OAuthToken.objects.filter(user=request.user).order_by('-created_date') - if not user_token: - user_uuid = request.COOKIES.get('newsblur_reader_uuid') - if user_uuid: - user_token = OAuthToken.objects.filter(uuid=user_uuid).order_by('-created_date') - if not user_token: - session = request.session - if session.session_key: - user_token = OAuthToken.objects.filter(session_id=request.session.session_key).order_by('-created_date') - if not user_token: - user_token = OAuthToken.objects.filter(remote_ip=ip).order_by('-created_date') - - if user_token: - user_token = user_token[0] - user_token.credential = base64.b64encode(pickle.dumps(credential)) - user_token.session_id = request.session.session_key - user_token.save() - - # Fetch imported feeds on next page load - request.session['import_from_google_reader'] = True - - logging.user(request, "~BB~FW~SBFinishing Google Reader import - %s" % ip) - - if request.user.is_authenticated(): - return render_to_response('social/social_connect.xhtml', {}, context_instance=RequestContext(request)) - - return HttpResponseRedirect(reverse('import-signup')) - -@json.json_view -def import_from_google_reader(request): - code = 0 - feed_count = 0 - starred_count = 0 - delayed = False - - if request.user.is_authenticated(): - reader_importer = GoogleReaderImporter(request.user) - auto_active = bool(request.REQUEST.get('auto_active') or False) - - try: - code = reader_importer.try_import_feeds(auto_active=auto_active) - except TimeoutError: - ProcessReaderImport.delay(request.user.pk, auto_active=auto_active) - feed_count = UserSubscription.objects.filter(user=request.user).count() - logging.user(request, "~FR~SBGoogle Reader import took too long, found %s feeds. Tasking..." % feed_count) - delayed = True - code = 2 - - if 'import_from_google_reader' in request.session: - del request.session['import_from_google_reader'] - - feed_count = UserSubscription.objects.filter(user=request.user).count() - - return dict(code=code, delayed=delayed, feed_count=feed_count, starred_count=starred_count) - -@json.json_view -def import_starred_stories_from_google_reader(request): - code = 0 - feed_count = 0 - starred_count = 0 - delayed = False - - if request.user.is_authenticated(): - reader_importer = GoogleReaderImporter(request.user) - try: - starred_count = reader_importer.try_import_starred_stories() - except TimeoutError: - ProcessReaderStarredImport.delay(request.user.pk) - feed_count = UserSubscription.objects.filter(user=request.user).count() - logging.user(request, "~FR~SBGoogle Reader starred stories import took too long, found %s feeds, %s stories. Tasking..." % (feed_count, starred_count)) - delayed = True - code = 2 - - feed_count = UserSubscription.objects.filter(user=request.user).count() - - return dict(code=code, delayed=delayed, feed_count=feed_count, starred_count=starred_count) - -def import_signup(request): - ip = request.META.get('HTTP_X_FORWARDED_FOR', None) or request.META.get('REMOTE_ADDR', "") - - if request.method == "POST": - signup_form = SignupForm(prefix='signup', data=request.POST) - if signup_form.is_valid(): - new_user = signup_form.save() - - user_token = OAuthToken.objects.filter(user=new_user) - if not user_token: - user_uuid = request.COOKIES.get('newsblur_reader_uuid') - if user_uuid: - user_token = OAuthToken.objects.filter(uuid=user_uuid).order_by('-created_date') - if not user_token: - if request.session.session_key: - user_token = OAuthToken.objects.filter(session_id=request.session.session_key).order_by('-created_date') - if not user_token: - user_token = OAuthToken.objects.filter(remote_ip=ip).order_by('-created_date') - - if user_token: - user_token = user_token[0] - user_token.session_id = request.session.session_key - user_token.user = new_user - user_token.save() - login_user(request, new_user) - if request.user.profile.is_premium: - return HttpResponseRedirect(reverse('index')) - url = "https://%s%s" % (Site.objects.get_current().domain, - reverse('stripe-form')) - return HttpResponseRedirect(url) - else: - logging.user(request, "~BR~FW ***> Can't find user token during import/signup. Re-authenticating...") - return HttpResponseRedirect(reverse('google-reader-authorize')) - else: - signup_form = SignupForm(prefix='signup') - - return render_to_response('import/signup.xhtml', { - 'signup_form': signup_form, - }, context_instance=RequestContext(request)) \ No newline at end of file diff --git a/apps/reader/views.py b/apps/reader/views.py index f52f40e72..af7c11ddb 100644 --- a/apps/reader/views.py +++ b/apps/reader/views.py @@ -104,10 +104,6 @@ def dashboard(request, **kwargs): statistics = MStatistics.all() social_profile = MSocialProfile.get_user(user.pk) custom_styling = MCustomStyling.get_user(user.pk) - - start_import_from_google_reader = request.session.get('import_from_google_reader', False) - if start_import_from_google_reader: - del request.session['import_from_google_reader'] if not user.is_active: url = "https://%s%s" % (Site.objects.get_current().domain, @@ -125,7 +121,6 @@ def dashboard(request, **kwargs): 'unmoderated_feeds' : unmoderated_feeds, 'statistics' : statistics, 'social_profile' : social_profile, - 'start_import_from_google_reader': start_import_from_google_reader, 'debug' : settings.DEBUG, }, "reader/dashboard.xhtml" diff --git a/media/css/darkmode.css b/media/css/darkmode.css index 27031aacc..27b3a34d7 100644 --- a/media/css/darkmode.css +++ b/media/css/darkmode.css @@ -682,7 +682,13 @@ color: #a85b40; text-shadow: 0 1px 0 rgba(0,0,0,.8); /*border: 1px solid #90928b;*/ } - +.NB-dark .NB-modal h5, +.NB-dark .NB-module h5, +.NB-dark .NB-module-header { + background-image: -moz-linear-gradient(top, #31383a, #232729); /* FF3.6 */ + background-image: -webkit-gradient(linear, left top, left bottom, from(#31383a), to(#232729)); /* Saf4+, Chrome */ + background-image: linear-gradient(top, #31383a, #232729); +} /* Error text on bottom bar */ .NB-dark #story_taskbar .NB-river-progress .NB-river-progress-text, .NB-dark #story_taskbar .NB-feed-error .NB-feed-error-text { diff --git a/media/css/reader.css b/media/css/reader.css index 3e1066737..9fd9453eb 100644 --- a/media/css/reader.css +++ b/media/css/reader.css @@ -7502,6 +7502,16 @@ form.opml_import_form input { background: transparent url('/media/embed/icons/circular/menu_icn_preferences.png') no-repeat 0 0; background-size: 18px; } +.NB-menu-manage .NB-menu-manage-theme .NB-menu-manage-image { + background: transparent url('/media/img/reader/half.png') no-repeat 0 0; + background-size: 18px; +} +.NB-menu-manage .NB-menu-manage-theme .segmented-control { + margin: 2px 0 0 36px; +} +.NB-menu-manage .NB-menu-manage-theme .segmented-control li { + padding: 4px 18px; +} .NB-menu-manage .NB-menu-manage-account .NB-menu-manage-image { background: transparent url('/media/embed/icons/circular/menu_icn_profile.png') no-repeat 0 0; background-size: 18px; diff --git a/media/js/newsblur/common/assetmodel.js b/media/js/newsblur/common/assetmodel.js index 00ba72c10..cc8790947 100644 --- a/media/js/newsblur/common/assetmodel.js +++ b/media/js/newsblur/common/assetmodel.js @@ -1578,14 +1578,6 @@ NEWSBLUR.AssetModel = Backbone.Router.extend({ }); }, - start_import_from_google_reader: function(callback) { - this.make_request('/import/import_from_google_reader/', {}, callback); - }, - - start_import_starred_stories_from_google_reader: function(callback) { - this.make_request('/import/import_starred_stories_from_google_reader/', {}, callback); - }, - save_recommended_site: function(data, callback) { if (NEWSBLUR.Globals.is_authenticated) { this.make_request('/recommendations/save_recommended_feed', data, callback); diff --git a/media/js/newsblur/reader/reader.js b/media/js/newsblur/reader/reader.js index 0b2be3482..6570f03de 100644 --- a/media/js/newsblur/reader/reader.js +++ b/media/js/newsblur/reader/reader.js @@ -61,7 +61,6 @@ 'bouncing_callout': false, 'has_unfetched_feeds': false, 'count_unreads_after_import_working': false, - 'import_from_google_reader_working': false, 'sidebar_closed': this.options.hide_sidebar, 'splash_page_frontmost': true }; @@ -114,9 +113,6 @@ this.load_javascript_elements_on_page(); this.apply_resizable_layout(); this.add_body_classes(); - if (NEWSBLUR.Flags['start_import_from_google_reader']) { - this.start_import_from_google_reader(); - } NEWSBLUR.app.sidebar_header = new NEWSBLUR.Views.SidebarHeader({ feed_collection: NEWSBLUR.assets.feeds, socialfeed_collection: NEWSBLUR.assets.social_feeds @@ -237,6 +233,7 @@ } else { center = NEWSBLUR.reader.layout.rightLayout.panes.center; } + if (center) { var center_width = center.width(); var narrow = center_width < 780; @@ -3410,6 +3407,19 @@ $.make('li', { className: 'NB-menu-item NB-menu-manage-preferences' }, [ $.make('div', { className: 'NB-menu-manage-image' }), $.make('div', { className: 'NB-menu-manage-title' }, 'Preferences') + ]), + $.make('li', { className: 'NB-menu-item NB-menu-manage-theme' }, [ + $.make('div', { className: 'NB-menu-manage-image' }), + $.make('ul', { className: 'segmented-control NB-options-theme' }, [ + $.make('li', { className: 'NB-single-story-option NB-options-theme-light NB-active' }, [ + $.make('div', { className: 'NB-icon' }), + 'Light' + ]), + $.make('li', { className: 'NB-single-story-option NB-options-theme-dark' }, [ + $.make('div', { className: 'NB-icon' }), + 'Dark' + ]) + ]) ]) ]); $manage_menu.addClass('NB-menu-manage-notop'); @@ -5484,59 +5494,6 @@ // = Import from Google Reader = // ============================= - post_google_reader_connect: function(data) { - if (NEWSBLUR.intro) { - NEWSBLUR.intro.start_import_from_google_reader(data); - } else { - this.start_import_from_google_reader(); - } - }, - - start_import_from_google_reader: function() { - var self = this; - var $progress = this.$s.$feeds_progress; - var $bar = $('.NB-progress-bar', $progress); - var percentage = 0; - this.flags['import_from_google_reader_working'] = true; - - $('.NB-progress-title', $progress).text('Importing from Google Reader'); - $('.NB-progress-counts', $progress).hide(); - $('.NB-progress-percentage', $progress).hide(); - $bar.progressbar({ - value: percentage - }); - - this.animate_progress_bar($bar, 5); - - this.model.start_import_from_google_reader( - $.rescope(this.finish_import_from_google_reader, this)); - this.show_progress_bar(); - }, - - finish_import_from_google_reader: function(e, data) { - var $progress = this.$s.$feeds_progress; - var $bar = $('.NB-progress-bar', $progress); - this.flags['import_from_google_reader_working'] = false; - clearTimeout(this.locks['animate_progress_bar']); - - if (data.code >= 1) { - $bar.progressbar({value: 100}); - NEWSBLUR.assets.load_feeds(); - $('.NB-progress-title', $progress).text(''); - $('.NB-progress-link', $progress).html(''); - } else { - NEWSBLUR.log(['Import Error!', data]); - this.$s.$feed_link_loader.fadeOut(250); - $progress.addClass('NB-progress-error'); - $('.NB-progress-title', $progress).text('Error importing Google Reader'); - $('.NB-progress-link', $progress).html($.make('a', { - className: 'NB-modal-submit-button NB-modal-submit-green', - href: NEWSBLUR.URLs['google-reader-authorize'] - }, ['Try importing again'])); - $('.left-center-footer').css('height', 'auto'); - } - }, - start_count_unreads_after_import: function() { var self = this; var $progress = this.$s.$feeds_progress; @@ -6282,6 +6239,9 @@ }); } }); + $.targetIs(e, { tagSelector: '.NB-menu-manage-theme' }, function($t, $p){ + e.preventDefault(); + }); $.targetIs(e, { tagSelector: '.NB-menu-manage-logout' }, function($t, $p){ e.preventDefault(); e.stopPropagation(); diff --git a/media/js/newsblur/reader/reader_intro.js b/media/js/newsblur/reader/reader_intro.js index a81cd052d..1290a4df0 100644 --- a/media/js/newsblur/reader/reader_intro.js +++ b/media/js/newsblur/reader/reader_intro.js @@ -4,7 +4,7 @@ NEWSBLUR.ReaderIntro = function(options) { }; var intro_page = NEWSBLUR.assets.preference('intro_page'); - _.bindAll(this, 'close', 'start_import_from_google_reader', 'post_connect'); + _.bindAll(this, 'close', 'post_connect'); this.options = $.extend({ 'page_number': intro_page && _.isNumber(intro_page) && intro_page <= 4 ? intro_page : 1 }, defaults, options); @@ -537,82 +537,6 @@ _.extend(NEWSBLUR.ReaderIntro.prototype, { // = Import = // ========== - google_reader_connect: function(options) { - options = options || {}; - var window_options = "location=0,status=0,width=800,height=500"; - var url = "/import/authorize"; - this.flags.starred_only = !!options.starred_only; - $(".NB-page-2-importing", this.$modal).text(options.starred_only ? - "Importing your sites and stories..." : - "Importing your sites..."); - this.connect_window = window.open(url, '_blank', window_options); - clearInterval(this.connect_window_timer); - this.connect_window_timer = setInterval(_.bind(function() { - console.log(["post connect window?", this.connect_window, this.connect_window.closed, this.connect_window.location]); - try { - if (!this.connect_window || - !this.connect_window.location || - this.connect_window.closed) { - this.start_import_from_google_reader(options); - } - } catch (err) { - this.start_import_from_google_reader(options); - } - }, this), 1000); - - NEWSBLUR.reader.flags.importing_from_google_reader = true; - }, - - start_import_from_google_reader: function(data) { - console.log(["start_import_from_google_reader", data]); - clearInterval(this.connect_window_timer); - data.starred_only = this.flags.starred_only; - var $error = $('.NB-intro-import-google .NB-error', this.$modal); - var $loading = $('.NB-intro-imports-progress .NB-loading', this.$modal); - if (data && data.error) { - $error.show().text(data.error); - this.advance_import_carousel(0); - } else { - $error.hide(); - NEWSBLUR.reader.flags.importing_from_google_reader = false; - this.advance_import_carousel(1, data); - $loading.addClass('NB-active'); - if (data && data.starred_only) { - NEWSBLUR.assets.start_import_starred_stories_from_google_reader( - _.bind(this.finish_import_from_google_reader, this)); - } else { - NEWSBLUR.assets.start_import_from_google_reader( - _.bind(this.finish_import_from_google_reader, this)); - } - } - }, - - finish_import_from_google_reader: function(data) { - var self = this; - console.log(["finish_import_from_google_reader", data]); - var $loading = $('.NB-intro-imports-progress .NB-loading', this.$modal); - - NEWSBLUR.assets.load_feeds(_.bind(function() { - $loading.removeClass('NB-active'); - this.advance_import_carousel(2); - if (data.delayed) { - NEWSBLUR.reader.flags.delayed_import = true; - self.count_feeds({fake_count: data.feed_count}); - $('.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().removeClass('NB-error').text("All done!"); - } - }, this)); - }, - handle_opml_upload: function() { var self = this; var $loading = $('.NB-intro-imports-progress .NB-loading', this.$modal); @@ -746,10 +670,6 @@ _.extend(NEWSBLUR.ReaderIntro.prototype, { self.close_and_load_newsblur_blog(); }); - $.targetIs(e, { tagSelector: '.NB-google-reader-oauth' }, function($t, $p) { - e.preventDefault(); - self.google_reader_connect(); - }); $.targetIs(e, { tagSelector: '.NB-starredimport-button' }, function($t, $p) { e.preventDefault(); // self.google_reader_connect({'starred_only': true}); diff --git a/templates/base.html b/templates/base.html index 50a731473..8b18b4253 100644 --- a/templates/base.html +++ b/templates/base.html @@ -30,7 +30,6 @@ 'debug' : {{ debug|yesno:"true,false" }} }; NEWSBLUR.Flags = { - 'start_import_from_google_reader': {{ start_import_from_google_reader|yesno:"true,false" }} }; NEWSBLUR.Preferences = { 'unread_view' : 0, @@ -96,7 +95,6 @@ 'story_share_email' : true }; NEWSBLUR.URLs = { - 'google-reader-authorize' : "{% url "google-reader-authorize" %}", 'upload-avatar' : "{% url "upload-avatar" %}", 'opml-upload' : "{% url "opml-upload" %}", 'opml-export' : "{% url "opml-export" %}", diff --git a/templates/mobile/mobile_workspace.xhtml b/templates/mobile/mobile_workspace.xhtml index 72ad60385..70c7332cf 100644 --- a/templates/mobile/mobile_workspace.xhtml +++ b/templates/mobile/mobile_workspace.xhtml @@ -24,7 +24,6 @@ 'MEDIA_URL' : "{{ MEDIA_URL }}" }; NEWSBLUR.Flags = { - 'start_import_from_google_reader': {{ start_import_from_google_reader|yesno:"true,false" }} }; NEWSBLUR.URLs = { 'domain' : "{% current_domain %}" diff --git a/templates/reader/manage_module.xhtml b/templates/reader/manage_module.xhtml index 89ad4c58a..58a44819a 100644 --- a/templates/reader/manage_module.xhtml +++ b/templates/reader/manage_module.xhtml @@ -8,6 +8,19 @@