├── static ├── .gitkeep └── css │ └── main.css ├── gennotes_server ├── __init__.py ├── tests │ ├── __init__.py │ ├── expected_data │ │ ├── relation_create.json │ │ ├── relation_put.json │ │ ├── variant_create.json │ │ ├── relation.json │ │ ├── relation_patch.json │ │ ├── variant.json │ │ ├── variant_patch2.json │ │ ├── variant_put_patch1.json │ │ ├── specified_variant_list.json │ │ ├── relation_list.json │ │ └── variant_list.json │ ├── test_helpers.py │ ├── test_relation.py │ └── test_variant.py ├── management │ ├── __init__.py │ └── commands │ │ ├── __init__.py │ │ └── add_clinvar_data.py ├── migrations │ ├── __init__.py │ ├── 0004_auto_20160318_1926.py │ ├── 0002_add_clinvar_bot_user.py │ ├── 0003_editingapplication.py │ └── 0001_initial.py ├── templates │ ├── account │ │ ├── login.html │ │ ├── signup.html │ │ ├── login-form.html │ │ └── signup-form.html │ ├── gennotes_server │ │ └── home.html │ ├── base.html │ └── api_guide │ │ └── guide.html ├── pagination.py ├── forms.py ├── wsgi.py ├── utils.py ├── permissions.py ├── urls.py ├── models.py ├── settings.py ├── serializers.py ├── views.py └── fixtures │ └── test-data.json ├── Procfile ├── .pep257 ├── bin └── post_compile ├── .gitignore ├── CONTRIBUTORS.txt ├── manage.py ├── requirements.txt ├── LICENSE ├── env.example ├── README.md └── .pylintrc /static/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /gennotes_server/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /gennotes_server/tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /gennotes_server/management/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /gennotes_server/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /gennotes_server/management/commands/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/css/main.css: -------------------------------------------------------------------------------- 1 | /* Add CSS overrides here */ 2 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: gunicorn gennotes_server.wsgi --log-file - 2 | -------------------------------------------------------------------------------- /.pep257: -------------------------------------------------------------------------------- 1 | [pep257] 2 | ignore = D100,D102,D200,D203,D204,D205,D400 3 | -------------------------------------------------------------------------------- /bin/post_compile: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | ./manage.py syncdb --noinput 4 | ./manage.py migrate --noinput 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled python 2 | *.pyc 3 | 4 | # Local files 5 | .env 6 | db.sqlite3 7 | static-files/ 8 | -------------------------------------------------------------------------------- /CONTRIBUTORS.txt: -------------------------------------------------------------------------------- 1 | Chris Ball / @cjb (http://printf.net) 2 | Matej Usaj / @usajusaj (https://github.com/usajusaj) -------------------------------------------------------------------------------- /gennotes_server/templates/account/login.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% block content %} 4 |
9 | Welcome! 10 |
11 | {% else %} 12 | Log in 13 | Create account 14 | {% endif %} 15 | 16 | {% endblock content %} 17 | -------------------------------------------------------------------------------- /gennotes_server/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for gennotes_server project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/1.8/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "gennotes_server.settings") 13 | 14 | from django.core.wsgi import get_wsgi_application 15 | from whitenoise.django import DjangoWhiteNoise 16 | 17 | application = DjangoWhiteNoise(get_wsgi_application()) 18 | -------------------------------------------------------------------------------- /gennotes_server/migrations/0004_auto_20160318_1926.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.4 on 2016-03-18 19:26 3 | from __future__ import unicode_literals 4 | 5 | import django.contrib.postgres.fields.jsonb 6 | from django.db import migrations 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ('gennotes_server', '0003_editingapplication'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AlterField( 17 | model_name='relation', 18 | name='tags', 19 | field=django.contrib.postgres.fields.jsonb.JSONField(), 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /gennotes_server/migrations/0002_add_clinvar_bot_user.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.contrib.auth import get_user_model 5 | from django.db import migrations 6 | 7 | 8 | def add_clinvar_bot_user(apps, schema_editor): 9 | usernames = ['clinvar-data-importer'] 10 | for username in usernames: 11 | get_user_model().objects.get_or_create(username=username) 12 | 13 | 14 | class Migration(migrations.Migration): 15 | 16 | dependencies = [ 17 | ('gennotes_server', '0001_initial'), 18 | ] 19 | 20 | operations = [ 21 | migrations.RunPython(add_clinvar_bot_user), 22 | ] 23 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | Django==1.9.4 2 | PyYAML==3.11 3 | Pygments==2.1.3 4 | argparse==1.2.1 5 | blessings==1.6 6 | bpython==0.15 7 | configparser==3.5.0b2 8 | curtsies==0.2.6 9 | dj-database-url==0.4.0 10 | dj-static==0.0.6 11 | django-allauth==0.25.2 12 | django-braces==1.8.1 13 | django-cors-headers==1.1.0 14 | django-extensions==1.6.1 15 | django-oauth-toolkit==0.10.0 16 | django-rest-swagger==0.3.5 17 | django-reversion==1.10.1 18 | django-sslify==0.2.7 19 | django-toolbelt==0.0.1 20 | djangorestframework==3.3.3 21 | env-tools==2.0.0 22 | greenlet==0.4.9 23 | gunicorn==19.4.5 24 | oauthlib==1.0.3 25 | psycopg2==2.6.1 26 | python-openid==2.2.5 27 | requests==2.9.1 28 | requests-oauthlib==0.6.1 29 | six==1.10.0 30 | static3==0.6.1 31 | tini==3.0.1 32 | wcwidth==0.1.6 33 | whitenoise==2.0.6 34 | wsgiref==0.1.2 35 | -------------------------------------------------------------------------------- /gennotes_server/tests/expected_data/relation.json: -------------------------------------------------------------------------------- 1 | { 2 | "current_version": 11, 3 | "tags": { 4 | "clinvar-rcva:accession": "RCV000116253", 5 | "clinvar-rcva:esp-allele-frequency": "0.014089016971", 6 | "clinvar-rcva:gene-name": "agrin", 7 | "clinvar-rcva:gene-symbol": "AGRN", 8 | "clinvar-rcva:num-submissions": "1", 9 | "clinvar-rcva:preferred-name": "NM_198576.3(AGRN):c.1058A>G (p.Gln353Arg)", 10 | "clinvar-rcva:record-status": "current", 11 | "clinvar-rcva:significance": "Likely benign", 12 | "clinvar-rcva:trait-name": "not specified", 13 | "clinvar-rcva:trait-type": "Disease", 14 | "clinvar-rcva:version": "2", 15 | "type": "clinvar-rcva" 16 | }, 17 | "url": "http://testserver/api/relation/1/", 18 | "variant": "http://testserver/api/variant/10/" 19 | } 20 | -------------------------------------------------------------------------------- /gennotes_server/tests/expected_data/relation_patch.json: -------------------------------------------------------------------------------- 1 | { 2 | "current_version": "Unknown", 3 | "tags": { 4 | "clinvar-rcva:accession": "RCV000116253", 5 | "clinvar-rcva:esp-allele-frequency": "0.014089016971", 6 | "clinvar-rcva:gene-name": "agrin", 7 | "clinvar-rcva:gene-symbol": "AGRN", 8 | "clinvar-rcva:num-submissions": "1", 9 | "clinvar-rcva:preferred-name": "NM_198576.3(AGRN):c.1058A>G (p.Gln353Arg)", 10 | "clinvar-rcva:record-status": "current", 11 | "clinvar-rcva:significance": "Likely benign", 12 | "clinvar-rcva:trait-name": "not specified", 13 | "clinvar-rcva:trait-type": "Disease", 14 | "clinvar-rcva:version": "2", 15 | "comment": "All other tags preserved.", 16 | "type": "clinvar-rcva" 17 | }, 18 | "url": "http://testserver/api/relation/1/", 19 | "variant": "http://testserver/api/variant/10/" 20 | } 21 | -------------------------------------------------------------------------------- /gennotes_server/utils.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from distutils import util 4 | 5 | 6 | def to_bool(env, default='false'): 7 | """ 8 | Convert a string to a bool. 9 | """ 10 | return bool(util.strtobool(os.getenv(env, default))) 11 | 12 | 13 | def map_chrom_to_index(chrom_str): 14 | "Converts chromosome labels to standard GenNotes chromosome index." 15 | if chrom_str.startswith('chr' or 'Chr'): 16 | chrom_str = chrom_str[3:] 17 | if chrom_str.startswith('ch' or 'Ch'): 18 | chrom_str = chrom_str[2:] 19 | try: 20 | return str(int(chrom_str)) 21 | except ValueError: 22 | if chrom_str == 'X': 23 | return '23' 24 | elif chrom_str == 'Y': 25 | return '24' 26 | elif chrom_str in ['M', 'MT']: 27 | return '25' 28 | raise ValueError("Can't determine chromosome for {0}".format(chrom_str)) 29 | -------------------------------------------------------------------------------- /gennotes_server/tests/expected_data/variant.json: -------------------------------------------------------------------------------- 1 | { 2 | "b37_id": "b37-1-883516-G-A", 3 | "current_version": 1, 4 | "relation_set": [ 5 | { 6 | "current_version": 18, 7 | "tags": { 8 | "clinvar-rcva:accession": "RCV000064926", 9 | "clinvar-rcva:gene-name": "nucleolar complex associated 2 homolog (S. cerevisiae)", 10 | "clinvar-rcva:gene-symbol": "NOC2L", 11 | "clinvar-rcva:num-submissions": "1", 12 | "clinvar-rcva:preferred-name": "NM_015658.3(NOC2L):c.1654C>T (p.Leu552=)", 13 | "clinvar-rcva:record-status": "current", 14 | "clinvar-rcva:significance": "not provided", 15 | "clinvar-rcva:trait-name": "Malignant melanoma", 16 | "clinvar-rcva:trait-type": "Disease", 17 | "clinvar-rcva:version": "2", 18 | "type": "clinvar-rcva" 19 | }, 20 | "url": "http://testserver/api/relation/8/", 21 | "variant": "http://testserver/api/variant/1/" 22 | } 23 | ], 24 | "tags": { 25 | "chrom_b37": "1", 26 | "pos_b37": "883516", 27 | "ref_allele_b37": "G", 28 | "var_allele_b37": "A" 29 | }, 30 | "url": "http://testserver/api/variant/1/" 31 | } 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License (Expat) 2 | 3 | Copyright (c) 2015 PersonalGenomes.org and contributors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /gennotes_server/tests/expected_data/variant_patch2.json: -------------------------------------------------------------------------------- 1 | { 2 | "b37_id": "b37-1-883516-G-A", 3 | "current_version": "Unknown", 4 | "relation_set": [ 5 | { 6 | "current_version": "Unknown", 7 | "tags": { 8 | "clinvar-rcva:accession": "RCV000064926", 9 | "clinvar-rcva:gene-name": "nucleolar complex associated 2 homolog (S. cerevisiae)", 10 | "clinvar-rcva:gene-symbol": "NOC2L", 11 | "clinvar-rcva:num-submissions": "1", 12 | "clinvar-rcva:preferred-name": "NM_015658.3(NOC2L):c.1654C>T (p.Leu552=)", 13 | "clinvar-rcva:record-status": "current", 14 | "clinvar-rcva:significance": "not provided", 15 | "clinvar-rcva:trait-name": "Malignant melanoma", 16 | "clinvar-rcva:trait-type": "Disease", 17 | "clinvar-rcva:version": "2", 18 | "type": "clinvar-rcva" 19 | }, 20 | "url": "http://testserver/api/relation/8/", 21 | "variant": "http://testserver/api/variant/1/" 22 | } 23 | ], 24 | "tags": { 25 | "chrom_b37": "1", 26 | "pos_b37": "883516", 27 | "ref_allele_b37": "G", 28 | "test_tag": "test_value_2", 29 | "var_allele_b37": "A" 30 | }, 31 | "url": "http://testserver/api/variant/1/" 32 | } 33 | -------------------------------------------------------------------------------- /gennotes_server/tests/expected_data/variant_put_patch1.json: -------------------------------------------------------------------------------- 1 | { 2 | "b37_id": "b37-1-883516-G-A", 3 | "current_version": "Unknown", 4 | "relation_set": [ 5 | { 6 | "current_version": "Unknown", 7 | "tags": { 8 | "clinvar-rcva:accession": "RCV000064926", 9 | "clinvar-rcva:gene-name": "nucleolar complex associated 2 homolog (S. cerevisiae)", 10 | "clinvar-rcva:gene-symbol": "NOC2L", 11 | "clinvar-rcva:num-submissions": "1", 12 | "clinvar-rcva:preferred-name": "NM_015658.3(NOC2L):c.1654C>T (p.Leu552=)", 13 | "clinvar-rcva:record-status": "current", 14 | "clinvar-rcva:significance": "not provided", 15 | "clinvar-rcva:trait-name": "Malignant melanoma", 16 | "clinvar-rcva:trait-type": "Disease", 17 | "clinvar-rcva:version": "2", 18 | "type": "clinvar-rcva" 19 | }, 20 | "url": "http://testserver/api/relation/8/", 21 | "variant": "http://testserver/api/variant/1/" 22 | } 23 | ], 24 | "tags": { 25 | "chrom_b37": "1", 26 | "pos_b37": "883516", 27 | "ref_allele_b37": "G", 28 | "test_tag": "test_value", 29 | "var_allele_b37": "A" 30 | }, 31 | "url": "http://testserver/api/variant/1/" 32 | } 33 | -------------------------------------------------------------------------------- /gennotes_server/permissions.py: -------------------------------------------------------------------------------- 1 | from rest_framework import permissions 2 | from oauth2_provider.ext.rest_framework.permissions import TokenHasScope 3 | from allauth.account.models import EmailAddress 4 | 5 | 6 | class EditAuthorizedOrReadOnly(TokenHasScope): 7 | """ 8 | Verify permissions for viewing and editing GenNotes Variants and Relations. 9 | - Read only methods: always have permission. (GET, HEAD, OPTIONS) 10 | - Other methods require authorization. 11 | - OAuth2 auth requires: valid token, valid scope, and verified 12 | email address for the target user. 13 | - Other auth require: verified email address for the request.user 14 | """ 15 | def has_permission(self, request, view): 16 | if request.method in permissions.SAFE_METHODS: 17 | return True 18 | else: 19 | if request.auth and hasattr(request.auth, 'scope'): 20 | required_scopes = self.get_scopes(request, view) 21 | token_valid = request.auth.is_valid(required_scopes) 22 | user_verified = EmailAddress.objects.get( 23 | user=request.user).verified 24 | return token_valid and user_verified 25 | if request.user and request.user.is_authenticated(): 26 | # Avoiding try/except; we think this will work for any user. 27 | return EmailAddress.objects.get(user=request.user).verified 28 | 29 | return False 30 | -------------------------------------------------------------------------------- /gennotes_server/urls.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | from django.conf.urls import include, url 3 | from django.conf.urls.static import static 4 | from django.contrib import admin 5 | from django.views.generic import TemplateView 6 | 7 | from rest_framework import routers 8 | 9 | from .views import (CurrentUserView, 10 | EditingAppRegistration, 11 | EditingAppUpdate, 12 | RelationViewSet, 13 | VariantViewSet) 14 | 15 | router = routers.DefaultRouter() 16 | 17 | router.register(r'relation', RelationViewSet) 18 | router.register(r'variant', VariantViewSet) 19 | 20 | urlpatterns = [ 21 | url(r'^admin/', include(admin.site.urls)), 22 | 23 | url(r'^oauth2-app/applications/register', EditingAppRegistration.as_view(), 24 | name='oauth2_provider:register'), 25 | url(r'^oauth2-app/applications/(?P4 | Use the form below to create a GenNotes. You are responsible for edits 5 | contributed to GenNotes from this account. 6 |
7 |Contributions are CC0 by default. Unless otherwise specified 8 | within GenNotes, users of GenNotes agree that their contributions 9 | to GenNotes tags are released as public domain with a CC0 dedication. 10 |
11 |7 | The GenNotes API allows other services to interact with GenNotes to retrieve, 8 | add, and edit the data in the GenNotes database. 9 |
10 | 11 |38 | Data can be retrieving using GET commands. No GenNotes account is needed 39 | to retrieve data. Data is returned in JSON format. 40 |
41 | 42 |43 | Note: The API is intended for programmatic use, e.g. using the Python 44 | 'requests' module. Navigating to these pages in the browser will render 45 | the response within a page layout. To see raw JSON that is returned, you 46 | can access JSON content directly within the browser by adding '.json' to 47 | the end, e.g. 48 |
51 | https://gennotes.herokuapp.com/api/variant/b37-1-40758116-G-A.json
52 |
55 | https://gennotes.herokuapp.com/api/variant.json?variant_list=[%22b37-1-40758105-TTTCTTTTTCAGG-T%22,%22b37-1-40758116-G-A%22]
56 | 64 | An individual variant's data can be retrieved based on build 37 coordinates, 65 | or based on the GenNotes variant ID. 66 |
67 | 68 |69 | Example GET commands: 70 |
71 |
73 | https://gennotes.herokuapp.com/api/variant/b37-1-40758116-G-A/
75 | https://gennotes.herokuapp.com/api/variant/1234/82 | Multiple variants can be retrieved at once by calling `/api/variant/` with 83 | the `variant_list` parameter set to a JSON-formatted list of variant IDs. 84 | (Results are only returned for valid variants; identifiers not matching 85 | variants in GenNotes will silently fail.) 86 |
87 | 88 |89 | Example GET command: 90 |
91 | 95 | 96 |99 | An individual relations's data can be retrieved based on the GenNotes 100 | relation ID. Currently querying multiple relations is not supported. 101 |
102 | 103 |104 | Example GET commands: 105 |
106 |
108 | https://localhost:8000/api/relation/1234/118 | Note: This is not the anticipated method of submitting edits. 119 |
120 |121 | The anticipated method for submitting changes is through apps that you 122 | authorize to submit to GenNotes on your behalf (e.g. Genevieve). However 123 | it is possible to submit directly using your account credentials, using 124 | HTTP Basic Authorization. 125 |
126 |127 | For example, using fake IDs and the Python requests module for a PATCH edit: 128 |
129 |
130 | requests.patch(
131 | 'http://localhost:8000/api/relation/123/',
132 | data=json.dumps({
133 | 'tags': {'example-tag': 'example-value'},
134 | 'commit-comment': 'Adding an example tag using PATCH and HTTP Basic Authorization.'}),
135 | headers={'Content-type': 'application/json'},
136 | auth=('username', 'password'))
137 |
138 |
139 | 142 | A GenNotes account is needed to register an app that will submit edits on 143 | behalf of other GenNotes users. Although you could use any account for this 144 | purpose, you may want to create a separate "non-personal" account for 145 | your OAuth2 app. You may want to do this if, for example, you're setting 146 | up a Genevieve client. 147 |
148 | 149 |150 | Note: if you work with multiple accounts, be careful to check which 151 | account you're logged in to! When you're logged in, your username is 152 | displayed at the top left. 153 |
154 | 155 |156 | Once you have an account, you can 157 | 158 | register a client application here. 159 |
160 | 161 |Example process for getting authorization and access tokens:
162 | 163 |/oauth2-app/authorize?client_id=[client-id-here]&response_type=code
166 | yourdomain.com/path/to/redirect_uri?code=[grant-code]
169 | client_auth = requests.auth.HTTPBasicAuth(client_id, client_secret)
175 | code = [the grant-code you just received]
178 | redirect_uri = [a redirect uri you registered]
182 | token_uri = 'http://gennotes.herokuapp.com/oauth2-app/token/'
186 | response_token = requests.post(token_uri, data={
190 | 'grant_type': 'authorization_code',
191 | 'code': code, 'redirect_uri': redirect_uri}, auth=client_auth)
192 | {'access_token': '1hu94IRBX3da0euOiX0u3E9h',
196 | 'token_type': 'Bearer',
197 | 'expires_in': 36000,
198 | 'refresh_token': 'WSuwoeBO0e9JFHqY7TnpDi7jUjgAex',
199 | 'scope': 'commit-edit'}
200 | refresh_token = response_token.json()['refresh_token']
204 | response_refresh = requests.post(token_uri, data={
205 | 'grant_type': 'refresh_token',
206 | 'refresh_token': refresh_token}, auth=client_auth)
207 | 213 | Once a user has authorized your client app to make edits on their behalf, 214 | you can use a valid access token to submit edits through the API. 215 |
216 | 217 |218 | For example, using fake IDs and the Python requests module for a PATCH edit: 219 |
220 | 221 |
222 | requests.patch(
223 | 'http://localhost:8000/api/relation/123/',
224 | data=json.dumps({
225 | 'tags': {'example-tag-key': 'example-tag-value'},
226 | 'commit-comment': 'Adding an example tag using PATCH and OAuth2 authorization.'}),
227 | headers={'Content-type': 'application/json',
228 | 'Authorization': 'Bearer {}'.format(access_token)})
229 |
230 |
231 | 234 | When you submit an edit using PATCH, the tag keys you include will be 235 | created or replaced with the values you submit. Submitting edits using PATCH 236 | is preferred, as there is less danger of accidentally overwriting information. 237 |
238 | 239 |
240 | For a Variant, a PATCH specifies the following parameters:
241 | 'edited_version', 'tags', and 'commit-comment' (optional).
242 | For a Relation, a PATCH specifies the following parameters:
243 | 'edited_version', 'tags', 'variant' (optional), and
244 | commit-comment (optional).
245 |
248 | Returned: In response, you receive a copy of the updated data for the 249 | object. Unfortunately, the "current_version" will be "Unknown". Due to 250 | how edit versioning is being performed, we're unable to return the version ID 251 | for the updated object in this response. A separate GET will need to be 252 | performed to discover this. 253 |
254 | 255 |256 | Example using fake IDs, the Python requests module and OAuth2 access 257 | token authorization: 258 |
259 | 260 |
261 | requests.patch(
262 | 'http://localhost:8000/api/relation/123/',
263 | data=json.dumps({
264 | 'commit-comment': 'Adding an example tag using PATCH and OAuth2 authorization.'}),
265 | 'edited_version': 456,
266 | 'tags': {'example-tag': 'example-value'},
267 | headers={'Content-type': 'application/json',
268 | 'Authorization': 'Bearer {}'.format(access_token)})
269 |
270 |
271 | 274 | When you submit an edit using PUT, the object becomes redefined with the data 275 | you include. Submitting edits using PUT could be dangerous: by omitting 276 | existing data, you delete it. On the other hand, a PUT edit is the only way 277 | to delete existing tags. 278 |
279 | 280 |
281 | For a Variant, a PUT specifies the following parameters:
282 | 'edited_version', 'tags', and 'commit-comment' (optional).
283 | For a Relation, a PUT specifies the following parameters:
284 | 'edited_version', 'tags', 'variant', and
285 | commit-comment (optional).
286 |
289 | Returned: In response, you receive a copy of the updated data for the 290 | object. Unfortunately, the "current_version" will be "Unknown". Due to 291 | how edit versioning is being performed, we're unable to return the version ID 292 | for the updated object in this response. A separate GET will need to be 293 | performed to discover this. 294 |
295 | 296 |297 | Example using fake IDs, the Python requests module and OAuth2 access 298 | token authorization: 299 |
300 | 301 |
302 | requests.put(
303 | 'http://localhost:8000/api/relation/123/',
304 | data=json.dumps({
305 | 'commit-comment': 'Updating a Relation using PUT and OAuth2 authorization.'
306 | 'edited_version': 456,
307 | 'tags': {
308 | 'example-tag': 'A new example tag, with example value here.',
309 | 'genevieve:notes': 'Some updated notes might also be in here... or maybe we're retaining the original.',
310 | 'genevieve:inheritance': 'recessive',
311 | 'genevieve:trait-name': 'Hemochromatosis',
312 | 'genevieve:clinvar-rcva-list': '["RCV000000028"]',
313 | 'type': 'genevieve',
314 | },
315 | 'variant": "http://testserver/api/variant/789/',
316 | }),
317 | headers={'Content-type': 'application/json',
318 | 'Authorization': 'Bearer {}'.format(access_token)})
319 |
320 |
321 | 324 | The POST method is used to create a new object. This method is only allowed 325 | for Relations. (Currently, new Variants cannot be added to the database via 326 | the API.) 327 |
328 | 329 |330 | For a Relation, a POST specifies the following parameters: 331 | 'edited_version', 'tags', 'variant', and 332 | commit-comment (optional). 333 |
334 | 335 |336 | Returned: In response, you receive a copy of the data for the new 337 | object, including its ID. Unfortunately, the "current_version" will be 338 | "Unknown". Due to how edit versioning is being performed, we're unable to 339 | return the version ID for the updated object in this response. A separate GET 340 | will need to be performed to discover this. 341 |
342 | 343 |344 | Example using fake IDs, the Python requests module and OAuth2 access 345 | token authorization: 346 |
347 | 348 |
349 | requests.post(
350 | 'http://localhost:8000/api/relation/',
351 | data=json.dumps({
352 | 'commit-comment': 'Creating a Relation using POST and OAuth2 authorization.'
353 | 'tags': {
354 | 'genevieve:notes': 'Initial notes here.',
355 | 'genevieve:trait-name': 'Hemochromatosis',
356 | 'type': 'genevieve',
357 | },
358 | 'variant": "http://testserver/api/variant/789/',
359 | }),
360 | headers={'Content-type': 'application/json',
361 | 'Authorization': 'Bearer {}'.format(access_token)})
362 |
363 |
364 | 367 | The DELETE method is used to destroy an object. This method is only allowed 368 | for Relations. (Currently, Variants cannot be removed from the database via 369 | the API.) 370 |
371 | 372 |373 | For a Relation, a DELETE specifies the following parameters: 374 | 'edited_version', commit-comment (optional). 375 |
376 | 377 |378 | Returned: A 204 status is sent in response to a successful DELETE 379 | API call. 380 |
381 | 382 |383 | Example using fake IDs, the Python requests module and OAuth2 access 384 | token authorization: 385 |
386 | 387 |
388 | requests.delete(
389 | 'http://localhost:8000/api/relation/123/',
390 | data=json.dumps({
391 | 'commit-comment': 'Removing a Relation using DELETE and OAuth2 authorization.',
392 | 'edited_version': 456,
393 | }),
394 | headers={'Content-type': 'application/json',
395 | 'Authorization': 'Bearer {}'.format(access_token)})
396 |
397 |
398 |
399 | {% endblock content %}
400 |
--------------------------------------------------------------------------------
/gennotes_server/management/commands/add_clinvar_data.py:
--------------------------------------------------------------------------------
1 | import codecs
2 | import fileinput
3 | from ftplib import FTP
4 | import gzip
5 | import json
6 | import logging
7 | import md5
8 | from optparse import make_option
9 | import os
10 | import re
11 | import shutil
12 | import tempfile
13 |
14 | from django.contrib.auth import get_user_model
15 | from django.core.management.base import BaseCommand, CommandError
16 | from django.db import transaction
17 | import reversion
18 | from vcf2clinvar.clinvar import ClinVarVCFLine
19 |
20 | from gennotes_server.models import Variant, Relation
21 | from gennotes_server.utils import map_chrom_to_index
22 |
23 | try:
24 | # faster implementation using bindings to libxml
25 | from lxml import etree as ET
26 | except ImportError:
27 | logging.info('Falling back to default ElementTree implementation')
28 | from xml.etree import ElementTree as ET
29 |
30 | CV_VCF_DIR = 'pub/clinvar/vcf_GRCh37'
31 | CV_XML_DIR = 'pub/clinvar/xml'
32 |
33 | CV_VCF_REGEX = r'^clinvar_[0-9]{8}.vcf.gz$'
34 | CV_XML_REGEX = r'^ClinVarFullRelease_[0-9]{4}-[0-9]{2}.xml.gz$'
35 |
36 | SPLITTER = re.compile('[,|]')
37 |
38 | # Keep track of tags used for ReferenceClinVarAssertion data. Tags are keys.
39 | # Values are tuples of (variable-type, function); during parsing the function
40 | # is applied to that variable type to retrieve corresponding data from the XML.
41 | RCVA_DATA = {
42 | 'type':
43 | (None, lambda: 'clinvar-rcva'),
44 | 'clinvar-rcva:accession':
45 | ('rcva', lambda rcva: rcva.find('ClinVarAccession').get('Acc')),
46 | 'clinvar-rcva:version':
47 | ('rcva', lambda rcva: rcva.find('ClinVarAccession').get('Version')),
48 | 'clinvar-rcva:trait-name':
49 | ('rcva', lambda rcva: rcva.findtext(
50 | 'TraitSet/Trait/Name/ElementValue[@Type="Preferred"]')),
51 | 'clinvar-rcva:trait-type':
52 | ('rcva', lambda rcva: rcva.find(
53 | 'TraitSet/Trait/Name/ElementValue[@Type="Preferred"]/../..'
54 | ).get('Type')),
55 | 'clinvar-rcva:significance':
56 | ('rcva', lambda rcva: rcva.findtext(
57 | 'ClinicalSignificance/Description')),
58 | 'clinvar-rcva:num-submissions':
59 | ('ele', lambda ele: str(len(ele.findall('ClinVarAssertion')))),
60 | 'clinvar-rcva:record-status':
61 | ('rcva', lambda rcva: rcva.findtext('RecordStatus')),
62 | 'clinvar-rcva:gene-name':
63 | ('rcva', lambda rcva: rcva.find(
64 | 'MeasureSet/Measure/MeasureRelationship'
65 | '[@Type="variant in gene"]').findtext('Name/ElementValue')),
66 | 'clinvar-rcva:gene-symbol':
67 | ('rcva', lambda rcva: rcva.find(
68 | 'MeasureSet/Measure/MeasureRelationship'
69 | '[@Type="variant in gene"]').findtext('Symbol/ElementValue')),
70 | 'clinvar-rcva:citations':
71 | ('rcva', lambda rcva:
72 | ';'.join(['PMID%s' % c.text for c in rcva.findall(
73 | 'MeasureSet/Measure/Citation/ID[@Source="PubMed"]')])),
74 | 'clinvar-rcva:esp-allele-frequency':
75 | ('rcva', lambda rcva:
76 | # Using list comprehension to enable conditional wo/ separate fxn
77 | [xref.findtext('../Attribute[@Type="AlleleFrequency"]') if xref is
78 | not None else None for xref in [
79 | rcva.find('MeasureSet/Measure/AttributeSet/XRef[@DB=' +
80 | '"NHLBI GO Exome Sequencing Project (ESP)"]')]][0]),
81 | 'clinvar-rcva:preferred-name':
82 | ('rcva', lambda rcva: rcva.findtext(
83 | 'MeasureSet[@Type="Variant"]/Measure/Name/' +
84 | 'ElementValue[@Type="Preferred"]')),
85 | }
86 |
87 |
88 | class Command(BaseCommand):
89 | help = 'Download latest ClinVar VCF, import variants not already in db.'
90 |
91 | option_list = BaseCommand.option_list + (
92 | make_option('-c', '--local-vcf',
93 | dest='local_vcf',
94 | help='Open local ClinVar VCF file'),
95 | make_option('-x', '--local-xml',
96 | dest='local_xml',
97 | help='Open local ClinVar XML file'),
98 | make_option('-n', '--num-vars',
99 | dest='max_num',
100 | help="Maximum number of variants to store in db.")
101 | )
102 |
103 | def _hash_xml_dict(self, d):
104 | return md5.md5(json.dumps(
105 | [(k, d.get(k, '')) for k in RCVA_DATA.keys()])).hexdigest()
106 |
107 | def _get_elements(self, fp, tag):
108 | '''
109 | Convenience and memory management function
110 | that iterates required tags
111 | '''
112 | context = iter(ET.iterparse(fp, events=('start', 'end')))
113 | _, root = next(context) # get root element
114 | for event, elem in context:
115 | if event == 'end' and elem.tag == tag:
116 | yield elem
117 | root.clear() # preserve memory
118 |
119 | def _open(self, fp):
120 | if 'xml' in fp:
121 | return fileinput.hook_compressed(fp, 'r')
122 |
123 | if fp.endswith('.gz'):
124 | reader = codecs.getreader("utf-8")
125 | return reader(gzip.open(fp))
126 | return codecs.open(fp, encoding='utf-8', mode='r')
127 |
128 | def _download_latest_clinvar(self, dest_dir):
129 | ftp = FTP('ftp.ncbi.nlm.nih.gov')
130 | ftp.login()
131 | ftp.cwd(CV_VCF_DIR)
132 | cv_vcf_w_date = [f for f in ftp.nlst() if re.match(CV_VCF_REGEX, f)]
133 | if len(cv_vcf_w_date) != 1:
134 | raise CommandError('ClinVar reporting more than one VCF matching' +
135 | ' regex: \'{0}\' in directory {1}'.format(
136 | CV_VCF_REGEX, CV_VCF_DIR))
137 | ftp_vcf_filename = cv_vcf_w_date[0]
138 | dest_filepath = os.path.join(dest_dir, ftp_vcf_filename)
139 | with open(dest_filepath, 'w') as fh:
140 | ftp.retrbinary('RETR {0}'.format(ftp_vcf_filename), fh.write)
141 | return dest_filepath, ftp_vcf_filename
142 |
143 | def _download_latest_clinvar_xml(self, dest_dir):
144 | ftp = FTP('ftp.ncbi.nlm.nih.gov')
145 | ftp.login()
146 | ftp.cwd(CV_XML_DIR)
147 | # sort just in case the ftp lists the files in random order
148 | cv_xml_w_date = sorted(
149 | [f for f in ftp.nlst() if re.match(CV_XML_REGEX, f)])
150 | if len(cv_xml_w_date) == 0:
151 | raise CommandError('ClinVar reporting zero XML matching' +
152 | ' regex: \'{0}\' in directory {1}'.format(
153 | CV_XML_REGEX, CV_XML_DIR))
154 | ftp_xml_filename = cv_xml_w_date[-1]
155 | dest_filepath = os.path.join(dest_dir, ftp_xml_filename)
156 | with open(dest_filepath, 'w') as fh:
157 | ftp.retrbinary('RETR {0}'.format(ftp_xml_filename), fh.write)
158 | return dest_filepath, ftp_xml_filename
159 |
160 | @transaction.atomic()
161 | @reversion.create_revision()
162 | def _save_as_revision(self, object_list, user, comment):
163 | for object in object_list:
164 | object.save()
165 | reversion.set_user(user=user)
166 | reversion.set_comment(comment=comment)
167 |
168 | def handle(self, local_vcf=None, local_xml=None, max_num=None, *args, **options):
169 | # The clinvar_user will be recorded as the editor by reversion.
170 | logging.basicConfig(level=logging.INFO,
171 | format='%(asctime)s - %(message)s')
172 | clinvar_user = get_user_model().objects.get(
173 | username='clinvar-data-importer')
174 |
175 | # Store objects that need to be saved (created or updated) to db.
176 | # These are saved in a separate function so they're represented as
177 | # different Revisions (sets of changes) in django-reversion.
178 | variants_new = []
179 | relations_new = []
180 | relations_updated = []
181 |
182 | # Load ClinVar VCF.
183 | logging.info('Loading ClinVar VCF file...')
184 | if not (local_vcf and local_xml):
185 | tempdir = tempfile.mkdtemp()
186 | logging.info('Created tempdir {}'.format(tempdir))
187 | if local_vcf:
188 | cv_fp, vcf_filename = local_vcf, os.path.split(local_vcf)[-1]
189 | else:
190 | cv_fp, vcf_filename = self._download_latest_clinvar(tempdir)
191 | logging.info('Loaded Clinvar VCF, stored at {}'.format(cv_fp))
192 |
193 | logging.info('Caching existing variants with build 37 lookup info.')
194 | variant_map = {(
195 | v.tags['chrom-b37'],
196 | v.tags['pos-b37'],
197 | v.tags['ref-allele-b37'],
198 | v.tags['var-allele-b37']): v for v in Variant.objects.all() if
199 | 'chrom-b37' in v.tags and
200 | 'pos-b37' in v.tags and
201 | 'ref-allele-b37' in v.tags and
202 | 'var-allele-b37' in v.tags}
203 |
204 | # Dict to track ClinVar RCV records in VCF and corresponding Variants.
205 | # Key: RCV accession number. Value: set of tuples of values for Variant
206 | # tags: ('chrom-b37', 'pos-b37', 'ref-allele-b37', 'var-allele-b37')
207 | rcv_map = {}
208 |
209 | logging.info('Done caching variants. Reading VCF.')
210 | clinvar_vcf = self._open(cv_fp)
211 |
212 | # Add Variants if they have ClinVar data. Variants are initially added
213 | # only with the build 37 position information from the VCF.
214 | num_vars = 0
215 | for line in clinvar_vcf:
216 | if line.startswith('#'):
217 | continue
218 |
219 | # Useful for generating small dataset for our testing fixture.
220 | num_vars += 1
221 | if max_num and num_vars > int(max_num):
222 | break
223 |
224 | # Parse ClinVar information using vcf2clinvar.
225 | cvvl = ClinVarVCFLine(vcf_line=line).as_dict()
226 | data = line.rstrip('\n').split('\t')
227 |
228 | # Get build 37 position information.
229 | chrom = map_chrom_to_index(data[0])
230 | pos = data[1]
231 | ref_allele = data[3]
232 | var_alleles = data[4].split(',')
233 | all_alleles = [ref_allele] + var_alleles
234 | info_dict = {v[0]: v[1] for v in
235 | [x.split('=') for x in data[7].split(';')]
236 | if len(v) == 2}
237 |
238 | for allele in info_dict['CLNALLE'].split(','):
239 | # Check if we already have this Variant. If not, add it.
240 | var_allele = all_alleles[int(allele)]
241 | var_key = (chrom, pos, ref_allele, var_allele)
242 | if var_key not in variant_map:
243 | # logging.info('Inserting new Variant'
244 | # '{}, {}, {}, {}'.format(*var_key))
245 | variant = Variant(tags={
246 | 'chrom-b37': chrom,
247 | # Check pos is a valid int before adding.
248 | 'pos-b37': str(int(pos)),
249 | 'ref-allele-b37': ref_allele,
250 | 'var-allele-b37': var_allele})
251 | variants_new.append(variant)
252 | variant_map[var_key] = variant
253 |
254 | # Keep track of RCV Assertion IDs we encounter, we'll add later
255 | for record in cvvl['alleles'][int(allele)].get('records', []):
256 | rcv_acc, _ = record['acc'].split('.')
257 | rcv_map.setdefault(
258 | rcv_acc, set()).add(var_key)
259 |
260 | # Close VCF, save new variants to db bundled revisions of 10k or less.
261 | clinvar_vcf.close()
262 | logging.info('VCF closed. Now adding {} new variants to db.'.format(
263 | len(variants_new)))
264 | for i in range(1 + int(len(variants_new) / 10000)):
265 | variants_subset = variants_new[i * 10000: (i + 1) * 10000]
266 | if len(variants_subset) == 0:
267 | break
268 | logging.info('Adding {} through {} to db...'.format(
269 | 1 + i * 10000, i * 10000 + len(variants_subset)))
270 | self._save_as_revision(
271 | object_list=variants_subset,
272 | user=clinvar_user,
273 | comment='Variant added based on presence in ClinVar ' +
274 | 'VCF file: {}'.format(vcf_filename))
275 |
276 | # print 'Multiple variants for single RCV Assertion ID:'
277 | # for k, v in rcv_map.iteritems():
278 | # if len(v) > 1:
279 | # print '\t', k[0], v
280 |
281 | # Load ClinVar XML file.
282 | logging.info('Loading latest ClinVar XML...')
283 | if local_xml:
284 | cv_fp, xml_filename = local_xml, os.path.split(local_xml)[-1]
285 | else:
286 | cv_fp, xml_filename = self._download_latest_clinvar_xml(tempdir)
287 | logging.info('Loaded latest Clinvar XML, stored at {}'.format(cv_fp))
288 |
289 | logging.info('Caching existing clinvar-rcva Relations by accession')
290 | rcv_hash_cache = {
291 | rel.tags['clinvar-rcva:accession']:
292 | (rel.id, self._hash_xml_dict(rel.tags)) for
293 | rel in Relation.objects.filter(
294 | **{'tags__type': RCVA_DATA['type'][1]()})}
295 |
296 | logging.info('Reading XML, parsing each ClinVarSet')
297 | clinvar_xml = self._open(cv_fp)
298 |
299 | for ele in self._get_elements(clinvar_xml, 'ClinVarSet'):
300 | # Retrieve Reference ClinVar Assertion (RCVA) data.
301 | # Each RCV Assertion is intended to represent a single phenotype,
302 | # and may contain multiple Submitter ClinVar Assertions.
303 | # Each Variant may have multiple associated RCVA accessions.
304 | # Discrepencies in phenotype labeling by SCVAs can lead to multiple
305 | # RCVAs which should theoretically be merged.
306 | rcva = ele.find('ReferenceClinVarAssertion')
307 | rcv_acc = rcva.find('ClinVarAccession').get('Acc')
308 |
309 | if rcv_acc not in rcv_map:
310 | # We do not have a record of this RCV from VCF, skip parsing...
311 | continue
312 |
313 | if len(rcv_map[rcv_acc]) != 1:
314 | # either no or too many variations for this RCV
315 | continue
316 |
317 | # Use the functions in RCVA_DATA to retrieve data for tags.
318 | val_store = dict()
319 | for rcva_key in RCVA_DATA:
320 | variable_type = RCVA_DATA[rcva_key][0]
321 | try:
322 | if not variable_type:
323 | value = RCVA_DATA[rcva_key][1]()
324 | elif variable_type == 'ele':
325 | value = RCVA_DATA[rcva_key][1](ele)
326 | elif variable_type == 'rcva':
327 | value = RCVA_DATA[rcva_key][1](rcva)
328 | except AttributeError:
329 | # Some retrieval functions are chained and the parent elem
330 | # isn't present. In that case, the data doesn't exist.
331 | value = None
332 | if value:
333 | val_store[rcva_key] = value
334 |
335 | # Get the hash of this data.
336 | xml_hash = self._hash_xml_dict(val_store)
337 |
338 | if rcv_acc not in rcv_hash_cache:
339 | # We got a brand new record
340 | rel = Relation(variant=variant_map[list(rcv_map[rcv_acc])[0]],
341 | tags=val_store)
342 | relations_new.append(rel)
343 | rcv_hash_cache[rcv_acc] = (rel.pk, xml_hash)
344 |
345 | # TODO: set HGVS tag in Variant
346 |
347 | # logging.info('Added new RCVA, accession: {}, {}'.format(
348 | # rcv_acc, str(val_store)))
349 | elif rcv_hash_cache[rcv_acc][1] != xml_hash:
350 | # XML parameters have changed, update required
351 | rel = Relation.objects.get(id=rcv_hash_cache[rcv_acc][0])
352 | rel.tags.update(val_store)
353 | relations_updated.append(rel)
354 | # logging.info('Need to update accession {} with: {}'.format(
355 | # rcv_acc, str(val_store)))
356 | else:
357 | # nothing to do here, move along
358 | pass
359 |
360 | clinvar_xml.close()
361 |
362 | logging.info('ClinVar XML closed. Now adding {}'.format(
363 | str(len(relations_new))) + ' new clinvar-rcva Relations to db.')
364 | for i in range(1 + int(len(relations_new) / 10000)):
365 | relations_subset = relations_new[i * 10000: (i + 1) * 10000]
366 | if len(relations_subset) == 0:
367 | break
368 | logging.info('Adding {} through {} to db...'.format(
369 | 1 + i * 10000, i * 10000 + len(relations_subset)))
370 | self._save_as_revision(
371 | object_list=relations_subset,
372 | user=clinvar_user,
373 | comment='Relation added based on presence in ClinVar ' +
374 | 'XML file: {}'.format(xml_filename))
375 |
376 | logging.info('Updating {} clinvar-rcva Relations in db.'.format(
377 | str(len(relations_updated))))
378 | for i in range(1 + int(len(relations_updated) / 10000)):
379 | relations_subset = relations_updated[i * 10000: (i + 1) * 10000]
380 | if len(relations_subset) == 0:
381 | break
382 | logging.info('Adding {} through {} to db...'.format(
383 | 1 + i * 10000, i * 10000 + len(relations_subset)))
384 | self._save_as_revision(
385 | object_list=relations_subset,
386 | user=clinvar_user,
387 | comment='Relation updated based on updated data detected in ' +
388 | 'ClinVar XML file: {}'.format(xml_filename))
389 |
390 | if not (local_vcf and local_xml):
391 | shutil.rmtree(tempdir)
392 | logging.info('Removed tempdir {}'.format(tempdir))
393 |
--------------------------------------------------------------------------------
/gennotes_server/fixtures/test-data.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "model": "contenttypes.contenttype",
4 | "fields": {
5 | "app_label": "admin",
6 | "model": "logentry"
7 | }
8 | },
9 | {
10 | "model": "contenttypes.contenttype",
11 | "fields": {
12 | "app_label": "auth",
13 | "model": "permission"
14 | }
15 | },
16 | {
17 | "model": "contenttypes.contenttype",
18 | "fields": {
19 | "app_label": "auth",
20 | "model": "group"
21 | }
22 | },
23 | {
24 | "model": "contenttypes.contenttype",
25 | "fields": {
26 | "app_label": "auth",
27 | "model": "user"
28 | }
29 | },
30 | {
31 | "model": "contenttypes.contenttype",
32 | "fields": {
33 | "app_label": "contenttypes",
34 | "model": "contenttype"
35 | }
36 | },
37 | {
38 | "model": "contenttypes.contenttype",
39 | "fields": {
40 | "app_label": "sessions",
41 | "model": "session"
42 | }
43 | },
44 | {
45 | "model": "contenttypes.contenttype",
46 | "fields": {
47 | "app_label": "sites",
48 | "model": "site"
49 | }
50 | },
51 | {
52 | "model": "contenttypes.contenttype",
53 | "fields": {
54 | "app_label": "gennotes_server",
55 | "model": "variant"
56 | }
57 | },
58 | {
59 | "model": "contenttypes.contenttype",
60 | "fields": {
61 | "app_label": "gennotes_server",
62 | "model": "relation"
63 | }
64 | },
65 | {
66 | "model": "contenttypes.contenttype",
67 | "fields": {
68 | "app_label": "gennotes_server",
69 | "model": "commitdeletion"
70 | }
71 | },
72 | {
73 | "model": "contenttypes.contenttype",
74 | "fields": {
75 | "app_label": "gennotes_server",
76 | "model": "editingapplication"
77 | }
78 | },
79 | {
80 | "model": "contenttypes.contenttype",
81 | "fields": {
82 | "app_label": "account",
83 | "model": "emailaddress"
84 | }
85 | },
86 | {
87 | "model": "contenttypes.contenttype",
88 | "fields": {
89 | "app_label": "account",
90 | "model": "emailconfirmation"
91 | }
92 | },
93 | {
94 | "model": "contenttypes.contenttype",
95 | "fields": {
96 | "app_label": "corsheaders",
97 | "model": "corsmodel"
98 | }
99 | },
100 | {
101 | "model": "contenttypes.contenttype",
102 | "fields": {
103 | "app_label": "oauth2_provider",
104 | "model": "grant"
105 | }
106 | },
107 | {
108 | "model": "contenttypes.contenttype",
109 | "fields": {
110 | "app_label": "oauth2_provider",
111 | "model": "accesstoken"
112 | }
113 | },
114 | {
115 | "model": "contenttypes.contenttype",
116 | "fields": {
117 | "app_label": "oauth2_provider",
118 | "model": "refreshtoken"
119 | }
120 | },
121 | {
122 | "model": "contenttypes.contenttype",
123 | "fields": {
124 | "app_label": "reversion",
125 | "model": "revision"
126 | }
127 | },
128 | {
129 | "model": "contenttypes.contenttype",
130 | "fields": {
131 | "app_label": "reversion",
132 | "model": "version"
133 | }
134 | },
135 | {
136 | "model": "sessions.session",
137 | "pk": "evnty9e24hvj74yvanhgetaes4hre19h",
138 | "fields": {
139 | "session_data": "NDc1NTRkM2JmY2MxY2U0ZDM5Y2M0NTg0NGQ0MjM1ODQzZmY2ZGI5MDp7fQ==",
140 | "expire_date": "2015-07-18T20:53:27.085Z"
141 | }
142 | },
143 | {
144 | "model": "sessions.session",
145 | "pk": "r13jvm8ize1bx44l9i3nkfqtb7i3ttnu",
146 | "fields": {
147 | "session_data": "OWEzMGY5OGJmZDI1OGFlYzBjMWQ3ZGZiZWE3MWIwMmE4ZDAyMmQ5ZTp7Il9hdXRoX3VzZXJfaGFzaCI6IjYzMzhmZDQ3YzM4ZjVlZTlkMTY3YjY3ZTIxZDFkYjgzMmE3NDdiNjQiLCJfYXV0aF91c2VyX2JhY2tlbmQiOiJhbGxhdXRoLmFjY291bnQuYXV0aF9iYWNrZW5kcy5BdXRoZW50aWNhdGlvbkJhY2tlbmQiLCJfYXV0aF91c2VyX2lkIjoiMiIsImFjY291bnRfdmVyaWZpZWRfZW1haWwiOm51bGx9",
148 | "expire_date": "2015-07-18T23:54:38.559Z"
149 | }
150 | },
151 | {
152 | "model": "sites.site",
153 | "pk": 1,
154 | "fields": {
155 | "domain": "example.com",
156 | "name": "example.com"
157 | }
158 | },
159 | {
160 | "model": "gennotes_server.variant",
161 | "pk": 1,
162 | "fields": {
163 | "tags": "{\"pos_b37\": \"883516\", \"var_allele_b37\": \"A\", \"ref_allele_b37\": \"G\", \"chrom_b37\": \"1\"}"
164 | }
165 | },
166 | {
167 | "model": "gennotes_server.variant",
168 | "pk": 2,
169 | "fields": {
170 | "tags": "{\"pos_b37\": \"891344\", \"var_allele_b37\": \"A\", \"ref_allele_b37\": \"G\", \"chrom_b37\": \"1\"}"
171 | }
172 | },
173 | {
174 | "model": "gennotes_server.variant",
175 | "pk": 3,
176 | "fields": {
177 | "tags": "{\"pos_b37\": \"906168\", \"var_allele_b37\": \"A\", \"ref_allele_b37\": \"G\", \"chrom_b37\": \"1\"}"
178 | }
179 | },
180 | {
181 | "model": "gennotes_server.variant",
182 | "pk": 4,
183 | "fields": {
184 | "tags": "{\"pos_b37\": \"949523\", \"var_allele_b37\": \"T\", \"ref_allele_b37\": \"C\", \"chrom_b37\": \"1\"}"
185 | }
186 | },
187 | {
188 | "model": "gennotes_server.variant",
189 | "pk": 5,
190 | "fields": {
191 | "tags": "{\"pos_b37\": \"949696\", \"var_allele_b37\": \"CG\", \"ref_allele_b37\": \"C\", \"chrom_b37\": \"1\"}"
192 | }
193 | },
194 | {
195 | "model": "gennotes_server.variant",
196 | "pk": 6,
197 | "fields": {
198 | "tags": "{\"pos_b37\": \"949739\", \"var_allele_b37\": \"T\", \"ref_allele_b37\": \"G\", \"chrom_b37\": \"1\"}"
199 | }
200 | },
201 | {
202 | "model": "gennotes_server.variant",
203 | "pk": 7,
204 | "fields": {
205 | "tags": "{\"pos_b37\": \"955597\", \"var_allele_b37\": \"T\", \"ref_allele_b37\": \"G\", \"chrom_b37\": \"1\"}"
206 | }
207 | },
208 | {
209 | "model": "gennotes_server.variant",
210 | "pk": 8,
211 | "fields": {
212 | "tags": "{\"pos_b37\": \"957640\", \"var_allele_b37\": \"T\", \"ref_allele_b37\": \"C\", \"chrom_b37\": \"1\"}"
213 | }
214 | },
215 | {
216 | "model": "gennotes_server.variant",
217 | "pk": 9,
218 | "fields": {
219 | "tags": "{\"pos_b37\": \"976629\", \"var_allele_b37\": \"T\", \"ref_allele_b37\": \"C\", \"chrom_b37\": \"1\"}"
220 | }
221 | },
222 | {
223 | "model": "gennotes_server.variant",
224 | "pk": 10,
225 | "fields": {
226 | "tags": "{\"pos_b37\": \"976963\", \"var_allele_b37\": \"G\", \"ref_allele_b37\": \"A\", \"chrom_b37\": \"1\"}"
227 | }
228 | },
229 | {
230 | "model": "gennotes_server.relation",
231 | "pk": 1,
232 | "fields": {
233 | "variant": 10,
234 | "tags": {
235 | "clinvar-rcva:record-status": "current",
236 | "clinvar-rcva:num-submissions": "1",
237 | "clinvar-rcva:trait-type": "Disease",
238 | "clinvar-rcva:preferred-name": "NM_198576.3(AGRN):c.1058A>G (p.Gln353Arg)",
239 | "clinvar-rcva:significance": "Likely benign",
240 | "clinvar-rcva:version": "2",
241 | "clinvar-rcva:gene-name": "agrin",
242 | "clinvar-rcva:accession": "RCV000116253",
243 | "clinvar-rcva:gene-symbol": "AGRN",
244 | "clinvar-rcva:esp-allele-frequency": "0.014089016971",
245 | "clinvar-rcva:trait-name": "not specified",
246 | "type": "clinvar-rcva"
247 | }
248 | }
249 | },
250 | {
251 | "model": "gennotes_server.relation",
252 | "pk": 2,
253 | "fields": {
254 | "variant": 7,
255 | "tags": {
256 | "clinvar-rcva:record-status": "current",
257 | "clinvar-rcva:num-submissions": "1",
258 | "clinvar-rcva:trait-type": "Disease",
259 | "clinvar-rcva:preferred-name": "NM_198576.3(AGRN):c.45G>T (p.Pro15=)",
260 | "clinvar-rcva:significance": "Likely benign",
261 | "clinvar-rcva:version": "2",
262 | "clinvar-rcva:gene-name": "agrin",
263 | "clinvar-rcva:accession": "RCV000116272",
264 | "clinvar-rcva:gene-symbol": "AGRN",
265 | "clinvar-rcva:trait-name": "not specified",
266 | "type": "clinvar-rcva"
267 | }
268 | }
269 | },
270 | {
271 | "model": "gennotes_server.relation",
272 | "pk": 3,
273 | "fields": {
274 | "variant": 8,
275 | "tags": {
276 | "clinvar-rcva:record-status": "current",
277 | "clinvar-rcva:num-submissions": "1",
278 | "clinvar-rcva:trait-type": "Disease",
279 | "clinvar-rcva:preferred-name": "NM_198576.3(AGRN):c.261C>T (p.Asp87=)",
280 | "clinvar-rcva:significance": "Likely benign",
281 | "clinvar-rcva:version": "2",
282 | "clinvar-rcva:gene-name": "agrin",
283 | "clinvar-rcva:accession": "RCV000116258",
284 | "clinvar-rcva:gene-symbol": "AGRN",
285 | "clinvar-rcva:esp-allele-frequency": "0.031754574812",
286 | "clinvar-rcva:trait-name": "not specified",
287 | "type": "clinvar-rcva"
288 | }
289 | }
290 | },
291 | {
292 | "model": "gennotes_server.relation",
293 | "pk": 4,
294 | "fields": {
295 | "variant": 9,
296 | "tags": {
297 | "clinvar-rcva:record-status": "current",
298 | "clinvar-rcva:num-submissions": "1",
299 | "clinvar-rcva:trait-type": "Disease",
300 | "clinvar-rcva:preferred-name": "NM_198576.3(AGRN):c.804C>T (p.Ala268=)",
301 | "clinvar-rcva:significance": "Benign",
302 | "clinvar-rcva:version": "1",
303 | "clinvar-rcva:gene-name": "agrin",
304 | "clinvar-rcva:accession": "RCV000116282",
305 | "clinvar-rcva:gene-symbol": "AGRN",
306 | "clinvar-rcva:trait-name": "not specified",
307 | "type": "clinvar-rcva"
308 | }
309 | }
310 | },
311 | {
312 | "model": "gennotes_server.relation",
313 | "pk": 5,
314 | "fields": {
315 | "variant": 6,
316 | "tags": {
317 | "clinvar-rcva:record-status": "current",
318 | "clinvar-rcva:num-submissions": "1",
319 | "clinvar-rcva:trait-type": "Disease",
320 | "clinvar-rcva:preferred-name": "NM_005101.3(ISG15):c.379G>T (p.Glu127Ter)",
321 | "clinvar-rcva:significance": "Pathogenic",
322 | "clinvar-rcva:version": "4",
323 | "clinvar-rcva:gene-name": "ISG15 ubiquitin-like modifier",
324 | "clinvar-rcva:accession": "RCV000148988",
325 | "clinvar-rcva:gene-symbol": "ISG15",
326 | "clinvar-rcva:trait-name": "Immunodeficiency 38",
327 | "type": "clinvar-rcva"
328 | }
329 | }
330 | },
331 | {
332 | "model": "gennotes_server.relation",
333 | "pk": 6,
334 | "fields": {
335 | "variant": 5,
336 | "tags": {
337 | "clinvar-rcva:record-status": "current",
338 | "clinvar-rcva:num-submissions": "1",
339 | "clinvar-rcva:trait-type": "Disease",
340 | "clinvar-rcva:preferred-name": "NM_005101.3(ISG15):c.339dupG (p.Leu114Alafs)",
341 | "clinvar-rcva:significance": "Pathogenic",
342 | "clinvar-rcva:citations": "PMID22859821",
343 | "clinvar-rcva:version": "4",
344 | "clinvar-rcva:gene-name": "ISG15 ubiquitin-like modifier",
345 | "clinvar-rcva:accession": "RCV000148989",
346 | "clinvar-rcva:gene-symbol": "ISG15",
347 | "clinvar-rcva:trait-name": "Immunodeficiency 38",
348 | "type": "clinvar-rcva"
349 | }
350 | }
351 | },
352 | {
353 | "model": "gennotes_server.relation",
354 | "pk": 7,
355 | "fields": {
356 | "variant": 4,
357 | "tags": {
358 | "clinvar-rcva:record-status": "current",
359 | "clinvar-rcva:num-submissions": "1",
360 | "clinvar-rcva:trait-type": "Disease",
361 | "clinvar-rcva:preferred-name": "NM_005101.3(ISG15):c.163C>T (p.Gln55Ter)",
362 | "clinvar-rcva:significance": "Pathogenic",
363 | "clinvar-rcva:version": "2",
364 | "clinvar-rcva:gene-name": "ISG15 ubiquitin-like modifier",
365 | "clinvar-rcva:accession": "RCV000162196",
366 | "clinvar-rcva:gene-symbol": "ISG15",
367 | "clinvar-rcva:trait-name": "Immunodeficiency 38",
368 | "type": "clinvar-rcva"
369 | }
370 | }
371 | },
372 | {
373 | "model": "gennotes_server.relation",
374 | "pk": 8,
375 | "fields": {
376 | "variant": 1,
377 | "tags": {
378 | "clinvar-rcva:record-status": "current",
379 | "clinvar-rcva:num-submissions": "1",
380 | "clinvar-rcva:trait-type": "Disease",
381 | "clinvar-rcva:preferred-name": "NM_015658.3(NOC2L):c.1654C>T (p.Leu552=)",
382 | "clinvar-rcva:significance": "not provided",
383 | "clinvar-rcva:version": "2",
384 | "clinvar-rcva:gene-name": "nucleolar complex associated 2 homolog (S. cerevisiae)",
385 | "clinvar-rcva:accession": "RCV000064926",
386 | "clinvar-rcva:gene-symbol": "NOC2L",
387 | "clinvar-rcva:trait-name": "Malignant melanoma",
388 | "type": "clinvar-rcva"
389 | }
390 | }
391 | },
392 | {
393 | "model": "gennotes_server.relation",
394 | "pk": 9,
395 | "fields": {
396 | "variant": 2,
397 | "tags": {
398 | "clinvar-rcva:record-status": "current",
399 | "clinvar-rcva:num-submissions": "1",
400 | "clinvar-rcva:trait-type": "Disease",
401 | "clinvar-rcva:preferred-name": "NM_015658.3(NOC2L):c.657C>T (p.Leu219=)",
402 | "clinvar-rcva:significance": "not provided",
403 | "clinvar-rcva:version": "2",
404 | "clinvar-rcva:gene-name": "nucleolar complex associated 2 homolog (S. cerevisiae)",
405 | "clinvar-rcva:accession": "RCV000064927",
406 | "clinvar-rcva:gene-symbol": "NOC2L",
407 | "clinvar-rcva:trait-name": "Malignant melanoma",
408 | "type": "clinvar-rcva"
409 | }
410 | }
411 | },
412 | {
413 | "model": "gennotes_server.relation",
414 | "pk": 10,
415 | "fields": {
416 | "variant": 3,
417 | "tags": {
418 | "clinvar-rcva:record-status": "current",
419 | "clinvar-rcva:num-submissions": "1",
420 | "clinvar-rcva:trait-type": "Disease",
421 | "clinvar-rcva:preferred-name": "NM_001160184.1(PLEKHN1):c.484+30G>A",
422 | "clinvar-rcva:significance": "not provided",
423 | "clinvar-rcva:version": "2",
424 | "clinvar-rcva:gene-name": "pleckstrin homology domain containing, family N member 1",
425 | "clinvar-rcva:accession": "RCV000064940",
426 | "clinvar-rcva:gene-symbol": "PLEKHN1",
427 | "clinvar-rcva:trait-name": "Malignant melanoma",
428 | "type": "clinvar-rcva"
429 | }
430 | }
431 | },
432 | {
433 | "model": "account.emailconfirmation",
434 | "pk": 1,
435 | "fields": {
436 | "email_address": 1,
437 | "created": "2015-07-04T23:54:24.325Z",
438 | "sent": "2015-07-04T23:54:24.342Z",
439 | "key": "da2dgg2qz00ftqnmo9pnl4ucqfeqfjw7qlolwddaphxxaisosxmpxz9yoiqbk3l1"
440 | }
441 | },
442 | {
443 | "model": "reversion.version",
444 | "pk": 1,
445 | "fields": {
446 | "revision": 1,
447 | "object_id": "1",
448 | "object_id_int": 1,
449 | "content_type": [
450 | "gennotes_server",
451 | "variant"
452 | ],
453 | "format": "json",
454 | "serialized_data": "[{\"fields\": {\"tags\": \"{\\\"pos_b37\\\": \\\"883516\\\", \\\"var_allele_b37\\\": \\\"A\\\", \\\"ref_allele_b37\\\": \\\"G\\\", \\\"chrom_b37\\\": \\\"1\\\"}\"}, \"model\": \"gennotes_server.variant\", \"pk\": 1}]",
455 | "object_repr": "pos_b37=883516; var_allele_b37=A; ref_allele_b37=G; chrom_b37=1"
456 | }
457 | },
458 | {
459 | "model": "reversion.version",
460 | "pk": 2,
461 | "fields": {
462 | "revision": 1,
463 | "object_id": "2",
464 | "object_id_int": 2,
465 | "content_type": [
466 | "gennotes_server",
467 | "variant"
468 | ],
469 | "format": "json",
470 | "serialized_data": "[{\"fields\": {\"tags\": \"{\\\"pos_b37\\\": \\\"891344\\\", \\\"var_allele_b37\\\": \\\"A\\\", \\\"ref_allele_b37\\\": \\\"G\\\", \\\"chrom_b37\\\": \\\"1\\\"}\"}, \"model\": \"gennotes_server.variant\", \"pk\": 2}]",
471 | "object_repr": "pos_b37=891344; var_allele_b37=A; ref_allele_b37=G; chrom_b37=1"
472 | }
473 | },
474 | {
475 | "model": "reversion.version",
476 | "pk": 3,
477 | "fields": {
478 | "revision": 1,
479 | "object_id": "3",
480 | "object_id_int": 3,
481 | "content_type": [
482 | "gennotes_server",
483 | "variant"
484 | ],
485 | "format": "json",
486 | "serialized_data": "[{\"fields\": {\"tags\": \"{\\\"pos_b37\\\": \\\"906168\\\", \\\"var_allele_b37\\\": \\\"A\\\", \\\"ref_allele_b37\\\": \\\"G\\\", \\\"chrom_b37\\\": \\\"1\\\"}\"}, \"model\": \"gennotes_server.variant\", \"pk\": 3}]",
487 | "object_repr": "pos_b37=906168; var_allele_b37=A; ref_allele_b37=G; chrom_b37=1"
488 | }
489 | },
490 | {
491 | "model": "reversion.version",
492 | "pk": 4,
493 | "fields": {
494 | "revision": 1,
495 | "object_id": "4",
496 | "object_id_int": 4,
497 | "content_type": [
498 | "gennotes_server",
499 | "variant"
500 | ],
501 | "format": "json",
502 | "serialized_data": "[{\"fields\": {\"tags\": \"{\\\"pos_b37\\\": \\\"949523\\\", \\\"var_allele_b37\\\": \\\"T\\\", \\\"ref_allele_b37\\\": \\\"C\\\", \\\"chrom_b37\\\": \\\"1\\\"}\"}, \"model\": \"gennotes_server.variant\", \"pk\": 4}]",
503 | "object_repr": "pos_b37=949523; var_allele_b37=T; ref_allele_b37=C; chrom_b37=1"
504 | }
505 | },
506 | {
507 | "model": "reversion.version",
508 | "pk": 5,
509 | "fields": {
510 | "revision": 1,
511 | "object_id": "5",
512 | "object_id_int": 5,
513 | "content_type": [
514 | "gennotes_server",
515 | "variant"
516 | ],
517 | "format": "json",
518 | "serialized_data": "[{\"fields\": {\"tags\": \"{\\\"pos_b37\\\": \\\"949696\\\", \\\"var_allele_b37\\\": \\\"CG\\\", \\\"ref_allele_b37\\\": \\\"C\\\", \\\"chrom_b37\\\": \\\"1\\\"}\"}, \"model\": \"gennotes_server.variant\", \"pk\": 5}]",
519 | "object_repr": "pos_b37=949696; var_allele_b37=CG; ref_allele_b37=C; chrom_b37=1"
520 | }
521 | },
522 | {
523 | "model": "reversion.version",
524 | "pk": 6,
525 | "fields": {
526 | "revision": 1,
527 | "object_id": "6",
528 | "object_id_int": 6,
529 | "content_type": [
530 | "gennotes_server",
531 | "variant"
532 | ],
533 | "format": "json",
534 | "serialized_data": "[{\"fields\": {\"tags\": \"{\\\"pos_b37\\\": \\\"949739\\\", \\\"var_allele_b37\\\": \\\"T\\\", \\\"ref_allele_b37\\\": \\\"G\\\", \\\"chrom_b37\\\": \\\"1\\\"}\"}, \"model\": \"gennotes_server.variant\", \"pk\": 6}]",
535 | "object_repr": "pos_b37=949739; var_allele_b37=T; ref_allele_b37=G; chrom_b37=1"
536 | }
537 | },
538 | {
539 | "model": "reversion.version",
540 | "pk": 7,
541 | "fields": {
542 | "revision": 1,
543 | "object_id": "7",
544 | "object_id_int": 7,
545 | "content_type": [
546 | "gennotes_server",
547 | "variant"
548 | ],
549 | "format": "json",
550 | "serialized_data": "[{\"fields\": {\"tags\": \"{\\\"pos_b37\\\": \\\"955597\\\", \\\"var_allele_b37\\\": \\\"T\\\", \\\"ref_allele_b37\\\": \\\"G\\\", \\\"chrom_b37\\\": \\\"1\\\"}\"}, \"model\": \"gennotes_server.variant\", \"pk\": 7}]",
551 | "object_repr": "pos_b37=955597; var_allele_b37=T; ref_allele_b37=G; chrom_b37=1"
552 | }
553 | },
554 | {
555 | "model": "reversion.version",
556 | "pk": 8,
557 | "fields": {
558 | "revision": 1,
559 | "object_id": "8",
560 | "object_id_int": 8,
561 | "content_type": [
562 | "gennotes_server",
563 | "variant"
564 | ],
565 | "format": "json",
566 | "serialized_data": "[{\"fields\": {\"tags\": \"{\\\"pos_b37\\\": \\\"957640\\\", \\\"var_allele_b37\\\": \\\"T\\\", \\\"ref_allele_b37\\\": \\\"C\\\", \\\"chrom_b37\\\": \\\"1\\\"}\"}, \"model\": \"gennotes_server.variant\", \"pk\": 8}]",
567 | "object_repr": "pos_b37=957640; var_allele_b37=T; ref_allele_b37=C; chrom_b37=1"
568 | }
569 | },
570 | {
571 | "model": "reversion.version",
572 | "pk": 9,
573 | "fields": {
574 | "revision": 1,
575 | "object_id": "9",
576 | "object_id_int": 9,
577 | "content_type": [
578 | "gennotes_server",
579 | "variant"
580 | ],
581 | "format": "json",
582 | "serialized_data": "[{\"fields\": {\"tags\": \"{\\\"pos_b37\\\": \\\"976629\\\", \\\"var_allele_b37\\\": \\\"T\\\", \\\"ref_allele_b37\\\": \\\"C\\\", \\\"chrom_b37\\\": \\\"1\\\"}\"}, \"model\": \"gennotes_server.variant\", \"pk\": 9}]",
583 | "object_repr": "pos_b37=976629; var_allele_b37=T; ref_allele_b37=C; chrom_b37=1"
584 | }
585 | },
586 | {
587 | "model": "reversion.version",
588 | "pk": 10,
589 | "fields": {
590 | "revision": 1,
591 | "object_id": "10",
592 | "object_id_int": 10,
593 | "content_type": [
594 | "gennotes_server",
595 | "variant"
596 | ],
597 | "format": "json",
598 | "serialized_data": "[{\"fields\": {\"tags\": \"{\\\"pos_b37\\\": \\\"976963\\\", \\\"var_allele_b37\\\": \\\"G\\\", \\\"ref_allele_b37\\\": \\\"A\\\", \\\"chrom_b37\\\": \\\"1\\\"}\"}, \"model\": \"gennotes_server.variant\", \"pk\": 10}]",
599 | "object_repr": "pos_b37=976963; var_allele_b37=G; ref_allele_b37=A; chrom_b37=1"
600 | }
601 | },
602 | {
603 | "model": "reversion.version",
604 | "pk": 11,
605 | "fields": {
606 | "revision": 2,
607 | "object_id": "1",
608 | "object_id_int": 1,
609 | "content_type": [
610 | "gennotes_server",
611 | "relation"
612 | ],
613 | "format": "json",
614 | "serialized_data": "[{\"fields\": {\"variant\": 10, \"tags\": \"{\\\"clinvar-rcva:record-status\\\": \\\"current\\\", \\\"clinvar-rcva:num-submissions\\\": \\\"1\\\", \\\"clinvar-rcva:trait-type\\\": \\\"Disease\\\", \\\"clinvar-rcva:significance\\\": \\\"Likely benign\\\", \\\"clinvar-rcva:preferred-name\\\": \\\"NM_198576.3(AGRN):c.1058A>G (p.Gln353Arg)\\\", \\\"clinvar-rcva:version\\\": \\\"2\\\", \\\"clinvar-rcva:gene-name\\\": \\\"agrin\\\", \\\"clinvar-rcva:accession\\\": \\\"RCV000116253\\\", \\\"clinvar-rcva:gene-symbol\\\": \\\"AGRN\\\", \\\"clinvar-rcva:esp-allele-frequency\\\": \\\"0.014089016971\\\", \\\"clinvar-rcva:trait-name\\\": \\\"not specified\\\", \\\"type\\\": \\\"clinvar-rcva\\\"}\"}, \"model\": \"gennotes_server.relation\", \"pk\": 1}]",
615 | "object_repr": "Relation: 1, Type: clinvar-rcva"
616 | }
617 | },
618 | {
619 | "model": "reversion.version",
620 | "pk": 12,
621 | "fields": {
622 | "revision": 2,
623 | "object_id": "2",
624 | "object_id_int": 2,
625 | "content_type": [
626 | "gennotes_server",
627 | "relation"
628 | ],
629 | "format": "json",
630 | "serialized_data": "[{\"fields\": {\"variant\": 7, \"tags\": \"{\\\"clinvar-rcva:record-status\\\": \\\"current\\\", \\\"clinvar-rcva:num-submissions\\\": \\\"1\\\", \\\"clinvar-rcva:trait-type\\\": \\\"Disease\\\", \\\"clinvar-rcva:significance\\\": \\\"Likely benign\\\", \\\"clinvar-rcva:preferred-name\\\": \\\"NM_198576.3(AGRN):c.45G>T (p.Pro15=)\\\", \\\"clinvar-rcva:version\\\": \\\"2\\\", \\\"clinvar-rcva:gene-name\\\": \\\"agrin\\\", \\\"clinvar-rcva:accession\\\": \\\"RCV000116272\\\", \\\"clinvar-rcva:gene-symbol\\\": \\\"AGRN\\\", \\\"clinvar-rcva:trait-name\\\": \\\"not specified\\\", \\\"type\\\": \\\"clinvar-rcva\\\"}\"}, \"model\": \"gennotes_server.relation\", \"pk\": 2}]",
631 | "object_repr": "Relation: 2, Type: clinvar-rcva"
632 | }
633 | },
634 | {
635 | "model": "reversion.version",
636 | "pk": 13,
637 | "fields": {
638 | "revision": 2,
639 | "object_id": "3",
640 | "object_id_int": 3,
641 | "content_type": [
642 | "gennotes_server",
643 | "relation"
644 | ],
645 | "format": "json",
646 | "serialized_data": "[{\"fields\": {\"variant\": 8, \"tags\": \"{\\\"clinvar-rcva:record-status\\\": \\\"current\\\", \\\"clinvar-rcva:num-submissions\\\": \\\"1\\\", \\\"clinvar-rcva:trait-type\\\": \\\"Disease\\\", \\\"clinvar-rcva:significance\\\": \\\"Likely benign\\\", \\\"clinvar-rcva:preferred-name\\\": \\\"NM_198576.3(AGRN):c.261C>T (p.Asp87=)\\\", \\\"clinvar-rcva:version\\\": \\\"2\\\", \\\"clinvar-rcva:gene-name\\\": \\\"agrin\\\", \\\"clinvar-rcva:accession\\\": \\\"RCV000116258\\\", \\\"clinvar-rcva:gene-symbol\\\": \\\"AGRN\\\", \\\"clinvar-rcva:esp-allele-frequency\\\": \\\"0.031754574812\\\", \\\"clinvar-rcva:trait-name\\\": \\\"not specified\\\", \\\"type\\\": \\\"clinvar-rcva\\\"}\"}, \"model\": \"gennotes_server.relation\", \"pk\": 3}]",
647 | "object_repr": "Relation: 3, Type: clinvar-rcva"
648 | }
649 | },
650 | {
651 | "model": "reversion.version",
652 | "pk": 14,
653 | "fields": {
654 | "revision": 2,
655 | "object_id": "4",
656 | "object_id_int": 4,
657 | "content_type": [
658 | "gennotes_server",
659 | "relation"
660 | ],
661 | "format": "json",
662 | "serialized_data": "[{\"fields\": {\"variant\": 9, \"tags\": \"{\\\"clinvar-rcva:record-status\\\": \\\"current\\\", \\\"clinvar-rcva:num-submissions\\\": \\\"1\\\", \\\"clinvar-rcva:trait-type\\\": \\\"Disease\\\", \\\"clinvar-rcva:significance\\\": \\\"Benign\\\", \\\"clinvar-rcva:preferred-name\\\": \\\"NM_198576.3(AGRN):c.804C>T (p.Ala268=)\\\", \\\"clinvar-rcva:version\\\": \\\"1\\\", \\\"clinvar-rcva:gene-name\\\": \\\"agrin\\\", \\\"clinvar-rcva:accession\\\": \\\"RCV000116282\\\", \\\"clinvar-rcva:gene-symbol\\\": \\\"AGRN\\\", \\\"clinvar-rcva:trait-name\\\": \\\"not specified\\\", \\\"type\\\": \\\"clinvar-rcva\\\"}\"}, \"model\": \"gennotes_server.relation\", \"pk\": 4}]",
663 | "object_repr": "Relation: 4, Type: clinvar-rcva"
664 | }
665 | },
666 | {
667 | "model": "reversion.version",
668 | "pk": 15,
669 | "fields": {
670 | "revision": 2,
671 | "object_id": "5",
672 | "object_id_int": 5,
673 | "content_type": [
674 | "gennotes_server",
675 | "relation"
676 | ],
677 | "format": "json",
678 | "serialized_data": "[{\"fields\": {\"variant\": 6, \"tags\": \"{\\\"clinvar-rcva:record-status\\\": \\\"current\\\", \\\"clinvar-rcva:num-submissions\\\": \\\"1\\\", \\\"clinvar-rcva:trait-type\\\": \\\"Disease\\\", \\\"clinvar-rcva:significance\\\": \\\"Pathogenic\\\", \\\"clinvar-rcva:preferred-name\\\": \\\"NM_005101.3(ISG15):c.379G>T (p.Glu127Ter)\\\", \\\"clinvar-rcva:version\\\": \\\"4\\\", \\\"clinvar-rcva:gene-name\\\": \\\"ISG15 ubiquitin-like modifier\\\", \\\"clinvar-rcva:accession\\\": \\\"RCV000148988\\\", \\\"clinvar-rcva:gene-symbol\\\": \\\"ISG15\\\", \\\"clinvar-rcva:trait-name\\\": \\\"Immunodeficiency 38\\\", \\\"type\\\": \\\"clinvar-rcva\\\"}\"}, \"model\": \"gennotes_server.relation\", \"pk\": 5}]",
679 | "object_repr": "Relation: 5, Type: clinvar-rcva"
680 | }
681 | },
682 | {
683 | "model": "reversion.version",
684 | "pk": 16,
685 | "fields": {
686 | "revision": 2,
687 | "object_id": "6",
688 | "object_id_int": 6,
689 | "content_type": [
690 | "gennotes_server",
691 | "relation"
692 | ],
693 | "format": "json",
694 | "serialized_data": "[{\"fields\": {\"variant\": 5, \"tags\": \"{\\\"clinvar-rcva:record-status\\\": \\\"current\\\", \\\"clinvar-rcva:num-submissions\\\": \\\"1\\\", \\\"clinvar-rcva:trait-type\\\": \\\"Disease\\\", \\\"clinvar-rcva:significance\\\": \\\"Pathogenic\\\", \\\"clinvar-rcva:preferred-name\\\": \\\"NM_005101.3(ISG15):c.339dupG (p.Leu114Alafs)\\\", \\\"clinvar-rcva:citations\\\": \\\"PMID22859821\\\", \\\"clinvar-rcva:version\\\": \\\"4\\\", \\\"clinvar-rcva:gene-name\\\": \\\"ISG15 ubiquitin-like modifier\\\", \\\"clinvar-rcva:accession\\\": \\\"RCV000148989\\\", \\\"clinvar-rcva:gene-symbol\\\": \\\"ISG15\\\", \\\"clinvar-rcva:trait-name\\\": \\\"Immunodeficiency 38\\\", \\\"type\\\": \\\"clinvar-rcva\\\"}\"}, \"model\": \"gennotes_server.relation\", \"pk\": 6}]",
695 | "object_repr": "Relation: 6, Type: clinvar-rcva"
696 | }
697 | },
698 | {
699 | "model": "reversion.version",
700 | "pk": 17,
701 | "fields": {
702 | "revision": 2,
703 | "object_id": "7",
704 | "object_id_int": 7,
705 | "content_type": [
706 | "gennotes_server",
707 | "relation"
708 | ],
709 | "format": "json",
710 | "serialized_data": "[{\"fields\": {\"variant\": 4, \"tags\": \"{\\\"clinvar-rcva:record-status\\\": \\\"current\\\", \\\"clinvar-rcva:num-submissions\\\": \\\"1\\\", \\\"clinvar-rcva:trait-type\\\": \\\"Disease\\\", \\\"clinvar-rcva:significance\\\": \\\"Pathogenic\\\", \\\"clinvar-rcva:preferred-name\\\": \\\"NM_005101.3(ISG15):c.163C>T (p.Gln55Ter)\\\", \\\"clinvar-rcva:version\\\": \\\"2\\\", \\\"clinvar-rcva:gene-name\\\": \\\"ISG15 ubiquitin-like modifier\\\", \\\"clinvar-rcva:accession\\\": \\\"RCV000162196\\\", \\\"clinvar-rcva:gene-symbol\\\": \\\"ISG15\\\", \\\"clinvar-rcva:trait-name\\\": \\\"Immunodeficiency 38\\\", \\\"type\\\": \\\"clinvar-rcva\\\"}\"}, \"model\": \"gennotes_server.relation\", \"pk\": 7}]",
711 | "object_repr": "Relation: 7, Type: clinvar-rcva"
712 | }
713 | },
714 | {
715 | "model": "reversion.version",
716 | "pk": 18,
717 | "fields": {
718 | "revision": 2,
719 | "object_id": "8",
720 | "object_id_int": 8,
721 | "content_type": [
722 | "gennotes_server",
723 | "relation"
724 | ],
725 | "format": "json",
726 | "serialized_data": "[{\"fields\": {\"variant\": 1, \"tags\": \"{\\\"clinvar-rcva:record-status\\\": \\\"current\\\", \\\"clinvar-rcva:num-submissions\\\": \\\"1\\\", \\\"clinvar-rcva:trait-type\\\": \\\"Disease\\\", \\\"clinvar-rcva:significance\\\": \\\"not provided\\\", \\\"clinvar-rcva:preferred-name\\\": \\\"NM_015658.3(NOC2L):c.1654C>T (p.Leu552=)\\\", \\\"clinvar-rcva:version\\\": \\\"2\\\", \\\"clinvar-rcva:gene-name\\\": \\\"nucleolar complex associated 2 homolog (S. cerevisiae)\\\", \\\"clinvar-rcva:accession\\\": \\\"RCV000064926\\\", \\\"clinvar-rcva:gene-symbol\\\": \\\"NOC2L\\\", \\\"clinvar-rcva:trait-name\\\": \\\"Malignant melanoma\\\", \\\"type\\\": \\\"clinvar-rcva\\\"}\"}, \"model\": \"gennotes_server.relation\", \"pk\": 8}]",
727 | "object_repr": "Relation: 8, Type: clinvar-rcva"
728 | }
729 | },
730 | {
731 | "model": "reversion.version",
732 | "pk": 19,
733 | "fields": {
734 | "revision": 2,
735 | "object_id": "9",
736 | "object_id_int": 9,
737 | "content_type": [
738 | "gennotes_server",
739 | "relation"
740 | ],
741 | "format": "json",
742 | "serialized_data": "[{\"fields\": {\"variant\": 2, \"tags\": \"{\\\"clinvar-rcva:record-status\\\": \\\"current\\\", \\\"clinvar-rcva:num-submissions\\\": \\\"1\\\", \\\"clinvar-rcva:trait-type\\\": \\\"Disease\\\", \\\"clinvar-rcva:significance\\\": \\\"not provided\\\", \\\"clinvar-rcva:preferred-name\\\": \\\"NM_015658.3(NOC2L):c.657C>T (p.Leu219=)\\\", \\\"clinvar-rcva:version\\\": \\\"2\\\", \\\"clinvar-rcva:gene-name\\\": \\\"nucleolar complex associated 2 homolog (S. cerevisiae)\\\", \\\"clinvar-rcva:accession\\\": \\\"RCV000064927\\\", \\\"clinvar-rcva:gene-symbol\\\": \\\"NOC2L\\\", \\\"clinvar-rcva:trait-name\\\": \\\"Malignant melanoma\\\", \\\"type\\\": \\\"clinvar-rcva\\\"}\"}, \"model\": \"gennotes_server.relation\", \"pk\": 9}]",
743 | "object_repr": "Relation: 9, Type: clinvar-rcva"
744 | }
745 | },
746 | {
747 | "model": "reversion.version",
748 | "pk": 20,
749 | "fields": {
750 | "revision": 2,
751 | "object_id": "10",
752 | "object_id_int": 10,
753 | "content_type": [
754 | "gennotes_server",
755 | "relation"
756 | ],
757 | "format": "json",
758 | "serialized_data": "[{\"fields\": {\"variant\": 3, \"tags\": \"{\\\"clinvar-rcva:record-status\\\": \\\"current\\\", \\\"clinvar-rcva:num-submissions\\\": \\\"1\\\", \\\"clinvar-rcva:trait-type\\\": \\\"Disease\\\", \\\"clinvar-rcva:significance\\\": \\\"not provided\\\", \\\"clinvar-rcva:preferred-name\\\": \\\"NM_001160184.1(PLEKHN1):c.484+30G>A\\\", \\\"clinvar-rcva:version\\\": \\\"2\\\", \\\"clinvar-rcva:gene-name\\\": \\\"pleckstrin homology domain containing, family N member 1\\\", \\\"clinvar-rcva:accession\\\": \\\"RCV000064940\\\", \\\"clinvar-rcva:gene-symbol\\\": \\\"PLEKHN1\\\", \\\"clinvar-rcva:trait-name\\\": \\\"Malignant melanoma\\\", \\\"type\\\": \\\"clinvar-rcva\\\"}\"}, \"model\": \"gennotes_server.relation\", \"pk\": 10}]",
759 | "object_repr": "Relation: 10, Type: clinvar-rcva"
760 | }
761 | },
762 | {
763 | "model": "auth.permission",
764 | "fields": {
765 | "name": "Can add log entry",
766 | "content_type": [
767 | "admin",
768 | "logentry"
769 | ],
770 | "codename": "add_logentry"
771 | }
772 | },
773 | {
774 | "model": "auth.permission",
775 | "fields": {
776 | "name": "Can change log entry",
777 | "content_type": [
778 | "admin",
779 | "logentry"
780 | ],
781 | "codename": "change_logentry"
782 | }
783 | },
784 | {
785 | "model": "auth.permission",
786 | "fields": {
787 | "name": "Can delete log entry",
788 | "content_type": [
789 | "admin",
790 | "logentry"
791 | ],
792 | "codename": "delete_logentry"
793 | }
794 | },
795 | {
796 | "model": "auth.permission",
797 | "fields": {
798 | "name": "Can add permission",
799 | "content_type": [
800 | "auth",
801 | "permission"
802 | ],
803 | "codename": "add_permission"
804 | }
805 | },
806 | {
807 | "model": "auth.permission",
808 | "fields": {
809 | "name": "Can change permission",
810 | "content_type": [
811 | "auth",
812 | "permission"
813 | ],
814 | "codename": "change_permission"
815 | }
816 | },
817 | {
818 | "model": "auth.permission",
819 | "fields": {
820 | "name": "Can delete permission",
821 | "content_type": [
822 | "auth",
823 | "permission"
824 | ],
825 | "codename": "delete_permission"
826 | }
827 | },
828 | {
829 | "model": "auth.permission",
830 | "fields": {
831 | "name": "Can add group",
832 | "content_type": [
833 | "auth",
834 | "group"
835 | ],
836 | "codename": "add_group"
837 | }
838 | },
839 | {
840 | "model": "auth.permission",
841 | "fields": {
842 | "name": "Can change group",
843 | "content_type": [
844 | "auth",
845 | "group"
846 | ],
847 | "codename": "change_group"
848 | }
849 | },
850 | {
851 | "model": "auth.permission",
852 | "fields": {
853 | "name": "Can delete group",
854 | "content_type": [
855 | "auth",
856 | "group"
857 | ],
858 | "codename": "delete_group"
859 | }
860 | },
861 | {
862 | "model": "auth.permission",
863 | "fields": {
864 | "name": "Can add user",
865 | "content_type": [
866 | "auth",
867 | "user"
868 | ],
869 | "codename": "add_user"
870 | }
871 | },
872 | {
873 | "model": "auth.permission",
874 | "fields": {
875 | "name": "Can change user",
876 | "content_type": [
877 | "auth",
878 | "user"
879 | ],
880 | "codename": "change_user"
881 | }
882 | },
883 | {
884 | "model": "auth.permission",
885 | "fields": {
886 | "name": "Can delete user",
887 | "content_type": [
888 | "auth",
889 | "user"
890 | ],
891 | "codename": "delete_user"
892 | }
893 | },
894 | {
895 | "model": "auth.permission",
896 | "fields": {
897 | "name": "Can add content type",
898 | "content_type": [
899 | "contenttypes",
900 | "contenttype"
901 | ],
902 | "codename": "add_contenttype"
903 | }
904 | },
905 | {
906 | "model": "auth.permission",
907 | "fields": {
908 | "name": "Can change content type",
909 | "content_type": [
910 | "contenttypes",
911 | "contenttype"
912 | ],
913 | "codename": "change_contenttype"
914 | }
915 | },
916 | {
917 | "model": "auth.permission",
918 | "fields": {
919 | "name": "Can delete content type",
920 | "content_type": [
921 | "contenttypes",
922 | "contenttype"
923 | ],
924 | "codename": "delete_contenttype"
925 | }
926 | },
927 | {
928 | "model": "auth.permission",
929 | "fields": {
930 | "name": "Can add session",
931 | "content_type": [
932 | "sessions",
933 | "session"
934 | ],
935 | "codename": "add_session"
936 | }
937 | },
938 | {
939 | "model": "auth.permission",
940 | "fields": {
941 | "name": "Can change session",
942 | "content_type": [
943 | "sessions",
944 | "session"
945 | ],
946 | "codename": "change_session"
947 | }
948 | },
949 | {
950 | "model": "auth.permission",
951 | "fields": {
952 | "name": "Can delete session",
953 | "content_type": [
954 | "sessions",
955 | "session"
956 | ],
957 | "codename": "delete_session"
958 | }
959 | },
960 | {
961 | "model": "auth.permission",
962 | "fields": {
963 | "name": "Can add site",
964 | "content_type": [
965 | "sites",
966 | "site"
967 | ],
968 | "codename": "add_site"
969 | }
970 | },
971 | {
972 | "model": "auth.permission",
973 | "fields": {
974 | "name": "Can change site",
975 | "content_type": [
976 | "sites",
977 | "site"
978 | ],
979 | "codename": "change_site"
980 | }
981 | },
982 | {
983 | "model": "auth.permission",
984 | "fields": {
985 | "name": "Can delete site",
986 | "content_type": [
987 | "sites",
988 | "site"
989 | ],
990 | "codename": "delete_site"
991 | }
992 | },
993 | {
994 | "model": "auth.permission",
995 | "fields": {
996 | "name": "Can add variant",
997 | "content_type": [
998 | "gennotes_server",
999 | "variant"
1000 | ],
1001 | "codename": "add_variant"
1002 | }
1003 | },
1004 | {
1005 | "model": "auth.permission",
1006 | "fields": {
1007 | "name": "Can change variant",
1008 | "content_type": [
1009 | "gennotes_server",
1010 | "variant"
1011 | ],
1012 | "codename": "change_variant"
1013 | }
1014 | },
1015 | {
1016 | "model": "auth.permission",
1017 | "fields": {
1018 | "name": "Can delete variant",
1019 | "content_type": [
1020 | "gennotes_server",
1021 | "variant"
1022 | ],
1023 | "codename": "delete_variant"
1024 | }
1025 | },
1026 | {
1027 | "model": "auth.permission",
1028 | "fields": {
1029 | "name": "Can add relation",
1030 | "content_type": [
1031 | "gennotes_server",
1032 | "relation"
1033 | ],
1034 | "codename": "add_relation"
1035 | }
1036 | },
1037 | {
1038 | "model": "auth.permission",
1039 | "fields": {
1040 | "name": "Can change relation",
1041 | "content_type": [
1042 | "gennotes_server",
1043 | "relation"
1044 | ],
1045 | "codename": "change_relation"
1046 | }
1047 | },
1048 | {
1049 | "model": "auth.permission",
1050 | "fields": {
1051 | "name": "Can delete relation",
1052 | "content_type": [
1053 | "gennotes_server",
1054 | "relation"
1055 | ],
1056 | "codename": "delete_relation"
1057 | }
1058 | },
1059 | {
1060 | "model": "auth.permission",
1061 | "fields": {
1062 | "name": "Can add commit deletion",
1063 | "content_type": [
1064 | "gennotes_server",
1065 | "commitdeletion"
1066 | ],
1067 | "codename": "add_commitdeletion"
1068 | }
1069 | },
1070 | {
1071 | "model": "auth.permission",
1072 | "fields": {
1073 | "name": "Can change commit deletion",
1074 | "content_type": [
1075 | "gennotes_server",
1076 | "commitdeletion"
1077 | ],
1078 | "codename": "change_commitdeletion"
1079 | }
1080 | },
1081 | {
1082 | "model": "auth.permission",
1083 | "fields": {
1084 | "name": "Can delete commit deletion",
1085 | "content_type": [
1086 | "gennotes_server",
1087 | "commitdeletion"
1088 | ],
1089 | "codename": "delete_commitdeletion"
1090 | }
1091 | },
1092 | {
1093 | "model": "auth.permission",
1094 | "fields": {
1095 | "name": "Can add editing application",
1096 | "content_type": [
1097 | "gennotes_server",
1098 | "editingapplication"
1099 | ],
1100 | "codename": "add_editingapplication"
1101 | }
1102 | },
1103 | {
1104 | "model": "auth.permission",
1105 | "fields": {
1106 | "name": "Can change editing application",
1107 | "content_type": [
1108 | "gennotes_server",
1109 | "editingapplication"
1110 | ],
1111 | "codename": "change_editingapplication"
1112 | }
1113 | },
1114 | {
1115 | "model": "auth.permission",
1116 | "fields": {
1117 | "name": "Can delete editing application",
1118 | "content_type": [
1119 | "gennotes_server",
1120 | "editingapplication"
1121 | ],
1122 | "codename": "delete_editingapplication"
1123 | }
1124 | },
1125 | {
1126 | "model": "auth.permission",
1127 | "fields": {
1128 | "name": "Can add email address",
1129 | "content_type": [
1130 | "account",
1131 | "emailaddress"
1132 | ],
1133 | "codename": "add_emailaddress"
1134 | }
1135 | },
1136 | {
1137 | "model": "auth.permission",
1138 | "fields": {
1139 | "name": "Can change email address",
1140 | "content_type": [
1141 | "account",
1142 | "emailaddress"
1143 | ],
1144 | "codename": "change_emailaddress"
1145 | }
1146 | },
1147 | {
1148 | "model": "auth.permission",
1149 | "fields": {
1150 | "name": "Can delete email address",
1151 | "content_type": [
1152 | "account",
1153 | "emailaddress"
1154 | ],
1155 | "codename": "delete_emailaddress"
1156 | }
1157 | },
1158 | {
1159 | "model": "auth.permission",
1160 | "fields": {
1161 | "name": "Can add email confirmation",
1162 | "content_type": [
1163 | "account",
1164 | "emailconfirmation"
1165 | ],
1166 | "codename": "add_emailconfirmation"
1167 | }
1168 | },
1169 | {
1170 | "model": "auth.permission",
1171 | "fields": {
1172 | "name": "Can change email confirmation",
1173 | "content_type": [
1174 | "account",
1175 | "emailconfirmation"
1176 | ],
1177 | "codename": "change_emailconfirmation"
1178 | }
1179 | },
1180 | {
1181 | "model": "auth.permission",
1182 | "fields": {
1183 | "name": "Can delete email confirmation",
1184 | "content_type": [
1185 | "account",
1186 | "emailconfirmation"
1187 | ],
1188 | "codename": "delete_emailconfirmation"
1189 | }
1190 | },
1191 | {
1192 | "model": "auth.permission",
1193 | "fields": {
1194 | "name": "Can add cors model",
1195 | "content_type": [
1196 | "corsheaders",
1197 | "corsmodel"
1198 | ],
1199 | "codename": "add_corsmodel"
1200 | }
1201 | },
1202 | {
1203 | "model": "auth.permission",
1204 | "fields": {
1205 | "name": "Can change cors model",
1206 | "content_type": [
1207 | "corsheaders",
1208 | "corsmodel"
1209 | ],
1210 | "codename": "change_corsmodel"
1211 | }
1212 | },
1213 | {
1214 | "model": "auth.permission",
1215 | "fields": {
1216 | "name": "Can delete cors model",
1217 | "content_type": [
1218 | "corsheaders",
1219 | "corsmodel"
1220 | ],
1221 | "codename": "delete_corsmodel"
1222 | }
1223 | },
1224 | {
1225 | "model": "auth.permission",
1226 | "fields": {
1227 | "name": "Can add grant",
1228 | "content_type": [
1229 | "oauth2_provider",
1230 | "grant"
1231 | ],
1232 | "codename": "add_grant"
1233 | }
1234 | },
1235 | {
1236 | "model": "auth.permission",
1237 | "fields": {
1238 | "name": "Can change grant",
1239 | "content_type": [
1240 | "oauth2_provider",
1241 | "grant"
1242 | ],
1243 | "codename": "change_grant"
1244 | }
1245 | },
1246 | {
1247 | "model": "auth.permission",
1248 | "fields": {
1249 | "name": "Can delete grant",
1250 | "content_type": [
1251 | "oauth2_provider",
1252 | "grant"
1253 | ],
1254 | "codename": "delete_grant"
1255 | }
1256 | },
1257 | {
1258 | "model": "auth.permission",
1259 | "fields": {
1260 | "name": "Can add access token",
1261 | "content_type": [
1262 | "oauth2_provider",
1263 | "accesstoken"
1264 | ],
1265 | "codename": "add_accesstoken"
1266 | }
1267 | },
1268 | {
1269 | "model": "auth.permission",
1270 | "fields": {
1271 | "name": "Can change access token",
1272 | "content_type": [
1273 | "oauth2_provider",
1274 | "accesstoken"
1275 | ],
1276 | "codename": "change_accesstoken"
1277 | }
1278 | },
1279 | {
1280 | "model": "auth.permission",
1281 | "fields": {
1282 | "name": "Can delete access token",
1283 | "content_type": [
1284 | "oauth2_provider",
1285 | "accesstoken"
1286 | ],
1287 | "codename": "delete_accesstoken"
1288 | }
1289 | },
1290 | {
1291 | "model": "auth.permission",
1292 | "fields": {
1293 | "name": "Can add refresh token",
1294 | "content_type": [
1295 | "oauth2_provider",
1296 | "refreshtoken"
1297 | ],
1298 | "codename": "add_refreshtoken"
1299 | }
1300 | },
1301 | {
1302 | "model": "auth.permission",
1303 | "fields": {
1304 | "name": "Can change refresh token",
1305 | "content_type": [
1306 | "oauth2_provider",
1307 | "refreshtoken"
1308 | ],
1309 | "codename": "change_refreshtoken"
1310 | }
1311 | },
1312 | {
1313 | "model": "auth.permission",
1314 | "fields": {
1315 | "name": "Can delete refresh token",
1316 | "content_type": [
1317 | "oauth2_provider",
1318 | "refreshtoken"
1319 | ],
1320 | "codename": "delete_refreshtoken"
1321 | }
1322 | },
1323 | {
1324 | "model": "auth.permission",
1325 | "fields": {
1326 | "name": "Can add revision",
1327 | "content_type": [
1328 | "reversion",
1329 | "revision"
1330 | ],
1331 | "codename": "add_revision"
1332 | }
1333 | },
1334 | {
1335 | "model": "auth.permission",
1336 | "fields": {
1337 | "name": "Can change revision",
1338 | "content_type": [
1339 | "reversion",
1340 | "revision"
1341 | ],
1342 | "codename": "change_revision"
1343 | }
1344 | },
1345 | {
1346 | "model": "auth.permission",
1347 | "fields": {
1348 | "name": "Can delete revision",
1349 | "content_type": [
1350 | "reversion",
1351 | "revision"
1352 | ],
1353 | "codename": "delete_revision"
1354 | }
1355 | },
1356 | {
1357 | "model": "auth.permission",
1358 | "fields": {
1359 | "name": "Can add version",
1360 | "content_type": [
1361 | "reversion",
1362 | "version"
1363 | ],
1364 | "codename": "add_version"
1365 | }
1366 | },
1367 | {
1368 | "model": "auth.permission",
1369 | "fields": {
1370 | "name": "Can change version",
1371 | "content_type": [
1372 | "reversion",
1373 | "version"
1374 | ],
1375 | "codename": "change_version"
1376 | }
1377 | },
1378 | {
1379 | "model": "auth.permission",
1380 | "fields": {
1381 | "name": "Can delete version",
1382 | "content_type": [
1383 | "reversion",
1384 | "version"
1385 | ],
1386 | "codename": "delete_version"
1387 | }
1388 | },
1389 | {
1390 | "model": "auth.user",
1391 | "fields": {
1392 | "password": "",
1393 | "last_login": null,
1394 | "is_superuser": false,
1395 | "username": "clinvar-data-importer",
1396 | "first_name": "",
1397 | "last_name": "",
1398 | "email": "",
1399 | "is_staff": false,
1400 | "is_active": true,
1401 | "date_joined": "2015-07-04T20:38:04.414Z",
1402 | "groups": [],
1403 | "user_permissions": []
1404 | }
1405 | },
1406 | {
1407 | "model": "auth.user",
1408 | "fields": {
1409 | "password": "pbkdf2_sha256$20000$iLAzMU2UwJOd$Op5XrV6s/CG2EjbNa+BECyA3XDPDQj+G6zBks70X1wg=",
1410 | "last_login": "2015-07-04T23:54:38.553Z",
1411 | "is_superuser": false,
1412 | "username": "testuser",
1413 | "first_name": "",
1414 | "last_name": "",
1415 | "email": "mpball@gmail.com",
1416 | "is_staff": false,
1417 | "is_active": true,
1418 | "date_joined": "2015-07-04T23:54:24.227Z",
1419 | "groups": [],
1420 | "user_permissions": []
1421 | }
1422 | },
1423 | {
1424 | "model": "account.emailaddress",
1425 | "pk": 1,
1426 | "fields": {
1427 | "user": [
1428 | "testuser"
1429 | ],
1430 | "email": "mpball@gmail.com",
1431 | "verified": true,
1432 | "primary": true
1433 | }
1434 | },
1435 | {
1436 | "model": "reversion.revision",
1437 | "pk": 1,
1438 | "fields": {
1439 | "manager_slug": "default",
1440 | "date_created": "2015-07-04T20:40:04.302Z",
1441 | "user": [
1442 | "clinvar-data-importer"
1443 | ],
1444 | "comment": "Variant added based on presence in ClinVar VCF file: clinvar_20150629.vcf.gz"
1445 | }
1446 | },
1447 | {
1448 | "model": "reversion.revision",
1449 | "pk": 2,
1450 | "fields": {
1451 | "manager_slug": "default",
1452 | "date_created": "2015-07-04T20:43:18.524Z",
1453 | "user": [
1454 | "clinvar-data-importer"
1455 | ],
1456 | "comment": "Relation added based on presence in ClinVar XML file: ClinVarFullRelease_2015-07.xml.gz"
1457 | }
1458 | }
1459 | ]
1460 |
--------------------------------------------------------------------------------