Skip to content

Commit

Permalink
Merge pull request #110 from glogiotatidis/jsonmastercountries
Browse files Browse the repository at this point in the history
[fix bug 1155574] Add ability to select multiple countries in a single JSON snippet.
  • Loading branch information
pmac committed May 6, 2015
2 parents 1b846c7 + 183a63f commit 6a8b352
Show file tree
Hide file tree
Showing 10 changed files with 439 additions and 19 deletions.
3 changes: 2 additions & 1 deletion snippets/base/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,7 @@ def save_related(self, request, form, formsets, change):
class JSONSnippetAdmin(BaseSnippetAdmin):
form = forms.JSONSnippetAdminForm
search_fields = ('name', 'client_match_rules__description')
filter_horizontal = ('client_match_rules', 'countries')

fieldsets = (
(None, {'fields': ('name', 'priority', 'disabled',
Expand All @@ -292,7 +293,7 @@ class JSONSnippetAdmin(BaseSnippetAdmin):
('Country and Locale', {
'description': ('What country and locales will this snippet be '
'available in?'),
'fields': (('country', 'locales'))
'fields': (('countries', 'locales'))
}),
('Client Match Rules', {
'fields': ('client_match_rules',),
Expand Down
14 changes: 8 additions & 6 deletions snippets/base/encoders.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,10 @@ def default(self, obj):
'url': obj.url,
'weight': obj.weight,
}
if obj.country:
data['target_geo'] = obj.country.upper()
countries = [country.code.upper() for country in obj.countries.all()]
if countries:
data['target_geo'] = countries[0]
data['countries'] = countries
return data
return super(JSONSnippetEncoder, self).default(obj)

Expand All @@ -34,8 +36,8 @@ def default(self, obj):
'on_beta': obj.on_beta,
'on_aurora': obj.on_aurora,
'on_nightly': obj.on_nightly,
'locales': list(obj.locale_set.values_list('locale', flat=True)),
'countries': [obj.country],
'locales': [locale.locale for locale in obj.locale_set.all()],
'countries': [country.code for country in obj.countries.all()],
'weight': obj.weight,
}
return data
Expand All @@ -51,8 +53,8 @@ def default(self, obj):
'on_beta': obj.on_beta,
'on_aurora': obj.on_aurora,
'on_nightly': obj.on_nightly,
'locales': list(obj.locale_set.values_list('locale', flat=True)),
'countries': list(obj.countries.values_list('code', flat=True)),
'locales': [locale.locale for locale in obj.locale_set.all()],
'countries': [country.code for country in obj.countries.all()],
'weight': obj.weight,
}
return data
Expand Down
2 changes: 1 addition & 1 deletion snippets/base/migrations/0014_populate_countries.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
from south.v2 import DataMigration
from django.db import models


from snippets.base import ENGLISH_COUNTRY_CHOICES


class Migration(DataMigration):

def forwards(self, orm):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,4 +132,4 @@ def backwards(self, orm):
}
}

complete_apps = ['base']
complete_apps = ['base']
141 changes: 141 additions & 0 deletions snippets/base/migrations/0018_auto.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
# -*- coding: utf-8 -*-
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models


class Migration(SchemaMigration):

def forwards(self, orm):
# Adding M2M table for field countries on 'JSONSnippet'
db.create_table(u'base_jsonsnippet_countries', (
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
('jsonsnippet', models.ForeignKey(orm[u'base.jsonsnippet'], null=False)),
('targetedcountry', models.ForeignKey(orm[u'base.targetedcountry'], null=False))
))
db.create_unique(u'base_jsonsnippet_countries', ['jsonsnippet_id', 'targetedcountry_id'])


def backwards(self, orm):
# Removing M2M table for field countries on 'JSONSnippet'
db.delete_table('base_jsonsnippet_countries')


models = {
u'base.clientmatchrule': {
'Meta': {'ordering': "('-modified',)", 'object_name': 'ClientMatchRule'},
'appbuildid': ('snippets.base.fields.RegexField', [], {'max_length': '255', 'blank': 'True'}),
'build_target': ('snippets.base.fields.RegexField', [], {'max_length': '255', 'blank': 'True'}),
'channel': ('snippets.base.fields.RegexField', [], {'max_length': '255', 'blank': 'True'}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'description': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
'distribution': ('snippets.base.fields.RegexField', [], {'max_length': '255', 'blank': 'True'}),
'distribution_version': ('snippets.base.fields.RegexField', [], {'max_length': '255', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_exclusion': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'locale': ('snippets.base.fields.RegexField', [], {'max_length': '255', 'blank': 'True'}),
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'name': ('snippets.base.fields.RegexField', [], {'max_length': '255', 'blank': 'True'}),
'os_version': ('snippets.base.fields.RegexField', [], {'max_length': '255', 'blank': 'True'}),
'startpage_version': ('snippets.base.fields.RegexField', [], {'max_length': '255', 'blank': 'True'}),
'version': ('snippets.base.fields.RegexField', [], {'max_length': '255', 'blank': 'True'})
},
u'base.jsonsnippet': {
'Meta': {'ordering': "('-modified',)", 'object_name': 'JSONSnippet'},
'client_match_rules': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['base.ClientMatchRule']", 'symmetrical': 'False', 'blank': 'True'}),
'countries': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['base.TargetedCountry']", 'symmetrical': 'False', 'blank': 'True'}),
'country': ('snippets.base.fields.CountryField', [], {'default': "''", 'max_length': '16', 'blank': 'True'}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'disabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'icon': ('django.db.models.fields.TextField', [], {}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
'on_aurora': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'on_beta': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'on_nightly': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'on_release': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'on_startpage_1': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'priority': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}),
'publish_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'publish_start': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'text': ('django.db.models.fields.CharField', [], {'max_length': '140'}),
'url': ('django.db.models.fields.CharField', [], {'max_length': '500'}),
'weight': ('django.db.models.fields.IntegerField', [], {'default': '100'})
},
u'base.jsonsnippetlocale': {
'Meta': {'object_name': 'JSONSnippetLocale'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'locale': ('snippets.base.fields.LocaleField', [], {'default': "'en-US'", 'max_length': '32'}),
'snippet': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'locale_set'", 'to': u"orm['base.JSONSnippet']"})
},
u'base.searchprovider': {
'Meta': {'ordering': "('id',)", 'object_name': 'SearchProvider'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'identifier': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
},
u'base.snippet': {
'Meta': {'ordering': "('-modified',)", 'object_name': 'Snippet'},
'client_match_rules': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['base.ClientMatchRule']", 'symmetrical': 'False', 'blank': 'True'}),
'countries': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['base.TargetedCountry']", 'symmetrical': 'False', 'blank': 'True'}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'data': ('django.db.models.fields.TextField', [], {'default': "'{}'"}),
'disabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'exclude_from_search_providers': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['base.SearchProvider']", 'symmetrical': 'False', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
'on_aurora': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'on_beta': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'on_nightly': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'on_release': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'on_startpage_1': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'on_startpage_2': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'on_startpage_3': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'on_startpage_4': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'priority': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}),
'publish_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'publish_start': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'template': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['base.SnippetTemplate']"}),
'weight': ('django.db.models.fields.IntegerField', [], {'default': '100'})
},
u'base.snippetlocale': {
'Meta': {'object_name': 'SnippetLocale'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'locale': ('snippets.base.fields.LocaleField', [], {'default': "'en-US'", 'max_length': '32'}),
'snippet': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'locale_set'", 'to': u"orm['base.Snippet']"})
},
u'base.snippettemplate': {
'Meta': {'object_name': 'SnippetTemplate'},
'code': ('django.db.models.fields.TextField', [], {}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
},
u'base.snippettemplatevariable': {
'Meta': {'object_name': 'SnippetTemplateVariable'},
'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'template': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'variable_set'", 'to': u"orm['base.SnippetTemplate']"}),
'type': ('django.db.models.fields.IntegerField', [], {'default': '0'})
},
u'base.targetedcountry': {
'Meta': {'ordering': "('id',)", 'object_name': 'TargetedCountry'},
'code': ('snippets.base.fields.CountryField', [], {'default': "u'us'", 'unique': 'True', 'max_length': '16'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
},
u'base.uploadedfile': {
'Meta': {'object_name': 'UploadedFile'},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
}
}

complete_apps = ['base']

0 comments on commit 6a8b352

Please sign in to comment.