예제 #1
0
def get_medication(request, patient_id, medication_id):
    resp = {'success': False}
    history_list = []

    if permissions_accessed(request.user, int(patient_id)):
        try:
            medication = Medication.objects.get(id=medication_id)
            reversion_list = reversion.get_for_object(medication)
            for item in reversion_list:
                history_list.append({
                    'date':
                    item.revision.date_created.isoformat(),
                    'comment':
                    item.revision.comment
                })
            notes = MedicationTextNote.objects.filter(
                medication_id=medication_id).order_by('-datetime')
        except Medication.DoesNotExist:
            pass

        resp['success'] = True
        resp['info'] = MedicationSerializer(medication).data
        resp['history'] = history_list
        resp['noteHistory'] = MedicationTextNoteSerializer(notes,
                                                           many=True).data

    return ajax_response(resp)
예제 #2
0
def get_tab_info(request, tab_id):
    resp = {'success': False}
    tab_info = MyStoryTab.objects.get(id=tab_id)
    if permissions_accessed(request.user, tab_info.patient.id):
        resp['success'] = True
        resp['info'] = MyStoryTabSerializer(tab_info).data
    return ajax_response(resp)
예제 #3
0
def pin_to_problem(request, patient_id):
    resp = {'success': False}
    if permissions_accessed(request.user, int(patient_id)):
        medication_id = request.POST.get("medication_id", None)
        problem_id = request.POST.get("problem_id", None)

        try:
            pin = MedicationPinToProblem.objects.get(
                medication_id=medication_id, problem_id=problem_id)
            pin.delete()
        except MedicationPinToProblem.DoesNotExist:
            pin = MedicationPinToProblem(author=request.user,
                                         medication_id=medication_id,
                                         problem_id=problem_id)
            pin.save()

            pinned_instance_set, count = count_pinned_have_same_medication_concept_id_and_problem_concept_id(
                request.user, pin.medication, pin.problem)
            if request.user.profile.role == "physician" and count >= 3:
                op_pin_medication_to_problem_for_all_controlled_patient(
                    request.user, pinned_instance_set, pin.medication,
                    pin.problem)
        resp['pin'] = MedicationPinToProblemSerializer(pin).data
        resp['success'] = True

    return ajax_response(resp)
예제 #4
0
def delete_note(request, note_id):
    resp = {'success': False}
    note = ColonCancerTextNote.objects.get(id=note_id)
    if permissions_accessed(request.user, note.author.id):
        note.delete()
        resp['success'] = True
    return ajax_response(resp)
예제 #5
0
def obseration_pin_to_problem(request, patient_id):
    resp = {'success': False}
    if permissions_accessed(request.user, int(patient_id)) or True:
        observation_id = request.POST.get("data_id", None)
        problem_id = request.POST.get("problem_id", None)
        observation = Observation.objects.get(id=observation_id)

        try:
            pin = ObservationPinToProblem.objects.get(
                observation_id=observation_id, problem_id=problem_id)
            up = UserProfile.objects.get(user_id=request.user.id)
            if up.role == 'patient' and pin.author_id != request.user.id:
                resp['success'] = "notallow"
                return ajax_response(resp)
            pin.delete()
            problems = Problem.objects.filter(patient_id=patient_id)
            optp = ObservationPinToProblem.objects.values_list(
                'observation_id', ).filter(problem__in=problems)
            optp1 = []
            for x in optp:
                optp1.append(x[0])
            component = ObservationComponent.objects.filter(
                observation_id__in=optp1, component_code='6301-6')
            if ObservationComponent.objects.filter(
                    observation=observation,
                    component_code='6301-6').exists() and len(component) < 1:
                inr_objects_filter = Inr.objects.filter(
                    observation_value__component__observation_id=observation_id
                )
                if inr_objects_filter.exists():
                    inr_objects_filter.delete()
                    resp['remove_inr'] = True
        except ObservationPinToProblem.DoesNotExist:
            problems = Problem.objects.filter(patient_id=patient_id)
            optp = ObservationPinToProblem.objects.values_list(
                'observation_id', ).filter(problem__in=problems).distinct()
            optp1 = []
            for x in optp:
                optp1.append(x[0])
            component = ObservationComponent.objects.filter(
                observation_id__in=optp1, component_code='6301-6')
            pin = ObservationPinToProblem(author_id=request.user.id,
                                          observation_id=observation_id,
                                          problem_id=problem_id)
            pin.save()
            if ObservationComponent.objects.filter(
                    observation=observation,
                    component_code='6301-6').exists() and len(component) < 1:
                patient_user = User.objects.get(id=patient_id)
                inr = Inr(observation_id=observation_id,
                          problem_id=problem_id,
                          author=request.user,
                          patient=patient_user)
                inr.save()
                resp['inr'] = InrSerializer(inr).data

        resp['pin'] = ObservationPinToProblemSerializer(pin).data
        resp['success'] = True

    return ajax_response(resp)
예제 #6
0
def save_data_type(request, patient_id, observation_id):
    resp = {'success': False}
    name = request.POST.get("name", None)
    color_code = request.POST.get("color", None)
    unit = request.POST.get("unit", None)
    if permissions_accessed(request.user, int(patient_id)):
        observation = Observation.objects.get(id=observation_id)
        if observation.author is not None:  # prevent default datas
            observation.name = name
            observation.color = color_code
            observation.save()

            # TODO: will be changed later if we have more components in one custom observation
            for component in observation.observation_components.all():
                component.name = name
                component.component_code = request.POST.get("code", None)
                component.save()

            if unit:
                for observation_unit in observation.observation_units.all():
                    observation_unit.value_unit = unit
                    observation_unit.save()

            resp['observation'] = ObservationSerializer(observation).data
            resp['success'] = True

    return ajax_response(resp)
예제 #7
0
def save_text_component_entry(request, patient_id, component_id):
    resp = {}
    resp['success'] = False
    if permissions_accessed(request.user, int(patient_id)):
        component = MyStoryTextComponent.objects.get(id=int(component_id))
        patient = User.objects.get(id=patient_id)

        entry = MyStoryTextComponentEntry()
        entry.component = component
        entry.text = request.POST.get("text", None)
        entry.patient = patient
        entry.author = request.user
        entry.save()

        resp['entry'] = MyStoryTextComponentEntrySerializer(entry).data

        actor = request.user

        summary = "<b>%s</b> note was updated to %s" % (component.name,
                                                        entry.text)
        op_add_event(actor, patient, summary)

        resp['success'] = True

    return ajax_response(resp)
예제 #8
0
def get_my_story(request, patient_id):
    resp = {'success': False}
    if permissions_accessed(request.user, int(patient_id)):
        # # METHOD 2: NEW WAY
        staffIDList = PatientController.objects.filter(
            patient_id=int(patient_id)).values_list('physician_id', flat=True)

        myStoryTabComponentQuerySet = MyStoryTextComponent.objects.filter(
            Q(patient_id=int(patient_id))
            | (Q(author_id__in=staffIDList) & Q(is_all=True)))
        if request.user.profile.role != 'patient':
            myStoryTabComponentQuerySet = myStoryTabComponentQuerySet.filter(
                private=False)

        # text_component_entries should be filtered by patient only not sharing across any patient
        myStoryTabComponentEntriesQuerySet = MyStoryTextComponentEntry.objects.filter(
            patient_id=int(patient_id))
        myStoryTabQuerySet = MyStoryTab.objects.prefetch_related(
            Prefetch('my_story_tab_components',
                     queryset=myStoryTabComponentQuerySet),
            Prefetch('my_story_tab_components__text_component_entries',
                     queryset=myStoryTabComponentEntriesQuerySet)).filter(
                         Q(patient_id=int(patient_id))
                         | (Q(author_id__in=staffIDList) & Q(is_all=True)))
        if request.user.profile.role != 'patient':
            myStoryTabQuerySet = myStoryTabQuerySet.filter(private=False)

        resp['success'] = True
        resp['info'] = MyStoryTabSerializer(myStoryTabQuerySet, many=True).data
    return ajax_response(resp)
예제 #9
0
def add_factor(request, colon_id):
    resp = {'success': False}
    colon = ColonCancerScreening.objects.get(id=colon_id)
    if permissions_accessed(request.user, colon.patient.id):
        actor_profile = UserProfile.objects.get(user=request.user)

        if not RiskFactor.objects.filter(colon=colon, factor=request.POST.get("value", None)).exists():
            factor = RiskFactor.objects.create(colon=colon, factor=request.POST.get("value", None))
            if factor.factor == 'no known risk':
                factors = RiskFactor.objects.filter(colon=colon).exclude(factor='no known risk')
                for f in factors:
                    f.delete()
            else:
                factors = RiskFactor.objects.filter(colon=colon, factor='no known risk')
                for f in factors:
                    f.delete()

            if RiskFactor.objects.filter(colon=colon).count() == 1 and request.POST.get("value",
                                                                                        None) == 'no known risk':
                colon.risk = 'normal'
            else:
                colon.risk = 'high'
            colon.last_risk_updated_user = request.user
            colon.last_risk_updated_date = datetime.now().date()
            colon.todo_past_five_years = False
            colon.save()
            resp['factor'] = RiskFactorSerializer(factor).data
            resp['info'] = ColonCancerScreeningSerializer(colon).data
            resp['success'] = True

    return ajax_response(resp)
예제 #10
0
def add_new_data_type(request, patient_id):
    resp = {'success': False}
    name = request.POST.get("name", None)
    color_code = request.POST.get("color", None)
    loinc_code = request.POST.get("code", None)
    unit = request.POST.get("unit", None)

    if permissions_accessed(request.user, int(patient_id)):
        # TODO[Observation]
        patient = User.objects.get(id=int(patient_id))
        observation = Observation.objects.create(subject=patient,
                                                 author=request.user,
                                                 name=name,
                                                 color=color_code,
                                                 code=loinc_code)
        observation.save()

        if unit:
            observation_unit = ObservationUnit.objects.create(
                observation=observation, value_unit=unit)
            observation_unit.is_used = True  # will be changed in future when having conversion
            observation_unit.save()

        observation_component = ObservationComponent()
        observation_component.observation = observation
        observation_component.component_code = loinc_code
        observation_component.name = name
        observation_component.save()

        resp['observation'] = ObservationSerializer(observation).data
        resp['success'] = True

    return ajax_response(resp)
예제 #11
0
def delete_individual_data(request, patient_id, value_id):
    resp = {'success': False}
    if permissions_accessed(request.user, int(patient_id)):
        value = ObservationValue.objects.get(id=value_id)
        value.delete()
        resp['success'] = True
    return ajax_response(resp)
예제 #12
0
def delete_study(request, study_id):
    resp = {'success': False}
    study = ColonCancerStudy.objects.get(id=study_id)
    if permissions_accessed(request.user, study.author.id):
        study.delete()

        resp['success'] = True

    return ajax_response(resp)
예제 #13
0
def edit_note(request, note_id):
    resp = {'success': False}
    note = ColonCancerTextNote.objects.get(id=note_id)
    if permissions_accessed(request.user, note.author.id):
        note.note = request.POST.get('note')
        note.save()
        resp['success'] = True
        resp['note'] = ColonCancerTextNoteSerializer(note).data
    return ajax_response(resp)
예제 #14
0
def get_individual_data_info(request, patient_id, value_id):
    resp = {'success': False}
    if permissions_accessed(request.user, int(patient_id)):
        value = ObservationValue.objects.get(id=value_id)
        # TODO: Figure out why this one is fixed OBSERVATION_TYPES[0]['name'] = 'a1c'
        if not value.component.observation.name == 'a1c':
            resp['info'] = ObservationValueSerializer(value).data
            resp['success'] = True
    return ajax_response(resp)
예제 #15
0
def update_graph(request):
    resp = {'success': False}
    # If user have access to this data
    if permissions_accessed(request.user, int(request.POST.get('patient_id'))):
        observation = Observation.objects.get(id=request.POST.get('data_id'))
        observation.graph = request.POST.get('graph_type')
        observation.save()
        resp['success'] = True

    return ajax_response(resp)
예제 #16
0
def add_note(request, colon_id):
    resp = {'success': False}
    colon = ColonCancerScreening.objects.get(id=colon_id)
    if permissions_accessed(request.user, colon.patient.id):
        note = request.POST.get("note")
        colon_note = ColonCancerTextNote.objects.create(colon_id=colon_id, author=request.user, note=note)

        resp['note'] = ColonCancerTextNoteSerializer(colon_note).data
        resp['success'] = True
    return ajax_response(resp)
예제 #17
0
def track_colon_click(request, colon_id):
    resp = {'success': False}
    colon_info = ColonCancerScreening.objects.get(id=colon_id)
    if permissions_accessed(request.user, colon_info.patient.id):
        actor = request.user
        patient = colon_info.problem.patient

        summary = "<b>%s</b> accessed colorectal cancer screening" % (actor.username)
        op_add_event(actor, patient, summary, colon_info.problem)
        resp['success'] = True

    return ajax_response(resp)
예제 #18
0
def delete_study_image(request, study_id, image_id):
    resp = {'success': False}
    study = ColonCancerStudy.objects.get(id=study_id)
    if permissions_accessed(request.user, study.author.id):
        actor_profile = UserProfile.objects.get(user=request.user)
        study.last_updated_user = request.user
        study.save()

        ColonCancerStudyImage.objects.get(id=image_id).delete()

        resp['success'] = True
    return ajax_response(resp)
예제 #19
0
def track_tab_click(request):
    resp = {'success': False}
    if request.POST.get("tab_id", None):
        tab_info = MyStoryTab.objects.get(id=request.POST.get("tab_id", None))
        if permissions_accessed(request.user, tab_info.patient.id):
            actor = request.user
            patient = tab_info.patient

            summary = "<b>%s</b> accessed %s" % (actor.username, tab_info.name)
            op_add_event(actor, patient, summary)
            resp['success'] = True

    return ajax_response(resp)
예제 #20
0
def delete_text_component(request, patient_id, component_id):
    resp = {}
    resp['success'] = False
    if permissions_accessed(request.user, int(patient_id)):
        component = MyStoryTextComponent.objects.get(id=int(component_id))
        if request.user.id == component.author.id:
            MyStoryTextComponentEntry.objects.filter(
                component=component).delete()
            component.delete()

            resp['success'] = True

    return ajax_response(resp)
예제 #21
0
def save_tab(request, patient_id, tab_id):
    resp = {}
    resp['success'] = False
    if permissions_accessed(request.user, int(patient_id)):
        tab = MyStoryTab.objects.get(id=int(tab_id))
        if request.user.id == tab.author.id:
            tab.name = request.POST.get("name", None)
            tab.save()

            resp['tab'] = MyStoryTabSerializer(tab).data
            resp['success'] = True

    return ajax_response(resp)
예제 #22
0
def delete_tab(request, patient_id, tab_id):
    resp = {'success': False}
    if permissions_accessed(request.user, int(patient_id)):
        tab = MyStoryTab.objects.get(id=int(tab_id))
        if request.user.id == tab.author.id:
            MyStoryTextComponentEntry.objects.filter(
                component__tab=tab).delete()
            MyStoryTextComponent.objects.filter(tab=tab).delete()
            tab.delete()

            resp['success'] = True

    return ajax_response(resp)
예제 #23
0
def edit_study(request, study_id):
    resp = {'success': False}
    study = ColonCancerStudy.objects.get(id=study_id)
    if permissions_accessed(request.user, study.author.id):
        actor_profile = UserProfile.objects.get(user=request.user)
        study.finding = request.POST.get("finding", None)
        study.result = request.POST.get("result", None)
        study.note = request.POST.get("note", None)
        study.study_date = datetime.strptime(request.POST.get('study_date'), '%m/%d/%Y').date()
        study.last_updated_user = request.user
        study.save()

        resp['success'] = True

    return ajax_response(resp)
예제 #24
0
def not_appropriate(request, colon_id):
    resp = {'success': False}
    colon = ColonCancerScreening.objects.get(id=colon_id)
    if permissions_accessed(request.user, colon.patient.id):
        if colon.not_appropriate:
            colon.not_appropriate = False
        else:
            colon.not_appropriate = True
            colon.not_appropriate_on = datetime.now()
        colon.save()
        colon = ColonCancerScreening.objects.get(id=colon_id)
        resp['info'] = ColonCancerScreeningSerializer(colon).data
        resp['success'] = True

    return ajax_response(resp)
예제 #25
0
def delete_component_values(request, patient_id):
    """
    Delete observation component values    
    :param patient_id: 
    :param request: 
    :return: 
    """
    resp = {'success': False}
    json_body = json.loads(request.body)
    observation_value_ids = json_body.get('component_values')

    if permissions_accessed(request.user, int(patient_id)):
        ObservationValue.objects.filter(id__in=observation_value_ids).delete()
        resp['success'] = True
    return ajax_response(resp)
예제 #26
0
def get_medications(request, patient_id):
    """

    :param request:
    :param patient_id: Patient user id
    :return:
    """
    resp = {'success': False}

    if permissions_accessed(request.user, int(patient_id)):
        medications = Medication.objects.filter(
            patient__id=patient_id).order_by('name')

        resp['success'] = True
        resp['info'] = MedicationSerializer(medications, many=True).data
    return ajax_response(resp)
예제 #27
0
def save_data(request, patient_id, value_id):
    resp = {'success': False}
    if permissions_accessed(request.user, int(patient_id)):
        value = ObservationValue.objects.get(id=value_id)

        effective_datetime = request.POST.get("datetime", None)
        if effective_datetime:
            effective_datetime = datetime.strptime(effective_datetime,
                                                   '%m/%d/%Y %H:%M')
        value_quantity = request.POST.get("value_quantity", None)

        value.effective_datetime = effective_datetime
        value.value_quantity = value_quantity
        value.save()

        resp['info'] = ObservationValueSerializer(value).data
        resp['success'] = True
    return ajax_response(resp)
예제 #28
0
def get_colon_info(request, colon_id):
    resp = {'success': False}
    colon_info = ColonCancerScreening.objects.get(id=colon_id)
    if permissions_accessed(request.user, colon_info.patient.id):
        if Problem.objects.filter(patient=colon_info.patient, id__in=[93761005, 93854002]).exists():
            if not RiskFactor.objects.filter(colon=colon_info, factor="personal history of colorectal cancer").exists():
                factor = RiskFactor.objects.create(colon=colon_info, factor="personal history of colorectal cancer")
                colon_info.risk = 'high'
                colon_info.save()
        if Problem.objects.filter(patient=colon_info.patient, id__in=[64766004, 34000006]).exists():
            if not RiskFactor.objects.filter(colon=colon_info,
                                             factor="personal history of ulcerative colitis or Crohn's disease").exists():
                factor = RiskFactor.objects.create(colon=colon_info,
                                                   factor="personal history of ulcerative colitis or Crohn's disease")
                colon_info.risk = 'high'
                colon_info.save()
        resp['success'] = True
        resp['info'] = ColonCancerScreeningSerializer(colon_info).data
    return ajax_response(resp)
예제 #29
0
def save_text_component(request, patient_id, component_id):
    resp = {}
    resp['success'] = False
    if permissions_accessed(request.user, int(patient_id)):
        component = MyStoryTextComponent.objects.get(id=int(component_id))
        if request.user.id == component.author.id:
            component.name = request.POST.get("name", None)
            component.concept_id = request.POST.get("concept_id", None)

        component.save()

        resp['component'] = MyStoryTextComponentSerializer(component).data
        entries = MyStoryTextComponentEntry.objects.filter(
            component_id=component.id, patient_id=int(patient_id))
        resp['component'][
            "text_component_entries"] = MyStoryTextComponentEntrySerializer(
                entries, many=True).data
        resp['success'] = True

    return ajax_response(resp)
예제 #30
0
def delete_data(request, patient_id, observation_id):
    resp = {'success': False}
    if permissions_accessed(request.user, int(patient_id)):
        observation = Observation.objects.get(id=observation_id)
        if not observation.author is None:  # prevent default datas
            pins = ObservationPinToProblem.objects.filter(
                observation_id=observation_id)
            for pin in pins:
                pin.delete()

            for component in observation.observation_components.all():
                for value in component.observation_component_values.all():
                    value.delete()
                component.delete()

            observation.delete()

            resp['success'] = True

    return ajax_response(resp)