2012-04-24 12:54:37 -07:00
|
|
|
import time
|
2011-12-15 09:10:37 -08:00
|
|
|
import datetime
|
2011-12-17 13:05:11 -08:00
|
|
|
import zlib
|
2012-07-06 13:48:06 -07:00
|
|
|
import random
|
2012-07-27 18:58:35 -07:00
|
|
|
from bson.objectid import ObjectId
|
2012-06-29 21:06:33 -07:00
|
|
|
from django.shortcuts import get_object_or_404, render_to_response
|
2011-12-17 13:05:11 -08:00
|
|
|
from django.core.urlresolvers import reverse
|
|
|
|
from django.contrib.auth.models import User
|
2012-04-19 19:09:31 -07:00
|
|
|
from django.template.loader import render_to_string
|
2011-12-17 13:05:11 -08:00
|
|
|
from django.http import HttpResponse, HttpResponseRedirect, Http404
|
2011-12-20 11:49:49 -08:00
|
|
|
from django.conf import settings
|
2012-06-29 21:06:33 -07:00
|
|
|
from django.template import RequestContext
|
2012-01-26 08:43:46 -08:00
|
|
|
from apps.rss_feeds.models import MStory, Feed, MStarredStory
|
2012-03-22 19:37:19 -07:00
|
|
|
from apps.social.models import MSharedStory, MSocialServices, MSocialProfile, MSocialSubscription, MCommentReply
|
2012-07-28 18:33:07 -07:00
|
|
|
from apps.social.models import MInteraction, MActivity
|
2012-07-05 19:50:02 -07:00
|
|
|
from apps.social.tasks import PostToService, EmailCommentReplies, EmailStoryReshares
|
2012-01-26 08:43:46 -08:00
|
|
|
from apps.analyzer.models import MClassifierTitle, MClassifierAuthor, MClassifierFeed, MClassifierTag
|
|
|
|
from apps.analyzer.models import apply_classifier_titles, apply_classifier_feeds, apply_classifier_authors, apply_classifier_tags
|
2012-05-29 11:48:40 -07:00
|
|
|
from apps.analyzer.models import get_classifiers_for_user, sort_classifiers_by_feed
|
2012-01-26 09:32:24 -08:00
|
|
|
from apps.reader.models import MUserStory, UserSubscription
|
2012-07-05 18:29:38 -07:00
|
|
|
from apps.profile.models import Profile
|
2011-12-15 09:10:37 -08:00
|
|
|
from utils import json_functions as json
|
|
|
|
from utils import log as logging
|
2011-12-17 13:05:11 -08:00
|
|
|
from utils import PyRSS2Gen as RSS
|
2012-01-24 09:02:23 -08:00
|
|
|
from utils.user_functions import get_user, ajax_login_required
|
|
|
|
from utils.view_functions import render_to
|
|
|
|
from utils.story_functions import format_story_link_date__short
|
|
|
|
from utils.story_functions import format_story_link_date__long
|
2012-07-23 13:08:48 -07:00
|
|
|
from utils.story_functions import strip_tags
|
2012-07-06 13:48:06 -07:00
|
|
|
from utils import jennyholzer
|
2012-01-24 09:02:23 -08:00
|
|
|
from vendor.timezones.utilities import localtime_for_timezone
|
2011-12-17 13:05:11 -08:00
|
|
|
|
2012-04-05 13:51:08 -07:00
|
|
|
|
2012-01-24 09:02:23 -08:00
|
|
|
@json.json_view
|
2012-01-31 10:15:11 -08:00
|
|
|
def load_social_stories(request, user_id, username=None):
|
2012-07-19 23:29:11 -07:00
|
|
|
start = time.time()
|
|
|
|
user = get_user(request)
|
2012-01-31 10:15:11 -08:00
|
|
|
social_user_id = int(user_id)
|
2012-07-19 23:29:11 -07:00
|
|
|
social_user = get_object_or_404(User, pk=social_user_id)
|
|
|
|
offset = int(request.REQUEST.get('offset', 0))
|
|
|
|
limit = int(request.REQUEST.get('limit', 6))
|
|
|
|
page = request.REQUEST.get('page')
|
|
|
|
order = request.REQUEST.get('order', 'newest')
|
|
|
|
read_filter = request.REQUEST.get('read_filter', 'all')
|
2012-07-24 17:16:01 -07:00
|
|
|
stories = []
|
|
|
|
|
2012-01-24 09:02:23 -08:00
|
|
|
if page: offset = limit * (int(page) - 1)
|
|
|
|
now = localtime_for_timezone(datetime.datetime.now(), user.profile.timezone)
|
2012-02-15 18:00:10 -08:00
|
|
|
UNREAD_CUTOFF = datetime.datetime.utcnow() - datetime.timedelta(days=settings.DAYS_OF_UNREAD)
|
2012-07-06 14:19:41 -07:00
|
|
|
|
2012-07-25 23:57:10 -07:00
|
|
|
social_profile = MSocialProfile.get_user(social_user.pk)
|
2012-07-19 23:29:11 -07:00
|
|
|
try:
|
|
|
|
socialsub = MSocialSubscription.objects.get(user_id=user.pk, subscription_user_id=social_user_id)
|
|
|
|
except MSocialSubscription.DoesNotExist:
|
|
|
|
socialsub = None
|
2012-01-24 09:02:23 -08:00
|
|
|
|
2012-07-19 23:29:11 -07:00
|
|
|
if socialsub and (read_filter == 'unread' or order == 'oldest'):
|
|
|
|
story_ids = socialsub.get_stories(order=order, read_filter=read_filter, offset=offset, limit=limit)
|
|
|
|
story_date_order = "%sshared_date" % ('' if order == 'oldest' else '-')
|
2012-07-24 17:16:01 -07:00
|
|
|
if story_ids:
|
|
|
|
mstories = MSharedStory.objects(user_id=social_user.pk,
|
|
|
|
story_db_id__in=story_ids).order_by(story_date_order)
|
|
|
|
stories = Feed.format_stories(mstories)
|
2012-07-19 23:29:11 -07:00
|
|
|
else:
|
|
|
|
mstories = MSharedStory.objects(user_id=social_user.pk).order_by('-shared_date')[offset:offset+limit]
|
|
|
|
stories = Feed.format_stories(mstories)
|
|
|
|
|
2012-01-26 08:43:46 -08:00
|
|
|
if not stories:
|
|
|
|
return dict(stories=[])
|
2012-07-06 14:19:41 -07:00
|
|
|
|
|
|
|
checkpoint1 = time.time()
|
|
|
|
|
2012-06-29 21:06:33 -07:00
|
|
|
stories, user_profiles = MSharedStory.stories_with_comments_and_profiles(stories, user.pk, check_all=True)
|
2012-01-26 08:43:46 -08:00
|
|
|
|
2012-02-03 11:41:01 -08:00
|
|
|
story_feed_ids = list(set(s['story_feed_id'] for s in stories))
|
2012-01-26 09:32:24 -08:00
|
|
|
usersubs = UserSubscription.objects.filter(user__pk=user.pk, feed__pk__in=story_feed_ids)
|
2012-01-26 09:54:48 -08:00
|
|
|
usersubs_map = dict((sub.feed_id, sub) for sub in usersubs)
|
2012-01-26 18:59:40 -08:00
|
|
|
unsub_feed_ids = list(set(story_feed_ids).difference(set(usersubs_map.keys())))
|
|
|
|
unsub_feeds = Feed.objects.filter(pk__in=unsub_feed_ids)
|
2012-05-29 11:48:40 -07:00
|
|
|
unsub_feeds = [feed.canonical(include_favicon=False) for feed in unsub_feeds]
|
2012-02-15 18:00:10 -08:00
|
|
|
date_delta = UNREAD_CUTOFF
|
2012-03-14 12:38:59 -07:00
|
|
|
if socialsub and date_delta < socialsub.mark_read_date:
|
2012-02-15 18:00:10 -08:00
|
|
|
date_delta = socialsub.mark_read_date
|
2012-01-26 09:32:24 -08:00
|
|
|
|
2012-01-26 08:43:46 -08:00
|
|
|
# Get intelligence classifier for user
|
2012-02-15 18:00:10 -08:00
|
|
|
classifier_feeds = list(MClassifierFeed.objects(user_id=user.pk, social_user_id=social_user_id))
|
|
|
|
classifier_authors = list(MClassifierAuthor.objects(user_id=user.pk, social_user_id=social_user_id))
|
|
|
|
classifier_titles = list(MClassifierTitle.objects(user_id=user.pk, social_user_id=social_user_id))
|
|
|
|
classifier_tags = list(MClassifierTag.objects(user_id=user.pk, social_user_id=social_user_id))
|
2012-03-22 15:27:28 -07:00
|
|
|
# Merge with feed specific classifiers
|
|
|
|
classifier_feeds = classifier_feeds + list(MClassifierFeed.objects(user_id=user.pk, feed_id__in=story_feed_ids))
|
|
|
|
classifier_authors = classifier_authors + list(MClassifierAuthor.objects(user_id=user.pk, feed_id__in=story_feed_ids))
|
|
|
|
classifier_titles = classifier_titles + list(MClassifierTitle.objects(user_id=user.pk, feed_id__in=story_feed_ids))
|
|
|
|
classifier_tags = classifier_tags + list(MClassifierTag.objects(user_id=user.pk, feed_id__in=story_feed_ids))
|
2012-02-24 10:12:32 -08:00
|
|
|
|
2012-07-06 14:19:41 -07:00
|
|
|
checkpoint2 = time.time()
|
|
|
|
|
2012-01-26 08:43:46 -08:00
|
|
|
story_ids = [story['id'] for story in stories]
|
|
|
|
userstories_db = MUserStory.objects(user_id=user.pk,
|
|
|
|
feed_id__in=story_feed_ids,
|
2012-02-24 10:12:32 -08:00
|
|
|
story_id__in=story_ids).only('story_id')
|
2012-02-10 13:53:33 -08:00
|
|
|
userstories = set(us.story_id for us in userstories_db)
|
2012-02-24 10:12:32 -08:00
|
|
|
|
2012-01-26 08:43:46 -08:00
|
|
|
starred_stories = MStarredStory.objects(user_id=user.pk,
|
|
|
|
story_guid__in=story_ids).only('story_guid', 'starred_date')
|
|
|
|
shared_stories = MSharedStory.objects(user_id=user.pk,
|
|
|
|
story_guid__in=story_ids)\
|
|
|
|
.only('story_guid', 'shared_date', 'comments')
|
|
|
|
starred_stories = dict([(story.story_guid, story.starred_date) for story in starred_stories])
|
|
|
|
shared_stories = dict([(story.story_guid, dict(shared_date=story.shared_date, comments=story.comments))
|
|
|
|
for story in shared_stories])
|
2012-01-26 09:54:48 -08:00
|
|
|
|
2012-01-24 09:02:23 -08:00
|
|
|
for story in stories:
|
2012-02-03 11:41:01 -08:00
|
|
|
story['social_user_id'] = social_user_id
|
2012-01-26 09:54:48 -08:00
|
|
|
story_feed_id = story['story_feed_id']
|
2012-02-16 18:36:52 -08:00
|
|
|
# story_date = localtime_for_timezone(story['story_date'], user.profile.timezone)
|
2012-01-24 09:02:23 -08:00
|
|
|
shared_date = localtime_for_timezone(story['shared_date'], user.profile.timezone)
|
2012-02-15 18:00:10 -08:00
|
|
|
story['short_parsed_date'] = format_story_link_date__short(shared_date, now)
|
|
|
|
story['long_parsed_date'] = format_story_link_date__long(shared_date, now)
|
2012-02-24 10:12:32 -08:00
|
|
|
|
2012-05-14 16:43:27 -07:00
|
|
|
if not socialsub:
|
|
|
|
story['read_status'] = 1
|
|
|
|
elif story['id'] in userstories:
|
2012-01-26 08:43:46 -08:00
|
|
|
story['read_status'] = 1
|
2012-02-15 18:00:10 -08:00
|
|
|
elif story['shared_date'] < date_delta:
|
|
|
|
story['read_status'] = 1
|
2012-01-26 09:54:48 -08:00
|
|
|
elif not usersubs_map.get(story_feed_id):
|
|
|
|
story['read_status'] = 0
|
2012-08-10 13:28:35 -07:00
|
|
|
elif not story.get('read_status') and story['shared_date'] < usersubs_map[story_feed_id].mark_read_date:
|
2012-04-03 16:37:05 -07:00
|
|
|
story['read_status'] = 1
|
2012-02-24 10:12:32 -08:00
|
|
|
elif not story.get('read_status') and story['shared_date'] < date_delta:
|
2012-01-26 08:43:46 -08:00
|
|
|
story['read_status'] = 1
|
2012-03-14 12:38:59 -07:00
|
|
|
# elif not story.get('read_status') and socialsub and story['shared_date'] > socialsub.last_read_date:
|
2012-02-15 18:00:10 -08:00
|
|
|
# story['read_status'] = 0
|
2012-02-24 10:12:32 -08:00
|
|
|
else:
|
|
|
|
story['read_status'] = 0
|
2012-03-07 17:34:22 -08:00
|
|
|
|
2012-01-26 08:43:46 -08:00
|
|
|
if story['id'] in starred_stories:
|
|
|
|
story['starred'] = True
|
|
|
|
starred_date = localtime_for_timezone(starred_stories[story['id']], user.profile.timezone)
|
|
|
|
story['starred_date'] = format_story_link_date__long(starred_date, now)
|
|
|
|
if story['id'] in shared_stories:
|
|
|
|
story['shared'] = True
|
2012-07-21 16:38:37 -07:00
|
|
|
story['shared_comments'] = strip_tags(shared_stories[story['id']]['comments'])
|
2012-01-26 08:43:46 -08:00
|
|
|
|
2012-01-24 09:02:23 -08:00
|
|
|
story['intelligence'] = {
|
2012-04-12 11:18:56 -07:00
|
|
|
'feed': apply_classifier_feeds(classifier_feeds, story['story_feed_id'],
|
2012-09-24 17:38:46 -07:00
|
|
|
social_user_ids=social_user_id),
|
2012-01-26 08:43:46 -08:00
|
|
|
'author': apply_classifier_authors(classifier_authors, story),
|
|
|
|
'tags': apply_classifier_tags(classifier_tags, story),
|
|
|
|
'title': apply_classifier_titles(classifier_titles, story),
|
2012-01-24 09:02:23 -08:00
|
|
|
}
|
2012-04-24 12:54:37 -07:00
|
|
|
|
2012-05-29 11:48:40 -07:00
|
|
|
|
|
|
|
classifiers = sort_classifiers_by_feed(user=user, feed_ids=story_feed_ids,
|
|
|
|
classifier_feeds=classifier_feeds,
|
|
|
|
classifier_authors=classifier_authors,
|
|
|
|
classifier_titles=classifier_titles,
|
|
|
|
classifier_tags=classifier_tags)
|
2012-04-24 12:54:37 -07:00
|
|
|
if socialsub:
|
|
|
|
socialsub.feed_opens += 1
|
2012-08-10 14:22:51 -07:00
|
|
|
socialsub.needs_unread_recalc = True
|
2012-04-24 12:54:37 -07:00
|
|
|
socialsub.save()
|
|
|
|
|
2012-07-06 14:19:41 -07:00
|
|
|
diff1 = checkpoint1-start
|
|
|
|
diff2 = checkpoint2-start
|
2012-07-14 07:50:53 -07:00
|
|
|
logging.user(request, "~FYLoading ~FMshared stories~FY: ~SB%s%s ~SN(~SB%.4ss/%.4ss~SN)" % (
|
|
|
|
social_profile.title[:22], ('~SN/p%s' % page) if page > 1 else '', diff1, diff2))
|
2012-07-06 14:19:41 -07:00
|
|
|
|
2012-05-29 11:48:40 -07:00
|
|
|
return {
|
|
|
|
"stories": stories,
|
|
|
|
"user_profiles": user_profiles,
|
|
|
|
"feeds": unsub_feeds,
|
|
|
|
"classifiers": classifiers,
|
|
|
|
}
|
2012-08-07 14:37:07 -07:00
|
|
|
|
|
|
|
@json.json_view
|
|
|
|
def load_river_blurblog(request):
|
2012-08-07 23:55:03 -07:00
|
|
|
limit = 10
|
2012-08-07 14:37:07 -07:00
|
|
|
start = time.time()
|
|
|
|
user = get_user(request)
|
|
|
|
social_user_ids = [int(uid) for uid in request.REQUEST.getlist('social_user_ids') if uid]
|
|
|
|
original_user_ids = list(social_user_ids)
|
|
|
|
page = int(request.REQUEST.get('page', 1))
|
|
|
|
order = request.REQUEST.get('order', 'newest')
|
|
|
|
read_filter = request.REQUEST.get('read_filter', 'unread')
|
|
|
|
relative_user_id = request.REQUEST.get('relative_user_id', None)
|
|
|
|
now = localtime_for_timezone(datetime.datetime.now(), user.profile.timezone)
|
|
|
|
UNREAD_CUTOFF = datetime.datetime.utcnow() - datetime.timedelta(days=settings.DAYS_OF_UNREAD)
|
|
|
|
|
|
|
|
if not relative_user_id:
|
|
|
|
relative_user_id = get_user(request).pk
|
|
|
|
|
|
|
|
if not social_user_ids:
|
|
|
|
socialsubs = MSocialSubscription.objects.filter(user_id=user.pk)
|
|
|
|
social_user_ids = [s.subscription_user_id for s in socialsubs]
|
|
|
|
|
|
|
|
offset = (page-1) * limit
|
|
|
|
limit = page * limit - 1
|
|
|
|
|
2012-08-07 23:55:03 -07:00
|
|
|
story_ids, story_dates = MSocialSubscription.feed_stories(user.pk, social_user_ids,
|
2012-08-07 14:37:07 -07:00
|
|
|
offset=offset, limit=limit,
|
|
|
|
order=order, read_filter=read_filter)
|
2012-08-07 23:55:03 -07:00
|
|
|
mstories = MStory.objects(id__in=story_ids)
|
2012-08-08 19:13:10 -07:00
|
|
|
story_id_to_dates = dict(zip(story_ids, story_dates))
|
|
|
|
def sort_stories_by_id(a, b):
|
|
|
|
return int(story_id_to_dates[str(b.id)]) - int(story_id_to_dates[str(a.id)])
|
|
|
|
sorted_mstories = sorted(mstories, cmp=sort_stories_by_id)
|
|
|
|
stories = Feed.format_stories(sorted_mstories)
|
2012-08-07 23:55:03 -07:00
|
|
|
for s, story in enumerate(stories):
|
|
|
|
story['story_date'] = datetime.datetime.fromtimestamp(story_dates[s])
|
2012-08-09 21:13:57 -07:00
|
|
|
stories, user_profiles = MSharedStory.stories_with_comments_and_profiles(stories,
|
|
|
|
relative_user_id,
|
2012-08-07 14:37:07 -07:00
|
|
|
check_all=True)
|
2012-01-24 09:02:23 -08:00
|
|
|
|
2012-08-07 14:37:07 -07:00
|
|
|
story_feed_ids = list(set(s['story_feed_id'] for s in stories))
|
|
|
|
usersubs = UserSubscription.objects.filter(user__pk=user.pk, feed__pk__in=story_feed_ids)
|
|
|
|
usersubs_map = dict((sub.feed_id, sub) for sub in usersubs)
|
|
|
|
unsub_feed_ids = list(set(story_feed_ids).difference(set(usersubs_map.keys())))
|
|
|
|
unsub_feeds = Feed.objects.filter(pk__in=unsub_feed_ids)
|
|
|
|
unsub_feeds = [feed.canonical(include_favicon=False) for feed in unsub_feeds]
|
|
|
|
|
|
|
|
# Find starred stories
|
|
|
|
if story_feed_ids:
|
2012-08-09 23:33:54 -07:00
|
|
|
story_ids = [story['id'] for story in stories]
|
2012-08-07 14:37:07 -07:00
|
|
|
starred_stories = MStarredStory.objects(
|
|
|
|
user_id=user.pk,
|
2012-08-09 23:33:54 -07:00
|
|
|
story_guid__in=story_ids
|
2012-08-07 14:37:07 -07:00
|
|
|
).only('story_guid', 'starred_date')
|
|
|
|
starred_stories = dict([(story.story_guid, story.starred_date)
|
|
|
|
for story in starred_stories])
|
2012-08-09 23:33:54 -07:00
|
|
|
shared_stories = MSharedStory.objects(user_id=user.pk,
|
|
|
|
story_guid__in=story_ids)\
|
|
|
|
.only('story_guid', 'shared_date', 'comments')
|
|
|
|
shared_stories = dict([(story.story_guid, dict(shared_date=story.shared_date, comments=story.comments))
|
|
|
|
for story in shared_stories])
|
|
|
|
|
2012-08-07 14:37:07 -07:00
|
|
|
userstories_db = MUserStory.objects(user_id=user.pk,
|
|
|
|
feed_id__in=story_feed_ids,
|
|
|
|
story_id__in=story_ids).only('story_id')
|
|
|
|
userstories = set(us.story_id for us in userstories_db)
|
2012-08-09 23:33:54 -07:00
|
|
|
|
2012-08-07 14:37:07 -07:00
|
|
|
else:
|
|
|
|
starred_stories = {}
|
2012-08-09 23:33:54 -07:00
|
|
|
shared_stories = {}
|
2012-08-07 14:37:07 -07:00
|
|
|
userstories = []
|
|
|
|
|
|
|
|
# Intelligence classifiers for all feeds involved
|
|
|
|
if story_feed_ids:
|
|
|
|
classifier_feeds = list(MClassifierFeed.objects(user_id=user.pk,
|
2012-09-24 17:38:46 -07:00
|
|
|
social_user_id__in=social_user_ids))
|
|
|
|
classifier_feeds = classifier_feeds + list(MClassifierFeed.objects(user_id=user.pk,
|
2012-08-07 14:37:07 -07:00
|
|
|
feed_id__in=story_feed_ids))
|
|
|
|
classifier_authors = list(MClassifierAuthor.objects(user_id=user.pk,
|
|
|
|
feed_id__in=story_feed_ids))
|
|
|
|
classifier_titles = list(MClassifierTitle.objects(user_id=user.pk,
|
|
|
|
feed_id__in=story_feed_ids))
|
|
|
|
classifier_tags = list(MClassifierTag.objects(user_id=user.pk,
|
|
|
|
feed_id__in=story_feed_ids))
|
|
|
|
else:
|
|
|
|
classifier_feeds = []
|
|
|
|
classifier_authors = []
|
|
|
|
classifier_titles = []
|
|
|
|
classifier_tags = []
|
|
|
|
|
|
|
|
# Just need to format stories
|
|
|
|
for story in stories:
|
|
|
|
if story['id'] in userstories:
|
|
|
|
story['read_status'] = 1
|
2012-08-09 21:13:57 -07:00
|
|
|
elif story['story_date'] < UNREAD_CUTOFF:
|
|
|
|
story['read_status'] = 1
|
2012-08-07 14:37:07 -07:00
|
|
|
else:
|
|
|
|
story['read_status'] = 0
|
|
|
|
story_date = localtime_for_timezone(story['story_date'], user.profile.timezone)
|
|
|
|
story['short_parsed_date'] = format_story_link_date__short(story_date, now)
|
|
|
|
story['long_parsed_date'] = format_story_link_date__long(story_date, now)
|
|
|
|
if story['id'] in starred_stories:
|
|
|
|
story['starred'] = True
|
|
|
|
starred_date = localtime_for_timezone(starred_stories[story['id']], user.profile.timezone)
|
|
|
|
story['starred_date'] = format_story_link_date__long(starred_date, now)
|
|
|
|
story['intelligence'] = {
|
2012-09-24 17:38:46 -07:00
|
|
|
'feed': apply_classifier_feeds(classifier_feeds, story['story_feed_id'],
|
|
|
|
social_user_ids=story['friend_user_ids']),
|
2012-08-07 14:37:07 -07:00
|
|
|
'author': apply_classifier_authors(classifier_authors, story),
|
|
|
|
'tags': apply_classifier_tags(classifier_tags, story),
|
|
|
|
'title': apply_classifier_titles(classifier_titles, story),
|
|
|
|
}
|
2012-08-09 23:33:54 -07:00
|
|
|
if story['id'] in shared_stories:
|
|
|
|
story['shared'] = True
|
|
|
|
shared_date = localtime_for_timezone(shared_stories[story['id']]['shared_date'],
|
|
|
|
user.profile.timezone)
|
|
|
|
story['shared_date'] = format_story_link_date__long(shared_date, now)
|
|
|
|
story['shared_comments'] = strip_tags(shared_stories[story['id']]['comments'])
|
|
|
|
|
2012-09-24 17:38:46 -07:00
|
|
|
classifiers = sort_classifiers_by_feed(user=user, feed_ids=story_feed_ids,
|
|
|
|
classifier_feeds=classifier_feeds,
|
|
|
|
classifier_authors=classifier_authors,
|
|
|
|
classifier_titles=classifier_titles,
|
|
|
|
classifier_tags=classifier_tags)
|
2012-08-07 14:37:07 -07:00
|
|
|
|
|
|
|
diff = time.time() - start
|
|
|
|
timediff = round(float(diff), 2)
|
|
|
|
logging.user(request, "~FYLoading ~FCriver blurblogs stories~FY: ~SBp%s~SN (%s/%s "
|
|
|
|
"stories, ~SN%s/%s/%s feeds)" %
|
|
|
|
(page, len(stories), len(mstories), len(story_feed_ids),
|
|
|
|
len(social_user_ids), len(original_user_ids)))
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
"stories": stories,
|
|
|
|
"user_profiles": user_profiles,
|
|
|
|
"feeds": unsub_feeds,
|
|
|
|
"classifiers": classifiers,
|
|
|
|
"elapsed_time": timediff,
|
|
|
|
}
|
|
|
|
|
2012-07-06 17:47:06 -07:00
|
|
|
def load_social_page(request, user_id, username=None, **kwargs):
|
2012-07-06 00:41:36 -07:00
|
|
|
start = time.time()
|
2012-07-02 15:40:03 -07:00
|
|
|
user = request.user
|
2012-01-31 10:15:11 -08:00
|
|
|
social_user_id = int(user_id)
|
|
|
|
social_user = get_object_or_404(User, pk=social_user_id)
|
|
|
|
offset = int(request.REQUEST.get('offset', 0))
|
2012-07-06 00:34:21 -07:00
|
|
|
limit = int(request.REQUEST.get('limit', 6))
|
2012-01-31 10:15:11 -08:00
|
|
|
page = request.REQUEST.get('page')
|
2012-07-06 00:34:21 -07:00
|
|
|
format = request.REQUEST.get('format', None)
|
|
|
|
has_next_page = False
|
2012-07-06 17:47:06 -07:00
|
|
|
feed_id = kwargs.get('feed_id') or request.REQUEST.get('feed_id')
|
2012-01-31 10:15:11 -08:00
|
|
|
if page: offset = limit * (int(page) - 1)
|
2012-07-02 15:40:03 -07:00
|
|
|
|
|
|
|
user_social_profile = None
|
2012-08-14 00:42:32 -07:00
|
|
|
user_social_services = None
|
2012-08-15 18:35:55 -07:00
|
|
|
user_following_social_profile = None
|
2012-07-02 15:40:03 -07:00
|
|
|
if user.is_authenticated():
|
2012-07-25 23:57:10 -07:00
|
|
|
user_social_profile = MSocialProfile.get_user(user.pk)
|
2012-08-14 00:26:42 -07:00
|
|
|
user_social_services = MSocialServices.get_user(user.pk)
|
2012-08-15 18:35:55 -07:00
|
|
|
user_following_social_profile = user_social_profile.is_following_user(social_user_id)
|
2012-07-25 23:57:10 -07:00
|
|
|
social_profile = MSocialProfile.get_user(social_user_id)
|
2012-08-14 00:26:42 -07:00
|
|
|
|
2012-07-06 17:47:06 -07:00
|
|
|
params = dict(user_id=social_user.pk)
|
|
|
|
if feed_id:
|
|
|
|
params['story_feed_id'] = feed_id
|
|
|
|
mstories = MSharedStory.objects(**params).order_by('-shared_date')[offset:offset+limit+1]
|
2012-01-31 10:15:11 -08:00
|
|
|
stories = Feed.format_stories(mstories)
|
2012-07-06 00:34:21 -07:00
|
|
|
if len(stories) > limit:
|
|
|
|
has_next_page = True
|
|
|
|
stories = stories[:-1]
|
2012-07-06 00:41:36 -07:00
|
|
|
|
|
|
|
checkpoint1 = time.time()
|
|
|
|
|
2012-01-31 10:15:11 -08:00
|
|
|
if not stories:
|
2012-07-06 11:20:13 -07:00
|
|
|
params = {
|
2012-06-28 19:47:30 -07:00
|
|
|
"user": user,
|
|
|
|
"stories": [],
|
|
|
|
"feeds": {},
|
|
|
|
"social_user": social_user,
|
2012-07-30 21:39:21 -07:00
|
|
|
"social_profile": social_profile,
|
2012-08-14 00:26:42 -07:00
|
|
|
"user_social_services": user_social_services,
|
2012-07-06 17:47:06 -07:00
|
|
|
'user_social_profile' : json.encode(user_social_profile and user_social_profile.page()),
|
2012-08-15 18:35:55 -07:00
|
|
|
'user_following_social_profile': user_following_social_profile,
|
2012-06-28 19:47:30 -07:00
|
|
|
}
|
2012-07-06 11:20:13 -07:00
|
|
|
template = 'social/social_page.xhtml'
|
|
|
|
return render_to_response(template, params, context_instance=RequestContext(request))
|
2012-01-31 10:15:11 -08:00
|
|
|
|
|
|
|
story_feed_ids = list(set(s['story_feed_id'] for s in stories))
|
|
|
|
feeds = Feed.objects.filter(pk__in=story_feed_ids)
|
|
|
|
feeds = dict((feed.pk, feed.canonical(include_favicon=False)) for feed in feeds)
|
|
|
|
for story in stories:
|
2012-03-29 19:01:04 -07:00
|
|
|
if story['story_feed_id'] in feeds:
|
|
|
|
# Feed could have been deleted.
|
|
|
|
story['feed'] = feeds[story['story_feed_id']]
|
2012-02-01 09:14:19 -08:00
|
|
|
shared_date = localtime_for_timezone(story['shared_date'], social_user.profile.timezone)
|
2012-03-29 19:01:04 -07:00
|
|
|
story['shared_date'] = shared_date
|
2012-01-31 10:15:11 -08:00
|
|
|
|
2012-07-01 18:34:34 -07:00
|
|
|
stories, profiles = MSharedStory.stories_with_comments_and_profiles(stories, social_user.pk,
|
|
|
|
check_all=True)
|
|
|
|
|
2012-07-06 00:41:36 -07:00
|
|
|
checkpoint2 = time.time()
|
|
|
|
|
2012-07-02 15:40:03 -07:00
|
|
|
if user.is_authenticated():
|
|
|
|
for story in stories:
|
2012-08-09 10:34:41 -07:00
|
|
|
if user.pk in story['share_user_ids']:
|
2012-07-02 15:40:03 -07:00
|
|
|
story['shared_by_user'] = True
|
|
|
|
shared_story = MSharedStory.objects.get(user_id=user.pk,
|
|
|
|
story_feed_id=story['story_feed_id'],
|
|
|
|
story_guid=story['id'])
|
|
|
|
story['user_comments'] = shared_story.comments
|
2012-07-01 18:34:34 -07:00
|
|
|
|
|
|
|
stories = MSharedStory.attach_users_to_stories(stories, profiles)
|
2012-01-31 10:15:11 -08:00
|
|
|
|
|
|
|
params = {
|
2012-07-01 20:51:34 -07:00
|
|
|
'social_user' : social_user,
|
|
|
|
'stories' : stories,
|
2012-08-06 17:52:33 -07:00
|
|
|
'user_social_profile' : user_social_profile,
|
|
|
|
'user_social_profile_page' : json.encode(user_social_profile and user_social_profile.page()),
|
2012-08-14 00:26:42 -07:00
|
|
|
'user_social_services' : user_social_services,
|
|
|
|
'user_social_services_page' : json.encode(user_social_services and user_social_services.to_json()),
|
2012-08-15 18:35:55 -07:00
|
|
|
'user_following_social_profile': user_following_social_profile,
|
2012-07-06 19:54:33 -07:00
|
|
|
'social_profile': social_profile,
|
2012-07-01 20:51:34 -07:00
|
|
|
'feeds' : feeds,
|
|
|
|
'user_profile' : hasattr(user, 'profile') and user.profile,
|
2012-07-06 00:34:21 -07:00
|
|
|
'has_next_page' : has_next_page,
|
2012-07-06 13:48:06 -07:00
|
|
|
'holzer_truism' : random.choice(jennyholzer.TRUISMS) #if not has_next_page else None
|
2012-01-31 10:15:11 -08:00
|
|
|
}
|
2012-07-06 00:41:36 -07:00
|
|
|
|
|
|
|
diff1 = checkpoint1-start
|
|
|
|
diff2 = checkpoint2-start
|
|
|
|
timediff = time.time()-start
|
|
|
|
logging.user(request, "~FYLoading ~FMsocial page~FY: ~SB%s%s ~SN(%.4s seconds, ~SB%.4s/%.4s~SN)" % (
|
|
|
|
social_profile.title[:22], ('~SN/p%s' % page) if page > 1 else '', timediff,
|
|
|
|
diff1, diff2))
|
2012-07-06 00:34:21 -07:00
|
|
|
if format == 'html':
|
|
|
|
template = 'social/social_stories.xhtml'
|
|
|
|
else:
|
|
|
|
template = 'social/social_page.xhtml'
|
|
|
|
|
|
|
|
return render_to_response(template, params, context_instance=RequestContext(request))
|
2012-01-31 10:15:11 -08:00
|
|
|
|
2012-06-29 21:25:35 -07:00
|
|
|
def story_public_comments(request):
|
2012-06-29 21:06:33 -07:00
|
|
|
format = request.REQUEST.get('format', 'json')
|
|
|
|
relative_user_id = request.REQUEST.get('user_id', None)
|
|
|
|
feed_id = int(request.REQUEST['feed_id'])
|
|
|
|
story_id = request.REQUEST['story_id']
|
|
|
|
|
|
|
|
if not relative_user_id:
|
|
|
|
relative_user_id = get_user(request).pk
|
2012-02-03 11:41:01 -08:00
|
|
|
|
2012-06-29 21:25:35 -07:00
|
|
|
stories = MSharedStory.objects.filter(story_feed_id=feed_id, story_guid=story_id).limit(1)
|
2012-06-29 21:06:33 -07:00
|
|
|
stories = Feed.format_stories(stories)
|
|
|
|
stories, profiles = MSharedStory.stories_with_comments_and_profiles(stories, relative_user_id,
|
|
|
|
check_all=True,
|
2012-07-01 20:51:34 -07:00
|
|
|
public=True)
|
2012-03-15 14:00:44 -07:00
|
|
|
|
2012-06-29 21:06:33 -07:00
|
|
|
if format == 'html':
|
2012-07-01 20:51:34 -07:00
|
|
|
stories = MSharedStory.attach_users_to_stories(stories, profiles)
|
2012-06-29 21:06:33 -07:00
|
|
|
return render_to_response('social/story_comments.xhtml', {
|
|
|
|
'story': stories[0],
|
|
|
|
}, context_instance=RequestContext(request))
|
|
|
|
else:
|
|
|
|
return json.json_response(request, {
|
2012-07-23 13:08:48 -07:00
|
|
|
'comments': stories[0]['public_comments'],
|
2012-06-29 21:06:33 -07:00
|
|
|
'user_profiles': profiles,
|
|
|
|
})
|
2012-02-03 11:41:01 -08:00
|
|
|
|
|
|
|
@ajax_login_required
|
|
|
|
def mark_story_as_shared(request):
|
|
|
|
code = 1
|
|
|
|
feed_id = int(request.POST['feed_id'])
|
|
|
|
story_id = request.POST['story_id']
|
|
|
|
comments = request.POST.get('comments', '')
|
2012-04-30 11:52:19 -07:00
|
|
|
source_user_id = request.POST.get('source_user_id')
|
2012-08-06 17:52:33 -07:00
|
|
|
relative_user_id = request.POST.get('relative_user_id') or request.user.pk
|
2012-06-27 23:57:57 -07:00
|
|
|
post_to_services = request.POST.getlist('post_to_services')
|
2012-07-01 20:51:34 -07:00
|
|
|
format = request.REQUEST.get('format', 'json')
|
2012-02-03 11:41:01 -08:00
|
|
|
|
2012-07-25 23:57:10 -07:00
|
|
|
MSocialProfile.get_user(request.user.pk)
|
|
|
|
|
2012-07-26 22:12:48 -07:00
|
|
|
story, original_story_found = MStory.find_story(feed_id, story_id)
|
|
|
|
|
2012-02-03 11:41:01 -08:00
|
|
|
if not story:
|
2012-07-26 22:12:48 -07:00
|
|
|
return json.json_response(request, {
|
|
|
|
'code': -1,
|
|
|
|
'message': 'Could not find the original story and no copies could be found.'
|
|
|
|
})
|
2012-02-03 11:41:01 -08:00
|
|
|
|
2012-04-12 11:18:56 -07:00
|
|
|
shared_story = MSharedStory.objects.filter(user_id=request.user.pk,
|
|
|
|
story_feed_id=feed_id,
|
2012-07-02 10:15:17 -07:00
|
|
|
story_guid=story_id).limit(1).first()
|
2012-02-03 11:41:01 -08:00
|
|
|
if not shared_story:
|
|
|
|
story_db = dict([(k, v) for k, v in story._data.items()
|
|
|
|
if k is not None and v is not None])
|
|
|
|
story_values = dict(user_id=request.user.pk, comments=comments,
|
2012-07-19 23:29:11 -07:00
|
|
|
has_comments=bool(comments), story_db_id=story.id)
|
2012-07-02 10:15:17 -07:00
|
|
|
story_db.update(story_values)
|
|
|
|
shared_story = MSharedStory.objects.create(**story_db)
|
2012-06-26 19:19:57 -07:00
|
|
|
if source_user_id:
|
|
|
|
shared_story.set_source_user_id(int(source_user_id))
|
2012-04-03 17:48:24 -07:00
|
|
|
socialsubs = MSocialSubscription.objects.filter(subscription_user_id=request.user.pk)
|
|
|
|
for socialsub in socialsubs:
|
|
|
|
socialsub.needs_unread_recalc = True
|
|
|
|
socialsub.save()
|
2012-05-01 18:00:54 -07:00
|
|
|
logging.user(request, "~FCSharing ~FM%s: ~SB~FB%s" % (story.story_title[:20], comments[:30]))
|
2012-02-03 11:41:01 -08:00
|
|
|
else:
|
|
|
|
shared_story.comments = comments
|
|
|
|
shared_story.has_comments = bool(comments)
|
|
|
|
shared_story.save()
|
2012-05-01 18:00:54 -07:00
|
|
|
logging.user(request, "~FCUpdating shared story ~FM%s: ~SB~FB%s" % (
|
|
|
|
story.story_title[:20], comments[:30]))
|
2012-02-03 11:41:01 -08:00
|
|
|
|
2012-07-02 10:15:17 -07:00
|
|
|
if original_story_found:
|
|
|
|
story.count_comments()
|
2012-04-03 19:24:02 -07:00
|
|
|
shared_story.publish_update_to_subscribers()
|
2012-02-03 11:41:01 -08:00
|
|
|
|
|
|
|
story = Feed.format_story(story)
|
2012-07-02 10:15:17 -07:00
|
|
|
check_all = not original_story_found
|
2012-08-06 17:52:33 -07:00
|
|
|
stories, profiles = MSharedStory.stories_with_comments_and_profiles([story], relative_user_id,
|
2012-07-02 10:15:17 -07:00
|
|
|
check_all=check_all)
|
2012-03-22 19:37:19 -07:00
|
|
|
story = stories[0]
|
2012-07-21 16:38:37 -07:00
|
|
|
story['shared_comments'] = strip_tags(shared_story['comments'] or "")
|
2012-08-06 17:52:33 -07:00
|
|
|
story['shared_by_user'] = True
|
2012-03-22 19:37:19 -07:00
|
|
|
|
2012-06-27 23:57:57 -07:00
|
|
|
if post_to_services:
|
|
|
|
for service in post_to_services:
|
|
|
|
if service not in shared_story.posted_to_services:
|
|
|
|
PostToService.delay(shared_story_id=shared_story.id, service=service)
|
2012-07-01 20:51:34 -07:00
|
|
|
|
2012-07-27 18:58:35 -07:00
|
|
|
if shared_story.source_user_id and shared_story.comments:
|
2012-08-06 17:52:33 -07:00
|
|
|
EmailStoryReshares.apply_async(kwargs=dict(shared_story_id=shared_story.id),
|
|
|
|
countdown=settings.SECONDS_TO_DELAY_CELERY_EMAILS)
|
2012-07-05 19:50:02 -07:00
|
|
|
|
2012-07-01 20:51:34 -07:00
|
|
|
if format == 'html':
|
|
|
|
stories = MSharedStory.attach_users_to_stories(stories, profiles)
|
2012-08-06 17:52:33 -07:00
|
|
|
return render_to_response('social/social_story.xhtml', {
|
2012-07-01 20:51:34 -07:00
|
|
|
'story': story,
|
|
|
|
}, context_instance=RequestContext(request))
|
|
|
|
else:
|
|
|
|
return json.json_response(request, {
|
|
|
|
'code': code,
|
|
|
|
'story': story,
|
|
|
|
'user_profiles': profiles,
|
|
|
|
})
|
2012-03-22 19:37:19 -07:00
|
|
|
|
2012-06-20 20:53:32 -07:00
|
|
|
@ajax_login_required
|
|
|
|
def mark_story_as_unshared(request):
|
|
|
|
feed_id = int(request.POST['feed_id'])
|
|
|
|
story_id = request.POST['story_id']
|
2012-08-06 17:52:33 -07:00
|
|
|
relative_user_id = request.POST.get('relative_user_id') or request.user.pk
|
2012-07-01 20:51:34 -07:00
|
|
|
format = request.REQUEST.get('format', 'json')
|
2012-07-02 10:40:45 -07:00
|
|
|
original_story_found = True
|
2012-06-20 20:53:32 -07:00
|
|
|
|
|
|
|
story = MStory.objects(story_feed_id=feed_id, story_guid=story_id).limit(1).first()
|
|
|
|
if not story:
|
2012-07-02 10:40:45 -07:00
|
|
|
original_story_found = False
|
2012-06-20 20:53:32 -07:00
|
|
|
|
2012-07-02 10:40:45 -07:00
|
|
|
shared_story = MSharedStory.objects(user_id=request.user.pk,
|
|
|
|
story_feed_id=feed_id,
|
|
|
|
story_guid=story_id).limit(1).first()
|
|
|
|
if not shared_story:
|
2012-07-02 10:15:17 -07:00
|
|
|
return json.json_response(request, {'code': -1, 'message': 'Shared story not found.'})
|
2012-06-20 20:53:32 -07:00
|
|
|
|
2012-09-10 11:55:42 -07:00
|
|
|
shared_story.unshare_story()
|
2012-06-20 20:53:32 -07:00
|
|
|
|
2012-07-02 10:40:45 -07:00
|
|
|
if original_story_found:
|
|
|
|
story.count_comments()
|
|
|
|
else:
|
|
|
|
story = shared_story
|
2012-06-20 20:53:32 -07:00
|
|
|
|
|
|
|
story = Feed.format_story(story)
|
|
|
|
stories, profiles = MSharedStory.stories_with_comments_and_profiles([story],
|
2012-08-06 17:52:33 -07:00
|
|
|
relative_user_id,
|
2012-06-20 20:53:32 -07:00
|
|
|
check_all=True)
|
2012-07-02 10:40:45 -07:00
|
|
|
|
2012-07-01 20:51:34 -07:00
|
|
|
if format == 'html':
|
|
|
|
stories = MSharedStory.attach_users_to_stories(stories, profiles)
|
2012-08-06 17:52:33 -07:00
|
|
|
return render_to_response('social/social_story.xhtml', {
|
2012-07-02 10:40:45 -07:00
|
|
|
'story': stories[0],
|
2012-07-01 20:51:34 -07:00
|
|
|
}, context_instance=RequestContext(request))
|
|
|
|
else:
|
|
|
|
return json.json_response(request, {
|
|
|
|
'code': 1,
|
|
|
|
'message': "Story unshared.",
|
2012-07-02 10:40:45 -07:00
|
|
|
'story': stories[0],
|
2012-07-01 20:51:34 -07:00
|
|
|
'user_profiles': profiles,
|
|
|
|
})
|
2012-06-20 20:53:32 -07:00
|
|
|
|
2012-03-22 19:37:19 -07:00
|
|
|
@ajax_login_required
|
|
|
|
def save_comment_reply(request):
|
|
|
|
code = 1
|
|
|
|
feed_id = int(request.POST['story_feed_id'])
|
|
|
|
story_id = request.POST['story_id']
|
|
|
|
comment_user_id = request.POST['comment_user_id']
|
|
|
|
reply_comments = request.POST.get('reply_comments')
|
2012-07-27 18:58:35 -07:00
|
|
|
reply_id = request.POST.get('reply_id')
|
2012-07-03 17:00:09 -07:00
|
|
|
format = request.REQUEST.get('format', 'json')
|
2012-07-28 12:37:16 -07:00
|
|
|
original_message = None
|
2012-03-22 19:37:19 -07:00
|
|
|
|
|
|
|
if not reply_comments:
|
2012-07-03 17:00:09 -07:00
|
|
|
return json.json_response(request, {'code': -1, 'message': 'Reply comments cannot be empty.'})
|
2012-03-22 19:37:19 -07:00
|
|
|
|
2012-04-12 11:18:56 -07:00
|
|
|
shared_story = MSharedStory.objects.get(user_id=comment_user_id,
|
|
|
|
story_feed_id=feed_id,
|
|
|
|
story_guid=story_id)
|
2012-03-22 19:37:19 -07:00
|
|
|
reply = MCommentReply()
|
|
|
|
reply.user_id = request.user.pk
|
|
|
|
reply.publish_date = datetime.datetime.now()
|
|
|
|
reply.comments = reply_comments
|
2012-05-01 18:00:54 -07:00
|
|
|
|
2012-07-27 18:58:35 -07:00
|
|
|
if reply_id:
|
2012-05-01 18:00:54 -07:00
|
|
|
replies = []
|
|
|
|
for story_reply in shared_story.replies:
|
|
|
|
if (story_reply.user_id == reply.user_id and
|
2012-07-27 18:58:35 -07:00
|
|
|
story_reply.reply_id == ObjectId(reply_id)):
|
2012-05-01 18:00:54 -07:00
|
|
|
reply.publish_date = story_reply.publish_date
|
2012-07-27 18:58:35 -07:00
|
|
|
reply.reply_id = story_reply.reply_id
|
|
|
|
original_message = story_reply.comments
|
2012-05-01 18:00:54 -07:00
|
|
|
replies.append(reply)
|
|
|
|
else:
|
|
|
|
replies.append(story_reply)
|
|
|
|
shared_story.replies = replies
|
|
|
|
logging.user(request, "~FCUpdating comment reply in ~FM%s: ~SB~FB%s~FM" % (
|
2012-05-10 08:30:34 -07:00
|
|
|
shared_story.story_title[:20], reply_comments[:30]))
|
2012-05-01 18:00:54 -07:00
|
|
|
else:
|
2012-07-27 18:58:35 -07:00
|
|
|
reply.reply_id = ObjectId()
|
2012-05-01 18:00:54 -07:00
|
|
|
logging.user(request, "~FCReplying to comment in: ~FM%s: ~SB~FB%s~FM" % (
|
2012-05-10 08:30:34 -07:00
|
|
|
shared_story.story_title[:20], reply_comments[:30]))
|
2012-05-01 18:00:54 -07:00
|
|
|
shared_story.replies.append(reply)
|
2012-03-22 19:37:19 -07:00
|
|
|
shared_story.save()
|
2012-04-10 17:28:00 -07:00
|
|
|
|
2012-07-28 19:53:38 -07:00
|
|
|
comment, profiles = shared_story.comment_with_author_and_profiles()
|
2012-02-03 11:41:01 -08:00
|
|
|
|
2012-04-10 17:28:00 -07:00
|
|
|
# Interaction for every other replier and original commenter
|
2012-04-16 11:21:52 -07:00
|
|
|
MActivity.new_comment_reply(user_id=request.user.pk,
|
|
|
|
comment_user_id=comment['user_id'],
|
|
|
|
reply_content=reply_comments,
|
2012-05-01 18:15:58 -07:00
|
|
|
original_message=original_message,
|
2012-07-28 12:37:16 -07:00
|
|
|
story_id=story_id,
|
2012-07-28 16:41:17 -07:00
|
|
|
story_feed_id=feed_id,
|
2012-07-28 12:37:16 -07:00
|
|
|
story_title=shared_story.story_title)
|
2012-04-16 11:21:52 -07:00
|
|
|
if comment['user_id'] != request.user.pk:
|
2012-04-11 17:43:05 -07:00
|
|
|
MInteraction.new_comment_reply(user_id=comment['user_id'],
|
|
|
|
reply_user_id=request.user.pk,
|
|
|
|
reply_content=reply_comments,
|
2012-05-01 18:15:58 -07:00
|
|
|
original_message=original_message,
|
2012-07-28 12:37:16 -07:00
|
|
|
story_id=story_id,
|
2012-07-28 16:41:17 -07:00
|
|
|
story_feed_id=feed_id,
|
2012-07-28 12:37:16 -07:00
|
|
|
story_title=shared_story.story_title)
|
2012-07-28 19:53:38 -07:00
|
|
|
|
2012-07-28 22:36:50 -07:00
|
|
|
reply_user_ids = list(r['user_id'] for r in comment['replies'])
|
2012-04-11 12:14:18 -07:00
|
|
|
for user_id in set(reply_user_ids).difference([comment['user_id']]):
|
2012-04-11 17:43:05 -07:00
|
|
|
if request.user.pk != user_id:
|
|
|
|
MInteraction.new_reply_reply(user_id=user_id,
|
2012-07-28 16:41:17 -07:00
|
|
|
comment_user_id=comment['user_id'],
|
2012-04-11 17:43:05 -07:00
|
|
|
reply_user_id=request.user.pk,
|
|
|
|
reply_content=reply_comments,
|
2012-05-01 18:15:58 -07:00
|
|
|
original_message=original_message,
|
2012-07-28 12:37:16 -07:00
|
|
|
story_id=story_id,
|
2012-07-28 16:41:17 -07:00
|
|
|
story_feed_id=feed_id,
|
2012-07-28 12:37:16 -07:00
|
|
|
story_title=shared_story.story_title)
|
2012-07-27 18:58:35 -07:00
|
|
|
|
|
|
|
EmailCommentReplies.apply_async(kwargs=dict(shared_story_id=shared_story.id,
|
2012-08-06 17:52:33 -07:00
|
|
|
reply_id=reply.reply_id),
|
|
|
|
countdown=settings.SECONDS_TO_DELAY_CELERY_EMAILS)
|
2012-04-10 17:28:00 -07:00
|
|
|
|
2012-07-03 17:00:09 -07:00
|
|
|
if format == 'html':
|
|
|
|
comment = MSharedStory.attach_users_to_comment(comment, profiles)
|
|
|
|
return render_to_response('social/story_comment.xhtml', {
|
|
|
|
'comment': comment,
|
|
|
|
}, context_instance=RequestContext(request))
|
|
|
|
else:
|
|
|
|
return json.json_response(request, {
|
|
|
|
'code': code,
|
|
|
|
'comment': comment,
|
2012-07-30 13:53:31 -07:00
|
|
|
'reply_id': reply.reply_id,
|
2012-07-03 17:00:09 -07:00
|
|
|
'user_profiles': profiles
|
|
|
|
})
|
2012-07-05 18:29:38 -07:00
|
|
|
|
2012-07-28 19:53:38 -07:00
|
|
|
@ajax_login_required
|
|
|
|
def remove_comment_reply(request):
|
|
|
|
code = 1
|
|
|
|
feed_id = int(request.POST['story_feed_id'])
|
|
|
|
story_id = request.POST['story_id']
|
|
|
|
comment_user_id = request.POST['comment_user_id']
|
|
|
|
reply_id = request.POST.get('reply_id')
|
|
|
|
format = request.REQUEST.get('format', 'json')
|
|
|
|
original_message = None
|
|
|
|
|
|
|
|
shared_story = MSharedStory.objects.get(user_id=comment_user_id,
|
|
|
|
story_feed_id=feed_id,
|
|
|
|
story_guid=story_id)
|
|
|
|
replies = []
|
|
|
|
for story_reply in shared_story.replies:
|
|
|
|
if ((story_reply.user_id == request.user.pk or request.user.is_staff) and
|
|
|
|
story_reply.reply_id == ObjectId(reply_id)):
|
|
|
|
original_message = story_reply.comments
|
|
|
|
# Skip reply
|
|
|
|
else:
|
|
|
|
replies.append(story_reply)
|
|
|
|
shared_story.replies = replies
|
|
|
|
shared_story.save()
|
|
|
|
|
|
|
|
logging.user(request, "~FCRemoving comment reply in ~FM%s: ~SB~FB%s~FM" % (
|
2012-07-28 22:36:50 -07:00
|
|
|
shared_story.story_title[:20], original_message and original_message[:30]))
|
2012-07-28 19:53:38 -07:00
|
|
|
|
|
|
|
comment, profiles = shared_story.comment_with_author_and_profiles()
|
|
|
|
|
2012-07-28 22:36:50 -07:00
|
|
|
# Interaction for every other replier and original commenter
|
|
|
|
MActivity.remove_comment_reply(user_id=request.user.pk,
|
|
|
|
comment_user_id=comment['user_id'],
|
|
|
|
reply_content=original_message,
|
|
|
|
story_id=story_id,
|
|
|
|
story_feed_id=feed_id)
|
|
|
|
MInteraction.remove_comment_reply(user_id=comment['user_id'],
|
|
|
|
reply_user_id=request.user.pk,
|
|
|
|
reply_content=original_message,
|
|
|
|
story_id=story_id,
|
|
|
|
story_feed_id=feed_id)
|
|
|
|
|
|
|
|
reply_user_ids = [reply['user_id'] for reply in comment['replies']]
|
|
|
|
for user_id in set(reply_user_ids).difference([comment['user_id']]):
|
|
|
|
if request.user.pk != user_id:
|
|
|
|
MInteraction.remove_reply_reply(user_id=user_id,
|
|
|
|
comment_user_id=comment['user_id'],
|
|
|
|
reply_user_id=request.user.pk,
|
|
|
|
reply_content=original_message,
|
|
|
|
story_id=story_id,
|
|
|
|
story_feed_id=feed_id)
|
2012-07-28 19:53:38 -07:00
|
|
|
|
|
|
|
if format == 'html':
|
|
|
|
comment = MSharedStory.attach_users_to_comment(comment, profiles)
|
|
|
|
return render_to_response('social/story_comment.xhtml', {
|
|
|
|
'comment': comment,
|
|
|
|
}, context_instance=RequestContext(request))
|
|
|
|
else:
|
|
|
|
return json.json_response(request, {
|
|
|
|
'code': code,
|
|
|
|
'comment': comment,
|
|
|
|
'user_profiles': profiles
|
|
|
|
})
|
|
|
|
|
2012-07-05 18:29:38 -07:00
|
|
|
@render_to('social/mute_story.xhtml')
|
|
|
|
def mute_story(request, secret_token, shared_story_id):
|
|
|
|
user_profile = Profile.objects.get(secret_token=secret_token)
|
|
|
|
shared_story = MSharedStory.objects.get(id=shared_story_id)
|
|
|
|
shared_story.mute_for_user(user_profile.user_id)
|
|
|
|
|
|
|
|
return {}
|
2012-02-03 11:41:01 -08:00
|
|
|
|
|
|
|
def shared_stories_public(request, username):
|
|
|
|
try:
|
|
|
|
user = User.objects.get(username=username)
|
|
|
|
except User.DoesNotExist:
|
|
|
|
raise Http404
|
|
|
|
|
|
|
|
shared_stories = MSharedStory.objects.filter(user_id=user.pk)
|
|
|
|
|
|
|
|
return HttpResponse("There are %s stories shared by %s." % (shared_stories.count(), username))
|
2011-12-20 11:49:49 -08:00
|
|
|
|
2011-12-25 20:50:59 -08:00
|
|
|
@json.json_view
|
|
|
|
def profile(request):
|
2012-05-14 16:43:27 -07:00
|
|
|
user = get_user(request.user)
|
|
|
|
user_id = request.GET.get('user_id', user.pk)
|
2012-08-14 00:26:42 -07:00
|
|
|
categories = request.GET.getlist('category')
|
2012-07-09 12:41:25 -07:00
|
|
|
include_activities_html = request.REQUEST.get('include_activities_html', None)
|
|
|
|
|
2012-07-25 23:57:10 -07:00
|
|
|
user_profile = MSocialProfile.get_user(user_id)
|
2012-06-27 16:46:30 -07:00
|
|
|
user_profile.count_follows()
|
|
|
|
user_profile = user_profile.to_json(include_follows=True, common_follows_with_user=user.pk)
|
2012-04-21 16:14:53 -07:00
|
|
|
profile_ids = set(user_profile['followers_youknow'] + user_profile['followers_everybody'] +
|
|
|
|
user_profile['following_youknow'] + user_profile['following_everybody'])
|
2012-03-12 18:11:13 -07:00
|
|
|
profiles = MSocialProfile.profiles(profile_ids)
|
2012-08-14 00:26:42 -07:00
|
|
|
activities, _ = MActivity.user(user_id, page=1, public=True, categories=categories)
|
2012-04-21 16:14:53 -07:00
|
|
|
logging.user(request, "~BB~FRLoading social profile: %s" % user_profile['username'])
|
|
|
|
|
2012-02-22 09:11:35 -08:00
|
|
|
payload = {
|
2012-04-21 16:14:53 -07:00
|
|
|
'user_profile': user_profile,
|
|
|
|
# XXX TODO: Remove following 4 vestigial params.
|
|
|
|
'followers_youknow': user_profile['followers_youknow'],
|
|
|
|
'followers_everybody': user_profile['followers_everybody'],
|
|
|
|
'following_youknow': user_profile['following_youknow'],
|
|
|
|
'following_everybody': user_profile['following_everybody'],
|
2012-03-13 13:18:47 -07:00
|
|
|
'profiles': dict([(p.user_id, p.to_json(compact=True)) for p in profiles]),
|
2012-04-19 19:09:31 -07:00
|
|
|
'activities': activities,
|
2012-02-22 09:11:35 -08:00
|
|
|
}
|
2012-07-09 12:41:25 -07:00
|
|
|
|
|
|
|
if include_activities_html:
|
|
|
|
payload['activities_html'] = render_to_string('reader/activities_module.xhtml', {
|
|
|
|
'activities': activities,
|
|
|
|
'username': user_profile['username'],
|
|
|
|
'public': True,
|
|
|
|
})
|
|
|
|
|
2012-02-22 09:11:35 -08:00
|
|
|
return payload
|
2012-04-04 16:09:01 -07:00
|
|
|
|
|
|
|
@ajax_login_required
|
|
|
|
@json.json_view
|
|
|
|
def load_user_profile(request):
|
2012-07-25 23:57:10 -07:00
|
|
|
social_profile = MSocialProfile.get_user(request.user.pk)
|
2012-04-04 16:09:01 -07:00
|
|
|
social_services, _ = MSocialServices.objects.get_or_create(user_id=request.user.pk)
|
2012-04-10 17:28:00 -07:00
|
|
|
|
2012-07-10 00:17:45 -07:00
|
|
|
logging.user(request, "~BB~FRLoading social profile and blurblog settings")
|
|
|
|
|
2012-04-04 16:09:01 -07:00
|
|
|
return {
|
|
|
|
'services': social_services,
|
2012-07-10 00:17:45 -07:00
|
|
|
'user_profile': social_profile.to_json(include_follows=True, include_settings=True),
|
2012-04-04 16:09:01 -07:00
|
|
|
}
|
2011-12-25 20:50:59 -08:00
|
|
|
|
2012-04-04 16:09:01 -07:00
|
|
|
@ajax_login_required
|
|
|
|
@json.json_view
|
|
|
|
def save_user_profile(request):
|
2011-12-25 20:50:59 -08:00
|
|
|
data = request.POST
|
2012-07-31 23:42:43 -07:00
|
|
|
website = data['website']
|
|
|
|
|
|
|
|
if website and not website.startswith('http'):
|
|
|
|
website = 'http://' + website
|
|
|
|
|
2012-07-25 23:57:10 -07:00
|
|
|
profile = MSocialProfile.get_user(request.user.pk)
|
2011-12-25 20:50:59 -08:00
|
|
|
profile.location = data['location']
|
|
|
|
profile.bio = data['bio']
|
2012-07-31 23:42:43 -07:00
|
|
|
profile.website = website
|
2011-12-25 20:50:59 -08:00
|
|
|
profile.save()
|
|
|
|
|
2012-01-26 09:54:48 -08:00
|
|
|
social_services = MSocialServices.objects.get(user_id=request.user.pk)
|
2012-04-04 20:54:54 -07:00
|
|
|
profile = social_services.set_photo(data['photo_service'])
|
2011-12-25 20:50:59 -08:00
|
|
|
|
2012-03-07 17:34:22 -08:00
|
|
|
logging.user(request, "~BB~FRSaving social profile")
|
|
|
|
|
2012-06-27 16:46:30 -07:00
|
|
|
return dict(code=1, user_profile=profile.to_json(include_follows=True))
|
2012-01-04 09:42:35 -08:00
|
|
|
|
2012-07-10 00:17:45 -07:00
|
|
|
|
|
|
|
@ajax_login_required
|
|
|
|
@json.json_view
|
|
|
|
def save_blurblog_settings(request):
|
|
|
|
data = request.POST
|
|
|
|
|
2012-07-25 23:57:10 -07:00
|
|
|
profile = MSocialProfile.get_user(request.user.pk)
|
2012-07-10 00:17:45 -07:00
|
|
|
profile.custom_css = data.get('custom_css', None)
|
|
|
|
profile.custom_bgcolor = data.get('custom_bgcolor', None)
|
|
|
|
profile.blurblog_title = data.get('blurblog_title', None)
|
|
|
|
profile.save()
|
|
|
|
|
|
|
|
logging.user(request, "~BB~FRSaving blurblog settings")
|
|
|
|
|
|
|
|
return dict(code=1, user_profile=profile.to_json(include_follows=True, include_settings=True))
|
|
|
|
|
2012-04-04 16:09:01 -07:00
|
|
|
@json.json_view
|
|
|
|
def load_user_friends(request):
|
2012-05-14 16:43:27 -07:00
|
|
|
user = get_user(request.user)
|
2012-08-31 13:51:24 -07:00
|
|
|
social_profile = MSocialProfile.get_user(user_id=user.pk)
|
|
|
|
social_services = MSocialServices.get_user(user_id=user.pk)
|
2012-04-04 16:09:01 -07:00
|
|
|
following_profiles = MSocialProfile.profiles(social_profile.following_user_ids)
|
2012-07-13 15:32:27 -07:00
|
|
|
follower_profiles = MSocialProfile.profiles(social_profile.follower_user_ids)
|
|
|
|
recommended_users = social_profile.recommended_users()
|
|
|
|
|
|
|
|
following_profiles = [p.to_json(include_following_user=user.pk) for p in following_profiles]
|
|
|
|
follower_profiles = [p.to_json(include_following_user=user.pk) for p in follower_profiles]
|
|
|
|
|
|
|
|
logging.user(request, "~BB~FRLoading Friends (%s following, %s followers)" % (
|
|
|
|
social_profile.following_count,
|
|
|
|
social_profile.follower_count,
|
|
|
|
))
|
2012-04-04 16:09:01 -07:00
|
|
|
|
|
|
|
return {
|
|
|
|
'services': social_services,
|
|
|
|
'autofollow': social_services.autofollow,
|
2012-06-27 16:46:30 -07:00
|
|
|
'user_profile': social_profile.to_json(include_follows=True),
|
2012-04-04 16:09:01 -07:00
|
|
|
'following_profiles': following_profiles,
|
|
|
|
'follower_profiles': follower_profiles,
|
2012-05-15 16:35:09 -07:00
|
|
|
'recommended_users': recommended_users,
|
2012-04-04 16:09:01 -07:00
|
|
|
}
|
|
|
|
|
2012-01-04 09:42:35 -08:00
|
|
|
@ajax_login_required
|
|
|
|
@json.json_view
|
|
|
|
def follow(request):
|
2012-07-25 23:57:10 -07:00
|
|
|
profile = MSocialProfile.get_user(request.user.pk)
|
2012-04-04 20:54:54 -07:00
|
|
|
user_id = request.POST['user_id']
|
2012-03-19 17:16:59 -07:00
|
|
|
try:
|
2012-04-04 20:54:54 -07:00
|
|
|
follow_user_id = int(user_id)
|
2012-03-19 17:16:59 -07:00
|
|
|
except ValueError:
|
2012-04-04 20:54:54 -07:00
|
|
|
try:
|
|
|
|
follow_user_id = int(user_id.replace('social:', ''))
|
2012-07-25 23:57:10 -07:00
|
|
|
follow_profile = MSocialProfile.get_user(follow_user_id)
|
2012-04-04 20:54:54 -07:00
|
|
|
except (ValueError, MSocialProfile.DoesNotExist):
|
|
|
|
follow_username = user_id.replace('social:', '')
|
|
|
|
try:
|
|
|
|
follow_profile = MSocialProfile.objects.get(username=follow_username)
|
|
|
|
except MSocialProfile.DoesNotExist:
|
|
|
|
raise Http404
|
|
|
|
follow_user_id = follow_profile.user_id
|
2012-03-19 17:16:59 -07:00
|
|
|
|
2012-01-04 09:42:35 -08:00
|
|
|
profile.follow_user(follow_user_id)
|
2012-07-25 23:57:10 -07:00
|
|
|
follow_profile = MSocialProfile.get_user(follow_user_id)
|
2012-01-04 09:42:35 -08:00
|
|
|
|
2012-02-10 12:48:14 -08:00
|
|
|
social_params = {
|
|
|
|
'user_id': request.user.pk,
|
|
|
|
'subscription_user_id': follow_user_id,
|
|
|
|
'include_favicon': True,
|
|
|
|
'update_counts': True,
|
|
|
|
}
|
2012-08-01 18:52:54 -07:00
|
|
|
follow_subscription = MSocialSubscription.feeds(calculate_all_scores=True, **social_params)
|
2012-02-10 12:48:14 -08:00
|
|
|
|
2012-03-07 17:34:22 -08:00
|
|
|
logging.user(request, "~BB~FRFollowing: %s" % follow_profile.username)
|
|
|
|
|
2012-02-10 12:48:14 -08:00
|
|
|
return {
|
2012-06-27 16:46:30 -07:00
|
|
|
"user_profile": profile.to_json(include_follows=True),
|
2012-04-21 16:14:53 -07:00
|
|
|
"follow_profile": follow_profile.to_json(common_follows_with_user=request.user.pk),
|
2012-02-10 12:48:14 -08:00
|
|
|
"follow_subscription": follow_subscription,
|
|
|
|
}
|
2012-01-04 09:42:35 -08:00
|
|
|
|
|
|
|
@ajax_login_required
|
|
|
|
@json.json_view
|
|
|
|
def unfollow(request):
|
2012-07-25 23:57:10 -07:00
|
|
|
profile = MSocialProfile.get_user(request.user.pk)
|
2012-04-04 20:54:54 -07:00
|
|
|
user_id = request.POST['user_id']
|
2012-03-19 17:16:59 -07:00
|
|
|
try:
|
2012-04-04 20:54:54 -07:00
|
|
|
unfollow_user_id = int(user_id)
|
2012-03-19 17:16:59 -07:00
|
|
|
except ValueError:
|
2012-04-04 20:54:54 -07:00
|
|
|
try:
|
|
|
|
unfollow_user_id = int(user_id.replace('social:', ''))
|
2012-07-25 23:57:10 -07:00
|
|
|
unfollow_profile = MSocialProfile.get_user(unfollow_user_id)
|
2012-04-04 20:54:54 -07:00
|
|
|
except (ValueError, MSocialProfile.DoesNotExist):
|
|
|
|
unfollow_username = user_id.replace('social:', '')
|
|
|
|
try:
|
|
|
|
unfollow_profile = MSocialProfile.objects.get(username=unfollow_username)
|
|
|
|
except MSocialProfile.DoesNotExist:
|
|
|
|
raise Http404
|
|
|
|
unfollow_user_id = unfollow_profile.user_id
|
2012-03-19 17:16:59 -07:00
|
|
|
|
2012-01-04 09:42:35 -08:00
|
|
|
profile.unfollow_user(unfollow_user_id)
|
2012-07-25 23:57:10 -07:00
|
|
|
unfollow_profile = MSocialProfile.get_user(unfollow_user_id)
|
2012-01-05 20:54:24 -08:00
|
|
|
|
2012-03-07 17:34:22 -08:00
|
|
|
logging.user(request, "~BB~FRUnfollowing: %s" % unfollow_profile.username)
|
|
|
|
|
2012-04-21 16:14:53 -07:00
|
|
|
return {
|
2012-06-27 16:46:30 -07:00
|
|
|
'user_profile': profile.to_json(include_follows=True),
|
2012-04-21 16:14:53 -07:00
|
|
|
'unfollow_profile': unfollow_profile.to_json(common_follows_with_user=request.user.pk),
|
|
|
|
}
|
2012-03-13 16:58:50 -07:00
|
|
|
|
|
|
|
@json.json_view
|
|
|
|
def find_friends(request):
|
|
|
|
query = request.GET.get('query')
|
2012-07-30 21:39:21 -07:00
|
|
|
limit = int(request.GET.get('limit', 3))
|
|
|
|
profiles = MSocialProfile.objects.filter(username__icontains=query)[:limit]
|
2012-03-13 16:58:50 -07:00
|
|
|
if not profiles:
|
2012-07-30 21:39:21 -07:00
|
|
|
profiles = MSocialProfile.objects.filter(email__icontains=query)[:limit]
|
2012-03-13 16:58:50 -07:00
|
|
|
if not profiles:
|
2012-07-30 21:39:21 -07:00
|
|
|
profiles = MSocialProfile.objects.filter(blurblog_title__icontains=query)[:limit]
|
2012-09-13 14:13:15 -07:00
|
|
|
if not profiles:
|
|
|
|
profiles = MSocialProfile.objects.filter(location__icontains=query)[:limit]
|
2012-03-13 16:58:50 -07:00
|
|
|
|
2012-07-31 11:41:30 -07:00
|
|
|
profiles = [p.to_json(include_following_user=request.user.pk) for p in profiles]
|
2012-07-31 23:42:43 -07:00
|
|
|
profiles = sorted(profiles, key=lambda p: -1 * p['shared_stories_count'])
|
|
|
|
|
2012-03-13 16:58:50 -07:00
|
|
|
return dict(profiles=profiles)
|
2012-07-15 17:59:19 -07:00
|
|
|
|
|
|
|
@ajax_login_required
|
|
|
|
def like_comment(request):
|
|
|
|
code = 1
|
|
|
|
feed_id = int(request.POST['story_feed_id'])
|
|
|
|
story_id = request.POST['story_id']
|
|
|
|
comment_user_id = request.POST['comment_user_id']
|
|
|
|
format = request.REQUEST.get('format', 'json')
|
|
|
|
|
2012-07-15 19:29:05 -07:00
|
|
|
if comment_user_id == request.user.pk:
|
|
|
|
return json.json_response(request, {'code': -1, 'message': 'You cannot favorite your own shared story comment.'})
|
|
|
|
|
2012-07-15 17:59:19 -07:00
|
|
|
shared_story = MSharedStory.objects.get(user_id=comment_user_id,
|
|
|
|
story_feed_id=feed_id,
|
|
|
|
story_guid=story_id)
|
|
|
|
shared_story.add_liking_user(request.user.pk)
|
|
|
|
comment, profiles = shared_story.comment_with_author_and_profiles()
|
|
|
|
|
|
|
|
comment_user = User.objects.get(pk=shared_story.user_id)
|
|
|
|
logging.user(request, "~BB~FMLiking comment by ~SB%s~SN: %s" % (
|
|
|
|
comment_user.username,
|
|
|
|
shared_story.comments[:30],
|
|
|
|
))
|
|
|
|
|
2012-07-28 12:37:16 -07:00
|
|
|
MActivity.new_comment_like(liking_user_id=request.user.pk,
|
2012-07-15 19:29:05 -07:00
|
|
|
comment_user_id=comment['user_id'],
|
|
|
|
story_id=story_id,
|
|
|
|
story_title=shared_story.story_title,
|
|
|
|
comments=shared_story.comments)
|
2012-07-28 12:37:16 -07:00
|
|
|
MInteraction.new_comment_like(liking_user_id=request.user.pk,
|
|
|
|
comment_user_id=comment['user_id'],
|
2012-07-15 19:29:05 -07:00
|
|
|
story_id=story_id,
|
|
|
|
story_title=shared_story.story_title,
|
|
|
|
comments=shared_story.comments)
|
|
|
|
|
2012-07-15 17:59:19 -07:00
|
|
|
if format == 'html':
|
|
|
|
comment = MSharedStory.attach_users_to_comment(comment, profiles)
|
|
|
|
return render_to_response('social/story_comment.xhtml', {
|
|
|
|
'comment': comment,
|
|
|
|
}, context_instance=RequestContext(request))
|
|
|
|
else:
|
|
|
|
return json.json_response(request, {
|
|
|
|
'code': code,
|
|
|
|
'comment': comment,
|
|
|
|
'user_profiles': profiles,
|
|
|
|
})
|
|
|
|
|
|
|
|
@ajax_login_required
|
|
|
|
def remove_like_comment(request):
|
|
|
|
code = 1
|
|
|
|
feed_id = int(request.POST['story_feed_id'])
|
|
|
|
story_id = request.POST['story_id']
|
|
|
|
comment_user_id = request.POST['comment_user_id']
|
|
|
|
format = request.REQUEST.get('format', 'json')
|
|
|
|
|
|
|
|
shared_story = MSharedStory.objects.get(user_id=comment_user_id,
|
|
|
|
story_feed_id=feed_id,
|
|
|
|
story_guid=story_id)
|
|
|
|
shared_story.remove_liking_user(request.user.pk)
|
|
|
|
comment, profiles = shared_story.comment_with_author_and_profiles()
|
|
|
|
|
|
|
|
comment_user = User.objects.get(pk=shared_story.user_id)
|
|
|
|
logging.user(request, "~BB~FMRemoving like on comment by ~SB%s~SN: %s" % (
|
|
|
|
comment_user.username,
|
|
|
|
shared_story.comments[:30],
|
|
|
|
))
|
2011-12-25 20:50:59 -08:00
|
|
|
|
2012-07-15 17:59:19 -07:00
|
|
|
if format == 'html':
|
|
|
|
comment = MSharedStory.attach_users_to_comment(comment, profiles)
|
|
|
|
return render_to_response('social/story_comment.xhtml', {
|
|
|
|
'comment': comment,
|
|
|
|
}, context_instance=RequestContext(request))
|
|
|
|
else:
|
|
|
|
return json.json_response(request, {
|
|
|
|
'code': code,
|
|
|
|
'comment': comment,
|
|
|
|
'user_profiles': profiles,
|
|
|
|
})
|
|
|
|
|
2012-02-02 17:43:17 -08:00
|
|
|
def shared_stories_rss_feed(request, user_id, username):
|
|
|
|
try:
|
|
|
|
user = User.objects.get(pk=user_id)
|
|
|
|
except User.DoesNotExist:
|
|
|
|
raise Http404
|
|
|
|
|
2012-07-30 13:53:31 -07:00
|
|
|
username = username and username.lower()
|
|
|
|
profile = MSocialProfile.get_user(user.pk)
|
|
|
|
if not username or profile.username_slug.lower() != username:
|
2012-05-02 19:00:17 -07:00
|
|
|
params = {'username': profile.username_slug, 'user_id': user.pk}
|
2012-02-03 11:41:01 -08:00
|
|
|
return HttpResponseRedirect(reverse('shared-stories-rss-feed', kwargs=params))
|
2012-02-02 17:43:17 -08:00
|
|
|
|
2012-07-25 23:57:10 -07:00
|
|
|
social_profile = MSocialProfile.get_user(user_id)
|
2012-02-02 17:43:17 -08:00
|
|
|
|
|
|
|
data = {}
|
2012-06-20 17:13:34 -07:00
|
|
|
data['title'] = social_profile.title
|
2012-07-30 21:39:21 -07:00
|
|
|
data['link'] = social_profile.blurblog_url
|
2012-02-02 17:43:17 -08:00
|
|
|
data['description'] = "Stories shared by %s on NewsBlur." % user.username
|
|
|
|
data['lastBuildDate'] = datetime.datetime.utcnow()
|
|
|
|
data['items'] = []
|
|
|
|
data['generator'] = 'NewsBlur'
|
|
|
|
data['docs'] = None
|
|
|
|
|
2012-07-30 13:25:44 -07:00
|
|
|
shared_stories = MSharedStory.objects.filter(user_id=user.pk).order_by('-shared_date')[:25]
|
2012-02-02 17:43:17 -08:00
|
|
|
for shared_story in shared_stories:
|
|
|
|
story_data = {
|
|
|
|
'title': shared_story.story_title,
|
|
|
|
'link': shared_story.story_permalink,
|
2012-07-05 22:20:49 -07:00
|
|
|
'description': shared_story.story_content_z and zlib.decompress(shared_story.story_content_z),
|
2012-07-30 21:39:21 -07:00
|
|
|
'author': shared_story.story_author_name,
|
|
|
|
'categories': shared_story.story_tags,
|
2012-02-02 17:43:17 -08:00
|
|
|
'guid': shared_story.story_guid,
|
2012-07-30 21:39:21 -07:00
|
|
|
'pubDate': shared_story.shared_date,
|
2012-02-02 17:43:17 -08:00
|
|
|
}
|
|
|
|
data['items'].append(RSS.RSSItem(**story_data))
|
|
|
|
|
|
|
|
rss = RSS.RSS2(**data)
|
|
|
|
|
|
|
|
return HttpResponse(rss.to_xml())
|
2012-02-13 11:07:32 -08:00
|
|
|
|
|
|
|
@json.json_view
|
|
|
|
def social_feed_trainer(request):
|
|
|
|
social_user_id = request.REQUEST.get('user_id')
|
2012-07-25 23:57:10 -07:00
|
|
|
social_profile = MSocialProfile.get_user(social_user_id)
|
2012-02-13 11:07:32 -08:00
|
|
|
social_user = get_object_or_404(User, pk=social_user_id)
|
|
|
|
user = get_user(request)
|
|
|
|
|
|
|
|
social_profile.count_stories()
|
|
|
|
classifier = social_profile.to_json()
|
2012-02-14 10:34:10 -08:00
|
|
|
classifier['classifiers'] = get_classifiers_for_user(user, social_user_id=classifier['id'])
|
2012-02-13 11:07:32 -08:00
|
|
|
classifier['num_subscribers'] = social_profile.follower_count
|
|
|
|
classifier['feed_tags'] = []
|
|
|
|
classifier['feed_authors'] = []
|
|
|
|
|
2012-04-12 11:18:56 -07:00
|
|
|
logging.user(user, "~FGLoading social trainer on ~SB%s: %s" % (
|
|
|
|
social_user.username, social_profile.title))
|
2012-02-13 11:07:32 -08:00
|
|
|
|
|
|
|
return [classifier]
|
2012-02-02 17:43:17 -08:00
|
|
|
|
2012-02-16 18:36:52 -08:00
|
|
|
|
|
|
|
@json.json_view
|
|
|
|
def load_social_statistics(request, social_user_id, username=None):
|
|
|
|
stats = dict()
|
2012-07-25 23:57:10 -07:00
|
|
|
social_profile = MSocialProfile.get_user(social_user_id)
|
2012-02-16 18:36:52 -08:00
|
|
|
social_profile.save_feed_story_history_statistics()
|
|
|
|
social_profile.save_classifier_counts()
|
|
|
|
|
|
|
|
# Stories per month - average and month-by-month breakout
|
|
|
|
stats['average_stories_per_month'] = social_profile.average_stories_per_month
|
|
|
|
stats['story_count_history'] = social_profile.story_count_history
|
|
|
|
|
|
|
|
# Subscribers
|
|
|
|
stats['subscriber_count'] = social_profile.follower_count
|
|
|
|
stats['num_subscribers'] = social_profile.follower_count
|
|
|
|
|
|
|
|
# Classifier counts
|
|
|
|
stats['classifier_counts'] = social_profile.feed_classifier_counts
|
|
|
|
|
2012-04-12 11:18:56 -07:00
|
|
|
logging.user(request, "~FBStatistics social: ~SB%s ~FG(%s subs)" % (
|
|
|
|
social_profile.user_id, social_profile.follower_count))
|
2012-02-16 18:36:52 -08:00
|
|
|
|
|
|
|
return stats
|
|
|
|
|
|
|
|
@json.json_view
|
|
|
|
def load_social_settings(request, social_user_id, username=None):
|
2012-07-25 23:57:10 -07:00
|
|
|
social_profile = MSocialProfile.get_user(social_user_id)
|
2012-02-16 18:36:52 -08:00
|
|
|
|
|
|
|
return social_profile.to_json()
|
2012-04-12 11:18:56 -07:00
|
|
|
|
2012-07-28 23:02:35 -07:00
|
|
|
@ajax_login_required
|
2012-04-12 11:18:56 -07:00
|
|
|
def load_interactions(request):
|
2012-07-09 12:41:25 -07:00
|
|
|
user_id = request.REQUEST.get('user_id', None)
|
2012-08-14 00:26:42 -07:00
|
|
|
categories = request.GET.getlist('category')
|
2012-07-09 12:41:25 -07:00
|
|
|
if not user_id:
|
|
|
|
user_id = get_user(request).pk
|
2012-04-12 11:18:56 -07:00
|
|
|
page = max(1, int(request.REQUEST.get('page', 1)))
|
2012-07-18 23:06:43 -07:00
|
|
|
limit = request.REQUEST.get('limit')
|
2012-08-14 00:26:42 -07:00
|
|
|
interactions, has_next_page = MInteraction.user(user_id, page=page, limit=limit,
|
|
|
|
categories=categories)
|
2012-07-09 12:41:25 -07:00
|
|
|
format = request.REQUEST.get('format', None)
|
|
|
|
|
|
|
|
data = {
|
2012-04-12 11:18:56 -07:00
|
|
|
'interactions': interactions,
|
|
|
|
'page': page,
|
2012-07-18 23:06:43 -07:00
|
|
|
'has_next_page': has_next_page
|
2012-06-20 17:12:46 -04:00
|
|
|
}
|
2012-07-09 12:41:25 -07:00
|
|
|
|
|
|
|
if format == 'html':
|
|
|
|
return render_to_response('reader/interactions_module.xhtml', data,
|
|
|
|
context_instance=RequestContext(request))
|
|
|
|
else:
|
|
|
|
return json.json_response(request, data)
|
2012-07-28 23:02:35 -07:00
|
|
|
|
|
|
|
@ajax_login_required
|
2012-07-11 17:45:55 -07:00
|
|
|
def load_activities(request):
|
|
|
|
user_id = request.REQUEST.get('user_id', None)
|
2012-08-14 00:26:42 -07:00
|
|
|
categories = request.GET.getlist('category')
|
2012-07-11 17:45:55 -07:00
|
|
|
if user_id:
|
|
|
|
user_id = int(user_id)
|
|
|
|
user = User.objects.get(pk=user_id)
|
|
|
|
else:
|
|
|
|
user = get_user(request)
|
|
|
|
user_id = user.pk
|
|
|
|
|
|
|
|
public = user_id != request.user.pk
|
|
|
|
page = max(1, int(request.REQUEST.get('page', 1)))
|
2012-07-21 16:38:37 -07:00
|
|
|
limit = request.REQUEST.get('limit', 4)
|
2012-08-14 00:26:42 -07:00
|
|
|
activities, has_next_page = MActivity.user(user_id, page=page, limit=limit, public=public,
|
|
|
|
categories=categories)
|
2012-07-11 17:45:55 -07:00
|
|
|
format = request.REQUEST.get('format', None)
|
|
|
|
|
|
|
|
data = {
|
|
|
|
'activities': activities,
|
|
|
|
'page': page,
|
2012-07-18 23:06:43 -07:00
|
|
|
'has_next_page': has_next_page,
|
2012-07-11 17:45:55 -07:00
|
|
|
'username': (user.username if public else 'You'),
|
|
|
|
}
|
|
|
|
|
|
|
|
if format == 'html':
|
|
|
|
return render_to_response('reader/activities_module.xhtml', data,
|
|
|
|
context_instance=RequestContext(request))
|
|
|
|
else:
|
|
|
|
return json.json_response(request, data)
|
2012-08-06 17:52:33 -07:00
|
|
|
|
|
|
|
@json.json_view
|
|
|
|
def comment(request, comment_id):
|
|
|
|
try:
|
|
|
|
shared_story = MSharedStory.objects.get(id=comment_id)
|
|
|
|
except MSharedStory.DoesNotExist:
|
|
|
|
raise Http404
|
|
|
|
|
|
|
|
return shared_story.comments_with_author()
|