partner_base.py 6.75 KB
from . import Validator
from .. import get_urls
import colander
from deform import FileData, widget
from translationstring import TranslationStringFactory

from opensipkd.base.views.dati2 import dati2_widget
from opensipkd.base.views.desa import desa_widget
from opensipkd.base.views.kecamatan import kecamatan_widget
from opensipkd.base.views.provinsi import provinsi_widget
from opensipkd.models import Partner
from opensipkd.tools import mem_tmp_store


_ = TranslationStringFactory('partner')

# Email validator
class PartnerEmailValidator(colander.Email, Validator):
    def __init__(self, row):
        Validator.__init__(self, row)
        colander.Email.__init__(self)

    def __call__(self, node, value):
        def email_found():
            data = dict(email=email, rid=found.id, rname=found.nama)
            ts = _(
                'email-already-used',
                default='Email ${email} already used by Partner ID ${rid}: ${rname}',
                mapping=data)
            raise colander.Invalid(node, ts)

        if self.match_object.match(value) is None:
            raise colander.Invalid(node, _('Invalid email format'))

        email = value.lower()
        q = Partner.query().filter_by(email=email)
        found = q.first()
        if found and (not self.row or self.row.email != found.email):
            email_found()

@colander.deferred
def partner_email_validator(node, kw):
    return PartnerEmailValidator(kw['row'])

class PartnerKodeValidator(Validator):
    def __init__(self, row):
        Validator.__init__(self, row)

    def __call__(self, node, value):
        def err_found():
            data = dict(kode=val, rid=found.id, rnama=found.nama)
            ts = _(
                'kode-already-used',
                default='Kode ${kode} already used by Partner ID ${rid}: ${rnama}',
                mapping=data)
            raise colander.Invalid(node, ts)

        val = value
        q = Partner.query().filter_by(kode=val)
        found = q.first()
        if found and (not self.row or self.row.kode != found.kode):
            err_found()

@colander.deferred
def partner_kode_validator(node, kw):
    return PartnerKodeValidator(kw['row'])

# Pengaturan field form html
class NamaSchema(colander.Schema):
    kode = colander.SchemaNode(
        colander.String(),
        validator=colander.Length(max=32, max_err='Maksimal 32 karakter'),
        oid="kode",
        title="Kode",
        width="100pt")
    nama = colander.SchemaNode(
        colander.String(),
        validator=colander.Length(max=128, max_err='Maksimal 128 karakter'),
        oid="nama")
    mobile = colander.SchemaNode(
        colander.String(),
        validator=colander.Length(max=16, max_err='Maksimal 16 karakter angka'),
        oid="mobile")
    email = colander.SchemaNode(
        colander.String(),
        validator=colander.Length(max=40, max_err='Maksimal 40 karakter'),
        oid="email")

class PartnerSchema(NamaSchema):
    nip = colander.SchemaNode(
        colander.String(),
        missing=colander.drop,
        validator=colander.Length(max=32, max_err='Maksimal 32 digit karakter'),
        oid="nip")
    npwp = colander.SchemaNode(
        colander.String(),
        missing=colander.drop,
        validator=colander.Length(max=32, max_err='Maksimal 32 digit karakter'),
        oid="npwp")
    idcard = colander.SchemaNode(
        FileData(),
        widget=widget.FileUploadWidget(mem_tmp_store),
        missing=colander.drop,
        title="ID Card")
    alamat_1 = colander.SchemaNode(
        colander.String(),
        missing=colander.drop,
        validator=colander.Length(max=128, max_err='Maksimal 128 karakter'),
        oid="alamat_1")
    alamat_2 = colander.SchemaNode(
        colander.String(),
        missing=colander.drop,
        validator=colander.Length(max=128, max_err='Maksimal 128 karakter'),
        oid="alamat_2")
    # kelurahan = colander.SchemaNode(
    #     colander.String(),
    #     missing=colander.drop,
    #     validator=colander.Length(max=64),
    #     oid="kelurahan")
    # kecamatan = colander.SchemaNode(
    #     colander.String(),
    #     missing=colander.drop,
    #     validator=colander.Length(max=64),
    #     oid="kecamatan")
    # kota = colander.SchemaNode(
    #     colander.String(),
    #     validator=colander.Length(max=64),
    #     missing=colander.drop,
    #     oid="kota")
    # provinsi = colander.SchemaNode(
    #     colander.String(),
    #     validator=colander.Length(max=64),
    #     missing=colander.drop,
    #     oid="provinsi")
    provinsi_id = colander.SchemaNode(
        colander.Integer(),
        widget=provinsi_widget,
        missing=colander.drop,
        oid="provinsi_id",
        slave="dati2_id",
        slave_url="/dati2/select/act?provinsi_id=",
        title="Provinsi",)
    dati2_id = colander.SchemaNode(
        colander.Integer(),
        widget=dati2_widget,
        missing=colander.drop,
        slave="kecamatan_id",
        slave_url="/kecamatan/select/act?dati2_id=",
        title="Kab/Kota",
        oid="dati2_id")
    kecamatan_id = colander.SchemaNode(
        colander.Integer(),
        missing=colander.drop,
        widget=kecamatan_widget,
        slave="desa_id",
        slave_url="/desa/select/act?kecamatan_id=",
        title="Kecamatan",
        oid="kecamatan_id")
    desa_id = colander.SchemaNode(
        colander.Integer(),
        widget=desa_widget,
        missing=colander.drop,
        title="Desa/Kelurahan",
        oid="desa_id")
    phone = colander.SchemaNode(
        colander.String(),
        validator=colander.Length(max=16, max_err='Maksimal 16 karakter'),
        missing=colander.drop,
        oid="phone")
    fax = colander.SchemaNode(
        colander.String(),
        validator=colander.Length(max=16, max_err='Maksimal 16 karakter'),
        missing=colander.drop,
        oid="fax")
    mobile = colander.SchemaNode(
        colander.String(),
        validator=colander.Length(max=16),
        missing=colander.drop,
        oid="mobile")
    website = colander.SchemaNode(
        colander.String(),
        validator=colander.Length(max=64, max_err='Maksimal 64 karakter'),
        missing=colander.drop,
        oid="website")
    status = colander.SchemaNode(
        colander.Boolean(),
        oid="status")
    def after_bind(self, schema, kwargs):
        request = kwargs["request"]
        prefix = get_urls(request.route_url("home"))
        self["provinsi_id"].slave_url = f"{prefix}/dati2/select/act?provinsi_id="
        self["dati2_id"].slave_url = f"{prefix}/kecamatan/select/act?dati2_id="
        self["kecamatan_id"].slave_url = f"{prefix}/desa/select/act?kecamatan_id="