# 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 !!!