Commit df92e247 by aa.gusti

perbaikan partner

1 parent 324d8d62
...@@ -124,6 +124,8 @@ def add_cors_headers_response_callback(event): ...@@ -124,6 +124,8 @@ def add_cors_headers_response_callback(event):
# https://groups.google.com/forum/#!topic/pylons-discuss/QIj4G82j04c # https://groups.google.com/forum/#!topic/pylons-discuss/QIj4G82j04c
def has_permission_(request, perm_names, context=None): def has_permission_(request, perm_names, context=None):
if not perm_names:
return False
if isinstance(perm_names, str): if isinstance(perm_names, str):
perm_names = [perm_names] perm_names = [perm_names]
for perm_name in perm_names: for perm_name in perm_names:
......
...@@ -10,7 +10,7 @@ from dateutil.relativedelta import relativedelta ...@@ -10,7 +10,7 @@ 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 opensipkd.tools import dmy, get_settings, get_ext, \ from opensipkd.tools import dmy, get_settings, get_ext, \
date_from_str, get_random_string date_from_str, get_random_string, Upload, InvalidExtension
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, \
btn_add, btn_csv, \ btn_add, btn_csv, \
btn_pdf, btn_unpost, btn_post btn_pdf, btn_unpost, btn_post
...@@ -302,8 +302,6 @@ class BaseView(object): ...@@ -302,8 +302,6 @@ class BaseView(object):
return False return False
def view_view(self, **kwargs): # row = query_id(request).first() def view_view(self, **kwargs): # row = query_id(request).first()
request = self.req request = self.req
row = self.query_id().first() row = self.query_id().first()
if not row: if not row:
...@@ -355,7 +353,7 @@ class BaseView(object): ...@@ -355,7 +353,7 @@ class BaseView(object):
if not exts: if not exts:
exts = self.upload_exts exts = self.upload_exts
delimiter = args.get("delimiter") delimiter = kw.get("delimiter")
bindings = self.get_bindings() bindings = self.get_bindings()
form = self.get_form(self.upload_schema, bindings=bindings) form = self.get_form(self.upload_schema, bindings=bindings)
resources = form.get_widget_resources() resources = form.get_widget_resources()
...@@ -386,7 +384,7 @@ class BaseView(object): ...@@ -386,7 +384,7 @@ class BaseView(object):
output_file.write(data) output_file.write(data)
output_file.close() output_file.close()
try: try:
self.save_upload(fullpath, **args) 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 dict(form=form.render(), return dict(form=form.render(),
...@@ -742,6 +740,50 @@ class BaseView(object): ...@@ -742,6 +740,50 @@ class BaseView(object):
""" """
return self.route_list() return self.route_list()
def convert_avi_to_mp4(self, input_name):
output = os.path.splitext(input_name)[0] + ".mp4"
command = "ffmpeg -y -i {input} -c:v mpeg4 {output}".format(
input=input_name, output=output)
log.debug(f"Convert: {command}")
os.popen(command)
# os.remove(input_name)
# "ffmpeg -i {input} -ac 2 -b:v 2000k -c:a aac -c:v libx264 -b:a 160k -vprofile high -bf 0 -strict experimental -f mp4 {output}.mp4"
return output
def form_error(self, form, error=None):
if error is None:
error = []
if not error:
return
err = colander.Invalid(form, "")
for e in error:
err[e[0]] = e[1]
raise err
def save_upload_file(self, form, value, folder, field):
file_dict = value[field]["file_name"]
if not os.path.exists(folder):
os.makedirs(folder)
upload = Upload(folder)
error = []
if file_dict:
input_file = file_dict["fp"]
if input_file:
filename = file_dict["filename"].lower()
ext = get_ext(filename)
if ext not in self.upload_exts:
error.append((field, InvalidExtension(self.upload_exts).error))
else:
full_file_name = upload.save_to_file(input_file, ext, filename)
if ext == ".avi":
full_file_name = self.convert_avi_to_mp4(full_file_name)
file_name = os.path.split(full_file_name)[1]
return file_name
self.form_error(form, error)
@colander.deferred @colander.deferred
def deferred_status(node, kw): def deferred_status(node, kw):
......
...@@ -3,7 +3,7 @@ from deform import ( ...@@ -3,7 +3,7 @@ from deform import (
widget, Button, widget, Button,
) )
from opensipkd.base import get_id_card_folder from opensipkd.base import get_id_card_folder
from opensipkd.models import DBSession, Partner from opensipkd.models import DBSession, Partner, PartnerFiles
from opensipkd.models import ( from opensipkd.models import (
ResProvinsi, ResDati2, ResKecamatan, ResDesa) ResProvinsi, ResDati2, ResKecamatan, ResDesa)
from opensipkd.models.common import ResCompany from opensipkd.models.common import ResCompany
...@@ -287,7 +287,8 @@ class ViewPartner(BaseView): ...@@ -287,7 +287,8 @@ class ViewPartner(BaseView):
} }
return d return d
def before_delete(self, row):
PartnerFiles.query().filter_by(partner_id=row.id).delete()
@colander.deferred @colander.deferred
def partner_widget(node, kw): def partner_widget(node, kw):
values = kw.get('partner_list', []) values = kw.get('partner_list', [])
......
import colander import colander
from deform import FileData, widget from deform import FileData, widget
from opensipkd.tools import mem_tmp_store
from translationstring import TranslationStringFactory
from opensipkd.base.views.dati2 import dati2_widget from opensipkd.base.views.dati2 import dati2_widget
from opensipkd.base.views.desa import desa_widget from opensipkd.base.views.desa import desa_widget
from opensipkd.base.views.kecamatan import kecamatan_widget from opensipkd.base.views.kecamatan import kecamatan_widget
from opensipkd.base.views.provinsi import provinsi_widget from opensipkd.base.views.provinsi import provinsi_widget
from opensipkd.models import Partner from opensipkd.models import Partner
from opensipkd.tools import mem_tmp_store
from translationstring import TranslationStringFactory
from .. import get_urls
from . import Validator from . import Validator
from .. import get_urls
_ = TranslationStringFactory('partner') _ = TranslationStringFactory('partner')
class PartnerEmailValidator(colander.Email, Validator): class PartnerEmailValidator(colander.Email, Validator):
def __init__(self, row): def __init__(self, row):
Validator.__init__(self, row) Validator.__init__(self, row)
...@@ -65,6 +67,7 @@ class PartnerKodeValidator(Validator): ...@@ -65,6 +67,7 @@ class PartnerKodeValidator(Validator):
def partner_kode_validator(node, kw): def partner_kode_validator(node, kw):
return PartnerKodeValidator(kw['row']) return PartnerKodeValidator(kw['row'])
class NamaSchema(colander.Schema): class NamaSchema(colander.Schema):
kode = colander.SchemaNode( kode = colander.SchemaNode(
colander.String(), colander.String(),
...@@ -76,11 +79,17 @@ class NamaSchema(colander.Schema): ...@@ -76,11 +79,17 @@ class NamaSchema(colander.Schema):
colander.String(), colander.String(),
validator=colander.Length(max=64), validator=colander.Length(max=64),
oid="nama") oid="nama")
mobile = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=16),
oid="mobile")
email = colander.SchemaNode( email = colander.SchemaNode(
colander.String(), colander.String(),
validator=partner_email_validator, validator=partner_email_validator,
oid="email") oid="email")
class PartnerSchema(NamaSchema): class PartnerSchema(NamaSchema):
nip = colander.SchemaNode( nip = colander.SchemaNode(
colander.String(), colander.String(),
......
...@@ -11,19 +11,23 @@ ...@@ -11,19 +11,23 @@
"> ">
${field.start_mapping()} ${field.start_mapping()}
<img tal:condition="ext in img" id="preview-${oid}" alt="" src="${preview_url}" <img tal:condition="ext in img" id="preview-${oid}" alt="" src="${preview_url}"
style="width:100px;height:auto;display:block;" style="${style}"
onload="window.URL.revokeObjectURL(this.src);"></img> onload="window.URL.revokeObjectURL(this.src);"></img>
<video tal:condition="ext in video" width="100%" height="100%" controls <video tal:condition="ext in video" style="${style}" controls
src="${preview_url}" type="video/${ext}"> src="${preview_url}" type="video/${ext}">
Your browser does not support the video tag. Your browser does not support the video tag.
</video> </video>
<video tal:condition="ext=='mp4'" width="100%" height="100%" controls
src="${preview_url}" type="video/mp4"> <video tal:condition="ext=='mp4'"
controls
style="${style}"
src="${preview_url}"
type="video/mp4">
Your browser does not support the video tag. Your browser does not support the video tag.
</video> </video>
<embed tal:condition="ext=='pdf'" src="${preview_url}" width="100%" height="400"> <embed tal:condition="ext=='pdf'" src="${preview_url}" style="${style}">
<a id="label-${oid}" tal:condition="preview_url" class="label label-default" href="${preview_url}" <a id="label-${oid}" tal:condition="preview_url" class="label label-default" href="${preview_url}"
target="_blank"><i class="fa fa-search"></i> View</a> target="_blank"><i class="fa fa-search"></i> View</a>
......
<p tal:define="preview_url cstruct.get('preview_url'); <p tal:define="preview_url cstruct.get('preview_url');
ext str(cstruct.get('filename').split('.')[-1:][0]).lower()|[];"> css_class css_class|field.widget.css_class;
<tal:block tal:condition="preview_url and ext in ['jpg','jpeg','png','bmp','gif']"> style style|field.widget.style;
preview_url cstruct.get('preview_url')|'';
ext str(cstruct.get('filename').split('.')[-1:][0]).lower()|[];
fname str(cstruct.get('filename'))|'';
delete cstruct.get('delete')|'';
ext str(cstruct.get('filename').split('.')[-1:][0]).lower()|[];
img ['jpg', 'jpeg', 'gif', 'png', 'svg', 'eps', 'psd'];
video ['avi', 'mov', 'mpv'];
">
<img tal:condition="ext in img" id="preview-${oid}" alt="" src="${preview_url}"
style="${style}"
onload="window.URL.revokeObjectURL(this.src);"></img>
<video tal:condition="ext in video" style="${style}" controls
src="${preview_url}" type="video/${ext}">
Your browser does not support the video tag.
</video>
<video tal:condition="ext=='mp4'"
controls
style="${style}"
src="${preview_url}"
type="video/mp4">
Your browser does not support the video tag.
</video>
<embed tal:condition="ext=='pdf'" src="${preview_url}" style="${style}">
<tal:block tal:condition="preview_url and ext in ['jpg','jpeg','png','bmp','gif']">
<img src="${structure: preview_url}" style="width:100px;height:auto;"></img> <img src="${structure: preview_url}" style="width:100px;height:auto;"></img>
<br> <br>
</tal:block> </tal:block>
<a class="label label-default" href="${structure: preview_url}" <a class="label label-default" href="${structure: preview_url}"
target="_blank"><i class="fa fa-search"></i> View</a> target="_blank"><i class="fa fa-search"></i> View</a>
</p> </p>
\ 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!