Penambahan Fungsi render xhr request

1 parent 30d40a72
...@@ -17,7 +17,7 @@ from pyramid_mailer import mailer_factory_from_settings ...@@ -17,7 +17,7 @@ from pyramid_mailer import mailer_factory_from_settings
from .security import MySecurityPolicy, get_user from .security import MySecurityPolicy, get_user
from sqlalchemy import engine_from_config from sqlalchemy import engine_from_config
from .models.base import DBSession from .models.base import DBSession
from .models.handlers import LogDBSession from .models.handlers import LogDBSession
from .models.meta import Base from .models.meta import Base
from .models.users import init_model from .models.users import init_model
...@@ -43,7 +43,6 @@ static_route = [] ...@@ -43,7 +43,6 @@ static_route = []
titles = {} titles = {}
def get_params(params, alternate=None, settings=None): def get_params(params, alternate=None, settings=None):
""" """
Digunakan untuk mengambil nilai dari konfigurasi sesuai params yang disebut Digunakan untuk mengambil nilai dari konfigurasi sesuai params yang disebut
...@@ -63,6 +62,7 @@ def get_params(params, alternate=None, settings=None): ...@@ -63,6 +62,7 @@ def get_params(params, alternate=None, settings=None):
f"get_params: {params}, Alternate: {alternate} Settings: {not settings == None} Result: {result}") f"get_params: {params}, Alternate: {alternate} Settings: {not settings == None} Result: {result}")
return result and result.strip() or alternate return result and result.strip() or alternate
def add_cors_headers_response_callback(event): def add_cors_headers_response_callback(event):
def cors_headers(request, response): def cors_headers(request, response):
origin = request.headers.get("Origin", None) origin = request.headers.get("Origin", None)
...@@ -93,9 +93,11 @@ def add_cors_headers_response_callback(event): ...@@ -93,9 +93,11 @@ def add_cors_headers_response_callback(event):
event.request.add_response_callback(cors_headers) event.request.add_response_callback(cors_headers)
def get_app_name(request): def get_app_name(request):
return get_params('app_name', 'openSIPKD Application') return get_params('app_name', 'openSIPKD Application')
def get_menus(request): def get_menus(request):
""" """
digunakan untuk mengambil daftar menu untuk setiap modul yg sudah diregistrasikan di config key "menus". digunakan untuk mengambil daftar menu untuk setiap modul yg sudah diregistrasikan di config key "menus".
...@@ -160,20 +162,25 @@ def get_menus(request): ...@@ -160,20 +162,25 @@ def get_menus(request):
return result return result
def get_home(request): def get_home(request):
return request.route_url('base-home')[:-1] return request.route_url('base-home')[:-1]
def get_host(request): def get_host(request):
host = get_params('_host', "") host = get_params('_host', "")
return host and host or get_home(request) return host and host or get_home(request)
def get_title(request): def get_title(request):
route_name = request.matched_route.name route_name = request.matched_route.name
return titles[route_name] return titles[route_name]
def get_company(request): def get_company(request):
return get_params('company', 'openSIPKD').upper() return get_params('company', 'openSIPKD').upper()
def format_datetime(v): def format_datetime(v):
if v.time() != datetime.time(0, 0): if v.time() != datetime.time(0, 0):
return dmyhms(v) return dmyhms(v)
...@@ -197,9 +204,11 @@ def json_rpc(): ...@@ -197,9 +204,11 @@ def json_rpc():
json_r.add_adapter(decimal.Decimal, lambda v, request: str(v)) json_r.add_adapter(decimal.Decimal, lambda v, request: str(v))
return json_r return json_r
def allow_register(request): def allow_register(request):
return BASE_CLASS.allow_register return BASE_CLASS.allow_register
def google_signin_client_ids(request): def google_signin_client_ids(request):
ids = get_params('google-signin-client-id', '') ids = get_params('google-signin-client-id', '')
if ids: if ids:
...@@ -241,9 +250,9 @@ def get_config(settings): ...@@ -241,9 +250,9 @@ def get_config(settings):
# config.add_request_method(thousand, 'thousand', reify=True) # config.add_request_method(thousand, 'thousand', reify=True)
# config.add_request_method(is_devel, 'devel', reify=True) # config.add_request_method(is_devel, 'devel', reify=True)
config.add_request_method(google_signin_client_id, config.add_request_method(google_signin_client_id,
'google_signin_client_id', reify=True) 'google_signin_client_id', reify=True)
config.add_request_method(google_signin_client_ids, config.add_request_method(google_signin_client_ids,
'google_signin_client_ids', reify=True) 'google_signin_client_ids', reify=True)
config.add_request_method(allow_register, 'allow_register', reify=True) config.add_request_method(allow_register, 'allow_register', reify=True)
# config.add_request_method(disable_responsive, 'disable_responsive', # config.add_request_method(disable_responsive, 'disable_responsive',
# reify=True) # reify=True)
...@@ -274,7 +283,7 @@ def get_config(settings): ...@@ -274,7 +283,7 @@ def get_config(settings):
# os.makedirs(partner_files) # os.makedirs(partner_files)
config.add_static_view('static', 'opensipkd.base:static', config.add_static_view('static', 'opensipkd.base:static',
cache_max_age=3600) cache_max_age=3600)
config.add_static_view('deform_static', 'deform:static') config.add_static_view('deform_static', 'deform:static')
...@@ -292,10 +301,11 @@ def get_config(settings): ...@@ -292,10 +301,11 @@ def get_config(settings):
return config return config
def init_db(settings): def init_db(settings):
engine = engine_from_config( engine = engine_from_config(
settings, 'sqlalchemy.', client_encoding='utf8', settings, 'sqlalchemy.', client_encoding='utf8',
max_identifier_length=30) # , convert_unicode=True max_identifier_length=30) # , convert_unicode=True
DBSession.configure(bind=engine) DBSession.configure(bind=engine)
LogDBSession.configure(bind=engine) LogDBSession.configure(bind=engine)
Base.metadata.bind = engine Base.metadata.bind = engine
...@@ -315,7 +325,7 @@ def main(global_config, **settings): ...@@ -315,7 +325,7 @@ def main(global_config, **settings):
settings['timezone'] = DefaultTimeZone settings['timezone'] = DefaultTimeZone
# settings["captcha_files"] = "c:\\tmp\\captcha\\" # settings["captcha_files"] = "c:\\tmp\\captcha\\"
tmp = get_params("temp_files", "/tmp", settings=settings) tmp = get_params("temp_files", "/tmp", settings=settings)
settings["captcha_files"] = os.path.join(tmp , "captcha") + os.sep settings["captcha_files"] = os.path.join(tmp, "captcha") + os.sep
init_db(settings=settings) init_db(settings=settings)
config = get_config(settings=settings) config = get_config(settings=settings)
...@@ -377,17 +387,15 @@ def _add_view_config(config, paket, route): ...@@ -377,17 +387,15 @@ def _add_view_config(config, paket, route):
config.add_view(views, **params) config.add_view(views, **params)
except Exception as e: except Exception as e:
_logging.error("Add View Config :{code} Kode {error}"\ _logging.error("Add View Config :{code} Kode {error}"
.format(code=route["kode"], error=str(e))) .format(code=route["kode"], error=str(e)))
_logging.debug(f"Route: {route.get('kode')} {route.get('path')}") _logging.debug(f"Route: {route.get('kode')} {route.get('path')}")
class BaseApp(): class BaseApp():
def __init__(self): def __init__(self):
self.menus = [] self.menus = []
self.partner_doc = "" self.partner_doc = ""
self.temp_files = "" self.temp_files = ""
self.allow_register = 0 self.allow_register = 0
...@@ -413,7 +421,7 @@ class BaseApp(): ...@@ -413,7 +421,7 @@ class BaseApp():
"temp_files", '/tmp', settings=settings) "temp_files", '/tmp', settings=settings)
if not os.path.exists(self.temp_files): if not os.path.exists(self.temp_files):
os.makedirs(self.temp_files) os.makedirs(self.temp_files)
# Registrasi # Registrasi
self.allow_register = get_params( self.allow_register = get_params(
"allow_register", 0, settings=settings) "allow_register", 0, settings=settings)
...@@ -430,8 +438,8 @@ class BaseApp(): ...@@ -430,8 +438,8 @@ class BaseApp():
'captcha', self.captcha_files, cache_max_age=0) 'captcha', self.captcha_files, cache_max_age=0)
self.login_tpl = get_params("login_tpl", "", settings=settings) self.login_tpl = get_params("login_tpl", "", settings=settings)
self.login_captcha = int(get_params("login_captcha", 0, settings=settings)) self.login_captcha = int(get_params(
"login_captcha", 0, settings=settings))
def add_menu(self, config, route_menus, parent=None, paket="opensipkd.base.views"): def add_menu(self, config, route_menus, parent=None, paket="opensipkd.base.views"):
route_names = [] route_names = []
...@@ -442,7 +450,7 @@ class BaseApp(): ...@@ -442,7 +450,7 @@ class BaseApp():
route["route_name"] = [route["kode"]] route["route_name"] = [route["kode"]]
route["permission"] = route.get("permission", "") route["permission"] = route.get("permission", "")
route["icon"] = route.get("icon", None) route["icon"] = route.get("icon", None)
route_typ = route.get("typ", 0) route_typ = route.get("typ", 0) or route.get("type", 0) or 0
if route_typ == "" or route_typ == None: if route_typ == "" or route_typ == None:
route_typ = 0 route_typ = 0
else: else:
...@@ -497,7 +505,6 @@ class BaseApp(): ...@@ -497,7 +505,6 @@ class BaseApp():
if p["children"]: if p["children"]:
self.route_children(p["children"], row) self.route_children(p["children"], row)
def route_from_csv_(self, config, paket="tangsel.base.views", rows=[]): def route_from_csv_(self, config, paket="tangsel.base.views", rows=[]):
new_routes = [] new_routes = []
for row in rows: for row in rows:
...@@ -515,26 +522,26 @@ class BaseApp(): ...@@ -515,26 +522,26 @@ class BaseApp():
new_routes.append(row) new_routes.append(row)
self.add_menu(config, new_routes, None, paket) self.add_menu(config, new_routes, None, paket)
def route_from_csv(self, config, paket="opensipkd.base.views", filename="routes.csv"): def route_from_csv(self, config, paket="opensipkd.base.views", filename="routes.csv"):
fullpath = os.path.join(self.base_dir, 'scripts', 'data', filename) fullpath = os.path.join(self.base_dir, 'scripts', 'data', filename)
if get_ext(filename) == ".csv": if get_ext(filename) == ".csv":
with open(fullpath) as f: with open(fullpath) as f:
rows = csv.DictReader(f, skipinitialspace=True) rows = csv.DictReader(f, skipinitialspace=True)
self.route_from_csv_(config, paket, rows=rows) self.route_from_csv_(config, paket, rows=rows)
else: else:
import xlsx_dict_reader import xlsx_dict_reader
from openpyxl import load_workbook from openpyxl import load_workbook
wb= load_workbook(fullpath, data_only=True) wb = load_workbook(fullpath, data_only=True)
ws = wb.active ws = wb.active
rows = xlsx_dict_reader.DictReader(ws) #skip_blank=True rows = xlsx_dict_reader.DictReader(ws) # skip_blank=True
self.route_from_csv_(config, paket, rows=rows) self.route_from_csv_(config, paket, rows=rows)
# with self.get_route_file(filename) as f: # with self.get_route_file(filename) as f:
# rows = csv.DictReader(f) # rows = csv.DictReader(f)
# new_routes = [] # new_routes = []
# for row in rows: # for row in rows:
# status = row.get("status", 0) # status = row.get("status", 0)
...@@ -586,7 +593,7 @@ def has_permission_(request, perm_names, context=None): ...@@ -586,7 +593,7 @@ def has_permission_(request, perm_names, context=None):
def add_global(event): def add_global(event):
event['has_permission'] = has_permission_ event['has_permission'] = has_permission_
event['get_base_menus'] = BASE_CLASS.get_menus event['get_base_menus'] = BASE_CLASS.get_menus
# event['has_modules'] = has_modules_ # event['has_modules'] = has_modules_
# event['urlencode'] = urlencode # event['urlencode'] = urlencode
# event['quote_plus'] = quote_plus # event['quote_plus'] = quote_plus
...@@ -607,6 +614,7 @@ def add_global(event): ...@@ -607,6 +614,7 @@ def add_global(event):
# # event['get_module_menus'] = get_module_menus # # event['get_module_menus'] = get_module_menus
# # event['get_module_submenus'] = get_module_submenus # # event['get_module_submenus'] = get_module_submenus
def get_params_(params, alternate=None, settings=None): def get_params_(params, alternate=None, settings=None):
return get_params(params, alternate, settings) return get_params(params, alternate, settings)
......
import os
import sys
from opensipkd.tools import get_settings
def is_live(pid):
try:
os.kill(pid, 0)
except OSError:
return
return True
def get_pid(pidfile):
try:
f = open(pidfile, 'r')
pid_int = int(f.read().split()[0])
f.close()
return pid_int
except IOError:
return
except ValueError:
return
except IndexError:
return
def get_pid_file(pid_name=None, settings=None):
if not pid_name:
pid_name = os.path.split(sys.argv[0])[-1]
pid_name = os.path.splitext(pid_name)[0]
if not settings:
settings = get_settings()
dir_path = 'session.lock_dir'
if not os.path.exists(dir_path):
mkdir(dir_path)
return os.path.join(dir_path, pid_name)
def make_pid(pid_file, settings=None):
pid = get_pid(pid_file)
if pid and is_live(pid):
msg = 'PID saya {pid} masih ada.'.format(pid=pid)
print(msg)
sys.exit()
pid = os.getpid()
f = open(pid_file, 'w')
f.write(str(pid))
f.close()
return pid
def one_pid():
pid_file = get_pid_file()
make_pid(pid_file)
return pid_file
def mkdir(dir_name):
if not os.path.exists(dir_name):
os.makedirs(dir_name)
def get_fullpath(filename):
dir_name = os.path.split(__file__)[0]
return os.path.join(dir_name, filename)
import logging import logging
import os import os
# import re import re
from datetime import datetime from datetime import datetime
# from email.utils import parseaddr from email.utils import parseaddr
import colander import colander
from opensipkd.base import BASE_CLASS
from pyramid.csrf import new_csrf_token, get_csrf_token
from datatables import ColumnDT from datatables import ColumnDT
# from dateutil.relativedelta import relativedelta from dateutil.relativedelta import relativedelta
from deform import (widget, Form, ValidationFailure, FileData, ) from deform import (widget, Form, ValidationFailure, FileData, )
from deform.widget import SelectWidget from deform.widget import SelectWidget
from pyramid.httpexceptions import HTTPFound, HTTPNotFound from pyramid.httpexceptions import HTTPFound, HTTPNotFound
...@@ -18,15 +16,18 @@ from sqlalchemy import Table ...@@ -18,15 +16,18 @@ from sqlalchemy import Table
from opensipkd.tools import dmy, get_settings, get_ext, \ from opensipkd.tools import dmy, get_settings, get_ext, \
date_from_str, get_random_string, Upload, InvalidExtension, mem_tmp_store date_from_str, get_random_string, Upload, InvalidExtension, mem_tmp_store
from opensipkd.tools.buttons import ( from opensipkd.tools.buttons import (
btn_save, btn_cancel, btn_close, btn_delete, btn_add, btn_csv, btn_save, btn_cancel, btn_close, btn_delete, btn_add, btn_csv,
btn_pdf, btn_unpost, btn_post, btn_upload) btn_pdf, btn_unpost, btn_post, btn_upload)
# from opensipkd.tools.captcha import get_captcha # from opensipkd.tools.captcha import get_captcha
from opensipkd.tools.report import csv_response, file_response from opensipkd.tools.report import csv_response, file_response
from pyramid.request import Response
from .common import DataTables from .common import DataTables
from ..models import DBSession, Partner from ..models import DBSession, Partner
# , get_params, get_urls # , get_params, get_urls
from ..scripts.initializedb import append_csv from ..scripts.initializedb import append_csv
from ...detable import DeTable from ...detable import DeTable
from opensipkd.base import BASE_CLASS
from pyramid.csrf import new_csrf_token, get_csrf_token
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
...@@ -37,6 +38,7 @@ class UploadSchema(colander.Schema): ...@@ -37,6 +38,7 @@ class UploadSchema(colander.Schema):
widget=widget.FileUploadWidget(mem_tmp_store), widget=widget.FileUploadWidget(mem_tmp_store),
title='Unggah') title='Unggah')
class CSRFSchema(colander.Schema): class CSRFSchema(colander.Schema):
def after_bind(self, schema, kwargs): def after_bind(self, schema, kwargs):
request = kwargs["request"] request = kwargs["request"]
...@@ -64,12 +66,12 @@ class BaseView(object): ...@@ -64,12 +66,12 @@ class BaseView(object):
# self.akhir = None # self.akhir = None
# self.dt_awal = None # self.dt_awal = None
# self.dt_akhir = None # self.dt_akhir = None
# self.tahun_awal = None # self.tahun_awal = None
# self.tahun_akhir = None # self.tahun_akhir = None
# self.departemen_kd = None # self.departemen_kd = None
# self.departemen_nm = None # self.departemen_nm = None
# self.departemen_id = None # self.departemen_id = None
# self.jenis = None # self.jenis = None
self.list_route = 'home' self.list_route = 'home'
# self.list_col_defs = "" # self.list_col_defs = ""
# self.list_cols = "" # self.list_cols = ""
...@@ -96,8 +98,8 @@ class BaseView(object): ...@@ -96,8 +98,8 @@ class BaseView(object):
self.html_buttons = {} self.html_buttons = {}
self.new_buttons = {} self.new_buttons = {}
self.list_form = None #List dam Form self.list_form = None # List dam Form
self.form_list = None #Form kemudian detail list self.form_list = None # Form kemudian detail list
self.form_scripts = """ self.form_scripts = """
$('#parent_nm').bind('typeahead:selected', function(obj, datum) { $('#parent_nm').bind('typeahead:selected', function(obj, datum) {
...@@ -110,7 +112,7 @@ class BaseView(object): ...@@ -110,7 +112,7 @@ class BaseView(object):
# self.add_schema = colander.Schema() # self.add_schema = colander.Schema()
# self.edit_schema = colander.Schema() # self.edit_schema = colander.Schema()
self.upload_schema = UploadSchema self.upload_schema = UploadSchema
self.upload_exts = (".csv", ".tsv") self.upload_exts = (".csv", ".tsv")
self.upload_keys = ["kode"] self.upload_keys = ["kode"]
...@@ -121,15 +123,15 @@ class BaseView(object): ...@@ -121,15 +123,15 @@ class BaseView(object):
self.bindings = {} self.bindings = {}
self.autocomplete = 'on' self.autocomplete = 'on'
# self.report_file = "" # self.report_file = ""
self.is_object = False self.is_object = False
self.init_session(request) self.init_session(request)
def init_session(self, request): def init_session(self, request):
# # if not request.user: # # if not request.user:
# if "g_state" in request.cookies: # if "g_state" in request.cookies:
# request.response.delete_cookie("g_state", '/') # request.response.delete_cookie("g_state", '/')
now = datetime.now() now = datetime.now()
# # self.dt_awal = self.ses["dt_awal"] if "dt_awal" in self.ses else now # # self.dt_awal = self.ses["dt_awal"] if "dt_awal" in self.ses else now
...@@ -216,7 +218,26 @@ class BaseView(object): ...@@ -216,7 +218,26 @@ class BaseView(object):
# 'jenis'] or self.jenis # 'jenis'] or self.jenis
# self.ses['jenis'] = self.jenis # self.ses['jenis'] = self.jenis
def form2dict(self, field):
children = []
for c in field.children:
children.append(self.form2dict(c))
value = hasattr(field, "cstruct") and field.cstruct or ""
if type(value) in (colander.null, colander._null):
value = ""
if type(value) == dict:
for k, v in value.items():
if type(v) in (colander.null, colander._null):
value[k] = ""
d = {
"id": field.oid,
"name": field.name,
"error": {"msg": field.error and field.error.msg or ""},
"children": children,
"value": value
}
return d
# def query_register(self, **kwargs): # def query_register(self, **kwargs):
# pass # pass
...@@ -238,19 +259,16 @@ class BaseView(object): ...@@ -238,19 +259,16 @@ class BaseView(object):
if not list_url: if not list_url:
list_url = self.req.route_url(self.list_route, **kwargs) list_url = self.req.route_url(self.list_route, **kwargs)
log.debug(list_url) log.debug(list_url)
if self.headers: if self.headers:
return HTTPFound( return HTTPFound(
location=self.req.route_url(self.list_route), location=self.req.route_url(self.list_route),
# location=get_urls(list_url), headers=self.headers)
headers=self.headers)
else: else:
return HTTPFound( return HTTPFound(
location=self.req.route_url(self.list_route), location=self.req.route_url(self.list_route))
# location=get_urls(list_url)
)
def form_validator(self, form, value): def form_validator(self, form, value):
pass pass
...@@ -568,6 +586,11 @@ class BaseView(object): ...@@ -568,6 +586,11 @@ class BaseView(object):
return self.route_list(**kwargs) return self.route_list(**kwargs)
def returned_form(self, form, table=None, **kwargs): def returned_form(self, form, table=None, **kwargs):
if self.req.is_xhr:
d = self.form2dict(form)
import json
return Response(json=d)
resources = form.get_widget_resources() resources = form.get_widget_resources()
readonly = "readonly" in kwargs and kwargs["readonly"] or False readonly = "readonly" in kwargs and kwargs["readonly"] or False
kwargs["readonly"] = readonly kwargs["readonly"] = readonly
...@@ -674,7 +697,6 @@ class BaseView(object): ...@@ -674,7 +697,6 @@ class BaseView(object):
def view_upload(self, **kw): def view_upload(self, **kw):
return self.view_import(**kw) return self.view_import(**kw)
def view_import(self, **kw): def view_import(self, **kw):
exts = kw.get("exts") exts = kw.get("exts")
...@@ -699,14 +721,14 @@ class BaseView(object): ...@@ -699,14 +721,14 @@ class BaseView(object):
except: except:
self.ses.flash(f'File harus format {exts}', 'error') self.ses.flash(f'File harus format {exts}', 'error')
return self.returned_form(form, table, **kw) return self.returned_form(form, table, **kw)
fullpath = os.path.join(folder, file_name) fullpath = os.path.join(folder, file_name)
try: try:
self.save_upload(fullpath, **kw) self.save_upload(fullpath, **kw)
except Exception as e: except Exception as e:
self.req.session.flash(str(e), 'error') self.req.session.flash(str(e), 'error')
return self.returned_form(form, table, **kw) return self.returned_form(form, table, **kw)
elif "cancel" in self.req.POST or 'batal' in self.req.POST or "close" in self.req.POST: elif "cancel" in self.req.POST or 'batal' in self.req.POST or "close" in self.req.POST:
self.cancel_act() self.cancel_act()
...@@ -716,11 +738,11 @@ class BaseView(object): ...@@ -716,11 +738,11 @@ class BaseView(object):
# def get_file(self, filename): # def get_file(self, filename):
# return open(filename) # return open(filename)
def save_upload(self, file_name, **args): def save_upload(self, file_name, **args):
return append_csv(self.table, file_name, self.upload_keys, return append_csv(self.table, file_name, self.upload_keys,
get_file_func=self.get_file, update_exist=True, get_file_func=self.get_file, update_exist=True,
**args) **args)
def before_add(self): def before_add(self):
return {} return {}
...@@ -853,7 +875,7 @@ class BaseView(object): ...@@ -853,7 +875,7 @@ class BaseView(object):
def id_not_found(self, **kwargs): def id_not_found(self, **kwargs):
msg = f"Data yang dicari Tidak Ditemukan ID:" \ msg = f"Data yang dicari Tidak Ditemukan ID:" \
f" {self.req.matchdict['id']}." f" {self.req.matchdict['id']}."
self.req.session.flash(msg, 'error') self.req.session.flash(msg, 'error')
return self.route_list(**kwargs) return self.route_list(**kwargs)
...@@ -948,7 +970,7 @@ class BaseView(object): ...@@ -948,7 +970,7 @@ class BaseView(object):
Returns: Exception: Apabila ada akan menolak pennghapusan data atau gagal Returns: Exception: Apabila ada akan menolak pennghapusan data atau gagal
apabila proses ada yang salah apabila proses ada yang salah
None: Apabila proses berhasil None: Apabila proses berhasil
""" """
def view_delete(self, **kwargs): def view_delete(self, **kwargs):
...@@ -1068,7 +1090,6 @@ class BaseView(object): ...@@ -1068,7 +1090,6 @@ class BaseView(object):
if not os.path.exists(path): if not os.path.exists(path):
os.makedirs(path) os.makedirs(path)
upload = Upload(path) upload = Upload(path)
resp = upload.save_fp(value) resp = upload.save_fp(value)
if filename: if filename:
...@@ -1128,4 +1149,3 @@ class BaseView(object): ...@@ -1128,4 +1149,3 @@ class BaseView(object):
# def get_url_captcha(request): # def get_url_captcha(request):
# captcha = get_captcha(request) # captcha = get_captcha(request)
# return os.path.join(get_urls(request.route_url('home')), 'captcha', captcha) # return os.path.join(get_urls(request.route_url('home')), 'captcha', captcha)
<html metal:use-macro="load: ./base3.1.pt" tal:define="
scripts scripts|scripts;
readonly readonly|readonly;">
<div metal:fill-slot="content">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title"><i class="fa fa-fw fa-plus"></i>&nbsp;${request.title}</h3>
</div>
<div class="panel-body">
<div tal:content="structure form.render(readonly=readonly)"></div>
</div>
</div>
</div>
<div metal:fill-slot="scripts">
<script>
$(document).ready(function () {
// $(".read-only").attr("readonly", true);
$(".readonly").attr("readonly", true);
$(".date").attr("readonly", true);
// $(".date").datepicker({
// format: 'dd-mm-yyyy'
// });
${ structure: scripts }
});
</script>
<div metal:define-slot="scripts"></div>
</div>
</html>
\ No newline at end of file \ No newline at end of file
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!