SmarterAuthToken Django ORM
- class smarter.lib.drf.models.SmarterAuthToken(*args, **kwargs)[source]
Bases:
AuthToken,MetaDataWithOwnershipModelRepresents a Smarter API Key used for authenticating and authorizing access to the Smarter platform.
This model extends Knox’s AuthToken and includes additional metadata and management features for API keys, such as naming, description, activation status, and usage tracking.
- Parameters:
key_id (UUIDField): Unique identifier for the API key. name (str): Human-readable name for the API key. description (str, optional): Optional description of the API key’s purpose. last_used_at (datetime, optional): Timestamp of the last usage of the API key. is_active (bool): Indicates whether the API key is currently active.
Usage Example:
# Creating an API key for a staff user user = User.objects.get(username="admin") token, key = SmarterAuthToken.objects.create( user=user, name="Production Key", description="Key for production API access" ) # Activating or deactivating the key token.activate() token.deactivate() # Toggling active status token.toggle_active() # Tracking usage token.accessed()
Note
API keys can only be created for staff users. Attempting to create a key for a non-staff user will raise a SmarterBusinessRuleViolation.
The identifier property returns a masked version of the key digest for display purposes.
Names are stored in snake_case, as every SAM manifest name is, so that
getanddescribereport the same name.save()converts any other name.
Warning
Ensure that API keys are managed securely. Deactivated keys cannot be used for authentication.
Related Models
User: The owner of the API key.MetaDataModel: Provides created/modified timestamps and SAM metadata.
- param digest:
Primary key: Digest
- type digest:
Unknown
- param token_key:
Token key
- type token_key:
Unknown
- param created:
Created
- type created:
Unknown
- param expiry:
Expiry
- type expiry:
Unknown
- param created_at:
Created at
- type created_at:
Unknown
- param updated_at:
Updated at
- type updated_at:
Unknown
- param name:
Name. Name in camelCase, e.g., ‘apiKey’, no special characters.
- type name:
Unknown
- param description:
Description. A brief description of this resource. Be verbose, but not too verbose.
- type description:
Unknown
- param version:
Version. Semantic version in the format MAJOR.MINOR.PATCH, e.g., ‘1.0.0’.
- type version:
Unknown
- param annotations:
Annotations. Key-value pairs for annotating this resource.
- type annotations:
Unknown
- param key_id:
Key id
- type key_id:
Unknown
- param last_used_at:
Last used at
- type last_used_at:
Unknown
- param is_active:
Is active
- type is_active:
Unknown
- param tags:
Tags
- type tags:
Unknown
Relationship fields:
- param user:
User (related name:
auth_token_set)- type user:
Unknown
- param authtoken_ptr:
Primary key: Authtoken ptr (related name:
smarterauthtoken)- type authtoken_ptr:
Unknown
- param user_profile:
User profile (related name:
smarterauthtoken)- type user_profile:
Unknown
Reverse relationships:
- param llmclientapikey:
All LLMClient API Keys of this API Key (related name of
api_key)- type llmclientapikey:
Unknown
- exception DoesNotExist
Bases:
DoesNotExist- __init__(*args, **kwargs)
- add_note(note, /)
Add a note to the exception
- args
- silent_variable_failure = True
- with_traceback(tb, /)
Set self.__traceback__ to tb and return self.
- HASH_FLOOR = 1000000
- HASH_PREFIX = 'r'
- HASH_SUFFIX = 'x'
- exception MultipleObjectsReturned
Bases:
MultipleObjectsReturned- __init__(*args, **kwargs)
- add_note(note, /)
Add a note to the exception
- args
- with_traceback(tb, /)
Set self.__traceback__ to tb and return self.
- exception NotUpdated
Bases:
NotUpdated- __init__(*args, **kwargs)
- add_note(note, /)
Add a note to the exception
- args
- with_traceback(tb, /)
Set self.__traceback__ to tb and return self.
- __init__(*args, **kwargs)
- accessed()[source]
Update the last used time.
- activate()[source]
Activate the API key.
- async adelete(using=None, keep_parents=False)
- annotations
-
Annotations. Key-value pairs for annotating this resource.
- Type:
Type
- async arefresh_from_db(using=None, fields=None, from_queryset=None)
- async asave(*, force_insert=False, force_update=False, using=None, update_fields=None)
- authorize()
Check that no budget forbids charges to this resource.
Call it before spending on it.
It is not called when the resource is looked up, or checked for readiness, so that a resource whose budget is exceeded can still be viewed and managed.
- Raises:
SmarterBudgetExceeded – if a budget’s resource lock forbids charges to it.
- Return type:
- authtoken_ptr
OneToOneFieldtoAuthTokenPrimary key: Authtoken ptr (related name:
smarterauthtoken)- Type:
Type
- authtoken_ptr_id
Internal field, use
authtoken_ptrinstead.
- bool_environment_variable(var_name, default=False)
Retrieves a boolean value from an environment variable.
This method checks the specified environment variable and returns its value as a boolean. It recognizes common truthy values such as “true”, “1”, “yes”, and “on”. If the variable is not set or cannot be interpreted as a boolean, it returns the provided default value.
- cache_expiration = 60
- classmethod check(**kwargs)
- clean()
Hook for doing any extra model-wide validation after clean() has been called on every field by self.clean_fields. Any ValidationError raised by this method will not be associated with a particular field; it will have a special-case association with the field defined by NON_FIELD_ERRORS.
- clean_fields(exclude=None)
Clean all fields and raise a ValidationError containing a dict of all validation errors if any occur.
- clone(new_name=None, new_version=None, user_profile=None)[source]
Create a new API key with this key’s metadata.
A clone is a new key: the manager creates its own token, digest and key_id, which MetaDataWithOwnershipModel.clone() would otherwise copy from this key.
- Parameters:
- Returns:
The new key.
- Return type:
- created
-
Created
- Type:
Type
- created_at
-
Created at
Timestamp indicating when the model instance was created.
This field is automatically set to the current date and time when the instance is first created. It is indexed in the database for efficient querying.
- Type:
Type
- data_to_dict(data)
Converts data to a dictionary, handling different types of input.
This method accepts either a dictionary or a string. If a string is provided, it will attempt to parse it as JSON first, and if that fails, as YAML. If parsing fails or the data type is unsupported, a SmarterValueError is raised.
- date_error_message(lookup_type, field_name, unique_for)
- deactivate()[source]
Deactivate the API key.
- delete(using=None, keep_parents=False)
- description
-
Description. A brief description of this resource. Be verbose, but not too verbose.
- Type:
Type
- deserves_amnesty(slug)
Determines if a given URL deserves amnesty based on the amnesty URLs list.
This excuses certain endpoints (like health checks) from select middleware checks.
- dict_is_contained_in(dict1, dict2)
Checks if one dictionary is contained within another.
This method determines if all key-value pairs in dict1 are present in dict2.
- dict_is_subset(small, big)
Checks if one dictionary is a subset of another.
This method determines if all key-value pairs in the small dictionary are present in the big dictionary. It returns True if the small dictionary is a subset of the big dictionary, and False otherwise.
- digest
-
Primary key: Digest
- Type:
Type
- property elapsed_updated: int | None
Calculate the absolute time difference in seconds between a given datetime and the model’s
updated_attimestamp.This property is useful for determining how much time has elapsed since the model instance was last updated, or for comparing the
updated_atfield to any arbitrary datetime.Parameters:
dt (datetime, optional): The reference datetime to compare against
updated_at. - Ifdtis not provided, the current time is used. - Both naive and timezone-aware datetime objects are supported; the method will handle conversions as needed.
Returns:
int or None: The absolute difference in seconds between
updated_atanddt. ReturnsNoneifupdated_atis not set.
Example Usage:
obj = MyModel.objects.get(pk=1) # Time since last update seconds = obj.elapsed_updated print(f"Seconds since last update: {seconds}") # Compare to a specific datetime import datetime dt = datetime.datetime(2025, 12, 1, 12, 0, 0) diff = obj.elapsed_updated(dt) print(f"Seconds between updated_at and 2025-12-01 12:00:00: {diff}")
Note
Handles both naive and aware datetime objects, converting as necessary to ensure accurate calculation.
If
updated_atis not set (e.g., the object has not been saved), returnsNone.
Attention
If
dtis provided and is not adatetime.datetimeinstance, aTypeErrorwill be raised.Always ensure that
updated_atis set before relying on this property for calculations.
- expiry
-
Expiry
- Type:
Type
- classmethod find_hash(value)
Finds and returns the first substring in the given value that matches the hashed ID format.
- formatted_class_name = '\x1b[1;31mSmarterAuthToken\x1b[0m'
- formatted_json(json_obj)
Formats a JSON object as a pretty-printed string with ANSI color codes for logging.
- property formatted_state_not_ready: str
Returns the not-ready state formatted for logging.
- Returns:
The formatted not-ready state as a string.
- Return type:
- property formatted_state_ready: str
Returns the readiness state formatted for logging.
- Returns:
The formatted readiness state as a string.
- Return type:
- formatted_text(text, color_code='\\x1b[1;31m')
Formats text with ANSI color codes for logging.
- formatted_text_blue(text)
Formats text in bold dark blue for logging.
- formatted_text_green(text)
Formats text in bright green for logging.
- formatted_text_red(text)
Formats text in dark red for logging.
- classmethod from_db(db, field_names, values)
- full_clean(exclude=None, validate_unique=True, validate_constraints=True)
Call clean_fields(), clean(), validate_unique(), and validate_constraints() on the model. Raise a ValidationError for any errors that occur.
- generate_fernet_encryption_key()
Generates a Fernet encryption key.
This method creates a new Fernet encryption key, which can be used for secure encryption and decryption of data. The generated key is returned as a URL-safe base64-encoded string.
- Returns:
A new Fernet encryption key.
- Return type:
- classmethod get_cached_object(*args, invalidate=False, pk=None, name=None, user=None, user_profile=None, username=None, account=None, session_key=None, taggit=True, **kwargs)
Retrieve a model instance using caching to optimize performance.
Examples of retrieval patterns:
# By primary key instance = MyModel.get_cached_object(pk=123) # By name and user profile instance = MyModel.get_cached_object(name="Resource Name", user_profile=user_profile) # By name and account instance = MyModel.get_cached_object(name="Resource Name", account=account)
- Parameters:
pk (
int|None) – The primary key of the model instance to retrieve.name (
str|None) – The name of the model instance to retrieve.user (
User|None) – The user associated with the model instance.user_profile (
UserProfile|None) – The user profile associated with the model instance.account (
Account|None) – The account associated with the model instance.invalidate (
bool|None) – Whether to invalidate the cache for this retrieval.
- Returns:
The model instance if found, otherwise raises
DoesNotExist.- Return type:
- classmethod get_cached_objects(invalidate=False, user_profile=None, user=None, name=None, **kwargs)[source]
Retrieve API keys with caching based on user profile and optional name filter using caching.
- Parameters:
invalidate (
bool|None) – If True, invalidate the cache for this query.user_profile (
UserProfile|None) – The user profile for which to retrieve API keys.user (
User|None) – The user for which to retrieve API keys (used if user_profile is not provided).name (
str|None) – Optional name filter to retrieve API keys with a specific name.
- Returns:
A queryset of SmarterAuthToken objects matching the criteria.
- Return type:
- get_constraints()
- get_deferred_fields()
Return a set containing names of deferred fields for this instance.
- get_next_by_created(*, field=<django.db.models.DateTimeField: created>, is_next=True, **kwargs)
Finds next instance based on
created. Seeget_next_by_FOO()for more information.
- classmethod get_object_by_locator(locator)[source]
Retrieves a SmarterAuthToken from a record locator created by record_locator.
- Return type:
- get_previous_by_created(*, field=<django.db.models.DateTimeField: created>, is_next=False, **kwargs)
Finds previous instance based on
created. Seeget_previous_by_FOO()for more information.
- get_readonly_csv_file(file_path)
Reads a CSV file and returns its contents as a list of dictionaries, one per row.
The file is opened read-only, so reading it never modifies it.
- get_readonly_yaml_file(file_path)
Reads a YAML file and returns its contents as a dictionary.
The file is opened read-only, so reading it never modifies it.
- classmethod hash_regex()
Returns a regex pattern that matches the hashed ID format for this model anywhere in a string.
The hashed ID format is defined by the
HASH_PREFIXandHASH_SUFFIXclass attributes, with a base64-encoded string in between. This regex can be used to validate or extract hashed IDs from strings, including when embedded in URLs.- Returns:
A regex pattern for matching hashed IDs.
- Return type:
- property health_check_urls: list[str]
Returns a list of URL paths that are considered health check endpoints.
- property id: str
Returns the token’s public identifier, its key_id, as a string.
A knox AuthToken has no integer id: its primary key is its digest. The api, the urls and the web console identify a token by its key_id instead.
- classmethod id_from_hashed_id(hashed_id)
Decodes a hashed ID back to the original object ID.
decoding scheme: 1. Validate that the hashed ID starts with the expected prefix and ends with the expected suffix. 2. Remove the prefix and suffix to isolate the base64-encoded string. 3. Add padding if necessary to make the length of the encoded string a multiple of 4. 4. Decode the base64 string to get the original number as a string. 5. Convert the decoded string to an integer and subtract the HASH_FLOOR to get the original ID.
Example:
my_record = MyModel.objects.create() print(my_record.id) # e.g., 123 hashed_id = my_record.hashed_id # e.g., "rc2x" original_id = MyModel.id_from_hashed_id(hashed_id) print(original_id) # Should print the original ID (e.g., 123)
- property identifier: str
Returns the token’s digest, masked for logging.
- is_active
-
Is active
- Type:
Type
- property is_billable_resource: bool
Indicates whether the model instance is considered a billable resource.
This property can be overridden in subclasses to specify which models are billable. By default, it returns False, indicating that the base TimestampedModel is not billable.
- Returns:
True if the instance is billable, False otherwise.
- Return type:
- key_id
-
Key id
- Type:
Type
- last_used_at
-
Last used at
- Type:
Type
- llmclientapikey_set
Reverse
ForeignKeyfromLLMClientAPIKeyAll LLMClient API Keys of this API Key (related name of
api_key)- Type:
Type
- property manifest_url: str | None
Returns the URL of the token’s manifest detail page, which identifies the token by its key_id.
Example:
self.manifest_url # '/authtoken/d55cfbe5-89ec-4c11-90b9-3e9ec4bbbd85/'
- mask_string(string='', mask_char='*', mask_length=4, string_length=8)
Masks a string for secure logging.
This utility function masks all but the last unmasked_chars characters of the input string, replacing them with asterisks. It is useful for logging sensitive information like API keys or passwords.
- name
-
Name. Name in camelCase, e.g., ‘apiKey’, no special characters.
- Type:
Type
- objects: MetaDataWithOwnershipModelManager = <smarter.lib.drf.models.SmarterAuthTokenManager object>
- property pk
- prepare_database_save(field)
- property ready: bool
Returns True if the resource is ready for use, False otherwise.
A resource is considered ready if it has been fully initialized and is in a usable state. This property can be overridden in subclasses to implement custom readiness checks.
- Returns:
True if the resource is ready, False otherwise.
- Return type:
- property record_locator: str
Returns the record locator, which is derived from key_id.
The primary key of a knox AuthToken is a digest string, not an integer id, so the TimestampedModel hashed_id-based record locator cannot be used.
- recursive_sort_dict(data)
Recursively sorts a dictionary by its keys.
This method takes a dictionary and returns a new dictionary with all keys sorted in ascending order. If any values are also dictionaries, they will be sorted recursively as well.
- refresh_from_db(using=None, fields=None, from_queryset=None)
Reload field values from the database.
By default, the reloading happens from the database this instance was loaded from, or by the read router if this instance wasn’t loaded from any database. The using parameter will override the default.
Fields can be used to specify which fields to reload. The fields should be an iterable of field attnames. If fields is None, then all non-deferred fields are reloaded.
When accessing deferred fields of an instance, the deferred loading of the field will call this method.
- rename(new_name)
Rename the model instance with a new name.
- Parameters:
new_name (
str) – The new name for the instance.- Returns:
The updated instance of MetaDataModel with the new name.
- Return type:
- property rfc1034_compliant_name: str | None
Returns a URL-friendly name for the llmclient.
This property returns an RFC 1034-compliant name for the llmclient, suitable for use in URLs and DNS labels.
Example:
self.name = 'Example LLMClient 1' self.rfc1034_compliant_name # 'example-llmclient-1'
- Returns:
The RFC 1034-compliant name, or None if
self.nameis not set.- Return type:
Optional[str]
- rfc1034_compliant_str(name)
Converts a string to an RFC 1034 compliant format.
This method takes a string and converts it to a format that complies with RFC 1034, which is commonly used for domain names. It replaces invalid characters with hyphens and ensures the resulting string is lowercase.
- rfc1034_compliant_to_snake(name)
Converts an RFC 1034 compliant string to snake_case.
This method takes a string in RFC 1034 compliant format and converts it to snake_case. It replaces hyphens with underscores and ensures the resulting string is lowercase.
- save(*args, **kwargs)[source]
Save the current instance. Override this in a subclass if you want to control the saving process.
The ‘force_insert’ and ‘force_update’ parameters can be used to insist that the “save” must be an SQL insert or update (or equivalent for non-SQL backends), respectively. Normally, they should not be set.
- save_base(raw=False, force_insert=False, force_update=False, using=None, update_fields=None)
Handle the parts of saving which should be done only once per save, yet need to be done in raw saves, too. This includes some sanity checks and signal sending.
The ‘raw’ argument is telling save_base not to save any parent models and not to do any changes to the values before save. This is used by fixture loading.
- serializable_value(field_name)
Return the value of the field name for this instance. If the field is a foreign key, return the id value instead of the object. If there’s no Field object with this name on the model, return the model attribute’s value.
Used to serialize a field’s value (in the serializer, or form output, for example). Normally, you would just access the attribute directly and not use this method.
- smarter_build_absolute_uri(request)
Attempts to get the absolute URI from a request object.
This utility function tries to retrieve the request URL from any valid child class of
django.http.HttpRequest. It is especially useful in unit tests or scenarios where the request object may not implementbuild_absolute_uri().- Parameters:
request (
HttpRequest) – The request object.- Returns:
The absolute request URL.
- Return type:
- Raises:
SmarterValueError – If the URI cannot be built from the request.
- smarterauthtoken
Reverse
OneToOneFieldfromSmarterAuthTokenThe API Key of this auth token (related name of
authtoken_ptr)- Type:
Type
- sorted_dict(data)
Returns a new dictionary with keys sorted.
- tags
-
Tags
- Type:
Type
- property tags_list: list[str]
Returns the tag names.
tags is a JSONField list here, not a taggit manager.
- to_camel_case(data, convert_values=False)
Converts a snake_case string to camelCase.
This method takes a string in snake_case format and converts it to camelCase. It is useful for standardizing naming conventions across different formats.
- Parameters:
- Returns:
The converted string in camelCase.
- Return type:
- to_json()
Serialize the model instance to a JSON-compatible dictionary.
This method uses the custom
SmarterJSONEncoderto ensure that all fields, including timestamps and any complex data types, are properly serialized.
- to_snake_case(data, convert_values=False)
Converts a camelCase or PascalCase string to snake_case.
This method takes a string in camelCase or PascalCase format and converts it to snake_case. It is useful for standardizing naming conventions across different formats.
- Parameters:
- Returns:
The converted string in snake_case.
- Return type:
- toggle_active()[source]
Toggle the active status of the API key.
- token_key
-
Token key
- Type:
Type
- property unformatted_class_name: str
Returns the raw class name without formatting.
- Returns:
The unformatted class name as a string.
- Return type:
This is useful for logging or serialization where the plain class name is needed.
- unique_error_message(model_class, unique_check)
- updated_at
-
Updated at
Timestamp indicating when the model instance was last updated.
This field is automatically updated to the current date and time whenever the instance is saved. It is indexed in the database for efficient querying.
- Type:
Type
- user
ForeignKeytoUserUser (related name:
auth_token_set)- Type:
Type
- user_id
Internal field, use
userinstead.
- user_profile
-
User profile (related name:
smarterauthtoken)- Type:
Type
- user_profile_id
Internal field, use
user_profileinstead.
- validate()
Validate the model.
- validate_constraints(exclude=None)
- validate_token(token)[source]
Return True if token is this api key’s token, which is stored only as its digest.
- Return type:
- validate_unique(exclude=None)
Check unique constraints on the model and raise ValidationError if any failed.
- version
-
Version. Semantic version in the format MAJOR.MINOR.PATCH, e.g., ‘1.0.0’.
- Type:
Type