Exemple #1
0
def update_user(body_id, form_to_display):

    user = forms._get_body(body_id, "user")
    if not forms._check_body_perm(user, "user"):
        return redirect(url_for('list_users'))

    # For updating info of user, we're dealing with the form 
    gen_info_form = OdontuxUserGeneralInfoForm(request.form)
    gen_info_form.title.choices = forms.get_title_choice_list()
    hours_a_week = 0
    if session['role'] == constants.ROLE_ADMIN:
        gen_info_admin_form = OdontuxUserGeneralInfoAdminForm(request.form)
        gen_info_admin_form.role.choices = constants.ROLES.items()
        hours_a_week = ( 
            cost.get_dental_unit_week_hours().total_seconds() / 3600
        )
    else:
        gen_info_admin_form = ""
        # hours por semana

    if user.role == constants.ROLE_DENTIST: 
        dentist_specific_form = DentistSpecificForm(request.form)
    else:
        dentist_specific_form = ""

    if (session['role'] == constants.ROLE_ADMIN 
            and user.role == constants.ROLE_DENTIST):
        dentist_specific_admin_form = DentistSpecificAdminForm(request.form)
    else:
        dentist_specific_admin_form = ""

    if request.method == 'POST' and gen_info_form.validate():
        for f in get_gen_info_field_list():
            setattr(user, f, getattr(gen_info_form, f).data)
        if user.role == constants.ROLE_DENTIST:
            for f in get_dentist_specific_field_list():
                setattr(user, f, getattr(dentist_specific_form, f).data)
        if (session['role'] == constants.ROLE_ADMIN
            and gen_info_admin_form.validate() ):
            for f in get_gen_info_admin_field_list():
                setattr(user, f, getattr(gen_info_admin_form, f).data)
            if user.role == constants.ROLE_DENTIST:
                for f in get_dentist_specific_admin_field_list():
                    setattr(user, f, 
                            getattr(dentist_specific_admin_form, f).data)
        meta.session.commit()
        return redirect(url_for('update_user', 
                                 body_id=body_id,
                                 form_to_display="gen_info"))

    # When loading the whole update page, we use the form containing all fields
    # after prepopulating it
    for f in get_gen_info_field_list():
        getattr(gen_info_form, f).data = getattr(user, f)
    if user.role == constants.ROLE_DENTIST:
        for f in get_dentist_specific_field_list():
            getattr(dentist_specific_form, f).data = getattr(user, f)
    if session['role'] == constants.ROLE_ADMIN:
        for f in get_gen_info_admin_field_list():
            getattr(gen_info_admin_form, f).data = getattr(user, f)
        if user.role == constants.ROLE_DENTIST:
            for f in get_dentist_specific_admin_field_list():
                try:
                    getattr(dentist_specific_admin_form, f).data =\
                    getattr(user, f)
                except:
                    pass

    timesheet_form = generate_timesheet_form(user.role)
    # populate timesheet_form
    for weekday in range(7):
        for period in constants.PERIODS.keys():
            TS = (
                meta.session.query(users.TimeSheet)
                    .filter(
                        users.TimeSheet.user_id == user.id,
                        users.TimeSheet.weekday == weekday,
                        users.TimeSheet.period == period
                    )
                .one_or_none()
            )
            if TS:
                timesheet_form[weekday][period].begin.data = TS.begin
                timesheet_form[weekday][period].end.data = TS.end
                timesheet_form[weekday][period].dental_unit_id.data =\
                                                            TS.dental_unit_id

    address_form = forms.AddressForm(request.form)
    phone_form = forms.PhoneForm(request.form)
    mail_form = forms.MailForm(request.form)
    password_form = OdontuxUserPasswordForm(request.form)
    return render_template('/update_user.html', 
                            user=user,
                            form_to_display=form_to_display,
                            gen_info_form=gen_info_form,
                            gen_info_admin_form=gen_info_admin_form,
                            address_form=address_form,
                            phone_form=phone_form,
                            mail_form=mail_form,
                            password_form=password_form,
                            dentist_specific_form=dentist_specific_form,
                            timesheet_form=timesheet_form,
                            calendar=calendar,
                            constants=constants,
                            hours_a_week=hours_a_week,
                       dentist_specific_admin_form=dentist_specific_admin_form)
Exemple #2
0
def update_patient(body_id, form_to_display):
    """ """
    patient = forms._get_body(body_id, "patient")
    if not forms._check_body_perm(patient, "patient"):
        return redirect(url_for('list_patients', body_id=body_id))

    # only need form for *patient_gen_info* update here.
    # Others are only needed for the 'GET', see below.
    gen_info_form = PatientGeneralInfoForm(request.form)
    gen_info_form.title.choices = forms.get_title_choice_list()
    gen_info_form.office_id.choices = [ (office.id, office.office_name) 
                for office in meta.session.query(users.DentalOffice).all() ]
    gen_info_form.dentist_id.choices = [ (dentist.id, dentist.firstname + " " 
                                                            + dentist.lastname)
                for dentist in meta.session.query(users.OdontuxUser).filter(
                users.OdontuxUser.role == constants.ROLE_DENTIST).order_by(
                users.OdontuxUser.lastname).all() 
                                        ]
    if request.method == 'POST' and gen_info_form.validate():
        for f in get_gen_info_field_list():
            setattr(patient, f, getattr(gen_info_form, f).data)

#        if not gen_info_form.family_id.data or not gen_info_form.family_member.data:
#            new_family = administration.Family()
#            meta.session.add(new_family)
#            meta.session.commit()
#            patient.family_id = new_family.id
#        else:
#            patient.family_id = gen_info_form.family_id.data
        meta.session.commit()

        # We should update in gnucash too the patient
        comptability = gnucash_handler.GnuCashCustomer(patient.id,  
                                                       patient.dentist_id) 
        customer = comptability.update_customer()
        return redirect(url_for('update_patient', body_id=body_id,
                                form_to_display="gen_info"))


    # When we 'GET' the page, we need all form, and fill in
    # the gen_info and SSN_form from here
    for f in get_gen_info_field_list():
        getattr(gen_info_form, f).data = getattr(patient, f)

#    # payer
#    for payer in patient.family.payers:
#        if patient.id == payer.id:
#            gen_info_form.payer.data = True
#    gen_info_form.family_id.data = patient.family_id
#    
    address_form = forms.AddressForm(request.form)
    phone_form = forms.PhoneForm(request.form)
    mail_form = forms.MailForm(request.form)
    # need to return patient both as "patient" AND "body" :
    # as "patient" for the header pagetitle,
    # as "body" for the updating form.
    other_healthcare_plans = (
        meta.session.query(act.HealthCarePlan)
            .filter(
                act.HealthCarePlan.active.is_(True),
                ~act.HealthCarePlan.patients.any(
                    administration.Patient.id == patient.id)
            )
            .all()
        )
    return render_template('/update_patient.html', body=patient,
                            patient=patient,
                            gen_info_form=gen_info_form,
                            address_form=address_form,
                            phone_form=phone_form,
                            mail_form=mail_form,
                            other_healthcare_plans=other_healthcare_plans)
Exemple #3
0
def add_user():
    if session['role'] != constants.ROLE_ADMIN:
        return redirect(url_for("index"))

    gen_info_form = OdontuxUserGeneralInfoForm(request.form)
    gen_info_form.title.choices = forms.get_title_choice_list()

    gen_info_admin_form = OdontuxUserGeneralInfoAdminForm(request.form)
    gen_info_admin_form.role.choices = constants.ROLES.items()
    dentist_specific_form = DentistSpecificForm(request.form)
    dentist_specific_admin_form = DentistSpecificAdminForm(request.form)
    address_form = forms.AddressForm(request.form)
    phone_form = forms.PhoneForm(request.form)
    mail_form = forms.MailForm(request.form)
    password_form = OdontuxUserPasswordForm(request.form)
    if (request.method == 'POST' and gen_info_form.validate()
        and address_form.validate() and phone_form.validate()
        and mail_form.validate and password_form.validate()
       ):
        values = {}
        for f in get_gen_info_field_list():
            values[f] = getattr(gen_info_form, f).data
        for f in get_gen_info_admin_field_list():
            values[f] = getattr(gen_info_admin_form, f).data
        for f in get_password_field_list():
            values[f] = b64encode(scrypt.encrypt(os.urandom(64), 
                            getattr(password_form, f).data.encode("utf_8"), 
                            maxtime=0.5))
        for f in get_dentist_specific_field_list():
            values[f] = getattr(dentist_specific_form, f).data
        for f in get_dentist_specific_admin_field_list():
            values[f] = getattr(dentist_specific_admin_form, f).data

        new_odontuxuser = users.OdontuxUser(**values)
        meta.session.add(new_odontuxuser)
        
        address_args = {f: getattr(address_form, f).data 
                        for f in forms.address_fields}
        if any(address_args.values()):
            new_address = contact.Address(**address_args)
            meta.session.add(new_address)
            meta.session.commit()
            new_odontuxuser.address_id = new_address.id
#            new_odontuxuser.addresses.append(contact.Address(
#                                                            **address_args))
#
        phone_args = {g: getattr(phone_form, f).data 
                      for f,g in forms.phone_fields}
        if any(phone_args.values()):
            new_odontuxuser.phones.append(contact.Phone(**phone_args))

        mail_args = {f: getattr(mail_form, f).data for f in forms.mail_fields}
        if any(mail_args.values()):
            new_odontuxuser.mails.append(contact.Mail(**mail_args))

        meta.session.commit()
        return redirect(url_for('list_users'))

    return render_template('/add_user.html/', 
                    gen_info_form=gen_info_form,
                    gen_info_admin_form=gen_info_admin_form,
                    address_form=address_form,
                    phone_form=phone_form,
                    mail_form=mail_form,
                    password_form=password_form,
                    dentist_specific_form=dentist_specific_form,
                    dentist_specific_admin_form=dentist_specific_admin_form)
Exemple #4
0
def add_patient(meeting_id=0):
    """ Adding a new patient in database
    """
    # the administrator don't have the right/use to create patient
    # this task should be reserve to other roles, which are
    # Secretary (when the patient first call/come, she may create a file
    # Assisant/Nurse to help the dentist
    # The dentist himself
    authorized_roles = [ constants.ROLE_DENTIST, constants.ROLE_NURSE,
                    constants.ROLE_ASSISTANT, constants.ROLE_SECRETARY ]
    if session['role'] not in authorized_roles:
        return redirect(url_for("allpatients"))
   
    # Forms used for adding a new patient : 
    # two are patient's specific :
    gen_info_form = PatientGeneralInfoForm(request.form)
    gen_info_form.title.choices = forms.get_title_choice_list()
    gen_info_form.office_id.choices = [ (office.id, office.office_name) 
                for office in meta.session.query(users.DentalOffice).all() ]
    gen_info_form.dentist_id.choices = [ (dentist.id, dentist.firstname + " " 
                                                            + dentist.lastname)
                for dentist in meta.session.query(users.OdontuxUser)
                .filter(users.OdontuxUser.role == constants.ROLE_DENTIST,
                        users.OdontuxUser.active.is_(True))
                .order_by(users.OdontuxUser.lastname)
                .all() 
    ]
    if len(gen_info_form.dentist_id.choices) > 1:
        gen_info_form.dentist_id.choices.insert( 0, (0, "") )

    hcp_patient_form = HealthCarePlanPatientForm(request.form)
    hcp_patient_form.healthcare_plans_id.choices = [ (hc.id, hc.name) 
                for hc in meta.session.query(act.HealthCarePlan)
                            .filter(act.HealthCarePlan.active.is_(True))
                            .all() ]
    if not hcp_patient_form.healthcare_plans_id.choices:
        return redirect(url_for('add_healthcare_plan'))

    # three are used for odontux_users and medecine doctors, too
    address_form = forms.AddressForm(request.form)
    phone_form = forms.PhoneForm(request.form)
    mail_form = forms.MailForm(request.form)

    if (request.method == 'POST' and gen_info_form.validate()
        and address_form.validate()
        and phone_form.validate() and mail_form.validate() ):

        # Verify patient isn't already in database
        patient = checks.is_body_already_in_database(gen_info_form, "patient")
        if patient:
            return redirect(url_for('update_patient', 
                                    body_id=patient.id,
                                    form_to_display="gen_info"))
        
        values = {f: getattr(gen_info_form, f).data 
                        for f in get_gen_info_field_list()}
        new_patient = administration.Patient(**values)
        meta.session.add(new_patient)
        meta.session.commit()
        
        for healthcare_plan_id in hcp_patient_form.healthcare_plans_id.data:
            hcp = ( meta.session.query(act.HealthCarePlan)
                        .filter(act.HealthCarePlan.id == healthcare_plan_id)
                        .one()
                )
            new_patient.hcs.append(hcp)
        meta.session.commit()

#        # A family is define in odontux mostly by the fact that
#        # they live together. 
#        family_field_list = ['family_id']
#        for f in family_field_list:
#            # If patient in a family that is already in database, just tell 
#            # which family he's in.
#            if getattr(gen_info_form, f).data:
#                value[f] = int(getattr(gen_info_form, f).data)
#            else:
#                # Create new family and put the new patient in it.
#                new_family = administration.Family()
#                meta.session.add(new_family)
#                meta.session.commit()
#                new_patient.family_id = new_family.id
#                meta.session.commit()
                # Give the patient, member of family an address 
        address_args = {f: getattr(address_form, f).data 
                                for f in forms.address_fields}
        if any(address_args.values()):
            new_address = contact.Address(**address_args)
            meta.session.add(new_address)
            meta.session.commit()
            new_patient.address_id = new_address.id
            meta.session.commit()

#        # Now, we'll see if patient will pay for himself and for his family ;
#        # if not, it must be someone from his family who'll pay.
#        if gen_info_form.payer.data:
#            # Mark the patient as a payer
#            new_payer = administration.Payer(**{'id': new_patient.id})
#            meta.session.add(new_payer)
#            meta.session.commit()
#            # precise that in his family, he pays.
#            new_patient.family.payers.append(new_payer)
#            meta.session.commit()
#            
        # Phone number, in order to contact him.
        
        phone_args = {g: getattr(phone_form, f).data
                      for f,g in forms.phone_fields}

        if any(phone_args.values()):
            new_patient.phones.append(contact.Phone(**phone_args))
            meta.session.commit()

        # Mail
        mail_args = {f: getattr(mail_form, f).data for f in forms.mail_fields}
        if any(mail_args.values()):
            new_patient.mails.append(contact.Mail(**mail_args))
            meta.session.commit()

#        ##################################
#        # The Social Security Number : SSN
#        ##################################
#        # The social security info may have been entered via the 
#        # socialsecurity_id, encountered in gen_info_form, and which
#        # is used usually while insering children of already known patients
#        # in database.
#        if SSN_form.SSN.data:
#            # Verify if number already in database, for example children who
#            # are under parent's social security.
#            try:
#                SSN_id = meta.session.query(SocialSecurityLocale)\
#                    .filter(SocialSecurityLocale.number\
#                            == SSN_form.SSN.data).one().id
#
#            # If the number is new to database :
#            except sqlalchemy.orm.exc.NoResultFound:
#                SSN_args = {g: getattr(SSN_form, f).data 
#                                    for f,g in get_SSN_field_list() }
#                new_SSN = SocialSecurityLocale(**SSN_args)
#                meta.session.add(new_SSN)
#                meta.session.commit()
#                SSN_id = new_SSN.id
#        
#        else:
#            # If there weren't any SSNumber given, try anyway to add "cmu"
#            # and insurance hypothetic values into database
#            SSN_args = {g: getattr(SSN_form, f).data 
#                                    for f,g in get_SSN_field_list() }
#            new_SSN = SocialSecurityLocale(**SSN_args)
#            meta.session.add(new_SSN)
#            meta.session.commit()
#            SSN_id = new_SSN.id
#
#        # Tell Patient class the SSN he is related to.
#        new_patient.socialsecurity_id = SSN_id
#        meta.session.commit()

        #Add the new patient to gnucash !
        comptability = gnucash_handler.GnuCashCustomer(new_patient.id, 
                                                 new_patient.dentist_id)
        customer = comptability.add_customer()        

        return redirect(url_for('add_patient_appointment', 
                                            body_id=new_patient.id,
                                            meeting_id=meeting_id))

    return render_template("add_patient.html",
                            gen_info_form=gen_info_form,
                            address_form=address_form,
                            phone_form=phone_form,
                            mail_form=mail_form,
                            hcp_patient_form=hcp_patient_form,
                            meeting_id=meeting_id)