Devices

This module is used to manage information related to LNL’s managed devices (i.e. Laptops).

Models

class devices.models.ConfigurationProfile(*args, **kwargs)[source]

This class defines metadata for a given macOS configuration profile. The core profile data is stored in a separate JSON file.

Parameters:
  • id (AutoField) – Id (required)
  • name (CharField) – Name (required)
  • profile (FilePathField) – Profile (required)
  • scope (CharField) – Scope (default=System)
  • created_on (DateTimeField) – Created on (required)
  • last_modified (DateTimeField) – Last modified (required)
  • pending_install (ManyToManyField to Laptop) – Pending install (required)
  • installed (ManyToManyField to Laptop) – Installed (required)
exception DoesNotExist
exception MultipleObjectsReturned
created_on

DateTimeField(auto_now_add=True)

get_next_by_created_on(*, field=<django.db.models.fields.DateTimeField: created_on>, is_next=True, **kwargs)
get_next_by_last_modified(*, field=<django.db.models.fields.DateTimeField: last_modified>, is_next=True, **kwargs)
get_previous_by_created_on(*, field=<django.db.models.fields.DateTimeField: created_on>, is_next=False, **kwargs)
get_previous_by_last_modified(*, field=<django.db.models.fields.DateTimeField: last_modified>, is_next=False, **kwargs)
get_scope_display(*, field=<django.db.models.fields.CharField: scope>)
id

AutoField(verbose_name=”ID”, primary_key=True, serialize=False, auto_created=True)

install_records

Reverse Manager for devices.InstallationRecord’s profile

installed

Reverse Manager for devices.ConfigurationProfile’s installed

last_modified

DateTimeField(auto_now=True)

name

CharField(max_length=100)

objects = <django.db.models.manager.Manager object>
pending_install

Reverse Manager for devices.ConfigurationProfile’s pending_install

profile

FilePathField(path=”/home/docs/checkouts/readthedocs.org/user_builds/lnldb/checkouts/latest/runtime/media/profiles”, match=”.*.json$”)

scope

CharField(max_length=6, default=”System”, choices=[(‘System’, ‘System’), (‘User’, ‘User’)])

class devices.models.InstallationRecord(*args, **kwargs)[source]

Used to log when managed resources were last installed on a device

Parameters:
  • id (AutoField) – Id (required)
  • profile (ForeignKey to ConfigurationProfile) – Profile
  • app (ForeignKey to MacOSApp) – App
  • device (ForeignKey to Laptop) – Device (required)
  • version (CharField) – Version
  • installed_on (DateTimeField) – Installed on (required)
  • expires (DateTimeField) – Expires
  • active (BooleanField) – Active (default=True)
exception DoesNotExist
exception MultipleObjectsReturned
active

BooleanField(default=True)

app

ForeignKey(blank=True, null=True, related_name=”install_records”, on_delete=CASCADE(), to= MacOSApp)

app_id

Raw (integer) FK for app

device

ForeignKey(related_name=”install_records”, on_delete=CASCADE(), to= Laptop)

device_id

Raw (integer) FK for device

expires

DateTimeField(blank=True, null=True)

get_next_by_installed_on(*, field=<django.db.models.fields.DateTimeField: installed_on>, is_next=True, **kwargs)
get_previous_by_installed_on(*, field=<django.db.models.fields.DateTimeField: installed_on>, is_next=False, **kwargs)
id

AutoField(verbose_name=”ID”, primary_key=True, serialize=False, auto_created=True)

installed_on

DateTimeField(auto_now_add=True)

objects = <django.db.models.manager.Manager object>
profile

ForeignKey(blank=True, null=True, related_name=”install_records”, on_delete=CASCADE(), to= ConfigurationProfile)

profile_id

Raw (integer) FK for profile

version

CharField(max_length=36, blank=True, null=True)

class devices.models.Laptop(*args, **kwargs)[source]

Represents one of LNL’s laptops

Parameters:
  • id (AutoField) – Id (required)
  • name (CharField) – Name (required)
  • description (TextField) – Description (required)
  • serial (CharField) – Serial
  • asset_tag (CharField) – Asset tag
  • api_key_hash (CharField) – SHA-256 hash of the API key that the laptop uses to communicate with the database (required)
  • user_password (CharField) – User password (required)
  • admin_password (CharField) – Admin password (required)
  • last_checkin (DateTimeField) – Last checkin
  • last_ip (CharField) – Last network ip address
  • mdm_enrolled (BooleanField) – Enrolled in mdm (default=False)
  • retired (BooleanField) – Retired (default=False)
exception DoesNotExist
exception MultipleObjectsReturned
admin_password

CharField(max_length=64)

api_key_hash

CharField(verbose_name=”API key hash”, max_length=64, db_index=True, help_text=”SHA-256 hash of the API key that the laptop uses to communicate with the database”)

Api key hash: SHA-256 hash of the API key that the laptop uses to communicate with the database

apps_installed

Reverse Manager for devices.MacOSApp’s installed

apps_pending

Reverse Manager for devices.MacOSApp’s pending_install

apps_remove

Reverse Manager for devices.MacOSApp’s pending_removal

asset_tag

CharField(max_length=25, blank=True, null=True)

description

TextField(blank=True)

id

AutoField(verbose_name=”ID”, primary_key=True, serialize=False, auto_created=True)

install_records

Reverse Manager for devices.InstallationRecord’s device

installed

Reverse Manager for devices.ConfigurationProfile’s installed

last_checkin

DateTimeField(blank=True, null=True)

last_ip

CharField(verbose_name=”Last Network IP Address”, max_length=15, blank=True, null=True)

mdm_enrolled

BooleanField(verbose_name=”Enrolled in MDM”, default=False)

name

CharField(max_length=20)

objects = <django.db.models.manager.Manager object>
password_retrievals

Reverse Manager for devices.LaptopPasswordRetrieval’s laptop

password_rotations

Reverse Manager for devices.LaptopPasswordRotation’s laptop

pending

Reverse Manager for devices.ConfigurationProfile’s pending_install

retired

BooleanField(default=False)

serial

CharField(max_length=12, blank=True, null=True)

user_password

CharField(max_length=64)

class devices.models.LaptopPasswordRetrieval(*args, **kwargs)[source]

Used to keep track of when users access the laptop passwords

Parameters:
  • id (AutoField) – Id (required)
  • timestamp (DateTimeField) – Timestamp (required)
  • laptop (ForeignKey to Laptop) – Laptop (required)
  • user (ForeignKey to User) – User (required)
  • admin (BooleanField) – Admin (required)
exception DoesNotExist
exception MultipleObjectsReturned
admin

BooleanField()

get_next_by_timestamp(*, field=<django.db.models.fields.DateTimeField: timestamp>, is_next=True, **kwargs)
get_previous_by_timestamp(*, field=<django.db.models.fields.DateTimeField: timestamp>, is_next=False, **kwargs)
id

AutoField(verbose_name=”ID”, primary_key=True, serialize=False, auto_created=True)

laptop

ForeignKey(related_name=”password_retrievals”, on_delete=CASCADE(), to= Laptop)

laptop_id

Raw (integer) FK for laptop

objects = <django.db.models.manager.Manager object>
timestamp

DateTimeField(auto_now_add=True)

user

ForeignKey(on_delete=PROTECT(), to= User)

user_id

Raw (integer) FK for user

class devices.models.LaptopPasswordRotation(*args, **kwargs)[source]

Used to keep track of when passwords are rotated on LNL’s MacBooks

Parameters:
  • id (AutoField) – Id (required)
  • timestamp (DateTimeField) – Timestamp (required)
  • laptop (ForeignKey to Laptop) – Laptop (required)
exception DoesNotExist
exception MultipleObjectsReturned
get_next_by_timestamp(*, field=<django.db.models.fields.DateTimeField: timestamp>, is_next=True, **kwargs)
get_previous_by_timestamp(*, field=<django.db.models.fields.DateTimeField: timestamp>, is_next=False, **kwargs)
id

AutoField(verbose_name=”ID”, primary_key=True, serialize=False, auto_created=True)

laptop

ForeignKey(related_name=”password_rotations”, on_delete=CASCADE(), to= Laptop)

laptop_id

Raw (integer) FK for laptop

objects = <django.db.models.manager.Manager object>
timestamp

DateTimeField(auto_now_add=True)

class devices.models.MacOSApp(*args, **kwargs)[source]

Used to keep track of managed applications for LNL’s MacBooks

Parameters:
  • id (AutoField) – Id (required)
  • name (CharField) – Name (required)
  • identifier (CharField) – Homebrew Identifier (required)
  • version (CharField) – Version
  • developer (CharField) – Developer
  • description (TextField) – Description
  • update_available (BooleanField) – Update available (default=False)
  • pending_install (ManyToManyField to Laptop) – Pending install (required)
  • pending_removal (ManyToManyField to Laptop) – Pending removal (required)
  • installed (ManyToManyField to Laptop) – Installed (required)
exception DoesNotExist
exception MultipleObjectsReturned
description

TextField(blank=True, null=True)

developer

CharField(max_length=64, blank=True, null=True)

id

AutoField(verbose_name=”ID”, primary_key=True, serialize=False, auto_created=True)

identifier

CharField(max_length=64, help_text=”Homebrew Identifier”)

Identifier: Homebrew Identifier

install_records

Reverse Manager for devices.InstallationRecord’s app

installed

Reverse Manager for devices.MacOSApp’s installed

name

CharField(max_length=128)

objects = <django.db.models.manager.Manager object>
pending_install

Reverse Manager for devices.MacOSApp’s pending_install

pending_removal

Reverse Manager for devices.MacOSApp’s pending_removal

update_available

BooleanField(blank=True, default=False)

version

CharField(max_length=36, blank=True, null=True)


Views

devices.views.add_app(request)[source]

Administrators can use this page to add new managed applications to the MDM. Non-admin users will have the option to request new software. Requests from non-admins will trigger a notification for the Webmaster.

devices.views.app_list(request)[source]

Lists all the managed applications

devices.views.complete_enrollment(request, pk)[source]

Launched once the installation process is completed on a new device. Prompts the user for additional administrative details such as the asset tag number to complete the enrollment process.

Parameters:pk – Primary key of device
devices.views.dock_app_list(data)[source]

Used in generating macOS configuration profiles. Generates a dictionary with details about applications that should be added to the Dock.

Parameters:data – Form data (Dictionary)
Returns:Dictionary - {‘name’: <string>, ‘path’: <string>}
devices.views.fw_app_list(data)[source]

Used in generating macOS configuration profiles. Generates a dictionary used in configuring Firewall settings.

Parameters:data – Form data (Dictionary)
Returns:Dictionary - {‘bundle_id’: <string>, ‘allowed’: <boolean>}
devices.views.generate_ids()[source]

Generates UUIDs for each of the profile’s payloads.

Returns:Dictionary of payload identifiers
devices.views.generate_profile(request, pk=0)[source]

Create or edit a macOS configuration profile

Parameters:pk – Primary key of configuration profile (Optional)
devices.views.get_payloads(data)[source]

Generates a dictionary which specifies which payloads are active in a given profile and what their current version numbers are.

Parameters:data – Form data (Dictionary)
Returns:Dictionary of payload versions
devices.views.get_profile_metadata(config, timestamp)[source]

Retrieve additional metadata from profile data

Parameters:
  • config – Configuration Profile object
  • timestamp – Timestamp at time of install
Returns:

Dictionary with profile metadata - {‘expires’: <datetime>, ‘version’: <string>}

devices.views.handle_expired_profiles()[source]

Checks for expired profiles and updates listings accordingly

devices.views.install_client(request)[source]

Displays an agreement that the user must agree to before they can download the MDM Client installer

devices.views.install_confirmation(request)[source]

Endpoint for accepting receipt of install. Managed devices should contact this endpoint anytime new resources are installed. If the installation of a resource fails, the Webmaster will be notified.

Returns:JSON - {‘status’: 200}
devices.views.laptop_admin_password(request, id)[source]

Retrieve the admin password for one of the laptops

Parameters:id – Primary key of laptop
devices.views.laptop_history(request, id)[source]

View a history of password retrievals and rotations for a given laptop

Parameters:id – Primary key of laptop
devices.views.laptop_user_password(request, id)[source]

Retrieve the LNL user password for one of the laptops

Parameters:id – Primary key of laptop
devices.views.laptops_list(request)[source]

View a list of LNL’s laptops

Assign managed apps to a device. If a primary key value for device is supplied, a list of managed applications will be displayed. The user can then select which applications to assign to the respective device. The opposite is true when a primary key value is supplied for app.

Parameters:
  • device – Primary key of device (Optional)
  • app – Primary key of managed application (Optional)

Assign configuration profiles to a device. If a primary key value for device is supplied, a list of profiles will be displayed. The user can then select which profiles to assign to the respective device. The opposite is true when a primary key value is supplied for profile.

Parameters:
  • device – Primary key of device (Optional)
  • profile – Primary key of configuration profile (Optional)
devices.views.list_app_devices(request, pk)[source]

List all devices linked to a specific app

Parameters:pk – Primary key of managed application
devices.views.list_apps(request, pk=0)[source]

If a value is provided for pk, this will list all the managed applications assigned to the respective device. Otherwise this will list all the managed apps under the MDM.

Parameters:pk – Primary key of device (Optional)
devices.views.list_profiles(request, pk=0)[source]

When given a pk value, this view will list all the configuration profiles for a given device. When pk is not supplied, the view will list all the profiles in the MDM.

Parameters:pk – Primary key of device (Optional)
devices.views.load_ids(data)[source]

Reassembles payload identifiers. This is necessary because the MDM does not store the full payload identifiers with the profile data.

Parameters:data – Dictionary of payload identifiers
Returns:Dictionary of payload identifiers
devices.views.logs(request)[source]

Displays logs detailing what was installed on what devices and when

devices.views.mdm_checkin(request)[source]

Endpoint for device check-in. Managed devices will check in each time a new user logs onto the device.

Returns:JSON - If resources are pending install, includes the identifiers needed for the client to fetch and install them. Returns {‘status’: 200} otherwise.
devices.views.mdm_enroll(request)[source]

Endpoint for starting the enrollment process. Must be contacted directly by the device being enrolled.

Returns:Relative path to the link to complete the enrollment process (if client token is valid)
devices.views.mdm_list(request)[source]

MDM Console Homepage

devices.views.mobile_config(request, profile_id, action='Install')[source]

Endpoint for generating and downloading a macOS configuration profile. The request must include the MDM Client token for authentication purposes.

If action is set to Uninstall, the resulting file will cause existing copies of the profile to be removed from the device.

Parameters:
  • profile_id – Primary key of configuration profile
  • action – Either ‘Install’ or ‘Uninstall’
devices.views.profile_devices(request, pk)[source]

List all devices that are linked to a given profile

Parameters:pk – Primary key of configuration profile
devices.views.removal_password(request)[source]

Displays the password that can be used to manually remove configuration profiles from managed devices

devices.views.remove_app(request, app, device=0)[source]

If a primary key value is supplied for both the device and app, the user will be able to remove the assignment between the managed application and that particular device. If only the app is provided, all device assignments for the application will be removed and the app will no longer be available to devices under the MDM. In both cases, two options will be presented to the user:

1.) Mark the application as removed (if the app had already been removed manually)

2.) Instruct the MDM to uninstall the application automatically at the next checkin

Parameters:
  • app – Primary key of managed application
  • device – Primary key of device (Optional)
devices.views.remove_device(request, pk)[source]

Removes a device from the MDM. Presents warnings and instructions for how to complete the operation correctly.

Parameters:pk – Primary key of device
devices.views.remove_profile(request, profile, device=0)[source]

If a primary key value is supplied for both the device and profile, the user will be able to remove the assignment between the profile and that particular device. If only the profile is provided, all device assignments for the profile will be removed and the profile data will be deleted. In both cases, two options will be presented to the user:

1.) Mark the profile as removed (if the profile had already been removed manually)

2.) Instruct the MDM to remove the profile automatically at the next checkin

Parameters:
  • profile – Primary key of configuration profile
  • device – Primary key of device (Optional)
devices.views.rotate_passwords(request)[source]

Endpoint for updating the MacBook passwords once they’ve been rotated.

Returns:The old passwords so the MacBooks can complete the rotation
devices.views.update_app_info(request, pk)[source]

Update the metadata for a managed application. Including the version number will allow the application to be deployed through the MDM.

Parameters:pk – Primary key of managed application

Forms

class devices.forms.AssignmentForm(*args, **kwargs)[source]
base_fields = {'options': <django.forms.fields.MultipleChoiceField object>}
declared_fields = {'options': <django.forms.fields.MultipleChoiceField object>}
media
class devices.forms.ClientForm(*args, **kwargs)[source]
base_fields = {}
declared_fields = {}
media
class devices.forms.EnrollmentForm(*args, **kwargs)[source]
class Meta[source]
fields = ('name', 'serial', 'asset_tag', 'user_password', 'admin_password')
model

alias of devices.models.Laptop

base_fields = {'admin_password': <django.forms.fields.CharField object>, 'asset_tag': <django.forms.fields.CharField object>, 'name': <django.forms.fields.CharField object>, 'serial': <django.forms.fields.CharField object>, 'user_password': <django.forms.fields.CharField object>}
declared_fields = {'asset_tag': <django.forms.fields.CharField object>}
media
class devices.forms.NewAppForm(*args, **kwargs)[source]
class FieldAccess[source]
can_edit = <data.forms.FieldAccessLevel object>
can_request = <data.forms.FieldAccessLevel object>
class Meta[source]
fields = ['name', 'identifier', 'developer', 'version', 'description']
model

alias of devices.models.MacOSApp

base_fields = {'description': <django.forms.fields.CharField object>, 'developer': <django.forms.fields.CharField object>, 'identifier': <django.forms.fields.CharField object>, 'name': <django.forms.fields.CharField object>, 'version': <django.forms.fields.CharField object>}
declared_fields = {}
media
class devices.forms.ProfileForm(*args, **kwargs)[source]
base_fields = {'ac_display_timer': <django.forms.fields.IntegerField object>, 'ac_power_failure': <django.forms.fields.BooleanField object>, 'ac_system_timer': <django.forms.fields.IntegerField object>, 'ac_wake_lan': <django.forms.fields.BooleanField object>, 'ac_wake_modem': <django.forms.fields.BooleanField object>, 'ad_tracking': <django.forms.fields.BooleanField object>, 'admin_install': <django.forms.fields.BooleanField object>, 'alpha': <django.forms.fields.BooleanField object>, 'anim': <django.forms.fields.BooleanField object>, 'anim_immutable': <django.forms.fields.BooleanField object>, 'app_adoption': <django.forms.fields.BooleanField object>, 'app_auto': <django.forms.fields.BooleanField object>, 'app_name_0': <django.forms.fields.CharField object>, 'app_path_0': <django.forms.fields.CharField object>, 'apple_music': <django.forms.fields.BooleanField object>, 'auto_backup': <django.forms.fields.BooleanField object>, 'auto_check': <django.forms.fields.BooleanField object>, 'auto_download': <django.forms.fields.BooleanField object>, 'auto_remove': <django.forms.fields.ChoiceField object>, 'autofill_address': <django.forms.fields.BooleanField object>, 'autofill_forms': <django.forms.fields.BooleanField object>, 'autohide': <django.forms.fields.BooleanField object>, 'autohide_immutable': <django.forms.fields.BooleanField object>, 'backup_size': <django.forms.fields.IntegerField object>, 'backup_sys': <django.forms.fields.BooleanField object>, 'backup_url': <django.forms.fields.CharField object>, 'backup_volumes': <django.forms.fields.BooleanField object>, 'battery_display_timer': <django.forms.fields.IntegerField object>, 'battery_power_failure': <django.forms.fields.BooleanField object>, 'battery_system_timer': <django.forms.fields.IntegerField object>, 'battery_wake_lan': <django.forms.fields.BooleanField object>, 'battery_wake_modem': <django.forms.fields.BooleanField object>, 'block_all': <django.forms.fields.BooleanField object>, 'caching': <django.forms.fields.BooleanField object>, 'cloud_address': <django.forms.fields.BooleanField object>, 'cloud_bookmarks': <django.forms.fields.BooleanField object>, 'cloud_cal': <django.forms.fields.BooleanField object>, 'cloud_doc_sync': <django.forms.fields.BooleanField object>, 'cloud_docs_desk': <django.forms.fields.BooleanField object>, 'cloud_keychain': <django.forms.fields.BooleanField object>, 'cloud_mail': <django.forms.fields.BooleanField object>, 'cloud_notes': <django.forms.fields.BooleanField object>, 'cloud_reminders': <django.forms.fields.BooleanField object>, 'command_click': <django.forms.fields.BooleanField object>, 'complexity': <django.forms.fields.IntegerField object>, 'config_install': <django.forms.fields.BooleanField object>, 'console': <django.forms.fields.BooleanField object>, 'content_immutable': <django.forms.fields.BooleanField object>, 'cookies': <django.forms.fields.ChoiceField object>, 'default_browser': <django.forms.fields.BooleanField object>, 'description': <django.forms.fields.CharField object>, 'desktop_path': <django.forms.fields.CharField object>, 'desktop_version': <django.forms.fields.IntegerField object>, 'developers_policy': <django.forms.fields.BooleanField object>, 'device_backups': <django.forms.fields.BooleanField object>, 'diagnostics': <django.forms.fields.BooleanField object>, 'diagnostics_version': <django.forms.fields.IntegerField object>, 'disable_airdrop': <django.forms.fields.BooleanField object>, 'disable_assistant': <django.forms.fields.BooleanField object>, 'disable_autounlock': <django.forms.fields.BooleanField object>, 'disable_beta': <django.forms.fields.BooleanField object>, 'disable_camera': <django.forms.fields.BooleanField object>, 'disable_context': <django.forms.fields.BooleanField object>, 'disable_handoff': <django.forms.fields.BooleanField object>, 'disable_password_change': <django.forms.fields.BooleanField object>, 'disable_screenshot': <django.forms.fields.BooleanField object>, 'disable_sleep': <django.forms.fields.BooleanField object>, 'disable_touchid': <django.forms.fields.BooleanField object>, 'disabled_panes': <django.forms.fields.MultipleChoiceField object>, 'disallow_notifications': <django.forms.fields.BooleanField object>, 'display_name': <django.forms.fields.CharField object>, 'dock_version': <django.forms.fields.IntegerField object>, 'downloads_clear': <django.forms.fields.ChoiceField object>, 'downloads_path': <django.forms.fields.CharField object>, 'ds_store': <django.forms.fields.BooleanField object>, 'empty_trash': <django.forms.fields.BooleanField object>, 'enable_protection': <django.forms.fields.BooleanField object>, 'enabled_panes': <django.forms.fields.MultipleChoiceField object>, 'energy_version': <django.forms.fields.IntegerField object>, 'extra_dock': <django.forms.fields.IntegerField object>, 'extra_firewall': <django.forms.fields.IntegerField object>, 'filename': <django.forms.fields.CharField object>, 'filevault': <django.forms.fields.BooleanField object>, 'filevault_version': <django.forms.fields.IntegerField object>, 'finder_version': <django.forms.fields.IntegerField object>, 'firewall_enable': <django.forms.fields.BooleanField object>, 'firewall_version': <django.forms.fields.IntegerField object>, 'force_reset': <django.forms.fields.BooleanField object>, 'grace_period': <django.forms.fields.IntegerField object>, 'hidden_panes': <django.forms.fields.MultipleChoiceField object>, 'hide_admin': <django.forms.fields.BooleanField object>, 'history_limit': <django.forms.fields.ChoiceField object>, 'homepage': <django.forms.fields.CharField object>, 'host_info': <django.forms.fields.CharField object>, 'improve_siri': <django.forms.fields.ChoiceField object>, 'insecure_forms': <django.forms.fields.BooleanField object>, 'ipod_sync': <django.forms.fields.BooleanField object>, 'itunes_agreement': <django.forms.fields.BooleanField object>, 'itunes_file_share': <django.forms.fields.BooleanField object>, 'itunes_version': <django.forms.fields.IntegerField object>, 'java': <django.forms.fields.BooleanField object>, 'javascript': <django.forms.fields.BooleanField object>, 'library_sharing': <django.forms.fields.BooleanField object>, 'locked': <django.forms.fields.BooleanField object>, 'lockmessage_ui': <django.forms.fields.BooleanField object>, 'login_full_name': <django.forms.fields.BooleanField object>, 'login_version': <django.forms.fields.IntegerField object>, 'magnify': <django.forms.fields.BooleanField object>, 'magnify_immutable': <django.forms.fields.BooleanField object>, 'magsize_immutable': <django.forms.fields.BooleanField object>, 'mineffect': <django.forms.fields.ChoiceField object>, 'mineffect_immutable': <django.forms.fields.BooleanField object>, 'mini_app': <django.forms.fields.BooleanField object>, 'mobile_backups': <django.forms.fields.BooleanField object>, 'multiple_pages': <django.forms.fields.BooleanField object>, 'music_store': <django.forms.fields.BooleanField object>, 'new_tab': <django.forms.fields.ChoiceField object>, 'new_window': <django.forms.fields.ChoiceField object>, 'orientation': <django.forms.fields.ChoiceField object>, 'os_auto': <django.forms.fields.BooleanField object>, 'pass_autofill': <django.forms.fields.BooleanField object>, 'pass_proximity': <django.forms.fields.BooleanField object>, 'pass_share': <django.forms.fields.BooleanField object>, 'passcode_attempts': <django.forms.fields.IntegerField object>, 'passcode_force': <django.forms.fields.BooleanField object>, 'passcode_simple': <django.forms.fields.BooleanField object>, 'passcode_version': <django.forms.fields.IntegerField object>, 'password_change': <django.forms.fields.BooleanField object>, 'password_version': <django.forms.fields.IntegerField object>, 'pin_age': <django.forms.fields.IntegerField object>, 'pin_history': <django.forms.fields.IntegerField object>, 'pin_inactivity': <django.forms.fields.IntegerField object>, 'pin_min_length': <django.forms.fields.IntegerField object>, 'plugins': <django.forms.fields.BooleanField object>, 'policy_enable': <django.forms.fields.BooleanField object>, 'policy_version': <django.forms.fields.IntegerField object>, 'position': <django.forms.fields.BooleanField object>, 'power_loggedin': <django.forms.fields.BooleanField object>, 'preferences_version': <django.forms.fields.IntegerField object>, 'preferred_style': <django.forms.fields.ChoiceField object>, 'private_browsing': <django.forms.fields.BooleanField object>, 'process': <django.forms.fields.BooleanField object>, 'prohibit_connect': <django.forms.fields.BooleanField object>, 'prohibit_goto': <django.forms.fields.BooleanField object>, 'removal_date': <django.forms.fields.SplitDateTimeField object>, 'removal_period': <django.forms.fields.IntegerField object>, 'restart': <django.forms.fields.BooleanField object>, 'restart_loggedin': <django.forms.fields.BooleanField object>, 'restrictions_version': <django.forms.fields.IntegerField object>, 'retries_till_hint': <django.forms.fields.IntegerField object>, 'safari_version': <django.forms.fields.IntegerField object>, 'safe_downloads': <django.forms.fields.BooleanField object>, 'scope': <django.forms.fields.ChoiceField object>, 'screen_lock': <django.forms.fields.BooleanField object>, 'screensaver_delay': <django.forms.fields.IntegerField object>, 'screensaver_idle': <django.forms.fields.IntegerField object>, 'screensaver_password': <django.forms.fields.BooleanField object>, 'screensaver_path': <django.forms.fields.CharField object>, 'screensaver_version': <django.forms.fields.IntegerField object>, 'setup_version': <django.forms.fields.IntegerField object>, 'shared_music': <django.forms.fields.BooleanField object>, 'show_connected': <django.forms.fields.BooleanField object>, 'shutdown': <django.forms.fields.BooleanField object>, 'shutdown_loggedin': <django.forms.fields.BooleanField object>, 'siri_enabled': <django.forms.fields.BooleanField object>, 'siri_version': <django.forms.fields.IntegerField object>, 'size_immutable': <django.forms.fields.BooleanField object>, 'skip_appearance': <django.forms.fields.BooleanField object>, 'skip_cloud': <django.forms.fields.BooleanField object>, 'skip_cloud_storage': <django.forms.fields.BooleanField object>, 'skip_privacy': <django.forms.fields.BooleanField object>, 'skip_siri': <django.forms.fields.BooleanField object>, 'skip_true_tone': <django.forms.fields.BooleanField object>, 'sleep': <django.forms.fields.BooleanField object>, 'software_version': <django.forms.fields.IntegerField object>, 'softwareupdate_only': <django.forms.fields.BooleanField object>, 'spotlight_internet': <django.forms.fields.BooleanField object>, 'stealth': <django.forms.fields.BooleanField object>, 'store_version': <django.forms.fields.IntegerField object>, 'tab_links': <django.forms.fields.BooleanField object>, 'tab_policy': <django.forms.fields.ChoiceField object>, 'text': <django.forms.fields.CharField object>, 'time_machine_version': <django.forms.fields.IntegerField object>, 'time_reset': <django.forms.fields.IntegerField object>, 'update_check': <django.forms.fields.BooleanField object>, 'update_notifications': <django.forms.fields.BooleanField object>, 'version': <django.forms.fields.IntegerField object>, 'warn_trash': <django.forms.fields.BooleanField object>, 'window_target': <django.forms.fields.ChoiceField object>}
clean_desktop_version()[source]
clean_diagnostics_version()[source]
clean_dock_version()[source]
clean_energy_version()[source]
clean_filevault_version()[source]
clean_finder_version()[source]
clean_firewall_version()[source]
clean_itunes_version()[source]
clean_login_version()[source]
clean_passcode_version()[source]
clean_password_version()[source]
clean_policy_version()[source]
clean_preferences_version()[source]
clean_restrictions_version()[source]
clean_safari_version()[source]
clean_screensaver_version()[source]
clean_setup_version()[source]
clean_siri_version()[source]
clean_software_version()[source]
clean_store_version()[source]
clean_time_machine_version()[source]
clean_time_reset()[source]
declared_fields = {'ac_display_timer': <django.forms.fields.IntegerField object>, 'ac_power_failure': <django.forms.fields.BooleanField object>, 'ac_system_timer': <django.forms.fields.IntegerField object>, 'ac_wake_lan': <django.forms.fields.BooleanField object>, 'ac_wake_modem': <django.forms.fields.BooleanField object>, 'ad_tracking': <django.forms.fields.BooleanField object>, 'admin_install': <django.forms.fields.BooleanField object>, 'alpha': <django.forms.fields.BooleanField object>, 'anim': <django.forms.fields.BooleanField object>, 'anim_immutable': <django.forms.fields.BooleanField object>, 'app_adoption': <django.forms.fields.BooleanField object>, 'app_auto': <django.forms.fields.BooleanField object>, 'app_name_0': <django.forms.fields.CharField object>, 'app_path_0': <django.forms.fields.CharField object>, 'apple_music': <django.forms.fields.BooleanField object>, 'auto_backup': <django.forms.fields.BooleanField object>, 'auto_check': <django.forms.fields.BooleanField object>, 'auto_download': <django.forms.fields.BooleanField object>, 'auto_remove': <django.forms.fields.ChoiceField object>, 'autofill_address': <django.forms.fields.BooleanField object>, 'autofill_forms': <django.forms.fields.BooleanField object>, 'autohide': <django.forms.fields.BooleanField object>, 'autohide_immutable': <django.forms.fields.BooleanField object>, 'backup_size': <django.forms.fields.IntegerField object>, 'backup_sys': <django.forms.fields.BooleanField object>, 'backup_url': <django.forms.fields.CharField object>, 'backup_volumes': <django.forms.fields.BooleanField object>, 'battery_display_timer': <django.forms.fields.IntegerField object>, 'battery_power_failure': <django.forms.fields.BooleanField object>, 'battery_system_timer': <django.forms.fields.IntegerField object>, 'battery_wake_lan': <django.forms.fields.BooleanField object>, 'battery_wake_modem': <django.forms.fields.BooleanField object>, 'block_all': <django.forms.fields.BooleanField object>, 'caching': <django.forms.fields.BooleanField object>, 'cloud_address': <django.forms.fields.BooleanField object>, 'cloud_bookmarks': <django.forms.fields.BooleanField object>, 'cloud_cal': <django.forms.fields.BooleanField object>, 'cloud_doc_sync': <django.forms.fields.BooleanField object>, 'cloud_docs_desk': <django.forms.fields.BooleanField object>, 'cloud_keychain': <django.forms.fields.BooleanField object>, 'cloud_mail': <django.forms.fields.BooleanField object>, 'cloud_notes': <django.forms.fields.BooleanField object>, 'cloud_reminders': <django.forms.fields.BooleanField object>, 'command_click': <django.forms.fields.BooleanField object>, 'complexity': <django.forms.fields.IntegerField object>, 'config_install': <django.forms.fields.BooleanField object>, 'console': <django.forms.fields.BooleanField object>, 'content_immutable': <django.forms.fields.BooleanField object>, 'cookies': <django.forms.fields.ChoiceField object>, 'default_browser': <django.forms.fields.BooleanField object>, 'description': <django.forms.fields.CharField object>, 'desktop_path': <django.forms.fields.CharField object>, 'desktop_version': <django.forms.fields.IntegerField object>, 'developers_policy': <django.forms.fields.BooleanField object>, 'device_backups': <django.forms.fields.BooleanField object>, 'diagnostics': <django.forms.fields.BooleanField object>, 'diagnostics_version': <django.forms.fields.IntegerField object>, 'disable_airdrop': <django.forms.fields.BooleanField object>, 'disable_assistant': <django.forms.fields.BooleanField object>, 'disable_autounlock': <django.forms.fields.BooleanField object>, 'disable_beta': <django.forms.fields.BooleanField object>, 'disable_camera': <django.forms.fields.BooleanField object>, 'disable_context': <django.forms.fields.BooleanField object>, 'disable_handoff': <django.forms.fields.BooleanField object>, 'disable_password_change': <django.forms.fields.BooleanField object>, 'disable_screenshot': <django.forms.fields.BooleanField object>, 'disable_sleep': <django.forms.fields.BooleanField object>, 'disable_touchid': <django.forms.fields.BooleanField object>, 'disabled_panes': <django.forms.fields.MultipleChoiceField object>, 'disallow_notifications': <django.forms.fields.BooleanField object>, 'display_name': <django.forms.fields.CharField object>, 'dock_version': <django.forms.fields.IntegerField object>, 'downloads_clear': <django.forms.fields.ChoiceField object>, 'downloads_path': <django.forms.fields.CharField object>, 'ds_store': <django.forms.fields.BooleanField object>, 'empty_trash': <django.forms.fields.BooleanField object>, 'enable_protection': <django.forms.fields.BooleanField object>, 'enabled_panes': <django.forms.fields.MultipleChoiceField object>, 'energy_version': <django.forms.fields.IntegerField object>, 'extra_dock': <django.forms.fields.IntegerField object>, 'extra_firewall': <django.forms.fields.IntegerField object>, 'filename': <django.forms.fields.CharField object>, 'filevault': <django.forms.fields.BooleanField object>, 'filevault_version': <django.forms.fields.IntegerField object>, 'finder_version': <django.forms.fields.IntegerField object>, 'firewall_enable': <django.forms.fields.BooleanField object>, 'firewall_version': <django.forms.fields.IntegerField object>, 'force_reset': <django.forms.fields.BooleanField object>, 'grace_period': <django.forms.fields.IntegerField object>, 'hidden_panes': <django.forms.fields.MultipleChoiceField object>, 'hide_admin': <django.forms.fields.BooleanField object>, 'history_limit': <django.forms.fields.ChoiceField object>, 'homepage': <django.forms.fields.CharField object>, 'host_info': <django.forms.fields.CharField object>, 'improve_siri': <django.forms.fields.ChoiceField object>, 'insecure_forms': <django.forms.fields.BooleanField object>, 'ipod_sync': <django.forms.fields.BooleanField object>, 'itunes_agreement': <django.forms.fields.BooleanField object>, 'itunes_file_share': <django.forms.fields.BooleanField object>, 'itunes_version': <django.forms.fields.IntegerField object>, 'java': <django.forms.fields.BooleanField object>, 'javascript': <django.forms.fields.BooleanField object>, 'library_sharing': <django.forms.fields.BooleanField object>, 'locked': <django.forms.fields.BooleanField object>, 'lockmessage_ui': <django.forms.fields.BooleanField object>, 'login_full_name': <django.forms.fields.BooleanField object>, 'login_version': <django.forms.fields.IntegerField object>, 'magnify': <django.forms.fields.BooleanField object>, 'magnify_immutable': <django.forms.fields.BooleanField object>, 'magsize_immutable': <django.forms.fields.BooleanField object>, 'mineffect': <django.forms.fields.ChoiceField object>, 'mineffect_immutable': <django.forms.fields.BooleanField object>, 'mini_app': <django.forms.fields.BooleanField object>, 'mobile_backups': <django.forms.fields.BooleanField object>, 'multiple_pages': <django.forms.fields.BooleanField object>, 'music_store': <django.forms.fields.BooleanField object>, 'new_tab': <django.forms.fields.ChoiceField object>, 'new_window': <django.forms.fields.ChoiceField object>, 'orientation': <django.forms.fields.ChoiceField object>, 'os_auto': <django.forms.fields.BooleanField object>, 'pass_autofill': <django.forms.fields.BooleanField object>, 'pass_proximity': <django.forms.fields.BooleanField object>, 'pass_share': <django.forms.fields.BooleanField object>, 'passcode_attempts': <django.forms.fields.IntegerField object>, 'passcode_force': <django.forms.fields.BooleanField object>, 'passcode_simple': <django.forms.fields.BooleanField object>, 'passcode_version': <django.forms.fields.IntegerField object>, 'password_change': <django.forms.fields.BooleanField object>, 'password_version': <django.forms.fields.IntegerField object>, 'pin_age': <django.forms.fields.IntegerField object>, 'pin_history': <django.forms.fields.IntegerField object>, 'pin_inactivity': <django.forms.fields.IntegerField object>, 'pin_min_length': <django.forms.fields.IntegerField object>, 'plugins': <django.forms.fields.BooleanField object>, 'policy_enable': <django.forms.fields.BooleanField object>, 'policy_version': <django.forms.fields.IntegerField object>, 'position': <django.forms.fields.BooleanField object>, 'power_loggedin': <django.forms.fields.BooleanField object>, 'preferences_version': <django.forms.fields.IntegerField object>, 'preferred_style': <django.forms.fields.ChoiceField object>, 'private_browsing': <django.forms.fields.BooleanField object>, 'process': <django.forms.fields.BooleanField object>, 'prohibit_connect': <django.forms.fields.BooleanField object>, 'prohibit_goto': <django.forms.fields.BooleanField object>, 'removal_date': <django.forms.fields.SplitDateTimeField object>, 'removal_period': <django.forms.fields.IntegerField object>, 'restart': <django.forms.fields.BooleanField object>, 'restart_loggedin': <django.forms.fields.BooleanField object>, 'restrictions_version': <django.forms.fields.IntegerField object>, 'retries_till_hint': <django.forms.fields.IntegerField object>, 'safari_version': <django.forms.fields.IntegerField object>, 'safe_downloads': <django.forms.fields.BooleanField object>, 'scope': <django.forms.fields.ChoiceField object>, 'screen_lock': <django.forms.fields.BooleanField object>, 'screensaver_delay': <django.forms.fields.IntegerField object>, 'screensaver_idle': <django.forms.fields.IntegerField object>, 'screensaver_password': <django.forms.fields.BooleanField object>, 'screensaver_path': <django.forms.fields.CharField object>, 'screensaver_version': <django.forms.fields.IntegerField object>, 'setup_version': <django.forms.fields.IntegerField object>, 'shared_music': <django.forms.fields.BooleanField object>, 'show_connected': <django.forms.fields.BooleanField object>, 'shutdown': <django.forms.fields.BooleanField object>, 'shutdown_loggedin': <django.forms.fields.BooleanField object>, 'siri_enabled': <django.forms.fields.BooleanField object>, 'siri_version': <django.forms.fields.IntegerField object>, 'size_immutable': <django.forms.fields.BooleanField object>, 'skip_appearance': <django.forms.fields.BooleanField object>, 'skip_cloud': <django.forms.fields.BooleanField object>, 'skip_cloud_storage': <django.forms.fields.BooleanField object>, 'skip_privacy': <django.forms.fields.BooleanField object>, 'skip_siri': <django.forms.fields.BooleanField object>, 'skip_true_tone': <django.forms.fields.BooleanField object>, 'sleep': <django.forms.fields.BooleanField object>, 'software_version': <django.forms.fields.IntegerField object>, 'softwareupdate_only': <django.forms.fields.BooleanField object>, 'spotlight_internet': <django.forms.fields.BooleanField object>, 'stealth': <django.forms.fields.BooleanField object>, 'store_version': <django.forms.fields.IntegerField object>, 'tab_links': <django.forms.fields.BooleanField object>, 'tab_policy': <django.forms.fields.ChoiceField object>, 'text': <django.forms.fields.CharField object>, 'time_machine_version': <django.forms.fields.IntegerField object>, 'time_reset': <django.forms.fields.IntegerField object>, 'update_check': <django.forms.fields.BooleanField object>, 'update_notifications': <django.forms.fields.BooleanField object>, 'version': <django.forms.fields.IntegerField object>, 'warn_trash': <django.forms.fields.BooleanField object>, 'window_target': <django.forms.fields.ChoiceField object>}
fields = {}
media
class devices.forms.ProfileRemovalForm(*args, **kwargs)[source]
base_fields = {'options': <django.forms.fields.ChoiceField object>}
declared_fields = {'options': <django.forms.fields.ChoiceField object>}
media
class devices.forms.RemovalForm(*args, **kwargs)[source]
base_fields = {'agree': <django.forms.fields.BooleanField object>, 'client_removed': <django.forms.fields.BooleanField object>, 'profiles_removed': <django.forms.fields.BooleanField object>}
declared_fields = {'agree': <django.forms.fields.BooleanField object>, 'client_removed': <django.forms.fields.BooleanField object>, 'profiles_removed': <django.forms.fields.BooleanField object>}
media
class devices.forms.UninstallAppForm(*args, **kwargs)[source]
base_fields = {'options': <django.forms.fields.ChoiceField object>}
declared_fields = {'options': <django.forms.fields.ChoiceField object>}
media
class devices.forms.UpdateAppForm(*args, **kwargs)[source]
class Meta[source]
fields = ['name', 'identifier', 'developer', 'version', 'description', 'update_available']
model

alias of devices.models.MacOSApp

base_fields = {'description': <django.forms.fields.CharField object>, 'developer': <django.forms.fields.CharField object>, 'identifier': <django.forms.fields.CharField object>, 'name': <django.forms.fields.CharField object>, 'update_available': <django.forms.fields.BooleanField object>, 'version': <django.forms.fields.CharField object>}
declared_fields = {}
media