pangea.core package

Submodules

pangea.core.admin module

class pangea.core.admin.FieldNameListFilter(field, request, params, model, model_admin, field_path)[source]

Bases: django.contrib.admin.filters.AllValuesFieldListFilter

class pangea.core.admin.OrganizationAdmin(model, admin_site)[source]

Bases: django.contrib.admin.options.ModelAdmin

list_display = ('name', 'members')
media
members(obj)[source]
class pangea.core.admin.PangeaUserAdmin(model, admin_site)[source]

Bases: django.contrib.auth.admin.UserAdmin

add_fieldsets = ((None, {'classes': ('wide',), 'fields': ('email', 'password1', 'password2', 'is_staff', 'is_active')}),)
add_form

alias of pangea.core.forms.PangeaUserCreationForm

fieldsets = ((None, {'fields': ('email', 'password')}), ('Permissions', {'fields': ('is_staff', 'is_active')}))
form

alias of pangea.core.forms.PangeaUserChangeForm

list_display = ('email', 'is_staff', 'is_active')
list_filter = ('email', 'is_staff', 'is_active')
media
model

alias of pangea.core.models.organization.PangeaUser

ordering = ('email',)
search_fields = ('email',)
class pangea.core.admin.ProjectAdmin(model, admin_site)[source]

Bases: django.contrib.admin.options.ModelAdmin

list_display = ('name', 'organization')
list_filter = (('organization', <class 'django.contrib.admin.filters.RelatedOnlyFieldListFilter'>),)
media
class pangea.core.admin.S3ApiKeyAdmin(model, admin_site)[source]

Bases: django.contrib.admin.options.ModelAdmin

bucket_name(obj)[source]
list_display = ('public_key', 'bucket_name')
lookup_allowed(lookup, value)[source]
media
organization_name(obj)[source]
class pangea.core.admin.S3BucketAdmin(model, admin_site)[source]

Bases: django.contrib.admin.options.ModelAdmin

list_display = ('name', 'organization', 'endpoint_url')
list_filter = (('organization', <class 'django.contrib.admin.filters.RelatedOnlyFieldListFilter'>),)
lookup_allowed(lookup, value)[source]
media
organization_name(obj)[source]
class pangea.core.admin.SampleAdmin(model, admin_site)[source]

Bases: django.contrib.admin.options.ModelAdmin

library_name(obj)[source]
list_display = ('name', 'library_name', 'member_of_groups')
list_filter = (('library__group__organization', <class 'django.contrib.admin.filters.RelatedOnlyFieldListFilter'>), ('library', <class 'django.contrib.admin.filters.RelatedOnlyFieldListFilter'>))
lookup_allowed(lookup, value)[source]
media
member_of_groups(obj)[source]
class pangea.core.admin.SampleAnalysisResultAdmin(model, admin_site)[source]

Bases: django.contrib.admin.options.ModelAdmin

list_display = ('sample_name', 'module_name')
list_filter = (('sample__library__group__organization', <class 'django.contrib.admin.filters.RelatedOnlyFieldListFilter'>), ('sample__library__group', <class 'django.contrib.admin.filters.RelatedOnlyFieldListFilter'>), 'module_name', ('sample', <class 'django.contrib.admin.filters.RelatedOnlyFieldListFilter'>))
lookup_allowed(lookup, value)[source]
media
sample_name(obj)[source]
class pangea.core.admin.SampleAnalysisResultFieldAdmin(model, admin_site)[source]

Bases: django.contrib.admin.options.ModelAdmin

field_name(obj)[source]
list_display = ('sample_name', 'module_name', 'field_name')
list_filter = (('analysis_result__sample__library__group__organization', <class 'django.contrib.admin.filters.RelatedOnlyFieldListFilter'>), ('analysis_result__sample__library__group', <class 'django.contrib.admin.filters.RelatedOnlyFieldListFilter'>), 'analysis_result__module_name', ('name', <class 'pangea.core.admin.FieldNameListFilter'>), ('analysis_result__sample', <class 'django.contrib.admin.filters.RelatedOnlyFieldListFilter'>))
lookup_allowed(lookup, value)[source]
media
module_name(obj)[source]
sample_name(obj)[source]
class pangea.core.admin.SampleGroupAdmin(model, admin_site)[source]

Bases: django.contrib.admin.options.ModelAdmin

list_display = ('name', 'organization_name')
list_filter = (('organization', <class 'django.contrib.admin.filters.RelatedOnlyFieldListFilter'>),)
lookup_allowed(lookup, value)[source]
media
organization_name(obj)[source]
class pangea.core.admin.SampleGroupAnalysisResultAdmin(model, admin_site)[source]

Bases: django.contrib.admin.options.ModelAdmin

list_display = ('sample_group_name', 'module_name')
list_filter = (('sample_group__organization', <class 'django.contrib.admin.filters.RelatedOnlyFieldListFilter'>), ('sample_group', <class 'django.contrib.admin.filters.RelatedOnlyFieldListFilter'>), 'module_name')
lookup_allowed(lookup, value)[source]
media
sample_group_name(obj)[source]
class pangea.core.admin.SampleGroupAnalysisResultFieldAdmin(model, admin_site)[source]

Bases: django.contrib.admin.options.ModelAdmin

field_name(obj)[source]
list_display = ('sample_group_name', 'module_name', 'field_name')
list_filter = (('analysis_result__sample_group__organization', <class 'django.contrib.admin.filters.RelatedOnlyFieldListFilter'>), ('analysis_result__sample_group', <class 'django.contrib.admin.filters.RelatedOnlyFieldListFilter'>), 'analysis_result__module_name', ('name', <class 'pangea.core.admin.FieldNameListFilter'>))
lookup_allowed(lookup, value)[source]
media
module_name(obj)[source]
sample_group_name(obj)[source]
class pangea.core.admin.SampleLibraryAdmin(model, admin_site)[source]

Bases: django.contrib.admin.options.ModelAdmin

list_display = ('name', 'organization_name')
list_filter = (('group__organization', <class 'django.contrib.admin.filters.RelatedOnlyFieldListFilter'>),)
lookup_allowed(lookup, value)[source]
media
name(obj)[source]
organization_name(obj)[source]

pangea.core.apps module

class pangea.core.apps.CoreConfig(app_name, app_module)[source]

Bases: django.apps.config.AppConfig

name = 'core'

pangea.core.encrypted_fields module

Encrypted Model Fields.

From https://github.com/defrex/django-encrypted-fields with modifications.

exception pangea.core.encrypted_fields.EncryptedFieldException[source]

Bases: Exception

class pangea.core.encrypted_fields.EncryptedString(value)[source]

Bases: object

Ensures that we will need to manually call decrypt to access the plain text.

decrypt()[source]
class pangea.core.encrypted_fields.EncryptedTextField(verbose_name=None, name=None, primary_key=False, max_length=None, unique=False, blank=False, null=False, db_index=False, rel=None, default=<class 'django.db.models.fields.NOT_PROVIDED'>, editable=True, serialize=True, unique_for_date=None, unique_for_month=None, unique_for_year=None, choices=None, help_text='', db_column=None, db_tablespace=None, auto_created=False, validators=(), error_messages=None)[source]

Bases: django.db.models.fields.Field

from_db_value(value, expression, context)[source]
get_prep_value(value)[source]

Perform preliminary non-db specific value checks and conversions.

to_python(value)[source]

Convert the input value into the expected Python data type, raising django.core.exceptions.ValidationError if the data can’t be converted. Return the converted value. Subclasses should override this.

class pangea.core.encrypted_fields.XOR[source]

Bases: object

Does this count as rolling my own crypto? I can’t find any good python libraries and XOR is dummy simple.

static decrypt(data)[source]
static encrypt(data)[source]
static key()[source]
prefix = 'ENCRYPTED--'

pangea.core.exceptions module

Pangea Core Exceptions

exception pangea.core.exceptions.SampleOwnerError[source]

Bases: Exception

Raised when an invalid owner has been specified for a sample.

pangea.core.forms module

class pangea.core.forms.PangeaUserChangeForm(*args, **kwargs)[source]

Bases: django.contrib.auth.forms.UserChangeForm

class Meta[source]

Bases: object

fields = ('email',)
model

alias of pangea.core.models.organization.PangeaUser

base_fields = {'email': <django.forms.fields.EmailField object>, 'password': <django.contrib.auth.forms.ReadOnlyPasswordHashField object>}
declared_fields = {'password': <django.contrib.auth.forms.ReadOnlyPasswordHashField object>}
media
class pangea.core.forms.PangeaUserCreationForm(*args, **kwargs)[source]

Bases: django.contrib.auth.forms.UserCreationForm

class Meta(*args, **kwargs)[source]

Bases: django.contrib.auth.forms.UserCreationForm

base_fields = {'password1': <django.forms.fields.CharField object>, 'password2': <django.forms.fields.CharField object>, 'username': <django.contrib.auth.forms.UsernameField object>}
declared_fields = {'password1': <django.forms.fields.CharField object>, 'password2': <django.forms.fields.CharField object>}
fields = ('email',)
media
model

alias of pangea.core.models.organization.PangeaUser

base_fields = {'email': <django.forms.fields.EmailField object>, 'password1': <django.forms.fields.CharField object>, 'password2': <django.forms.fields.CharField object>}
declared_fields = {'password1': <django.forms.fields.CharField object>, 'password2': <django.forms.fields.CharField object>}
media

pangea.core.managers module

class pangea.core.managers.PangeaUserManager[source]

Bases: django.contrib.auth.base_user.BaseUserManager

Custom Pangea user model manager where email is the unique identifiers for authentication instead of usernames.

create_superuser(email, password, **extra_fields)[source]

Create and save a SuperUser with the given email and password.

create_user(email, password, **extra_fields)[source]

Create and save a User with the given email and password.

pangea.core.mixins module

From https://gist.github.com/ertgl/0c26b23ac5482e206a04cb1b13ec3795

class pangea.core.mixins.AutoCreatedUpdatedMixin(*args, **kwargs)[source]

Bases: django.db.models.base.Model

Django model mixin providing created_at, updated_at fields

class Meta[source]

Bases: object

abstract = False
created_at

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

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.

updated_at

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

class pangea.core.mixins.SoftDeleteMixin(*args, **kwargs)[source]

Bases: django.db.models.base.Model

Django model mixin providing soft deletes.

class Meta[source]

Bases: object

abstract = False
delete(using=None, keep_parents=False)[source]
deleted_at

A wrapper for a deferred-loading field. When the value is read from this object the first time, the query is executed.

pangea.core.nested_urls module

Additional URLs that support nested access and access by name. /{org_pk}/ /{org_pk}/sample_groups/ /{org_pk}/sample_groups/{grp_pk}/ /{org_pk}/sample_groups/{grp_pk}/analysis_results /{org_pk}/sample_groups/{grp_pk}/analysis_results/{ar_pk} /{org_pk}/sample_groups/{grp_pk}/analysis_results/{ar_pk}/fields /{org_pk}/sample_groups/{grp_pk}/analysis_results/{ar_pk}/fields/{field_pk} /{org_pk}/sample_groups/{grp_pk}/samples/ /{org_pk}/sample_groups/{grp_pk}/samples/{sample_pk}/ /{org_pk}/sample_groups/{grp_pk}/samples/{sample_pk}/analysis_results /{org_pk}/sample_groups/{grp_pk}/samples/{sample_pk}/analysis_results/{ar_pk} /{org_pk}/sample_groups/{grp_pk}/samples/{sample_pk}/analysis_results/{ar_pk}/fields /{org_pk}/sample_groups/{grp_pk}/samples/{sample_pk}/analysis_results/{ar_pk}/fields/{field_pk}

pangea.core.nested_urls.is_uuid(el)[source]

Return true if el is an UUID.

pangea.core.nested_urls.nested_path(url, base_view, *out_args, **out_kwargs)[source]

Return a path with an intercepted view function.

pangea.core.nested_urls.path(route, view, kwargs=None, name=None, *, Pattern=<class 'django.urls.resolvers.RoutePattern'>)
pangea.core.nested_urls.to_uuid(**kwargs)[source]

Return a UUID and a field name for the lowest parent level in the URL.

pangea.core.param_auth module

class pangea.core.param_auth.TokenParamAuthentication[source]

Bases: rest_framework.authentication.TokenAuthentication

authenticate(request)[source]

Authenticate the request and return a two-tuple of (user, token).

pangea.core.permissions module

class pangea.core.permissions.OrganizationPermission[source]

Bases: rest_framework.permissions.BasePermission

Require organization membership in order to modify organization.

has_object_permission(request, view, obj)[source]

Return True if permission is granted, False otherwise.

class pangea.core.permissions.ProjectPermission[source]

Bases: rest_framework.permissions.BasePermission

Require organization membership in order to write to sample group.

has_object_permission(request, view, obj)[source]

Return True if permission is granted, False otherwise.

class pangea.core.permissions.S3ApiKeyPermission[source]

Bases: rest_framework.permissions.BasePermission

Require organization membership in order to do anything with s3 API keys.

has_object_permission(request, view, obj)[source]

Return True if permission is granted, False otherwise.

class pangea.core.permissions.S3BucketPermission[source]

Bases: rest_framework.permissions.BasePermission

Require organization membership in order to do anything with s3 Buckets.

has_object_permission(request, view, obj)[source]

Return True if permission is granted, False otherwise.

class pangea.core.permissions.SampleAnalysisResultFieldPermission[source]

Bases: rest_framework.permissions.BasePermission

Require organization membership in order to write to sample analysis result.

has_object_permission(request, view, obj)[source]

Return True if permission is granted, False otherwise.

class pangea.core.permissions.SampleAnalysisResultPermission[source]

Bases: rest_framework.permissions.BasePermission

Require organization membership in order to write to sample analysis result.

has_object_permission(request, view, obj)[source]

Return True if permission is granted, False otherwise.

class pangea.core.permissions.SampleGroupAnalysisResultFieldPermission[source]

Bases: rest_framework.permissions.BasePermission

Require organization membership in order to write to sample group analysis result.

has_object_permission(request, view, obj)[source]

Return True if permission is granted, False otherwise.

class pangea.core.permissions.SampleGroupAnalysisResultPermission[source]

Bases: rest_framework.permissions.BasePermission

Require organization membership in order to write to sample group analysis result.

has_object_permission(request, view, obj)[source]

Return True if permission is granted, False otherwise.

class pangea.core.permissions.SampleGroupPermission[source]

Bases: rest_framework.permissions.BasePermission

Require organization membership in order to write to sample group.

has_object_permission(request, view, obj)[source]

Return True if permission is granted, False otherwise.

class pangea.core.permissions.SamplePermission[source]

Bases: rest_framework.permissions.BasePermission

Require organization membership in order to write to sample.

has_object_permission(request, view, obj)[source]

Return True if permission is granted, False otherwise.

pangea.core.search module

class pangea.core.search.SearchList(**kwargs)[source]

Bases: rest_framework.views.APIView

get(request, format=None)[source]

pangea.core.search_indexes module

class pangea.core.search_indexes.OrganizationIndex[source]

Bases: haystack.indexes.SearchIndex, haystack.constants.Indexable

fields = {'name': <haystack.fields.CharField object>, 'text': <haystack.fields.CharField object>}
get_model()[source]

Should return the Model class (not an instance) that the rest of the SearchIndex should use.

This method is required & you must override it to return the correct class.

name = <haystack.fields.CharField object>
objects = <haystack.manager.SearchIndexManager object>
text = <haystack.fields.CharField object>
class pangea.core.search_indexes.SampleGroupIndex[source]

Bases: haystack.indexes.SearchIndex, haystack.constants.Indexable

fields = {'name': <haystack.fields.CharField object>, 'text': <haystack.fields.CharField object>}
get_model()[source]

Should return the Model class (not an instance) that the rest of the SearchIndex should use.

This method is required & you must override it to return the correct class.

name = <haystack.fields.CharField object>
objects = <haystack.manager.SearchIndexManager object>
text = <haystack.fields.CharField object>
class pangea.core.search_indexes.SampleIndex[source]

Bases: haystack.indexes.SearchIndex, haystack.constants.Indexable

fields = {'name': <haystack.fields.CharField object>, 'text': <haystack.fields.CharField object>}
get_model()[source]

Should return the Model class (not an instance) that the rest of the SearchIndex should use.

This method is required & you must override it to return the correct class.

name = <haystack.fields.CharField object>
objects = <haystack.manager.SearchIndexManager object>
text = <haystack.fields.CharField object>

pangea.core.serializers module

class pangea.core.serializers.OrganizationAddUserSerializer(instance=None, data=<class 'rest_framework.fields.empty'>, **kwargs)[source]

Bases: rest_framework.serializers.Serializer

class pangea.core.serializers.OrganizationSerializer(instance=None, data=<class 'rest_framework.fields.empty'>, **kwargs)[source]

Bases: rest_framework.serializers.ModelSerializer

class Meta[source]

Bases: object

fields = ('uuid', 'name', 'created_at', 'updated_at', 'core_sample_group_uuid')
model

alias of pangea.core.models.organization.Organization

read_only_fields = ('created_at', 'updated_at', 'core_sample_group_uuid')
class pangea.core.serializers.PangeaUserSerializer(instance=None, data=<class 'rest_framework.fields.empty'>, **kwargs)[source]

Bases: rest_framework.serializers.ModelSerializer

class Meta[source]

Bases: object

fields = ('email', 'is_staff', 'is_active', 'personal_org_uuid')
model

alias of pangea.core.models.organization.PangeaUser

read_only_fields = ('email', 'personal_org_uuid')
class pangea.core.serializers.ProjectAddSampleGroupSerializer(instance=None, data=<class 'rest_framework.fields.empty'>, **kwargs)[source]

Bases: rest_framework.serializers.Serializer

class pangea.core.serializers.ProjectSerializer(instance=None, data=<class 'rest_framework.fields.empty'>, **kwargs)[source]

Bases: rest_framework.serializers.ModelSerializer

class Meta[source]

Bases: object

fields = ('uuid', 'name', 'created_at', 'updated_at', 'organization', 'description', 'organization_obj', 'sample_groups', 'sub_projects')
model

alias of pangea.core.models.project.Project

read_only_fields = ('created_at', 'updated_at', 'organization_obj')
class pangea.core.serializers.S3ApiKeySerializer(instance=None, data=<class 'rest_framework.fields.empty'>, **kwargs)[source]

Bases: rest_framework.serializers.ModelSerializer

class Meta[source]

Bases: object

extra_kwargs = {'private_key': {'write_only': True}}
fields = ('uuid', 'description', 'created_at', 'updated_at', 'bucket', 'public_key', 'private_key')
model

alias of pangea.core.models.s3.S3ApiKey

read_only_fields = ('created_at', 'updated_at', 'uuid')
class pangea.core.serializers.S3BucketSerializer(instance=None, data=<class 'rest_framework.fields.empty'>, **kwargs)[source]

Bases: rest_framework.serializers.ModelSerializer

class Meta[source]

Bases: object

fields = ('uuid', 'name', 'endpoint_url', 'organization')
model

alias of pangea.core.models.s3.S3Bucket

class pangea.core.serializers.SampleAnalysisResultFieldSerializer(instance=None, data=<class 'rest_framework.fields.empty'>, **kwargs)[source]

Bases: rest_framework.serializers.ModelSerializer

class Meta[source]

Bases: object

fields = ('uuid', 'name', 'created_at', 'updated_at', 'stored_data', 'analysis_result', 'analysis_result_obj')
model

alias of pangea.core.models.analysis_result.SampleAnalysisResultField

read_only_fields = ('created_at', 'updated_at', 'analysis_result_obj')
to_representation(instance)[source]

Convert username to lowercase.

class pangea.core.serializers.SampleAnalysisResultSerializer(instance=None, data=<class 'rest_framework.fields.empty'>, **kwargs)[source]

Bases: rest_framework.serializers.ModelSerializer

class Meta[source]

Bases: object

fields = ('uuid', 'module_name', 'replicate', 'sample', 'created_at', 'updated_at', 'sample_obj', 'description', 'metadata')
model

alias of pangea.core.models.analysis_result.SampleAnalysisResult

read_only_fields = ('created_at', 'updated_at', 'sample_obj')
class pangea.core.serializers.SampleGroupAddSampleSerializer(instance=None, data=<class 'rest_framework.fields.empty'>, **kwargs)[source]

Bases: rest_framework.serializers.Serializer

class pangea.core.serializers.SampleGroupAnalysisResultFieldSerializer(instance=None, data=<class 'rest_framework.fields.empty'>, **kwargs)[source]

Bases: rest_framework.serializers.ModelSerializer

class Meta[source]

Bases: object

fields = ('uuid', 'name', 'created_at', 'updated_at', 'stored_data', 'analysis_result', 'analysis_result_obj')
model

alias of pangea.core.models.analysis_result.SampleGroupAnalysisResultField

read_only_fields = ('created_at', 'updated_at', 'analysis_result_obj')
to_representation(instance)[source]

Convert username to lowercase.

class pangea.core.serializers.SampleGroupAnalysisResultSerializer(instance=None, data=<class 'rest_framework.fields.empty'>, **kwargs)[source]

Bases: rest_framework.serializers.ModelSerializer

class Meta[source]

Bases: object

fields = ('uuid', 'module_name', 'replicate', 'sample_group', 'created_at', 'updated_at', 'sample_group_obj', 'description', 'metadata')
model

alias of pangea.core.models.analysis_result.SampleGroupAnalysisResult

read_only_fields = ('created_at', 'updated_at', 'sample_group_obj')
class pangea.core.serializers.SampleGroupSerializer(instance=None, data=<class 'rest_framework.fields.empty'>, **kwargs)[source]

Bases: rest_framework.serializers.ModelSerializer

class Meta[source]

Bases: object

fields = ('uuid', 'name', 'created_at', 'updated_at', 'organization', 'description', 'is_library', 'is_public', 'theme', 'organization_obj', 'long_description', 'metadata')
model

alias of pangea.core.models.sample_group.SampleGroup

read_only_fields = ('created_at', 'updated_at', 'organization_obj')
class pangea.core.serializers.SampleSerializer(instance=None, data=<class 'rest_framework.fields.empty'>, **kwargs)[source]

Bases: rest_framework.serializers.ModelSerializer

class Meta[source]

Bases: object

fields = ('uuid', 'name', 'created_at', 'updated_at', 'library', 'metadata', 'library_obj', 'description')
model

alias of pangea.core.models.sample.Sample

read_only_fields = ('created_at', 'updated_at', 'library_obj')
pangea.core.serializers.presign_ar_field_stored_data_if_appropriate(ret, grp)[source]

Intercept serialization of an analysis result field to add a presigned URL.

At this point we are assuming the user has permission to access this result.

pangea.core.urls module

pangea.core.urls.path(route, view, kwargs=None, name=None, *, Pattern=<class 'django.urls.resolvers.RoutePattern'>)

pangea.core.utils module

pangea.core.utils.random_replicate_name(len=12)[source]

Return a random alphanumeric string of length len.

pangea.core.utils.str2bool(v)[source]

Parse boolean value from string.

Module contents