Commit 00da9413 by aagusti

de-table base_view

1 parent a541a8f9
...@@ -5,6 +5,7 @@ from datetime import datetime ...@@ -5,6 +5,7 @@ from datetime import datetime
from datatables import ColumnDT from datatables import ColumnDT
from dateutil.relativedelta import relativedelta from dateutil.relativedelta import relativedelta
from opensipkd.base.views.upload import tmpstore
from opensipkd.tools.captcha import get_captcha from opensipkd.tools.captcha import get_captcha
from pyramid.httpexceptions import HTTPFound from pyramid.httpexceptions import HTTPFound
...@@ -14,7 +15,7 @@ from .. import DBSession, get_params ...@@ -14,7 +15,7 @@ from .. import DBSession, get_params
from opensipkd.tools import dmy, date_from_str, get_settings, get_ext, \ from opensipkd.tools import dmy, date_from_str, get_settings, get_ext, \
date_from_str date_from_str
import colander import colander
from deform import (widget, Form, ValidationFailure, Button, ) from deform import (widget, Form, ValidationFailure, Button, FileData, )
from email.utils import parseaddr from email.utils import parseaddr
from opensipkd.tools.buttons import btn_save, btn_cancel, btn_close, btn_delete, \ from opensipkd.tools.buttons import btn_save, btn_cancel, btn_close, btn_delete, \
...@@ -22,12 +23,21 @@ from opensipkd.tools.buttons import btn_save, btn_cancel, btn_close, btn_delete, ...@@ -22,12 +23,21 @@ from opensipkd.tools.buttons import btn_save, btn_cancel, btn_close, btn_delete,
btn_pdf btn_pdf
from opensipkd.models import User, Menus from opensipkd.models import User, Menus
from ..scripts.initializedb import append_csv
from ..tools.api import auth_from_rpc from ..tools.api import auth_from_rpc
from ...detable import DeTable from ...detable import DeTable
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
class UploadSchema(colander.Schema):
upload = colander.SchemaNode(
FileData(),
widget=widget.FileUploadWidget(tmpstore),
title='Unggah')
class BaseView(object): class BaseView(object):
def __init__(self, request): def __init__(self, request):
self.req = request self.req = request
...@@ -140,6 +150,7 @@ class BaseView(object): ...@@ -140,6 +150,7 @@ class BaseView(object):
});""" });"""
self.edit_schema = "" self.edit_schema = ""
self.add_schema = "" self.add_schema = ""
self.upload_schema = UploadSchema
self.table = "" self.table = ""
self.home = self.req.route_url('home')[:-1] self.home = self.req.route_url('home')[:-1]
self.buttons = None self.buttons = None
...@@ -147,6 +158,7 @@ class BaseView(object): ...@@ -147,6 +158,7 @@ class BaseView(object):
self.bindings = {} self.bindings = {}
self.autocomplete = 'on' self.autocomplete = 'on'
self.action_suffix = "/grid/act" self.action_suffix = "/grid/act"
self.upload_keys = ["kode"]
def delete_msg(self, row): def delete_msg(self, row):
return f'Data ID {row.id} sudah dihapus.' return f'Data ID {row.id} sudah dihapus.'
...@@ -245,6 +257,53 @@ class BaseView(object): ...@@ -245,6 +257,53 @@ class BaseView(object):
table=table and table.render() or None, table=table and table.render() or None,
scripts=self.form_scripts) scripts=self.form_scripts)
def view_upload(self, exts=('.png', '.ico')):
bindings = self.get_bindings()
form = self.get_form(self.upload_schema, bindings=bindings)
resources = form.get_widget_resources()
if self.req.POST:
if 'save' in self.req.POST:
input_file = self.req.POST['upload'].file
filename = self.req.POST['upload'].filename.lower()
ext = get_ext(filename).lower()
if ext.lower() not in exts:
ext = ", ".join([ex for ex in exts])
self.req.session.flash(f'File harus format {ext}', 'error')
return dict(form=form.render(),
scripts=self.form_scripts, css=resources["css"],
js=resources["js"])
_here = get_params('tmp', '/tmp')
folder = os.path.join(_here, 'upload')
if not os.path.exists(folder):
os.makedirs(folder)
fullpath = os.path.join(folder, filename)
output_file = open(fullpath, 'wb')
input_file.seek(0)
while True:
data = input_file.read(2 << 16)
if not data:
break
output_file.write(data)
self.save_upload(fullpath)
elif "cancel" in self.req.POST or 'batal' in self.req.POST or "close" in self.req.POST:
self.cancel_act()
else:
return self.next_add(form, resources=resources)
return self.route_list()
return dict(form=form.render(),
scripts=self.form_scripts, css=resources["css"],
js=resources["js"])
def get_file(self, filename):
return open(filename)
def save_upload(self, file_name):
return append_csv(self.table, file_name, self.upload_keys,
get_file_func=self.get_file, update_exist=True)
def before_add(self): def before_add(self):
return {} return {}
...@@ -502,13 +561,16 @@ username_re = re.compile('^[a-z0-9_]{6,16}$', re.IGNORECASE) ...@@ -502,13 +561,16 @@ username_re = re.compile('^[a-z0-9_]{6,16}$', re.IGNORECASE)
def user_name_validator(node, value): def user_name_validator(node, value):
if not username_re.match(value): if not username_re.match(value):
raise colander.Invalid(node, raise colander.Invalid(
'Value must be between 6 and 16 characters and can only contain uppercase and lowercase alphanumeric characters or an underscore') node,
'Value must be between 6 and 16 characters and can only contain ' +
'uppercase and lowercase alphanumeric characters or an underscore')
def need_captcha(): def need_captcha():
is_captcha = get_params("reg_captcha") is_captcha = get_params("reg_captcha")
return is_captcha == '1' or is_captcha == "True" or is_captcha == "true" or is_captcha == True return is_captcha == '1' or is_captcha == "True" or is_captcha == "true" \
or is_captcha == True
def need_verify(): def need_verify():
......
...@@ -128,6 +128,8 @@ class DeTable(field.Field): ...@@ -128,6 +128,8 @@ class DeTable(field.Field):
btn_csv_js = "{window.location = o%sUri+'/csv/act%s';}" % ( btn_csv_js = "{window.location = o%sUri+'/csv/act%s';}" % (
tableid, params) tableid, params)
btn_pdf_js = "{window.open(o%sUri+'/pdf/act%s');}" % (tableid, params) btn_pdf_js = "{window.open(o%sUri+'/pdf/act%s');}" % (tableid, params)
btn_upload_js = "{window.location(o%sUri+'/upload%s');}" % (tableid, params)
action_suffix = f"{action_suffix}{params}" action_suffix = f"{action_suffix}{params}"
field.Field.__init__(self, schema, **kw) field.Field.__init__(self, schema, **kw)
self.request = kw.get("request") self.request = kw.get("request")
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!