Removing Google Reader traces.

This commit is contained in:
Samuel Clay 2020-06-10 19:24:02 -04:00
parent 33e27834a5
commit 953b9712c2
13 changed files with 50 additions and 388 deletions

View file

@ -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])

View file

@ -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')
)

View file

@ -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))

View file

@ -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"

View file

@ -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 {

View file

@ -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;

View file

@ -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);

View file

@ -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();

View file

@ -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});

View file

@ -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" %}",

View file

@ -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 %}"

View file

@ -8,6 +8,19 @@
<div class="NB-module-item">
<div class="NB-module-stats-counts">
<ul class="NB-menu-manage NB-menu-manage-notop">
<li class="NB-menu-item NB-menu-manage-theme">
<div class="NB-menu-manage-image"></div>
<ul class="segmented-control NB-options-theme">
<li class="NB-taskbar-button NB-options-theme-light">
<div class="NB-task-image"></div>
<span class="NB-task-title">Light</span>
</li>
<li class="NB-taskbar-button NB-options-theme-dark">
<div class="NB-task-image"></div>
<span class="NB-task-title">Dark</span>
</li>
</ul>
</li>
<li class="NB-menu-item NB-menu-manage-preferences">
<div class="NB-menu-manage-image"></div>
<div class="NB-menu-manage-title">

View file

@ -59,24 +59,7 @@
}, 1000);
} else if (opener && opener.NEWSBLUR) {
console.log(["Found opener", opener.NEWSBLUR]);
if (opener.NEWSBLUR.reader.flags.importing_from_google_reader) {
console.log(['Importing from Reader']);
if (opener.NEWSBLUR.intro) {
console.log(['Using Intro dialog']);
opener.NEWSBLUR.intro.start_import_from_google_reader({
{% if error %}
'error': "{{ error }}"
{% endif %}
});
} else {
console.log(['Using some other dialog']);
opener.NEWSBLUR.reader.post_google_reader_connect({
{% if error %}
'error': "{{ error }}"
{% endif %}
});
}
} else if (opener.NEWSBLUR.intro) {
if (opener.NEWSBLUR.intro) {
console.log(['Connecting through intro']);
opener.NEWSBLUR.intro.post_connect({
{% if error %}