Ejemplo n.º 1
0
class JSONSnippet(SnippetBaseModel):
    name = models.CharField(max_length=255, unique=True)
    disabled = models.BooleanField(default=True)

    icon = models.TextField(help_text='Icon should be a 96x96px PNG.')
    text = models.CharField(max_length=140,
                            help_text='Maximum length 140 characters.')
    url = models.CharField(max_length=500)

    countries = models.ManyToManyField('TargetedCountry',
                                       blank=True,
                                       verbose_name='Targeted Countries')
    locales = models.ManyToManyField('TargetedLocale',
                                     blank=True,
                                     verbose_name='Targeted Locales')

    publish_start = models.DateTimeField(blank=True, null=True)
    publish_end = models.DateTimeField(blank=True, null=True)

    on_release = models.BooleanField(default=True, verbose_name='Release')
    on_beta = models.BooleanField(default=False, verbose_name='Beta')
    on_aurora = models.BooleanField(default=False, verbose_name='Aurora')
    on_nightly = models.BooleanField(default=False, verbose_name='Nightly')
    on_esr = models.BooleanField(default=False, verbose_name='Enterprise')

    on_startpage_1 = models.BooleanField(default=True,
                                         verbose_name='Version 1')

    weight = models.IntegerField(
        'Prevalence',
        choices=SNIPPET_WEIGHTS,
        default=100,
        help_text='How often should this snippet be shown to users?')

    client_match_rules = models.ManyToManyField(
        ClientMatchRule, blank=True, verbose_name='Client Match Rules')

    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

    objects = SnippetManager()

    class Meta:
        ordering = ('-modified', )
        verbose_name = 'JSON Snippet'

    def __unicode__(self):
        return self.name
Ejemplo n.º 2
0
class Snippet(SnippetBaseModel):
    name = models.CharField(max_length=255, unique=True)
    template = models.ForeignKey(SnippetTemplate)
    data = models.TextField(default='{}', validators=[validate_xml_variables])

    disabled = models.BooleanField(default=True)

    countries = models.ManyToManyField('TargetedCountry',
                                       blank=True,
                                       verbose_name='Targeted Countries')
    locales = models.ManyToManyField('TargetedLocale',
                                     blank=True,
                                     verbose_name='Targeted Locales')

    publish_start = models.DateTimeField(blank=True, null=True)
    publish_end = models.DateTimeField(blank=True, null=True)

    on_release = models.BooleanField(default=False, verbose_name='Release')
    on_beta = models.BooleanField(default=False, verbose_name='Beta')
    on_aurora = models.BooleanField(default=False, verbose_name='Aurora')
    on_nightly = models.BooleanField(default=False, verbose_name='Nightly')
    on_esr = models.BooleanField(default=False, verbose_name='Enterprise')

    on_startpage_1 = models.BooleanField(default=False,
                                         verbose_name='Version 1')
    on_startpage_2 = models.BooleanField(default=True,
                                         verbose_name='Version 2')
    on_startpage_3 = models.BooleanField(default=True,
                                         verbose_name='Version 3')
    on_startpage_4 = models.BooleanField(default=True,
                                         verbose_name='Version 4')
    on_startpage_5 = models.BooleanField(default=False,
                                         verbose_name='Activity Stream')

    weight = models.IntegerField(
        'Prevalence',
        choices=SNIPPET_WEIGHTS,
        default=100,
        help_text='How often should this snippet be shown to users?')

    client_match_rules = models.ManyToManyField(
        ClientMatchRule, blank=True, verbose_name='Client Match Rules')

    exclude_from_search_providers = models.ManyToManyField(
        'SearchProvider', blank=True, verbose_name='Excluded Search Providers')

    campaign = models.CharField(
        max_length=255,
        blank=True,
        default='',
        help_text=('Optional campaign name. Will be added in the stats ping. '
                   'Will be used for snippet blocking if set.'))
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

    client_options = django_mysql.models.DynamicField(
        default=None,
        spec={
            'version_lower_bound': unicode,
            'version_upper_bound': unicode,
            'has_fxaccount': unicode,
            'has_testpilot': unicode,
            'is_developer': unicode,
            'is_default_browser': unicode,
            'screen_resolutions': unicode,
            'profileage_lower_bound': int,
            'profileage_upper_bound': int,
            'sessionage_lower_bound': int,
            'sessionage_upper_bound': int,
        })

    objects = SnippetManager()

    class Meta:
        ordering = ('-modified', )

    def to_dict(self):
        data = {
            'id': self.id,
            'name': self.name,
            'code': self.render(),
            'countries': [],
            'campaign': self.campaign,
            'weight': self.weight,
            'exclude_from_search_engines': [],
            'client_options': self.client_options,
        }
        if self.id:
            data['countries'] = [
                country.code for country in self.countries.all()
            ]
            data['exclude_from_search_engines'] = [
                provider.identifier
                for provider in self.exclude_from_search_providers.all()
            ]

        return data

    def render(self):
        data = json.loads(self.data)
        snippet_id = self.id or 0
        data.setdefault('snippet_id', snippet_id)

        # Add snippet ID to template variables.
        for key, value in data.items():
            if isinstance(value, basestring):
                data[key] = value.replace(u'[[snippet_id]]',
                                          unicode(snippet_id))

        # Use a list for attrs to make the output order predictable.
        attrs = [('data-snippet-id', self.id), ('data-weight', self.weight),
                 ('data-campaign', self.campaign),
                 ('class', 'snippet-metadata')]

        if self.id:
            countries = ','.join(
                [country.code for country in self.countries.all()])
            if countries:
                attrs.append(('data-countries', countries))

            # Avoid using values_list() because django-cache-machine
            # does not support it.
            search_engine_identifiers = [
                provider.identifier
                for provider in self.exclude_from_search_providers.all()
            ]
            if search_engine_identifiers:
                attrs.append(('data-exclude-from-search-engines',
                              u','.join(search_engine_identifiers)))

        attr_string = u' '.join(u'{0}="{1}"'.format(key, value)
                                for key, value in attrs)

        rendered_snippet = u'<div {attrs}>{content}</div>'.format(
            attrs=attr_string, content=self.template.render(data))

        return Markup(rendered_snippet)

    @property
    def channels(self):
        channels = []
        for channel in CHANNELS:
            if getattr(self, 'on_{0}'.format(channel), False):
                channels.append(channel)
        return channels

    def get_preview_url(self):
        url = reverse('base.show_uuid', kwargs={'snippet_id': self.uuid})
        full_url = urljoin(settings.SITE_URL, url)
        return full_url

    def get_absolute_url(self):
        return reverse('base.show', kwargs={'snippet_id': self.id})

    def __unicode__(self):
        return self.name

    def save(self, *args, **kwargs):
        if self.client_options is None:
            self.client_options = {}
        return super(Snippet, self).save(*args, **kwargs)
Ejemplo n.º 3
0
class Snippet(CachingMixin, models.Model):
    name = models.CharField(max_length=255, unique=True)
    template = models.ForeignKey(SnippetTemplate)
    data = models.TextField(default='{}', validators=[validate_xml])

    priority = models.IntegerField(default=0, blank=True)
    disabled = models.BooleanField(default=True)

    country = CountryField('Geolocation Country', blank=True, default='')

    publish_start = models.DateTimeField(blank=True, null=True)
    publish_end = models.DateTimeField(blank=True, null=True)

    on_release = models.BooleanField(default=True, verbose_name='Release')
    on_beta = models.BooleanField(default=False, verbose_name='Beta')
    on_aurora = models.BooleanField(default=False, verbose_name='Aurora')
    on_nightly = models.BooleanField(default=False, verbose_name='Nightly')

    on_startpage_1 = models.BooleanField(default=False, verbose_name='Version 1')
    on_startpage_2 = models.BooleanField(default=True, verbose_name='Version 2')
    on_startpage_3 = models.BooleanField(default=True, verbose_name='Version 3')
    on_startpage_4 = models.BooleanField(default=True, verbose_name='Version 4')

    weight = models.IntegerField(
        'Prevalence', choices=SNIPPET_WEIGHTS, default=100,
        help_text='How often should this snippet be shown to users?')

    client_match_rules = models.ManyToManyField(
        ClientMatchRule, blank=True, verbose_name='Client Match Rules')

    exclude_from_search_providers = models.ManyToManyField(
        'SearchProvider', blank=True, verbose_name='Excluded Search Providers')

    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

    objects = models.Manager()
    cached_objects = SnippetManager()

    class Meta:
        ordering = ('-modified',)

    def render(self):
        data = json.loads(self.data)
        snippet_id = self.id or 0
        data.setdefault('snippet_id', snippet_id)

        # Add snippet ID to template variables.
        for key, value in data.items():
            if isinstance(value, basestring):
                data[key] = value.replace(u'<snippet_id>', unicode(snippet_id))

        # Use a list for attrs to make the output order predictable.
        attrs = [('data-snippet-id', self.id),
                 ('data-weight', self.weight),
                 ('class', 'snippet-metadata')]
        if self.country:
            attrs.append(('data-country', self.country))

        if self.id:
            # Avoid using values_list() because django-cache-machine
            # does not support it.
            search_engine_identifiers = [
                provider.identifier for provider in self.exclude_from_search_providers.all()
            ]
            if search_engine_identifiers:
                attrs.append(('data-exclude-from-search-engines', ','.join(search_engine_identifiers)))

        attr_string = ' '.join('{0}="{1}"'.format(key, value) for key, value in
                               attrs)

        rendered_snippet = u'<div {attrs}>{content}</div>'.format(
            attrs=attr_string,
            content=self.template.render(data)
        )

        return Markup(rendered_snippet)

    @property
    def channels(self):
        channels = []
        for channel in CHANNELS:
            if getattr(self, 'on_{0}'.format(channel), False):
                channels.append(channel)
        return channels

    def __unicode__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('base.show', kwargs={'snippet_id': self.id})