Exemple #1
0
class PriorityLevel(object):
    name = ''
    _text = N_('')
    _description = N_('')
    value = 1  # Values are from 1 (highest) to 100 (lowest)
    default = False
    inventory_override = False
    cpm = True  # Non-cpm is percentage, will fill unsold impressions

    def __repr__(self):
        return "<PriorityLevel %s: %s>" % (self.name, self.value)

    @property
    def text(self):
        return _(self._text) if self._text else ''

    @property
    def description(self):
        return _(self._description) if self._description else ''
Exemple #2
0
class KindMenu(SortMenu):
    name = 'kind'
    _default = 'all'
    _options = ('links', 'comments', 'messages', 'all')
    _title = N_("kind")

    def make_title(self, attr):
        if attr == "all":
            return _("all")
        return menu[attr]
Exemple #3
0
def notify_user_added(rel_type, author, user, target, message=None):
    msgs = user_added_messages.get(rel_type)
    if not msgs:
        return

    srname = target.path.rstrip("/")
    d = {
        "url": srname,
        "title": "%s: %s" % (srname, target.title),
        "author": "/u/" + author.name,
        "user": "******" + user.name,
    }

    if "pm" in msgs and author != user:
        subject = msgs["pm"]["subject"] % d
        msg = msgs["pm"]["msg"] % d

        if rel_type == "banned" and not user.has_interacted_with(target):
            return

        if rel_type == "banned" and message:
            msg += "\n\n" + N_("note from the moderators:\n\n\"%(message)s\"")
            msg %= {'message': message}

        if rel_type in ("banned", "moderator_invite"):
            # send the message from the subreddit
            item, inbox_rel = Message._new(author,
                                           user,
                                           subject,
                                           msg,
                                           request.ip,
                                           sr=target,
                                           from_sr=True)
        else:
            item, inbox_rel = Message._new(author, user, subject, msg,
                                           request.ip)

        queries.new_message(item, inbox_rel)

    if "modmail" in msgs:
        subject = msgs["modmail"]["subject"] % d
        msg = msgs["modmail"]["msg"] % d

        if rel_type == "moderator_invite":
            modmail_author = Account.system_user()
        else:
            modmail_author = author

        item, inbox_rel = Message._new(modmail_author,
                                       target,
                                       subject,
                                       msg,
                                       request.ip,
                                       sr=target)
        queries.new_message(item, inbox_rel)
Exemple #4
0
class SubredditButton(NavButton):
    from r2.models.subreddit import Frontpage, Mod, All, Random, RandomSubscription, HomeSR, DefaultSR, AllSR
    # TRANSLATORS: This refers to /r/mod
    name_overrides = {Mod: N_("mod"),
    # TRANSLATORS: This refers to the user's front page
                      Frontpage: N_(g.front_name),
                      All: N_(g.all_name),
                      Random: N_("random"),
    # TRANSLATORS: Gold feature, "myrandom", a random subreddit from your subscriptions
                      RandomSubscription: N_("myrandom")}

    def __init__(self, sr, css_class='', data=None):
        self.path = sr.path
        name = self.name_overrides.get(sr)
        name = _(name) if name else sr.name
        self.isselected = (c.site == sr)
        self.pref_site_index = c.user.pref_site_index

        if isinstance(c.site, DynamicSR):
            self.isselected = True

        if sr.is_homepage:
            self.path = '/'

        NavButton.__init__(self, name, sr.path, sr_path=False,
                           css_class=css_class, data=data)

    def build(self, base_path=''):
        self.bare_path = ""

    def is_selected(self):
        return self.isselected

    def cachable_attrs(self):
        return [
            ('path', self.path),
            ('title', self.title),
            ('isselected', self.isselected),
            ('css_class', self.css_class),
            ('data', self.data),
            ('pref_site_index', self.pref_site_index),
        ]
Exemple #5
0
class SubredditButton(NavButton):
    from r2.models.subreddit import Frontpage, Mod, All, Random, RandomSubscription, HomeSR, DefaultSR, AllSR
    # TRANSLATORS: This refers to /r/mod
    name_overrides = {Mod: N_("mod"),
    # TRANSLATORS: This refers to the user's front page
                      Frontpage: N_("front"),
                      All: N_("all"),
                      Random: N_("random"),
    # TRANSLATORS: Gold feature, "myrandom", a random subreddit from your subscriptions
                      RandomSubscription: N_("myrandom")}

    def __init__(self, sr, css_class='', data=None):
        self.path = sr.path
        name = self.name_overrides.get(sr)
        
        # CUSTOM: warning HomeSR extends AllSR, must be first
        if isinstance(sr, DefaultSR):
            name = g.live_config['all_on_front_front_name']
        elif isinstance(sr, HomeSR):
            name = g.home_name
        elif isinstance(sr, AllSR):
            name = g.live_config['all_on_front_all_name']

        name = _(name) if name else sr.name
        self.isselected = (c.site == sr)
        NavButton.__init__(self, name, sr.path, sr_path=False,
                           css_class=css_class, data=data)

    def build(self, base_path=''):
        self.bare_path = ""

    def is_selected(self):
        return self.isselected

    def cachable_attrs(self):
        return [
            ('path', self.path),
            ('title', self.title),
            ('isselected', self.isselected),
            ('css_class', self.css_class),
            ('data', self.data),
        ]
Exemple #6
0
 def deleteOrphaned(self):
     self.initChecks()
     settingsNamesDict = dict(
         (s.split('.')[1], s) for s in self.settings.keys())
     orphanedSettings = filter(lambda key: g.OPT.getValueType(key) == None,
                               settingsNamesDict.keys())
     map(lambda s: Setting.getSetting(settingsNamesDict[s]).delete(),
         orphanedSettings)
     c.message = N_('Deleted %s orphaned settings.' % len(orphanedSettings))
     c.returnUrl = h.url_for('hsCfgManage')
     return self.render('managementMessage')
    def load_controllers(self):
        from r2.controllers.api_docs import api_section, section_info
        api_section["live"] = "live"
        section_info["live"] = {
            "title": "live threads",
            "description": sys.modules[__name__].__doc__,
        }

        from r2.models.token import OAuth2Scope
        OAuth2Scope.scope_info["livemanage"] = {
            "id":
            "livemanage",
            "name":
            N_("Manage live threads"),
            "description":
            N_("Manage settings and contributors of live threads "
               "I contribute to."),
        }

        from reddit_liveupdate.controllers import (
            controller_hooks,
            LiveUpdateByIDController,
            LiveUpdateController,
            LiveUpdateEventsController,
            LiveUpdatePixelController,
        )

        from r2.config.templates import api
        from reddit_liveupdate import pages
        api('liveupdateeventapp', pages.LiveUpdateEventAppJsonTemplate)
        api('liveupdatefocusapp', pages.LiveUpdateEventAppJsonTemplate)
        api('liveupdateevent', pages.LiveUpdateEventJsonTemplate)
        api('liveupdatereportedeventrow', pages.LiveUpdateEventJsonTemplate)
        api('liveupdate', pages.LiveUpdateJsonTemplate)
        api('liveupdatecontributortableitem',
            pages.ContributorTableItemJsonTemplate)

        controller_hooks.register_all()

        from reddit_liveupdate import scraper
        scraper.hooks.register_all()
Exemple #8
0
class SortMenu(NavMenu):
    name = 'sort'
    hidden_options = []
    button_cls = QueryButton

    # these are _ prefixed to avoid colliding with NavMenu attributes
    _default = 'hot'
    _options = ('hot', 'new', 'top', 'old', g.voting_upvote_path, g.voting_controversial_path)
    _type = 'lightdrop'
    _title = N_("sorted by")

    def __init__(self, default=None, title='', base_path='', separator='|',
                 _id='', css_class=''):
        options = self.make_buttons()
        default = default or self._default
        base_path = base_path or request.path
        title = title or _(self._title)
        NavMenu.__init__(self, options, default=default, title=title,
                         type=self._type, base_path=base_path,
                         separator=separator, _id=_id, css_class=css_class)

    def make_buttons(self):
        buttons = []
        for name in self._options:
            css_class = 'hidden' if name in self.hidden_options else ''
            button = self.button_cls(self.make_title(name), name, self.name,
                                     css_class=css_class)
            buttons.append(button)
        return buttons

    def make_title(self, attr):
        return menu[attr]

    _mapping = {
        "hot": operators.desc('_hot'),
        "new": operators.desc('_date'),
        "old": operators.asc('_date'),
        "top": operators.desc('_score'),
        g.voting_upvote_path: operators.desc('_upvotes'),
        g.voting_controversial_path: operators.desc('_controversy'),
        "confidence": operators.desc('_confidence'),
        "random": operators.shuffled('_confidence'),
        "qa": operators.desc('_qa'),
    }
    _reverse_mapping = {v: k for k, v in _mapping.iteritems()}

    @classmethod
    def operator(cls, sort):
        return cls._mapping.get(sort)

    @classmethod
    def sort(cls, operator):
        return cls._reverse_mapping.get(operator)
Exemple #9
0
class TimeMenu(SortMenu):
    """Menu for setting the time interval of the listing (from 'hour' to 'all')"""
    name = 't'
    _default = 'all'
    _options = ('hour', 'day', 'week', 'month', 'year', 'all')
    _title = N_("links from")

    @classmethod
    def operator(self, time):
        from r2.models import Link
        if time != 'all':
            return Link.c._date >= timeago(time)
Exemple #10
0
class SubredditButton(NavButton):
    from r2.models.subreddit import Frontpage, Mod, All, Random, RandomSubscription
    # TRANSLATORS: This refers to /r/mod
    name_overrides = {
        Mod: N_("mod"),
        # TRANSLATORS: This refers to the user's front page
        Frontpage: N_("front"),
        All: N_("all"),
        Random: N_("random"),
        # TRANSLATORS: Gold feature, "myrandom", a random subreddit from your subscriptions
        RandomSubscription: N_("myrandom")
    }

    def __init__(self, sr, css_class='', data=None):
        self.path = sr.path
        name = self.name_overrides.get(sr)
        name = _(name) if name else sr.name
        self.isselected = (c.site == sr)
        NavButton.__init__(self,
                           name,
                           sr.path,
                           sr_path=False,
                           nocname=True,
                           css_class=css_class,
                           data=data)

    def build(self, base_path=''):
        self.bare_path = ""

    def is_selected(self):
        return self.isselected

    def cachable_attrs(self):
        return [
            ('path', self.path),
            ('title', self.title),
            ('isselected', self.isselected),
            ('css_class', self.css_class),
            ('data', self.data),
        ]
class ContributorPermissionSet(PermissionSet):
    info = {
        "update": {
            "title": N_("update"),
            "description": N_("post updates"),
        },
        "manage": {
            "title":
            N_("manage contributors"),
            "description":
            N_("add, remove, and change permissions of contributors"),
        },
        "settings": {
            "title": N_("settings"),
            "description": N_("change the title and description"),
        },
        "edit": {
            "title": N_("edit"),
            "description": N_("strike and delete others' updates"),
        },
        "close": {
            "title": N_("close live thread"),
            "description": N_("permanently close the live thread"),
        },
    }

    def allow(self, permission):
        if self.is_superuser():
            return True
        return self.get(permission, False)

    def without(self, permission):
        if self.is_superuser():
            permissions = {k: True for k in self.info}
        else:
            permissions = self.copy()

        permissions.pop(permission, None)
        return ContributorPermissionSet(permissions)
class Meatspace(Plugin):
    needs_static_build = True

    js = {
        "meatspace-qrcode":
        Module(
            "meatspace-qrcode.js",
            "lib/jquery.qrcode.min.js",
            "meatspace-qrcode.js",
        ),
    }

    errors = {
        "MEETUP_NOT_WITH_SELF": N_("you can't connect with yourself"),
        "MEETUP_INVALID_CODE": N_("that is not the correct code"),
    }

    def add_routes(self, mc):
        mc("/meetup/:codename/:action",
           controller="qrcode",
           action="portal",
           conditions={"function": not_in_sr})

        mc("/api/meetup_connect",
           controller="qrcode",
           action="connect",
           conditions={"function": not_in_sr})

        # shortdomain stuff is handled in haproxy, but haproxy can only prefix
        # paths that come through during rewrite. we'll handle it from there.
        mc("/meetup/:codename/or/:user/:code",
           controller="qrcode",
           action="connect_shortlink",
           conditions={"function": not_in_sr})

    def load_controllers(self):
        from reddit_meatspace.qrcode import QrCodeController
Exemple #13
0
class SubredditButton(NavButton):
    from r2.models.subreddit import Frontpage, Mod, All, Random, RandomSubscription
    # Translation is deferred (N_); must be done per-request,
    # not at import/class definition time.
    # TRANSLATORS: This refers to /r/mod
    name_overrides = {
        Mod: N_("mod"),
        # TRANSLATORS: This refers to the user's front page
        Frontpage: N_("front"),
        All: N_("all"),
        Random: N_("random"),
        # TRANSLATORS: Gold feature, "myrandom", a random subreddit from your subscriptions
        RandomSubscription: N_("myrandom")
    }

    def __init__(self, sr, **kw):
        self.path = sr.path
        name = self.name_overrides.get(sr)
        # Run the name through deferred translation
        name = _(name) if name else sr.name
        NavButton.__init__(self,
                           name,
                           sr.path,
                           False,
                           isselected=(c.site == sr),
                           **kw)

    def build(self, base_path=''):
        self.bare_path = ""

    def is_selected(self):
        return self.isselected

    def cachable_attrs(self):
        return [('path', self.path), ('title', self.title),
                ('isselected', self.isselected)]
Exemple #14
0
class AdminNotesSidebar(Templated):
    EMPTY_MESSAGE = {
        "domain": N_("No notes for this domain"),
        "ip": N_("No notes for this IP address"),
        "subreddit": N_("No notes for this subreddit"),
    }

    SYSTEMS = {
        "domain": N_("domain"),
        "ip": N_("IP address"),
        "subreddit": N_("subreddit"),
    }

    def __init__(self, system, subject):
        from r2.models.admin_notes import AdminNotesBySystem

        self.system = system
        self.subject = subject
        self.author = c.user.name
        self.notes = AdminNotesBySystem.in_display_order(system, subject)
        # Convert timestamps for easier reading/translation
        for note in self.notes:
            note["timesince"] = timesince(note["when"])
        Templated.__init__(self)
Exemple #15
0
class ProfileOverviewTimeMenu(TimeMenu):
    """Time Menu with the title changed for a user overview"""
    _title = N_("links and comments from")
Exemple #16
0
class CommentsTimeMenu(TimeMenu):
    """Time Menu with the title changed for comments"""
    _title = N_("comments from")
Exemple #17
0
    "scaley",
    "scalez",
    "skewx",
    "skewy",
    "steps",
    "translate",
    "translate3d",
    "translatex",
    "translatey",
    "translatez",
}
assert all(function == function.lower() for function in SAFE_FUNCTIONS)

ERROR_MESSAGES = {
    "IMAGE_NOT_FOUND":
    N_('no image found with name "%(name)s"'),
    "NON_PLACEHOLDER_URL":
    N_("only uploaded images are allowed; reference "
       "them with the %%%%imagename%%%% system"),
    "SYNTAX_ERROR":
    N_("syntax error: %(message)s"),
    "UNKNOWN_AT_RULE":
    N_("@%(keyword)s is not allowed"),
    "UNKNOWN_PROPERTY":
    N_('unknown property "%(name)s"'),
    "UNKNOWN_FUNCTION":
    N_('unknown function "%(function)s"'),
    "UNEXPECTED_TOKEN":
    N_('unexpected token "%(token)s"'),
    "BACKSLASH":
    N_("backslashes are not allowed"),
Exemple #18
0
class RemnantPriority(PriorityLevel):
    name = 'remnant'
    _text = N_('remnant')
    _description = N_('lower priority, impressions are not guaranteed')
    value = 20
    inventory_override = True
Exemple #19
0
class MediumPriority(PriorityLevel):
    name = 'standard'
    _text = N_('standard')
    value = 10
    default = True
Exemple #20
0
class HighPriority(PriorityLevel):
    name = 'high'
    _text = N_('highest')
    value = 5
Exemple #21
0
class AuctionPriority(PriorityLevel):
    name = 'auction'
    _text = N_('auction')
    _description = N_('auction priority; all self-serve are auction priority')
    inventory_override = True
Exemple #22
0
# All portions of the code written by reddit are Copyright (c) 2006-2015 reddit
# Inc. All Rights Reserved.
###############################################################################

from pylons import request
from pylons.i18n import _, N_

from r2.models import Account, Message
from r2.lib.db import queries
from r2.lib.utils import blockquote_text

user_added_messages = {
    "moderator": {
        "pm": {
            "subject":
            N_("you are a moderator"),
            "msg":
            N_("you have been added as a moderator to [%(title)s](%(url)s)."),
        },
    },
    "moderator_invite": {
        "pm": {
            "subject":
            N_("invitation to moderate %(url)s"),
            "msg":
            N_("**gadzooks! you are invited to become a moderator of [%(title)s](%(url)s)!**\n\n"
               "*to accept*, visit the [moderators page for %(url)s](%(url)s/about/moderators) and click \"accept\".\n\n"
               "*otherwise,* if you did not expect to receive this, you can simply ignore this invitation or report it."
               ),
        },
        "modmail": {
Exemple #23
0
class PromoteListingController(ListingController):
    where = 'promoted'
    render_cls = PromotePage
    titles = {
        'future_promos': N_('unapproved promoted links'),
        'pending_promos': N_('accepted promoted links'),
        'unpaid_promos': N_('unpaid promoted links'),
        'rejected_promos': N_('rejected promoted links'),
        'live_promos': N_('live promoted links'),
        'all': N_('all promoted links'),
    }
    base_path = '/promoted'

    def title(self):
        return _(self.titles[self.sort])

    @property
    def title_text(self):
        return _('promoted by you')

    @property
    def menus(self):
        filters = [
            NamedButton('all_promos',
                        dest='',
                        use_params=True,
                        aliases=['/sponsor']),
            NamedButton('future_promos', use_params=True),
            NamedButton('unpaid_promos', use_params=True),
            NamedButton('rejected_promos', use_params=True),
            NamedButton('pending_promos', use_params=True),
            NamedButton('live_promos', use_params=True),
        ]
        menus = [
            NavMenu(filters,
                    base_path=self.base_path,
                    title='show',
                    type='lightdrop')
        ]
        return menus

    def keep_fn(self):
        def keep(item):
            if self.sort == "future_promos":
                # this sort is used to review links that need to be approved
                # skip links that don't have any paid campaigns
                campaigns = list(PromoCampaign._by_link(item._id))
                if not any(
                        promote.authed_or_not_needed(camp)
                        for camp in campaigns):
                    return False

            if item.promoted and not item._deleted:
                return True
            else:
                return False

        return keep

    def query(self):
        if self.sort == "future_promos":
            return queries.get_unapproved_links(c.user._id)
        elif self.sort == "pending_promos":
            return queries.get_accepted_links(c.user._id)
        elif self.sort == "unpaid_promos":
            return queries.get_unpaid_links(c.user._id)
        elif self.sort == "rejected_promos":
            return queries.get_rejected_links(c.user._id)
        elif self.sort == "live_promos":
            return queries.get_live_links(c.user._id)
        elif self.sort == "all":
            return queries.get_promoted_links(c.user._id)

    @validate(VSponsor())
    def GET_listing(self, sort="all", **env):
        self.sort = sort
        return ListingController.GET_listing(self, **env)
Exemple #24
0
class PromoteListingController(ListingController):
    where = 'promoted'
    render_cls = PromotePage
    titles = {
        'future_promos': N_('unapproved promoted links'),
        'pending_promos': N_('accepted promoted links'),
        'unpaid_promos': N_('unpaid promoted links'),
        'rejected_promos': N_('rejected promoted links'),
        'live_promos': N_('live promoted links'),
        'underdelivered': N_('underdelivered promoted links'),
        'reported': N_('reported promoted links'),
        'house': N_('house promoted links'),
        'all': N_('all promoted links'),
    }

    def title(self):
        return _(self.titles[self.sort])

    @property
    def title_text(self):
        return _('promoted by you')

    @classmethod
    @memoize('live_by_subreddit', time=300)
    def _live_by_subreddit(cls, sr_names):
        promotuples = promote.get_live_promotions(sr_names)
        return [pt.link for pt in promotuples]

    def live_by_subreddit(cls, sr):
        return cls._live_by_subreddit([sr.name])

    @classmethod
    @memoize('house_link_names', time=60)
    def get_house_link_names(cls):
        now = promote.promo_datetime_now()
        pws = PromotionWeights.get_campaigns(now)
        campaign_ids = {pw.promo_idx for pw in pws}
        q = PromoCampaign._query(PromoCampaign.c._id.in_(campaign_ids),
                                 PromoCampaign.c.priority_name == 'house',
                                 data=True)
        link_names = {Link._fullname_from_id36(to36(camp.link_id))
                      for camp in q}
        return sorted(link_names, reverse=True)

    @property
    def menus(self):
        filters = [
            NamedButton('all_promos', dest=''),
            NamedButton('future_promos'),
            NamedButton('unpaid_promos'),
            NamedButton('rejected_promos'),
            NamedButton('pending_promos'),
            NamedButton('live_promos'),
        ]
        menus = [NavMenu(filters, base_path='/promoted', title='show',
                        type='lightdrop')]

        if self.sort == 'live_promos' and c.user_is_sponsor:
            srnames = promote.all_live_promo_srnames()
            buttons = [NavButton('all', '')]
            try:
                srnames.remove(Frontpage.name)
                frontbutton = NavButton('FRONTPAGE', Frontpage.name,
                                        aliases=['/promoted/live_promos/%s' %
                                                 urllib.quote(Frontpage.name)])
                buttons.append(frontbutton)
            except KeyError:
                pass

            srnames = sorted(srnames, key=lambda name: name.lower())
            buttons.extend([NavButton(name, name) for name in srnames])
            menus.append(NavMenu(buttons, base_path='/promoted/live_promos',
                                 title='subreddit', type='lightdrop'))

        return menus

    def keep_fn(self):
        def keep(item):
            if self.sort == "future_promos":
                # this sort is used to review links that need to be approved
                # skip links that don't have any paid campaigns
                campaigns = list(PromoCampaign._by_link(item._id))
                if not any(promote.authed_or_not_needed(camp)
                           for camp in campaigns):
                    return False

            if item.promoted and not item._deleted:
                return True
            else:
                return False
        return keep

    def query(self):
        if c.user_is_sponsor:
            if self.sort == "future_promos":
                return queries.get_all_unapproved_links()
            elif self.sort == "pending_promos":
                return queries.get_all_accepted_links()
            elif self.sort == "unpaid_promos":
                return queries.get_all_unpaid_links()
            elif self.sort == "rejected_promos":
                return queries.get_all_rejected_links()
            elif self.sort == "live_promos" and self.sr:
                return self.live_by_subreddit(self.sr)
            elif self.sort == 'live_promos':
                return queries.get_all_live_links()
            elif self.sort == 'underdelivered':
                q = queries.get_underdelivered_campaigns()
                campaigns = PromoCampaign._by_fullname(list(q), data=True,
                                                       return_dict=False)
                link_ids = [camp.link_id for camp in campaigns]
                return [Link._fullname_from_id36(to36(id)) for id in link_ids]
            elif self.sort == 'reported':
                return queries.get_reported_links(Subreddit.get_promote_srid())
            elif self.sort == 'house':
                return self.get_house_link_names()
            elif self.sort == 'all':
                return queries.get_all_promoted_links()
        else:
            if self.sort == "future_promos":
                return queries.get_unapproved_links(c.user._id)
            elif self.sort == "pending_promos":
                return queries.get_accepted_links(c.user._id)
            elif self.sort == "unpaid_promos":
                return queries.get_unpaid_links(c.user._id)
            elif self.sort == "rejected_promos":
                return queries.get_rejected_links(c.user._id)
            elif self.sort == "live_promos":
                return queries.get_live_links(c.user._id)
            elif self.sort == "all":
                return queries.get_promoted_links(c.user._id)

    @validate(VSponsor(),
              sr=nop('sr'))
    def GET_listing(self, sr=None, sort="all", **env):
        if (sort in ('underdelivered', 'reported', 'house') and
            not c.user_is_sponsor):
            self.abort403()

        self.sort = sort
        self.sr = None
        if sr and sr == Frontpage.name:
            self.sr = Frontpage
        elif sr:
            try:
                self.sr = Subreddit._by_name(sr)
            except NotFound:
                pass
        return ListingController.GET_listing(self, **env)
Exemple #25
0
class SortMenu(NavMenu):
    name = 'sort'
    hidden_options = []
    button_cls = QueryButton

    # these are _ prefixed to avoid colliding with NavMenu attributes
    _default = 'hot'
    _options = ('hot', 'new', 'top', 'old', 'controversial')
    _type = 'lightdrop'
    _title = N_("sorted by")

    def __init__(self,
                 default=None,
                 title='',
                 base_path='',
                 separator='|',
                 _id='',
                 css_class=''):
        options = self.make_buttons()
        default = default or self._default
        base_path = base_path or request.path
        NavMenu.__init__(self,
                         options,
                         default=default,
                         title=_(self._title),
                         type=self._type,
                         base_path=base_path,
                         separator=separator,
                         _id=_id,
                         css_class=css_class)

    def make_buttons(self):
        buttons = []
        for name in self._options:
            css_class = 'hidden' if name in self.hidden_options else ''
            button = self.button_cls(self.make_title(name),
                                     name,
                                     self.name,
                                     css_class=css_class)
            buttons.append(button)
        return buttons

    def make_title(self, attr):
        return menu[attr]

    @classmethod
    def operator(self, sort):
        if sort == 'hot':
            return operators.desc('_hot')
        elif sort == 'new':
            return operators.desc('_date')
        elif sort == 'old':
            return operators.asc('_date')
        elif sort == 'top':
            return operators.desc('_score')
        elif sort == 'controversial':
            return operators.desc('_controversy')
        elif sort == 'confidence':
            return operators.desc('_confidence')
        elif sort == 'random':
            return operators.shuffled('_confidence')
Exemple #26
0
 def __init__(self):
     config = {'name': N_('Thread import tool'), 'deps': ('adminpanel', )}
     BasePlugin.__init__(self, 'threadimport', config)
Exemple #27
0
class SponsorListingController(PromoteListingController):
    titles = dict(
        PromoteListingController.titles.items() + {
            'underdelivered': N_('underdelivered promoted links'),
            'reported': N_('reported promoted links'),
            'house': N_('house promoted links'),
        }.items())
    base_path = '/sponsor/promoted'

    @property
    def title_text(self):
        return _('promos on reddit')

    @property
    def menus(self):
        if self.sort in {'underdelivered', 'reported', 'house'}:
            menus = []
        else:
            menus = super(SponsorListingController, self).menus
            menus.append(
                NavMenu([
                    QueryButton("exclude managed",
                                dest=None,
                                query_param='include_managed'),
                    QueryButton("include managed",
                                dest="yes",
                                query_param='include_managed'),
                ],
                        base_path=request.path,
                        type='lightdrop'))

        if self.sort == 'live_promos':
            srnames = promote.all_live_promo_srnames()
            buttons = [NavButton('all', '', use_params=True)]
            try:
                srnames.remove(Frontpage.name)
                frontbutton = NavButton('FRONTPAGE',
                                        Frontpage.name,
                                        use_params=True,
                                        aliases=[
                                            '/promoted/live_promos/%s' %
                                            urllib.quote(Frontpage.name)
                                        ])
                buttons.append(frontbutton)
            except KeyError:
                pass

            srnames = sorted(srnames, key=lambda name: name.lower())
            buttons.extend(
                NavButton(name, name, use_params=True) for name in srnames)
            base_path = self.base_path + '/live_promos'
            menus.append(
                NavMenu(buttons,
                        base_path=base_path,
                        title='subreddit',
                        type='lightdrop'))
        return menus

    @classmethod
    @memoize('live_by_subreddit', time=300)
    def _live_by_subreddit(cls, sr_names):
        promotuples = promote.get_live_promotions(sr_names)
        return [pt.link for pt in promotuples]

    def live_by_subreddit(cls, sr):
        return cls._live_by_subreddit([sr.name])

    @classmethod
    @memoize('house_link_names', time=60)
    def get_house_link_names(cls):
        now = promote.promo_datetime_now()
        campaign_ids = PromotionWeights.get_campaign_ids(now)
        q = PromoCampaign._query(PromoCampaign.c._id.in_(campaign_ids),
                                 PromoCampaign.c.priority_name == 'house',
                                 data=True)
        link_names = {
            Link._fullname_from_id36(to36(camp.link_id))
            for camp in q
        }
        return sorted(link_names, reverse=True)

    def keep_fn(self):
        base_keep_fn = PromoteListingController.keep_fn(self)

        def keep(item):
            if not self.include_managed and item.managed_promo:
                return False
            return base_keep_fn(item)

        return keep

    def query(self):
        if self.sort == "future_promos":
            return queries.get_all_unapproved_links()
        elif self.sort == "pending_promos":
            return queries.get_all_accepted_links()
        elif self.sort == "unpaid_promos":
            return queries.get_all_unpaid_links()
        elif self.sort == "rejected_promos":
            return queries.get_all_rejected_links()
        elif self.sort == "live_promos" and self.sr:
            return self.live_by_subreddit(self.sr)
        elif self.sort == 'live_promos':
            return queries.get_all_live_links()
        elif self.sort == 'underdelivered':
            q = queries.get_underdelivered_campaigns()
            campaigns = PromoCampaign._by_fullname(list(q),
                                                   data=True,
                                                   return_dict=False)
            link_ids = [camp.link_id for camp in campaigns]
            return [Link._fullname_from_id36(to36(id)) for id in link_ids]
        elif self.sort == 'reported':
            return queries.get_reported_links(Subreddit.get_promote_srid())
        elif self.sort == 'house':
            return self.get_house_link_names()
        elif self.sort == 'all':
            return queries.get_all_promoted_links()

    @validate(
        VSponsorAdmin(),
        srname=nop('sr'),
        include_managed=VBoolean("include_managed"),
    )
    def GET_listing(self,
                    srname=None,
                    include_managed=False,
                    sort="all",
                    **kw):
        self.sort = sort
        self.sr = None
        self.include_managed = include_managed

        if srname:
            try:
                self.sr = Subreddit._by_name(srname)
            except NotFound:
                pass
        return ListingController.GET_listing(self, **kw)
Exemple #28
0
 def __init__(self):
     config = {'name': N_('Personal tags module'), 'deps': ('base_view', )}
     BasePlugin.__init__(self, 'usertags', config)
                filters.safemarkdown(thing.resources, nofollow=True) or "")
        elif attr == "websocket_url":
            if thing.state == "live":
                return websockets.make_url(
                    "/live/" + thing._id, max_age=24 * 60 * 60)
            else:
                return None
        else:
            return ThingJsonTemplate.thing_attr(self, thing, attr)

    def kind(self, wrapped):
        return "LiveUpdateEvent"


REPORT_TYPES = collections.OrderedDict((
    ("spam", N_("spam")),
    ("vote-manipulation", N_("vote manipulation")),
    ("personal-information", N_("personal information")),
    ("sexualizing-minors", N_("sexualizing minors")),
    ("site-breaking", N_("breaking reddit")),
))


class LiveUpdateEventApp(Templated):
    def __init__(self, event, listing, show_sidebar, report_type):
        self.event = event
        self.listing = listing
        if show_sidebar:
            self.discussions = LiveUpdateOtherDiscussions()
        self.show_sidebar = show_sidebar
Exemple #30
0
class HousePriority(PriorityLevel):
    name = 'house'
    _text = N_('house')
    _description = N_('non-CPM, displays in all unsold impressions')
    inventory_override = True