Exemple #1
0
    def post(self):
        my_print("==> In AppointmentDraftPost, POST /appointments/draft")
        json_data = request.get_json()
        
        office_id = json_data.get('office_id')
        service_id = json_data.get('service_id')
        start_time = parse(json_data.get('start_time'))
        end_time = parse(json_data.get('end_time'))
        office = Office.find_by_id(office_id)
        service = Service.query.get(int(service_id)) if service_id else None

        # end_time can be null for CSRs when they click; whereas citizens know end-time.
        if not end_time:
            end_time = add_delta_to_time(start_time, minutes=office.appointment_duration, timezone=office.timezone.timezone_name)

        # Unauthenticated requests from citizens won't have name, so we set a fallback
        if (hasattr(g, 'oidc_token_info') and hasattr(g.oidc_token_info, 'username')):
            user = PublicUser.find_by_username(g.oidc_token_info['username'])
            citizen_name = user.display_name
        else:
            citizen_name = 'Draft'

        # Delete all expired drafts before checking availability
        Appointment.delete_expired_drafts()



        csr = None
        if (hasattr(g, 'oidc_token_info')):
            csr = CSR.find_by_username(g.oidc_token_info['username'])

        # CSRs are not limited by drafts,  can always see other CSRs drafts
        # This mitigates two CSRs in office creating at same time for same meeting
        # Ensure there's no race condition when submitting a draft
        if not csr and not AvailabilityService.has_available_slots(
                                    office=office, 
                                    start_time=start_time, 
                                    end_time=end_time, 
                                    service=service):
                    return {"code": "CONFLICT_APPOINTMENT",
                            "message": "Cannot create appointment due to scheduling conflict.  Please pick another time."}, 400
        
        # Set draft specific data
        json_data['is_draft'] = True
        json_data['citizen_name'] = citizen_name

        appointment, warning = self.appointment_schema.load(json_data)
        
        if warning:
            logging.warning("WARNING: %s", warning)
            return {"message": warning}, 422

        db.session.add(appointment)
        db.session.commit()
        
        result = self.appointment_schema.dump(appointment)

        socketio.emit('appointment_create', result.data)

        return {"appointment": result.data, "warning" : warning}, 201
    def post(self, id):
        csr = CSR.find_by_username(g.jwt_oidc_token_info['username'])

        citizen = Citizen.query\
        .options(joinedload(Citizen.service_reqs).joinedload(ServiceReq.periods).options(raiseload(Period.sr),joinedload(Period.csr).raiseload('*')),joinedload(Citizen.office),raiseload(Citizen.user)) \
        .filter_by(citizen_id=id, office_id=csr.office_id)
        
        citizen = citizen.first()

        my_print("==> POST /citizens/" + str(citizen.citizen_id) + '/place_on_hold/, Ticket: ' + citizen.ticket_number)
        active_service_request = citizen.get_active_service_request()

        if active_service_request is None:
            return {"message": "Citizen has no active service requests"}

        active_service_request.place_on_hold(csr)
        pending_service_state = SRState.get_state_by_name("Active")
        active_service_request.sr_state_id = pending_service_state.sr_state_id

        db.session.add(citizen)
        db.session.commit()

        socketio.emit('update_customer_list', {}, room=csr.office.office_name)
        result = self.citizen_schema.dump(citizen)
        socketio.emit('update_active_citizen', result, room=csr.office.office_name)

        return {'citizen': result,
                'errors': self.citizen_schema.validate(citizen)}, 200
Exemple #3
0
    def put(self, id):
        json_data = request.get_json()

        if 'counter_id' not in json_data:
            json_data['counter_id'] = counter_id

        if not json_data:
            return {'message': 'No input data received for updating citizen'}, 400

        csr = CSR.find_by_username(g.oidc_token_info['username'])
        citizen = Citizen.query.filter_by(citizen_id=id).first()
        my_print("==> PUT /citizens/" + str(citizen.citizen_id) + '/, Ticket: ' + str(citizen.ticket_number))

        try:
            citizen = self.citizen_schema.load(json_data, instance=citizen, partial=True).data

        except ValidationError as err:
            return {'message': err.messages}, 422

        db.session.add(citizen)
        db.session.commit()

        #  If this put request is the result of an appointment checkin, make a Snowplow call.
        if ('snowplow_addcitizen' in json_data) and (json_data['snowplow_addcitizen'] == True):
            SnowPlow.add_citizen(citizen, csr)

        result = self.citizen_schema.dump(citizen)
        socketio.emit('update_active_citizen', result.data, room=csr.office_id)

        return {'citizen': result.data,
                'errors': result.errors}, 200
    def put(self, id):
        json_data = request.get_json()

        counter = Counter.query.filter(Counter.counter_name == "Counter")[0]
        if 'counter_id' not in json_data:
            json_data['counter_id'] = counter.counter_id

        if not json_data:
            return {
                'message': 'No input data received for updating citizen'
            }, 400

        csr = CSR.find_by_username(g.oidc_token_info['username'])
        citizen = Citizen.query.filter_by(citizen_id=id,
                                          office_id=csr.office_id).first()
        my_print("==> PUT /citizens/" + str(citizen.citizen_id) +
                 '/, Ticket: ' + str(citizen.ticket_number))

        try:
            citizen = self.citizen_schema.load(json_data,
                                               instance=citizen,
                                               partial=True).data

        except ValidationError as err:
            return {'message': err.messages}, 422

        db.session.add(citizen)
        db.session.commit()

        result = self.citizen_schema.dump(citizen)
        socketio.emit('update_active_citizen', result.data, room=csr.office_id)

        return {'citizen': result.data, 'errors': result.errors}, 200
Exemple #5
0
def on_join(message):
    cookie = request.cookies.get("oidc-jwt", None)
    if cookie is None:
        emit('joinRoomFail', {"sucess": False})
        return

    if not oidc.validate_token(cookie):
        print("Cookie failed validation")
        emit('joinRoomFail', {"sucess": False})
        return

    claims = jwt.get_unverified_claims(cookie)

    if claims["preferred_username"]:
        my_print("==> In Python, @socketio.on('joinRoom'): claims['preferred_username'] is: " + str(claims["preferred_username"]))
        csr = CSR.find_by_username(claims["preferred_username"])
        if csr:
            join_room(csr.office_id)
            print("==> In websocket.py, CSR joinroom, CSR: " + csr.username + "; request sid: " + str(request.sid))
            emit('joinRoomSuccess', {"sucess": True})
            emit('get_Csr_State_IDs', {"success": True})
            emit('update_customer_list', {"success": True})
        else:
            print("Fail")
            emit('joinRoomFail', {"success": False})
    else:
        print("No preferred_username on request")
        emit('joinRoomFail', {"success": False})
    def post(self, id):
        csr = CSR.find_by_username(g.oidc_token_info['username'])
        citizen = Citizen.query.filter_by(citizen_id=id).first()
        active_service_request = citizen.get_active_service_request()

        my_print("==> POST /citizens/" + str(citizen.citizen_id) +
                 '/remove_from_queue, Ticket: ' + citizen.ticket_number)

        if active_service_request is None:
            return {"message": "Citizen has no active service requests"}

        appointment = Appointment.query.filter_by(citizen_id=id) \
            .filter_by(office_id=csr.office_id) \
            .filter(Appointment.checked_in_time.isnot(None)) \
            .first_or_404()

        # This "un-check-in"s the appointment, returning it to calendar and removing from the queue.
        appointment.checked_in_time = None
        db.session.commit()

        # ARC - Is below necessary? Think not.  Causes issue when re-checking in a removed one.
        # It DOES remove from queue, but stops it from being re-added?
        # active_service_request.remove_from_queue()

        # appointment, warning = self.appointment_schema.load(json_data, instance=appointment, partial=True)
        # if warning:
        #     logging.warning("WARNING: %s", warning)
        #     return {"message": warning}, 422

        result = self.appointment_schema.dump(appointment)

        return {"appointment": result.data, "errors": result.errors}, 200
    def post(self, id):
        csr = CSR.find_by_username(g.jwt_oidc_token_info['username'])
        citizen = Citizen.query.filter_by(citizen_id=id).first()
        my_print("==> POST /citizens/" + str(citizen.citizen_id) +
                 '/finish_service/, Ticket: ' + citizen.ticket_number)
        active_service_request = citizen.get_active_service_request()
        inaccurate = request.args.get('inaccurate')

        if active_service_request is None:
            return {"message": "Citizen has no active service requests"}

        #  If citizen here overnight, or inaccurate time flag set, update accurate time flag.
        if citizen.start_time.date() != datetime.now().date(
        ) or inaccurate == 'true':
            citizen.accurate_time_ind = 0

        SnowPlow.snowplow_event(
            citizen.citizen_id,
            csr,
            "finish",
            quantity=active_service_request.quantity,
            current_sr_number=active_service_request.sr_number)

        active_sr_id = active_service_request.sr_id
        active_service_request.finish_service(csr, self.clear_comments_flag)
        citizen_state = CitizenState.query.filter_by(
            cs_state_name="Received Services").first()
        citizen.cs_id = citizen_state.cs_id

        pending_service_state = SRState.get_state_by_name("Complete")
        active_service_request.sr_state_id = pending_service_state.sr_state_id

        # remove walkin unique id when service is finished
        citizen.walkin_unique_id = None

        db.session.add(citizen)
        db.session.commit()

        #  Loop to stop all services in the service stopped state (which are all except the active service)
        if len(citizen.service_reqs) != 1:
            for sr in citizen.service_reqs:
                if sr.sr_id != active_sr_id:
                    SnowPlow.snowplow_event(citizen.citizen_id,
                                            csr,
                                            "finishstopped",
                                            quantity=sr.quantity,
                                            current_sr_number=sr.sr_number)

        socketio.emit('citizen_invited', {},
                      room='sb-%s' % csr.office.office_number)
        result = self.citizen_schema.dump(citizen)
        socketio.emit('update_active_citizen', result, room=csr.office_id)

        return {
            'citizen': result,
            'errors': self.citizen_schema.validate(citizen)
        }, 200
    def post(self, id):
        csr = CSR.find_by_username(g.jwt_oidc_token_info['username'])
        lock = FileLock("lock/begin_citizen_{}.lock".format(csr.office_id))

        with lock:
            citizen = Citizen.query\
            .options(joinedload(Citizen.service_reqs).options(joinedload(ServiceReq.periods).options(joinedload(Period.ps).options(raiseload('*')),joinedload(Period.csr).options(raiseload('*')),raiseload('*')), joinedload(ServiceReq.service).options(joinedload(Service.parent).options(raiseload(Service.parent).options(raiseload('*'))),raiseload('*'))), joinedload(Citizen.office).options(joinedload(Office.sb),raiseload('*')), raiseload(Citizen.user)) \
            .filter_by(citizen_id=id)
            citizen = citizen.first()
            pending_service_state = SRState.get_state_by_name("Active")

            if citizen is None:
                print(
                    "==> POST /citizen/<id>/begin_service/ error. No citizen with id "
                    + str(id))
                return {"message": "No citizen found with id " + str(id)}
            else:
                my_print("==> POST /citizens/" + str(citizen.citizen_id) +
                         '/begin_service/, Ticket: ' + citizen.ticket_number)

            active_service_request = citizen.get_active_service_request()

            if active_service_request is None:
                return {"message": "Citizen has no active service requests"}

            try:
                #  Get Snowplow call.
                active_period = active_service_request.get_active_period()
                snowplow_event = "beginservice"
                if active_period.ps.ps_name == "On hold":
                    snowplow_event = "invitefromhold"
                if active_period.ps.ps_name == "Ticket Creation":
                    snowplow_event = "servecitizen"

                active_service_request.begin_service(csr, snowplow_event)
            except TypeError:
                return {"message": "Citizen  has already been invited"}, 400

            active_service_request.sr_state_id = pending_service_state.sr_state_id

            db.session.add(citizen)
            db.session.commit()

            if snowplow_event != "beginservice":
                socketio.emit('update_customer_list', {},
                              room=csr.office.office_name)

            result = self.citizen_schema.dump(citizen)
            socketio.emit('update_active_citizen',
                          result,
                          room=csr.office.office_name)

        return {
            'citizen': result,
            'errors': self.citizen_schema.validate(citizen)
        }, 200
    def get(self, exam_id):

        csr = CSR.find_by_username(g.jwt_oidc_token_info['username'])

        try:
            exam = Exam.query.filter_by(exam_id=exam_id).first()

            if not (exam.office_id == csr.office_id
                    or csr.ita2_designate == 1):
                return {"The Exam Office ID and CSR Office ID do not match!"
                        }, 403

            job = self.bcmp_service.check_exam_status(exam)
            my_print(job)

            if job['jobStatus'] == 'PACKAGE_GENERATED':
                package_url = job["jobProperties"]["EXAM_PACKAGE_URL"]
                req = urllib.request.Request(package_url)
                response = urllib.request.urlopen(req).read()
                exam_file = io.BytesIO(response)
                file_wrapper = FileWrapper(exam_file)

                return Response(file_wrapper,
                                mimetype="application/pdf",
                                direct_passthrough=True,
                                headers={
                                    "Content-Disposition":
                                    'attachment; filename="%s.csv"' %
                                    exam.exam_id,
                                    "Content-Type":
                                    "application/pdf"
                                })
            else:
                return {
                    'message': 'Package not yet generated',
                    'status': job['jobStatus']
                }, 400
                # test_url = 'http://www.pdf995.com/samples/pdf.pdf'
                # req = urllib.request.Request(test_url)
                # response = urllib.request.urlopen(req).read()
                # exam_file = io.BytesIO(response)
                # file_wrapper = FileWrapper(exam_file)
                #
                # return Response(file_wrapper,
                #                 mimetype="application/pdf",
                #                 direct_passthrough=True,
                #                 headers={
                #                     "Content-Disposition": 'attachment; filename="%s.csv"' % exam.exam_id,
                #                     "Content-Type": "application/pdf"
                #                 })

        except exc.SQLAlchemyError as error:
            logging.error(error, exc_info=True)
            return {'message': 'API is down'}, 500
Exemple #10
0
    def create_group_exam(self, exam):
        url = "%s/auth=%s;%s/JSON/create:BCMD-EXAM" % (
            self.base_url, self.bcmp_user, self.auth_token)
        my_print("  ==> create_group_exam    url: %s" % url)

        bcmp_exam = {"students": []}

        for s in exam.students:
            bcmp_exam["students"].append({"name": s.name})

        response = self.send_request(url, 'POST', bcmp_exam)
        return response
Exemple #11
0
    def bulk_check_exam_status(self, exams):
        url = "%s/auth=env_exam;%s/JSON/status" % (self.base_url,
                                                   self.auth_token)
        data = {"jobs": []}

        for exam in exams:
            data["jobs"].append(exam.bcmp_job_id)

        response = self.send_request(url, 'POST', data)
        my_print(response)

        return response
    def post(self):
        y = 0
        key = "DR->" + get_key()
        y = y + 1
        csr = csr_find_by_user()
        lock = FileLock("lock/invite_citizen_{}.lock".format(csr.office_id))
        with lock:

            active_citizen_state = citizen_state

            waiting_period_state = find_wait()
            citizen = None
            json_data = request.get_json()

            if json_data and 'counter_id' in json_data:
                counter_id = int(json_data.get('counter_id'))
            else:
                counter_id = int(csr.counter_id)

            citizen = find_citizen(counter_id,active_citizen_state, csr, waiting_period_state)

            # If no matching citizen with the same counter type, get next one
            if citizen is None:
                citizen = find_citizen2(active_citizen_state, csr, waiting_period_state)

            if citizen is None:
                return {"message": "There is no citizen to invite"}, 400

            my_print("==> POST /citizens/invite/ Citizen: " + str(citizen.citizen_id) + ', Ticket: ' + citizen.ticket_number)

            db.session.refresh(citizen)

            active_service_request = find_active_sr(citizen)

            try:
                invite_active_sr(active_service_request,csr,citizen)

            except TypeError:
                return {"message": "Error inviting citizen. Please try again."}, 400


            active_service_state = find_active_ss()
            active_service_request.sr_state_id = active_service_state.sr_state_id
            db.session.add(citizen)
            db.session.commit()

            socketio.emit('update_customer_list', {}, room=csr.office.office_name)
            socketio.emit('citizen_invited', {}, room='sb-%s' % csr.office.office_number)
            result = self.citizen_schema.dump(citizen)
            socketio.emit('update_active_citizen', result, room=csr.office.office_name)

        return {'citizen': result,
                'errors': self.citizen_schema.validate(citizen)}, 200
Exemple #13
0
    def check_exam_status(self, exam):
        url = "%s/auth=env_exam;%s/JSON/status" % (self.base_url,
                                                   self.auth_token)
        data = {"jobs": [exam.bcmp_job_id]}
        response = self.send_request(url, 'POST', data)

        if response and response['jobs']:
            for job in response['jobs']:
                my_print(job)
                if job['jobId'] == exam.bcmp_job_id:
                    return job

        return False
Exemple #14
0
    def get(self, id):
        try:
            csr = CSR.find_by_username(g.oidc_token_info['username'])
            citizen = Citizen.query.filter_by(citizen_id=id,
                                              office_id=csr.office_id).first()
            my_print("==> GET /citizens/" + str(citizen.citizen_id) +
                     '/, Ticket: ' + citizen.ticket_number)
            result = self.citizen_schema.dump(citizen)
            return {'citizen': result.data, 'errors': result.errors}

        except exc.SQLAlchemyError as e:
            print(e)
            return {'message': 'API is down'}, 500
Exemple #15
0
    def get(self, id):
        try:
            citizen = Citizen.query.filter_by(citizen_id=id).first()
            citizen_ticket = "None"
            if hasattr(citizen, 'ticket_number'):
                citizen_ticket = str(citizen.ticket_number)
            my_print("==> GET /citizens/" + str(citizen.citizen_id) + '/, Ticket: ' + citizen_ticket)
            result = self.citizen_schema.dump(citizen)
            return {'citizen': result,
                    'errors': self.citizen_schema.validate(citizen)}

        except exc.SQLAlchemyError as e:
            print(e)
            return {'message': 'API is down'}, 500
Exemple #16
0
def on_join_smartboard(message):
    try:
        office_id = int(message['office_id'])
        room = "sb-%s" % office_id

        my_print("Joining room: %s" % room)

        join_room(room)
        emit('joinSmartboardRoomSuccess')
    except KeyError as e:
        print(e)
        emit('joinSmartboardRoomFail', {"sucess": False, "message": "office_id must be passed to this method"})

    except ValueError as e:
        print(e)
        emit('joinSmartboardRoomFail', {"sucess": False, "message": "office_id must be an integer"})
Exemple #17
0
    def find_by_username(cls, username):
        #   Possible keycloak->TheQ id values are user@idir->user, idir/user->user or user@bceid->user@bceid
        idir_id = username.split("idir/")[-1].lower()
        if "@idir" in username:
            idir_id = username.split("@idir")[0].lower()
        key = CSR.format_string % idir_id
        if cache.get(key):
            return cache.get(key)

        my_print("==> In Python, csr.py, find_by_username: username="******"; idir_id=" + str(idir_id))
        csr = CSR.query.filter(
            CSR.deleted.is_(None)).filter(CSR.username == idir_id).first()

        cache.set(key, csr)
        return csr
Exemple #18
0
def on_join_smartboard(message):
    try:
        office_id = int(message['office_id'])
        room = "sb-%s" % office_id

        my_print("Joining room: %s" % room)

        join_room(room)
        print("==> In websocket.py, Smartboard joinroom, Office id: " + str(office_id) + "; request sid: " + str(request.sid))
        emit('joinSmartboardRoomSuccess')
    except KeyError as e:
        print(e)
        emit('joinSmartboardRoomFail', {"sucess": False, "message": "office_id must be passed to this method"})

    except ValueError as e:
        print(e)
        emit('joinSmartboardRoomFail', {"sucess": False, "message": "office_id must be an integer"})
    def post(self, id):
        csr = CSR.find_by_username(g.oidc_token_info['username'])
        lock = FileLock("lock/begin_citizen_{}.lock".format(csr.office_id))

        with lock:
            citizen = Citizen.query.filter_by(citizen_id=id,
                                              office_id=csr.office_id).first()
            pending_service_state = SRState.get_state_by_name("Active")

            my_print("==> POST /citizens/" + str(citizen.citizen_id) +
                     '/begin_service, Ticket: ' + citizen.ticket_number)

            active_service_request = citizen.get_active_service_request()

            if active_service_request is None:
                return {"message": "Citizen has no active service requests"}

            try:
                #  Get Snowplow call.
                active_period = active_service_request.get_active_period()
                snowplow_event = "beginservice"
                if active_period.ps.ps_name == "On hold":
                    snowplow_event = "invitefromhold"
                if active_period.ps.ps_name == "Ticket Creation":
                    snowplow_event = "servecitizen"

                active_service_request.begin_service(csr, snowplow_event)
            except TypeError:
                return {"message": "Citizen  has already been invited"}, 400

            active_service_request.sr_state_id = pending_service_state.sr_state_id

            db.session.add(citizen)
            db.session.commit()

            if snowplow_event != "beginservice":
                socketio.emit('update_customer_list', {}, room=csr.office_id)

            result = self.citizen_schema.dump(citizen)
            socketio.emit('update_active_citizen',
                          result.data,
                          room=csr.office_id)

        return {'citizen': result.data, 'errors': result.errors}, 200
Exemple #20
0
    def post(self, id):
        csr = CSR.find_by_username(g.jwt_oidc_token_info['username'])
        lock = FileLock("lock/invite_citizen_{}.lock".format(csr.office_id))

        with lock:
            citizen = db.session.query(Citizen).filter_by(
                citizen_id=id).first()
            my_print("==> POST /citizens/" + str(citizen.citizen_id) +
                     '/invite/, Ticket: ' + citizen.ticket_number)
            active_service_state = SRState.get_state_by_name("Active")

            active_service_request = citizen.get_active_service_request()

            if active_service_request is None:
                return {
                    "message": "Citizen has no active service requests"
                }, 400

            try:
                active_service_request.invite(csr,
                                              invite_type="specific",
                                              sr_count=len(
                                                  citizen.service_reqs))
            except TypeError:
                return {"message": "Citizen  has already been invited"}, 400

            active_service_request.sr_state_id = active_service_state.sr_state_id

            db.session.add(citizen)
            db.session.commit()

            socketio.emit('update_customer_list', {},
                          room=csr.office.office_name)
            socketio.emit('citizen_invited', {},
                          room='sb-%s' % csr.office.office_number)
            result = self.citizen_schema.dump(citizen)
            socketio.emit('update_active_citizen',
                          result,
                          room=csr.office.office_name)

        return {
            'citizen': result,
            'errors': self.citizen_schema.validate(citizen)
        }, 200
Exemple #21
0
    def email_exam_invigilator(self, exam, invigilator_name, invigilator_email,
                               invigilator_phone):
        url = "%s/auth=%s;%s/JSON/create:BCMD-EXAM-API-ACTION" % (
            self.base_url, self.bcmp_user, self.auth_token)
        my_print("  ==> email_exam_invigilator    url: %s" % url)

        json_data = {
            "action": {
                "jobId": exam.bcmp_job_id,
                "actionName": "SEND_TO_INVIGILATOR",
                "invigilatorName": invigilator_name,
                "invigilatorEmailAddress": invigilator_email,
                "invigilatorPhoneNumber": invigilator_phone
            }
        }

        response = self.send_request(url, "POST", json_data)

        return response
Exemple #22
0
def which_non_exam_key(booking, row, key):
    if key == 'exam_name':
        write_non_exam_name(booking, row)
    elif key == 'notes':
        write_contact_info(booking, row)
    elif key == 'start_time':
        value = getattr(booking.start_time, key)
        my_print("==> which_non_exam_key of '" + key + "', type is: " +
                 str(type(value)))
        row.append(getattr(booking.start_time, key))
    elif key == 'end_time':
        row.append(getattr(booking.end_time, key))
    elif key == 'fees':
        if booking.fees == 'false':
            row.append("N")
        elif booking.fees == 'true':
            row.append("Y")
        elif booking.fees == 'HQFin':
            row.append("Finance to Invoice")
Exemple #23
0
    def get(self, id):
        try:
            csr = CSR.find_by_username(g.jwt_oidc_token_info['username'])

            citizen = Citizen.query.filter_by(citizen_id=id,
                                              office_id=csr.office_id).first()
            my_print("==> GET /citizens/" + str(citizen.citizen_id) +
                     '/service_requests/, Ticket: ' + citizen.ticket_number)
            result = self.service_requests_schema.dump(citizen.service_reqs)
            return {
                'service_requests':
                result,
                'errors':
                self.service_requests_schema.validate(citizen.service_reqs)
            }

        except exc.SQLAlchemyError as e:
            print(e)
            return {'message': 'API is down'}, 500
Exemple #24
0
    def post(self, id):
        csr = CSR.find_by_username(g.jwt_oidc_token_info['username'])
        citizen = Citizen.query.filter_by(citizen_id=id).first()
        active_service_request = citizen.get_active_service_request()

        my_print("==> POST /citizens/" + str(citizen.citizen_id) +
                 '/add_to_queue, Ticket: ' + citizen.ticket_number)

        if active_service_request is None:
            return {"message": "Citizen has no active service requests"}

        #  Figure out what Snowplow call to make.  Default is addtoqueue
        snowplow_call = "addtoqueue"
        if len(citizen.service_reqs) != 1 or len(
                active_service_request.periods) != 1:
            active_period = active_service_request.get_active_period()
            if active_period.ps.ps_name == "Invited":
                snowplow_call = "queuefromprep"
            elif active_period.ps.ps_name == "Being Served":
                snowplow_call = "returntoqueue"
            else:
                #  TODO:  Put in a Feedback Slack/Service now call here.
                return {"message": "Invalid citizen/period state. "}

        active_service_request.add_to_queue(csr, snowplow_call)

        pending_service_state = SRState.get_state_by_name("Pending")
        active_service_request.sr_state_id = pending_service_state.sr_state_id

        db.session.add(citizen)
        db.session.commit()

        socketio.emit('update_customer_list', {}, room=csr.office_id)
        socketio.emit('citizen_invited', {},
                      room='sb-%s' % csr.office.office_number)
        result = self.citizen_schema.dump(citizen)
        socketio.emit('update_active_citizen', result, room=csr.office_id)

        return {
            'citizen': result,
            'errors': self.citizen_schema.validate(citizen)
        }, 200
Exemple #25
0
    def post(self, id):
        csr = CSR.find_by_username(g.jwt_oidc_token_info['username'])
        citizen = Citizen.query.filter_by(citizen_id=id).first()
        active_service_request = citizen.get_active_service_request()

        my_print("==> POST /citizens/" + str(citizen.citizen_id) +
                 '/remove_from_queue, Ticket: ' + citizen.ticket_number)

        if active_service_request is None:
            return {"message": "Citizen has no active service requests"}

        appointment = Appointment.query.filter_by(citizen_id=id) \
            .filter_by(office_id=csr.office_id) \
            .filter(Appointment.checked_in_time.isnot(None)) \
            .first_or_404()

        # This "un-check-in"s the appointment, returning it to calendar and removing from the queue.
        appointment.checked_in_time = None

        # Delete all "periods", FKs on service req
        active_service_request.remove_from_queue()
        # Delete the service req.
        db.session.delete(active_service_request)
        db.session.commit()

        # appointment, warning = self.appointment_schema.load(json_data, instance=appointment, partial=True)
        # if warning:
        #     logging.warning("WARNING: %s", warning)
        #     return {"message": warning}, 422

        socketio.emit('update_customer_list', {}, room=csr.office_id)
        socketio.emit('citizen_invited', {},
                      room='sb-%s' % csr.office.office_number)
        result = self.appointment_schema.dump(appointment)

        if not application.config['DISABLE_AUTO_REFRESH']:
            socketio.emit('appointment_create', result)

        return {
            "appointment": result,
            "errors": self.appointment_schema.validate(appointment)
        }, 200
Exemple #26
0
    def create_individual_exam(self, exam, exam_fees, invigilator,
                               pesticide_office, oidc_token_info):
        my_print("  ==> create_individual_exam self base_url: %s" %
                 self.base_url)
        my_print("  ==> create_individual_exam self bcmp_user: %s" %
                 self.bcmp_user)
        my_print("  ==> create_individual_exam self auth_token: %s" %
                 self.auth_token)
        url = "%s/auth=%s;%s/JSON/create:BCMD-EXAM" % (
            self.base_url, self.bcmp_user, self.auth_token)
        my_print("  ==> create_individual_exam  url: %s" % url)

        office_name = None
        if pesticide_office:
            office_name = pesticide_office.office_name

        receipt_number = "%s fees" % exam_fees
        if exam.receipt:
            receipt_number = exam.receipt

        exam_type_name = None
        if exam.exam_type:
            exam_type_name = exam.exam_type.exam_type_name

        invigilator_name = None
        if invigilator:
            invigilator_name = invigilator.invigilator_name

        bcmp_exam = {
            "EXAM_SESSION_LOCATION":
            office_name,
            "REGISTRAR_name":
            oidc_token_info['preferred_username'],
            "RECIPIENT_EMAIL_ADDRESS":
            oidc_token_info['email'],
            "REGISTRAR_phoneNumber":
            "",
            "students": [{
                "REGISTRAR_name": invigilator_name,
                "EXAM_CATEGORY": exam_type_name,
                "STUDENT_LEGAL_NAME_first": exam.examinee_name,
                "STUDENT_LEGAL_NAME_last": exam.examinee_name,
                "STUDENT_emailAddress": exam.examinee_email,
                "STUDENT_phoneNumber": exam.examinee_phone,
                "REGISTRATION_NOTES": exam.notes,
                "RECEIPT_RMS_NUMBER": receipt_number
            }]
        }

        response = self.send_request(url, 'POST', bcmp_exam)
        return response
Exemple #27
0
def on_join(message):
    claims = g.jwt_oidc_token_info

    if claims["preferred_username"]:
        my_print(
            "==> In Python, @socketio.on('joinRoom'): claims['preferred_username'] is: "
            + str(claims["preferred_username"]))
        csr = CSR.find_by_username(claims["preferred_username"])
        if csr:
            join_room(csr.office.office_name)
            print("==> In websocket.py, CSR joinroom, CSR: " + csr.username +
                  "; request sid: " + str(request.sid))
            emit('joinRoomSuccess', {"sucess": True})
            emit('get_Csr_State_IDs', {"success": True})
            emit('update_customer_list', {"success": True})
        else:
            print("Fail")
            emit('joinRoomFail', {"success": False})
    else:
        print("No preferred_username on request")
        emit('joinRoomFail', {"success": False})
Exemple #28
0
    def post(self):
        csr = CSR.find_by_username(g.jwt_oidc_token_info['username'])

        try:
            exams = Exam.query.filter_by(upload_received_ind=0).filter(
                Exam.bcmp_job_id.isnot(None))
            bcmp_response = self.bcmp_service.bulk_check_exam_status(exams)

            job_ids = []
            for job in bcmp_response["jobs"]:
                if job["jobStatus"] == "RESPONSE_UPLOADED":
                    job_ids.append(job["jobId"])

            my_print("job_ids to update: ")
            my_print(job_ids)

            exams_tobe_updated = None

            if len(job_ids) != 0:
                exams_tobe_updated = Exam.query.filter(
                    Exam.bcmp_job_id.in_(job_ids))

                for exam in exams_tobe_updated:
                    exam_upd = self.exam_schema.load(
                        {'upload_received_ind': 1},
                        instance=exam,
                        partial=True)
                    db.session.add(exam_upd)

                try:
                    db.session.commit()
                except:
                    db.session.rollback()
                    raise

            return {"exams_updated": exams_tobe_updated}, 200

        except exc.SQLAlchemyError as error:
            logging.error(error, exc_info=True)
            return {'message': 'API is down'}, 500
Exemple #29
0
    def post(self):

        is_bcmp_req = True if request.args.get('bcmp_pesticide') else False

        my_print("is_bcmp_req: ")
        my_print(is_bcmp_req)

        csr = CSR.find_by_username(g.jwt_oidc_token_info['username'])

        json_data = request.get_json()

        exam = self.exam_schema.load(json_data)
        warning = self.exam_schema.validate(json_data)

        my_print("json_data: ")
        my_print(json_data)

        if warning:
            logging.warning("WARNING: %s", warning)
            return {"message": warning}, 422
        
        if not (exam.office_id == csr.office_id or csr.ita2_designate == 1):
            return {"The Exam Office ID and CSR Office ID do not match!"}, 403   
        
        if exam.is_pesticide:
            formatted_data = self.format_data(json_data, exam)
            exam = formatted_data["exam"]
            job = self.bcmp_service.check_exam_status(exam)
            my_print(job)
            if job and job['jobProperties'] and job['jobProperties']['JOB_ID']:
                exam.event_id = job['jobProperties']['JOB_ID']

        db.session.add(exam)
        db.session.commit()

        result = self.exam_schema.dump(exam)

        return {"exam": result,
                "errors": self.exam_schema.validate(exam)}, 201
    def post(self, id):
        csr = CSR.find_by_username(g.oidc_token_info['username'])

        citizen = Citizen.query.filter_by(citizen_id=id,
                                          office_id=csr.office_id).first()
        my_print("==> POST /citizens/" + str(citizen.citizen_id) +
                 '/place_on_hold/, Ticket: ' + citizen.ticket_number)
        active_service_request = citizen.get_active_service_request()

        if active_service_request is None:
            return {"message": "Citizen has no active service requests"}

        active_service_request.place_on_hold(csr)
        pending_service_state = SRState.get_state_by_name("Active")
        active_service_request.sr_state_id = pending_service_state.sr_state_id

        db.session.add(citizen)
        db.session.commit()

        socketio.emit('update_customer_list', {}, room=csr.office_id)
        result = self.citizen_schema.dump(citizen)
        socketio.emit('update_active_citizen', result.data, room=csr.office_id)

        return {'citizen': result.data, 'errors': result.errors}, 200