Example #1
0
def show_interactive(request, username, project_slug):
    project = get_project(username, project_slug)

    view_key = request.GET.get('view_key')
    if view_key is None:
        view_key = "no_view_key"

    if not check_view_permission(project, request.user, view_key):
        raise Http404

    return render(request, 'interactive.html', {'project': project, 'view_key': view_key})
Example #2
0
def details_project(request, project_slug):
    project = get_project(request.user.username, project_slug)

    files = []
    for f in os.listdir(project.get_path()):
        files.append({'name': f, 'size': os.path.getsize(os.path.join(project.get_path(), f))})

    context = {
        'project': project,
        'project_files': files
    }
    return render(request, 'projects/details.html', context)
Example #3
0
def list_projects(request):
    action = request.POST.get('action')

    if action == 'delete':
        project = get_project(request.user.username, request.POST.get('slug'))

        if project:
            project.delete_project_path()
            project.delete()
        else:
            raise Http404

    context = {
        'projects': Project.objects.filter(user=request.user),
    }
    return render(request, 'projects/list.html', context)
Example #4
0
def download_zip(request, username, project_slug):
    project = get_project(username, project_slug)

    view_key = request.GET.get('view_key')
    if view_key is None:
        view_key = "no_view_key"

    if not check_view_permission(project, request.user, view_key):
        raise Http404

    zip_io = io.BytesIO()
    with zipfile.ZipFile(zip_io, mode='w', compression=zipfile.ZIP_DEFLATED) as backup_zip:
        for f in os.listdir(project.get_path()):
            backup_zip.write(os.path.join(project.get_path(), f), f)

    response = HttpResponse(zip_io.getvalue(), content_type='application/x-zip-compressed')
    response['Content-Disposition'] = 'attachment; filename=%s' % project.slug + ".zip"
    response['Content-Length'] = zip_io.tell()
    return response
Example #5
0
def show_inspect(request, username, project_slug, inspection_type):
    project = get_project(username, project_slug)

    view_key = request.GET.get('view_key')
    if view_key is None:
        view_key = "no_view_key"

    if not check_view_permission(project, request.user, view_key):
        raise Http404

    html_page = ''
    if inspection_type == 'inspect':
        html_page = 'charts'
    elif inspection_type == 'geneclusters':
        html_page = 'geneclusters'

    return render(request, 'inspect.html', {'project': project, 
                                           'view_key': view_key,
                                           'id': request.GET.get('id'),
                                           'html_page': html_page
                                           })
Example #6
0
def share_project(request, project_slug):
    project = get_project(request.user.username, project_slug)
    action = request.POST.get('action')

    if action == 'generate_link':
        newlink = ProjectLink(project=project, link=get_random_string(length=16))
        newlink.save()
        context = {
            'status': 'ok'
        }
        return JsonResponse(context)

    if action == 'delete_link':
        link = ProjectLink.objects.filter(project=project, link=request.POST.get('link'))
        if link:
            link.delete()

        context = {
            'status': 'ok'
        }
        return JsonResponse(context)

    if action == 'set_public':
        project.is_public = True if request.POST.get('permission') == 'true' else False
        project.save(update_fields=["is_public"])
        context = {
            'status': 'ok'
        }
        return JsonResponse(context)

    shared_teams = ProjectTeam.objects.filter(project=project)

    if action == 'share_with_team':
        team_id = request.POST.get('team_id')

        if team_id:
            team = Team.objects.get(id=team_id)

            is_member = TeamUser.objects.filter(user=request.user, team=team)
            already_shared = ProjectTeam.objects.filter(project=project, team=team)

            if not already_shared and is_member:
                ProjectTeam(project=project, team=team).save()

    if action == 'delete_team' or action == 'set_team_write_permission':
        team_id = request.POST.get('team_id')

        if team_id:
            team = Team.objects.get(id=team_id)
            sharing = ProjectTeam.objects.get(project=project, team=team)

            if sharing:
                if action == 'delete_team':
                    sharing.delete()
                elif action == 'set_team_write_permission':
                    sharing.can_write = True if request.POST.get('permission') == 'true' else False
                    sharing.save()

    teams = Team.objects.filter(teamuser__user=request.user)

    context = {
        'project': project,
        'shared_teams': shared_teams,
        'teams': teams
    }
    return render(request, 'projects/share.html', context)
Example #7
0
def ajax_handler(request, username, project_slug, view_key, requested_url):
    if not request.is_ajax():
        raise Http404

    project = get_project(username, project_slug)

    if not check_view_permission(project, request.user, view_key):
        raise Http404

    read_only = not check_write_permission(project, request.user)

    bottle_request = utils.MockBottleRequest(django_request=request)
    bottle_response = utils.MockBottleResponse()

    interactive = None
    
    if not requested_url.startswith('data/news'):
        interactive = project.get_interactive(read_only=read_only)

    bottleapp = BottleApplication(interactive, bottle_request, bottle_response)

    if requested_url.startswith('data/init'):
        download_zip_url = reverse('download_zip', args=[username, project_slug])
        if view_key != 'no_view_key':
            download_zip_url += '?view_key=' + view_key

        default_view = interactive.default_view
        default_order = interactive.p_meta['default_item_order']
        autodraw = False
        state_dict = None

        if interactive.state_autoload:
            state_dict = json.loads(interactive.states_table.states[interactive.state_autoload]['content'])

            if state_dict['current-view'] in interactive.views:
                default_view = state_dict['current-view']

            if state_dict['order-by'] in interactive.p_meta['item_orders']:
                default_order = state_dict['order-by']

            autodraw = True

        collection_dict = None
        if interactive.collection_autoload:
            collection_dict = json.loads(bottleapp.get_collection_dict(interactive.collection_autoload))

        functions_sources = []
        if interactive.mode == 'full' or interactive.mode == 'gene':
            functions_sources = list(interactive.gene_function_call_sources)
        elif interactive.mode == 'pan':
            functions_sources = list(interactive.gene_clusters_function_sources)

        return JsonResponse({ "title": project.name,
                             "description": interactive.p_meta['description'],
                             "item_orders": (default_order, interactive.p_meta['item_orders'][default_order], list(interactive.p_meta['item_orders'].keys())),
                             "views": (default_view, interactive.views[default_view], list(interactive.views.keys())),
                             "item_lengths": dict([tuple((c, interactive.splits_basic_info[c]['length']),) for c in interactive.splits_basic_info]),
                             "server_mode": True,
                             "mode": interactive.mode,
                             "read_only": interactive.read_only, 
                             "bin_prefix": "Bin_",
                             "session_id": 0,
                             "layers_order": interactive.layers_order_data_dict,
                             "layers_information": interactive.layers_additional_data_dict,
                             "layers_information_default_order": interactive.layers_additional_data_keys,
                             "check_background_process": False,
                             "autodraw": autodraw,
                             "inspection_available": interactive.auxiliary_profile_data_available,
                             "sequences_available": True if interactive.split_sequences else False,
                             "functions_initialized": interactive.gene_function_calls_initiated,
                             "functions_sources": functions_sources,
                             "state": (interactive.state_autoload, state_dict),
                             "collection": collection_dict,
                             "samples": interactive.p_meta['samples'] if interactive.mode in ['full', 'refine'] else [],
                             "load_full_state": True,
                             "project": {
                                'username': project.user.username,
                                'fullname': project.user.userprofile.fullname if project.user.userprofile.fullname else project.user.username,
                                'user_avatar': gravatar(project.user.email),
                                'download_zip_url': download_zip_url
                                }
                            })

    elif requested_url.startswith('data/view/'):
        param = requested_url.split('/')[-1]
        return HttpResponse(bottleapp.get_view_data(param), content_type='application/json')

    elif requested_url.startswith('tree/'):
        param = requested_url.split('/')[-1]
        return HttpResponse(bottleapp.get_items_order(param), content_type='application/json')

    elif requested_url.startswith('data/collections'):
        return HttpResponse(bottleapp.get_collections(), content_type='application/json')

    elif requested_url.startswith('data/collection/'):
        param = requested_url.split('/')[-1]
        return HttpResponse(bottleapp.get_collection_dict(param), content_type='application/json')

    elif requested_url.startswith('store_collection'):
        if not check_write_permission(project, request.user):
            raise Http404

        ret = HttpResponse(bottleapp.store_collections_dict(), content_type='application/json')
        project.synchronize_num_collections(save=True)
        return ret

    elif requested_url.startswith('data/contig/'):
        param = requested_url.split('/')[-1]
        return HttpResponse(bottleapp.get_sequence_for_split(param), content_type='application/json')

    elif requested_url.startswith('store_description'):
        if not check_write_permission(project, request.user):
            raise Http404

        return HttpResponse(bottleapp.store_description(), content_type='application/json')

    elif requested_url.startswith('state/all'):
        return HttpResponse(bottleapp.state_all(), content_type='application/json')

    elif requested_url.startswith('state/get'):
        param = requested_url.split('/')[-1]
        return HttpResponse(bottleapp.get_state(param), content_type='application/json')

    elif requested_url.startswith('state/save'):
        if not check_write_permission(project, request.user):
            raise Http404

        param = requested_url.split('/')[-1]
        ret = HttpResponse(bottleapp.save_state(param), content_type='application/json')
        project.synchronize_num_states(save=True)
        return ret

    elif requested_url.startswith('data/charts/'):
        order_name = requested_url.split('/')[-2]
        item_name = requested_url.split('/')[-1]
        return HttpResponse(bottleapp.charts(order_name, item_name), content_type='application/json')

    elif requested_url.startswith('data/geneclusters/'):
        order_name = requested_url.split('/')[-2]
        item_name = requested_url.split('/')[-1]
        return HttpResponse(bottleapp.inspect_gene_cluster(order_name, item_name), content_type='application/json')

    elif requested_url.startswith('data/get_AA_sequences_for_gene_cluster/'):
        param = requested_url.split('/')[-1]
        return HttpResponse(bottleapp.get_AA_sequences_for_gene_cluster(param), content_type='application/json')

    elif requested_url.startswith('data/news'):
        return HttpResponse(bottleapp.get_news(), content_type='application/json')

    elif requested_url.startswith('data/gene'):
        param = requested_url.split('/')[-1]
        return HttpResponse(bottleapp.get_sequence_for_gene_call(param), content_type='application/json')

    elif requested_url.startswith('data/completeness'):
        return HttpResponse(bottleapp.completeness(), content_type='application/json')

    elif requested_url.startswith('data/reroot_tree'):
        return HttpResponse(bottleapp.reroot_tree(), content_type='application/json')


    raise Http404