template.py 4.66 KB
from calendar import c
from datetime import datetime
import os
import colander
from deform import (widget, Form, ValidationFailure, FileData, )
from . import BaseView
from .. import SPPT_CLASS
from tangsel.tools.buttons import btn_cancel, btn_upload
from pyramid.httpexceptions import HTTPFound
from tangsel.tools import mem_tmp_store, date_from_str
# class ListSchema(colander.Schema):
#     id =colander.SchemaNode(
#         colander.Integer(),
#         title="Act",
#         missing=colander.drop,
#         widget=widget.HiddenWidget()
#     )
#     tahun = colander.SchemaNode(
#         colander.String(),
#         widget=widget.TextInputWidget(mask="9999"),
#         default=str(datetime.now().year)
#     )
#     file_upload = colander.SchemaNode(
#         FileData(),
#         widget=widget.FileUploadWidget(mem_tmp_store),
#         title='Unggah',

#     )

# class EditSchema(ListSchema):
#     pass


class AddSchema(colander.Schema):
    tahun = colander.SchemaNode(
        colander.String(),
        widget=widget.TextInputWidget(mask="9999"),
        default=str(datetime.now().year)
    )

    jrmxl_file = colander.SchemaNode(
        FileData(),
        widget=widget.FileUploadWidget(mem_tmp_store, accept=".jrxml"),
        title='Format (jrxml)',
        # description="""
        # File yang diupload berupa
        # 1. sppt.jrxml  berisi XML penempatan posisi field
        # 2. sppt.jpg background gambar SPPT
        # 3. sppt.txt berisi penulisan pembayaran
        # 4. ttd.png berisi ttd electronic
        # File akan disimpan sesuai dengan tahun yang diisi
        # """
    )

    bg_file = colander.SchemaNode(
        FileData(),
        widget=widget.FileUploadWidget(mem_tmp_store, accept=".jpg"),
        title='Background (jpg)',
    )
    txt_file = colander.SchemaNode(
        colander.String(),
        missing=colander.drop,
        widget=widget.TextAreaWidget(),
        title='Tempat Pembayaran (txt)',
    )
    ttd_file = colander.SchemaNode(
        FileData(),
        widget=widget.FileUploadWidget(mem_tmp_store, accept=".png"),
        title='TTD Image (png)',
    )
    set_default = colander.SchemaNode(
        colander.Boolean(),
        widget=widget.CheckboxWidget(),
        title='Set Default',
        # description="Set sebagai default template",
    )

class Views(BaseView):
    def __init__(self, request):
        super().__init__(request)
        self.add_schema = AddSchema
        self.upload_exts = (".jrxml", ".jpg", ".txt", ".png")
        self.buttons = (btn_upload, btn_cancel)

    def view_upload(self):
        return super().view_add()

    def form_validator(self, form, value):
        folder = SPPT_CLASS.files_tpl
        file_name = value.get("tahun")
        tahun = value.get("tahun")
        exc = colander.Invalid(form, "")
        set_default = value.get("set_default")
        if set_default:
            file_name="sppt"
            
        txt = value.get("txt_file")
        try:
            value["jrmxl_file"] = self.save_file(
                value, 'jrmxl_file', folder, file_name)

        except Exception as e:
            exc["jrmxl_file"] = str(e)
            raise exc

        try:
            value["bg_file"] = self.save_file(
                value, 'bg_file', folder, file_name)
        except Exception as e:
            exc["bg_file"] = str(e)
            raise exc
        
        try:
            with open(os.path.join(folder, f"{file_name}.txt"), "w") as f:
                f.write(txt)
        except Exception as e:
            exc["txt_file"] = str(e)
            raise exc

        try:
            value["ttd_file"] = self.save_file(
                value, 'ttd_file', folder, file_name)
        except Exception as e:
            exc["ttd_file"] = str(e)
            raise exc

    def next_add(self, form, **kwargs):
        table = None
        if "upload" in self.req.POST:
            controls = self.req.POST.items()
            try:
                c = form.validate(controls)
            except ValidationFailure as e:
                value = self.before_add()
                for f in e.field.children:
                    if isinstance(f.typ, colander.Date):
                        e.cstruct[f.name] = date_from_str(
                            e.cstruct[f.name])
                value = self.update_value(value, e.cstruct)
                form.set_appstruct(value)
                return self.returned_form(form, **kwargs)

            # values = self.form_validate(form, self.before_add, **kwargs)
            # if type(values) != dict or values.get("form"):
            #     return values
            # self.ses.flash(f"Upload File {values['file_name']} berhasil ")
        return HTTPFound(self.req.route_url("esppt-template"))