Merge branch 'shf_rename' of github.com:webnotes/erpnext into shf_rename

This commit is contained in:
Anand Doshi 2012-04-27 15:31:35 +05:30
commit 1dac43159a
43 changed files with 838 additions and 294 deletions

2
.gitignore vendored
View File

@ -1,7 +1,7 @@
*.pyc
*.comp.js
.DS_Store
user_files
files
patch.log
lib
conf.py

View File

@ -1728,7 +1728,6 @@ body {
padding: 0px;
font-size: 14px;
color: #000;
background-color: #e2e2e2;
}
/* font settings */
@ -1848,12 +1847,12 @@ div.comment { color: #444; }
div#body_div {
display: none;
padding-right: 7px;
width: 900px;
margin: auto;
margin-top: 56px;
padding-top: 70px;
padding-bottom: 50px;
}
.content {
margin: auto;
width: 900px;
}
@ -1864,23 +1863,19 @@ div#body_div {
transition: background 1s ease-in;
}
footer {
width: 900px;
margin: auto;
}
header .container {
width: 900px;
margin: auto;
}
@media (max-width: 1200px) {
div#body_div, header .container, .content, #opened-page-selector, footer {
header .container, .content {
width: 900px;
}
}
@media (min-width: 1200px) {
div#body_div, header .container, .content, #opened-page-selector, footer {
header .container, .content {
width: 1100px;
}
}
@ -1931,7 +1926,6 @@ div.std-footer-item {
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
margin-bottom: 30px;
overflow: hidden;
}
@ -3581,7 +3575,6 @@ span, div, td, input, textarea, button, select {
}
body {
background: url(../images/redbeech.jpg) repeat;
color: #616161;
}

View File

@ -1195,6 +1195,387 @@ button.btn.small, input[type="submit"].btn.small {
margin-bottom: 0;
}
/*
* lib/css/bootstrap/icons.css
*/
[class^="icon-"], [class*=" icon-"] {
display: inline-block;
width: 14px;
height: 14px;
line-height: 14px;
vertical-align: text-top;
background-image: url("../lib/images/icons/glyphicons-halflings.png");
background-position: 14px 14px;
background-repeat: no-repeat;
*margin-right: .3em;
}
[class^="icon-"]:last-child, [class*=" icon-"]:last-child {
*margin-left: 0;
}
.icon-white {
background-image: url("../lib/images/icons/glyphicons-halflings-white.png");
}
.icon-glass {
background-position: 0 0;
}
.icon-music {
background-position: -24px 0;
}
.icon-search {
background-position: -48px 0;
}
.icon-envelope {
background-position: -72px 0;
}
.icon-heart {
background-position: -96px 0;
}
.icon-star {
background-position: -120px 0;
}
.icon-star-empty {
background-position: -144px 0;
}
.icon-user {
background-position: -168px 0;
}
.icon-film {
background-position: -192px 0;
}
.icon-th-large {
background-position: -216px 0;
}
.icon-th {
background-position: -240px 0;
}
.icon-th-list {
background-position: -264px 0;
}
.icon-ok {
background-position: -288px 0;
}
.icon-remove {
background-position: -312px 0;
}
.icon-zoom-in {
background-position: -336px 0;
}
.icon-zoom-out {
background-position: -360px 0;
}
.icon-off {
background-position: -384px 0;
}
.icon-signal {
background-position: -408px 0;
}
.icon-cog {
background-position: -432px 0;
}
.icon-trash {
background-position: -456px 0;
}
.icon-home {
background-position: 0 -24px;
}
.icon-file {
background-position: -24px -24px;
}
.icon-time {
background-position: -48px -24px;
}
.icon-road {
background-position: -72px -24px;
}
.icon-download-alt {
background-position: -96px -24px;
}
.icon-download {
background-position: -120px -24px;
}
.icon-upload {
background-position: -144px -24px;
}
.icon-inbox {
background-position: -168px -24px;
}
.icon-play-circle {
background-position: -192px -24px;
}
.icon-repeat {
background-position: -216px -24px;
}
.icon-refresh {
background-position: -240px -24px;
}
.icon-list-alt {
background-position: -264px -24px;
}
.icon-lock {
background-position: -287px -24px;
}
.icon-flag {
background-position: -312px -24px;
}
.icon-headphones {
background-position: -336px -24px;
}
.icon-volume-off {
background-position: -360px -24px;
}
.icon-volume-down {
background-position: -384px -24px;
}
.icon-volume-up {
background-position: -408px -24px;
}
.icon-qrcode {
background-position: -432px -24px;
}
.icon-barcode {
background-position: -456px -24px;
}
.icon-tag {
background-position: 0 -48px;
}
.icon-tags {
background-position: -25px -48px;
}
.icon-book {
background-position: -48px -48px;
}
.icon-bookmark {
background-position: -72px -48px;
}
.icon-print {
background-position: -96px -48px;
}
.icon-camera {
background-position: -120px -48px;
}
.icon-font {
background-position: -144px -48px;
}
.icon-bold {
background-position: -167px -48px;
}
.icon-italic {
background-position: -192px -48px;
}
.icon-text-height {
background-position: -216px -48px;
}
.icon-text-width {
background-position: -240px -48px;
}
.icon-align-left {
background-position: -264px -48px;
}
.icon-align-center {
background-position: -288px -48px;
}
.icon-align-right {
background-position: -312px -48px;
}
.icon-align-justify {
background-position: -336px -48px;
}
.icon-list {
background-position: -360px -48px;
}
.icon-indent-left {
background-position: -384px -48px;
}
.icon-indent-right {
background-position: -408px -48px;
}
.icon-facetime-video {
background-position: -432px -48px;
}
.icon-picture {
background-position: -456px -48px;
}
.icon-pencil {
background-position: 0 -72px;
}
.icon-map-marker {
background-position: -24px -72px;
}
.icon-adjust {
background-position: -48px -72px;
}
.icon-tint {
background-position: -72px -72px;
}
.icon-edit {
background-position: -96px -72px;
}
.icon-share {
background-position: -120px -72px;
}
.icon-check {
background-position: -144px -72px;
}
.icon-move {
background-position: -168px -72px;
}
.icon-step-backward {
background-position: -192px -72px;
}
.icon-fast-backward {
background-position: -216px -72px;
}
.icon-backward {
background-position: -240px -72px;
}
.icon-play {
background-position: -264px -72px;
}
.icon-pause {
background-position: -288px -72px;
}
.icon-stop {
background-position: -312px -72px;
}
.icon-forward {
background-position: -336px -72px;
}
.icon-fast-forward {
background-position: -360px -72px;
}
.icon-step-forward {
background-position: -384px -72px;
}
.icon-eject {
background-position: -408px -72px;
}
.icon-chevron-left {
background-position: -432px -72px;
}
.icon-chevron-right {
background-position: -456px -72px;
}
.icon-plus-sign {
background-position: 0 -96px;
}
.icon-minus-sign {
background-position: -24px -96px;
}
.icon-remove-sign {
background-position: -48px -96px;
}
.icon-ok-sign {
background-position: -72px -96px;
}
.icon-question-sign {
background-position: -96px -96px;
}
.icon-info-sign {
background-position: -120px -96px;
}
.icon-screenshot {
background-position: -144px -96px;
}
.icon-remove-circle {
background-position: -168px -96px;
}
.icon-ok-circle {
background-position: -192px -96px;
}
.icon-ban-circle {
background-position: -216px -96px;
}
.icon-arrow-left {
background-position: -240px -96px;
}
.icon-arrow-right {
background-position: -264px -96px;
}
.icon-arrow-up {
background-position: -289px -96px;
}
.icon-arrow-down {
background-position: -312px -96px;
}
.icon-share-alt {
background-position: -336px -96px;
}
.icon-resize-full {
background-position: -360px -96px;
}
.icon-resize-small {
background-position: -384px -96px;
}
.icon-plus {
background-position: -408px -96px;
}
.icon-minus {
background-position: -433px -96px;
}
.icon-asterisk {
background-position: -456px -96px;
}
.icon-exclamation-sign {
background-position: 0 -120px;
}
.icon-gift {
background-position: -24px -120px;
}
.icon-leaf {
background-position: -48px -120px;
}
.icon-fire {
background-position: -72px -120px;
}
.icon-eye-open {
background-position: -96px -120px;
}
.icon-eye-close {
background-position: -120px -120px;
}
.icon-warning-sign {
background-position: -144px -120px;
}
.icon-plane {
background-position: -168px -120px;
}
.icon-calendar {
background-position: -192px -120px;
}
.icon-random {
background-position: -216px -120px;
}
.icon-comment {
background-position: -240px -120px;
}
.icon-magnet {
background-position: -264px -120px;
}
.icon-chevron-up {
background-position: -288px -120px;
}
.icon-chevron-down {
background-position: -313px -119px;
}
.icon-retweet {
background-position: -336px -120px;
}
.icon-shopping-cart {
background-position: -360px -120px;
}
.icon-folder-close {
background-position: -384px -120px;
}
.icon-folder-open {
background-position: -408px -120px;
}
.icon-resize-vertical {
background-position: -432px -119px;
}
.icon-resize-horizontal {
background-position: -456px -118px;
}
/*
* lib/css/legacy/body.css
*/
@ -1208,7 +1589,6 @@ body {
padding: 0px;
font-size: 14px;
color: #000;
background-color: #e2e2e2;
}
/* font settings */
@ -1328,12 +1708,12 @@ div.comment { color: #444; }
div#body_div {
display: none;
padding-right: 7px;
width: 900px;
margin: auto;
margin-top: 56px;
padding-top: 70px;
padding-bottom: 50px;
}
.content {
margin: auto;
width: 900px;
}
@ -1344,23 +1724,19 @@ div#body_div {
transition: background 1s ease-in;
}
footer {
width: 900px;
margin: auto;
}
header .container {
width: 900px;
margin: auto;
}
@media (max-width: 1200px) {
div#body_div, header .container, .content, #opened-page-selector, footer {
header .container, .content {
width: 900px;
}
}
@media (min-width: 1200px) {
div#body_div, header .container, .content, #opened-page-selector, footer {
header .container, .content {
width: 1100px;
}
}
@ -1411,7 +1787,6 @@ div.std-footer-item {
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
margin-bottom: 30px;
overflow: hidden;
}
@ -1898,7 +2273,6 @@ span, div, td, input, textarea, button, select {
}
body {
background: url(../images/redbeech.jpg) repeat;
color: #616161;
}
@ -1952,12 +2326,13 @@ body {
/*
* erpnext/website/css/website.css
*/
div#body_div, header .container, .content, #opened-page-selector, footer {
header .container, .content {
width: 900px;
}
div#body_div {
margin-top: 90px;
padding-top: 90px;
min-height: 400px;
}
p, li {
@ -2016,19 +2391,23 @@ pre {
background-color: #444;
}
footer {
color: #777;
background-color: #eee;
box-shadow: inset 0 10px 10px rgba(0,0,0,0.3), inset 0 3px 3px rgba(0,0,0,0.3);
border-top: 1px solid #555;
padding-top: 10px;
text-align: center;
}
.web-footer {
color: inherit;
text-align: center;
margin: 10px;
padding: 10px;
line-height: 1.7;
}
.web-footer div, .web-footer a {
font-size: 14px;
font-size: 12px;
}
.web-footer-menu {
@ -2047,10 +2426,20 @@ footer {
border-right: 1px solid #999;
}
.web-footer-menu ul li:first-child {
padding-left: 0px;
}
.web-footer-menu ul li:last-child {
border-right: 0px solid #777 !important;
}
.web-footer-powered {
color: #888;
float: right;
margin-top: -12px;
}
/* slide view */
.next-slide {

View File

@ -198,11 +198,18 @@ class DocType:
# ----------------
def save_entries(self, cancel, adv_adj, update_outstanding):
for le in self.entries:
# cancel
if cancel or flt(le.debit) < 0 or flt(le.credit) < 0:
#toggle debit, credit if negative entry
if flt(le.debit) < 0 or flt(le.credit) < 0:
tmp=le.debit
le.debit, le.credit = abs(flt(le.credit)), abs(flt(tmp))
# toggled debit/credit in two separate condition because both should be executed at the
# time of cancellation when there is negative amount (tax discount)
if cancel:
tmp=le.debit
le.debit, le.credit = abs(flt(le.credit)), abs(flt(tmp))
le_obj = get_obj(doc=le)
# validate except on_cancel
if not cancel:

View File

@ -49,7 +49,7 @@ class DocType:
def add_header(self):
title = 'Ledger Balances Between ' + getdate(self.doc.from_date).strftime('%d-%m-%Y') + ' and ' + getdate(self.doc.to_date).strftime('%d-%m-%Y')
return [[title], ['Account', 'Opening(Dr)', 'Opening (Cr)', 'Debit', 'Credit', 'Closing(Dr)', 'Closing(Cr)'], ['', '', '', '', '', '', '', 'Posting Date', 'Voucher Type', 'Voucher No', 'Debit', 'Credit', 'Remarks']]
return [[title], ['Account', 'Posting Date', 'Voucher Type', 'Voucher No', 'Debit', 'Credit', 'Remarks']]
@ -78,7 +78,7 @@ class DocType:
def show_acc_summary(self, glc, acc_det):
def get_acc_summary(self, glc, acc_det):
from_date_year = self.get_year(add_days(self.doc.from_date, -1))
to_date_year = self.get_year(self.doc.to_date)
acc = acc_det['account'].strip()
@ -104,8 +104,8 @@ class DocType:
if acc_det['dr_or_cr'] == 'Credit':
opening, closing = -1*opening, -1*closing
return [acc_det['account'], flt(opening>0 and opening or 0), flt(opening<0 and -opening or 0),
debit, credit, flt(closing>0.01 and closing or 0), flt(closing<-0.01 and -closing or 0)]
return flt(opening>0 and opening or 0), flt(opening<0 and -opening or 0), \
debit, credit, flt(closing>0.01 and closing or 0), flt(closing<-0.01 and -closing or 0)
def show_gl_entries(self, acc):
@ -113,7 +113,7 @@ class DocType:
gle = sql("select posting_date, voucher_type, voucher_no, debit, credit, remarks from `tabGL Entry` WHERE account = %s and posting_date >= %s AND posting_date <= %s and ifnull(is_opening, 'No') = 'No' and ifnull(is_cancelled, 'No') = 'No'", (acc, self.doc.from_date, self.doc.to_date), as_dict=1)
entries, dr, cr = [], 0, 0
for d in gle:
entries.append(['', '', '', '', '', '', '', d['posting_date'], d['voucher_type'], d['voucher_no'], d['debit'], d['credit'], d['remarks']])
entries.append(['', d['posting_date'], d['voucher_type'], d['voucher_no'], d['debit'], d['credit'], d['remarks']])
return entries
@ -133,13 +133,17 @@ class DocType:
sub_tree = self.get_account_subtree(d.account)
for acc_det in sub_tree:
acc_summary = self.show_acc_summary(glc, acc_det)
res.append(acc_summary)
acc_summary = self.get_acc_summary(glc, acc_det)
if acc_summary[0] or acc_summary[1] or acc_summary[2] or acc_summary[3] or acc_summary[4] or acc_summary[5]:
res.append([acc_det['account']])
# Show gl entries if account is ledger
if acc_det['group_or_ledger'] == 'Ledger' and (acc_summary[3] or acc_summary[4]):
if acc_det['group_or_ledger'] == 'Ledger' and (acc_summary[2] or acc_summary[3]):
gle = self.show_gl_entries(acc_det['account'].strip())
res += gle
# Totals
res.append(['', '', '', 'Total Debit/Credit', acc_summary[2], acc_summary[3]])
res.append(['', '', '', 'Opening Balance', acc_summary[0], acc_summary[1]])
res.append(['', '', '', 'Closing Balance', acc_summary[4], acc_summary[5]])
return res

View File

@ -5,7 +5,7 @@
{
'creation': '2012-04-13 11:56:17',
'docstatus': 0,
'modified': '2012-04-23 12:08:52',
'modified': '2012-04-27 11:21:21',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@ -186,20 +186,6 @@
'trigger': u'Client'
},
# DocField
{
'doctype': u'DocField',
'fieldname': u'amended_from',
'fieldtype': u'Link',
'label': u'Amended From',
'no_copy': 1,
'oldfieldname': u'amended_from',
'oldfieldtype': u'Link',
'options': u'Purchase Invoice',
'permlevel': 1,
'print_hide': 1
},
# DocField
{
'colour': u'White:FFF',
@ -359,6 +345,20 @@
'search_index': 1
},
# DocField
{
'doctype': u'DocField',
'fieldname': u'amended_from',
'fieldtype': u'Link',
'label': u'Amended From',
'no_copy': 1,
'oldfieldname': u'amended_from',
'oldfieldtype': u'Link',
'options': u'Purchase Invoice',
'permlevel': 1,
'print_hide': 1
},
# DocField
{
'description': u'The date at which current entry is corrected in the system.',

View File

@ -60,22 +60,10 @@ cur_frm.cscript.refresh = function(doc, cdt, cdn) {
if (!cur_frm.cscript.is_onload) cur_frm.cscript.dynamic_label(doc, cdt, cdn);
if(doc.docstatus == 1 && doc.status != 'Stopped'){
var ch = getchildren('Purchase Order Item',doc.name,'po_details');
var allow_billing = 0; var allow_receipt = 0;
cur_frm.add_custom_button('Send SMS', cur_frm.cscript.send_sms);
for(var i in ch){
if(ch[i].qty > ch[i].received_qty) allow_receipt = 1;
if(ch[i].qty > ch[i].billed_qty) allow_billing = 1;
}
if(allow_receipt)
cur_frm.add_custom_button('Make Purchase Receipt', cur_frm.cscript['Make Purchase Receipt']);
if(allow_billing)
cur_frm.add_custom_button('Make Invoice', cur_frm.cscript['Make Purchase Invoice']);
if(allow_billing || allow_receipt)
cur_frm.add_custom_button('Stop', cur_frm.cscript['Stop Purchase Order']);
cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']);
if(doc.per_received < 100) cur_frm.add_custom_button('Make Purchase Receipt', cur_frm.cscript['Make Purchase Receipt']);
if(doc.per_billed < 100) cur_frm.add_custom_button('Make Invoice', cur_frm.cscript['Make Purchase Invoice']);
if(doc.per_billed < 100 || doc.per_received < 100) cur_frm.add_custom_button('Stop', cur_frm.cscript['Stop Purchase Order']);
}
if(doc.docstatus == 1 && doc.status == 'Stopped')

View File

@ -46,19 +46,10 @@ cur_frm.cscript.get_item_defaults = function(doc) {
//======================= Refresh =====================================
cur_frm.cscript.refresh = function(doc, cdt, cdn) {
// Unhide Fields in Next Steps
// ---------------------------------
cur_frm.clear_custom_buttons();
if(doc.docstatus == 1 && doc.status != 'Stopped'){
var ch = getchildren('Purchase Request Item',doc.name,'indent_details');
var is_closed = 1;
for(var i in ch){
if(flt(ch[i].qty) > flt(ch[i].ordered_qty)) is_closed = 0;
}
if(!is_closed) {
if(doc.per_ordered < 100) {
cur_frm.add_custom_button('Make Purchase Order', cur_frm.cscript['Make Purchase Order'])
cur_frm.add_custom_button('Stop Purchase Request', cur_frm.cscript['Stop Purchase Request'])
}

View File

@ -1,5 +1,5 @@
def execute():
import webnotes
from webnotes.model import delete_doc
webnotes.conn.sql("update `tabDocType` set module = 'Utilities' where name in ('Question', 'Answer')")
delete_doc('Module Def', 'Knowledge Base')

View File

@ -1,3 +1,5 @@
def execute():
import webnotes
webnotes.conn.commit()
webnotes.conn.sql("alter table __CacheItem modify `value` longtext")
webnotes.conn.begin()

View File

@ -0,0 +1,3 @@
def execute():
import webnotes
webnotes.conn.sql("update `tabDocField` set `default` = '' where fieldname = 'cost_center' and parent = 'RV Detail' and `default` = 'Purchase - TC'")

View File

@ -0,0 +1,6 @@
def execute():
import webnotes
from webnotes.modules.module_manager import reload_doc
reload_doc('stock', 'doctype', 'serial_no')
webnotes.conn.sql("update `tabSerial No` set sle_exists = 1")

View File

@ -0,0 +1,14 @@
def execute():
import webnotes
from webnotes.model.doc import addchild
from webnotes.model.code import get_obj
webnotes.conn.sql("delete from `tabDocPerm` where role = 'All' and permlevel = 0 and parent in ('Appraisal', 'Ticket', 'Project')")
appr = get_obj('DocType', 'Appraisal', with_children=1)
ch = addchild(appr.doc, 'permissions', 'DocPerm', 0)
ch.permlevel = 0
ch.role = 'Employee'
ch.read = 1
ch.write = 1
ch.save()

View File

@ -0,0 +1,3 @@
def execute():
import webnotes
webnotes.conn.sql("update `tabDocPerm` set permlevel = 0 where parent = 'Address'")

View File

@ -0,0 +1,21 @@
def execute():
import webnotes
from webnotes.model.doc import addchild
from webnotes.model.code import get_obj
webnotes.conn.sql("delete from `tabDocPerm` where role = 'All' and parent = 'Address'")
role1 = ['Sales User', 'Purchase User', 'Accounts User', 'Maintenance User']
role2 = ['Sales Manager', 'Sales Master Manager', 'Purchase Manager', 'Purchase Master Manager', 'Accounts Manager', 'Maintenance Manager']
addr = get_obj('DocType', 'Address', with_children=1)
for d in role1+role2:
ch = addchild(addr.doc, 'permissions', 'DocPerm', 0)
ch.role = d
ch.read = 1
ch.write = 1
ch.create = 1
if d in role2:
ch.cancel = 1
ch.save()

View File

@ -282,4 +282,30 @@ patch_list = [
'patch_file': 'change_cacheitem_schema',
'description': 'Modified datatype of `value` column from text to longtext'
},
{
'patch_module': 'patches.april_2012',
'patch_file': 'remove_default_from_rv_detail',
'description': ''
},
{
'patch_module': 'patches.april_2012',
'patch_file': 'update_role_in_address',
'description': 'updated roles in address'
},
{
'patch_module': 'patches.april_2012',
'patch_file': 'update_permlevel_in_address',
'description': 'updated permlevel in address'
},
{
'patch_module': 'patches.april_2012',
'patch_file': 'update_appraisal_permission',
'description': 'updated permission in appraisal'
},
{
'patch_module': 'patches.april_2012',
'patch_file': 'serial_no_fixes',
'description': 'fixes for sle creation while import'
},
]

View File

@ -14,19 +14,19 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
cur_frm.cscript.select_transaction = function(doc, dt, dn) {
cur_frm.cscript.select_transaction = function(doc, cdt, cdn) {
if(doc.select_transaction) {
var callback = function(r,rt) {
var doc = locals[dt][dn];
var doc = locals[cdt][cdn];
doc.custom_message = r.message;
refresh_field('custom_message');
}
$c_obj('Notification Control','get_message',doc.select_transaction, callback)
$c_obj(make_doclist(cdt, cdn),'get_message',doc.select_transaction, callback)
}
}
cur_frm.cscript.notify = function(doc, args) {
$c_obj('Notification Control', 'get_formatted_message', {
$c_obj(make_doclist(doc.doctype, doc.name), 'get_formatted_message', {
type: args['type'],
doctype: args['doctype'],
contact_name: args['contact_name'] || doc.contact_display

View File

@ -13,7 +13,6 @@ span, div, td, input, textarea, button, select {
}
body {
background: url(../images/redbeech.jpg) repeat;
color: #616161;
}

View File

@ -188,7 +188,7 @@ erpnext.startup.set_periodic_updates = function() {
}
erpnext.set_user_background = function(src) {
set_style(repl('body { background: url("files/%(src)s") repeat;}', {src:src}))
set_style(repl('#body_div { background: url("files/%(src)s") repeat;}', {src:src}))
}
// start

View File

@ -44,6 +44,7 @@ class DocType:
def update_stock(self, actual_qty=0, reserved_qty=0, ordered_qty=0, indented_qty=0, planned_qty=0, dt=None, sle_id='', posting_time='', serial_no = '', is_cancelled = 'No',doc_type='',doc_name='',is_amended='No'):
if not dt:
dt = nowdate()
# update the stock values (for current quantities)
self.doc.actual_qty = flt(self.doc.actual_qty) + flt(actual_qty)
self.doc.ordered_qty = flt(self.doc.ordered_qty) + flt(ordered_qty)

View File

@ -63,13 +63,8 @@ cur_frm.cscript.refresh = function(doc, cdt, cdn) {
if(doc.docstatus == 1){
var ch = getchildren('Purchase Receipt Item',doc.name,'purchase_receipt_details');
allow_billing = 0;
for(var i in ch){
if(ch[i].qty > ch[i].billed_qty) allow_billing = 1;
}
cur_frm.add_custom_button('Make Purchase Invoice', cur_frm.cscript['Make Purchase Invoice']);
cur_frm.add_custom_button('Send SMS', cur_frm.cscript.send_sms);
if (doc.per_billed < 100) cur_frm.add_custom_button('Make Purchase Invoice', cur_frm.cscript['Make Purchase Invoice']);
cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']);
}
}

View File

@ -67,7 +67,7 @@ class DocType:
msgprint("Sales Bom Item " + d.item_code +" cannot be child item.")
raise Exception
# Check if is_main_item is modified once saved
if not self.doc.fields.get('__islocal') and d.is_main_item == "Yes" and cstr(d.item_code) != cstr(self.doc.name)[:-3] :
if not self.doc.fields.get('__islocal') and d.is_main_item == "Yes" and cstr(d.item_code) != cstr(self.doc.new_item_code)[:-3] :
msgprint("Modifying the main item is not allowed.")
raise Exception
if len(is_main_item) > 1:
@ -165,14 +165,13 @@ class DocType:
return
# get all Sales BOM that have the first item
sbl = sql("select distinct parent from `tabSales BOM Item` where item_code=%s", il[0].item_code)
sbl = sql("select distinct parent from `tabSales BOM Item` where item_code=%s and parent != %s and docstatus != 2", (il[0].item_code, self.doc.name))
# check all siblings
sub_items = [[d.item_code, flt(d.qty)] for d in il]
for s in sbl:
if not cstr(s[0]) == cstr(self.doc.name) :
t = sql("select item_code, qty from `tabSales BOM Item` where parent=%s", s[0])
t = sql("select item_code, qty from `tabSales BOM Item` where parent=%s and docstatus != 2", s[0])
t = [[d[0], flt(d[1])] for d in t]
if self.has_same_items(sub_items, t):

View File

@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
'creation': '2012-04-23 16:00:21',
'creation': '2012-04-26 13:04:56',
'docstatus': 0,
'modified': '2012-04-24 15:07:42',
'modified': '2012-04-27 11:00:18',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@ -15,7 +15,6 @@
'_last_update': u'1322549701',
'allow_trash': 1,
'colour': u'White:FFF',
'default_print_format': u'Standard',
'doctype': 'DocType',
'document_type': u'Master',
'is_submittable': 1,
@ -124,6 +123,24 @@
'write': 0
},
# DocField
{
'doctype': u'DocField',
'fieldname': u'basic_section',
'fieldtype': u'Section Break',
'label': u'Basic Section',
'permlevel': 0
},
# DocField
{
'doctype': u'DocField',
'fieldname': u'col1',
'fieldtype': u'Column Break',
'permlevel': 0,
'width': u'50%'
},
# DocField
{
'doctype': u'DocField',
@ -173,6 +190,15 @@
'width': u'300px'
},
# DocField
{
'doctype': u'DocField',
'fieldname': u'col2',
'fieldtype': u'Column Break',
'permlevel': 0,
'width': u'50%'
},
# DocField
{
'doctype': u'DocField',
@ -186,6 +212,18 @@
'reqd': 1
},
# DocField
{
'doctype': u'DocField',
'fieldname': u'stock_uom',
'fieldtype': u'Link',
'label': u'Stock UOM',
'oldfieldname': u'stock_uom',
'oldfieldtype': u'Link',
'options': u'UOM',
'permlevel': 0
},
# DocField
{
'colour': u'White:FFF',
@ -214,42 +252,6 @@
'trigger': u'Client'
},
# DocField
{
'colour': u'White:FFF',
'doctype': u'DocField',
'fieldname': u'find_sales_bom',
'fieldtype': u'Button',
'label': u'Find Sales BOM',
'oldfieldtype': u'Button',
'permlevel': 0,
'trigger': u'Client'
},
# DocField
{
'doctype': u'DocField',
'fieldname': u'sales_bom_items',
'fieldtype': u'Table',
'label': u'Sales BOM Items',
'oldfieldname': u'sales_bom_items',
'oldfieldtype': u'Table',
'options': u'Sales BOM Item',
'permlevel': 0
},
# DocField
{
'doctype': u'DocField',
'fieldname': u'stock_uom',
'fieldtype': u'Link',
'label': u'Stock UOM',
'oldfieldname': u'stock_uom',
'oldfieldtype': u'Link',
'options': u'UOM',
'permlevel': 0
},
# DocField
{
'depends_on': u'eval:doc.amended_from',
@ -270,11 +272,44 @@
'fieldtype': u'Link',
'label': u'Amended From',
'no_copy': 1,
'options': u'Sales Invoice',
'options': u'Sales BOM',
'permlevel': 1,
'print_hide': 1
},
# DocField
{
'colour': u'White:FFF',
'doctype': u'DocField',
'fieldname': u'find_sales_bom',
'fieldtype': u'Button',
'label': u'Find Sales BOM',
'oldfieldtype': u'Button',
'permlevel': 0,
'trigger': u'Client'
},
# DocField
{
'doctype': u'DocField',
'fieldname': u'item_section',
'fieldtype': u'Section Break',
'label': u'Items',
'permlevel': 0
},
# DocField
{
'doctype': u'DocField',
'fieldname': u'sales_bom_items',
'fieldtype': u'Table',
'label': u'Sales BOM Items',
'oldfieldname': u'sales_bom_items',
'oldfieldtype': u'Table',
'options': u'Sales BOM Item',
'permlevel': 0
},
# DocField
{
'doctype': u'DocField',

View File

@ -71,10 +71,13 @@ class DocType(TransactionBase):
self.validate_warehouse()
self.validate_item()
def on_update(self):
if self.doc.warehouse and self.doc.status == 'In Store' and cint(self.doc.sle_exists) == 0 and \
not sql("select name from `tabStock Ledger Entry` where serial_no = %s and ifnull(is_cancelled, 'No') = 'No'", self.doc.name):
self.make_stock_ledger_entry(1)
webnotes.conn.set(self.doc, 'sle_exists', 1)
# ------------------------
# make stock ledger entry
# ------------------------
def make_stock_ledger_entry(self, qty):
from webnotes.model.code import get_obj
values = [{
@ -91,21 +94,13 @@ class DocType(TransactionBase):
'incoming_rate' : self.doc.purchase_rate,
'company' : self.doc.company,
'fiscal_year' : self.doc.fiscal_year,
'is_cancelled' : 'No', # is_cancelled is always 'No' because while deleted it can not find creation entry if it not created directly, voucher no != serial no.
'is_cancelled' : 'No', # is_cancelled is always 'No' because while deleted it can not find creation entry if it not created directly, voucher no != serial no
'batch_no' : '',
'serial_no' : self.doc.name
}]
get_obj('Stock Ledger', 'Stock Ledger').update_stock(values)
# ----------
# on update
# ----------
def on_update(self):
if self.doc.localname and self.doc.warehouse and self.doc.status == 'In Store' and not sql("select name from `tabStock Ledger Entry` where serial_no = '%s' and ifnull(is_cancelled, 'No') = 'No'" % (self.doc.name)):
self.make_stock_ledger_entry(1)
# ---------
# on trash
# ---------

View File

@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
'creation': '2012-03-27 14:36:37',
'creation': '2012-04-23 16:00:23',
'docstatus': 0,
'modified': '2012-03-27 14:36:37',
'modified': '2012-04-26 13:01:57',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@ -13,6 +13,7 @@
# These values are common for all DocType
{
'_last_update': u'1325570647',
'allow_attach': 1,
'allow_trash': 1,
'autoname': u'field:serial_no',
'colour': u'White:FFF',
@ -27,7 +28,7 @@
'show_in_menu': 0,
'subject': u'Item Code: %(item_code)s, Warehouse: %(warehouse)s',
'tag_fields': u'status',
'version': 191
'version': 1
},
# These values are common for all DocField
@ -55,6 +56,54 @@
'name': u'Serial No'
},
# DocPerm
{
'amend': 0,
'cancel': 0,
'create': 0,
'doctype': u'DocPerm',
'permlevel': 1,
'role': u'Material Manager',
'submit': 0,
'write': 0
},
# DocPerm
{
'amend': 0,
'cancel': 0,
'create': 0,
'doctype': u'DocPerm',
'permlevel': 0,
'role': u'Material Manager',
'submit': 0,
'write': 0
},
# DocPerm
{
'amend': 0,
'cancel': 0,
'create': 0,
'doctype': u'DocPerm',
'permlevel': 1,
'role': u'Material User',
'submit': 0,
'write': 0
},
# DocPerm
{
'amend': 0,
'cancel': 0,
'create': 0,
'doctype': u'DocPerm',
'permlevel': 0,
'role': u'Material User',
'submit': 0,
'write': 0
},
# DocPerm
{
'cancel': 1,
@ -89,54 +138,6 @@
'role': u'Sales Master Manager'
},
# DocPerm
{
'amend': 0,
'cancel': 0,
'create': 0,
'doctype': u'DocPerm',
'permlevel': 1,
'role': u'Material Manager',
'submit': 0,
'write': 0
},
# DocPerm
{
'amend': 0,
'cancel': 0,
'create': 0,
'doctype': u'DocPerm',
'permlevel': 0,
'role': u'Material Manager',
'submit': 0,
'write': 0
},
# DocPerm
{
'amend': 0,
'cancel': 0,
'create': 0,
'doctype': u'DocPerm',
'permlevel': 1,
'role': u'Material User',
'submit': 0,
'write': 0
},
# DocPerm
{
'amend': 0,
'cancel': 0,
'create': 0,
'doctype': u'DocPerm',
'permlevel': 0,
'role': u'Material User',
'submit': 0,
'write': 0
},
# DocField
{
'doctype': u'DocField',
@ -700,5 +701,30 @@
'oldfieldname': u'trash_reason',
'oldfieldtype': u'Small Text',
'permlevel': 1
},
# DocField
{
'doctype': u'DocField',
'fieldname': u'file_list',
'fieldtype': u'Text',
'hidden': 1,
'label': u'File List',
'no_copy': 1,
'permlevel': 0,
'print_hide': 1
},
# DocField
{
'doctype': u'DocField',
'fieldname': u'sle_exists',
'fieldtype': u'Check',
'hidden': 1,
'label': u'SLE Exists',
'no_copy': 1,
'permlevel': 1,
'print_hide': 1,
'report_hide': 1
}
]

View File

@ -128,6 +128,7 @@ class DocType:
s.modified = nowdate()
s.modified_by = session['user']
s.serial_no = serial_no
s.sle_exists = 1
s.fiscal_year = obj.doc.fiscal_year
s.company = obj.doc.company
s.save(new_rec)
@ -211,7 +212,7 @@ class DocType:
import datetime
for d in getlist(obj.doclist, fname):
if d.serial_no:
serial_nos = self.get_sr_no_list(d.serial_no, d.qty)
serial_nos = self.get_sr_no_list(d.serial_no)
for a in serial_nos:
serial_no = a.strip()
if is_incoming:

View File

@ -35,11 +35,14 @@ class DocType:
def actual_amt_check(self):
if self.doc.batch_no:
batch_bal = flt(sql("select sum(actual_qty) from `tabStock Ledger Entry` where warehouse = '%s' and item_code = '%s' and batch_no = '%s'"%(self.doc.warehouse,self.doc.item_code,self.doc.batch_no))[0][0])
self.doc.fields.update({'batch_bal': batch_bal})
if (batch_bal + self.doc.actual_qty) < 0:
msgprint("""Not enough quantity (requested: %(actual_qty)s, current: %(batch_bal)s in Batch
<b>%(batch_no)s</b> for Item <b>%(item_code)s</b> at Warehouse<b>%(warehouse)s</b>
as on %(posting_date)s %(posting_time)s""" % self.doc.fields.update({'batch_bal': batch_bal}), raise_exception = 1)
as on %(posting_date)s %(posting_time)s""" % self.doc.fields, raise_exception = 1)
self.doc.fields.pop('batch_bal')
# mandatory
@ -89,9 +92,17 @@ class DocType:
if getdate(self.doc.posting_date) <= getdate(stock_frozen_upto) and not stock_auth_role in webnotes.user.get_roles():
msgprint("You are not authorized to do / modify back dated stock entries before %s" % getdate(stock_frozen_upto).strftime('%d-%m-%Y'), raise_exception=1)
def validate_posting_time(self):
""" Validate posting time format"""
if self.doc.posting_time and len(cstr(self.doc.posting_time)) == 8 and cstr(self.doc.posting_time)[-2:] != '00':
msgprint("Wrong format of posting time, can not complete the transaction. If you think \
you entered posting time correctly, please contact ERPNext support team.")
raise Exception
def validate(self):
self.validate_mandatory()
self.validate_posting_time()
self.validate_item()
self.actual_amt_check()
self.check_stock_frozen_date()

View File

@ -19,7 +19,7 @@ report.customize_filters = function() {
this.mytabs.items['Select Columns'].hide()
this.mytabs.items['More Filters'].hide()
this.hide_all_filters();
this.add_filter({fieldname:'based_on', label:'Based On', fieldtype:'Select', options:'Warehouse'+NEWLINE+'Item Code',report_default:'Warehouse',ignore : 1,parent:'Stock Ledger Entry'});
this.add_filter({fieldname:'based_on', label:'Based On', fieldtype:'Select', options:'Warehouse'+NEWLINE+'Item Code',ignore : 1,parent:'Stock Ledger Entry'});
this.filter_fields_dict['Stock Ledger Entry'+FILTER_SEP +'To Posting Date'].df.filter_hide = 0;
this.filter_fields_dict['Stock Ledger Entry'+FILTER_SEP +'Item Code'].df.filter_hide = 0;
this.filter_fields_dict['Stock Ledger Entry'+FILTER_SEP +'Warehouse'].df.filter_hide = 0;
@ -57,8 +57,8 @@ report.get_query = function(){
ware_type_cond = repl(' AND `tabWarehouse`.warehouse_type IN (%(war)s)', {war: war.substr(0,war.length-1)})
}
if(based_on.length == 1){
if(based_on == 'Item Code'){
if(based_on.length == 1 && based_on[0]){
if(based_on[0] == 'Item Code'){
cols = '`tabItem`.name AS "Item Code", `tabItem`.item_name AS "Item Name", `tabItem`.description AS "Description", `tabItem`.stock_uom AS "Stock UOM"';
cond = '(IFNULL(`tabItem`.`end_of_life`,"") = "" OR `tabItem`.`end_of_life` = "0000-00-00" OR `tabItem`.`end_of_life` > NOW()) AND `tabItem`.is_stock_item = "Yes"';
if(item_code) cond += repl(' AND `tabItem`.name = %(item)s', {item:'"'+item_code+'"'});
@ -66,7 +66,7 @@ report.get_query = function(){
tables = '`tabItem`';
group_by = '`tabStock Ledger Entry`.item_code';
}
else if(based_on == 'Warehouse'){
else if(based_on[0] == 'Warehouse'){
cols = '`tabWarehouse`.name AS "Warehouse", `tabWarehouse`.warehouse_type AS "Warehouse Type"';
cond = '`tabWarehouse`.docstatus < 2'
if(warehouse) cond += repl(' AND `tabWarehouse`.name = %(warehouse)s', {warehouse:'"'+warehouse+'"'});
@ -74,8 +74,7 @@ report.get_query = function(){
tables = '`tabWarehouse`';
group_by = '`tabStock Ledger Entry`.warehouse';
}
}
else if(based_on.length == 2){
} else {
cols = '`tabItem`.name AS "Item Code", `tabItem`.item_name AS "Item Name", `tabItem`.description AS "Description", `tabItem`.stock_uom AS "Stock UOM", `tabWarehouse`.name AS "Warehouse", `tabWarehouse`.warehouse_type AS "Warehouse Type"';
cond = '(IFNULL(`tabItem`.`end_of_life`,"") = "" OR `tabItem`.`end_of_life` = "0000-00-00" OR `tabItem`.`end_of_life` > NOW()) AND `tabItem`.is_stock_item = "Yes" AND `tabWarehouse`.docstatus < 2';
if(item_code) cond += repl(" AND `tabItem`.name = %(item)s", {item:"'"+item_code+"'"});

View File

@ -14,19 +14,16 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
if not filter_values.get('based_on'):
msgprint("Please Select Based On")
raise Exception
cols, columns = [], []
# Add columns
# ------------
based_on = filter_values.get('based_on').split(NEWLINE)
if len(based_on) == 1:
if len(based_on) == 1 and based_on[0]:
if based_on[0] == 'Item Code':
cols = ["Item Code", "Item Name", "Description", "Stock UOM"]
elif based_on[0] == 'Warehouse':
cols = ["Warehouse", "Warehouse Type"]
elif len(based_on) == 2:
else:
cols = ["Item Code", "Item Name", "Description", "Stock UOM", "Warehouse", "Warehouse Type"]
for d in cols:
@ -65,7 +62,7 @@ out=[]
cl_bal,tot_stock = 0,0
for r in res:
if len(based_on) == 1:
if len(based_on) == 1 and based_on[0]:
if based_on[0] == 'Item Code': closing_balance, stock_value = get_values(msgprint, flt, posting_date, item_code = r[col_idx['Item Code']])
elif based_on[0] == 'Warehouse': closing_balance, stock_value = get_values(msgprint, flt, posting_date, warehouse = r[col_idx['Warehouse']])
r.append(closing_balance)

View File

@ -1,9 +1,10 @@
div#body_div, header .container, .content, #opened-page-selector, footer {
header .container, .content {
width: 900px;
}
div#body_div {
margin-top: 90px;
padding-top: 90px;
min-height: 400px;
}
p, li {
@ -62,19 +63,23 @@ pre {
background-color: #444;
}
footer {
color: #777;
background-color: #eee;
box-shadow: inset 0 10px 10px rgba(0,0,0,0.3), inset 0 3px 3px rgba(0,0,0,0.3);
border-top: 1px solid #555;
padding-top: 10px;
text-align: center;
}
.web-footer {
color: inherit;
text-align: center;
margin: 10px;
padding: 10px;
line-height: 1.7;
}
.web-footer div, .web-footer a {
font-size: 14px;
font-size: 12px;
}
.web-footer-menu {
@ -93,10 +98,20 @@ footer {
border-right: 1px solid #999;
}
.web-footer-menu ul li:first-child {
padding-left: 0px;
}
.web-footer-menu ul li:last-child {
border-right: 0px solid #777 !important;
}
.web-footer-powered {
color: #888;
float: right;
margin-top: -12px;
}
/* slide view */
.next-slide {

View File

@ -33,8 +33,10 @@ class DocType():
def validate(self):
"""write/update 'Page' with the blog"""
if self.doc.page_name:
webnotes.conn.sql("""delete from tabPage where name=%s""", self.doc.page_name)
p = website.utils.add_page(self.doc.title)
self.doc.name = p.name
from jinja2 import Template
import markdown2
@ -54,6 +56,7 @@ class DocType():
p.save()
website.utils.add_guest_access_to_page(p.name)
self.doc.page_name = p.name
# cleanup
for f in ['content_html', 'full_name', 'updated']:
@ -61,4 +64,3 @@ class DocType():
del self.doc.fields[f]

View File

@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
'creation': '2012-03-27 14:36:47',
'creation': '2012-04-02 16:02:43',
'docstatus': 0,
'modified': '2012-03-27 14:36:47',
'modified': '2012-04-26 16:58:27',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@ -21,7 +21,7 @@
'name': '__common__',
'section_style': u'Simple',
'show_in_menu': 0,
'version': 3
'version': 5
},
# These values are common for all DocField
@ -35,15 +35,12 @@
# These values are common for all DocPerm
{
'create': 1,
'doctype': u'DocPerm',
'name': '__common__',
'parent': u'Blog',
'parentfield': u'permissions',
'parenttype': u'DocType',
'permlevel': 0,
'read': 1,
'write': 1
'read': 1
},
# DocType, Blog
@ -54,14 +51,27 @@
# DocPerm
{
'create': 1,
'doctype': u'DocPerm',
'role': u'Website Manager'
'permlevel': 0,
'role': u'Website Manager',
'write': 1
},
# DocPerm
{
'create': 1,
'doctype': u'DocPerm',
'permlevel': 0,
'role': u'Blogger',
'write': 1
},
# DocPerm
{
'doctype': u'DocPerm',
'role': u'Blogger'
'permlevel': 1,
'role': u'All'
},
# DocField
@ -70,7 +80,8 @@
'fieldname': u'title',
'fieldtype': u'Data',
'label': u'Title',
'permlevel': 0
'permlevel': 0,
'reqd': 1
},
# DocField
@ -88,7 +99,8 @@
'fieldname': u'content',
'fieldtype': u'Code',
'label': u'Content',
'permlevel': 0
'permlevel': 0,
'reqd': 0
},
# DocField
@ -96,10 +108,19 @@
'doctype': u'DocField',
'fieldname': u'content_html',
'fieldtype': u'Text',
'label': u'Preview',
'label': u'Content HTML',
'permlevel': 1
},
# DocField
{
'doctype': u'DocField',
'fieldname': u'page_name',
'fieldtype': u'Data',
'label': u'Page Name',
'permlevel': 0
},
# DocField
{
'doctype': u'DocField',

View File

@ -18,32 +18,28 @@
pscript['onload_{{ doc.name }}'] = function(wrapper) {
// sidebar
var side = $(wrapper).find('.web-side-section')
.append('<h4>Recent Posts</h4>').get(0);
wrapper.recent_list = new wn.ui.Listing({
parent: side,
parent: $(wrapper).find('.recent-posts'),
no_toolbar: true,
query: 'select name, title, left(content, 100) as content from tabBlog\
where ifnull(published,1)=1',
where ifnull(published,0)=1 and name!="{{ doc.name }}" order by modified desc',
hide_refresh: true,
render_row: function(parent, data) {
if(data.content.length==100) data.content += '...';
console.log(data);
if(data.content && data.content.length==100) data.content += '...';
parent.innerHTML = repl('<a href="#!%(name)s">%(title)s</a>\
<div class="comment">%(content)s</div><br>', data);
},
page_length: 5
page_length: 5,
});
wrapper.recent_list.run();
// comments
$(wrapper).find('.web-main-section').append('<hr><h3>Comments</h3>');
wrapper.comment_list = new wn.ui.Listing({
parent: $(wrapper).find('.web-main-section').get(0),
parent: $(wrapper).find('.blog-comments').get(0),
no_toolbar: true,
query: 'select comment, comment_by_fullname, modified\
from `tabComment` where comment_doctype="Page"\
and comment_docname="{{ doc.name }}"',
and comment_docname="{{ doc.name }}" order by modified desc',
no_result_message: 'Be the first one to comment',
render_row: function(parent, data) {
data.comment_date = prettyDate(data.modified);
@ -57,7 +53,7 @@ pscript['onload_{{ doc.name }}'] = function(wrapper) {
wrapper.comment_list.run();
// add comment
$(wrapper).find('.web-main-section').append('<br><button class="btn add-comment">\
$(wrapper).find('.layout-main-section').append('<br><button class="btn add-comment">\
Add Comment</button>');
$(wrapper).find('button.add-comment').click(function(){
d = new wn.widgets.Dialog({

View File

@ -1,14 +1,18 @@
<div class="layout-wrapper layout-wrapper-background">
<div class="web-content" id="blog-{{ doc.name }}">
<div class="layout-main-section">
<h1>Blog</h1>
<h3>{{ doc.title }}</h3>
<h2>{{ doc.title }}</h2>
<div class="help">By {{ doc.full_name }} on {{ doc.updated }}</div>
<br>
{{ doc.content_html }}
<hr><h3>Comments</h3>
<br>
<div class="blog-comments"></div>
</div>
<div class="layout-side-section">
<p><a href="#!blog">All Blogs</a></p>
<h4>Recent Posts</h4>
<div class="recent-posts" style="min-height: 100px;"></div>
<h4>Subscribe</h4>
<p>
<img src="images/feed.png" style="margin-right: 4px; margin-bottom: -4px">

View File

@ -1,4 +1,4 @@
body {
#body_div {
{% if doc.background_image %}
background: url("files/{{ doc.background_image }}") repeat;
{% elif doc.background_color %}

View File

@ -28,6 +28,3 @@
<div style="clear: both"></div>
</div>
</div>
<div class="web-page-status small">
Last Modified: {{ doc.updated }} <a href="#contact">Feedback</a>
</div>

View File

@ -24,10 +24,10 @@ $.extend(cur_frm.cscript, {
refresh: function(doc) {
cur_frm.cscript.layout(doc);
},
insert_style: function() {
insert_style: function(doc) {
cur_frm.cscript.layout(doc);
},
insert_code: function() {
insert_code: function(doc) {
cur_frm.cscript.layout(doc);
}
})

View File

@ -91,8 +91,7 @@ erpnext.Footer = Class.extend({
init: function() {
$('footer').html(repl('<div class="web-footer">\
<div class="web-footer-menu"><ul></ul></div>\
<div class="web-footer-address">%(address)s</div>\
<div class="web-footer-copyright">&copy; %(copyright)s</div>\
<div class="web-footer-copyright">&copy; %(copyright)s | %(address)s</div>\
<div class="web-footer-powered">Powered by \
<a href="https://erpnext.com">erpnext.com</a></div>\
</div>', wn.boot.website_settings));

View File

@ -3,6 +3,7 @@
<div class="layout-main-section">
<h1>Blog</h1>
<br>
<div id="blog-list"></div>
</div>
<div class="layout-side-section">
<!-- for later

View File

@ -17,18 +17,22 @@
pscript.onload_blog = function(wrapper) {
wrapper.blog_list = new wn.ui.Listing({
parent: $(wrapper).find('.layout-main-section').get(0),
query: 'select tabBlog.name, title, left(content, 300) as content, tabBlog.modified, \
parent: $(wrapper).find('#blog-list').get(0),
query: 'select tabBlog.name, title, left(content, 1000) as content, tabBlog.modified, \
ifnull(first_name, "") as first_name, ifnull(last_name, "") as last_name \
from tabProfile, tabBlog\
where ifnull(published,1)=1 and tabBlog.owner = tabProfile.name',
where ifnull(published,0)=1 and tabBlog.owner = tabProfile.name',
hide_refresh: true,
no_toolbar: true,
render_row: function(parent, data) {
if(data.content.length==300) data.content += '...';
if(data.content && data.content.length==1000) data.content += '... (read on)';
data.content = wn.markdown(data.content);
if(data.last_name) data.last_name = ' ' + data.last_name;
data.date = prettyDate(data.modified);
parent.innerHTML = repl('<h3><a href="#!%(name)s">%(title)s</a></h3>\
<p><div class="help">By %(first_name)s %(last_name)s on %(date)s</div></p>\
<div class="comment">%(content)s</div><br>', data);
parent.innerHTML = repl('<h2>%(title)s</h2>\
<p><div class="help">By %(first_name)s%(last_name)s, %(date)s</div></p>\
<p>%(content)s</p>\
<a href="#!%(name)s">Read Full Text</a><br>', data);
},
page_length: 10
});

View File

@ -1288,7 +1288,7 @@ LocalDB.delete_doc=function(dt,dn){var doc=get_local(dt,dn);for(var ndt in local
delete locals[dt][dn];}
function get_local(dt,dn){return locals[dt]?locals[dt][dn]:null;}
LocalDB.sync=function(list){if(list._kl)list=expand_doclist(list);for(var i=0;i<list.length;i++){var d=list[i];if(!d.name)
d.name=LocalDB.get_localname(d.doctype);LocalDB.add(d.doctype,d.name);locals[d.doctype][d.name]=d;if(d.doctype=='DocField')wn.meta.add_field(d);if(d.localname){wn.model.new_names[d.localname]=d.name;$(document).trigger('rename',[d.doctype,d.localname,d.name]);delete locals[d.doctype][d.localname];}}}
d.name=LocalDB.get_localname(d.doctype);LocalDB.add(d.doctype,d.name);locals[d.doctype][d.name]=d;if(d.doctype=='DocField')wn.meta.add_field(d);if(d.localname){wn.model.new_names[d.localname]=d.name;console.log(d.localname);$(document).trigger('rename',[d.doctype,d.localname,d.name]);delete locals[d.doctype][d.localname];}}}
local_name_idx={};LocalDB.get_localname=function(doctype){if(!local_name_idx[doctype])local_name_idx[doctype]=1;var n='New '+get_doctype_label(doctype)+' '+local_name_idx[doctype];local_name_idx[doctype]++;return n;}
LocalDB.set_default_values=function(doc){var doctype=doc.doctype;var docfields=wn.meta.docfield_list[doctype];if(!docfields){return;}
var fields_to_refresh=[];for(var fid=0;fid<docfields.length;fid++){var f=docfields[fid];if(!in_list(no_value_fields,f.fieldtype)&&doc[f.fieldname]==null){var v=LocalDB.get_default_value(f.fieldname,f.fieldtype,f['default']);if(v){doc[f.fieldname]=v;fields_to_refresh.push(f.fieldname);}}}
@ -1687,7 +1687,8 @@ this.appframe.add_button('Amend',function(){cur_frm.amend_doc()},'icon-pencil');
/*
* lib/js/legacy/widgets/form/form.js
*/
wn.provide('_f');_f.frms={};_f.Frm=function(doctype,parent){this.docname='';this.doctype=doctype;this.display=0;var me=this;this.is_editable={};this.opendocs={};this.sections=[];this.grids=[];this.cscript={};this.pformat={};this.fetch_dict={};this.parent=parent;this.tinymce_id_list=[];this.setup_meta(doctype);var me=this;$(document).bind('rename',function(event,dt,old_name,new_name){if(dt==me.doctype)
wn.provide('_f');_f.frms={};_f.Frm=function(doctype,parent){this.docname='';this.doctype=doctype;this.display=0;var me=this;this.is_editable={};this.opendocs={};this.sections=[];this.grids=[];this.cscript={};this.pformat={};this.fetch_dict={};this.parent=parent;this.tinymce_id_list=[];this.setup_meta(doctype);var me=this;$(document).bind('rename',function(event,dt,old_name,new_name){console.log(arguments)
if(dt==me.doctype)
me.rename_notify(dt,old_name,new_name)});}
_f.Frm.prototype.check_doctype_conflict=function(docname){var me=this;if(this.doctype=='DocType'&&docname=='DocType'){msgprint('Allowing DocType, DocType. Be careful!')}else if(this.doctype=='DocType'){if(wn.views.formview[docname]){msgprint("Cannot open DocType when its instance is open")
throw'doctype open conflict'}}else{if(wn.views.formview.DocType&&wn.views.formview.DocType.frm.opendocs[this.doctype]){msgprint("Cannot open instance when its DocType is open")
@ -1709,9 +1710,9 @@ _p.show_dialog();}
_f.Frm.prototype.email_doc=function(){if(!_e.dialog)_e.make();sel=this.print_sel;var c=$td(_e.dialog.rows['Format'].tab,0,1);if(c.cur_sel){c.removeChild(c.cur_sel);c.cur_sel=null;}
c.appendChild(this.print_sel);c.cur_sel=this.print_sel;_e.dialog.widgets['Send With Attachments'].checked=0;if(cur_frm.doc.file_list){$ds(_e.dialog.rows['Send With Attachments']);}else{$dh(_e.dialog.rows['Send With Attachments']);}
_e.dialog.widgets['Subject'].value=get_doctype_label(this.meta.name)+': '+this.docname;_e.dialog.show();}
_f.Frm.prototype.rename_notify=function(dt,old,name){this.is_editable[name]=this.is_editable[old];delete this.is_editable[old];if(this.docname==old)
_f.Frm.prototype.rename_notify=function(dt,old,name){if(this.docname==old)
this.docname=name;else
return;if(this&&this.opendocs[old]){local_dt[dt][name]=local_dt[dt][old];local_dt[dt][old]=null;}
return;this.is_editable[name]=this.is_editable[old];delete this.is_editable[old];if(this&&this.opendocs[old]){local_dt[dt][name]=local_dt[dt][old];local_dt[dt][old]=null;}
delete this.opendocs[old];this.opendocs[name]=true;wn.re_route[window.location.hash]='Form/'+encodeURIComponent(this.doctype)+'/'+encodeURIComponent(name);wn.set_route('Form',this.doctype,name);}
_f.Frm.prototype.setup_meta=function(){this.meta=get_local('DocType',this.doctype);this.perm=get_perm(this.doctype);if(this.meta.istable){this.meta.in_dialog=1}
this.setup_print();}
@ -2239,7 +2240,7 @@ show_in_circle('unread_messages',r.message.unread_messages.length);show_in_circl
wn.call({method:'startup.startup.get_global_status_messages',callback:set_messages});}else{wn.container.wntoolbar.set_new_comments(0);$('#unread_messages').toggle(false);}}
erpnext.startup.set_periodic_updates=function(){wn.updates={};if(wn.updates.id){clearInterval(wn.updates.id);}
wn.updates.id=setInterval(update_messages,60000);}
erpnext.set_user_background=function(src){set_style(repl('body { background: url("files/%(src)s") repeat;}',{src:src}))}
erpnext.set_user_background=function(src){set_style(repl('#body_div { background: url("files/%(src)s") repeat;}',{src:src}))}
$(document).bind('startup',function(){erpnext.startup.start();});
/*
* erpnext/startup/js/modules.js

View File

@ -739,7 +739,7 @@ LocalDB.delete_doc=function(dt,dn){var doc=get_local(dt,dn);for(var ndt in local
delete locals[dt][dn];}
function get_local(dt,dn){return locals[dt]?locals[dt][dn]:null;}
LocalDB.sync=function(list){if(list._kl)list=expand_doclist(list);for(var i=0;i<list.length;i++){var d=list[i];if(!d.name)
d.name=LocalDB.get_localname(d.doctype);LocalDB.add(d.doctype,d.name);locals[d.doctype][d.name]=d;if(d.doctype=='DocField')wn.meta.add_field(d);if(d.localname){wn.model.new_names[d.localname]=d.name;$(document).trigger('rename',[d.doctype,d.localname,d.name]);delete locals[d.doctype][d.localname];}}}
d.name=LocalDB.get_localname(d.doctype);LocalDB.add(d.doctype,d.name);locals[d.doctype][d.name]=d;if(d.doctype=='DocField')wn.meta.add_field(d);if(d.localname){wn.model.new_names[d.localname]=d.name;console.log(d.localname);$(document).trigger('rename',[d.doctype,d.localname,d.name]);delete locals[d.doctype][d.localname];}}}
local_name_idx={};LocalDB.get_localname=function(doctype){if(!local_name_idx[doctype])local_name_idx[doctype]=1;var n='New '+get_doctype_label(doctype)+' '+local_name_idx[doctype];local_name_idx[doctype]++;return n;}
LocalDB.set_default_values=function(doc){var doctype=doc.doctype;var docfields=wn.meta.docfield_list[doctype];if(!docfields){return;}
var fields_to_refresh=[];for(var fid=0;fid<docfields.length;fid++){var f=docfields[fid];if(!in_list(no_value_fields,f.fieldtype)&&doc[f.fieldname]==null){var v=LocalDB.get_default_value(f.fieldname,f.fieldtype,f['default']);if(v){doc[f.fieldname]=v;fields_to_refresh.push(f.fieldname);}}}
@ -847,7 +847,7 @@ show_in_circle('unread_messages',r.message.unread_messages.length);show_in_circl
wn.call({method:'startup.startup.get_global_status_messages',callback:set_messages});}else{wn.container.wntoolbar.set_new_comments(0);$('#unread_messages').toggle(false);}}
erpnext.startup.set_periodic_updates=function(){wn.updates={};if(wn.updates.id){clearInterval(wn.updates.id);}
wn.updates.id=setInterval(update_messages,60000);}
erpnext.set_user_background=function(src){set_style(repl('body { background: url("files/%(src)s") repeat;}',{src:src}))}
erpnext.set_user_background=function(src){set_style(repl('#body_div { background: url("files/%(src)s") repeat;}',{src:src}))}
$(document).bind('startup',function(){erpnext.startup.start();});
/*
* erpnext/website/js/topbar.js
@ -870,8 +870,7 @@ for(var i=0;i<items.length;i++){var item=items[i];if(item.parent_label&&item.par
item.route=item.url||item.custom_page;$parent_li.find('.dropdown-menu').append(repl('<li data-label="%(label)s">\
<a href="#!%(route)s">%(label)s</a></li>',item))}}}});erpnext.Footer=Class.extend({init:function(){$('footer').html(repl('<div class="web-footer">\
<div class="web-footer-menu"><ul></ul></div>\
<div class="web-footer-address">%(address)s</div>\
<div class="web-footer-copyright">&copy; %(copyright)s</div>\
<div class="web-footer-copyright">&copy; %(copyright)s | %(address)s</div>\
<div class="web-footer-powered">Powered by \
<a href="https://erpnext.com">erpnext.com</a></div>\
</div>',wn.boot.website_settings));this.make_items();},make_items:function(){var items=wn.boot.website_menus