Skip to content
Toggle navigation
Projects
Groups
Snippets
Help
aa.gusti
/
opensipkd-tools
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Settings
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit 7eab0633
authored
Nov 01, 2022
by
Administrator
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
Update __init__.py
1 parent
f4684762
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
1033 additions
and
1033 deletions
opensipkd/tools/__init__.py
opensipkd/tools/__init__.py
View file @
7eab063
from
__future__
import
print_function
from
__future__
import
print_function
import
os
import
os
import
re
import
re
import
mimetypes
import
mimetypes
import
csv
import
csv
import
calendar
import
calendar
import
datetime
import
datetime
from
random
import
choice
from
random
import
choice
from
string
import
(
ascii_uppercase
,
ascii_lowercase
,
digits
,
)
from
string
import
(
ascii_uppercase
,
ascii_lowercase
,
digits
,
)
import
locale
import
locale
import
colander
import
colander
import
pytz
import
pytz
import
io
import
io
from
pyramid.httpexceptions
import
HTTPNotFound
from
pyramid.httpexceptions
import
HTTPNotFound
from
pyramid.threadlocal
import
get_current_registry
from
pyramid.threadlocal
import
get_current_registry
from
json
import
JSONEncoder
from
json
import
JSONEncoder
import
logging
import
logging
log
=
logging
.
getLogger
(
__name__
)
log
=
logging
.
getLogger
(
__name__
)
################
################
# Phone number #
# Phone number #
################
################
MSISDN_ALLOW_CHARS
=
map
(
lambda
x
:
str
(
x
),
range
(
10
))
# + ['+']
MSISDN_ALLOW_CHARS
=
map
(
lambda
x
:
str
(
x
),
range
(
10
))
# + ['+']
def
get_msisdn
(
msisdn
,
country
=
'+62'
):
def
get_msisdn
(
msisdn
,
country
=
'+62'
):
"""
"""
Digunakan untuk pengecekan no telp suatu negara
Digunakan untuk pengecekan no telp suatu negara
:param msisdn:
:param msisdn:
:param country:
:param country:
:return: output kode negara+no msisdn
:return: output kode negara+no msisdn
"""
"""
# for ch in msisdn:
# for ch in msisdn:
# if ch not in MSISDN_ALLOW_CHARS:
# if ch not in MSISDN_ALLOW_CHARS:
# raise Exception(f'{ch} not in {print(x for x in range(10))}')
# raise Exception(f'{ch} not in {print(x for x in range(10))}')
try
:
try
:
i
=
int
(
msisdn
)
i
=
int
(
msisdn
)
except
ValueError
as
e
:
except
ValueError
as
e
:
log
.
info
(
e
)
log
.
info
(
e
)
return
return
if
not
i
:
if
not
i
:
raise
Exception
(
'MSISDN must filled'
)
raise
Exception
(
'MSISDN must filled'
)
if
len
(
str
(
i
))
<
7
:
if
len
(
str
(
i
))
<
7
:
raise
Exception
(
'MSISDN less then 7 number'
)
raise
Exception
(
'MSISDN less then 7 number'
)
if
re
.
compile
(
r'^\+'
)
.
search
(
msisdn
):
if
re
.
compile
(
r'^\+'
)
.
search
(
msisdn
):
return
msisdn
return
msisdn
if
re
.
compile
(
r'^0'
)
.
search
(
msisdn
):
if
re
.
compile
(
r'^0'
)
.
search
(
msisdn
):
return
'
%
s
%
s'
%
(
country
,
msisdn
.
lstrip
(
'0'
))
return
'
%
s
%
s'
%
(
country
,
msisdn
.
lstrip
(
'0'
))
################
################
# Money format #
# Money format #
################
################
def
should_int
(
value
):
def
should_int
(
value
):
int_
=
int
(
value
)
int_
=
int
(
value
)
if
int_
==
value
:
if
int_
==
value
:
return
int_
return
int_
return
value
return
value
def
thousand
(
value
,
float_count
=
None
):
def
thousand
(
value
,
float_count
=
None
):
"""
"""
Memisahkan ribuan
Memisahkan ribuan
:param value:
:param value:
:param float_count:
:param float_count:
:return: string
:return: string
"""
"""
if
not
value
:
if
not
value
:
return
"0"
return
"0"
if
float_count
is
None
:
# autodetection
if
float_count
is
None
:
# autodetection
if
type
(
value
)
in
(
int
,
float
):
if
type
(
value
)
in
(
int
,
float
):
float_count
=
0
float_count
=
0
else
:
else
:
float_count
=
2
float_count
=
2
return
locale
.
format_string
(
'
%%
.
%
df'
%
float_count
,
value
,
True
)
return
locale
.
format_string
(
'
%%
.
%
df'
%
float_count
,
value
,
True
)
def
money
(
value
,
float_count
=
None
,
currency
=
None
):
def
money
(
value
,
float_count
=
None
,
currency
=
None
):
"""
"""
Memisahkan ribuan dan menambahkan nama mata uang
Memisahkan ribuan dan menambahkan nama mata uang
:param value:
:param value:
:param float_count:
:param float_count:
:param currency:
:param currency:
:return:
:return:
"""
"""
if
value
<
0
:
if
value
<
0
:
v
=
abs
(
value
)
v
=
abs
(
value
)
format_
=
'(
%
s)'
format_
=
'(
%
s)'
else
:
else
:
v
=
value
v
=
value
format_
=
'
%
s'
format_
=
'
%
s'
if
currency
is
None
:
if
currency
is
None
:
currency
=
locale
.
localeconv
()[
'currency_symbol'
]
currency
=
locale
.
localeconv
()[
'currency_symbol'
]
s
=
' '
.
join
([
currency
,
thousand
(
v
,
float_count
)])
s
=
' '
.
join
([
currency
,
thousand
(
v
,
float_count
)])
return
format_
%
s
return
format_
%
s
def
round_up
(
n
):
def
round_up
(
n
):
i
=
int
(
n
)
i
=
int
(
n
)
if
n
==
i
:
if
n
==
i
:
return
i
return
i
if
n
>
i
:
if
n
>
i
:
return
i
+
1
return
i
+
1
return
i
-
1
return
i
-
1
###########
###########
# Pyramid #
# Pyramid #
###########
###########
def
get_settings
():
def
get_settings
():
return
get_current_registry
()
.
settings
return
get_current_registry
()
.
settings
def
get_params
(
params
,
alternate
=
None
):
def
get_params
(
params
,
alternate
=
None
):
"""
"""
Digunakan untuk mengambil nilai dari konfigurasi sesuai params yang disebut
Digunakan untuk mengambil nilai dari konfigurasi sesuai params yang disebut
:param params: variable
:param params: variable
:param alternate: default apabila tidak ditemukan data/params
:param alternate: default apabila tidak ditemukan data/params
:return: value
:return: value
contoh penggunaan:
contoh penggunaan:
get_params('devel', False)
get_params('devel', False)
"""
"""
settings
=
get_settings
()
settings
=
get_settings
()
result
=
settings
and
params
in
settings
and
settings
[
result
=
settings
and
params
in
settings
and
settings
[
params
]
.
strip
()
or
None
params
]
.
strip
()
or
None
return
result
and
result
or
alternate
return
result
and
result
or
alternate
def
devel
():
def
devel
():
settings
=
get_settings
()
settings
=
get_settings
()
is_devel
=
'devel'
in
settings
and
settings
[
'devel'
]
and
True
or
False
is_devel
=
'devel'
in
settings
and
settings
[
'devel'
]
and
True
or
False
print
(
"DEBUG>>"
,
is_devel
)
print
(
"DEBUG>>"
,
is_devel
)
return
is_devel
return
is_devel
def
get_timezone
():
def
get_timezone
():
settings
=
get_settings
()
settings
=
get_settings
()
return
pytz
.
timezone
(
settings
[
'timezone'
])
return
pytz
.
timezone
(
settings
[
'timezone'
])
def
get_modules
():
def
get_modules
():
settings
=
get_settings
()
settings
=
get_settings
()
return
settings
[
'modules'
]
.
split
(
','
)
return
settings
[
'modules'
]
.
split
(
','
)
########
########
# Time #
# Time #
########
########
one_second
=
datetime
.
timedelta
(
1.0
/
24
/
60
/
60
)
one_second
=
datetime
.
timedelta
(
1.0
/
24
/
60
/
60
)
DateType
=
type
(
datetime
.
date
.
today
())
DateType
=
type
(
datetime
.
date
.
today
())
DateTimeType
=
type
(
datetime
.
datetime
.
now
())
DateTimeType
=
type
(
datetime
.
datetime
.
now
())
TimeZoneFile
=
'/etc/timezone'
TimeZoneFile
=
'/etc/timezone'
if
os
.
path
.
exists
(
TimeZoneFile
):
if
os
.
path
.
exists
(
TimeZoneFile
):
DefaultTimeZone
=
open
(
TimeZoneFile
)
.
read
()
.
strip
()
DefaultTimeZone
=
open
(
TimeZoneFile
)
.
read
()
.
strip
()
else
:
else
:
DefaultTimeZone
=
'Asia/Jakarta'
DefaultTimeZone
=
'Asia/Jakarta'
def
as_timezone
(
tz_date
):
def
as_timezone
(
tz_date
):
localtz
=
get_timezone
()
localtz
=
get_timezone
()
if
not
tz_date
.
tzinfo
:
if
not
tz_date
.
tzinfo
:
tz_date
=
create_datetime
(
tz_date
.
year
,
tz_date
.
month
,
tz_date
.
day
,
tz_date
=
create_datetime
(
tz_date
.
year
,
tz_date
.
month
,
tz_date
.
day
,
tz_date
.
hour
,
tz_date
.
minute
,
tz_date
.
second
,
tz_date
.
hour
,
tz_date
.
minute
,
tz_date
.
second
,
tz_date
.
microsecond
)
tz_date
.
microsecond
)
return
tz_date
.
astimezone
(
localtz
)
return
tz_date
.
astimezone
(
localtz
)
def
create_datetime
(
year
,
month
,
day
,
hour
=
0
,
minute
=
7
,
second
=
0
,
def
create_datetime
(
year
,
month
,
day
,
hour
=
0
,
minute
=
7
,
second
=
0
,
microsecond
=
0
):
microsecond
=
0
):
tz
=
get_timezone
()
tz
=
get_timezone
()
dt
=
datetime
.
datetime
(
year
,
month
,
day
,
hour
,
minute
,
second
,
microsecond
)
dt
=
datetime
.
datetime
(
year
,
month
,
day
,
hour
,
minute
,
second
,
microsecond
)
return
tz
.
localize
(
dt
)
return
tz
.
localize
(
dt
)
def
create_date
(
year
,
month
,
day
):
def
create_date
(
year
,
month
,
day
):
return
create_datetime
(
year
,
month
,
day
)
return
create_datetime
(
year
,
month
,
day
)
def
create_now
():
def
create_now
():
tz
=
get_timezone
()
tz
=
get_timezone
()
return
datetime
.
datetime
.
now
(
tz
)
return
datetime
.
datetime
.
now
(
tz
)
def
date_from_str
(
value
):
def
date_from_str
(
value
):
separator
=
None
separator
=
None
value
=
value
.
split
()[
0
]
# dd-mm-yyyy HH:MM:SS
value
=
value
.
split
()[
0
]
# dd-mm-yyyy HH:MM:SS
for
s
in
[
'-'
,
'/'
,
'.'
]:
for
s
in
[
'-'
,
'/'
,
'.'
]:
if
value
.
find
(
s
)
>
-
1
:
if
value
.
find
(
s
)
>
-
1
:
separator
=
s
separator
=
s
break
break
if
separator
:
if
separator
:
t
=
list
(
map
(
lambda
x
:
int
(
x
),
value
.
split
(
separator
)))
t
=
list
(
map
(
lambda
x
:
int
(
x
),
value
.
split
(
separator
)))
y
,
m
,
d
=
t
[
2
],
t
[
1
],
t
[
0
]
y
,
m
,
d
=
t
[
2
],
t
[
1
],
t
[
0
]
if
d
>
999
:
# yyyy-mm-dd
if
d
>
999
:
# yyyy-mm-dd
y
,
d
=
d
,
y
y
,
d
=
d
,
y
else
:
else
:
y
,
m
,
d
=
int
(
value
[:
4
]),
int
(
value
[
4
:
6
]),
int
(
value
[
6
:])
y
,
m
,
d
=
int
(
value
[:
4
]),
int
(
value
[
4
:
6
]),
int
(
value
[
6
:])
return
datetime
.
date
(
y
,
m
,
d
)
return
datetime
.
date
(
y
,
m
,
d
)
def
time_from_str
(
value
):
def
time_from_str
(
value
):
# separator = ":"
# separator = ":"
value
=
value
.
split
()[
1
]
# dd-mm-yyyy HH:MM:SS
value
=
value
.
split
()[
1
]
# dd-mm-yyyy HH:MM:SS
# return value.strptime('%H:%M:%S')
# return value.strptime('%H:%M:%S')
h
,
m
,
s
=
value
.
split
(
":"
)
h
,
m
,
s
=
value
.
split
(
":"
)
# return datetime.time(h, m, s)
# return datetime.time(h, m, s)
return
datetime
.
timedelta
(
hours
=
int
(
h
),
minutes
=
int
(
m
),
seconds
=
int
(
s
))
return
datetime
.
timedelta
(
hours
=
int
(
h
),
minutes
=
int
(
m
),
seconds
=
int
(
s
))
def
datetime_from_str
(
value
):
def
datetime_from_str
(
value
):
# separator = None
# separator = None
dt
=
date_from_str
(
value
)
dt
=
date_from_str
(
value
)
tm
=
time_from_str
(
value
)
tm
=
time_from_str
(
value
)
return
datetime
.
datetime
(
dt
.
year
,
dt
.
month
,
dt
.
day
)
+
tm
return
datetime
.
datetime
(
dt
.
year
,
dt
.
month
,
dt
.
day
)
+
tm
def
dmy
(
tgl
):
def
dmy
(
tgl
):
return
tgl
.
strftime
(
'
%
d-
%
m-
%
Y'
)
return
tgl
.
strftime
(
'
%
d-
%
m-
%
Y'
)
def
hms
(
tgl
):
def
hms
(
tgl
):
return
tgl
.
strftime
(
'
%
H:
%
M:
%
S'
)
return
tgl
.
strftime
(
'
%
H:
%
M:
%
S'
)
def
dmy_to_date
(
tgl
):
def
dmy_to_date
(
tgl
):
return
datetime
.
datetime
.
strptime
(
tgl
,
'
%
d-
%
m-
%
Y'
)
return
datetime
.
datetime
.
strptime
(
tgl
,
'
%
d-
%
m-
%
Y'
)
def
dmyhms
(
tgl
):
def
dmyhms
(
tgl
):
return
tgl
.
strftime
(
'
%
d-
%
m-
%
Y
%
H:
%
M:
%
S'
)
return
tgl
.
strftime
(
'
%
d-
%
m-
%
Y
%
H:
%
M:
%
S'
)
def
ymd
(
tgl
):
def
ymd
(
tgl
):
return
tgl
.
strftime
(
'
%
Y-
%
m-
%
d'
)
return
tgl
.
strftime
(
'
%
Y-
%
m-
%
d'
)
def
ymdhms
(
tgl
):
def
ymdhms
(
tgl
):
return
tgl
.
strftime
(
'
%
Y-
%
m-
%
d
%
H:
%
M:
%
S'
)
return
tgl
.
strftime
(
'
%
Y-
%
m-
%
d
%
H:
%
M:
%
S'
)
def
dMy
(
tgl
):
def
dMy
(
tgl
):
return
str
(
tgl
.
day
)
+
' '
+
NAMA_BULAN
[
tgl
.
month
][
1
]
+
' '
+
str
(
tgl
.
year
)
return
str
(
tgl
.
day
)
+
' '
+
NAMA_BULAN
[
tgl
.
month
][
1
]
+
' '
+
str
(
tgl
.
year
)
def
tampil_bulan
(
bulan
):
def
tampil_bulan
(
bulan
):
return
NAMA_BULAN
[
bulan
][
1
]
return
NAMA_BULAN
[
bulan
][
1
]
def
next_month
(
year
,
month
):
def
next_month
(
year
,
month
):
if
month
==
12
:
if
month
==
12
:
month
=
1
month
=
1
year
+=
1
year
+=
1
else
:
else
:
month
+=
1
month
+=
1
return
year
,
month
return
year
,
month
def
best_date
(
year
,
month
,
day
):
def
best_date
(
year
,
month
,
day
):
try
:
try
:
return
datetime
.
date
(
year
,
month
,
day
)
return
datetime
.
date
(
year
,
month
,
day
)
except
ValueError
:
except
ValueError
:
last_day
=
calendar
.
monthrange
(
year
,
month
)[
1
]
last_day
=
calendar
.
monthrange
(
year
,
month
)[
1
]
return
datetime
.
date
(
year
,
month
,
last_day
)
return
datetime
.
date
(
year
,
month
,
last_day
)
def
next_month_day
(
year
,
month
,
day
):
def
next_month_day
(
year
,
month
,
day
):
year
,
month
=
next_month
(
year
,
month
)
year
,
month
=
next_month
(
year
,
month
)
return
best_date
(
year
,
month
,
day
)
return
best_date
(
year
,
month
,
day
)
def
count_day
(
date
):
def
count_day
(
date
):
date
=
str
(
date
)
# 2018-01-02 list
date
=
str
(
date
)
# 2018-01-02 list
year
=
int
(
date
[:
4
])
year
=
int
(
date
[:
4
])
if
date
[
5
]
==
'0'
:
if
date
[
5
]
==
'0'
:
month
=
int
(
date
[
6
])
month
=
int
(
date
[
6
])
else
:
else
:
month
=
int
(
date
[
5
:
7
])
month
=
int
(
date
[
5
:
7
])
count_day
=
calendar
.
monthrange
(
year
,
month
)
count_day
=
calendar
.
monthrange
(
year
,
month
)
return
int
(
count_day
[
1
])
return
int
(
count_day
[
1
])
NAMA_BULAN
=
(
NAMA_BULAN
=
(
(
0
,
"--Bulan--"
),
(
0
,
"--Bulan--"
),
(
1
,
"Januari"
,
"Jan"
),
(
1
,
"Januari"
,
"Jan"
),
(
2
,
"Februari"
,
"Feb"
),
(
2
,
"Februari"
,
"Feb"
),
(
3
,
"Maret"
,
"Mar"
),
(
3
,
"Maret"
,
"Mar"
),
(
4
,
"April"
,
"Apr"
),
(
4
,
"April"
,
"Apr"
),
(
5
,
"Mei"
,
"Mei"
),
(
5
,
"Mei"
,
"Mei"
),
(
6
,
"Juni"
,
"Jun"
),
(
6
,
"Juni"
,
"Jun"
),
(
7
,
"Juli"
,
"Jul"
),
(
7
,
"Juli"
,
"Jul"
),
(
8
,
"Agustus"
,
"Agu"
),
(
8
,
"Agustus"
,
"Agu"
),
(
9
,
"September"
,
"Sep"
),
(
9
,
"September"
,
"Sep"
),
(
10
,
"Oktober"
,
"Okt"
),
(
10
,
"Oktober"
,
"Okt"
),
(
11
,
"Nopember"
,
"Nov"
),
(
11
,
"Nopember"
,
"Nov"
),
(
12
,
"Desember"
,
"Des"
),
(
12
,
"Desember"
,
"Des"
),
)
)
##########
##########
# String #
# String #
##########
##########
def
one_space
(
s
):
def
one_space
(
s
):
s
=
s
.
strip
()
s
=
s
.
strip
()
while
s
.
find
(
' '
)
>
-
1
:
while
s
.
find
(
' '
)
>
-
1
:
s
=
s
.
replace
(
' '
,
' '
)
s
=
s
.
replace
(
' '
,
' '
)
return
s
return
s
def
to_str
(
v
):
def
to_str
(
v
):
typ
=
type
(
v
)
typ
=
type
(
v
)
if
typ
==
DateType
:
if
typ
==
DateType
:
return
dmy
(
v
)
return
dmy
(
v
)
if
typ
==
DateTimeType
:
if
typ
==
DateTimeType
:
return
dmyhms
(
v
)
return
dmyhms
(
v
)
if
v
==
0
:
if
v
==
0
:
return
'0'
return
'0'
if
typ
==
str
:
if
typ
==
str
:
return
v
.
strip
()
return
v
.
strip
()
elif
typ
==
bool
:
elif
typ
==
bool
:
return
v
and
'1'
or
'0'
return
v
and
'1'
or
'0'
return
v
and
str
(
v
)
or
''
return
v
and
str
(
v
)
or
''
def
dict_to_str
(
d
):
def
dict_to_str
(
d
):
r
=
{}
r
=
{}
for
key
in
d
:
for
key
in
d
:
val
=
d
[
key
]
val
=
d
[
key
]
r
[
key
]
=
to_str
(
val
)
r
[
key
]
=
to_str
(
val
)
return
r
return
r
def
split
(
s
,
c
=
4
):
def
split
(
s
,
c
=
4
):
r
=
[]
r
=
[]
while
s
:
while
s
:
t
=
s
[:
c
]
t
=
s
[:
c
]
r
.
append
(
t
)
r
.
append
(
t
)
s
=
s
[
c
:]
s
=
s
[
c
:]
return
' '
.
join
(
r
)
return
' '
.
join
(
r
)
def
url_join
(
*
args
):
def
url_join
(
*
args
):
url
=
''
url
=
''
for
arg
in
args
:
for
arg
in
args
:
if
arg
:
if
arg
:
aurl
=
arg
.
strip
(
'/'
)
aurl
=
arg
.
strip
(
'/'
)
url
=
url
+
aurl
+
'/'
url
=
url
+
aurl
+
'/'
url
=
url
.
rstrip
(
'/'
)
url
=
url
.
rstrip
(
'/'
)
return
url
return
url
def
upper_dict
(
d
):
def
upper_dict
(
d
):
new_dict
=
dict
((
str
(
k
)
.
upper
(),
v
)
for
k
,
v
in
d
.
items
())
new_dict
=
dict
((
str
(
k
)
.
upper
(),
v
)
for
k
,
v
in
d
.
items
())
return
new_dict
return
new_dict
########
########
# File #
# File #
########
########
# http://stackoverflow.com/questions/2257441/random-string-generation-with-upper-case-letters-and-digits-in-python
# http://stackoverflow.com/questions/2257441/random-string-generation-with-upper-case-letters-and-digits-in-python
def
get_random_string
(
width
=
6
):
def
get_random_string
(
width
=
6
):
return
''
.
join
(
choice
(
ascii_uppercase
+
ascii_lowercase
+
digits
)
\
return
''
.
join
(
choice
(
ascii_uppercase
+
ascii_lowercase
+
digits
)
\
for
_
in
range
(
width
))
for
_
in
range
(
width
))
def
get_random_number
(
width
=
12
):
def
get_random_number
(
width
=
12
):
return
''
.
join
(
choice
(
digits
)
\
return
''
.
join
(
choice
(
digits
)
\
for
_
in
range
(
width
))
for
_
in
range
(
width
))
def
get_ext
(
filename
):
def
get_ext
(
filename
):
return
os
.
path
.
splitext
(
filename
)[
-
1
]
return
os
.
path
.
splitext
(
filename
)[
-
1
]
def
get_filename
(
filename
):
def
get_filename
(
filename
):
return
""
.
join
(
os
.
path
.
splitext
(
filename
)[:
-
1
])
return
""
.
join
(
os
.
path
.
splitext
(
filename
)[:
-
1
])
def
file_type
(
filename
):
def
file_type
(
filename
):
ctype
,
encoding
=
mimetypes
.
guess_type
(
filename
)
ctype
,
encoding
=
mimetypes
.
guess_type
(
filename
)
if
ctype
is
None
or
encoding
is
not
None
:
if
ctype
is
None
or
encoding
is
not
None
:
ctype
=
'application/octet-stream'
ctype
=
'application/octet-stream'
return
ctype
return
ctype
class
SaveFile
(
object
):
class
SaveFile
(
object
):
def
__init__
(
self
,
dir_path
):
def
__init__
(
self
,
dir_path
):
self
.
dir_path
=
dir_path
self
.
dir_path
=
dir_path
if
not
os
.
path
.
exists
(
dir_path
):
if
not
os
.
path
.
exists
(
dir_path
):
os
.
makedirs
(
dir_path
)
os
.
makedirs
(
dir_path
)
# Unchanged file extension, and make file prefix unique with sequential
# Unchanged file extension, and make file prefix unique with sequential
# number.
# number.
def
create_fullpath
(
self
,
ext
=
''
):
def
create_fullpath
(
self
,
ext
=
''
):
while
True
:
while
True
:
filename
=
get_random_string
()
+
ext
filename
=
get_random_string
()
+
ext
full_path
=
os
.
path
.
join
(
self
.
dir_path
,
filename
)
full_path
=
os
.
path
.
join
(
self
.
dir_path
,
filename
)
if
not
os
.
path
.
exists
(
full_path
):
if
not
os
.
path
.
exists
(
full_path
):
return
full_path
return
full_path
def
save
(
self
,
content
,
ext
=
''
,
filename
=
None
):
def
save
(
self
,
content
,
ext
=
''
,
filename
=
None
):
if
filename
:
if
filename
:
fullpath
=
os
.
path
.
join
(
self
.
dir_path
,
filename
)
fullpath
=
os
.
path
.
join
(
self
.
dir_path
,
filename
)
else
:
else
:
fullpath
=
self
.
create_fullpath
(
ext
=
ext
)
fullpath
=
self
.
create_fullpath
(
ext
=
ext
)
f
=
open
(
fullpath
,
'wb'
)
f
=
open
(
fullpath
,
'wb'
)
if
type
(
content
)
==
io
.
BytesIO
:
if
type
(
content
)
==
io
.
BytesIO
:
f
.
write
(
content
.
getbuffer
())
f
.
write
(
content
.
getbuffer
())
else
:
else
:
f
.
write
(
content
)
f
.
write
(
content
)
f
.
close
()
f
.
close
()
return
fullpath
return
fullpath
class
InvalidExtension
(
Exception
):
class
InvalidExtension
(
Exception
):
def
__init__
(
self
,
exts
):
def
__init__
(
self
,
exts
):
self
.
error
=
f
"Supported extensions {exts}"
self
.
error
=
f
"Supported extensions {exts}"
class
MemoryTmpStore
(
dict
):
class
MemoryTmpStore
(
dict
):
""" Instances of this class implement the
""" Instances of this class implement the
:class:`defWorm.interfaces.FileUploadTempStore` interface"""
:class:`defWorm.interfaces.FileUploadTempStore` interface"""
def
preview_url
(
self
,
uid
):
def
preview_url
(
self
,
uid
):
return
None
return
None
mem_tmp_store
=
MemoryTmpStore
()
mem_tmp_store
=
MemoryTmpStore
()
img_exts
=
[
'.png'
,
'.jpg'
,
'.pdf'
,
'.jpeg'
]
img_exts
=
[
'.png'
,
'.jpg'
,
'.pdf'
,
'.jpeg'
]
def
image_validator
(
node
,
value
):
def
image_validator
(
node
,
value
):
ext
=
get_ext
(
value
[
"filename"
])
ext
=
get_ext
(
value
[
"filename"
])
if
ext
not
in
img_exts
:
if
ext
not
in
img_exts
:
raise
colander
.
Invalid
(
node
,
raise
colander
.
Invalid
(
node
,
f
'Extension harus salahsatu dari {img_exts}'
)
f
'Extension harus salahsatu dari {img_exts}'
)
def
file_response
(
request
,
f
,
filename
,
type
):
def
file_response
(
request
,
f
,
filename
,
type
):
response
=
request
.
response
response
=
request
.
response
response
.
content_type
=
str
(
type
)
response
.
content_type
=
str
(
type
)
response
.
content_disposition
=
'filename='
+
filename
response
.
content_disposition
=
'filename='
+
filename
response
.
write
(
f
.
read
())
response
.
write
(
f
.
read
())
return
response
return
response
class
Upload
(
SaveFile
):
class
Upload
(
SaveFile
):
def
save_to_file
(
self
,
input_file
,
ext
,
filename
=
None
):
def
save_to_file
(
self
,
input_file
,
ext
,
filename
=
None
):
if
filename
:
if
filename
:
fullpath
=
os
.
path
.
join
(
self
.
dir_path
,
filename
,
ext
)
fullpath
=
os
.
path
.
join
(
self
.
dir_path
,
filename
,
ext
)
else
:
else
:
fullpath
=
self
.
create_fullpath
(
ext
)
fullpath
=
self
.
create_fullpath
(
ext
)
output_file
=
open
(
fullpath
,
'wb'
)
output_file
=
open
(
fullpath
,
'wb'
)
input_file
.
seek
(
0
)
input_file
.
seek
(
0
)
while
True
:
while
True
:
data
=
input_file
.
read
(
2
<<
16
)
data
=
input_file
.
read
(
2
<<
16
)
if
not
data
:
if
not
data
:
break
break
output_file
.
write
(
data
)
output_file
.
write
(
data
)
output_file
.
close
()
output_file
.
close
()
return
fullpath
return
fullpath
def
save
(
self
,
request
,
name
,
exts
=
None
,
filename
=
None
):
def
save
(
self
,
request
,
name
,
exts
=
None
,
filename
=
None
):
input_file
=
request
.
POST
[
name
]
.
file
input_file
=
request
.
POST
[
name
]
.
file
ext
=
get_ext
(
request
.
POST
[
name
]
.
filename
)
ext
=
get_ext
(
request
.
POST
[
name
]
.
filename
)
if
exts
and
ext
not
in
exts
:
if
exts
and
ext
not
in
exts
:
raise
InvalidExtension
(
exts
)
raise
InvalidExtension
(
exts
)
filename
=
self
.
save_to_file
(
input_file
,
ext
,
filename
=
filename
)
filename
=
self
.
save_to_file
(
input_file
,
ext
,
filename
=
filename
)
head
,
filename
=
os
.
path
.
split
(
filename
)
head
,
filename
=
os
.
path
.
split
(
filename
)
return
filename
return
filename
def
save_fp
(
self
,
upload
):
def
save_fp
(
self
,
upload
):
if
'fp'
not
in
upload
or
upload
[
'fp'
]
==
b
''
:
if
'fp'
not
in
upload
or
upload
[
'fp'
]
==
b
''
:
if
"filename"
in
upload
:
if
"filename"
in
upload
:
return
upload
[
'filename'
]
return
upload
[
'filename'
]
return
return
filename
=
upload
[
'filename'
]
filename
=
upload
[
'filename'
]
input_file
=
upload
[
'fp'
]
input_file
=
upload
[
'fp'
]
ext
=
get_ext
(
filename
)
ext
=
get_ext
(
filename
)
return
self
.
save_to_file
(
input_file
,
ext
)
return
self
.
save_to_file
(
input_file
,
ext
)
def
saves
(
self
,
uploads
):
def
saves
(
self
,
uploads
):
d
=
{}
d
=
{}
for
upload
in
uploads
:
for
upload
in
uploads
:
if
'fp'
not
in
upload
or
upload
[
'fp'
]
==
b
''
:
if
'fp'
not
in
upload
or
upload
[
'fp'
]
==
b
''
:
continue
continue
filename
=
upload
[
'filename'
]
filename
=
upload
[
'filename'
]
# input_file = upload['fp']
# input_file = upload['fp']
# ext = get_ext(filename)
# ext = get_ext(filename)
# d[filename] = self.save_to_file(input_file, ext)
# d[filename] = self.save_to_file(input_file, ext)
d
[
filename
]
=
self
.
save_fp
(
upload
)
d
[
filename
]
=
self
.
save_fp
(
upload
)
return
d
return
d
def
download
(
self
,
request
,
filename
):
def
download
(
self
,
request
,
filename
):
out_filename
=
os
.
path
.
join
(
self
.
dir_path
,
filename
)
out_filename
=
os
.
path
.
join
(
self
.
dir_path
,
filename
)
if
not
os
.
path
.
exists
(
out_filename
):
if
not
os
.
path
.
exists
(
out_filename
):
raise
HTTPNotFound
raise
HTTPNotFound
ext
=
get_ext
(
filename
)[
1
:]
ext
=
get_ext
(
filename
)[
1
:]
if
ext
in
[
'gif'
,
'png'
,
'jpeg'
,
'jpg'
]:
if
ext
in
[
'gif'
,
'png'
,
'jpeg'
,
'jpg'
]:
ext
=
'image/'
+
ext
ext
=
'image/'
+
ext
with
open
(
out_filename
,
'rb'
)
as
f
:
with
open
(
out_filename
,
'rb'
)
as
f
:
return
file_response
(
request
,
f
,
filename
,
ext
)
return
file_response
(
request
,
f
,
filename
,
ext
)
class
UploadBin
(
Upload
):
class
UploadBin
(
Upload
):
"""
"""
Compatibility to previous
Compatibility to previous
"""
"""
pass
pass
class
CSVRenderer
(
object
):
class
CSVRenderer
(
object
):
def
__init__
(
self
,
info
):
def
__init__
(
self
,
info
):
pass
pass
def
__call__
(
self
,
value
,
system
):
def
__call__
(
self
,
value
,
system
):
""" Returns a plain CSV-encoded string with content-type
""" Returns a plain CSV-encoded string with content-type
``text/csv``. The content-type may be overridden by
``text/csv``. The content-type may be overridden by
setting ``request.response.content_type``."""
setting ``request.response.content_type``."""
request
=
system
.
get
(
'request'
)
request
=
system
.
get
(
'request'
)
if
request
is
not
None
:
if
request
is
not
None
:
response
=
request
.
response
response
=
request
.
response
ct
=
response
.
content_type
ct
=
response
.
content_type
if
ct
==
response
.
default_content_type
:
if
ct
==
response
.
default_content_type
:
response
.
content_type
=
'text/csv'
response
.
content_type
=
'text/csv'
# error ketika open csv menggunakan bytes
# error ketika open csv menggunakan bytes
# karena tak mau hapus, maka dibikin try
# karena tak mau hapus, maka dibikin try
try
:
try
:
fout
=
io
.
BytesIO
()
#
fout
=
io
.
BytesIO
()
#
fcsv
=
csv
.
writer
(
fout
,
delimiter
=
','
,
quotechar
=
'"'
,
fcsv
=
csv
.
writer
(
fout
,
delimiter
=
','
,
quotechar
=
'"'
,
quoting
=
csv
.
QUOTE_MINIMAL
)
quoting
=
csv
.
QUOTE_MINIMAL
)
fcsv
.
writerow
(
value
.
get
(
'header'
,
[]))
fcsv
.
writerow
(
value
.
get
(
'header'
,
[]))
fcsv
.
writerows
(
value
.
get
(
'rows'
,
[]))
fcsv
.
writerows
(
value
.
get
(
'rows'
,
[]))
except
:
except
:
fout
=
io
.
StringIO
()
fout
=
io
.
StringIO
()
fcsv
=
csv
.
writer
(
fout
,
delimiter
=
','
,
quotechar
=
'"'
,
fcsv
=
csv
.
writer
(
fout
,
delimiter
=
','
,
quotechar
=
'"'
,
quoting
=
csv
.
QUOTE_MINIMAL
)
quoting
=
csv
.
QUOTE_MINIMAL
)
fcsv
.
writerow
(
value
.
get
(
'header'
,
[]))
fcsv
.
writerow
(
value
.
get
(
'header'
,
[]))
fcsv
.
writerows
(
value
.
get
(
'rows'
,
[]))
fcsv
.
writerows
(
value
.
get
(
'rows'
,
[]))
return
fout
.
getvalue
()
return
fout
.
getvalue
()
# # Data Table Function
# # Data Table Function
# def _DTstrftime(chain):
# def _DTstrftime(chain):
# ret = chain and datetime.strftime(chain, '%d-%m-%Y')
# ret = chain and datetime.strftime(chain, '%d-%m-%Y')
# if ret:
# if ret:
# return ret
# return ret
# else:
# else:
# return chain
# return chain
#
#
#
#
# def _DTnumber_format(chain):
# def _DTnumber_format(chain):
# import locale
# import locale
# locale.setlocale(locale.LC_ALL, 'id_ID.utf8')
# locale.setlocale(locale.LC_ALL, 'id_ID.utf8')
# ret = locale.format("%d", chain, grouping=True)
# ret = locale.format("%d", chain, grouping=True)
# if ret:
# if ret:
# return ret
# return ret
# else:
# else:
# return chain
# return chain
#
#
#
#
# def _DTupper(chain):
# def _DTupper(chain):
# ret = chain.upper()
# ret = chain.upper()
# if ret:
# if ret:
# return ret
# return ret
# else:
# else:
# return chain
# return chain
#
#
#
#
# def _DTstatus(chain):
# def _DTstatus(chain):
# if chain:
# if chain:
# ret = 'Aktif'
# ret = 'Aktif'
# else:
# else:
# ret = 'Mati'
# ret = 'Mati'
# if ret:
# if ret:
# return ret
# return ret
# else:
# else:
# return chain
# return chain
##########
##########
# String #
# String #
##########
##########
def
clean
(
s
):
def
clean
(
s
):
r
=
''
r
=
''
for
ch
in
s
:
for
ch
in
s
:
asc
=
ord
(
ch
)
asc
=
ord
(
ch
)
if
asc
>
126
or
asc
<
32
:
if
asc
>
126
or
asc
<
32
:
ch
=
' '
ch
=
' '
r
+=
ch
r
+=
ch
return
r
return
r
# def to_str(s):
# def to_str(s):
# s = s or ''
# s = s or ''
# s = str(s)
# s = str(s)
# return clean(s)
# return clean(s)
def
left
(
s
,
width
):
def
left
(
s
,
width
):
s
=
to_str
(
s
)
s
=
to_str
(
s
)
return
s
.
ljust
(
width
)[:
width
]
return
s
.
ljust
(
width
)[:
width
]
def
right
(
s
,
width
):
def
right
(
s
,
width
):
s
=
to_str
(
s
)
s
=
to_str
(
s
)
return
s
.
zfill
(
width
)[:
width
]
return
s
.
zfill
(
width
)[:
width
]
##################
##################
# Data Structure #
# Data Structure #
##################
##################
class
FixLength
(
object
):
class
FixLength
(
object
):
def
__init__
(
self
,
struct
):
def
__init__
(
self
,
struct
):
self
.
struct
=
self
.
fields
=
None
self
.
struct
=
self
.
fields
=
None
self
.
set_struct
(
struct
)
self
.
set_struct
(
struct
)
def
set_struct
(
self
,
struct
):
def
set_struct
(
self
,
struct
):
self
.
struct
=
struct
self
.
struct
=
struct
self
.
fields
=
{}
self
.
fields
=
{}
for
s
in
struct
:
for
s
in
struct
:
name
=
s
[
0
]
name
=
s
[
0
]
size
=
s
[
1
:]
and
s
[
1
]
or
1
size
=
s
[
1
:]
and
s
[
1
]
or
1
typ
=
s
[
2
:]
and
s
[
2
]
or
'A'
# N: numeric, A: alphanumeric
typ
=
s
[
2
:]
and
s
[
2
]
or
'A'
# N: numeric, A: alphanumeric
self
.
fields
[
name
]
=
{
'value'
:
None
,
'type'
:
typ
,
'size'
:
size
}
self
.
fields
[
name
]
=
{
'value'
:
None
,
'type'
:
typ
,
'size'
:
size
}
def
set
(
self
,
name
,
value
):
def
set
(
self
,
name
,
value
):
self
.
fields
[
name
][
'value'
]
=
value
self
.
fields
[
name
][
'value'
]
=
value
def
get
(
self
,
name
):
def
get
(
self
,
name
):
v
=
self
.
fields
[
name
][
'value'
]
v
=
self
.
fields
[
name
][
'value'
]
if
v
:
if
v
:
return
v
.
strip
()
return
v
.
strip
()
return
''
return
''
def
__setitem__
(
self
,
name
,
value
):
def
__setitem__
(
self
,
name
,
value
):
self
.
set
(
name
,
value
)
self
.
set
(
name
,
value
)
def
__getitem__
(
self
,
name
):
def
__getitem__
(
self
,
name
):
return
self
.
get
(
name
)
return
self
.
get
(
name
)
def
get_raw
(
self
):
def
get_raw
(
self
):
return
self
.
get_spliter
(
""
)
return
self
.
get_spliter
(
""
)
def
get_raw_dotted
(
self
):
def
get_raw_dotted
(
self
):
return
self
.
get_dotted
()
return
self
.
get_dotted
()
def
get_value
(
self
,
name
,
typ
):
def
get_value
(
self
,
name
,
typ
):
v
=
self
.
fields
[
name
][
'value'
]
v
=
self
.
fields
[
name
][
'value'
]
if
v
and
typ
==
'N'
:
if
v
and
typ
==
'N'
:
i
=
int
(
v
)
i
=
int
(
v
)
if
v
==
i
:
if
v
==
i
:
v
=
i
v
=
i
return
v
return
v
def
get_spliter
(
self
,
ch
):
def
get_spliter
(
self
,
ch
):
"""
"""
2022-09-12 Perbaikan return jika ch is none
2022-09-12 Perbaikan return jika ch is none
"""
"""
s
=
''
s
=
''
for
name
,
size
,
typ
in
self
.
struct
:
for
name
,
size
,
typ
in
self
.
struct
:
v
=
self
.
get_value
(
name
,
typ
)
v
=
self
.
get_value
(
name
,
typ
)
pad_func
=
typ
==
'N'
and
right
or
left
pad_func
=
typ
==
'N'
and
right
or
left
s
+=
pad_func
(
v
,
size
)
s
+=
pad_func
(
v
,
size
)
s
+=
ch
s
+=
ch
if
ch
:
if
ch
:
return
s
[:
-
1
]
return
s
[:
-
1
]
return
s
return
s
def
get_dotted
(
self
):
def
get_dotted
(
self
):
return
self
.
get_spliter
(
'.'
)
return
self
.
get_spliter
(
'.'
)
def
set_raw
(
self
,
raw
):
def
set_raw
(
self
,
raw
):
awal
=
0
awal
=
0
for
t
in
self
.
struct
:
for
t
in
self
.
struct
:
name
=
t
[
0
]
name
=
t
[
0
]
size
=
t
[
1
:]
and
t
[
1
]
or
1
size
=
t
[
1
:]
and
t
[
1
]
or
1
akhir
=
awal
+
size
akhir
=
awal
+
size
value
=
raw
[
awal
:
akhir
]
value
=
raw
[
awal
:
akhir
]
if
not
value
:
if
not
value
:
return
return
self
.
set
(
name
,
value
)
self
.
set
(
name
,
value
)
awal
+=
size
awal
+=
size
return
True
return
True
def
from_dict
(
self
,
d
):
def
from_dict
(
self
,
d
):
for
name
in
self
.
fields
:
for
name
in
self
.
fields
:
if
name
in
d
and
d
[
name
]:
if
name
in
d
and
d
[
name
]:
value
=
d
[
name
]
value
=
d
[
name
]
self
.
set
(
name
,
value
)
self
.
set
(
name
,
value
)
def
to_dict
(
self
):
def
to_dict
(
self
):
r
=
{}
r
=
{}
for
name
in
self
.
fields
:
for
name
in
self
.
fields
:
r
[
name
]
=
self
.
get
(
name
)
r
[
name
]
=
self
.
get
(
name
)
return
r
return
r
def
length
(
self
):
def
length
(
self
):
return
len
(
self
.
get_raw
())
return
len
(
self
.
get_raw
())
import
decimal
import
decimal
class
Encoder
(
JSONEncoder
):
class
Encoder
(
JSONEncoder
):
"""Extends JSONEncoder for date and decimal types."""
"""Extends JSONEncoder for date and decimal types."""
def
push_date
(
self
,
d
):
def
push_date
(
self
,
d
):
"""Serialize the given datetime.date object to a JSON string."""
"""Serialize the given datetime.date object to a JSON string."""
# Default is ISO 8601 compatible (standard notation).
# Default is ISO 8601 compatible (standard notation).
return
"
%04
d-
%02
d-
%02
d"
%
(
d
.
year
,
d
.
month
,
d
.
day
)
return
"
%04
d-
%02
d-
%02
d"
%
(
d
.
year
,
d
.
month
,
d
.
day
)
def
push_timedelta
(
self
,
t
):
def
push_timedelta
(
self
,
t
):
"""Serialize the given datetime.timedelta object to a JSON string."""
"""Serialize the given datetime.timedelta object to a JSON string."""
days
=
t
.
days
days
=
t
.
days
if
days
<
0
:
if
days
<
0
:
minus
=
"-"
minus
=
"-"
days
=
-
days
-
1
days
=
-
days
-
1
seconds
=
24
*
60
*
60
-
t
.
seconds
seconds
=
24
*
60
*
60
-
t
.
seconds
else
:
else
:
minus
=
""
minus
=
""
seconds
=
t
.
seconds
seconds
=
t
.
seconds
secs
=
seconds
%
60
secs
=
seconds
%
60
seconds
/=
60
seconds
/=
60
mins
=
seconds
%
60
mins
=
seconds
%
60
hours
=
seconds
/
60
hours
=
seconds
/
60
return
"
%
s
%
d:
%02
d:
%02
d:
%02
d"
%
(
minus
,
days
,
hours
,
mins
,
secs
)
return
"
%
s
%
d:
%02
d:
%02
d:
%02
d"
%
(
minus
,
days
,
hours
,
mins
,
secs
)
def
push_time
(
self
,
t
):
def
push_time
(
self
,
t
):
"""Serialize the given datetime.time object to a JSON string."""
"""Serialize the given datetime.time object to a JSON string."""
# Default is ISO 8601 compatible (standard notation).
# Default is ISO 8601 compatible (standard notation).
return
"
%02
d:
%02
d:
%02
d"
%
(
t
.
hour
,
t
.
minute
,
t
.
second
)
return
"
%02
d:
%02
d:
%02
d"
%
(
t
.
hour
,
t
.
minute
,
t
.
second
)
def
push_datetime
(
self
,
dt
):
def
push_datetime
(
self
,
dt
):
"""Serialize the given datetime.datetime object to a JSON string."""
"""Serialize the given datetime.datetime object to a JSON string."""
# Default is ISO 8601 compatible (standard notation).
# Default is ISO 8601 compatible (standard notation).
# Don't use strftime because that can't handle dates before 1900.
# Don't use strftime because that can't handle dates before 1900.
return
(
"
%04
d-
%02
d-
%02
dT
%02
d:
%02
d:
%02
d"
%
return
(
"
%04
d-
%02
d-
%02
dT
%02
d:
%02
d:
%02
d"
%
(
dt
.
year
,
dt
.
month
,
dt
.
day
,
dt
.
hour
,
dt
.
minute
,
dt
.
second
))
(
dt
.
year
,
dt
.
month
,
dt
.
day
,
dt
.
hour
,
dt
.
minute
,
dt
.
second
))
def
default
(
self
,
o
):
def
default
(
self
,
o
):
# We MUST check for a datetime.datetime instance before datetime.date.
# We MUST check for a datetime.datetime instance before datetime.date.
# datetime.datetime is a subclass of datetime.date, and therefore
# datetime.datetime is a subclass of datetime.date, and therefore
# instances of it are also instances of datetime.date.
# instances of it are also instances of datetime.date.
if
isinstance
(
o
,
datetime
.
datetime
):
if
isinstance
(
o
,
datetime
.
datetime
):
return
self
.
push_datetime
(
o
)
return
self
.
push_datetime
(
o
)
elif
isinstance
(
o
,
datetime
.
date
):
elif
isinstance
(
o
,
datetime
.
date
):
return
self
.
push_date
(
o
)
return
self
.
push_date
(
o
)
elif
isinstance
(
o
,
datetime
.
timedelta
):
elif
isinstance
(
o
,
datetime
.
timedelta
):
return
self
.
push_timedelta
(
o
)
return
self
.
push_timedelta
(
o
)
elif
isinstance
(
o
,
datetime
.
time
):
elif
isinstance
(
o
,
datetime
.
time
):
return
self
.
push_time
(
o
)
return
self
.
push_time
(
o
)
elif
isinstance
(
o
,
decimal
.
Decimal
):
elif
isinstance
(
o
,
decimal
.
Decimal
):
return
str
(
o
)
return
str
(
o
)
else
:
else
:
return
JSONEncoder
.
default
(
self
,
o
)
return
JSONEncoder
.
default
(
self
,
o
)
STATUS
=
(
STATUS
=
(
(
1
,
'Aktif'
),
(
1
,
'Aktif'
),
(
0
,
'Pasif'
)
(
0
,
'Pasif'
)
)
)
INVOICE_STATUS
=
(
INVOICE_STATUS
=
(
(
0
,
'Draft'
),
(
0
,
'Draft'
),
(
1
,
'Approved'
),
(
1
,
'Approved'
),
)
)
def
pbb_biller_split
():
def
pbb_biller_split
():
settings
=
get_settings
()
settings
=
get_settings
()
if
not
'pbb_biller'
in
settings
:
if
not
'pbb_biller'
in
settings
:
return
None
,
None
return
None
,
None
biller
=
re
.
sub
(
'
\
D'
,
''
,
settings
[
'pbb_biller'
])
biller
=
re
.
sub
(
'
\
D'
,
''
,
settings
[
'pbb_biller'
])
return
biller
[:
2
],
biller
[
2
:]
return
biller
[:
2
],
biller
[
2
:]
def
clear_null_value
(
values
):
def
clear_null_value
(
values
):
# digunakan untuk menghapus dictionary yang value nya null
# digunakan untuk menghapus dictionary yang value nya null
tobe_del
=
[]
tobe_del
=
[]
for
value
in
values
:
for
value
in
values
:
if
not
values
[
value
]:
if
not
values
[
value
]:
tobe_del
.
append
(
value
)
tobe_del
.
append
(
value
)
for
value
in
tobe_del
:
for
value
in
tobe_del
:
del
values
[
value
]
del
values
[
value
]
return
values
return
values
def
replace_char
(
text
,
start
,
stop
,
char
=
"X"
):
def
replace_char
(
text
,
start
,
stop
,
char
=
"X"
):
x
=
char
*
(
stop
-
start
+
1
)
x
=
char
*
(
stop
-
start
+
1
)
s
=
text
[:
start
]
+
x
+
text
[
stop
:]
s
=
text
[:
start
]
+
x
+
text
[
stop
:]
# print "*** DEBUG ", text, s
# print "*** DEBUG ", text, s
return
s
return
s
##################
##################
# Email #
# Email #
##################
##################
# import smtplib
# import smtplib
# from email.MIMEMultipart import MIMEMultipart
# from email.MIMEMultipart import MIMEMultipart
# from email.MIMEText import MIMEText
# from email.MIMEText import MIMEText
# from email.MIMEBase import MIMEBase
# from email.MIMEBase import MIMEBase
# import base64
# import base64
SCOPES
=
[
SCOPES
=
[
'https://www.googleapis.com/auth/gmail.readonly'
,
'https://www.googleapis.com/auth/gmail.readonly'
,
'https://www.googleapis.com/auth/userinfo.email'
,
'https://www.googleapis.com/auth/userinfo.email'
,
'https://www.googleapis.com/auth/userinfo.profile'
,
'https://www.googleapis.com/auth/userinfo.profile'
,
# Add other requested scopes.
# Add other requested scopes.
]
]
# def send_email(to_addr_list, subject, message, cc_addr_list=None,from_addr=None,
# def send_email(to_addr_list, subject, message, cc_addr_list=None,from_addr=None,
# login=None, password=None, file=None,
# login=None, password=None, file=None,
# smtp_server='smtp.gmail.com:587'):
# smtp_server='smtp.gmail.com:587'):
# settings = get_settings()
# settings = get_settings()
# if settings['devel']=='true':
# if settings['devel']=='true':
# return
# return
#
#
# if not login:
# if not login:
#
#
# login = 'center.email' in settings and settings['center.email'] or None
# login = 'center.email' in settings and settings['center.email'] or None
# # if login[-9:]=="gmail.com":
# # if login[-9:]=="gmail.com":
# # return send_gmsg(to=to_addr_list, subject=subject, message_text=message, file=file,)
# # return send_gmsg(to=to_addr_list, subject=subject, message_text=message, file=file,)
#
#
# if not password:
# if not password:
# password = 'center.email_password' in settings and settings['center.email_password'] or None
# password = 'center.email_password' in settings and settings['center.email_password'] or None
# if not login or not password:
# if not login or not password:
# return 'Error smtp login or Password'
# return 'Error smtp login or Password'
#
#
# if 'center.smtp_server' in settings and settings['center.smtp_server']:
# if 'center.smtp_server' in settings and settings['center.smtp_server']:
# smtp_server = settings['center.smtp_server']
# smtp_server = settings['center.smtp_server']
#
#
# if not from_addr:
# if not from_addr:
# from_addr = login
# from_addr = login
#
#
# header = 'From: %s\r\n' % from_addr
# header = 'From: %s\r\n' % from_addr
# header += 'To: %s \r\n' % ','.join(to_addr_list)
# header += 'To: %s \r\n' % ','.join(to_addr_list)
# if cc_addr_list:
# if cc_addr_list:
# header += 'Cc: %s \r\n' % ','.join(cc_addr_list)
# header += 'Cc: %s \r\n' % ','.join(cc_addr_list)
# header += 'Subject: %s \r\n' % subject
# header += 'Subject: %s \r\n' % subject
# message = header + message
# message = header + message
# smtp, port = smtp_server.split(':')
# smtp, port = smtp_server.split(':')
# port = int(port)
# port = int(port)
#
#
# #print '>>>>>>>>>>>>', smtp, port, login,password
# #print '>>>>>>>>>>>>', smtp, port, login,password
# try:
# try:
# #print smtp_server, smtp, port
# #print smtp_server, smtp, port
# server = smtplib.SMTP(smtp,port) #smtp_server)
# server = smtplib.SMTP(smtp,port) #smtp_server)
# server.ehlo()
# server.ehlo()
# if port==587:
# if port==587:
# server.starttls()
# server.starttls()
#
#
# server.login(login,password)
# server.login(login,password)
# problems = server.sendmail(from_addr, to_addr_list, message)
# problems = server.sendmail(from_addr, to_addr_list, message)
# server.quit()
# server.quit()
# return
# return
# except Exception as e:
# except Exception as e:
# return str(e)
# return str(e)
#
#
# def create_message(sender, to, subject, message_text, file=None):
# def create_message(sender, to, subject, message_text, file=None):
# """Create a message for an email.
# """Create a message for an email.
#
#
# Args:
# Args:
# sender: Email address of the sender.
# sender: Email address of the sender.
# to: Email address of the receiver.
# to: Email address of the receiver.
# subject: The subject of the email message.
# subject: The subject of the email message.
# message_text: The text of the email message.
# message_text: The text of the email message.
# file: The path to the file to be attached.
# file: The path to the file to be attached.
#
#
# Returns:
# Returns:
# An object containing a base64url encoded email object.
# An object containing a base64url encoded email object.
# """
# """
# if file:
# if file:
# message = MIMEMultipart()
# message = MIMEMultipart()
# msg = MIMEText(message_text)
# msg = MIMEText(message_text)
# else:
# else:
# message = MIMEText(message_text)
# message = MIMEText(message_text)
#
#
# message['to'] = to
# message['to'] = to
# message['from'] = sender
# message['from'] = sender
# message['subject'] = subject
# message['subject'] = subject
#
#
# if file:
# if file:
# message.attach(msg)
# message.attach(msg)
# content_type, encoding = mimetypes.guess_type(file)
# content_type, encoding = mimetypes.guess_type(file)
#
#
# if content_type is None or encoding is not None:
# if content_type is None or encoding is not None:
# content_type = 'application/octet-stream'
# content_type = 'application/octet-stream'
# main_type, sub_type = content_type.split('/', 1)
# main_type, sub_type = content_type.split('/', 1)
# if main_type == 'text':
# if main_type == 'text':
# fp = open(file, 'rb')
# fp = open(file, 'rb')
# msg = MIMEText(fp.read(), _subtype=sub_type)
# msg = MIMEText(fp.read(), _subtype=sub_type)
# fp.close()
# fp.close()
# elif main_type == 'image':
# elif main_type == 'image':
# fp = open(file, 'rb')
# fp = open(file, 'rb')
# msg = MIMEImage(fp.read(), _subtype=sub_type)
# msg = MIMEImage(fp.read(), _subtype=sub_type)
# fp.close()
# fp.close()
# elif main_type == 'audio':
# elif main_type == 'audio':
# fp = open(file, 'rb')
# fp = open(file, 'rb')
# msg = MIMEAudio(fp.read(), _subtype=sub_type)
# msg = MIMEAudio(fp.read(), _subtype=sub_type)
# fp.close()
# fp.close()
# else:
# else:
# fp = open(file, 'rb')
# fp = open(file, 'rb')
# msg = MIMEBase(main_type, sub_type)
# msg = MIMEBase(main_type, sub_type)
# msg.set_payload(fp.read())
# msg.set_payload(fp.read())
# fp.close()
# fp.close()
# filename = os.path.basename(file)
# filename = os.path.basename(file)
# msg.add_header('Content-Disposition', 'attachment', filename=filename)
# msg.add_header('Content-Disposition', 'attachment', filename=filename)
# message.attach(msg)
# message.attach(msg)
#
#
# return {'raw': base64.urlsafe_b64encode(message.as_string())}
# return {'raw': base64.urlsafe_b64encode(message.as_string())}
#
#
#
#
#
#
# def get_service():
# def get_service():
# from googleapiclient.discovery import build
# from googleapiclient.discovery import build
# from httplib2 import Http
# from httplib2 import Http
# from oauth2client import file, client, tools
# from oauth2client import file, client, tools
# """Shows basic usage of the Gmail API.
# """Shows basic usage of the Gmail API.
# Lists the user's Gmail labels.
# Lists the user's Gmail labels.
# """
# """
# # The file token.json stores the user's access and refresh tokens, and is
# # The file token.json stores the user's access and refresh tokens, and is
# # created automatically when the authorization flow completes for the first
# # created automatically when the authorization flow completes for the first
# # time.
# # time.
# store = file.Storage('token.json')
# store = file.Storage('token.json')
# creds = store.get()
# creds = store.get()
# if not creds or creds.invalid:
# if not creds or creds.invalid:
# flow = client.flow_from_clientsecrets('./credentials.json', SCOPES)
# flow = client.flow_from_clientsecrets('./credentials.json', SCOPES)
# creds = tools.run_flow(flow, store)
# creds = tools.run_flow(flow, store)
# return build('gmail', 'v1', http=creds.authorize(Http()))
# return build('gmail', 'v1', http=creds.authorize(Http()))
#
#
# def send_gmsg(to, subject, message_text, file=None):
# def send_gmsg(to, subject, message_text, file=None):
# settings = get_settings()
# settings = get_settings()
# sender = 'center.email' in settings and settings['center.email'] or None
# sender = 'center.email' in settings and settings['center.email'] or None
#
#
# message = create_message(sender, to, subject, message_text, file=None)
# message = create_message(sender, to, subject, message_text, file=None)
# service = get_service()
# service = get_service()
# try:
# try:
# message = (service.users().messages().send(userId=user_id, body=message)
# message = (service.users().messages().send(userId=user_id, body=message)
# .execute())
# .execute())
# return message
# return message
# except errors.HttpError as error:
# except errors.HttpError as error:
# pass
# pass
#
#
# http://python.web.id/angka-terbilang-pada-python/#.VQpS8s2sXQo
# http://python.web.id/angka-terbilang-pada-python/#.VQpS8s2sXQo
satuan
=
[
''
,
'satu'
,
'dua'
,
'tiga'
,
'empat'
,
'lima'
,
'enam'
,
'tujuh'
,
satuan
=
[
''
,
'satu'
,
'dua'
,
'tiga'
,
'empat'
,
'lima'
,
'enam'
,
'tujuh'
,
'delapan'
,
'sembilan'
,
'sepuluh'
,
'sebelas'
]
'delapan'
,
'sembilan'
,
'sepuluh'
,
'sebelas'
]
def
terbilang_
(
n
):
def
terbilang_
(
n
):
n
=
int
(
n
)
n
=
int
(
n
)
if
n
>=
1000000000
:
if
n
>=
1000000000
:
hasil
=
terbilang_
(
n
/
1000000000
)
+
[
'milyar'
]
+
terbilang_
(
hasil
=
terbilang_
(
n
/
1000000000
)
+
[
'milyar'
]
+
terbilang_
(
n
%
100000000
)
n
%
100000000
)
elif
n
>
1000000
:
elif
n
>
1000000
:
#commit by taufik
hasil
=
terbilang_
(
n
/
1000000
)
+
[
'juta'
]
+
terbilang_
(
n
%
1000000
)
hasil
=
terbilang_
(
n
/
1000000
)
+
[
'juta'
]
+
terbilang_
(
n
%
1000000
)
elif
n
>=
2000
:
elif
n
>=
2000
:
hasil
=
terbilang_
(
n
/
1000
)
+
[
'ribu'
]
+
terbilang_
(
n
%
1000
)
hasil
=
terbilang_
(
n
/
1000
)
+
[
'ribu'
]
+
terbilang_
(
n
%
1000
)
elif
n
>=
1000
:
elif
n
>=
1000
:
hasil
=
[
'seribu'
]
+
terbilang_
(
n
-
1000
)
hasil
=
[
'seribu'
]
+
terbilang_
(
n
-
1000
)
elif
n
>=
200
:
elif
n
>=
200
:
hasil
=
terbilang_
(
n
/
100
)
+
[
'ratus'
]
+
terbilang_
(
n
%
100
)
hasil
=
terbilang_
(
n
/
100
)
+
[
'ratus'
]
+
terbilang_
(
n
%
100
)
elif
n
>=
100
:
elif
n
>=
100
:
hasil
=
[
'seratus'
]
+
terbilang_
(
n
-
100
)
hasil
=
[
'seratus'
]
+
terbilang_
(
n
-
100
)
elif
n
>=
20
:
elif
n
>=
20
:
hasil
=
terbilang_
(
n
/
10
)
+
[
'puluh'
]
+
terbilang_
(
n
%
10
)
hasil
=
terbilang_
(
n
/
10
)
+
[
'puluh'
]
+
terbilang_
(
n
%
10
)
elif
n
>=
12
:
elif
n
>=
12
:
hasil
=
terbilang_
(
n
%
10
)
+
[
'belas'
]
hasil
=
terbilang_
(
n
%
10
)
+
[
'belas'
]
else
:
else
:
hasil
=
[
satuan
[
n
]]
hasil
=
[
satuan
[
n
]]
print
(
'hasil'
)
print
(
'hasil'
)
return
hasil
return
hasil
def
terbilang
(
n
):
def
terbilang
(
n
):
if
n
==
0
:
if
n
==
0
:
return
'nol'
return
'nol'
t
=
terbilang_
(
n
)
t
=
terbilang_
(
n
)
while
''
in
t
:
while
''
in
t
:
t
.
remove
(
''
)
t
.
remove
(
''
)
return
' '
.
join
(
t
)
return
' '
.
join
(
t
)
def
number_only
(
value
):
def
number_only
(
value
):
return
re
.
sub
(
'
\
D'
,
""
,
value
)
return
re
.
sub
(
'
\
D'
,
""
,
value
)
def
set_user_log
(
message
,
request
,
logobj
=
None
,
user_name
=
None
):
def
set_user_log
(
message
,
request
,
logobj
=
None
,
user_name
=
None
):
if
not
logobj
:
if
not
logobj
:
logobj
=
log
logobj
=
log
if
not
request
:
if
not
request
:
logobj
.
info
(
"Request not Set"
)
logobj
.
info
(
"Request not Set"
)
return
return
if
not
user_name
:
if
not
user_name
:
user_name
=
request
and
request
.
user
and
request
.
user
.
user_name
or
None
user_name
=
request
and
request
.
user
and
request
.
user
.
user_name
or
None
if
not
user_name
:
if
not
user_name
:
logobj
.
info
(
"User Name not Set"
)
logobj
.
info
(
"User Name not Set"
)
return
return
addr
=
request
.
client_addr
addr
=
request
.
client_addr
message
=
"User {} at Addr {}: {}"
.
format
(
user_name
,
addr
,
message
)
message
=
"User {} at Addr {}: {}"
.
format
(
user_name
,
addr
,
message
)
logobj
.
warning
(
message
)
logobj
.
warning
(
message
)
def
create_static_path
(
config
,
folder
,
url
,
cache_max_age
=
3600
):
def
create_static_path
(
config
,
folder
,
url
,
cache_max_age
=
3600
):
log
.
debug
(
"Folder to create:
%
s"
,
folder
)
log
.
debug
(
"Folder to create:
%
s"
,
folder
)
if
not
os
.
path
.
exists
(
folder
):
if
not
os
.
path
.
exists
(
folder
):
try
:
try
:
os
.
makedirs
(
folder
)
os
.
makedirs
(
folder
)
except
Exception
as
e
:
except
Exception
as
e
:
log
.
debug
(
"User:
%
s"
,
os
.
path
.
expanduser
(
"~"
))
log
.
debug
(
"User:
%
s"
,
os
.
path
.
expanduser
(
"~"
))
log
.
debug
(
"Error:
%
s"
,
str
(
e
))
log
.
debug
(
"Error:
%
s"
,
str
(
e
))
config
.
add_static_view
(
url
,
path
=
folder
,
cache_max_age
=
cache_max_age
)
config
.
add_static_view
(
url
,
path
=
folder
,
cache_max_age
=
cache_max_age
)
def
includeme
(
config
):
def
includeme
(
config
):
config
.
add_translation_dirs
(
'opensipkd.tools:locale/'
)
config
.
add_translation_dirs
(
'opensipkd.tools:locale/'
)
Write
Preview
Markdown
is supported
Attach a file
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to post a comment