mirror of
https://github.com/samuelclay/NewsBlur.git
synced 2025-08-31 21:41:33 +00:00
Merge branch 'master' into testflight
* master: Showing OPML backup exports and imports in activity popover. Closes #1646. Don't accept anything under /api/* unless explicit. This would've prevented the #1575 url miscommunication by returning a 404. /api/add_url for #1575. Accepted GET or POST for /api/add_site. For #1575.
This commit is contained in:
commit
233fa98e89
10 changed files with 72 additions and 9 deletions
|
@ -7,7 +7,9 @@ urlpatterns = [
|
||||||
url(r'^signup', views.signup, name='api-signup'),
|
url(r'^signup', views.signup, name='api-signup'),
|
||||||
url(r'^add_site_load_script/(?P<token>\w+)', views.add_site_load_script, name='api-add-site-load-script'),
|
url(r'^add_site_load_script/(?P<token>\w+)', views.add_site_load_script, name='api-add-site-load-script'),
|
||||||
url(r'^add_site/(?P<token>\w+)', views.add_site, name='api-add-site'),
|
url(r'^add_site/(?P<token>\w+)', views.add_site, name='api-add-site'),
|
||||||
|
url(r'^add_url/(?P<token>\w+)', views.add_site, name='api-add-site'),
|
||||||
url(r'^add_site/?$', views.add_site_authed, name='api-add-site-authed'),
|
url(r'^add_site/?$', views.add_site_authed, name='api-add-site-authed'),
|
||||||
|
url(r'^add_url/?$', views.add_site_authed, name='api-add-site-authed'),
|
||||||
url(r'^check_share_on_site/(?P<token>\w+)', views.check_share_on_site, name='api-check-share-on-site'),
|
url(r'^check_share_on_site/(?P<token>\w+)', views.check_share_on_site, name='api-check-share-on-site'),
|
||||||
url(r'^share_story/(?P<token>\w+)', views.share_story, name='api-share-story'),
|
url(r'^share_story/(?P<token>\w+)', views.share_story, name='api-share-story'),
|
||||||
url(r'^save_story/(?P<token>\w+)', views.save_story, name='api-save-story'),
|
url(r'^save_story/(?P<token>\w+)', views.save_story, name='api-save-story'),
|
||||||
|
|
|
@ -125,10 +125,11 @@ def add_site_load_script(request, token):
|
||||||
|
|
||||||
def add_site(request, token):
|
def add_site(request, token):
|
||||||
code = 0
|
code = 0
|
||||||
url = request.GET['url']
|
get_post = getattr(request, request.method)
|
||||||
folder = request.GET['folder']
|
url = get_post.get('url')
|
||||||
new_folder = request.GET.get('new_folder')
|
folder = get_post.get('folder')
|
||||||
callback = request.GET.get('callback', '')
|
new_folder = get_post.get('new_folder')
|
||||||
|
callback = get_post.get('callback', '')
|
||||||
|
|
||||||
if not url:
|
if not url:
|
||||||
code = -1
|
code = -1
|
||||||
|
|
|
@ -2,6 +2,7 @@ from newsblur_web.celeryapp import app
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from apps.feed_import.models import UploadedOPML, OPMLImporter
|
from apps.feed_import.models import UploadedOPML, OPMLImporter
|
||||||
from apps.reader.models import UserSubscription
|
from apps.reader.models import UserSubscription
|
||||||
|
from apps.social.models import MActivity
|
||||||
from utils import log as logging
|
from utils import log as logging
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,5 +19,7 @@ def ProcessOPML(user_id):
|
||||||
user.profile.send_upload_opml_finished_email(feed_count)
|
user.profile.send_upload_opml_finished_email(feed_count)
|
||||||
logging.user(user, "~FR~SBOPML upload (task): ~SK%s~SN~SB~FR feeds" % (feed_count))
|
logging.user(user, "~FR~SBOPML upload (task): ~SK%s~SN~SB~FR feeds" % (feed_count))
|
||||||
|
|
||||||
|
MActivity.new_opml_import(user_id=user.pk, count=feed_count)
|
||||||
|
|
||||||
UserSubscription.queue_new_feeds(user)
|
UserSubscription.queue_new_feeds(user)
|
||||||
UserSubscription.refresh_stale_feeds(user, exclude_new=True)
|
UserSubscription.refresh_stale_feeds(user, exclude_new=True)
|
||||||
|
|
|
@ -63,6 +63,8 @@ def opml_upload(request):
|
||||||
feeds = UserSubscription.objects.filter(user=request.user).values()
|
feeds = UserSubscription.objects.filter(user=request.user).values()
|
||||||
payload = dict(folders=folders, feeds=feeds)
|
payload = dict(folders=folders, feeds=feeds)
|
||||||
logging.user(request, "~FR~SBOPML Upload: ~SK%s~SN~SB~FR feeds" % (len(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.queue_new_feeds(request.user)
|
||||||
UserSubscription.refresh_stale_feeds(request.user, exclude_new=True)
|
UserSubscription.refresh_stale_feeds(request.user, exclude_new=True)
|
||||||
else:
|
else:
|
||||||
|
@ -79,7 +81,10 @@ def opml_export(request):
|
||||||
user = User.objects.get(pk=request.GET['user_id'])
|
user = User.objects.get(pk=request.GET['user_id'])
|
||||||
exporter = OPMLExporter(user)
|
exporter = OPMLExporter(user)
|
||||||
opml = exporter.process()
|
opml = exporter.process()
|
||||||
|
|
||||||
|
from apps.social.models import MActivity
|
||||||
|
MActivity.new_opml_export(user_id=user.pk)
|
||||||
|
|
||||||
response = HttpResponse(opml, content_type='text/xml; charset=utf-8')
|
response = HttpResponse(opml, content_type='text/xml; charset=utf-8')
|
||||||
response['Content-Disposition'] = 'attachment; filename=NewsBlur-%s-%s.opml' % (
|
response['Content-Disposition'] = 'attachment; filename=NewsBlur-%s-%s.opml' % (
|
||||||
user.username,
|
user.username,
|
||||||
|
|
|
@ -758,6 +758,9 @@ class Profile(models.Model):
|
||||||
msg.attach(filename, opml, 'text/xml')
|
msg.attach(filename, opml, 'text/xml')
|
||||||
msg.send(fail_silently=True)
|
msg.send(fail_silently=True)
|
||||||
|
|
||||||
|
from apps.social.models import MActivity
|
||||||
|
MActivity.new_opml_export(user_id=self.user.pk, automated=True)
|
||||||
|
|
||||||
logging.user(self.user, "~BB~FM~SBSending OPML backup email to: %s" % self.user.email)
|
logging.user(self.user, "~BB~FM~SBSending OPML backup email to: %s" % self.user.email)
|
||||||
|
|
||||||
def send_first_share_to_blurblog_email(self, force=False):
|
def send_first_share_to_blurblog_email(self, force=False):
|
||||||
|
|
|
@ -3157,7 +3157,7 @@ class MActivity(mongo.Document):
|
||||||
if categories:
|
if categories:
|
||||||
activities_db = activities_db.filter(category__in=categories)
|
activities_db = activities_db.filter(category__in=categories)
|
||||||
if public:
|
if public:
|
||||||
activities_db = activities_db.filter(category__nin=['star', 'feedsub'])
|
activities_db = activities_db.filter(category__nin=['star', 'feedsub', 'opml_import', 'opml_export'])
|
||||||
activities_db = activities_db[offset:offset+limit+1]
|
activities_db = activities_db[offset:offset+limit+1]
|
||||||
|
|
||||||
has_next_page = len(activities_db) > limit
|
has_next_page = len(activities_db) > limit
|
||||||
|
@ -3219,6 +3219,28 @@ class MActivity(mongo.Document):
|
||||||
for dupe in dupes[1:]:
|
for dupe in dupes[1:]:
|
||||||
dupe.delete()
|
dupe.delete()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def new_opml_import(cls, user_id, count):
|
||||||
|
if count <= 0:
|
||||||
|
return
|
||||||
|
|
||||||
|
params = {
|
||||||
|
"user_id": user_id,
|
||||||
|
"category": 'opml_import',
|
||||||
|
'content': f"You imported an OPML file with {count} sites"
|
||||||
|
}
|
||||||
|
cls.objects.create(**params)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def new_opml_export(cls, user_id, automated=False):
|
||||||
|
params = {
|
||||||
|
"user_id": user_id,
|
||||||
|
"category": 'opml_export',
|
||||||
|
'content': "You exported an OPML backup of your subscriptions"
|
||||||
|
}
|
||||||
|
if automated:
|
||||||
|
params['content'] = "An automatic OPML backup was emailed to you"
|
||||||
|
cls.objects.create(**params)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def new_follow(cls, follower_user_id, followee_user_id):
|
def new_follow(cls, follower_user_id, followee_user_id):
|
||||||
|
|
|
@ -6932,6 +6932,23 @@
|
||||||
self.close_social_profile();
|
self.close_social_profile();
|
||||||
self.open_feed(feed_id);
|
self.open_feed(feed_id);
|
||||||
});
|
});
|
||||||
|
$.targetIs(e, { tagSelector: '.NB-activity-opml_import' }, function($t, $p){
|
||||||
|
e.preventDefault();
|
||||||
|
self.close_interactions_popover();
|
||||||
|
self.close_social_profile();
|
||||||
|
|
||||||
|
NEWSBLUR.reader.open_intro_modal({
|
||||||
|
'page_number': 2,
|
||||||
|
'force_import': true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
$.targetIs(e, { tagSelector: '.NB-activity-opml_export' }, function($t, $p){
|
||||||
|
e.preventDefault();
|
||||||
|
self.close_interactions_popover();
|
||||||
|
self.close_social_profile();
|
||||||
|
|
||||||
|
self.open_account_modal();
|
||||||
|
});
|
||||||
|
|
||||||
// = One-offs =====================================================
|
// = One-offs =====================================================
|
||||||
|
|
||||||
|
|
|
@ -113,7 +113,7 @@ NEWSBLUR.InteractionsPopover = NEWSBLUR.ReaderPopover.extend({
|
||||||
|
|
||||||
// load_interactions_page or load_activities_page
|
// load_interactions_page or load_activities_page
|
||||||
this.model['load_'+this.options.tab+'_page'](this.page, _.bind(function(resp, type) {
|
this.model['load_'+this.options.tab+'_page'](this.page, _.bind(function(resp, type) {
|
||||||
console.log(["type", type, this.options.tab]);
|
// console.log(["type", type, this.options.tab]);
|
||||||
if (type != this.options.tab) return;
|
if (type != this.options.tab) return;
|
||||||
this.fetching = false;
|
this.fetching = false;
|
||||||
this.hide_loading();
|
this.hide_loading();
|
||||||
|
|
|
@ -50,7 +50,7 @@ urlpatterns = [
|
||||||
url(r'^admin/', admin.site.urls),
|
url(r'^admin/', admin.site.urls),
|
||||||
url(r'^about/?', static_views.about, name='about'),
|
url(r'^about/?', static_views.about, name='about'),
|
||||||
url(r'^faq/?', static_views.faq, name='faq'),
|
url(r'^faq/?', static_views.faq, name='faq'),
|
||||||
url(r'^api/?', static_views.api, name='api'),
|
url(r'^api/?$', static_views.api, name='api'),
|
||||||
url(r'^press/?', static_views.press, name='press'),
|
url(r'^press/?', static_views.press, name='press'),
|
||||||
url(r'^feedback/?', static_views.feedback, name='feedback'),
|
url(r'^feedback/?', static_views.feedback, name='feedback'),
|
||||||
url(r'^privacy/?', static_views.privacy, name='privacy'),
|
url(r'^privacy/?', static_views.privacy, name='privacy'),
|
||||||
|
|
|
@ -90,6 +90,16 @@
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
{% if activity.category == 'opml_import' or activity.category == 'opml_export' %}
|
||||||
|
<img class="NB-interaction-photo" src="{{ MEDIA_URL }}img/icons/circular/g_icn_folder_rss.png">
|
||||||
|
<div class="NB-interaction-title">
|
||||||
|
{{ activity.content }}
|
||||||
|
</div>
|
||||||
|
<div class="NB-interaction-date">
|
||||||
|
{{ activity.time_since }} ago
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
|
|
Loading…
Add table
Reference in a new issue