コード例 #1
0
ファイル: export.py プロジェクト: davidmote/occams_studies
def status_json(context, request):
    """
    Returns the current exports statuses.
    """

    exports_query = query_exports(request)
    exports_count = exports_query.count()

    pagination = Pagination(request.GET.get('page', 1), 5, exports_count)
    exports_query = exports_query.offset(pagination.offset).limit(5)

    locale = negotiate_locale_name(request)
    localizer = get_localizer(request)

    redis = request.redis

    def export2json(export):
        # TODO: This doesn't actually work, I can't figure out how to get
        #       the corect data out of redis
        if export.status != 'complete':
            data = redis.hgetall(export.redis_key)
        else:
            data = {}
        log.debug('info: {}'.format(str(data)))
        count = len(export.contents)
        return {
            'id': export.id,
            'title': localizer.pluralize(
                _(u'Export containing ${count} item'),
                _(u'Export containing ${count} items'),
                count, 'occams_studies', mapping={'count': count}),
            'name': export.name,
            'status': export.status,
            'use_choice_labels': export.use_choice_labels,
            'expand_collections': export.expand_collections,
            'contents': sorted(export.contents, key=lambda v: v['title']),
            'count': data.get('count'),
            'total': data.get('total'),
            'file_size': (naturalsize(export.file_size)
                          if export.file_size else None),
            'download_url': request.route_path('studies.export_download',
                                               export=export.id),
            'delete_url': request.route_path('studies.export',
                                             export=export.id),
            'create_date': format_datetime(export.create_date, locale=locale),
            'expire_date': format_datetime(export.expire_date, locale=locale)
        }

    return {
        'csrf_token': request.session.get_csrf_token(),
        'pager': pagination.serialize(),
        'exports': [export2json(e) for e in exports_query]
    }
コード例 #2
0
ファイル: study.py プロジェクト: jkrooskos/occams_studies
def visits_cycle(context, request):
    """
    This view displays summary statistics about visits that are related to
    this cycle, as well as a listing of those visits for reference.
    """
    db_session = request.db_session

    cycle = (db_session.query(models.Cycle).filter_by(
        study=context, name=request.matchdict['cycle']).first())

    if not cycle:
        raise HTTPNotFound()

    states = db_session.query(datastore.State).order_by('id').all()

    data = {
        'states': states,
        'visit_count': cycle.visits.count(),
        'data_summary': {},
        'visits_summary': {}
    }

    by_state = (request.GET.get('by_state') or '').strip()
    by_state = next((state for state in states if state.name == by_state),
                    None)

    for state in states:
        data['visits_summary'][state.name] = (cycle.visits.filter(
            models.Visit.entities.any(state=state)).count())
        data['data_summary'][state.name] = (db_session.query(
            datastore.Entity).join(datastore.Entity.contexts).join(
                models.Visit, (datastore.Context.external == 'visit')
                & (models.Visit.id == datastore.Context.key)).filter(
                    models.Visit.cycles.any(id=cycle.id)).filter(
                        datastore.Entity.state == state).count())

    def count_state_exp(name):
        return sa.func.count(
            sa.sql.case([(datastore.State.name == name, sa.true())],
                        else_=sa.null()))

    site_ids = [
        site.id for site in db_session.query(models.Site)
        if request.has_permission('view', site)
    ]

    if site_ids:
        visits_query = (db_session.query(
            models.Patient.pid,
            models.Visit.visit_date).select_from(models.Visit).filter(
                models.Visit.cycles.
                any(id=cycle.id)).join(models.Visit.patient).join(
                    datastore.Context, (datastore.Context.external
                                        == sa.sql.literal_column(u"'visit'"))
                    & (datastore.Context.key == models.Visit.id)).join(
                        datastore.Context.entity).join(
                            datastore.Entity.state).add_columns(*[
                                count_state_exp(state.name).label(state.name)
                                for state in states
                            ]).filter(
                                models.Patient.site.has(
                                    models.Site.id.in_(site_ids))).group_by(
                                        models.Patient.pid,
                                        models.Visit.visit_date).order_by(
                                            models.Visit.visit_date.desc()))

        if by_state:
            visits_query = visits_query.having(
                count_state_exp(by_state.name) > 0)

        total_visits = visits_query.count()

    else:

        total_visits = 0

    try:
        page = int((request.GET.get('page') or '').strip())
    except ValueError:
        page = 1

    pagination = Pagination(page, 25, total_visits)

    if site_ids:
        visits = (visits_query.offset(pagination.offset).limit(
            pagination.per_page).all())
    else:
        visits = []

    def make_page_url(page):
        return request.current_route_path(_query={
            'state': by_state and by_state.name,
            'page': page
        })

    data.update({
        'cycle': cycle,
        'by_state': by_state,
        'offset_start': pagination.offset + 1,
        'offset_end': pagination.offset + len(visits),
        'total_visits': total_visits,
        'make_page_url': make_page_url,
        'pagination': pagination,
        'visits': visits
    })

    return data
コード例 #3
0
ファイル: study.py プロジェクト: jkrooskos/occams_studies
def enrollments(context, request):
    """
    Displays enrollment summary and allows the user to filter by date.
    """
    db_session = request.db_session

    statuses = {
        'active': models.Enrollment.termination_date == sa.null(),
        'terminated': models.Enrollment.termination_date != sa.null(),
    }

    class FilterForm(Form):
        page = wtforms.IntegerField()
        status = wtforms.StringField(validators=[
            wtforms.validators.Optional(),
            wtforms.validators.AnyOf(statuses)
        ])
        start = DateField()
        end = DateField()

    form = FilterForm(request.GET)
    form.validate()

    sites_query = db_session.query(models.Site)
    site_ids = [s.id for s in sites_query if request.has_permission('view', s)]

    if site_ids:

        enrollments_query = (db_session.query(
            models.Patient.pid, models.Enrollment.reference_number,
            models.Enrollment.consent_date,
            models.Enrollment.latest_consent_date,
            models.Enrollment.termination_date).add_columns(
                *[expr.label(name)
                  for name, expr in statuses.items()]).select_from(
                      models.Enrollment).join(models.Enrollment.patient).join(
                          models.Enrollment.study).filter(
                              models.Enrollment.study == context).order_by(
                                  models.Enrollment.consent_date.desc()))

        if form.start.data:
            enrollments_query = enrollments_query.filter(
                models.Enrollment.consent_date >= form.start.data)

        if form.end.data:
            enrollments_query = enrollments_query.filter(
                models.Enrollment.consent_date <= form.end.data)

        if form.status.data:
            enrollments_query = enrollments_query.filter(
                statuses[form.status.data])

        total_enrollments = enrollments_query.count()

    else:
        total_enrollments = 0

    pagination = Pagination(form.page.data, 25, total_enrollments)

    if site_ids:
        enrollments = (enrollments_query.offset(pagination.offset).limit(
            pagination.per_page).all())
    else:
        enrollments = []

    def make_page_url(page):
        _query = form.data
        _query['page'] = page
        return request.current_route_path(_query=_query)

    return {
        'params':
        form.data,
        'total_active':
        (context.enrollments.filter(statuses['active']).count()),
        'total_terminated':
        (context.enrollments.filter(statuses['terminated']).count()),
        'make_page_url':
        make_page_url,
        'offset_start':
        pagination.offset + 1,
        'offset_end':
        pagination.offset + len(enrollments),
        'enrollments':
        enrollments,
        'pagination':
        pagination
    }
コード例 #4
0
ファイル: aliquot.py プロジェクト: jkrooskos/occams_lims
def filter_aliquot(context, request, state, page_key='page', omit=None):
    db_session = request.db_session

    omit = set(omit or [])

    types_query = db_session.query(models.AliquotType).order_by('title')
    available_types = [(t.id, t.title) for t in types_query]

    states_query = db_session.query(models.AliquotState).order_by('title')
    available_states = [(s.id, s.title) for s in states_query]

    cycles_query = db_session.query(studies.Cycle).order_by('title')
    available_cycles = [(s.id, s.title) for s in cycles_query]

    class FilterForm(wtforms.Form):

        pid = wtforms.StringField(_(u'PID'),
                                  validators=[wtforms.validators.Optional()])

        aliquot_types = wtforms.SelectMultipleField(
            _(u'Aliquot Types'),
            choices=available_types,
            coerce=int,
            validators=[wtforms.validators.Optional()])

        aliquot_states = wtforms.SelectMultipleField(
            _(u'Aliquot States'),
            choices=available_states,
            coerce=int,
            validators=[wtforms.validators.Optional()])

        visit_cycles = wtforms.SelectMultipleField(
            _(u'Visit Cycles'),
            choices=available_cycles,
            coerce=int,
            validators=[wtforms.validators.Optional()])

        from_ = DateField(_(u'From Date'),
                          validators=[
                              wtforms.validators.Optional(),
                              DateRange(min=date(1900, 1, 1))
                          ])

        to = DateField(_(u'To Date'),
                       validators=[
                           wtforms.validators.Optional(),
                           DateRange(min=date(1900, 1, 1))
                       ])

        freezer = wtforms.StringField(
            _(u'Freezer'), validators=[wtforms.validators.Optional()])

        rack = wtforms.StringField(_(u'Rack'),
                                   validators=[wtforms.validators.Optional()])

        box = wtforms.StringField(_(u'Box'),
                                  validators=[wtforms.validators.Optional()])

    filter_form = FilterForm(request.GET)

    for name in omit:
        del filter_form[name]

    # TODO: There is a possibility that the listing might get
    #       updated between requests, we need to make sure the same
    #       listing is repeatable...
    query = (db_session.query(models.Aliquot).join(
        models.Aliquot.specimen).join(models.Specimen.patient).join(
            models.Aliquot.aliquot_type).join(models.Aliquot.state).filter(
                (models.Aliquot.location == context)
                | (models.Aliquot.previous_location == context)).order_by(
                    studies.Patient.pid, models.AliquotType.title,
                    models.Aliquot.id))

    if 'pid' not in omit and filter_form.pid.data:
        query = query.filter(
            studies.Patient.pid.ilike('%s%%' % filter_form.pid.data))

    if 'aliquot_types' not in omit and filter_form.aliquot_types.data:
        query = query.filter(
            models.Aliquot.aliquot_type_id.in_(filter_form.aliquot_types.data))

    if 'aliquot_states' not in omit and filter_form.aliquot_states.data:
        query = query.filter(
            models.Aliquot.state_id.in_(filter_form.aliquot_states.data))
    else:
        query = query.filter(models.AliquotState.name == state)

    if 'visit_cycles' not in omit and filter_form.visit_cycles.data:
        query = query.filter(
            models.Aliquot.specimen.has(
                models.Specimen.cycle_id.in_(filter_form.visit_cycles.data)))

    if 'from_' not in omit and filter_form.from_.data:
        query = query.filter(
            (models.Aliquot.collect_date >= filter_form.from_.data)
            | (models.Aliquot.inventory_date >= filter_form.from_.data))

    if 'to' not in omit and filter_form.to.data:
        query = query.filter(
            (models.Aliquot.collect_date <= filter_form.to.data)
            | (models.Aliquot.inventory_date <= filter_form.to.data))

    if 'freezer' not in omit and filter_form.freezer.data:
        query = query.filter(
            models.Aliquot.freezer == filter_form.freezer.data)

    if 'rack' not in omit and filter_form.rack.data:
        query = query.filter(models.Aliquot.rack == filter_form.rack.data)

    if 'box' not in omit and filter_form.box.data:
        query = query.filter(models.Aliquot.box == filter_form.box.data)

    total_count = query.count()
    pager = Pagination(request.GET.get(page_key), 20, total_count)

    aliquot = query.offset(pager.offset).limit(pager.per_page).all()

    return {
        'filter_form': filter_form,
        'full_query': query,
        'aliquot': aliquot,
        'has_aliquot': len(aliquot) > 0,
        'pager': pager,
    }
コード例 #5
0
ファイル: specimen.py プロジェクト: mstroehle/occams_lims
def filter_specimen(context, request, state, page_key='page', omit=None):
    db_session = request.db_session

    omit = set(omit or [])

    types_query = db_session.query(models.SpecimenType).order_by('title')
    available_types = [(t.id, t.title) for t in types_query]

    states_query = db_session.query(models.SpecimenState).order_by('title')
    available_states = [(s.id, s.title) for s in states_query]

    cycles_query = db_session.query(studies.Cycle).order_by('title')
    available_cycles = [(s.id, s.title) for s in cycles_query]

    class FilterForm(wtforms.Form):

        pid = wtforms.StringField(
            _(u'PID'),
            validators=[wtforms.validators.Optional()])

        specimen_types = wtforms.SelectMultipleField(
            _(u'Specimen Types'),
            choices=available_types,
            coerce=int,
            validators=[wtforms.validators.Optional()])

        specimen_states = wtforms.SelectMultipleField(
            _(u'Specimen States'),
            choices=available_states,
            coerce=int,
            validators=[wtforms.validators.Optional()])

        visit_cycles = wtforms.SelectMultipleField(
            _(u'Visit Cycles'),
            choices=available_cycles,
            coerce=int,
            validators=[wtforms.validators.Optional()])

        from_ = DateField(
            _(u'From Date'),
            validators=[
                wtforms.validators.Optional(),
                DateRange(min=date(1900, 1, 1))
            ])

        to = DateField(
            _(u'To Date'),
            validators=[
                wtforms.validators.Optional(),
                DateRange(min=date(1900, 1, 1))
            ])

    filter_form = FilterForm(request.GET)

    for name in omit:
        del filter_form[name]

    # TODO: There is a possibility that the listing might get
    #       updated between requests, we need to make sure the same
    #       listing is repeatable...
    query = (
        db_session.query(models.Specimen)
        .filter(
            (models.Specimen.location == context)
            | (models.Specimen.previous_location == context))
        .order_by(
            models.Specimen.collect_date.desc().nullsfirst(),
            models.Specimen.patient_id,
            models.Specimen.specimen_type_id,
            models.Specimen.id))

    if 'pid' not in omit and filter_form.pid.data:
        query = query.filter(models.Specimen.patient.has(
            studies.Patient.pid.ilike('%s%%' % filter_form.pid.data)))

    if 'specimen_types' not in omit and filter_form.specimen_types.data:
        query = query.filter(models.Specimen.specimen_type.has(
            models.SpecimenType.id.in_(filter_form.specimen_types.data)))

    if 'specimen_states' not in omit and filter_form.specimen_states.data:
        query = query.filter(models.Specimen.state.has(
            models.SpecimenState.id.in_(filter_form.specimen_states.data)))
    else:
        query = query.filter(models.Specimen.state.has(name=state))

    if 'visit_cycles' not in omit and filter_form.visit_cycles.data:
        query = query.filter(
            models.Specimen.cycle_id.in_(filter_form.visit_cycles.data))

    if 'from_' not in omit and filter_form.from_.data:
        query = query.filter(
            models.Specimen.collect_date >= filter_form.from_.data)

    if 'to' not in omit and filter_form.to.data:
        query = query.filter(
            models.Specimen.collect_date <= filter_form.to.data)

    total_count = query.count()
    pager = Pagination(request.GET.get(page_key), 10, total_count)

    specimen = query.offset(pager.offset).limit(pager.per_page).all()

    return {
        'filter_form': filter_form,
        'specimen': specimen,
        'has_specimen': len(specimen) > 0,
        'pager': pager,
    }
コード例 #6
0
ファイル: export.py プロジェクト: jkrooskos/occams_studies
def status_json(context, request):
    """
    Returns the current exports statuses.
    """

    exports_query = query_exports(request)
    exports_count = exports_query.count()

    pagination = Pagination(request.GET.get('page', 1), 5, exports_count)
    exports_query = exports_query.offset(pagination.offset).limit(5)

    locale = negotiate_locale_name(request)
    localizer = get_localizer(request)

    redis = request.redis

    def export2json(export):
        # TODO: This doesn't actually work, I can't figure out how to get
        #       the corect data out of redis
        if export.status != 'complete':
            data = redis.hgetall(export.redis_key)
        else:
            data = {}
        log.debug('info: {}'.format(str(data)))
        count = len(export.contents)
        return {
            'id':
            export.id,
            'title':
            localizer.pluralize(_(u'Export containing ${count} item'),
                                _(u'Export containing ${count} items'),
                                count,
                                'occams_studies',
                                mapping={'count': count}),
            'name':
            export.name,
            'status':
            export.status,
            'use_choice_labels':
            export.use_choice_labels,
            'expand_collections':
            export.expand_collections,
            'contents':
            sorted(export.contents, key=lambda v: v['title']),
            'count':
            data.get('count'),
            'total':
            data.get('total'),
            'file_size':
            (naturalsize(export.file_size) if export.file_size else None),
            'download_url':
            request.route_path('studies.export_download', export=export.id),
            'delete_url':
            request.route_path('studies.export', export=export.id),
            'create_date':
            format_datetime(export.create_date, locale=locale),
            'expire_date':
            format_datetime(export.expire_date, locale=locale)
        }

    return {
        'csrf_token': request.session.get_csrf_token(),
        'pager': pagination.serialize(),
        'exports': [export2json(e) for e in exports_query]
    }