def addon_factory(status=amo.STATUS_PUBLIC, version_kw=None, file_kw=None, **kw): version_kw = version_kw or {} # Disconnect signals until the last save. post_save.disconnect(addon_update_search_index, sender=Addon, dispatch_uid='addons.search.index') type_ = kw.pop('type', amo.ADDON_EXTENSION) popularity = kw.pop('popularity', None) persona_id = kw.pop('persona_id', None) tags = kw.pop('tags', []) users = kw.pop('users', []) when = _get_created(kw.pop('created', None)) category = kw.pop('category', None) default_locale = kw.get('default_locale', settings.LANGUAGE_CODE) # Keep as much unique data as possible in the uuid: '-' aren't important. name = kw.pop('name', u'Addôn %s' % six.text_type(uuid.uuid4()).replace('-', '')) slug = kw.pop('slug', None) if slug is None: slug = name.replace(' ', '-').lower()[:30] kwargs = { # Set artificially the status to STATUS_PUBLIC for now, the real # status will be set a few lines below, after the update_version() # call. This prevents issues when calling addon_factory with # STATUS_DELETED. 'status': amo.STATUS_PUBLIC, 'default_locale': default_locale, 'name': name, 'slug': slug, 'average_daily_users': popularity or random.randint(200, 2000), 'weekly_downloads': popularity or random.randint(200, 2000), 'created': when, 'last_updated': when, } if type_ != amo.ADDON_PERSONA and 'summary' not in kw: # Assign a dummy summary if none was specified in keyword args, unless # we're creating a Persona since they don't have summaries. kwargs['summary'] = u'Summary for %s' % name if type_ not in [amo.ADDON_PERSONA, amo.ADDON_SEARCH]: # Personas and search engines don't need guids kwargs['guid'] = kw.pop('guid', '{%s}' % six.text_type(uuid.uuid4())) kwargs.update(kw) # Save 1. with translation.override(default_locale): addon = Addon.objects.create(type=type_, **kwargs) # Save 2. version = version_factory(file_kw, addon=addon, **version_kw) if addon.type == amo.ADDON_PERSONA: addon._current_version = version persona_id = persona_id if persona_id is not None else addon.id # Save 3. Persona.objects.create(addon=addon, popularity=addon.average_daily_users, persona_id=persona_id) addon.update_version() addon.status = status for tag in tags: Tag(tag_text=tag).save_tag(addon) for user in users: addon.addonuser_set.create(user=user) application = version_kw.get('application', amo.FIREFOX.id) if not category: static_category = random.choice( list(CATEGORIES[application][addon.type].values())) category = Category.from_static_category(static_category, True) AddonCategory.objects.create(addon=addon, category=category) # Put signals back. post_save.connect(addon_update_search_index, sender=Addon, dispatch_uid='addons.search.index') # Save 4. addon.save() if addon.type == amo.ADDON_PERSONA: # Personas only have one version and signals.version_changed is never # fired for them - instead it gets updated through a cron (!). We do # need to get it right in some tests like the ui tests, so we call the # task ourselves. version_changed(addon.pk) # Potentially update is_public on authors [user.update_is_public() for user in users] if 'nomination' in version_kw: # If a nomination date was set on the version, then it might have been # erased at post_save by addons.models.watch_status() version.save() return addon
def addon_factory( status=amo.STATUS_PUBLIC, version_kw=None, file_kw=None, **kw): version_kw = version_kw or {} # Disconnect signals until the last save. post_save.disconnect(addon_update_search_index, sender=Addon, dispatch_uid='addons.search.index') type_ = kw.pop('type', amo.ADDON_EXTENSION) popularity = kw.pop('popularity', None) persona_id = kw.pop('persona_id', None) tags = kw.pop('tags', []) users = kw.pop('users', []) when = _get_created(kw.pop('created', None)) category = kw.pop('category', None) default_locale = kw.get('default_locale', settings.LANGUAGE_CODE) # Keep as much unique data as possible in the uuid: '-' aren't important. name = kw.pop('name', u'Addôn %s' % unicode(uuid.uuid4()).replace('-', '')) slug = kw.pop('slug', None) if slug is None: slug = name.replace(' ', '-').lower()[:30] kwargs = { # Set artificially the status to STATUS_PUBLIC for now, the real # status will be set a few lines below, after the update_version() # call. This prevents issues when calling addon_factory with # STATUS_DELETED. 'status': amo.STATUS_PUBLIC, 'default_locale': default_locale, 'name': name, 'slug': slug, 'average_daily_users': popularity or random.randint(200, 2000), 'weekly_downloads': popularity or random.randint(200, 2000), 'created': when, 'last_updated': when, } if type_ != amo.ADDON_PERSONA: # Personas don't have a summary. kwargs['summary'] = u'Summary for %s' % name if type_ not in [amo.ADDON_PERSONA, amo.ADDON_SEARCH]: # Personas and search engines don't need guids kwargs['guid'] = kw.pop('guid', '{%s}' % unicode(uuid.uuid4())) kwargs.update(kw) # Save 1. with translation.override(default_locale): addon = Addon.objects.create(type=type_, **kwargs) # Save 2. version = version_factory(file_kw, addon=addon, **version_kw) if addon.type == amo.ADDON_PERSONA: addon._current_version = version persona_id = persona_id if persona_id is not None else addon.id # Save 3. Persona.objects.create( addon=addon, popularity=addon.average_daily_users, persona_id=persona_id) addon.update_version() addon.status = status for tag in tags: Tag(tag_text=tag).save_tag(addon) for user in users: addon.addonuser_set.create(user=user) application = version_kw.get('application', amo.FIREFOX.id) if not category: static_category = random.choice( CATEGORIES[application][addon.type].values()) category = Category.from_static_category(static_category, True) AddonCategory.objects.create(addon=addon, category=category) # Put signals back. post_save.connect(addon_update_search_index, sender=Addon, dispatch_uid='addons.search.index') # Save 4. addon.save() if addon.type == amo.ADDON_PERSONA: # Personas only have one version and signals.version_changed is never # fired for them - instead it gets updated through a cron (!). We do # need to get it right in some tests like the ui tests, so we call the # task ourselves. version_changed(addon.pk) # Potentially update is_public on authors [user.update_is_public() for user in users] if 'nomination' in version_kw: # If a nomination date was set on the version, then it might have been # erased at post_save by addons.models.watch_status() version.save() return addon