Dropped many columns for Prodct Table.

Merged product and account menu on page top.
Product working now.
This commit is contained in:
Tanshu
2012-10-12 02:30:36 +05:30
parent a71999e3c8
commit eb8568b471
29 changed files with 312 additions and 235 deletions

View File

@ -135,6 +135,7 @@ def main(global_config, **settings):
config.add_route('user_permissions', '/Permissions')
config.add_route('account_type_list', '/AccountTypes')
config.add_route('product_group_list', '/ProductGroups')
config.add_route('services_batch_list', '/Services/Batches')
config.add_route('services_batch_add_inventory', '/Services/AddBatch')

View File

@ -1,6 +1,6 @@
import string
from brewman.views.nav_bar import login_menu, report_menu, voucher_menu, entry_menu, employee_menu, account_menu, product_menu
from brewman.views.nav_bar import login_menu, report_menu, voucher_menu, entry_menu, employee_menu, master_menu
class Form(object):
"""Make absolute URL from the relative one.

View File

@ -19,26 +19,18 @@ class Product(Base):
yeild = Column('Yeild', Numeric)
show_for_purchase = Column('ShowForPurchase', Boolean)
product_group_id = Column('ProductGroupID', GUID(), ForeignKey('entities_productgroups.ProductGroupID'))
sale_ledger_id = Column('SaleLedgerID', GUID(), ForeignKey('entities_ledgers.LedgerID'))
sale_tax_id = Column('SaleTaxID', GUID(), ForeignKey('entities_taxes.TaxID'))
sale_price = Column('SalePrice', Numeric)
purchase_ledger_id = Column('PurchaseLedgerID', GUID(), ForeignKey('entities_ledgers.LedgerID'))
purchase_tax_id = Column('PurchaseTaxID', GUID(), ForeignKey('entities_taxes.TaxID'))
purchase_price = Column('PurchasePrice', Numeric)
ledger_id = Column('LedgerID', GUID(), ForeignKey('entities_ledgers.LedgerID'))
price = Column('Price', Numeric)
discontinued = Column('Discontinued', Boolean)
batches = relationship('Batch', backref='product')
inventories = relationship('Inventory', backref='product')
sale_ledger = relationship('Ledger', primaryjoin="Ledger.id==Product.sale_ledger_id")
sale_tax = relationship('Tax', primaryjoin="Tax.id==Product.sale_tax_id")
purchase_ledger = relationship('Ledger', primaryjoin="Ledger.id==Product.purchase_ledger_id")
purchase_tax = relationship('Tax', primaryjoin="Tax.id==Product.purchase_tax_id")
ledger = relationship('Ledger', primaryjoin="Ledger.id==Product.ledger_id")
def __init__(self, code=None, name=None, units=None, fraction=None, fraction_units=None, yeild=None,
show_for_purchase=None, product_group_id=None, sale_ledger_id=None, sale_tax_id=None, sale_price=None,
purchase_ledger_id=None, purchase_tax_id=None, purchase_price=None, discontinued=None):
show_for_purchase=None, product_group_id=None, ledger_id=None, price=None, discontinued=None):
self.code = code
self.name = name
self.units = units
@ -47,12 +39,8 @@ class Product(Base):
self.yeild = yeild
self.show_for_purchase = show_for_purchase
self.product_group_id = product_group_id
self.sale_ledger_id = sale_ledger_id
self.sale_tax_id = sale_tax_id
self.sale_price = sale_price
self.purchase_ledger_id = purchase_ledger_id
self.purchase_tax_id = purchase_tax_id
self.purchase_price = purchase_price
self.ledger_id = ledger_id
self.price = price
self.discontinued = discontinued
@property
@ -94,6 +82,10 @@ class ProductGroup(Base):
def __init__(self, name=None):
self.name = name
@classmethod
def list(cls):
return DBSession.query(cls).order_by(cls.name)
class CostCenter(Base):
__tablename__ = 'entities_costcenters'

View File

@ -28,7 +28,7 @@
<div class="control-group">
<div class="controls">
<label class="checkbox">
<input type="checkbox" ng-checked="account.IsActive"> Is Active
<input type="checkbox" ng-model="account.IsActive"> Is Active
</label>
</div>
</div>

View File

@ -1,4 +1,4 @@
<legend>Accounts</legend>
<legend>Accounts <a href="/Account" class="btn btn-success pull-right">Add <i class="icon-plus icon-white"></i></a></legend>
<table class="clean-table" ng-controller="AccountListCtrl">
<thead>
<tr>

View File

@ -1,4 +1,4 @@
<legend>Cost Centers</legend>
<legend>Cost Centers <a href="/CostCenter" class="btn btn-success pull-right">Add <i class="icon-plus icon-white"></i></a></legend>
<table class="clean-table" ng-controller="CostCenterListCtrl">
<thead>
<tr>

View File

@ -0,0 +1,88 @@
<form method="post" class="form-horizontal" ng-controller="ProductCtrl">
<legend>Product Detail</legend>
<div class="control-group">
<label for="txtCode" class="control-label">Code</label>
<div class="controls">
<input type="text" id="txtCode" class="non-search-box" disabled="disabled" ng-model="product.Code"/>
</div>
</div>
<div class="control-group">
<label for="txtName" class="control-label">Name</label>
<div class="controls">
<input type="text" id="txtName" ng-model="product.Name"/>
</div>
</div>
<div class="control-group">
<label for="txtUnits" class="control-label">Units</label>
<div class="controls">
<input type="text" id="txtUnits" ng-model="product.Units"/>
</div>
</div>
<div class="control-group">
<label for="txtPrice" class="control-label">Price</label>
<div class="controls">
<input type="text" id="txtPrice" ng-model="product.Price"/>
</div>
</div>
<div class="control-group">
<label for="txtFraction" class="control-label">Fraction</label>
<div class="controls">
<input type="text" id="txtFraction" ng-model="product.Fraction"/>
</div>
</div>
<div class="control-group">
<label for="txtFractionUnits" class="control-label">FractionUnits</label>
<div class="controls">
<input type="text" id="txtFractionUnits" ng-model="product.FractionUnits"/>
</div>
</div>
<div class="control-group">
<label for="txtYeild" class="control-label">Yeild</label>
<div class="controls">
<input type="text" id="txtYeild" ng-model="product.Yeild"/>
</div>
</div>
<div class="control-group">
<div class="controls">
<label class="checkbox">
<input type="checkbox" ng-model="product.ShowForPurchase"> Show for Purchase
</label>
</div>
</div>
<div class="control-group">
<div class="controls">
<label class="checkbox">
<input type="checkbox" ng-model="product.Discontinued"> Discontinued
</label>
</div>
</div>
<div class="control-group">
<label for="ddlType" class="control-label">Type</label>
<div class="controls">
<select id="ddlType" class="select-box" ng-model="product.ProductGroup.ProductGroupID"
ng-options="l.ProductGroupID as l.Name for l in product_groups"> </select>
</div>
</div>
<div class=" control-group">
<div class="controls">
<button ng-click="save()">Save</button>
</div>
</div>
</form>

View File

@ -0,0 +1,21 @@
<legend>Products <a href="/Product" class="btn btn-success pull-right">Add <i class="icon-plus icon-white"></i></a></legend>
<table class="clean-table" ng-controller="ProductListCtrl">
<thead>
<tr>
<th>Code</th>
<th>Name</th>
<th>Price</th>
<th>Type</th>
<th>Discontinued</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="item in info">
<td>{{item.Code}}</td>
<td><a href="{{item.Url}}">{{item.Name}} ({{item.Units}})</a></td>
<td>₹ {{item.Price}}</td>
<td>{{item.ProductGroup}}</td>
<td>{{item.Discontinued}}</td>
</tr>
</tbody>
</table>

View File

@ -20,7 +20,7 @@
<div class="control-group">
<div class="controls">
<label class="checkbox">
<input type="checkbox" ng-checked="user.LockedOut"> Locked Out
<input type="checkbox" ng-model="user.LockedOut"> Locked Out
</label>
</div>
</div>

View File

@ -1,4 +1,4 @@
<legend>Accounts</legend>
<legend>Users <a href="/User" class="btn btn-success pull-right">Add <i class="icon-plus icon-white"></i></a></legend>
<table class="clean-table" ng-controller="UserListCtrl">
<thead>
<tr>
@ -19,3 +19,4 @@
</tr>
</tbody>
</table>

View File

@ -2,7 +2,7 @@
$scope.info = Account.query();
}
function AccountCtrl($scope, $routeParams, Account, AccountType, CostCenter) {
function AccountCtrl($scope, $routeParams, $location, Account, AccountType, CostCenter) {
$scope.account = Account.get({id: $routeParams.id});
$scope.account_types = AccountType.query();
@ -11,6 +11,7 @@ function AccountCtrl($scope, $routeParams, Account, AccountType, CostCenter) {
$scope.save = function () {
$scope.account.$save(function (u, putResponseHeaders) {
$scope.toasts.push({Type:'Success', Message:u.Code});
$location.path('/Accounts')
}, function (data, status) {
$scope.toasts.push({Type:'Error', Message:data.data});
});
@ -19,10 +20,11 @@ function AccountCtrl($scope, $routeParams, Account, AccountType, CostCenter) {
$scope.delete = function () {
$scope.account.$delete(function (u, putResponseHeaders) {
$scope.toasts.push({Type:'Success', Message:''});
$location.path('/Accounts')
}, function (data, status) {
$scope.toasts.push({Type:'Error', Message:data.data});
});
};
$('#txtLedger').focus();
$('#txtName').focus();
}

View File

@ -119,3 +119,16 @@ overlord_service.factory('User', ['$resource', function ($resource) {
});
}]);
// TODO: Replace hardcoded url with route_url
overlord_service.factory('Product', ['$resource', function ($resource) {
return $resource('/Product/:id',
{id:'@ProductID'}, {
query:{method:'GET', params:{list:true}, isArray:true}
});
}]);
// TODO: Replace hardcoded url with route_url
overlord_service.factory('ProductGroup', ['$resource', function ($resource) {
return $resource('/ProductGroups');
}]);

View File

@ -5,12 +5,19 @@
when('/Journal/:id', {templateUrl: '/partial/journal.html', controller: JournalCtrl}).
when('/Accounts', {templateUrl: '/partial/account-list.html', controller: AccountListCtrl}).
when('/Account', {templateUrl: '/partial/account-detail.html', controller: AccountCtrl}).
when('/Account/:id', {templateUrl: '/partial/account-detail.html', controller: AccountCtrl}).
when('/CostCenters', {templateUrl: '/partial/cost-center-list.html', controller: CostCenterListCtrl}).
when('/CostCenter', {templateUrl: '/partial/cost-center-detail.html', controller: CostCenterCtrl}).
when('/CostCenter/:id', {templateUrl: '/partial/cost-center-detail.html', controller: CostCenterCtrl}).
when('/Products', {templateUrl: '/partial/product-list.html', controller: ProductListCtrl}).
when('/Product', {templateUrl: '/partial/product-detail.html', controller: ProductCtrl}).
when('/Product/:id', {templateUrl: '/partial/product-detail.html', controller: ProductCtrl}).
when('/Users', {templateUrl: '/partial/user-list.html', controller: UserListCtrl}).
when('/User', {templateUrl: '/partial/user-detail.html', controller: UserCtrl}).
when('/User/:id', {templateUrl: '/partial/user-detail.html', controller: UserCtrl});
// .otherwise({redirectTo: '/phones'});
$locationProvider.html5Mode(true);

View File

@ -22,6 +22,6 @@ function CostCenterCtrl($scope, $routeParams, $location, CostCenter) {
$scope.toasts.push({Type:'Error', Message:data.data});
});
};
$('#txtLedger').focus();
$('#txtName').focus();
}

View File

@ -2,7 +2,6 @@
if (typeof $routeParams.id === 'undefined'){
$scope.voucher = Voucher.get({type:'Journal'});
} else {
console.log('getting voucher' + $routeParams.id)
$scope.voucher = Voucher.get({id:$routeParams.id});
}

View File

@ -1,73 +1,28 @@
function GetProducts(productGroupID, page) {
if (productGroupID == -1) {
productGroupID = product_group_id;
}
product_group_id = productGroupID;
if (page == 0) {
page = 1;
}
else {
page = product_page + page;
if (page < 1){
page = 1
}
}
product_page = page;
$.ajax({
type:"POST",
url:products_route,
contentType:"application/json; charset=utf-8",
data:JSON.stringify({ productGroupID:productGroupID, page_size:product_page_size, page:page }),
dataType:"json",
success:function (response) {
var rows = "";
$.each(response, function (index, row) {
rows += "<li><div class=\"thumbnail\"><button onclick=\"return GetProducts('" + row.id + "', '');\" class=\"btn btn-large btn-success\">" + row.name + "</button></div></li>";
})
$("#products").html(rows);
},
error:ShowError
});
return false;
function ProductListCtrl($scope, Product) {
$scope.info = Product.query();
}
function ProductCtrl($scope, $routeParams, $location, Product, ProductGroup) {
$scope.product = Product.get({id:$routeParams.id});
$scope.product_groups = ProductGroup.query();
function GetProductGroups(page) {
if (page == 0) {
page = 1;
}
else {
page = product_group_page + page;
if (page < 1){
page = 1
}
}
product_group_page = page;
$.ajax({
type:"POST",
url:product_groups_route,
contentType:"application/json; charset=utf-8",
data:JSON.stringify({ page_size:product_group_page_size, page:page }),
dataType:"json",
success:function (response) {
var rows = "";
$.each(response, function (index, row) {
rows += "<li><div class=\"thumbnail\"><button onclick=\"return GetProducts(" + row.id + ", 0);\" class=\"btn btn-large btn-success\">" + row.name + "</button></div></li>";
})
$scope.save = function () {
$scope.product.$save(function (u, putResponseHeaders) {
$scope.toasts.push({Type:'Success', Message:u.Code});
$location.path('/Products')
}, function (data, status) {
$scope.toasts.push({Type:'Error', Message:data.data});
});
};
$scope.delete = function () {
$scope.product.$delete(function (u, putResponseHeaders) {
$scope.toasts.push({Type:'Success', Message:''});
$location.path('/Products')
}, function (data, status) {
$scope.toasts.push({Type:'Error', Message:data.data});
});
};
$('#txtName').focus();
$("#product_groups").html(rows);
},
error:function (jqXHR, textStatus) {
var msg = jqXHR.responseText;
$("#status").append('<div id="status" class="alert alert-error"><button class="close" data-dismiss="alert">×</button> <strong>Error!</strong> ' + msg + '</div>');
}
});
return false;
}
function ShowError(jqXHR, textStatus) {
var msg = jqXHR.responseText;
$("#status").append('<div id="status" class="alert alert-error"><button class="close" data-dismiss="alert">×</button> <strong>Error!</strong> ' + msg + '</div>');
}

View File

@ -2,12 +2,13 @@
$scope.info = User.query();
}
function UserCtrl($scope, $routeParams, User) {
function UserCtrl($scope, $routeParams, $location, User) {
$scope.user = User.get({id: $routeParams.id});
$scope.save = function () {
$scope.user.$save(function (u, putResponseHeaders) {
$scope.toasts.push({Type:'Success', Message:u.Code});
$location.path('/Users')
}, function (data, status) {
$scope.toasts.push({Type:'Error', Message:data.data});
});
@ -16,6 +17,7 @@ function UserCtrl($scope, $routeParams, User) {
$scope.delete = function () {
$scope.user.$delete(function (u, putResponseHeaders) {
$scope.toasts.push({Type:'Success', Message:''});
$location.path('/Users')
}, function (data, status) {
$scope.toasts.push({Type:'Error', Message:data.data});
});

View File

@ -42,6 +42,7 @@
${h.ScriptLink(request, 'account.js')}
${h.ScriptLink(request, 'user.js')}
${h.ScriptLink(request, 'cost-center.js')}
${h.ScriptLink(request, 'product.js')}
<!-- Le fav and touch icons -->
<link rel="shortcut icon" href="${request.static_url('brewman:static/img/favicon.ico')}">
@ -75,8 +76,7 @@
${h.report_menu(request) | n }
${h.entry_menu(request) | n }
${h.employee_menu(request) | n }
${h.account_menu(request) | n }
${h.product_menu(request) | n }
${h.master_menu(request) | n }
${h.login_menu(request) | n }
</div>
<!--/.nav-collapse -->

View File

@ -35,8 +35,13 @@
${h.ScriptLink(request, 'angular_filter.js')}
${h.ScriptLink(request, 'angular_service.js')}
${h.ScriptLink(request, 'session.js')}
${h.ScriptLink(request, 'journal.js')}
${h.ScriptLink(request, 'account.js')}
${h.ScriptLink(request, 'user.js')}
${h.ScriptLink(request, 'cost-center.js')}
${h.ScriptLink(request, 'product.js')}
<%block name="header" />
@ -72,8 +77,7 @@
${h.report_menu(request) | n }
${h.entry_menu(request) | n }
${h.employee_menu(request) | n }
${h.account_menu(request) | n }
${h.product_menu(request) | n }
${h.master_menu(request) | n }
${h.login_menu(request) | n }
</div>
<!--/.nav-collapse -->

View File

@ -1,10 +0,0 @@
<ul class="nav">
<li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">Accounts <b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="${request.route_url('account_list')}">Accounts List</a></li>
<li><a href="${request.route_url('account')}">Add New Account</a></li>
<li><a href="${request.route_url('cost_center_list')}">Cost Center List</a></li>
<li><a href="${request.route_url('cost_center')}">Add Cost Center</a></li>
</ul>
</li>
</ul>

View File

@ -0,0 +1,9 @@
<ul class="nav">
<li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">Masters <b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="${request.route_url('account_list')}">Accounts</a></li>
<li><a href="${request.route_url('cost_center_list')}">Cost Centers</a></li>
<li><a href="${request.route_url('product_list')}">Products</a></li>
</ul>
</li>
</ul>

View File

@ -1,9 +0,0 @@
<ul class="nav">
<li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">Product <b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="${request.route_url('product_list')}">Product List</a></li>
<li><a href="${request.route_url('product')}">Add Product</a></li>
<li><a href="${request.route_url('product')}">Recipe List</a></li>
</ul>
</li>
</ul>

View File

@ -1,38 +0,0 @@
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:tal="http://xml.zope.org/namespaces/tal"
xmlns:metal="http://xml.zope.org/namespaces/metal"
metal:use-macro="base">
<tal:block metal:fill-slot="content">
<article tal:attributes="class pagecontentclass">
<section>
<h2 class="ribbon-header">Products</h2>
<table id="gvGrid" class="clean-table">
<thead>
<tr>
<th class="id hide">Product ID</th>
<th class="code hide">Code</th>
<th class="name">Name</th>
<th class="units">Units</th>
<th class="group">Group</th>
<th class="discontinued">Discontinued?</th>
</tr>
</thead>
<tbody id="tbodyMain">
<tr tal:repeat="item list">
<td class="id hide">${item.id}</td>
<td class="code hide">${item.code}</td>
<td class="name"><a href="${request.route_url('product_id', id=item.id)}">${item.name}</a></td>
<td class="units">${item.units}</td>
<td class="group">${item.product_group.name}</td>
<td class="IsActive">${item.discontinued}</td>
</tr>
</tbody>
<tfoot id="tfootMain">
</tfoot>
</table>
</section>
</article>
<!-- /Page content -->
</tal:block>
</html>

View File

@ -22,7 +22,7 @@ def save_update(request):
try:
id = request.matchdict.get('id', None)
if id is None:
Ledger(0, request.json_body['Name'], int(request.json_body['Type']), request.json_body['IsActive'],
item = Ledger(0, request.json_body['Name'], int(request.json_body['Type']), request.json_body['IsActive'],
uuid.UUID(request.json_body['CostCenter']['CostCenterID'])).create()
else:
new_type = int(request.json_body['Type'])
@ -35,8 +35,6 @@ def save_update(request):
item.costcenter_id = uuid.UUID(request.json_body['CostCenter']['CostCenterID'])
transaction.commit()
return account_info(item.id)
# url = request.route_url('account_list')
# return HTTPFound(location=url)
except ValidationError as ex:
transaction.abort()
response = Response("Failed validation: {0}".format(ex.message))

View File

@ -85,13 +85,15 @@ def show(request):
def user_info(id):
if id is None:
return {'Name': '', 'LockedOut': False, 'Groups': []}
account = {'Name': '', 'LockedOut': False, 'Groups': []}
for item in Group.list():
account['Groups'].append({'GroupID': item.id, 'Name': item.name, 'Enabled': False})
else:
user = User.get_by_id(id)
account = {'UserID': user.id, 'Name': user.name, 'Password': '', 'LockedOut': user.locked_out, 'Groups': []}
for item in Group.list():
account['Groups'].append(
{'GroupID': item.id, 'Name': item.name, 'Enabled': True if item in user.groups else False})
return account
return account

View File

@ -23,14 +23,12 @@ def save_update(request):
try:
id = request.matchdict.get('id', None)
if id is None:
CostCenter(0, request.json_body['Name']).create()
item = CostCenter(0, request.json_body['Name']).create()
else:
item = CostCenter.by_id(uuid.UUID(id))
item.name = request.json_body['Name']
transaction.commit()
return cost_center_info(item.id)
# url = request.route_url('account_list')
# return HTTPFound(location=url)
except ValidationError as ex:
transaction.abort()
response = Response("Failed validation: {0}".format(ex.message))

View File

@ -18,11 +18,8 @@ def entry_menu(request):
def employee_menu(request):
return render('brewman:templates/nav_bar/employee.pt', {'request': request})
def account_menu(request):
return render('brewman:templates/nav_bar/account.mako', {'request': request})
def product_menu(request):
return render('brewman:templates/nav_bar/product.pt', {'request': request})
def master_menu(request):
return render('brewman:templates/nav_bar/master.mako', {'request': request})
def login_menu(request):
user_id = authenticated_userid(request)

View File

@ -1,83 +1,104 @@
import datetime
from decimal import Decimal
import uuid
from pyramid.httpexceptions import HTTPFound
from pyramid.renderers import render
from pyramid.security import authenticated_userid
from pyramid.view import view_config
from sqlalchemy.sql.expression import or_
import transaction
from brewman.helpers import Literal
from brewman.models import DBSession
from brewman.models.master import Product, CostCenter, Employee, AttendanceType, LedgerType
from brewman.models.master import Product, CostCenter, LedgerType, Ledger, ProductGroup
from brewman.models.validation_exception import ValidationError
from brewman.models.voucher import Attendance
@view_config(request_method='GET', route_name='product_id', renderer='brewman:templates/product/edit.pt',
permission='ProductsUpdate')
@view_config(request_method='GET', route_name='product', renderer='brewman:templates/product/edit.pt',
permission='ProductsCreate')
def product_edit(request):
id = request.matchdict.get('id', None)
if id is None:
item = Employee('(Auto)', '')
else:
item = Product.by_id(uuid.UUID(id))
print(item.code)
return {'title': 'Edit / Add Product',
'pageclass': "page-blogpost page-sidebar-right",
'pagecontentclass': "page-content grid_12",
'page_header': '',
'item': item,
'types': LedgerType.list(),
'cost_centers': CostCenter.list()}
@view_config(route_name='product_list', renderer='brewman:templates/angular_base.mako', permission='Products')
@view_config(request_method='GET', route_name='product_id', renderer='brewman:templates/angular_base.mako',
xhr=False, permission='ProductsUpdate')
@view_config(request_method='GET', route_name='product', renderer='brewman:templates/angular_base.mako',
xhr=False, permission='ProductsUpdate')
def html(request):
return {}
@view_config(request_method='POST', route_name='product_id', permission='ProductsUpdate')
@view_config(request_method='POST', route_name='product', permission='ProductsCreate')
def employee_submit(request):
@view_config(request_method='POST', route_name='product_id', renderer='json', xhr=True)
@view_config(request_method='POST', route_name='product', renderer='json', xhr=True)
def save_update(request):
try:
id = request.matchdict.get('id', None)
if id is None:
is_active = True if request.POST.has_key('is_active') else False
joining_date = datetime.datetime.strptime(request.POST['joining_date'], '%d-%b-%Y')
leaving_date = None if is_active else datetime.datetime.strptime(request.POST['leaving_date'], '%d-%b-%Y')
Employee(0, request.POST['name'], 10, None, is_active, uuid.UUID(request.POST['cost_center_id']),
request.POST['designation'], int(request.POST['salary']), int(request.POST['service_points']),
joining_date, leaving_date).create()
request.session.flash('Employee created')
item = Product(0, request.json_body['Name'], request.json_body['Units'],
Decimal(request.json_body['Fraction']), request.json_body['FractionUnits'],
Decimal(request.json_body['Yeild']), request.json_body['ShowForPurchase'],
uuid.UUID(request.json_body['ProductGroup']['ProductGroupID']), Ledger.all_purchases(),
Decimal(request.json_body['Price']), request.json_body['Discontinued']).create()
else:
item = Employee.by_id(uuid.UUID(id))
item.name = request.POST['name']
item.is_active = True if request.POST.has_key('is_active') else False
item.costcenter_id = uuid.UUID(request.POST['cost_center_id'])
item.designation = request.POST['designation']
item.salary = int(request.POST['salary'])
item.service_points = int(request.POST['service_points'])
item.joining_date = datetime.datetime.strptime(request.POST['joining_date'], '%d-%b-%Y')
item.leaving_date = None if item.is_active else datetime.datetime.strptime(request.POST['leaving_date'],
'%d-%b-%Y')
request.session.flash('Employee Updated')
item = Product.by_id(uuid.UUID(id))
item.name = request.json_body['Name']
item.units = request.json_body['Units']
item.fraction = Decimal(request.json_body['Fraction'])
item.fraction_units = request.json_body['FractionUnits']
item.yeild = Decimal(request.json_body['Yeild'])
item.show_for_purchase = request.json_body['ShowForPurchase']
item.product_group_id = uuid.UUID(request.json_body['ProductGroup']['ProductGroupID'])
item.ledger_id = Ledger.all_purchases()
item.price = Decimal(request.json_body['Price'])
item.discontinued = request.json_body['Discontinued']
transaction.commit()
url = request.route_url('employee_list')
return HTTPFound(location=url)
return product_info(item.id)
except ValidationError as ex:
request.session.flash(ex)
transaction.abort()
request.session.flash(ex.message)
return request
response = Response("Failed validation: {0}".format(ex.message))
response.status_int = 500
return response
@view_config(route_name='product_list', renderer='brewman:templates/product/list.pt', permission='Products')
def employee_list(request):
dbsession = DBSession()
list = dbsession.query(Product)\
.order_by(Product.discontinued)\
.all()
@view_config(request_method='DELETE', route_name='product_id', renderer='json', xhr=True)
def delete(request):
id = request.matchdict.get('id', None)
if id is None:
response = Response("Product is Null")
response.status_int = 500
return response
else:
response = Response("Product deletion not implemented")
response.status_int = 500
return response
return {'title': 'Products',
'pageclass': "page-blogpost page-sidebar-right",
'pagecontentclass': "page-content grid_12",
'page_header': '',
'list': list}
@view_config(request_method='GET', route_name='product_id', renderer='json', xhr=True)
@view_config(request_method='GET', route_name='product', renderer='json', xhr=True)
def show(request):
list = request.GET.get('list', None)
if list:
list = Product.query().order_by(Product.discontinued).order_by(Product.product_group_id).order_by(
Product.name).all()
products = []
for item in list:
products.append({'Code': item.code, 'Name': item.name, 'Units': item.units, 'Price': item.price,
'ProductGroup': item.product_group.name, 'Discontinued': item.discontinued,
'Url': request.route_url('product_id', id=item.id)})
return products
else:
id = request.matchdict.get('id', None)
id = None if id is None else uuid.UUID(id)
return product_info(id)
@view_config(request_method='GET', route_name='product_group_list', renderer='json', xhr=True)
def product_group_list(request):
product_groups = []
for item in ProductGroup.list():
product_groups.append({'ProductGroupID': item.id, 'Name': item.name})
return product_groups
def product_info(id):
if id is None:
product = {'Code': '(Auto)', 'Type': LedgerType.by_name('Creditors').id, 'IsActive': True,
'CostCenter': CostCenter.overall()}
else:
product = Product.by_id(id)
product = {'ProductID': product.id, 'Code': product.code, 'Name': product.name, 'Units': product.units,
'Fraction': product.fraction, 'FractionUnits': product.fraction_units, 'Yeild': product.yeild,
'ShowForPurchase': product.show_for_purchase, 'Discontinued': product.discontinued,
'ProductGroup': {'ProductGroupID': product.product_group_id},
'Ledger': {'LedgerID': product.ledger_id}, 'Price': product.price}
return product