diff --git a/r2/r2/controllers/api.py b/r2/r2/controllers/api.py index 83ba320a5..3c0769e55 100644 --- a/r2/r2/controllers/api.py +++ b/r2/r2/controllers/api.py @@ -2272,10 +2272,11 @@ class ApiController(RedditController): VModhash(), flair_enabled = VBoolean("flair_enabled"), flair_position = VOneOf("flair_position", ("left", "right")), + link_flair_position = VOneOf("link_flair_position", ("left", "right")), flair_self_assign_enabled = VBoolean("flair_self_assign_enabled")) @api_doc(api_section.flair) def POST_flairconfig(self, form, jquery, flair_enabled, flair_position, - flair_self_assign_enabled): + link_flair_position, flair_self_assign_enabled): if c.site.flair_enabled != flair_enabled: c.site.flair_enabled = flair_enabled ModAction.create(c.site, c.user, action='editflair', @@ -2284,6 +2285,10 @@ class ApiController(RedditController): c.site.flair_position = flair_position ModAction.create(c.site, c.user, action='editflair', details='flair_position') + if c.site.link_flair_position != link_flair_position: + c.site.link_flair_position = link_flair_position + ModAction.create(c.site, c.user, action='editflair', + details='link_flair_position') if c.site.flair_self_assign_enabled != flair_self_assign_enabled: c.site.flair_self_assign_enabled = flair_self_assign_enabled ModAction.create(c.site, c.user, action='editflair', @@ -2387,7 +2392,11 @@ class ApiController(RedditController): link = VFlairLink('link')) def POST_flairselector(self, user, link): if link: - return FlairSelector(link=link).render() + if hasattr(c.site, '_id') and c.site._id == link.sr_id: + site = c.site + else: + site = Subreddit._byID(link.sr_id, data=True) + return FlairSelector(link=link, site=site).render() if user and not (c.user_is_admin or c.site.is_moderator(c.user)): # ignore user parameter if c.user is not mod/admin user = None @@ -2404,19 +2413,24 @@ class ApiController(RedditController): text): if link: flair_type = LINK_FLAIR + if hasattr(c.site, '_id') and c.site._id == link.sr_id: + site = c.site + else: + site = Subreddit._byID(link.sr_id, data=True) else: flair_type = USER_FLAIR + site = c.site try: flair_template = FlairTemplateBySubredditIndex.get_template( - c.site._id, flair_template_id, flair_type=flair_type) + site._id, flair_template_id, flair_type=flair_type) except NotFound: # TODO: serve error to client - g.log.debug('invalid flair template for subreddit %s', c.site._id) + g.log.debug('invalid flair template for subreddit %s', site._id) return - if not c.site.is_moderator(c.user) and not c.user_is_admin: - if not c.site.flair_self_assign_enabled: + if not site.is_moderator(c.user) and not c.user_is_admin: + if not site.flair_self_assign_enabled: # TODO: serve error to client g.log.debug('flair self-assignment not permitted') return @@ -2434,9 +2448,9 @@ class ApiController(RedditController): css_class = flair_template.css_class if flair_type == USER_FLAIR: - c.site.add_flair(user) - setattr(user, 'flair_%s_text' % c.site._id, text) - setattr(user, 'flair_%s_css_class' % c.site._id, css_class) + site.add_flair(user) + setattr(user, 'flair_%s_text' % site._id, text) + setattr(user, 'flair_%s_css_class' % site._id, css_class) user._commit() if ((c.site.is_moderator(c.user) or c.user_is_admin) diff --git a/r2/r2/lib/pages/pages.py b/r2/r2/lib/pages/pages.py index 80f273806..3bc6bc5d5 100644 --- a/r2/r2/lib/pages/pages.py +++ b/r2/r2/lib/pages/pages.py @@ -2509,6 +2509,7 @@ class FlairPane(Templated): tabs=TabbedPane(tabs), flair_enabled=c.site.flair_enabled, flair_position=c.site.flair_position, + link_flair_position=c.site.link_flair_position, flair_self_assign_enabled=c.site.flair_self_assign_enabled) class FlairList(Templated): @@ -2654,7 +2655,7 @@ class FlairPrefs(CachedTemplate): class FlairSelector(CachedTemplate): """Provide user with flair options according to subreddit settings.""" - def __init__(self, user=None, link=None): + def __init__(self, user=None, link=None, site=None): if user is None: user = c.user if link: @@ -2665,14 +2666,16 @@ class FlairSelector(CachedTemplate): flair_type = USER_FLAIR target = user attr_pattern = 'flair_%s_%%s' % c.site._id + if site is None: + site = c.site - position = getattr(c.site, 'flair_position', 'right') + position = getattr(site, 'flair_position', 'right') text = getattr(target, attr_pattern % 'text', '') css_class = getattr(target, attr_pattern % 'css_class', '') ids = FlairTemplateBySubredditIndex.get_template_ids( - c.site._id, flair_type) + site._id, flair_type) template_dict = FlairTemplate._byID(ids) templates = [template_dict[i] for i in ids] for template in templates: @@ -2682,12 +2685,12 @@ class FlairSelector(CachedTemplate): else: matching_template = None - admin = bool(c.user_is_admin or c.site.is_moderator(c.user)) + admin = bool(c.user_is_admin or site.is_moderator(c.user)) - if c.site.flair_self_assign_enabled or admin: + if site.flair_self_assign_enabled or admin: choices = [ WrappedUser( - user, subreddit=c.site, force_show_flair=True, + user, subreddit=site, force_show_flair=True, flair_template=template, flair_text_editable=admin or template.text_editable) for template in templates] @@ -2701,8 +2704,7 @@ class FlairSelector(CachedTemplate): choice.flair_text = text break - wrapped_user = WrappedUser(user, subreddit=c.site, - force_show_flair=True) + wrapped_user = WrappedUser(user, subreddit=site, force_show_flair=True) Templated.__init__(self, text=text, css_class=css_class, position=position, choices=choices, diff --git a/r2/r2/lib/wrapped.pyx b/r2/r2/lib/wrapped.pyx index efd438c0c..b8b23f1dd 100644 --- a/r2/r2/lib/wrapped.pyx +++ b/r2/r2/lib/wrapped.pyx @@ -464,6 +464,7 @@ class CachedTemplate(Templated): if c.user and hasattr(c.site, '_id'): keys.extend([ c.site.flair_enabled, c.site.flair_position, + c.site.link_flair_position, c.user.flair_enabled_in_sr(c.site._id), c.user.pref_show_flair]) keys = [make_cachable(x, *a) for x in keys] diff --git a/r2/r2/models/subreddit.py b/r2/r2/models/subreddit.py index 78c1909a8..0776364d9 100644 --- a/r2/r2/models/subreddit.py +++ b/r2/r2/models/subreddit.py @@ -75,6 +75,7 @@ class Subreddit(Thing, Printable): link_type = 'any', # one of ('link', 'self', 'any') flair_enabled = True, flair_position = 'right', # one of ('left', 'right') + link_flair_position = 'left', # one of ('left', 'right') flair_self_assign_enabled = False, ) _essentials = ('type', 'name', 'lang') diff --git a/r2/r2/public/static/css/reddit.css b/r2/r2/public/static/css/reddit.css index c243ac430..71fe33ab9 100644 --- a/r2/r2/public/static/css/reddit.css +++ b/r2/r2/public/static/css/reddit.css @@ -681,7 +681,7 @@ a.author { margin-right: 0.5em; } } .title .flair { - font-size: small; + font-size: x-small; } .link .tagline .flair { @@ -802,7 +802,13 @@ a.author { margin-right: 0.5em; } .embededmedia { margin-top: 5px; margin-left: 60px; } -.thing .title { color: blue; padding: 0px; overflow: hidden; } +.thing .title { + color: blue; + margin-right: .4em; + padding: 0px; + overflow: hidden; +} + .thing .title:visited { color: #551a8b } .thing .title.click { color: #551a8b } diff --git a/r2/r2/public/static/js/flair.js b/r2/r2/public/static/js/flair.js index f41af972d..ae98476d1 100644 --- a/r2/r2/public/static/js/flair.js +++ b/r2/r2/public/static/js/flair.js @@ -165,9 +165,11 @@ $(function() { ($(button).position().left + $(button).width() - 18) + "px") .css("top", $(button).position().top + "px"); - var target = $(selector).siblings("form").find("input"); var params = {}; - params[target.attr("name")] = target.val(); + $(selector).siblings("form").find("input").each( + function(idx, inp) { + params[inp.name] = inp.value; + }); $.request("flairselector", params, handleResponse, true, "html"); return false; } diff --git a/r2/r2/templates/flairpane.html b/r2/r2/templates/flairpane.html index d44f55c8b..3de969c26 100644 --- a/r2/r2/templates/flairpane.html +++ b/r2/r2/templates/flairpane.html @@ -50,7 +50,7 @@ ${_("allow users to assign their own flair")} %utils:line_field> - <%utils:line_field title="${_('flair position')}"> + <%utils:line_field title="${_('user flair position')}">
- <%call expr="flair()" />
+ %if c.site.link_flair_position == 'left':
+ <%call expr="flair()" />
+ %endif
<%call expr="make_link('title', 'title')">
${thing.title}
%call>
+ %if c.site.link_flair_position == 'right':
+ <%call expr="flair()" />
+ %endif
%if getattr(thing, "approval_checkmark", None):
${_('flair')}