コード例 #1
0
ファイル: views_knockdown.py プロジェクト: katur/eegi
def _create_inner_dictionary(filters, join_devstar=True, join_manual=False):
    experiments = Experiment.objects.filter(**filters).select_related('plate')
    if join_devstar:
        experiments = experiments.prefetch_related('devstarscore_set')

    if join_manual:
        experiments = experiments.prefetch_related('manualscore_set')

    d = {}
    d['experiments'] = experiments
    d['link_to_all'] = build_url('find_experiment_wells_url', get=filters)
    return d
コード例 #2
0
def _create_inner_dictionary(filters, join_devstar=True, join_manual=False):
    experiments = Experiment.objects.filter(**filters).select_related('plate')
    if join_devstar:
        experiments = experiments.prefetch_related('devstarscore_set')

    if join_manual:
        experiments = experiments.prefetch_related('manualscore_set')

    d = {}
    d['experiments'] = experiments
    d['link_to_all'] = build_url('find_experiment_wells_url', get=filters)
    return d
コード例 #3
0
def mutant_knockdown(request, mutant, temperature):
    """
    Render the page showing knockdown by mutation only.

    context['data'] is returned in format:

        {date: {
            'experiments': [experiments], 'link_to_all': url,
        }}
    """
    data = OrderedDict()

    l4440 = Clone.get_l4440()
    mutant = get_object_or_404(WormStrain, pk=mutant)

    filters = {
        'is_junk': False,
        'worm_strain': mutant.pk,
        'library_stock__intended_clone': l4440,
        'plate__temperature': temperature,
    }

    # Do not join manual scores, since L4440 not manually scored
    experiments = (Experiment.objects.filter(**filters).select_related(
        'library_stock',
        'plate').prefetch_related('devstarscore_set').order_by(
            '-plate__date', 'id'))

    for experiment in experiments:
        date = experiment.plate.date
        if date not in data:
            data[date] = {'experiments': []}
        data[date]['experiments'].append(experiment)

        inner_filters = copy(filters)
        inner_filters['plate__date'] = date

        data[date]['link_to_all'] = build_url('find_experiment_wells_url',
                                              get=inner_filters)

    context = {
        'mutant': mutant,
        'l4440': l4440,
        'temperature': temperature,
        'data': data,
    }

    return render(request, 'mutant_knockdown.html', context)
コード例 #4
0
ファイル: views_knockdown.py プロジェクト: katur/eegi
def mutant_knockdown(request, mutant, temperature):
    """
    Render the page showing knockdown by mutation only.

    context['data'] is returned in format:

        {date: {
            'experiments': [experiments], 'link_to_all': url,
        }}
    """
    data = OrderedDict()

    l4440 = Clone.get_l4440()
    mutant = get_object_or_404(WormStrain, pk=mutant)

    filters = {
        'is_junk': False,
        'worm_strain': mutant.pk,
        'library_stock__intended_clone': l4440,
        'plate__temperature': temperature,
    }

    # Do not join manual scores, since L4440 not manually scored
    experiments = (Experiment.objects.filter(**filters)
                   .select_related('library_stock', 'plate')
                   .prefetch_related('devstarscore_set')
                   .order_by('-plate__date', 'id'))

    for experiment in experiments:
        date = experiment.plate.date
        if date not in data:
            data[date] = {'experiments': []}
        data[date]['experiments'].append(experiment)

        inner_filters = copy(filters)
        inner_filters['plate__date'] = date

        data[date]['link_to_all'] = build_url(
            'find_experiment_wells_url', get=inner_filters)

    context = {
        'mutant': mutant,
        'l4440': l4440,
        'temperature': temperature,
        'data': data,
    }

    return render(request, 'mutant_knockdown.html', context)
コード例 #5
0
ファイル: models.py プロジェクト: katur/eegi
 def get_link_to_n2_controls(self):
     filters = self.get_n2_control_filters()
     return build_url('find_experiment_wells_url', get=filters)
コード例 #6
0
ファイル: views_basic.py プロジェクト: katur/eegi
def score_experiment_wells(request):
    """
    Render the page to score experiment wells.

    TODO: create base class to capture commonality between this and
    find_experiment_wells

    TODO: better handle case of invalid filter_form
    """
    post_experiments = []
    redo_post = False

    # If there was a previous submit
    if request.POST:
        exp = '^[0-9]+_[A-H][0-1][0-9]-.*_scores?$'
        pattern = re.compile(exp)

        pks = [k.split('-')[0] for k in request.POST if pattern.match(k)]

        # Check if all POSTs are valid
        for experiment in Experiment.objects.filter(pk__in=pks):
            f = get_score_form(request.GET.get('score_form_key'))
            experiment.score_form = f(request.POST, user=request.user,
                                      prefix=experiment.pk)

            post_experiments.append(experiment)

            if not experiment.score_form.is_valid():
                redo_post = True

        # If all POSTs valid, process and redirect
        if not redo_post:
            for experiment in post_experiments:
                # This actually submits the scores to the database
                experiment.score_form.process()

            url = build_url('score_experiment_wells_url', get=request.GET)
            return HttpResponseRedirect(url)

    # Bind filter form with GET params
    if request.GET:
        filter_form = FilterExperimentWellsToScoreForm(
            request.GET, user=request.user)
    else:
        filter_form = FilterExperimentWellsToScoreForm()

    if (not request.GET or not filter_form.is_valid()):
        return render(request, 'score_experiment_wells_setup.html', {
            'filter_form': filter_form
        })

    # At this point, filter form is valid and cleaned
    filter_data = filter_form.process()
    experiments = filter_data['experiments']
    unscored_by_user = filter_data['unscored_by_user']

    if redo_post:
        # These already have attached and bound score forms
        display_experiments = post_experiments

    else:
        per_page = filter_data['images_per_page']

        if unscored_by_user:
            display_experiments = experiments[:per_page]
        else:
            display_experiments = get_paginated(request, experiments, per_page)

        # Attach a score form to each experiment
        score_form = filter_data['score_form']
        for experiment in display_experiments:
            experiment.score_form = score_form(prefix=experiment.pk)

    context = {
        'experiments': experiments,
        'display_experiments': display_experiments,
        'unscored_by_user': filter_data['unscored_by_user'],
        'do_not_display': ['images_per_page', 'score_form_key', 'is_junk']
    }

    return render(request, 'score_experiment_wells.html', context)
コード例 #7
0
 def get_link_to_n2_controls(self):
     filters = self.get_n2_control_filters()
     return build_url('find_experiment_wells_url', get=filters)
コード例 #8
0
def score_experiment_wells(request):
    """
    Render the page to score experiment wells.

    TODO: create base class to capture commonality between this and
    find_experiment_wells

    TODO: better handle case of invalid filter_form
    """
    post_experiments = []  # list that stores all submitted scores per exp
    redo_post = False

    # If there was a previous submit
    # post is submitting the database
    # This is passing through all the same get paramters (the filtering params)
    # keeping him on the same page
    # GET and POST both happen every time
    if request.POST:
        exp = '^[0-9]+_[A-H][0-1][0-9]-.*_scores?$'
        pattern = re.compile(exp)

        pks = [k.split('-')[0] for k in request.POST if pattern.match(k)]

        # Check if all POSTs are valid
        for experiment in Experiment.objects.filter(pk__in=pks):
            # gets the form from either enhancer or Suppressor
            f = get_score_form(request.GET.get('score_form_key'))
            experiment.score_form = f(request.POST,
                                      user=request.user,
                                      prefix=experiment.pk)

            post_experiments.append(experiment)

            if not experiment.score_form.is_valid():
                redo_post = True

        # If all POSTs valid, process and redirect
        # this saves scores and brings back to the same page and
        # resets the POST data so that there's not a double submit
        if not redo_post:
            for experiment in post_experiments:
                # This actually submits the scores to the database
                experiment.score_form.process()

            url = build_url('score_experiment_wells_url', get=request.GET)
            return HttpResponseRedirect(url)

    # Bind filter form with GET params
    # If there's stuff to limit on
    # .GET parameters is taken from the input form
    if request.GET:
        filter_form = FilterExperimentWellsToScoreForm(request.GET,
                                                       user=request.user)
    else:
        filter_form = FilterExperimentWellsToScoreForm()

    if (not request.GET or not filter_form.is_valid()):
        return render(request, 'score_experiment_wells_setup.html',
                      {'filter_form': filter_form})

    # At this point, filter form is valid and cleaned
    filter_data = filter_form.process()
    experiments = filter_data['experiments']
    unscored_by_user = filter_data['unscored_by_user']

    if redo_post:
        # These already have attached and bound score forms
        display_experiments = post_experiments

    else:
        per_page = filter_data['images_per_page']

        if unscored_by_user:
            display_experiments = experiments[:per_page]
        else:
            display_experiments = get_paginated(request, experiments, per_page)

        # Attach a score form to each experiment
        # the prefix attaches the experiment's pk to each form field which makes it queryable
        # when posting
        # This sets the class attribute 'score_form' to the secondary enhacer score forms
        # which is then called and rendered in the template
        score_form = filter_data['score_form']
        for experiment in display_experiments:
            experiment.score_form = score_form(prefix=experiment.pk)

    context = {
        'experiments': experiments,
        'display_experiments': display_experiments,
        'unscored_by_user': filter_data['unscored_by_user'],
        # 'do_not_display': ['images_per_page', 'score_form_key', 'is_junk']
        'do_not_display': ['images_per_page', 'score_form_key']
    }

    return render(request, 'score_experiment_wells.html', context)