diff --git a/apps/feed_import/tasks.py b/apps/feed_import/tasks.py
index 182ed9985..8f9d7e67f 100644
--- a/apps/feed_import/tasks.py
+++ b/apps/feed_import/tasks.py
@@ -2,6 +2,7 @@ from newsblur_web.celeryapp import app
from django.contrib.auth.models import User
from apps.feed_import.models import UploadedOPML, OPMLImporter
from apps.reader.models import UserSubscription
+from apps.social.models import MActivity
from utils import log as logging
@@ -18,5 +19,7 @@ def ProcessOPML(user_id):
user.profile.send_upload_opml_finished_email(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.refresh_stale_feeds(user, exclude_new=True)
diff --git a/apps/feed_import/views.py b/apps/feed_import/views.py
index 85ef980b1..56842085e 100644
--- a/apps/feed_import/views.py
+++ b/apps/feed_import/views.py
@@ -63,6 +63,8 @@ def opml_upload(request):
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)))
+ 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.refresh_stale_feeds(request.user, exclude_new=True)
else:
@@ -79,7 +81,10 @@ def opml_export(request):
user = User.objects.get(pk=request.GET['user_id'])
exporter = OPMLExporter(user)
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['Content-Disposition'] = 'attachment; filename=NewsBlur-%s-%s.opml' % (
user.username,
diff --git a/apps/profile/models.py b/apps/profile/models.py
index c74ee0e94..c36a7c8e6 100644
--- a/apps/profile/models.py
+++ b/apps/profile/models.py
@@ -758,6 +758,9 @@ class Profile(models.Model):
msg.attach(filename, opml, 'text/xml')
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)
def send_first_share_to_blurblog_email(self, force=False):
diff --git a/apps/social/models.py b/apps/social/models.py
index 7159b42bc..781a5237f 100644
--- a/apps/social/models.py
+++ b/apps/social/models.py
@@ -3157,7 +3157,7 @@ class MActivity(mongo.Document):
if categories:
activities_db = activities_db.filter(category__in=categories)
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]
has_next_page = len(activities_db) > limit
@@ -3219,6 +3219,28 @@ class MActivity(mongo.Document):
for dupe in dupes[1:]:
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
def new_follow(cls, follower_user_id, followee_user_id):
diff --git a/media/js/newsblur/reader/reader.js b/media/js/newsblur/reader/reader.js
index 067a29164..cd64d6c53 100644
--- a/media/js/newsblur/reader/reader.js
+++ b/media/js/newsblur/reader/reader.js
@@ -6932,6 +6932,23 @@
self.close_social_profile();
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 =====================================================
diff --git a/media/js/newsblur/views/interactions_popover.js b/media/js/newsblur/views/interactions_popover.js
index afd05e3cd..1ccbc2c99 100644
--- a/media/js/newsblur/views/interactions_popover.js
+++ b/media/js/newsblur/views/interactions_popover.js
@@ -113,7 +113,7 @@ NEWSBLUR.InteractionsPopover = NEWSBLUR.ReaderPopover.extend({
// load_interactions_page or load_activities_page
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;
this.fetching = false;
this.hide_loading();
diff --git a/templates/reader/activities_module.xhtml b/templates/reader/activities_module.xhtml
index 50df80d1b..f5e0d2d10 100644
--- a/templates/reader/activities_module.xhtml
+++ b/templates/reader/activities_module.xhtml
@@ -90,6 +90,16 @@
{% endif %}
+ {% if activity.category == 'opml_import' or activity.category == 'opml_export' %}
+
+