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' %} + +
+ {{ activity.content }} +
+
+ {{ activity.time_since }} ago +
+ {% endif %} + {% endfor %} - \ No newline at end of file +