# users.UserProfile ## Model Info | Key | Value | |---|-----| | Model Name | UserProfile | | Verbose Name | user profile | | Verbose Name Plural | user profiles | | Docstring | <p>UserProfile(id, created, modified, password, last\_login, username, display\_name, email, averagerating, biography, deleted, display\_collections, homepage, location, notes, occupation, picture\_type, read\_dev\_agreement, last\_login\_ip, email\_changed, banned, has\_full\_profile, fxa\_id, auth\_id, basket\_token, bypass\_upload\_restrictions)</p> | | Is Abstract | False | | Is Proxy | False | | Is Managed | True | | Ordering | [] | | Permissions | [] | | Default Permissions | ('add', 'change', 'delete', 'view') | | Indexes | [<Index: fields=['created'] name='created'>, <Index: fields=['fxa_id'] name='users_fxa_id_index'>, <LongNameIndex: fields=['last_login_ip'] name='users_last_login_ip_2cfbbfbd'>] | | Constraints | [] | | Database Table | users | | Base Manager | None | | Default Manager | None | | File | /data/olympia/src/olympia/users/models.py | | Starting Line Number | 288 | | Method Resolution Order | (<class 'olympia.users.models.UserProfile'>, <class 'olympia.amo.models.OnChangeMixin'>, <class 'olympia.amo.models.ModelBase'>, <class 'olympia.amo.models.SaveUpdateMixin'>, <class 'django.contrib.auth.base_user.AbstractBaseUser'>, <class 'django.db.models.base.Model'>, <class 'django.db.models.utils.AltersData'>, <class 'object'>) | ## Fields | Field Name | Field Type | Database Column | Database Type | Verbose Name | |----------|----------|---------------|-------------|------------| | `+` | ManyToOneRel | | integer | | | `Flag_users+` | ManyToOneRel | | integer | | | `_ratings_all` | ManyToOneRel | | integer | | | `abuse_reported` | ManyToOneRel | | integer | | | `abuse_reports` | ManyToOneRel | | integer | | | `activity_log_tokens` | ManyToOneRel | | integer | | | `activitylog` | ManyToOneRel | | integer | | | `addons` | ManyToManyRel | | through addons.AddonUser | | | `addonuser` | ManyToOneRel | | integer | | | `addonuserpendingconfirmation` | ManyToOneRel | | integer | | | `api_keys` | ManyToOneRel | | integer | | | `apikeyconfirmation` | OneToOneRel | | integer | | | `auth_id` | PositiveIntegerField | auth_id | integer UNSIGNED | auth id | | `averagerating` | FloatField | averagerating | double precision | averagerating | | `banned` | DateTimeField | banned | datetime(6) | banned | | `basket_token` | CharField | basket_token | varchar(128) | basket token | | `biography` | CharField | biography | varchar(255) | biography | | `block` | ManyToOneRel | | integer | | | `blocklistsubmission` | ManyToOneRel | | integer | | | `bypass_upload_restrictions` | BooleanField | bypass_upload_restrictions | bool | bypass upload restrictions | | `collectionaddon` | ManyToOneRel | | integer | | | `collections` | ManyToOneRel | | integer | | | `content_disabled_on_ban` | OneToOneRel | | integer | | | `created` | DateTimeField | created | datetime(6) | created | | `decisions_made_by` | ManyToOneRel | | integer | | | `decisions_on` | ManyToOneRel | | integer | | | `deleted` | BooleanField | deleted | bool | deleted | | `display_collections` | BooleanField | display_collections | bool | display collections | | `display_name` | CharField | display_name | varchar(50) | display name | | `draftcomment` | ManyToOneRel | | integer | | | `email` | EmailField | email | varchar(75) | email | | `email_changed` | DateTimeField | email_changed | datetime(6) | email changed | | `fileupload` | ManyToOneRel | | integer | | | `flag` | ManyToManyRel | | through waffle.Flag_users | | | `fxa_id` | CharField | fxa_id | varchar(128) | fxa id | | `groups` | ManyToManyRel | | through access.GroupUser | | | `groupuser` | ManyToOneRel | | integer | | | `has_full_profile` | BooleanField | public | bool | has full profile | | `history` | ManyToOneRel | | integer | | | `homepage` | URLField | homepage | varchar(255) | homepage | | `id (pk)` | AutoField | id | integer AUTO_INCREMENT | ID | | `last_login` | DateTimeField | last_login | datetime(6) | last login | | `last_login_ip` | CharField | last_login_ip | varchar(45) | last login ip | | `location` | CharField | location | varchar(255) | location | | `logentry` | ManyToOneRel | | integer | | | `modified` | DateTimeField | modified | datetime(6) | modified | | `notes` | TextField | notes | longtext | notes | | `notifications` | ManyToOneRel | | integer | | | `occupation` | CharField | occupation | varchar(255) | occupation | | `password` | CharField | password | varchar(128) | password | | `picture_type` | CharField | picture_type | varchar(75) | picture type | | `ratingflag` | ManyToOneRel | | integer | | | `read_dev_agreement` | DateTimeField | read_dev_agreement | datetime(6) | read dev agreement | | `restriction_history` | ManyToOneRel | | integer | | | `reviewersubscription` | ManyToOneRel | | integer | | | `rsskey` | ManyToOneRel | | integer | | | `surveyresponse` | ManyToOneRel | | integer | | | `username` | CharField | username | varchar(255) | username | | `versionreviewerflags` | ManyToOneRel | | integer | | fields_reverse_relation=[FieldReverseRelation(name='abuse_reported', field_type='ManyToOneRel', field_db_type='integer', related_model='abuse.AbuseReport', field_name_on_related_model='reporter', field_type_on_related_model='ForeignKey'), FieldReverseRelation(name='abuse_reports', field_type='ManyToOneRel', field_db_type='integer', related_model='abuse.AbuseReport', field_name_on_related_model='user', field_type_on_related_model='ForeignKey'), FieldReverseRelation(name='decisions_made_by', field_type='ManyToOneRel', field_db_type='integer', related_model='abuse.ContentDecision', field_name_on_related_model='reviewer_user', field_type_on_related_model='ForeignKey'), FieldReverseRelation(name='decisions_on', field_type='ManyToOneRel', field_db_type='integer', related_model='abuse.ContentDecision', field_name_on_related_model='user', field_type_on_related_model='ForeignKey'), FieldReverseRelation(name='groups', field_type='ManyToManyRel', field_db_type='through access.GroupUser', related_model='access.Group', field_name_on_related_model='users', field_type_on_related_model='ManyToManyField'), FieldReverseRelation(name='userprofile_set', field_type='ManyToOneRel', field_db_type='integer', related_model='access.GroupUser', field_name_on_related_model='user', field_type_on_related_model='ForeignKey'), FieldReverseRelation(name='activity_log_tokens', field_type='ManyToOneRel', field_db_type='integer', related_model='activity.ActivityLogToken', field_name_on_related_model='user', field_type_on_related_model='ForeignKey'), FieldReverseRelation(name='userprofile_set', field_type='ManyToOneRel', field_db_type='integer', related_model='activity.DraftComment', field_name_on_related_model='user', field_type_on_related_model='ForeignKey'), FieldReverseRelation(name='userprofile_set', field_type='ManyToOneRel', field_db_type='integer', related_model='activity.ActivityLog', field_name_on_related_model='user', field_type_on_related_model='ForeignKey'), FieldReverseRelation(name='addons', field_type='ManyToManyRel', field_db_type='through addons.AddonUser', related_model='addons.Addon', field_name_on_related_model='authors', field_type_on_related_model='FilterableManyToManyField'), FieldReverseRelation(name='userprofile_set', field_type='ManyToOneRel', field_db_type='integer', related_model='addons.AddonUser', field_name_on_related_model='user', field_type_on_related_model='ForeignKey'), FieldReverseRelation(name='userprofile_set', field_type='ManyToOneRel', field_db_type='integer', related_model='addons.AddonUserPendingConfirmation', field_name_on_related_model='user', field_type_on_related_model='ForeignKey'), FieldReverseRelation(name='api_keys', field_type='ManyToOneRel', field_db_type='integer', related_model='api.APIKey', field_name_on_related_model='user', field_type_on_related_model='ForeignKey'), FieldReverseRelation(name='userprofile_set', field_type='OneToOneRel', field_db_type='integer', related_model='api.APIKeyConfirmation', field_name_on_related_model='user', field_type_on_related_model='OneToOneField'), FieldReverseRelation(name='collections', field_type='ManyToOneRel', field_db_type='integer', related_model='bandwagon.Collection', field_name_on_related_model='author', field_type_on_related_model='ForeignKey'), FieldReverseRelation(name='userprofile_set', field_type='ManyToOneRel', field_db_type='integer', related_model='bandwagon.CollectionAddon', field_name_on_related_model='user', field_type_on_related_model='ForeignKey'), FieldReverseRelation(name='userprofile_set', field_type='ManyToOneRel', field_db_type='integer', related_model='blocklist.Block', field_name_on_related_model='updated_by', field_type_on_related_model='ForeignKey'), FieldReverseRelation(name='userprofile_set', field_type='ManyToOneRel', field_db_type='integer', related_model='blocklist.BlocklistSubmission', field_name_on_related_model='updated_by', field_type_on_related_model='ForeignKey'), FieldReverseRelation(name='+ (no reverse relation allowed)', field_type='ManyToOneRel', field_db_type='integer', related_model='blocklist.BlocklistSubmission', field_name_on_related_model='signoff_by', field_type_on_related_model='ForeignKey'), FieldReverseRelation(name='userprofile_set', field_type='ManyToOneRel', field_db_type='integer', related_model='devhub.RssKey', field_name_on_related_model='user', field_type_on_related_model='ForeignKey'), FieldReverseRelation(name='surveyresponse', field_type='ManyToOneRel', field_db_type='integer', related_model='devhub.SurveyResponse', field_name_on_related_model='user', field_type_on_related_model='ForeignKey'), FieldReverseRelation(name='userprofile_set', field_type='ManyToOneRel', field_db_type='integer', related_model='files.FileUpload', field_name_on_related_model='user', field_type_on_related_model='ForeignKey'), FieldReverseRelation(name='_ratings_all', field_type='ManyToOneRel', field_db_type='integer', related_model='ratings.Rating', field_name_on_related_model='user', field_type_on_related_model='ForeignKey'), FieldReverseRelation(name='userprofile_set', field_type='ManyToOneRel', field_db_type='integer', related_model='ratings.RatingFlag', field_name_on_related_model='user', field_type_on_related_model='ForeignKey'), FieldReverseRelation(name='userprofile_set', field_type='ManyToOneRel', field_db_type='integer', related_model='reviewers.ReviewerSubscription', field_name_on_related_model='user', field_type_on_related_model='ForeignKey'), FieldReverseRelation(name='notifications', field_type='ManyToOneRel', field_db_type='integer', related_model='users.UserNotification', field_name_on_related_model='user', field_type_on_related_model='ForeignKey'), FieldReverseRelation(name='restriction_history', field_type='ManyToOneRel', field_db_type='integer', related_model='users.UserRestrictionHistory', field_name_on_related_model='user', field_type_on_related_model='ForeignKey'), FieldReverseRelation(name='history', field_type='ManyToOneRel', field_db_type='integer', related_model='users.UserHistory', field_name_on_related_model='user', field_type_on_related_model='ForeignKey'), FieldReverseRelation(name='content_disabled_on_ban', field_type='OneToOneRel', field_db_type='integer', related_model='users.BannedUserContent', field_name_on_related_model='user', field_type_on_related_model='OneToOneField'), FieldReverseRelation(name='userprofile_set', field_type='ManyToOneRel', field_db_type='integer', related_model='versions.VersionReviewerFlags', field_name_on_related_model='pending_rejection_by', field_type_on_related_model='ForeignKey'), FieldReverseRelation(name='Flag_users+ (no reverse relation allowed)', field_type='ManyToOneRel', field_db_type='integer', related_model='waffle.Flag_users', field_name_on_related_model='userprofile', field_type_on_related_model='ForeignKey'), FieldReverseRelation(name='userprofile_set', field_type='ManyToManyRel', field_db_type='through waffle.Flag_users', related_model='waffle.Flag', field_name_on_related_model='users', field_type_on_related_model='ManyToManyField'), FieldReverseRelation(name='userprofile_set', field_type='ManyToOneRel', field_db_type='integer', related_model='admin.LogEntry', field_name_on_related_model='user', field_type_on_related_model='ForeignKey')] ## Reverse Relations | Field Name | Field Type | Database Type | Related Model | Field Name on Related Model | Field Type on Related Model | |----------|----------|-------------|-------------|---------------------------|---------------------------| | `+ (no reverse relation allowed)` | ManyToOneRel | integer | blocklist.BlocklistSubmission | signoff_by | ForeignKey | | `Flag_users+ (no reverse relation allowed)` | ManyToOneRel | integer | waffle.Flag_users | userprofile | ForeignKey | | `_ratings_all` | ManyToOneRel | integer | ratings.Rating | user | ForeignKey | | `abuse_reported` | ManyToOneRel | integer | abuse.AbuseReport | reporter | ForeignKey | | `abuse_reports` | ManyToOneRel | integer | abuse.AbuseReport | user | ForeignKey | | `activity_log_tokens` | ManyToOneRel | integer | activity.ActivityLogToken | user | ForeignKey | | `addons` | ManyToManyRel | through addons.AddonUser | addons.Addon | authors | FilterableManyToManyField | | `api_keys` | ManyToOneRel | integer | api.APIKey | user | ForeignKey | | `collections` | ManyToOneRel | integer | bandwagon.Collection | author | ForeignKey | | `content_disabled_on_ban` | OneToOneRel | integer | users.BannedUserContent | user | OneToOneField | | `decisions_made_by` | ManyToOneRel | integer | abuse.ContentDecision | reviewer_user | ForeignKey | | `decisions_on` | ManyToOneRel | integer | abuse.ContentDecision | user | ForeignKey | | `groups` | ManyToManyRel | through access.GroupUser | access.Group | users | ManyToManyField | | `history` | ManyToOneRel | integer | users.UserHistory | user | ForeignKey | | `notifications` | ManyToOneRel | integer | users.UserNotification | user | ForeignKey | | `restriction_history` | ManyToOneRel | integer | users.UserRestrictionHistory | user | ForeignKey | | `surveyresponse` | ManyToOneRel | integer | devhub.SurveyResponse | user | ForeignKey | | `userprofile_set` | ManyToOneRel | integer | access.GroupUser | user | ForeignKey | | `userprofile_set` | ManyToOneRel | integer | activity.DraftComment | user | ForeignKey | | `userprofile_set` | ManyToOneRel | integer | activity.ActivityLog | user | ForeignKey | | `userprofile_set` | ManyToOneRel | integer | addons.AddonUser | user | ForeignKey | | `userprofile_set` | ManyToOneRel | integer | addons.AddonUserPendingConfirmation | user | ForeignKey | | `userprofile_set` | OneToOneRel | integer | api.APIKeyConfirmation | user | OneToOneField | | `userprofile_set` | ManyToOneRel | integer | bandwagon.CollectionAddon | user | ForeignKey | | `userprofile_set` | ManyToOneRel | integer | blocklist.Block | updated_by | ForeignKey | | `userprofile_set` | ManyToOneRel | integer | blocklist.BlocklistSubmission | updated_by | ForeignKey | | `userprofile_set` | ManyToOneRel | integer | devhub.RssKey | user | ForeignKey | | `userprofile_set` | ManyToOneRel | integer | files.FileUpload | user | ForeignKey | | `userprofile_set` | ManyToOneRel | integer | ratings.RatingFlag | user | ForeignKey | | `userprofile_set` | ManyToOneRel | integer | reviewers.ReviewerSubscription | user | ForeignKey | | `userprofile_set` | ManyToOneRel | integer | versions.VersionReviewerFlags | pending_rejection_by | ForeignKey | | `userprofile_set` | ManyToManyRel | through waffle.Flag_users | waffle.Flag | users | ManyToManyField | | `userprofile_set` | ManyToOneRel | integer | admin.LogEntry | user | ForeignKey | ## Methods ### Other Methods | Method Name | Signature | |-----------|---------| | `anonymize_user` | `(self)` | | `check_password` | `(self, password)` | | `create_user_url` | `(id_, src=None)` | | `delete_picture` | `(self)` | | `get_addons_listed` | `(self)` | | `get_admin_absolute_url` | `(self)` | | `get_admin_url_path` | `(self)` | | `get_email_field_name` | `()` | | `get_full_name` | `(self)` | | `get_lookup_field` | `(identifier)` | | `get_next_by_created` | `(self, *, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)` | | `get_next_by_modified` | `(self, *, field=<django.db.models.fields.DateTimeField: modified>, is_next=True, **kwargs)` | | `get_previous_by_created` | `(self, *, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)` | | `get_previous_by_modified` | `(self, *, field=<django.db.models.fields.DateTimeField: modified>, is_next=False, **kwargs)` | | `get_session_auth_fallback_hash` | `(self)` | | `get_session_auth_hash` | `(self)` | | `get_short_name` | `(self)` | | `get_unfiltered_manager` | `()` | | `get_url_path` | `(self, src=None)` | | `get_username` | `(self)` | | `has_module_perms` | `(self, app_label)` | | `has_perm` | `(self, perm, obj=None)` | | `has_read_developer_agreement` | `(self)` | | `has_usable_password` | `(self)` | | `is_survey_eligible` | `(self, survey_id)` | | `my_addons` | `(self, n=8)` | | `natural_key` | `(self)` | | `normalize_username` | `(username)` | | `on_change` | `(callback)` | | `reload` | `(self)` | | `serializable_reference` | `(self)` | | `set_password` | `(self, password)` | | `set_unusable_password` | `(self)` | | `should_send_delete_email` | `(self)` | | `update` | `(self, **kwargs)` | | `update_has_full_profile` | `(self)` | | `user_logged_in` | `(sender, request, user, **kwargs)` | ### Private Methods | Method Name | Signature | |-----------|---------| | `_delete_related_content` | `(self, *, addon_msg='')` | | `_get_field_value_map` | `(self, meta, exclude=None)` | | `_get_session_auth_hash` | `(self, secret=None)` | | `_prepare_delete_email` | `(self)` | | `_reset_initial_attrs` | `(self, attrs=None)` | | `_send_changes` | `(self, old_attr, new_attr_kw)` | ## Custom Managers ### default **Class:** `UserManager` *Base for all managers in AMO. Returns BaseQuerySets. If a model has translated fields, they'll be attached through a transform function.* #### Custom Methods ##### `ban_and_disable_related_content(self)` ##### `create_superuser(self, username, email, fxa_id=None)` *Creates and saves a superuser.* ##### `create_user(self, email, fxa_id=None, **kwargs)` ##### `get_by_natural_key(self, username)` ##### `make_random_password(self, length=10, allowed_chars='abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789')` *Generate a random password with the given length and given allowed_chars. The default value of allowed_chars does not have "I" or "O" or letters and digits that look similar -- just to avoid confusion.* ##### `transform(self, fn)` ##### `unban_and_reenable_related_content(self)` #### Custom QuerySet **Class:** `UserQuerySet` *Represent a lazy database lookup for a set of objects.* ##### Custom Methods ###### `ban_and_disable_related_content(self, *, skip_activity_log=False)` *Admin method to ban multiple users and disable the content they produced. Similar to deletion, except that the content produced by the user is forcibly soft-disabled instead of being deleted where possible, and the user is not anonymized: we keep their data until hard-deletion kicks in (see clear_old_user_data), including fxa_id and email so that they are never able to log back in.* ###### `no_transforms(self)` ###### `only_translations(self)` *Remove all transforms except translations.* ###### `optimized_count(self)` *Slightly optimized count() for cases where there is a DISTINCT in the queryset. When a count() call is made on a queryset that has a distinct, that causes django to run the full SELECT (including all fields, distinct, ordering etc) in a subquery and then COUNT() on the result of that subquery, which is costly/innefficient. That's tracked in https://code.djangoproject.com/ticket/30685. We can't easily fix the fact that there is a subquery, but we can avoid selecting all fields and ordering in that subquery needlessly.* ###### `pop_transforms(self)` ###### `transform(self, fn)` ###### `unban_and_reenable_related_content(self, *, skip_activity_log=False)` *Admin method to unban users and restore their content that was disabled when they were banned.* ### objects **Class:** `UserManager` *Base for all managers in AMO. Returns BaseQuerySets. If a model has translated fields, they'll be attached through a transform function.* #### Custom Methods ##### `ban_and_disable_related_content(self)` ##### `create_superuser(self, username, email, fxa_id=None)` *Creates and saves a superuser.* ##### `create_user(self, email, fxa_id=None, **kwargs)` ##### `get_by_natural_key(self, username)` ##### `make_random_password(self, length=10, allowed_chars='abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789')` *Generate a random password with the given length and given allowed_chars. The default value of allowed_chars does not have "I" or "O" or letters and digits that look similar -- just to avoid confusion.* ##### `transform(self, fn)` ##### `unban_and_reenable_related_content(self)` #### Custom QuerySet **Class:** `UserQuerySet` *Represent a lazy database lookup for a set of objects.* ##### Custom Methods ###### `ban_and_disable_related_content(self, *, skip_activity_log=False)` *Admin method to ban multiple users and disable the content they produced. Similar to deletion, except that the content produced by the user is forcibly soft-disabled instead of being deleted where possible, and the user is not anonymized: we keep their data until hard-deletion kicks in (see clear_old_user_data), including fxa_id and email so that they are never able to log back in.* ###### `no_transforms(self)` ###### `only_translations(self)` *Remove all transforms except translations.* ###### `optimized_count(self)` *Slightly optimized count() for cases where there is a DISTINCT in the queryset. When a count() call is made on a queryset that has a distinct, that causes django to run the full SELECT (including all fields, distinct, ordering etc) in a subquery and then COUNT() on the result of that subquery, which is costly/innefficient. That's tracked in https://code.djangoproject.com/ticket/30685. We can't easily fix the fact that there is a subquery, but we can avoid selecting all fields and ordering in that subquery needlessly.* ###### `pop_transforms(self)` ###### `transform(self, fn)` ###### `unban_and_reenable_related_content(self, *, skip_activity_log=False)` *Admin method to unban users and restore their content that was disabled when they were banned.* --- !!! THIS DOCUMENT WAS *AUTOGENERATED* ON 2025-08-02 !!!