def fake_version_object(self, obj, data): if data: version = Version( addon=obj, id=data['id'], reviewed=self.handle_date(data['reviewed']), version=data['version']) version.all_files = [ File( id=file_['id'], created=self.handle_date(file_['created']), hash=file_['hash'], filename=file_['filename'], platform=file_['platform'], size=file_['size'], status=file_['status'], version=version) for file_ in data.get('files', []) ] # In ES we store integers for the appversion info, we need to # convert it back to strings. compatible_apps = {} for app_id, compat_dict in data.get('compatible_apps', {}).items(): app_name = APPS_ALL[int(app_id)] compatible_apps[app_name] = ApplicationsVersions( min=AppVersion(version=compat_dict.get('min_human', '')), max=AppVersion(version=compat_dict.get('max_human', ''))) version.compatible_apps = compatible_apps else: version = None return version
def test_add_not(self): for id in [18, 52, 59, 60, 61]: av = AppVersion(application=id, version='1') av.save() ApplicationsVersions(application=id, min=av, max=av, version=self.version).save() res = self.client.get(self.url) doc = pq(res.content) assert not res.context['compat_form'].extra_forms assert doc('p.add-app')[0].attrib['class'] == 'add-app hide'
def fake_object(self, data): """Create a fake instance of Addon and related models from ES data.""" obj = Addon(id=data['id'], slug=data['slug'], is_listed=True) data_version = data.get('current_version') if data_version: obj._current_version = Version(addon=obj, id=data_version['id'], reviewed=self.handle_date( data_version['reviewed']), version=data_version['version']) data_files = data_version.get('files', []) obj._current_version.all_files = [ File(id=file_['id'], created=self.handle_date(file_['created']), hash=file_['hash'], filename=file_['filename'], platform=file_['platform'], size=file_['size'], status=file_['status'], version=obj._current_version) for file_ in data_files ] # In ES we store integers for the appversion info, we need to # convert it back to strings. compatible_apps = {} for app_id, compat_dict in data['appversion'].items(): app_name = APPS_ALL[int(app_id)] compatible_apps[app_name] = ApplicationsVersions( min=AppVersion(version=compat_dict.get('min_human', '')), max=AppVersion(version=compat_dict.get('max_human', ''))) obj._current_version.compatible_apps = compatible_apps # Attach base attributes that have the same name/format in ES and in # the model. self._attach_fields( obj, data, ('average_daily_users', 'bayesian_rating', 'created', 'default_locale', 'guid', 'hotness', 'is_listed', 'last_updated', 'public_stats', 'slug', 'status', 'type', 'weekly_downloads')) # Attach attributes that do not have the same name/format in ES. obj.tag_list = data['tags'] obj.disabled_by_user = data['is_disabled'] # Not accurate, but enough. # Attach translations (they require special treatment). self._attach_translations(obj, data, self.translated_fields) return obj
def fake_version_object(self, obj, data, channel): if data: version = Version( addon=obj, id=data['id'], reviewed=self.handle_date(data['reviewed']), version=data['version'], channel=channel, ) version.all_files = [ self.fake_file_object(version, file_data) for file_data in data.get('files', []) ] # In ES we store integers for the appversion info, we need to # convert it back to strings. compatible_apps = {} for app_id, compat_dict in data.get('compatible_apps', {}).items(): app_name = APPS_ALL[int(app_id)] compatible_apps[app_name] = ApplicationsVersions( min=AppVersion(version=compat_dict.get('min_human', '')), max=AppVersion(version=compat_dict.get('max_human', '')), ) version._compatible_apps = compatible_apps version_serializer = self.fields.get('current_version') or None if version_serializer: version_serializer._attach_translations( version, data, version_serializer.translated_fields ) if 'license' in data and version_serializer: license_serializer = version_serializer.fields['license'] version.license = License(id=data['license']['id']) license_serializer._attach_fields( version.license, data['license'], ('builtin', 'url') ) # Can't use license_serializer._attach_translations() directly # because 'name' is a SerializerMethodField, not an # ESTranslatedField. license_serializer.db_name.attach_translations( version.license, data['license'], 'name' ) else: version.license = None else: version = None return version
def setUp(self): super(TestFileFromUpload, self).setUp() for version in ('3.0', '3.6', '3.6.*', '4.0b6'): AppVersion(application=amo.FIREFOX.id, version=version).save() self.platform = amo.PLATFORM_MAC.id self.addon = Addon.objects.create(guid='guid@jetpack', type=amo.ADDON_EXTENSION, name='xxx') self.version = Version.objects.create(addon=self.addon)
def setUp(self): super(TestWebextExtractPermissions, self).setUp() for version in ('3.0', '3.6', '3.6.*', '4.0b6'): AppVersion(application=amo.FIREFOX.id, version=version).save() self.platform = amo.PLATFORM_ALL.id self.addon = Addon.objects.create(guid='guid@jetpack', type=amo.ADDON_EXTENSION, name='xxx') self.version = Version.objects.create(addon=self.addon) UserProfile.objects.create(pk=settings.TASK_USER_ID)
def setUp(self): super(TestFileFromUpload, self).setUp() appver = {amo.FIREFOX: ['3.0', '3.6', '3.6.*', '4.0b6'], amo.MOBILE: ['0.1', '2.0a1pre']} for app, versions in appver.items(): for version in versions: AppVersion(application=app.id, version=version).save() self.platform = amo.PLATFORM_MAC.id self.addon = Addon.objects.create(guid='guid@jetpack', type=amo.ADDON_EXTENSION, name='xxx') self.version = Version.objects.create(addon=self.addon)
def test_major_minor(self): """Check that major/minor/alpha is getting set.""" v = AppVersion(version='3.0.12b2') assert v.major == 3 assert v.minor1 == 0 assert v.minor2 == 12 assert v.minor3 is None assert v.alpha == 'b' assert v.alpha_ver == 2 v = AppVersion(version='3.6.1apre2+') assert v.major == 3 assert v.minor1 == 6 assert v.minor2 == 1 assert v.alpha == 'a' assert v.pre == 'pre' assert v.pre_ver == 2 v = AppVersion(version='') assert v.major is None assert v.minor1 is None assert v.minor2 is None assert v.minor3 is None
def fake_version_object(self, obj, data, channel): if data: version = Version( addon=obj, id=data['id'], reviewed=self.handle_date(data['reviewed']), version=data['version'], channel=channel) version.all_files = [ self.fake_file_object(version, file_data) for file_data in data.get('files', []) ] # In ES we store integers for the appversion info, we need to # convert it back to strings. compatible_apps = {} for app_id, compat_dict in data.get('compatible_apps', {}).items(): app_name = APPS_ALL[int(app_id)] compatible_apps[app_name] = ApplicationsVersions( min=AppVersion(version=compat_dict.get('min_human', '')), max=AppVersion(version=compat_dict.get('max_human', ''))) version._compatible_apps = compatible_apps else: version = None return version
def test_major_minor(self): """Check that major/minor/alpha is getting set.""" v = AppVersion(version='3.0.12b2') eq_(v.major, 3) eq_(v.minor1, 0) eq_(v.minor2, 12) eq_(v.minor3, None) eq_(v.alpha, 'b') eq_(v.alpha_ver, 2) v = AppVersion(version='3.6.1apre2+') eq_(v.major, 3) eq_(v.minor1, 6) eq_(v.minor2, 1) eq_(v.alpha, 'a') eq_(v.pre, 'pre') eq_(v.pre_ver, 2) v = AppVersion(version='') eq_(v.major, None) eq_(v.minor1, None) eq_(v.minor2, None) eq_(v.minor3, None)
def fake_object(self, data): """Create a fake instance of Addon and related models from ES data.""" obj = Addon(id=data['id'], slug=data['slug'], is_listed=True) # Attach base attributes that have the same name/format in ES and in # the model. self._attach_fields( obj, data, ('average_daily_users', 'bayesian_rating', 'created', 'default_locale', 'guid', 'hotness', 'icon_type', 'is_listed', 'last_updated', 'modified', 'public_stats', 'slug', 'status', 'type', 'weekly_downloads')) # Temporary hack to make sure all add-ons have a modified date when # serializing, to avoid errors when calling get_icon_url(). # Remove once all add-ons have been reindexed at least once since the # addition of `modified` in the mapping. if obj.modified is None: obj.modified = obj.created # Attach attributes that do not have the same name/format in ES. obj.tag_list = data['tags'] obj.disabled_by_user = data['is_disabled'] # Not accurate, but enough. # Categories are annoying, skip them for now. We probably need to start # declaring them in the code to properly handle translations etc if we # want to display them in search results. obj.all_categories = [] # Attach translations (they require special treatment). self._attach_translations(obj, data, self.translated_fields) # Attach related models (also faking them). data_version = data.get('current_version') if data_version: obj._current_version = Version(addon=obj, id=data_version['id'], reviewed=self.handle_date( data_version['reviewed']), version=data_version['version']) data_files = data_version.get('files', []) obj._current_version.all_files = [ File(id=file_['id'], created=self.handle_date(file_['created']), hash=file_['hash'], filename=file_['filename'], platform=file_['platform'], size=file_['size'], status=file_['status'], version=obj._current_version) for file_ in data_files ] # In ES we store integers for the appversion info, we need to # convert it back to strings. compatible_apps = {} for app_id, compat_dict in data['appversion'].items(): app_name = APPS_ALL[int(app_id)] compatible_apps[app_name] = ApplicationsVersions( min=AppVersion(version=compat_dict.get('min_human', '')), max=AppVersion(version=compat_dict.get('max_human', ''))) obj._current_version.compatible_apps = compatible_apps if data['type'] == amo.ADDON_PERSONA: persona_data = data.get('persona') if persona_data: obj.persona = Persona( addon=obj, accentcolor=persona_data['accentcolor'], display_username=persona_data['author'], header=persona_data['header'], footer=persona_data['footer'], persona_id=1 if persona_data['is_new'] else None, textcolor=persona_data['textcolor']) else: # Sadly, https://code.djangoproject.com/ticket/14368 prevents # us from setting obj.persona = None. This is fixed in # Django 1.9, but in the meantime, work around it by creating # a Persona instance with a custom attribute indicating that # it should not be used. obj.persona = Persona() obj.persona._broken = True return obj