mirror of
https://github.com/samuelclay/NewsBlur.git
synced 2025-08-05 16:58:59 +00:00
Finished styling comments. Showing all sharers now.
This commit is contained in:
parent
6cbe61f603
commit
0468fe12dc
6 changed files with 70 additions and 33 deletions
|
@ -822,11 +822,11 @@ class Feed(models.Model):
|
||||||
story['story_content'] = story_content
|
story['story_content'] = story_content
|
||||||
story['story_permalink'] = urllib.unquote(urllib.unquote(story_db.story_permalink))
|
story['story_permalink'] = urllib.unquote(urllib.unquote(story_db.story_permalink))
|
||||||
story['story_feed_id'] = feed_id or story_db.story_feed_id
|
story['story_feed_id'] = feed_id or story_db.story_feed_id
|
||||||
story['comment_count'] = story_db.comment_count
|
story['comment_count'] = story_db.comment_count if hasattr(story_db, 'comment_count') else 0
|
||||||
story['comment_user_ids'] = story_db.comment_user_ids
|
story['comment_user_ids'] = story_db.comment_user_ids if hasattr(story_db, 'comment_user_ids') else []
|
||||||
story['share_count'] = story_db.share_count
|
story['share_count'] = story_db.share_count if hasattr(story_db, 'share_count') else 0
|
||||||
story['share_user_ids'] = story_db.share_user_ids
|
story['share_user_ids'] = story_db.share_user_ids if hasattr(story_db, 'share_user_ids') else []
|
||||||
story['guid_hash'] = story_db.guid_hash
|
story['guid_hash'] = story_db.guid_hash if hasattr(story_db, 'guid_hash') else None
|
||||||
story['id'] = story_db.story_guid or story_db.story_date
|
story['id'] = story_db.story_guid or story_db.story_date
|
||||||
if hasattr(story_db, 'starred_date'):
|
if hasattr(story_db, 'starred_date'):
|
||||||
story['starred_date'] = story_db.starred_date
|
story['starred_date'] = story_db.starred_date
|
||||||
|
@ -1177,7 +1177,7 @@ class MStory(mongo.Document):
|
||||||
'story_feed_id': self.story_feed_id,
|
'story_feed_id': self.story_feed_id,
|
||||||
}
|
}
|
||||||
comments = MSharedStory.objects.filter(has_comments=True, **params).only('user_id')
|
comments = MSharedStory.objects.filter(has_comments=True, **params).only('user_id')
|
||||||
shares = MSharedStory.objects.filter(has_comments=False, **params).only('user_id')
|
shares = MSharedStory.objects.filter(**params).only('user_id')
|
||||||
self.comment_count = comments.count()
|
self.comment_count = comments.count()
|
||||||
self.comment_user_ids = [c['user_id'] for c in comments]
|
self.comment_user_ids = [c['user_id'] for c in comments]
|
||||||
self.share_count = shares.count()
|
self.share_count = shares.count()
|
||||||
|
|
|
@ -58,6 +58,8 @@ class MSharedStory(mongo.Document):
|
||||||
else:
|
else:
|
||||||
r.srem(comment_key, self.user_id)
|
r.srem(comment_key, self.user_id)
|
||||||
|
|
||||||
|
self.shared_date = datetime.datetime.utcnow()
|
||||||
|
|
||||||
super(MSharedStory, self).save(*args, **kwargs)
|
super(MSharedStory, self).save(*args, **kwargs)
|
||||||
|
|
||||||
author = MSocialProfile.objects.get(user_id=self.user_id)
|
author = MSocialProfile.objects.get(user_id=self.user_id)
|
||||||
|
@ -116,15 +118,20 @@ class MSharedStory(mongo.Document):
|
||||||
story['comment_count_friends'] = len(shared_stories)
|
story['comment_count_friends'] = len(shared_stories)
|
||||||
if story['share_count']:
|
if story['share_count']:
|
||||||
share_key = "S:%s:%s" % (story['story_feed_id'], story['guid_hash'])
|
share_key = "S:%s:%s" % (story['story_feed_id'], story['guid_hash'])
|
||||||
friends_with_shares = r.sinter(share_key, friend_key)
|
friends_with_shares = [int(f) for f in r.sinter(share_key, friend_key)]
|
||||||
profiles = []
|
nonfriend_user_ids = list(set(story['share_user_ids']).difference(friends_with_shares))
|
||||||
|
profiles = MSocialProfile.objects.filter(user_id__in=nonfriend_user_ids)
|
||||||
|
friend_profiles = []
|
||||||
if friends_with_shares:
|
if friends_with_shares:
|
||||||
profiles = MSocialProfile.objects.filter(user_id__in=friends_with_shares)
|
friend_profiles = MSocialProfile.objects.filter(user_id__in=friends_with_shares)
|
||||||
|
story['shared_by_public'] = []
|
||||||
story['shared_by_friends'] = []
|
story['shared_by_friends'] = []
|
||||||
for profile in profiles:
|
for profile in profiles:
|
||||||
|
story['shared_by_public'].append(profile.to_json(compact=True))
|
||||||
|
for profile in friend_profiles:
|
||||||
story['shared_by_friends'].append(profile.to_json(compact=True))
|
story['shared_by_friends'].append(profile.to_json(compact=True))
|
||||||
story['share_count_public'] = story['share_count'] - len(profiles)
|
story['share_count_public'] = story['share_count'] - len(friend_profiles)
|
||||||
story['share_count_friends'] = len(profiles)
|
story['share_count_friends'] = len(friend_profiles)
|
||||||
|
|
||||||
return stories
|
return stories
|
||||||
|
|
||||||
|
|
|
@ -47,7 +47,7 @@ def mark_story_as_shared(request):
|
||||||
story_db = dict([(k, v) for k, v in story._data.items()
|
story_db = dict([(k, v) for k, v in story._data.items()
|
||||||
if k is not None and v is not None])
|
if k is not None and v is not None])
|
||||||
now = datetime.datetime.now()
|
now = datetime.datetime.now()
|
||||||
story_values = dict(user_id=request.user.pk, shared_date=now, comments=comments,
|
story_values = dict(user_id=request.user.pk, comments=comments,
|
||||||
has_comments=bool(comments), **story_db)
|
has_comments=bool(comments), **story_db)
|
||||||
MSharedStory.objects.create(**story_values)
|
MSharedStory.objects.create(**story_values)
|
||||||
logging.user(request, "~FCSharing: ~SB~FM%s (~FB%s~FM)" % (story.story_title[:50], comments[:100]))
|
logging.user(request, "~FCSharing: ~SB~FM%s (~FB%s~FM)" % (story.story_title[:50], comments[:100]))
|
||||||
|
|
|
@ -1942,7 +1942,7 @@ background: transparent;
|
||||||
border-top: 1px solid #A6A6A6;
|
border-top: 1px solid #A6A6A6;
|
||||||
background-color: #FCFCFC;
|
background-color: #FCFCFC;
|
||||||
position: relative;
|
position: relative;
|
||||||
padding: 0 12px 0 54px;
|
padding: 0 12px 2px 54px;
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
@ -1952,9 +1952,10 @@ background: transparent;
|
||||||
top: 6px;
|
top: 6px;
|
||||||
}
|
}
|
||||||
#story_pane .NB-story-comment .NB-user-avatar img {
|
#story_pane .NB-story-comment .NB-user-avatar img {
|
||||||
border: 1px solid #A6A6A6;
|
border-radius: 6px;
|
||||||
width: 36px;
|
margin: 2px 0 0 1px;
|
||||||
height: 36px;
|
width: 38px;
|
||||||
|
height: 38px;
|
||||||
}
|
}
|
||||||
#story_pane .NB-story-comment .NB-story-comment-author-container {
|
#story_pane .NB-story-comment .NB-story-comment-author-container {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
@ -2009,8 +2010,9 @@ background: transparent;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
font-size: 10px;
|
font-size: 10px;
|
||||||
padding: 2px 12px;
|
padding: 8px 12px 0px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
height: 27px;
|
||||||
-webkit-transition: all .12s ease-out;
|
-webkit-transition: all .12s ease-out;
|
||||||
-moz-transition: all .12s ease-out;
|
-moz-transition: all .12s ease-out;
|
||||||
-o-transition: all .12s ease-out;
|
-o-transition: all .12s ease-out;
|
||||||
|
@ -2025,19 +2027,40 @@ background: transparent;
|
||||||
padding: 0 1px;
|
padding: 0 1px;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
|
#story_pane .NB-story-share-label {
|
||||||
|
display: inline-block;
|
||||||
|
margin: 0 4px 0 0;
|
||||||
|
}
|
||||||
#story_pane .NB-story-share-profiles {
|
#story_pane .NB-story-share-profiles {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
|
vertical-align: top;
|
||||||
|
height: 24px;
|
||||||
|
padding-top: 2px;
|
||||||
|
margin-top: -4px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
#story_pane .NB-story-share-profiles.NB-story-share-profiles-public {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
#story_pane .NB-story-share-profiles.NB-story-share-profiles-public .NB-story-share-profile {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
#story_pane .NB-story-share-profile {
|
#story_pane .NB-story-share-profile {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
overflow: hidden;
|
|
||||||
}
|
}
|
||||||
#story_pane .NB-story-share-profile .NB-user-avatar {
|
#story_pane .NB-story-share-profile .NB-user-avatar {
|
||||||
width: 16px;
|
|
||||||
height: 16px;
|
|
||||||
float: left;
|
float: left;
|
||||||
|
font-size: 0;
|
||||||
|
vertical-align: middle;
|
||||||
|
height: 22px;
|
||||||
|
width: 22px;
|
||||||
|
margin: 0 4px 0 0;
|
||||||
|
}
|
||||||
|
#story_pane .NB-story-share-profile .NB-user-avatar img {
|
||||||
|
width: 22px;
|
||||||
|
height: 22px;
|
||||||
|
border-radius: 3px;
|
||||||
}
|
}
|
||||||
#story_pane .NB-story-share-profile .NB-user-username {
|
#story_pane .NB-story-share-profile .NB-user-username {
|
||||||
float: left;
|
float: left;
|
||||||
|
|
|
@ -4111,11 +4111,14 @@
|
||||||
' ',
|
' ',
|
||||||
Inflector.pluralize('person', story.share_count)
|
Inflector.pluralize('person', story.share_count)
|
||||||
])),
|
])),
|
||||||
(story.share_count_friends && $.make('span', [
|
(story.share_count && $.make('span', [
|
||||||
'Shared by: ',
|
(story.share_count_public && $.make('div', { className: 'NB-story-share-profiles NB-story-share-profiles-public' },
|
||||||
$.make('div', { className: 'NB-story-share-profiles' },
|
_.map(story.shared_by_public, function(profile) { return self.make_story_share_profile(profile); })
|
||||||
|
)),
|
||||||
|
(story.share_count_friends && $.make('div', { className: 'NB-story-share-label' }, 'Shared by: ')),
|
||||||
|
(story.share_count_friends && $.make('div', { className: 'NB-story-share-profiles NB-story-share-profiles-friends' },
|
||||||
_.map(story.shared_by_friends, function(profile) { return self.make_story_share_profile(profile); })
|
_.map(story.shared_by_friends, function(profile) { return self.make_story_share_profile(profile); })
|
||||||
)
|
))
|
||||||
]))
|
]))
|
||||||
])
|
])
|
||||||
]);
|
]);
|
||||||
|
@ -4169,9 +4172,8 @@
|
||||||
|
|
||||||
var $profile = $.make('div', { className: 'NB-story-share-profile' }, [
|
var $profile = $.make('div', { className: 'NB-story-share-profile' }, [
|
||||||
$.make('div', { className: 'NB-user-avatar' }, [
|
$.make('div', { className: 'NB-user-avatar' }, [
|
||||||
$.make('img', { src: user.get('photo_url') })
|
$.make('img', { src: user.get('photo_url'), title: user.get('username') })
|
||||||
]),
|
])
|
||||||
$.make('div', { className: 'NB-user-username' }, user.get('username'))
|
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return $profile;
|
return $profile;
|
||||||
|
|
|
@ -104,11 +104,14 @@ def _do_timesince(d, chunks, now=None):
|
||||||
# ignore microsecond part of 'd' since we removed it from 'now'
|
# ignore microsecond part of 'd' since we removed it from 'now'
|
||||||
delta = now - (d - datetime.timedelta(0, 0, d.microsecond))
|
delta = now - (d - datetime.timedelta(0, 0, d.microsecond))
|
||||||
since = delta.days * 24 * 60 * 60 + delta.seconds
|
since = delta.days * 24 * 60 * 60 + delta.seconds
|
||||||
for i, (seconds, name) in enumerate(chunks):
|
if since > 10:
|
||||||
count = since // seconds
|
for i, (seconds, name) in enumerate(chunks):
|
||||||
if count != 0:
|
count = since // seconds
|
||||||
break
|
if count != 0:
|
||||||
s = '%(number)d %(type)s' % {'number': count, 'type': name(count)}
|
break
|
||||||
|
s = '%(number)d %(type)s' % {'number': count, 'type': name(count)}
|
||||||
|
else:
|
||||||
|
s = 'just a second'
|
||||||
return s
|
return s
|
||||||
|
|
||||||
def relative_timesince(value):
|
def relative_timesince(value):
|
||||||
|
@ -118,7 +121,9 @@ def relative_timesince(value):
|
||||||
chunks = (
|
chunks = (
|
||||||
(60 * 60 * 24, lambda n: ungettext('day', 'days', n)),
|
(60 * 60 * 24, lambda n: ungettext('day', 'days', n)),
|
||||||
(60 * 60, lambda n: ungettext('hour', 'hours', n)),
|
(60 * 60, lambda n: ungettext('hour', 'hours', n)),
|
||||||
(60, lambda n: ungettext('minute', 'minutes', n))
|
(60, lambda n: ungettext('minute', 'minutes', n)),
|
||||||
|
(1, lambda n: ungettext('second', 'seconds', n)),
|
||||||
|
(0, lambda n: 'just now'),
|
||||||
)
|
)
|
||||||
return _do_timesince(value, chunks)
|
return _do_timesince(value, chunks)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue