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
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)
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})