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
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)
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)
def get_link_to_n2_controls(self): filters = self.get_n2_control_filters() return build_url('find_experiment_wells_url', get=filters)
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)
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)