示例#1
0
def jqmobile_procedures(request, header_id):

    header = EventSetHeader.objects.get(id=header_id)

    interrupts = []

    patient_interrupt = []

    result = []

    inter = Interrupt.objects.all()

    for i in inter:
        interrupts.append((i.name, i.id))

    data = {'header': header_id, 'patient_name': get_patient_full_name(header)}

    pat_inter = PatientInterruptLog.objects.filter(header=header_id)

    if pat_inter:

        for i in pat_inter:
            patient_interrupt.append((i.interrupt.name, i.interrupt.id))
        for i in interrupts:
            c = 0
            for j in patient_interrupt:
                if i[0] == j[0]:
                    c = c + 1
            if c == 0:
                result.append((i[0], i[1]))
        data.update({'interrupts': result})
    else:
        data.update({'interrupts': interrupts})

    return render_to_response('jqmobile/pickaprocedure.html', data)
示例#2
0
def print_receipt(request):
    '''
        Here we return the payment receipt of a particular user.
    '''
    headerID = request.REQUEST.get('headerID', None)
    date = request.REQUEST.get('date', None)

    esh = EventSetHeader.objects.get(id=headerID)

    payments = Payment.objects.filter(header=esh)

    patient_name = get_patient_full_name(
        esh)  #esh.patient.lName + " " +  esh.patient.fName

    patient = {
        'name': patient_name,
        'esh': esh,
        'date': date,
        'payments': payments
    }

    template = 'pdf/payment_receipt.htm'

    #tpl = loader.get_template(template)
    #pdf_resource = tpl.render(Context(patient))
    #response = HttpResponse(pdf_resource)

    #response.pdf = True

    return direct_to_template(request, 'pdf/payment_receipt.htm', patient)
示例#3
0
def jqmobile_event_patient_summary(request, clinic_id, event_id):
    '''
        List the patients specific to an event under a clinic.
    '''

    clinic = Clinic.objects.get(id=clinic_id)
    event = Event.objects.get(id=event_id)

    dtStart, dtEnd = get_request_period(request, clinic)
    eshs = EventSetHeader.objects.filter(clinic=clinic).exclude(
        dateTime__gte=dtEnd).filter(dateTime__gte=dtStart)

    patient_list = []
    patient_info = {}

    for esh in eshs:

        flag = "false"

        pevlog = PatientEventLog.objects.filter(header=esh)
        '''
          if a patient has a  delete entry in PatientEventLog table,we have to remove that patient 
          from further process. We use a flag to check the delete entry.
          flag=false means that patient has no delete entry
          
        '''

        for pev in pevlog:
            if pev.event.name == "delete":
                flag = "True"
        if flag == "false":

            patient_name = get_patient_full_name(esh)

            current_event = get_current_patient_event(pevlog)

            patient_info = {
                'name': patient_name,
                'header_id': esh.id,
                'event_num': current_event.get('event_num'),
                'waiting_time': format_time(current_event.get('waiting_time'))
            }

            #Add the patient_info to master dict, if its matches the filter condition.
            if current_event.get('event_name') == event.name:
                patient_list.append(patient_info)

    #To get the new patient at the top
    patient_list.reverse()

    data = {'patients': patient_list}

    return render_to_response('jqmobile/patientsummary.html', data)
示例#4
0
def jqmobile_event_patient_summary(request,clinic_id,event_id):
    '''
        List the patients specific to an event under a clinic.
    '''
    
    clinic = Clinic.objects.get(id = clinic_id)
    event = Event.objects.get(id = event_id)
    
    
    dtStart, dtEnd = get_request_period(request,clinic)
    eshs = EventSetHeader.objects.filter(clinic = clinic).exclude(dateTime__gte=dtEnd).filter(dateTime__gte=dtStart)
    
    patient_list = []
    patient_info = {}
    
    for esh in eshs:
        
        pevlog = PatientEventLog.objects.filter(header = esh)
        
        patient_name = get_patient_full_name(esh)
        
        current_event = get_current_patient_event(pevlog)
        
        patient_info = {
                        'name': patient_name,
                        'header_id': esh.id,
                        'event_num': current_event.get('event_num'),
                        'waiting_time': format_time(current_event.get('waiting_time'))
                        }
        
        #Add the patient_info to master dict, if its matches the filter condition.
        if current_event.get('event_name') == event.name:
            patient_list.append(patient_info)
    
    #To get the new patient at the top    
    patient_list.reverse()
    
    data = { 'patients': patient_list }
    
    return render_to_response('jqmobile/patientsummary.html',data)
示例#5
0
def export_pdf(request):

    pdf_type = request.REQUEST.get("type", None)

    clinic = get_object_or_404(Clinic,
                               id=request.REQUEST.get("clinicID", None))

    dtStart, dtEnd = get_request_period(request, clinic)
    '''
    try:
        date = time.strptime(request.REQUEST.get('date',''),'%Y-%m-%d')
        date = datetime.date.fromtimestamp(time.mktime(date))
    except Exception, e:
        raise
        date = datetime.date.today()
           
    dtStart = datetime.datetime(date.year,date.month,date.day,0,0,0)
    dtEnd = dtStart + datetime.timedelta(days=1)file (6
    '''

    context = {'date': dtStart}

    if pdf_type == "frontdesk":
        # patients = []
        dataset = EventSetHeader.objects.filter(dateTime__gte=dtStart,
                                                dateTime__lt=dtEnd)
        event_map = get_clinic_event_map(clinic.id)
        if request.REQUEST.has_key("clinicID"):
            #clinic = get_object_or_404(Clinic, id=request.REQUEST['clinicID'])
            context['clinic'] = clinic
            dataset = dataset.filter(clinic=clinic)
        '''           
        for h in dataset:
            x = {}
            x['patient'] = h.patient
            x['file (6events'] = {}
            for ev in PatientEventLog.objects.filter(header = h):
                x['events'][ev.event.name] = ev.dateTime

            x['payment'] = Payment.objects.filter(header = h).aggregate(sum=Sum('amount'))['sum']
            # for i in xrange(100):
            patients.append(x)
            '''
        c = len(event_map)
        clinic = get_object_or_404(Clinic.objects,
                                   id=request.REQUEST.get("clinicID", None))
        patients = []
        #patient = {}
        #events = []
        for esh in dataset:
            patient_name = get_patient_full_name(
                esh
            )  #esh.patient.lName + "," +  esh.patient.fName + "," +  str(esh.patient.dob)
            patient_event_logs = PatientEventLog.objects.filter(header=esh)
            events = []
            #for event in event_map:
            #event_time = get_event_time(patient_event_logs,event[1])
            event_time_first = get_event_time(patient_event_logs,
                                              event_map[0][1])
            event_time_last = get_event_time(patient_event_logs,
                                             event_map[c - 1][1])
            events.append(event_time_first)
            events.append(event_time_last)
            payment = Payment.objects.filter(header=esh).aggregate(
                sum=Sum('amount'))['sum']
            patient = {
                "patient_name": patient_name,
                "header": esh.id,
                "events": events
            }
            patients.append(patient)

        #context['events'] = patients
        context['patients'] = patients
        #context['clinic_event_map'] = event_map
        context['clinic_event_map_first'] = event_map[0][1]
        context['clinic_event_map_last'] = event_map[c - 1][1]
        template = "pdf/frontdesk.htm"
        # raise Exception(pat'''ients)

    elif pdf_type == "reports":

        from collections import defaultdict
        clinic = get_object_or_404(Clinic.objects,
                                   id=request.REQUEST.get("clinicID", None))

        def _diff(dict, a_key, b_key):
            dfl = datetime.datetime(year=datetime.MINYEAR, month=1, day=1)
            a = dict.get(a_key, dfl)
            b = dict.get(b_key, dfl)
            # raise Exception(a,b)
            td = (b - a)
            td = (td.microseconds +
                  (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
            if (td < 0):
                return None
            else:
                return td / 60

        '''
        patients = []
        dataset = EventSetHeader.objects.filter(dateTime__gte=dtStart,dateTime__lt=dtEnd)
        if request.REQUEST.has_key("clinicID"):
            #clinic = get_object_or_404(Clinic, id=request.REQUEST['clinicID'])
            context['clinic'] = clinic
            dataset = dataset.filter(clinic = clinic)
        for h in dataset:
            x = {}
            x['patient'] = h.patient
            x['events'] = {}
            for ev in PatientEventLog.objects.filter(header = h):
                x['events'][ev.event.name] = ev.dateTime
            x['events']=defaultdict(str,x['events'])
            patients.append(x)
        context['events'] = patients
       '''
        if request.REQUEST.has_key("clinicID"):
            clinic = get_object_or_404(Clinic, id=request.REQUEST['clinicID'])
            eshs = EventSetHeader.objects.filter(clinic=clinic).exclude(
                dateTime__gte=dtEnd).filter(dateTime__gte=dtStart)

        event_map = get_clinic_event_map(clinic.id)
        default_clinic_event_map = []
        for i in range(len(event_map)):
            '''
             creating special header names for report templates.
           '''
            if (i + 1) < len(event_map):
                default_clinic_event_map.append(event_map[i][1] + ' To ' +
                                                event_map[i + 1][1])
            else:
                default_clinic_event_map.append(event_map[i][1])

        context['default_clinic_event_map'] = default_clinic_event_map
        dtStart, dtEnd = get_request_period(request, clinic)
        eshs = EventSetHeader.objects.filter(clinic=clinic).exclude(
            dateTime__gte=dtEnd).filter(dateTime__gte=dtStart)
        patients = []
        #patient = {}
        events = []
        pel_temp = {}
        for esh in eshs:
            pels = PatientEventLog.objects.filter(header=esh)
            patient_name = get_patient_full_name(
                esh
            )  #esh.patient.lName + "," +  esh.patient.fName + "," +  str(esh.patient.dob)
            for pel in pels:
                pel_temp[pel.event.name] = pel.dateTime
            for i in range(len(event_map)):
                '''
                Get time interval between events. The order of the event name is passed in "default_clinic_event_map", it hold the ordered events,
                signingTregistration,..etc..
                
                So the events are already ordered, so we take the event_times according to that order in a list. 
                clinic = get_object_or_404(Clinic.objects, id=request.REQUEST.get("clinicID",None))
                '''
                if (i + 1) < len(event_map):
                    if event_map[i][1] in pel_temp and event_map[
                            i + 1][1] in pel_temp:
                        events.append(":".join(
                            str(pel_temp[event_map[i + 1][1]] -
                                pel_temp[event_map[i][1]]).split(":")[:2]))
                    else:
                        events.append(False)
                else:
                    if event_map[i][1] in pel_temp:
                        events.append(":".join(
                            str(datetime.datetime.now() -
                                pel_temp[event_map[i][1]]).split(":")[:2]))
                    else:
                        events.append(False)
            patient = {
                "patient_name": patient_name,
                "header": esh.id,
                "events": events
            }
            if not 'delete' in pel_temp:
                '''
               If "delete" entry were present, we just discard that user from frontdesk.
              '''
                patients.append(patient)
            pel_temp = {}
            events = []
        context['patients'] = patients
        template = "pdf/reports.htm"

    elif pdf_type == 'payments':
        if not request.REQUEST.has_key("clinicID"):
            raise Http404
        clinic_id = request.REQUEST['clinicID']
        #clinic = get_object_or_404(Clinic, id=clinic_id)

        eshs = EventSetHeader.objects.filter(clinic=clinic).exclude(
            dateTime__gte=dtEnd).filter(
                dateTime__gte=dtStart).order_by("dateTime")
        counts = eshs.count()
        total = {}
        total['cash'] = reduce(lambda a, b: a + b.get_cash(), eshs, 0.0)
        total['cc'] = reduce(lambda a, b: a + b.get_cc(), eshs, 0.0)
        total['total'] = total['cash'] + total['cc']
        total['positivetotal'] = reduce(lambda a, b: a + b.get_positivetotal(),
                                        eshs, 0)
        context['total'] = total
        context['clinic'] = clinic
        context['events'] = eshs
        context['counts'] = counts

        negativeevents = []
        for esh in eshs:
            pay = Payment.objects.filter(header=esh)
            for payment in pay:
                if payment.amount < 0:
                    negativeevents.append(esh)
                    break
        context['negativeevents'] = negativeevents
        negativetotal = {}
        negativetotal['cash'] = reduce(lambda a, b: a + b.get_negcash(),
                                       negativeevents, 0)
        negativetotal['cc'] = reduce(lambda a, b: a + b.get_negcc(),
                                     negativeevents, 0)
        negativetotal[
            'negativetotal'] = negativetotal['cash'] + negativetotal['cc']
        context['negativetotal'] = negativetotal
        context['nettotal'] = total['positivetotal'] + negativetotal[
            'negativetotal']
        template = "pdf/payments.htm"
    else:
        raise Http404()

    tpl = loader.get_template(template)
    pdf_source = tpl.render(Context(context))
    response = HttpResponse(pdf_source)
    response.pdf = True
    return response
示例#6
0
def reports(request):
    ansDict = updateDict(request)
    ansDict['menu'] = 'reports'
    ansDict['left_menu'] = Clinic.objects.all()

    if not request.REQUEST.has_key("clinicID"):
        #ansDict['work_time'] = get_current_worktime()
        ansDict['clinics'] = get_current_clinics()
        return direct_to_template(request, 'reports-base.html', ansDict)

    clinic = get_object_or_404(Clinic.objects,
                               id=request.REQUEST.get("clinicID", None))

    ansDict["clinic"] = clinic

    #Added variables required for the comet session at report page.
    channel_name = 'frontdesk' + str(clinic.id)
    comet = {
        "SESSION_COOKIE_NAME": settings.SESSION_COOKIE_NAME,
        "HOST": settings.INTERFACE,
        "CHANNEL_NAME": channel_name,
        "STOMP_PORT": settings.STOMP_PORT,
        "USER": request.user
    }
    ansDict.update(comet)

    #Get Event map of this clininc. event_map = [(1,signin),(2,registration),...]
    #For User specific mode its better.
    event_map = get_clinic_event_map(clinic.id)
    ansDict['user_clinic_event_map'] = event_map

    #Get user specific event_map, signinTregistration or,,, like that format.

    default_clinic_event_map = []

    for i in range(len(event_map)):
        '''
         creating special header names for report templates.
        '''
        if (i + 1) < len(event_map):
            default_clinic_event_map.append(event_map[i][1] + ' To ' +
                                            event_map[i + 1][1])
        else:
            default_clinic_event_map.append(event_map[i][1])

    ansDict['default_clinic_event_map'] = default_clinic_event_map

    #Featch the initial Report from the serverclinic = get_object_or_404(Clinic.objects, id=request.REQUEST.get("clinicID",None)) itself rather than go for axaj method.
    dtStart, dtEnd = get_request_period(request, clinic)
    eshs = EventSetHeader.objects.filter(clinic=clinic).exclude(
        dateTime__gte=dtEnd).filter(dateTime__gte=dtStart)

    patients = []
    patient = {}
    events = []
    pel_temp = {}

    for esh in eshs:

        pels = PatientEventLog.objects.filter(header=esh)

        patient_name = get_patient_full_name(
            esh
        )  #esh.patient.lName + "," +  esh.patient.fName + "," +  str(esh.patient.dob)

        for pel in pels:
            pel_temp[pel.event.name] = pel.dateTime

        for i in range(len(event_map)):
            '''
                Get time interval between events. The order of the event name is passed in "default_clinic_event_map", it hold the ordered events,
                signingTregistration,..etc..
                
                So the events are already ordered, so we take the event_times according to that order in a list. 
            clinic = get_object_or_404(Clinic.objects, id=request.REQUEST.get("clinicID",None))
            '''
            if (i + 1) < len(event_map):
                if event_map[i][1] in pel_temp and event_map[i +
                                                             1][1] in pel_temp:
                    events.append(":".join(
                        str(pel_temp[event_map[i + 1][1]] -
                            pel_temp[event_map[i][1]]).split(":")[:2]))
                else:
                    events.append(False)
            else:
                if event_map[i][1] in pel_temp:
                    events.append(":".join(
                        str(datetime.datetime.now() -
                            pel_temp[event_map[i][1]]).split(":")[:2]))
                else:
                    events.append(False)
        '''pel_temp = {}
        events = []
        if 'signin' in pel_temp and 'registration' in pel_temp:clinic = get_object_or_404(Clinic.objects, id=request.REQUEST.get("clinicID",None))
            events['signinTregistration'] = ":".join(str(pel_temp['registration'] - pel_temp['signin']).split(":")[:2])
        
        if 'registration' in pel_temp and 'triage' in pel_temp:
            events['registrationTtriage'] = ":".join(str(pel_temp['triage'] - pel_temp['registration']).split(":")[:2])
        
        if 'triage' in pel_temp and 'provider' in pel_temp:
            events['triageTprovider'] = ":".join(str(pel_temp['provider'] - pel_temp['triage']).split(":")[:2])
        
        if 'provider' in pel_temp and 'checkout' in pel_temp:
            events['providerTcheckout'] = ":".join(str(pel_temp['checkout'] - pel_temp['provider']).split(":")[:2])
        
        if 'appointment' in pel_temp:
            events['appointment'] = ":".join(str(datetime.datetime.now() - pel_temp['appointment'] ).split(":")[:2])
        '''

        patient = {
            "patient_name": patient_name,
            "header": esh.id,
            "events": events
        }

        if not 'delete' in pel_temp:
            '''
            If "delete" entry were present, we just discard that user from frontdesk.
            '''
            patients.append(patient)

        #Clear old values.
        pel_temp = {}
        events = []

    patients.reverse()
    ansDict['patients'] = patients

    users = User.objects.all()
    ansDict['users'] = users

    return direct_to_template(request, 'reports.html', ansDict)
示例#7
0
def frontdesk(request):
    '''
        List the Patients under a Clinic.
    '''
    ansDict = updateDict(request)

    ansDict['menu'] = 'frontdesk'
    ansDict['left_menu'] = Clinic.objects.all()
    #if request.REQUEST.has_key("date"):
    #dt = datetime.datetime.strptime(request.REQUEST['date'],"%Y-%m-%d")

    if not request.REQUEST.has_key("clinicID"):
        #ansDict['work_time'] = get_current_worktime()
        ansDict['clinics'] = get_current_clinics()
        return direct_to_template(request, 'frontDesk-base.html', ansDict)

    clinic = get_object_or_404(Clinic.objects,
                               id=request.REQUEST.get("clinicID", None))

    #Get all clinics under this clinic location.
    all_clinics = Clinic.objects.filter(location=clinic.location.id)

    ansDict["all_clinics"] = all_clinics

    ansDict["clinic"] = clinic

    ansDict["location"] = clinic.location

    ansDict['interrupts'] = Interrupt.objects.all()

    #Get Clinic Event Mapdefault_clinic_event_map = []

    event_map = get_clinic_event_map(clinic.id)
    #if not event_map:
    #    '''
    #        No map information in the table. Take default map format.
    #    '''
    #    event_map = [(1,'signin'),(2,'registration'),(3,'triage'),(4,'provider'),(5,'checkout'),(6,'appointment')]

    ansDict['clinic_event_map'] = event_map

    #Get Details to Presents Patients details.
    clinicID = request.REQUEST["clinicID"]
    dtStart, dtEnd = get_request_period(request, clinic)
    eshs = EventSetHeader.objects.filter(clinic=clinic).exclude(
        dateTime__gte=dtEnd).filter(dateTime__gte=dtStart)

    patients = []
    patient = {}
    events = []

    #Get this delete event objects to check whether this patient have delete event.
    delete = Event.objects.get(name='delete')

    #Get details of each patients with their current status in specified clinic.
    for esh in eshs:

        patient_name = get_patient_full_name(
            esh
        )  #esh.patient.lName + "," +  esh.patient.fName + "," +  str(esh.patient.dob)

        patient_event_logs = PatientEventLog.objects.filter(header=esh)

        #Will have value when this use is been deleted : BUG Fixed(6-May-2010)
        delete_event = patient_event_logs.filter(event=delete)

        #for pevlog in patient_event_logs:
        #    events[pevlog.event.name] = pevlog.dateTime.strftime("%H:%M") #str(pevlog.dateTime.hour) + ":" + str(pevlog.dateTime.minute)

        #Here we creating events in the Array format with index gives the order, to match the order and genearlized event management.
        '''
         events = [('22:22','event_name'),...]
         
         Due to the clinic generalization, we may have different event order.So we taking genearl methods to 
         get correct event order for a clinic.
        '''
        events = []

        #To check deleted users.
        delete_flag = False

        for event in event_map:
            event_time = get_event_time(patient_event_logs, event[1])
            events.append((event_time, event[1]))
            if delete_event:
                delete_flag = True

        patient = {
            "patient_name": patient_name,
            "header": esh.id,
            "events": events
        }

        #Add This patient to the patient List if the event include "delete" then just discard it.
        if not delete_flag:
            patients.append(patient)
    #patients.append(patient)
    #if not events.has_key("delete"):
    #    '''
    #    If "delete" entry were present, we just discard that user from frontdesk.
    #    '''
    #    patients.append(patient)

    patients.reverse()
    ansDict['patients'] = patients

    #Come Variables

    #Channel name is specific for each Clinics. At frontdesk we list the patients of one clinic at a time.
    channel_name = 'frontdesk' + clinicID

    comet = {
        "SESSION_COOKIE_NAME": settings.SESSION_COOKIE_NAME,
        "HOST": settings.INTERFACE,
        "CHANNEL_NAME": channel_name,
        "STOMP_PORT": settings.STOMP_PORT,
        "USER": request.user
    }

    provider_list = Provider.objects.filter(
        loc=clinic.location.id
    )  #select the provider info corresponding to a location
    ansDict['provider_list'] = provider_list

    ansDict.update(comet)

    return direct_to_template(request, 'frontDesk.html', ansDict)
示例#8
0
def jqmobile_patient_station(request,header_id,event_order):
    '''
        Display the information of a particular event of a patient,
        with all of its attributes and interrupts.
        
        input:
            header_id
            event_order - Number corresponds to a event name from clininc_event_map.
            
    '''     
    
    event_order = int(event_order)
    
    #By default we make the patient event is not updatable.
    read_only = False
    
    header = EventSetHeader.objects.get(id = header_id)
    
    pevlog = PatientEventLog.objects.filter(header = header)
    
    event_map  = get_clinic_event_map(header.clinic.id)
          
    event_name = [ ev[1] for ev in event_map if ev[0] == event_order ][0]
    
    event_time = get_event_time(pevlog,event_name)
    #current_event = get_current_patient_event(pevlog)
    
    if event_time:
        'Event already occured, so we disable the event start button.'
        read_only = True
        
    if event_order == len(event_map):
        next_event_order = False
    else:
        next_event_order = event_order + 1
    
    if event_order == 1:
        prev_event_order = False
    else:
        prev_event_order = event_order - 1
    
    station_url = '/jqmobile/patient/' + header_id + '/'
    
    #Attribute and Interrupt operations.
    
    event = Event.objects.filter(name = event_name)
    if event:
        event = event[0]        
        event_attributes = get_event_attributes(header.clinic,event,header)
        
    
    '''
      to check whether the interrupt of a particular patient is completed(start and stop) or not we take the entries from Interrupt table
      and PatientInterruptLog table.If any interrupt has 2 entries in PatientInterruptLog table it means that, that event is completed.If any 
      interrupt has 1 entry in PatientInterruptLog ,it means that , that interrupt is not completed  
    '''    
    interrupts = []
    
    patient_interrupt = []
    
    result = []
    
    inter = Interrupt.objects.all()
        
    for i in inter:
        interrupts.append((i.name,i.id))    
    
    pat_inter  = PatientInterruptLog.objects.filter(header = header_id)
    
    if pat_inter:

        for i in pat_inter:
            patient_interrupt.append((i.interrupt.name,i.interrupt.id))  
        
    
        for i in interrupts:
            c = 0
            for j in patient_interrupt:
                if i[0] == j[0]:
                    c = c+1
            if c == 2:
                result.append((i[0],"complete",i[1]))
            if c == 1:
                result.append((i[0],"stop",i[1]))                      
                   
                                 
    template_data = {'read_only':read_only,
                     'header':header,
                     'event': event,
                     'next_event_order': next_event_order,
                     'prev_event_order': prev_event_order,
                     'station_url': station_url,
                     'patient_name': get_patient_full_name(header),
                     'event_attributes': event_attributes,
                     'patient_header':header.id
                     
                     }
    if result:
        template_data.update({'result':result})
    
    return render_to_response('jqmobile/eventattribute.html',template_data)
示例#9
0
def jqmobile_patient_stations(request,header_id):
    '''
        List events of a particular patient, with current status of each event.
        
        output to template format.
        
        [('event_name','current_status','waiting_time','event_order_num'),....]
        
    '''
    
        
    header = EventSetHeader.objects.get(id = header_id)
    pevlog = PatientEventLog.objects.filter(header = header_id)
    
    active_events = [(p.event.name,p.dateTime) for p in pevlog]
           
    event_map = get_clinic_event_map(header.clinic.id)
    
    event_list = []
    #Remove Un importand events like 'appointment'.
    for ev in event_map:
        
        match = [ event for event in active_events if ev[1] == event[0] ]
        if match:
            event_list += match
    
    patient_events = []
    
    current_event = get_current_patient_event(pevlog)
    
    event_map_len = len(event_map)
    
    for i in range(event_map_len):
        
        ev_name = event_map[i][1]
        ev_time = get_event_time(pevlog, ev_name)
        
        if ev_time:
            
            if ev_name == current_event.get('event_name'):
                if (i+1) == event_map_len:
                    #Edge event case at the right end.
                    ev_waiting_time =  "NA"
                else:
                    ev_time = "In Progress"
                        
            #Get Time of two successive events to get waiting time of first event.
            if i < (event_map_len - 1):
                'To prevent list overflow, when appointment or other edge events happens'
                t1 = [ev[1] for ev in event_list if ev[0] == event_map[i + 1][1] ]
                t2 = [ev[1] for ev in event_list if ev[0] == ev_name ]
                
                if t1 and  t2:
                    ev_waiting_time = format_time(t1[0] - t2[0])
                else:
                    ev_waiting_time =  "NA"
            
            elif (i+1) != event_map_len:
                ev_waiting_time =  "NA"
                ev_time = "In Queue"
        
        else:
            ev_time = "In Queue"
            ev_waiting_time =  "NA"
        
        
        patient_events.append((ev_name,ev_time,ev_waiting_time,event_map[i][0]))
        
        #print patient_events
    
    
    
    template_render = { 'patient_name': get_patient_full_name(header),
                       'header_id': header.id,
                       'stations': patient_events
                       }
        
    return render_to_response("jqmobile/patientstations.html",template_render)
示例#10
0
def jqmtab_frontdesk(request):
    '''
        Index page of the Jquery Mobile Web application.
    '''

    locations = Location.objects.all()
    clinics = Clinic.objects.all()
    '''
        Currently taking first location's first clinic as default clinic to be displyed at frontdesk.
    '''

    clinic = get_object_or_404(Clinic.objects,
                               id=request.REQUEST.get("clinicID", None))

    event_map = get_clinic_event_map(clinic.id)

    dtStart, dtEnd = get_request_period(request, clinic)
    eshs = EventSetHeader.objects.filter(clinic=clinic).exclude(
        dateTime__gte=dtEnd).filter(dateTime__gte=dtStart)

    patients = []
    patient = {}
    events = []

    #Get this delete event objects to check whether this patient have delete event.
    delete = Event.objects.get(name='delete')

    #Get details of each patients with their current status in specified clinic.
    for esh in eshs:

        patient_name = get_patient_full_name(
            esh
        )  #esh.patient.lName + "," +  esh.patient.fName + "," +  str(esh.patient.dob)

        patient_event_logs = PatientEventLog.objects.filter(header=esh)

        #Will have value when this use is been deleted : BUG Fixed(6-May-2010)
        delete_event = patient_event_logs.filter(event=delete)

        #for pevlog in patient_event_logs:
        #    events[pevlog.event.name] = pevlog.dateTime.strftime("%H:%M") #str(pevlog.dateTime.hour) + ":" + str(pevlog.dateTime.minute)

        #Here we creating events in the Array format with index gives the order, to match the order and genearlized event management.
        '''
         events = [('22:22','event_name'),...]
         
         Due to the clinic generalization, we may have different event order.So we taking genearl methods to 
         get correct event order for a clinic.
        '''
        events = []

        #To check deleted users.
        delete_flag = False

        for event in event_map:
            event_time = get_event_time(patient_event_logs, event[1])
            events.append((event_time, event[1]))
            if delete_event:
                delete_flag = True

        patient = {
            "patient_name": patient_name,
            "header": esh.id,
            "events": events
        }

        #Add This patient to the patient List if the event include "delete" then just discard it.
        if not delete_flag:
            patients.append(patient)
        #patients.append(patient)
        #if not events.has_key("delete"):
        #    '''
        #    If "delete" entry were present, we just discard that user from frontdesk.
        #    '''
        #    patients.append(patient)

    patients.reverse()

    #Channel name is specific for each Clinics. At frontdesk we list the patients of one clinic at a time.
    channel_name = 'frontdesk' + str(clinic.id)

    comet = {
        "SESSION_COOKIE_NAME": settings.SESSION_COOKIE_NAME,
        "HOST": settings.INTERFACE,
        "CHANNEL_NAME": channel_name,
        "STOMP_PORT": settings.STOMP_PORT,
        "USER": request.user
    }

    provider_list = Provider.objects.filter(
        loc=clinic.location.id
    )  #select the provider info corresponding to a location

    #For hidden header layout fixing, we taking one row of patient data.
    patient_hidden = ''

    dynamic_datas = {
        'STATIC_URL': settings.STATIC_URL,
        'locations': locations,
        'clinic': clinic,
        'clinics': clinics,
        'clinic_event_map': event_map,
        'patients': patients,
        'patient_hidden': patient_hidden,
        'provider_list': provider_list,
    }
    dynamic_datas.update(comet)

    return render_to_response('jqmtab/jqmtab_frontdesk.html', dynamic_datas)
示例#11
0
def post_signin_process(request):
    '''
    Do All remaining process of signin. The main signin process will just 
    
    pass the values and then return to the browser.
    
    This is to improve the user interactiveness.
    
    
    Processing new patient signin here.
        
        return JSON frommat:- 
        
        Possitive result:- 
         {'type':'signin','headerID':header,'from':user,'response':'OK', 'patient':{'name':name ,'event_name':time ...}}
        
        Negative result:-
         {'type':'signin','response':'failed','from':user}
         
         
         #Also Modified to get the genaralizing property.
    
    '''
    
    #Update other browsers by sending update to message queue channel.
    STOMP_HOST = settings.INTERFACE
    STOMP_PORT = settings.STOMP_PORT
    
    
    #Stomp client that will just push the message to the server. Do this process at first
    # To avoid the improper connection.
    stomp_client = PublishClient(STOMP_HOST, STOMP_PORT)
    
    #stomp_client = Stomp(STOMP_HOST,STOMP_PORT)
    
    user = request.REQUEST['user']
    
    #Stomp backend server use this user session key to authenitcate with the backend stomp broker.
    password = request.COOKIES.get(settings.SESSION_COOKIE_NAME, None)
    stomp_client.connect(user, password)
    
    #One second delay here, before we send data to channel.
    #To complete all initial handshakes with stomp server.
    time.sleep(1)
    
    
    fName = request.REQUEST["fname"]
    lName = request.REQUEST["lname"]
    clinic = request.REQUEST["clinic"]
    appointment = request.REQUEST["appointment"]
    
    if request.REQUEST.get('day'):
        
        day = request.REQUEST["day"]
        month = request.REQUEST["month"]
        year = request.REQUEST["year"]
        dob = datetime.date(int(year), int(month), int(day))
        
    else:
        dob = None
        
    #providernew = request.REQUEST["provider"] #take the provider info.
    #provider = get_object_or_404(Provider, id = request.REQUEST.get('provider',None))
    #provider = Provider.objects.get(id=providernew)
    
    
    #Fill required parameters to update the client.
    patient_info = {}
    
    
    patient = Patient.objects.filter(fName = fName, lName = lName, dob = dob)

    if patient.count() == 0:
        patient = Patient(fName = fName, lName = lName, dob = dob)
        patient.save()
    else:
        patient = patient[0]

    clinic = Clinic.objects.get(id = clinic)
    esh = EventSetHeader(patient = patient, clinic = clinic, provider = None)#along with patient info provider info are added to eventsetheader. 
    esh.save()
    
    #Add basic patient info.
    patient_info['name'] = get_patient_full_name(esh)#esh.patient.lName + "," + esh.patient.fName + "," + str(esh.patient.dob)
    
    
    local_timezone = clinic.location.timezone
    
    event = Event.objects.filter(name = "signin")[0]
    
    pel = PatientEventLog(event = event, header = esh, user = user)
    pel.save()
    
    #Add signin event.
    patient_info[pel.event.name] = get_local_time(local_timezone, pel.dateTime)
    
    if (appointment == "yes"):
        event, _ = Event.objects.get_or_create(name = "appointment")
        pel = PatientEventLog(event = event, header = esh, user = user)
        pel.save()
        
        #Add appointment event.
        patient_info[pel.event.name] = get_local_time(local_timezone, pel.dateTime)
    
    
    #Get parameters for the report page.
    report = gen_report(esh)
    patient_info.update(report)
    
    CHANNEL_NAME = '/topic/frontdesk' + str(clinic.id)
    
    ack_msg = {'type': 'signin', 'from':user, 'headerID':esh.id, 'response':'OK', 'patient':patient_info }
    ack_msg = json.dumps(ack_msg)
    
                   
    stomp_client.send(CHANNEL_NAME, ack_msg)
    
    #Wait successfull completion of message sending.
    time.sleep(5)
    
    stomp_client.disconnect()