Auth Group done.

Employee done.
ACL dynamically done.
VoucherFactory to be done.
This commit is contained in:
Tanshu 2012-10-23 17:09:55 +05:30
parent 4ffa033fd3
commit 27c97cbf88
53 changed files with 531 additions and 406 deletions

@ -1,3 +1,4 @@
UPDATE Auth_Roles Set Name = 'Users' WHERE Name = 'CreateUser'
--update entities_ledgers set code = code + 60 where type = 13; -- to prevent duplicate code when converting
UPDATE entities_ledgers SET type = 11 WHERE type = 13;
DROP TABLE Entities_Taxes;

@ -54,10 +54,18 @@ def main(global_config, **settings):
config.add_route('account', '/Account')
config.add_route('account_list', '/Accounts')
config.add_route('employee_id', '/Employee/{id}')
config.add_route('employee', '/Employee')
config.add_route('employee_list', '/Employees')
config.add_route('user_id', '/User/{id}')
config.add_route('user', '/User')
config.add_route('user_list', '/Users')
config.add_route('group_id', '/Group/{id}')
config.add_route('group', '/Group')
config.add_route('group_list', '/Groups')
config.add_route('product_id', '/Product/{id}')
config.add_route('product', '/Product')
config.add_route('product_list', '/Products')
@ -66,16 +74,11 @@ def main(global_config, **settings):
config.add_route('product_group', '/ProductGroup')
config.add_route('product_group_list', '/ProductGroups')
config.add_route('employee_attendance_save', '/Employee/Attendance/Save')
config.add_route('employee_attendance', '/Employee/Attendance')
config.add_route('employee_id', '/Employee/{id}')
config.add_route('employee_attendance_id', '/Employee/{id}/Attendance')
config.add_route('employee', '/Employee')
config.add_route('employee_list', '/Employees')
config.add_route('attendance_save', '/Attendance/Save')
config.add_route('attendance_date', '/Attendance/{date}')
config.add_route('attendance', '/Attendance')
@ -115,10 +118,7 @@ def main(global_config, **settings):
config.add_route('daybook', '/Daybook')
config.add_route('unposted', '/Unposted')
config.add_route('profit_loss', '/ProfitLoss')
config.add_route('group_roles_id', '/Admin/GroupRoles/{id}')
config.add_route('group_roles', '/Admin/GroupRoles')
config.add_route('save_group_roles', '/Admin/GroupRolesSave')
config.add_route('purchase_entries', '/PurchaseEntries')
config.add_route('services_session_current_date', '/Services/CurrentDate')
config.add_route('services_session_period_start', '/Services/PeriodStart')

@ -1,77 +1,17 @@
from pyramid.security import Everyone
from pyramid.security import Authenticated
from pyramid.security import Allow
from brewman.models.auth import Role
class RootFactory(object):
__acl__ = [
(Allow, Everyone, 'view'),
(Allow, Authenticated, 'post'),
(Allow, 'Attendance', 'Attendance'),
(Allow, 'BalanceSheet', 'BalanceSheet'),
(Allow, 'Cash Flow', 'Cash Flow'),
(Allow, 'CostCenter', 'CostCenter'),
(Allow, 'CostCenterCreate', 'CostCenterCreate'),
(Allow, 'CostCenterDelete', 'CostCenterDelete'),
(Allow, 'CostCenterRetrieve', 'CostCenterRetrieve'),
(Allow, 'CostCenterUpdate', 'CostCenterUpdate'),
(Allow, 'CreateUser', 'CreateUser'),
(Allow, 'DayBook', 'DayBook'),
(Allow, 'EditPosted', 'EditPosted'),
(Allow, 'Employees', 'Employees'),
(Allow, 'EmployeesCreate', 'EmployeesCreate'),
(Allow, 'EmployeesDelete', 'EmployeesDelete'),
(Allow, 'EmployeesRetrieve', 'EmployeesRetrieve'),
(Allow, 'EmployeesUpdate', 'EmployeesUpdate'),
(Allow, 'Finger Prints', 'Finger Prints'),
(Allow, 'Issue', 'Issue'),
(Allow, 'Issue Create', 'Issue Create'),
(Allow, 'Issue Delete', 'Issue Delete'),
(Allow, 'Issue Post', 'Issue Post'),
(Allow, 'Issue Update', 'Issue Update'),
(Allow, 'Journal', 'Journal'),
(Allow, 'Journal Create', 'Journal Create'),
(Allow, 'Journal Delete', 'Journal Delete'),
(Allow, 'Journal Post', 'Journal Post'),
(Allow, 'Journal Update', 'Journal Update'),
(Allow, 'Ledgers', 'Ledgers'),
(Allow, 'LedgersCreate', 'LedgersCreate'),
(Allow, 'LedgersDelete', 'LedgersDelete'),
(Allow, 'LedgersRetrieve', 'LedgersRetrieve'),
(Allow, 'LedgersUpdate', 'LedgersUpdate'),
(Allow, 'ManageRoles', 'ManageRoles'),
(Allow, 'OldTransactions', 'OldTransactions'),
(Allow, 'Payment', 'Payment'),
(Allow, 'Payment Create', 'Payment Create'),
(Allow, 'Payment Delete', 'Payment Delete'),
(Allow, 'Payment Post', 'Payment Post'),
(Allow, 'Payment Update', 'Payment Update'),
(Allow, 'PostTransactions', 'PostTransactions'),
(Allow, 'Products', 'Products'),
(Allow, 'ProductsCreate', 'ProductsCreate'),
(Allow, 'ProductsDelete', 'ProductsDelete'),
(Allow, 'ProductsRetrieve', 'ProductsRetrieve'),
(Allow, 'ProductsUpdate', 'ProductsUpdate'),
(Allow, 'ProfitAndLoss', 'ProfitAndLoss'),
(Allow, 'Purchase', 'Purchase'),
(Allow, 'Purchase Create', 'Purchase Create'),
(Allow, 'Purchase Delete', 'Purchase Delete'),
(Allow, 'Purchase Post', 'Purchase Post'),
(Allow, 'Purchase Update', 'Purchase Update'),
(Allow, 'PurchaseReturn', 'PurchaseReturn'),
(Allow, 'PurchaseReturn Create', 'PurchaseReturn Create'),
(Allow, 'PurchaseReturn Delete', 'PurchaseReturn Delete'),
(Allow, 'PurchaseReturn Post', 'PurchaseReturn Post'),
(Allow, 'PurchaseReturn Update', 'PurchaseReturn Update'),
(Allow, 'Receipt', 'Receipt'),
(Allow, 'Receipt Create', 'Receipt Create'),
(Allow, 'Receipt Delete', 'Receipt Delete'),
(Allow, 'Receipt Post', 'Receipt Post'),
(Allow, 'Receipt Update', 'Receipt Update'),
(Allow, 'Verification', 'Verification'),
(Allow, 'Verification Create', 'Verification Create'),
(Allow, 'Verification Delete', 'Verification Delete'),
(Allow, 'Verification Post', 'Verification Post'),
(Allow, 'Verification Update', 'Verification Update')
]
@property
def __acl__(self):
acl = [
(Allow, Everyone, 'view'),
(Allow, Authenticated, 'post')]
for permission in Role.list():
acl.append((Allow, permission.name, permission.name))
print(acl)
return acl
def __init__(self, request):
pass

@ -1,6 +1,19 @@
import uuid
from pyramid.security import Allow, ALL_PERMISSIONS
from brewman.models.auth import User
class VoucherFactory(object):
__acl__ = []
def __init__(self, request):
self.request = request
def __getitem__(self, key):
user = USERS[key]
user.__parent__ = self
user.__name__ = key
return user
def groupfinder(user_id, request):
perms = []
if 'perms' in request.session:
@ -12,6 +25,7 @@ def groupfinder(user_id, request):
perms.append(perm.name)
perms = f7(perms)
request.session['perms'] = perms
print(perms)
return perms

@ -1,4 +1,4 @@
<form method="post" class="form-horizontal" ng-controller="AccountCtrl">
<form method="post" class="form-horizontal">
<legend>Account Detail</legend>
<div class="control-group">
<label for="txtCode" class="control-label">Code</label>

@ -1,5 +1,5 @@
<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">
<table class="clean-table">
<thead>
<tr>
<th>Name</th>

@ -1,4 +1,4 @@
<form method="post" autocomplete="off" class="horizontal-form" ng-controller="CashFlowCtrl">
<form method="post" autocomplete="off" class="horizontal-form">
<legend>Cash Flow</legend>
<div class="control-group">
<label for="txtStartDate" class="control-label">Date</label>

@ -1,4 +1,4 @@
<form method="post" autocomplete="off" class="horizontal-form" ng-controller="ClosingStockCtrl">
<form method="post" autocomplete="off" class="horizontal-form">
<legend>Closing Stock</legend>
<div class="control-group">
<label for="txtDate" class="control-label">Date</label>

@ -1,4 +1,4 @@
<form method="post" class="form-horizontal" ng-controller="CostCenterCtrl">
<form method="post" class="form-horizontal">
<legend>Cost Center Detail</legend>
<div class="control-group">
<label for="txtName" class="control-label">Name</label>

@ -1,5 +1,5 @@
<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">
<table class="clean-table">
<thead>
<tr>
<th>Name</th>

@ -1,4 +1,4 @@
<form method="post" autocomplete="off" class="horizontal-form" ng-controller="DaybookCtrl">
<form method="post" autocomplete="off" class="horizontal-form">
<legend>Daybook</legend>
<div class="control-group">
<label for="txtStartDate" class="control-label">Date</label>

@ -1,4 +1,4 @@
<form method="post" class="form-horizontal" ng-controller="EmployeeCtrl">
<form method="post" class="form-horizontal">
<legend>Employee Detail</legend>
<div class="control-group">
<label for="txtCode" class="control-label">Code</label>

@ -0,0 +1,32 @@
<form method="post" class="form-horizontal">
<legend>Group Detail</legend>
<div class="control-group">
<label for="txtName" class="control-label">Name</label>
<div class="controls">
<input type="text" id="txtName" ng-model="group.Name"/>
</div>
</div>
<div class="control-group">
<label for="ulPermissions" class="control-label">Permissions</label>
<div class="controls">
<ul id="ulPermissions">
<li ng-repeat="permission in group.Permissions">
<label class="checkbox">
<input type="checkbox" ng-model="permission.Enabled"> {{permission.Name}}
</label>
</li>
<!--<li ng-repeat="group in user.Groups">{{group}}</li>-->
</ul>
</div>
</div>
<div class=" control-group" id="add">
<div class="controls">
<button ng-click="save()">Save</button>
</div>
</div>
</form>

@ -0,0 +1,20 @@
<legend>Users <a href="/Group" class="btn btn-success pull-right">Add <i class="icon-plus icon-white"></i></a></legend>
<table class="clean-table">
<thead>
<tr>
<th>Name</th>
<th>Groups</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="item in info">
<td><a href="{{item.Url}}">{{item.Name}}</a></td>
<td>
<ul>
<li ng-repeat="permission in item.Permissions">{{permission}}</li>
</ul>
</td>
</tr>
</tbody>
</table>

@ -1,5 +1,5 @@
<h2 class="ribbon-header">Issue Edit / New</h2>
<form method="post" autocomplete="off" class="form-horizontal" ng-controller="IssueCtrl">
<form method="post" autocomplete="off" class="form-horizontal">
<div class="control-group">
<label for="gvSmall" class="control-label"></label>

@ -1,4 +1,4 @@
<form method="post" autocomplete="off" class="form-horizontal" ng-controller="JournalCtrl">
<form method="post" autocomplete="off" class="form-horizontal">
<div class="control-group">
<label for="txtCode" class="control-label">Code</label>

@ -1,4 +1,4 @@
<form method="post" autocomplete="off" class="horizontal-form" ng-controller="LedgerCtrl">
<form method="post" autocomplete="off" class="horizontal-form">
<legend>Ledger</legend>
<div class="control-group">
<label for="txtStartDate" class="control-label">Date</label>

@ -1,4 +1,4 @@
<form method="post" autocomplete="off" class="form-horizontal" ng-controller="PaymentCtrl">
<form method="post" autocomplete="off" class="form-horizontal">
<div class="control-group">
<label for="txtCode" class="control-label">Code</label>

@ -1,4 +1,4 @@
<form method="post" class="form-horizontal" ng-controller="ProductCtrl">
<form method="post" class="form-horizontal">
<legend>Product Detail</legend>
<div class="control-group">
<label for="txtCode" class="control-label">Code</label>

@ -1,4 +1,4 @@
<form method="post" class="form-horizontal" ng-controller="ProductGroupCtrl">
<form method="post" class="form-horizontal">
<legend>Product Group Detail</legend>
<div class="control-group">
<label for="txtName" class="control-label">Name</label>

@ -1,5 +1,5 @@
<legend>Product Groups <a href="/ProductGroup" class="btn btn-success pull-right">Add <i class="icon-plus icon-white"></i></a></legend>
<table class="clean-table" ng-controller="ProductGroupListCtrl">
<table class="clean-table">
<thead>
<tr>
<th>Name</th>

@ -1,4 +1,4 @@
<form method="post" autocomplete="off" class="horizontal-form" ng-controller="ProductLedgerCtrl">
<form method="post" autocomplete="off" class="horizontal-form">
<legend>Product Ledger</legend>
<div class="control-group">
<label for="txtStartDate" class="control-label">Date</label>

@ -1,5 +1,5 @@
<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">
<table class="clean-table">
<thead>
<tr>
<th>Code</th>

@ -1,4 +1,4 @@
<form method="post" autocomplete="off" class="horizontal-form" ng-controller="ProfitLossCtrl">
<form method="post" autocomplete="off" class="horizontal-form">
<legend>Profit & Loss</legend>
<div class="control-group">
<label for="txtStartDate" class="control-label">Date</label>

@ -0,0 +1,42 @@
<form method="post" autocomplete="off" class="horizontal-form">
<legend>Purchase Entries</legend>
<div class="control-group">
<label for="txtStartDate" class="control-label">Date</label>
<div class="controls">
<datepicker id="txtStartDate" model="info" prop="StartDate" ng-model="info.StartDate"></datepicker>
<datepicker id="txtFinishDate" model="info" prop="FinishDate" ng-model="info.FinishDate"></datepicker>
<button ng-click="show()">Show</button>
</div>
</div>
<div class="control-group">
<label for="gvGrid" class="control-label"></label>
<div class="controls">
<table id="gvGrid" class="clean-table">
<thead>
<tr>
<th>Date</th>
<th>Supplier</th>
<th>Product</th>
<th class="right">Quantity</th>
<th class="right">Rate</th>
<th class="right">Tax</th>
<th class="right">Amount</th>
</tr>
</thead>
<tbody ng-repeat="items in info.Body">
<tr ng-repeat="item in items.Products">
<td ngm-if="$first" rowspan="{{items.Products.length}}">{{items.Date}}</td>
<td ngm-if="$first" rowspan="{{items.Products.length}}"><a href="{{items.Url}}">{{items.Supplier}}</a></td>
<td>{{item.Product}}</td>
<td class="right">{{item.Quantity}}</td>
<td class="right">{{item.Rate}}</td>
<td class="right">{{item.Tax}}</td>
<td class="right">{{item.Amount}}</td>
</tr>
</tbody>
</table>
</div>
</div>
</form>

@ -1,5 +1,5 @@
<h2 class="ribbon-header">Purchase Edit / New</h2>
<form method="post" autocomplete="off" class="form-horizontal" ng-controller="PurchaseCtrl">
<form method="post" autocomplete="off" class="form-horizontal">
<div class="control-group">
<label for="txtCode" class="control-label">Code</label>

@ -1,4 +1,4 @@
<form method="post" autocomplete="off" class="horizontal-form" ng-controller="RawMaterialCostCtrl">
<form method="post" autocomplete="off" class="horizontal-form">
<legend>Raw Material Cost Detail</legend>
<div class="control-group">
<label for="txtStartDate" class="control-label">Date</label>

@ -1,4 +1,4 @@
<form method="post" autocomplete="off" class="horizontal-form" ng-controller="RawMaterialCostCtrl">
<form method="post" autocomplete="off" class="horizontal-form">
<legend>Raw Material Cost</legend>
<div class="control-group">
<label for="txtStartDate" class="control-label">Date</label>

@ -1,4 +1,4 @@
<form method="post" autocomplete="off" class="form-horizontal" ng-controller="ReceiptCtrl">
<form method="post" autocomplete="off" class="form-horizontal">
<div class="control-group">
<label for="txtCode" class="control-label">Code</label>

@ -1,4 +1,4 @@
<form method="post" autocomplete="off" class="horizontal-form" ng-controller="TrialBalanceCtrl">
<form method="post" autocomplete="off" class="horizontal-form">
<legend>Trial Balance</legend>
<div class="control-group">
<label for="txtDate" class="control-label">Date</label>

@ -1,4 +1,4 @@
<form method="post" autocomplete="off" class="horizontal-form" ng-controller="UnpostedCtrl">
<form method="post" autocomplete="off" class="horizontal-form">
<legend>Unposted Entries</legend>
<div class="control-group">
<label for="gvGrid" class="control-label"></label>

@ -1,4 +1,4 @@
<form method="post" class="form-horizontal" ng-controller="UserCtrl">
<form method="post" class="form-horizontal">
<legend>User Detail</legend>
<div class="control-group">
<label for="txtName" class="control-label">Name</label>

@ -1,5 +1,5 @@
<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">
<table class="clean-table">
<thead>
<tr>
<th>Name</th>

@ -126,3 +126,44 @@ overlord_directive.directive('fadey', function () {
};
return directiveDefinitionObject;
});
(function (angular) {
/*
* Defines the ng:if tag. This is useful if jquery mobile does not allow
* an ng-switch element in the dom, e.g. between ul and li.
*/
var ngIfDirective = {
transclude:'element',
priority:1000,
terminal:true,
compile:function (element, attr, linker) {
return function (scope, iterStartElement, attr) {
iterStartElement[0].doNotMove = true;
var expression = attr.ngmIf;
var lastElement;
var lastScope;
scope.$watch(expression, function (newValue) {
if (lastElement) {
lastElement.remove();
lastElement = null;
}
lastScope && lastScope.$destroy();
if (newValue) {
lastScope = scope.$new();
linker(lastScope, function (clone) {
lastElement = clone;
iterStartElement.after(clone);
});
}
// Note: need to be parent() as jquery cannot trigger events on comments
// (angular creates a comment node when using transclusion, as ng-repeat does).
iterStartElement.parent().trigger("$childrenChanged");
});
};
}
};
overlord_directive.directive('ngmIf', function () {
return ngIfDirective;
});
})(angular);

@ -65,6 +65,14 @@ overlord_service.factory('User', ['$resource', function ($resource) {
});
}]);
// TODO: Replace hardcoded url with route_url
overlord_service.factory('Group', ['$resource', function ($resource) {
return $resource('/Group/:id',
{id:'@GroupID'}, {
query:{method:'GET', params:{list:true}, isArray:true}
});
}]);
// TODO: Replace hardcoded url with route_url
overlord_service.factory('Product', ['$resource', function ($resource) {
return $resource('/Product/:id',
@ -120,6 +128,11 @@ overlord_service.factory('ProfitLoss', ['$resource', function ($resource) {
return $resource('/ProfitLoss');
}]);
// TODO: Replace hardcoded url with route_url
overlord_service.factory('PurchaseEntries', ['$resource', function ($resource) {
return $resource('/PurchaseEntries');
}]);
// TODO: Replace hardcoded url with route_url
overlord_service.factory('RawMaterialCost', ['$resource', function ($resource) {
return $resource('/RawMaterialCost/:id');

@ -0,0 +1,27 @@
function GroupListCtrl($scope, Group) {
$scope.info = Group.query();
}
function GroupCtrl($scope, $routeParams, $location, Group) {
$scope.group = Group.get({id: $routeParams.id});
$scope.save = function () {
$scope.group.$save(function (u, putResponseHeaders) {
$scope.toasts.push({Type:'Success', Message:u.Code});
$location.path('/Groups')
}, function (data, status) {
$scope.toasts.push({Type:'Error', Message:data.data});
});
};
$scope.delete = function () {
$scope.group.$delete(function (u, putResponseHeaders) {
$scope.toasts.push({Type:'Success', Message:''});
$location.path('/Groups')
}, function (data, status) {
$scope.toasts.push({Type:'Error', Message:data.data});
});
};
$('#txtName').focus();
}

@ -1,42 +0,0 @@
function Populate(response) {
if (response != null) {
var stateObj = { 'group_id':response.group_id };
history.pushState(stateObj, 'Display', response.url);
$('#ddlGroup').val(response.group_id);
$('#tbodyMain').html(response.body);
}
}
function Show(group_id) {
$.ajax({
type:"POST",
contentType:"application/json; charset=utf-8",
data:JSON.stringify({ group_id:group_id }),
dataType:"json",
success:function (response) {
Populate(response);
},
error:function (jqXHR, textStatus) {
$("#ctl00_statusDiv").removeClass().addClass("error");
var msg = $.parseJSON(jqXHR.responseText).Message;
$("#ctl00_statusDiv").html(msg);
}
});
return false;
}
function GetFormData() {
var selected_roles = new Array();
var group_id = $("#ddlGroup").val();
$("tr.Entry").each(function () {
$this = $(this);
var role_id = $this.find("td.RoleID").html();
var checkbox = $this.find("input[type=checkbox]").attr('checked');
checkbox = (typeof checkbox == 'undefined') ? false : true;
selected_roles.push({ 'role_id':role_id, 'selected':checkbox });
});
return JSON.stringify({group_id:group_id, selected_roles:selected_roles});
}
function ResetForm() {}

@ -38,6 +38,7 @@ var overlord = angular.module('overlord', ['overlord.directive', 'overlord.filte
when('/Daybook', {templateUrl:'/partial/daybook.html', controller:DaybookCtrl}).
when('/Unposted', {templateUrl:'/partial/unposted.html', controller:UnpostedCtrl}).
when('/ProfitLoss', {templateUrl:'/partial/profit-loss.html', controller:ProfitLossCtrl}).
when('/PurchaseEntries', {templateUrl:'/partial/purchase-entries.html', controller:PurchaseEntriesCtrl}).
when('/TrialBalance', {templateUrl:'/partial/trial-balance.html', controller:TrialBalanceCtrl}).
when('/TrialBalance/:date', {templateUrl:'/partial/trial-balance.html', controller:TrialBalanceCtrl}).
@ -67,7 +68,11 @@ var overlord = angular.module('overlord', ['overlord.directive', 'overlord.filte
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});
when('/User/:id', {templateUrl:'/partial/user-detail.html', controller:UserCtrl}).
when('/Groups', {templateUrl:'/partial/group-list.html', controller:GroupListCtrl}).
when('/Group', {templateUrl:'/partial/group-detail.html', controller:GroupCtrl}).
when('/Group/:id', {templateUrl:'/partial/group-detail.html', controller:GroupCtrl});
// .otherwise({redirectTo: '/phones'});
$locationProvider.html5Mode(true);
}])

@ -0,0 +1,15 @@
function PurchaseEntriesCtrl($scope, $routeParams, $location, PurchaseEntries) {
if (typeof $routeParams.StartDate === 'undefined') {
$scope.info = PurchaseEntries.get({});
} else {
$scope.info = PurchaseEntries.get({StartDate:$routeParams.StartDate, FinishDate:$routeParams.FinishDate});
}
$scope.show = function () {
$scope.info = PurchaseEntries.get({StartDate:$scope.info.StartDate, FinishDate:$scope.info.FinishDate}, function (u, putResponseHeaders) {
$location.path('/PurchaseEntries').search({StartDate:u.StartDate, FinishDate:u.FinishDate});
}, function (data, status) {
$scope.toasts.push({Type:'Error', Message:data.data});
});
};
$('#txtStartDate').focus();
}

@ -1,42 +0,0 @@
function Populate(response) {
if (response != null) {
var stateObj = { 'user_id':response.user_id };
history.pushState(stateObj, 'Display', response.url);
$('#ddlUser').val(response.user_id);
$('#tbodyMain').html(response.body);
}
}
function Show(user_id) {
$.ajax({
type:"POST",
contentType:"application/json; charset=utf-8",
data:JSON.stringify({ user_id:user_id }),
dataType:"json",
success:function (response) {
Populate(response);
},
error:function (jqXHR, textStatus) {
$("#ctl00_statusDiv").removeClass().addClass("error");
var msg = $.parseJSON(jqXHR.responseText).Message;
$("#ctl00_statusDiv").html(msg);
}
});
return false;
}
function GetFormData() {
var selected_groups = new Array();
var user_id = $("#ddlUser").val();
$("tr.Entry").each(function () {
$this = $(this);
var group_id = $this.find("td.GroupID").html();
var checkbox = $this.find("input[type=checkbox]").attr('checked');
checkbox = (typeof checkbox == 'undefined') ? false : true;
selected_groups.push({ 'group_id':group_id, 'selected':checkbox });
});
return JSON.stringify({user_id:user_id, selected_groups:selected_groups});
}
function ResetForm() {}

@ -45,6 +45,7 @@
${h.ScriptLink(request, 'trial-balance.js')}
${h.ScriptLink(request, 'closing-stock.js')}
${h.ScriptLink(request, 'profit-loss.js')}
${h.ScriptLink(request, 'purchase-entries.js')}
${h.ScriptLink(request, 'cash-flow.js')}
${h.ScriptLink(request, 'raw-material-cost.js')}
${h.ScriptLink(request, 'daybook.js')}
@ -53,6 +54,7 @@
${h.ScriptLink(request, 'account.js')}
${h.ScriptLink(request, 'employee.js')}
${h.ScriptLink(request, 'user.js')}
${h.ScriptLink(request, 'group.js')}
${h.ScriptLink(request, 'cost-center.js')}
${h.ScriptLink(request, 'product.js')}
${h.ScriptLink(request, 'product-group.js')}

@ -3,8 +3,8 @@
<ul class="dropdown-menu">
<li><a href="${request.route_url('logout')}">Logout ${user.name}</a></li>
<li><a href="/AccountsTesting/Security/ChangePassword.aspx">Change Password</a></li>
<li><a href="${request.route_url('group_roles')}">Group Roles</a></li>
<li><a href="${request.route_url('user_list')}">Users</a></li>
<li><a href="${request.route_url('group_list')}">Groups</a></li>
<li><a href="/AccountsTesting/Maintenance/Split.aspx">Split Data</a></li>
</ul>
</li>
@ -13,30 +13,8 @@
<li tal:condition="not user" class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown"><i class="icon-user"></i> User <b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="${request.route_url('login')}">Log in</a></li>
<li><a href="${request.route_url('group_roles')}">Group Roles</a></li>
<li><a href="${request.route_url('user_list')}">Users</a></li>
<li><a href="${request.route_url('group_list')}">Groups</a></li>
</ul>
</li>
</ul>
<span tal:replace="nothing">
<li tal:condition="user"><a href="${request.route_url('home')}">${user.name}</a>
<ul>
<li><a href="${request.route_url('logout')}">Logout ${user.name}</a></li>
<li><a href="/AccountsTesting/Security/ChangePassword.aspx">Change Password</a></li>
<li><a href="${request.route_url('group_roles')}">Group Roles</a></li>
<li><a href="/AccountsTesting/Security/AddUser.aspx">Add User</a></li>
<li><a href="/AccountsTesting/Security/DisableUser.aspx">Disable User</a></li>
</ul>
</li>
<li tal:condition="not user"><a href="${request.route_url('home')}">Home</a>
<ul>
<li><a href="${request.route_url('login')}">Log in</a></li>
<li><a href="${request.route_url('group_roles')}">Group Roles</a></li>
<li><a href="/AccountsTesting/Security/AddUser.aspx">Add User</a></li>
<li><a href="/AccountsTesting/Security/DisableUser.aspx">Disable User</a></li>
</ul>
</li>
</span>

@ -8,18 +8,16 @@
<li><a href="">Purchases</a>
<ul>
<li><a href="${request.route_url('raw_material_cost')}">Raw Material Cost</a></li>
<li><a href="/AccountsTesting/Reports/PurchaseEntry.aspx">Purchase Entry</a></li>
<li><a href="${request.route_url('purchase_entries')}">Purchase Entries</a></li>
## <li><a href="/AccountsTesting/Reports/Purchases/Purchases.aspx">Purchases</a></li>
## <li><a href="/AccountsTesting/Reports/Purchases/PurchaseLedger.aspx">Purchase Ledger</a></li>
<li><a href="${request.route_url('closing_stock')}">Closing Stock</a></li>
## <li><a href="/AccountsTesting/Reports/Inventory/Main.aspx">Inventory Report</a></li>
<li><a href="/AccountsTesting/Reports/Issue/Issue_All.aspx">Issue</a></li>
</ul>
</li>
<li><a href="">Final Reports</a>
<ul>
<li><a href="${request.route_url('trial_balance')}">Trail Balance</a></li>
<li><a href="${request.route_url('trial_balance')}">Differential Trail Balance</a></li>
<li><a href="${request.route_url('profit_loss')}">Profit and Loss</a></li>
</ul>
</li>

@ -7,17 +7,17 @@ import transaction
from brewman.models.master import CostCenter, Ledger, LedgerType
from brewman.models.validation_exception import ValidationError
@view_config(route_name='account_list', renderer='brewman:templates/angular_base.mako')
@view_config(route_name='account_list', renderer='brewman:templates/angular_base.mako', permission='Accounts')
@view_config(request_method='GET', route_name='account_id', renderer='brewman:templates/angular_base.mako',
xhr=False)
xhr=False, permission='Accounts')
@view_config(request_method='GET', route_name='account', renderer='brewman:templates/angular_base.mako',
xhr=False)
xhr=False, permission='Accounts')
def html(request):
return {}
@view_config(request_method='POST', route_name='account_id', renderer='json', xhr=True)
@view_config(request_method='POST', route_name='account', renderer='json', xhr=True)
@view_config(request_method='POST', route_name='account_id', renderer='json', xhr=True, permission='Accounts')
@view_config(request_method='POST', route_name='account', renderer='json', xhr=True, permission='Accounts')
def save_update(request):
try:
id = request.matchdict.get('id', None)
@ -42,7 +42,7 @@ def save_update(request):
return response
@view_config(request_method='DELETE', route_name='account_id', renderer='json', xhr=True)
@view_config(request_method='DELETE', route_name='account_id', renderer='json', xhr=True, permission='Accounts')
def delete(request):
id = request.matchdict.get('id', None)
if id is None:
@ -55,17 +55,17 @@ def delete(request):
return response
@view_config(request_method='GET', route_name='account_id', renderer='json', xhr=True)
@view_config(request_method='GET', route_name='account_id', renderer='json', xhr=True, permission='Accounts')
def show_id(request):
return account_info(uuid.UUID(request.matchdict.get('id', None)))
@view_config(request_method='GET', route_name='account', renderer='json', xhr=True)
@view_config(request_method='GET', route_name='account', renderer='json', xhr=True, permission='Accounts')
def show_blank(request):
return account_info(None)
@view_config(request_method='GET', route_name='account', renderer='json', request_param='list', xhr=True)
@view_config(request_method='GET', route_name='account', renderer='json', request_param='list', xhr=True, permission='Accounts')
def show_list(request):
list = Ledger.list()
ledgers = []
@ -75,7 +75,7 @@ def show_list(request):
return ledgers
@view_config(request_method='GET', route_name='account_type_list', renderer='json', xhr=True)
@view_config(request_method='GET', route_name='account_type_list', renderer='json', xhr=True, permission='Accounts')
def account_type_list(request):
account_types = []
for item in LedgerType.list():

@ -0,0 +1,109 @@
import uuid
from pyramid.view import view_config
import transaction
from brewman.models import DBSession
from brewman.models.auth import Group, Role
from brewman.models.validation_exception import ValidationError
@view_config(route_name='group_list', renderer='brewman:templates/angular_base.mako', permission='Users')
@view_config(request_method='GET', route_name='group_id', renderer='brewman:templates/angular_base.mako',
xhr=False, permission='Users')
@view_config(request_method='GET', route_name='group', renderer='brewman:templates/angular_base.mako',
xhr=False, permission='Users')
def html(request):
return {}
@view_config(request_method='POST', route_name='group', renderer='json', xhr=True, permission='Users')
def save(request):
try:
group = Group(request.json_body['Name'])
DBSession.add(group)
add_permissions(group, request.json_body['Permissions'])
transaction.commit()
return group_info(group.id)
except ValidationError as ex:
transaction.abort()
response = Response("Failed validation: {0}".format(ex.message))
response.status_int = 500
return response
@view_config(request_method='POST', route_name='group_id', renderer='json', xhr=True, permission='Users')
def update(request):
try:
id = request.matchdict.get('id', None)
group = Group.get_by_id(uuid.UUID(id))
group.name = request.json_body['Name']
add_permissions(group, request.json_body['Permissions'])
transaction.commit()
return group_info(group.id)
except ValidationError as ex:
transaction.abort()
response = Response("Failed validation: {0}".format(ex.message))
response.status_int = 500
return response
def add_permissions(group, permissions):
for permission in permissions:
id = uuid.UUID(permission['PermissionID'])
gp = [p for p in group.roles if p.id == id]
gp = None if len(gp) == 0 else gp[0]
if permission['Enabled'] and gp is None:
group.roles.append(Role.get_by_id(id))
elif not permission['Enabled'] and gp:
group.roles.remove(gp)
@view_config(request_method='DELETE', route_name='group_id', renderer='json', xhr=True, permission='Users')
def delete(request):
id = request.matchdict.get('id', None)
if id is None:
response = Response("Group is Null")
response.status_int = 500
return response
else:
response = Response("Group deletion not implemented")
response.status_int = 500
return response
@view_config(request_method='GET', route_name='group_id', renderer='json', xhr=True, permission='Users')
def show_id(request):
return group_info(uuid.UUID(request.matchdict.get('id', None)))
@view_config(request_method='GET', route_name='group', renderer='json', xhr=True, permission='Users')
def show_blank(request):
return group_info(None)
@view_config(request_method='GET', route_name='group', renderer='json', request_param='list', xhr=True, permission='Users')
def show_list(request):
list = Group.list()
groups = []
for item in list:
group = {'Name': item.name, 'Permissions': [], 'Url': request.route_url('group_id', id=item.id)}
for permission in item.roles:
group['Permissions'].append(permission.name)
groups.append(group)
return groups
def group_info(id):
if id is None:
group = {'Name': '', 'Permissions': []}
for item in Role.list():
group['Permissions'].append({'PermissionID': item.id, 'Name': item.name, 'Enabled': False})
print(group)
else:
group_object = Group.get_by_id(id)
group = {'GroupID': group_object.id, 'Name': group_object.name, 'Permissions': []}
for item in Role.list():
group['Permissions'].append(
{'PermissionID': item.id, 'Name': item.name, 'Enabled': True if item in group_object.roles else False})
return group

@ -1,75 +0,0 @@
import uuid
from pyramid.view import view_config
import transaction
from brewman.helpers import Literal, SelectInput
from brewman.models.auth import User, Group, Role
@view_config(request_method='GET', route_name='group_roles', permission='ManageRoles',
renderer='brewman:templates/auth/group_roles.pt')
@view_config(request_method='GET', route_name='group_roles_id', permission='ManageRoles',
renderer='brewman:templates/auth/group_roles.pt')
def group_roles_get(request):
id = request.matchdict.get('id', None)
id = None if id is None else uuid.UUID(id)
group = SelectInput('ddlGroup', list=Group.list(), displayField='name', valueField='id', defaultValue=id)
body, footer = build_report(request, id)
body = Literal(body)
footer = Literal(footer)
return {'title': 'Group Roles',
'pageclass': "page-blogpost page-sidebar-right",
'pagecontentclass': "page-content grid_12",
'page_header': '',
'group': group,
'body': body,
'footer': footer}
@view_config(request_method='POST', route_name='group_roles', permission='ManageRoles', renderer='json', xhr=True)
@view_config(request_method='POST', route_name='group_roles_id', permission='ManageRoles', renderer='json', xhr=True)
def group_roles_post(request):
id = request.json_body['group_id']
body, footer = build_report(request, uuid.UUID(id))
url = request.route_url('group_roles_id', id=id)
return {'group_id': id,
'url': url,
'body': body}
@view_config(request_method='POST', route_name='save_group_roles', permission='ManageRoles', renderer='json', xhr=True)
def group_roles_save(request):
id = request.json_body['group_id']
group = Group.get_by_id(uuid.UUID(id))
for item in request.json_body['selected_roles']:
role = Role.get_by_id(uuid.UUID(item['role_id']))
selected = item['selected']
if selected and role not in group.roles:
group.roles.append(role)
elif not selected and role in group.roles:
group.roles.remove(role)
transaction.commit()
return 'Roles Updated'
def build_report(request, id):
body = ''
if id is None:
for item in Role.list():
body += '<tr class="Entry"><td class="RoleID hide">{0}</td><td class="Name=">'\
'<input type="checkbox" id="ch_{0}" value="True" /><label for="ch_{0}">{1}</label></td></tr>'\
.format(str(item.id), item.name)
else:
group = Group.get_by_id(id)
for item in Role.list():
if item in group.roles:
checked = ' checked="checked"'
else:
checked = ''
body += '<tr class="Entry"><td class="RoleID hide">{0}</td><td class="Name=">'\
'<input type="checkbox" id="ch_{0}"{2} value="True" /><label for="ch_{0}">{1}</label></td></tr>'\
.format(str(item.id), item.name, checked)
footer = '<tr><td class="RoleID hide"></td><td class="Name="></td></tr>'
return body, footer

@ -8,38 +8,21 @@ from brewman.models.auth import User, Group
from brewman.models.validation_exception import ValidationError
@view_config(route_name='user_list', renderer='brewman:templates/angular_base.mako', permission='ManageRoles')
@view_config(route_name='user_list', renderer='brewman:templates/angular_base.mako', permission='Users')
@view_config(request_method='GET', route_name='user_id', renderer='brewman:templates/angular_base.mako',
xhr=False, permission='ManageRoles')
xhr=False, permission='Users')
@view_config(request_method='GET', route_name='user', renderer='brewman:templates/angular_base.mako',
xhr=False, permission='ManageRoles')
xhr=False, permission='Users')
def html(request):
return {}
@view_config(request_method='POST', route_name='user_id', renderer='json', xhr=True, permission='CreateUser')
@view_config(request_method='POST', route_name='user', renderer='json', xhr=True, permission='CreateUser')
def save_update(request):
@view_config(request_method='POST', route_name='user', renderer='json', xhr=True, permission='Users')
def save(request):
try:
id = request.matchdict.get('id', None)
if id is None:
user = User(request.json_body['Name'], request.json_body['Password'], request.json_body['LockedOut'])
DBSession.add(user)
else:
user = User.get_by_id(uuid.UUID(id))
user.name = request.json_body['Name']
user.locked_out = request.json_body['LockedOut']
if request.json_body['Password'] != '' and request.json_body['Password'] != user.password:
user.password = request.json_body['Password']
for group in request.json_body['Groups']:
print(group)
id = uuid.UUID(group['GroupID'])
ug = [g for g in user.groups if g.id == id]
ug = None if len(ug) == 0 else ug[0]
if group['Enabled'] and ug is None:
user.groups.append(Group.get_by_id(id))
elif not group['Enabled'] and ug:
user.groups.remove(ug)
user = User(request.json_body['Name'], request.json_body['Password'], request.json_body['LockedOut'])
DBSession.add(user)
add_groups(user, request.json_body['Groups'])
transaction.commit()
return user_info(user.id)
except ValidationError as ex:
@ -49,7 +32,37 @@ def save_update(request):
return response
@view_config(request_method='DELETE', route_name='user_id', renderer='json', xhr=True, permission='CreateUser')
@view_config(request_method='POST', route_name='user_id', renderer='json', xhr=True, permission='Users')
def update(request):
try:
id = request.matchdict.get('id', None)
user = User.get_by_id(uuid.UUID(id))
user.name = request.json_body['Name']
user.locked_out = request.json_body['LockedOut']
if request.json_body['Password'] != '' and request.json_body['Password'] != user.password:
user.password = request.json_body['Password']
add_groups(user, request.json_body['Groups'])
transaction.commit()
return user_info(user.id)
except ValidationError as ex:
transaction.abort()
response = Response("Failed validation: {0}".format(ex.message))
response.status_int = 500
return response
def add_groups(user, groups):
for group in groups:
id = uuid.UUID(group['GroupID'])
ug = [g for g in user.groups if g.id == id]
ug = None if len(ug) == 0 else ug[0]
if group['Enabled'] and ug is None:
user.groups.append(Group.get_by_id(id))
elif not group['Enabled'] and ug:
user.groups.remove(ug)
@view_config(request_method='DELETE', route_name='user_id', renderer='json', xhr=True, permission='Users')
def delete(request):
id = request.matchdict.get('id', None)
if id is None:
@ -62,25 +75,27 @@ def delete(request):
return response
@view_config(request_method='GET', route_name='user_id', renderer='json', xhr=True, permission='ManageRoles')
@view_config(request_method='GET', route_name='user', renderer='json', xhr=True, permission='ManageRoles')
def show(request):
list = request.GET.get('list', None)
@view_config(request_method='GET', route_name='user_id', renderer='json', xhr=True, permission='Users')
def show_id(request):
return user_info(uuid.UUID(request.matchdict.get('id', None)))
if list:
list = User.list()
users = []
for item in list:
user = {'Name': item.name, 'LockedOut': item.locked_out,
'Groups': [], 'Url': request.route_url('user_id', id=item.id)}
for group in item.groups:
user['Groups'].append(group.name)
users.append(user)
return users
else:
id = request.matchdict.get('id', None)
id = None if id is None else uuid.UUID(id)
return user_info(id)
@view_config(request_method='GET', route_name='user', renderer='json', xhr=True, permission='Users')
def show_blank(request):
return user_info(None)
@view_config(request_method='GET', route_name='user', renderer='json', request_param='list', xhr=True, permission='Users')
def show_list(request):
list = User.list()
users = []
for item in list:
user = {'Name': item.name, 'LockedOut': item.locked_out,
'Groups': [], 'Url': request.route_url('user_id', id=item.id)}
for group in item.groups:
user['Groups'].append(group.name)
users.append(user)
return users
def user_info(id):

@ -8,17 +8,17 @@ from brewman.models.master import CostCenter
from brewman.models.validation_exception import ValidationError
@view_config(route_name='cost_center_list', renderer='brewman:templates/angular_base.mako')
@view_config(route_name='cost_center_list', renderer='brewman:templates/angular_base.mako', permission='Cost Centers')
@view_config(request_method='GET', route_name='cost_center_id', renderer='brewman:templates/angular_base.mako',
xhr=False)
xhr=False, permission='Cost Centers')
@view_config(request_method='GET', route_name='cost_center', renderer='brewman:templates/angular_base.mako',
xhr=False)
xhr=False, permission='Cost Centers')
def html(request):
return {}
@view_config(request_method='POST', route_name='cost_center_id', renderer='json', xhr=True)
@view_config(request_method='POST', route_name='cost_center', renderer='json', xhr=True)
@view_config(request_method='POST', route_name='cost_center_id', renderer='json', xhr=True, permission='Cost Centers')
@view_config(request_method='POST', route_name='cost_center', renderer='json', xhr=True, permission='Cost Centers')
def save_update(request):
try:
id = request.matchdict.get('id', None)
@ -36,7 +36,7 @@ def save_update(request):
return response
@view_config(request_method='DELETE', route_name='cost_center_id', renderer='json', xhr=True)
@view_config(request_method='DELETE', route_name='cost_center_id', renderer='json', xhr=True, permission='Cost Centers')
def delete(request):
id = request.matchdict.get('id', None)
if id is None:
@ -48,17 +48,17 @@ def delete(request):
response.status_int = 500
return response
@view_config(request_method='GET', route_name='cost_center_id', renderer='json', xhr=True)
@view_config(request_method='GET', route_name='cost_center_id', renderer='json', xhr=True, permission='Cost Centers')
def show_id(request):
return cost_center_info(uuid.UUID(request.matchdict.get('id', None)))
@view_config(request_method='GET', route_name='cost_center', renderer='json', xhr=True)
@view_config(request_method='GET', route_name='cost_center', renderer='json', xhr=True, permission='Cost Centers')
def show_blank(request):
return cost_center_info(None)
@view_config(request_method='GET', route_name='cost_center', request_param='list', renderer='json', xhr=True)
@view_config(request_method='GET', route_name='cost_center', request_param='list', renderer='json', xhr=True, permission='Cost Centers')
def show_list(request):
list = CostCenter.list()
cost_centers = []

@ -13,17 +13,17 @@ from brewman.models.master import CostCenter, Employee, AttendanceType
from brewman.models.validation_exception import ValidationError
from brewman.models.voucher import Attendance
@view_config(route_name='employee_list', renderer='brewman:templates/angular_base.mako')
@view_config(route_name='employee_list', renderer='brewman:templates/angular_base.mako', permission='Employees')
@view_config(request_method='GET', route_name='employee_id', renderer='brewman:templates/angular_base.mako', xhr=False,
permission='EmployeesUpdate')
permission='Employees')
@view_config(request_method='GET', route_name='employee', renderer='brewman:templates/angular_base.mako', xhr=False,
permission='EmployeesUpdate')
permission='Employees')
def html(request):
return {}
@view_config(request_method='POST', route_name='employee_id', renderer='json', xhr=True, permission='EmployeesUpdate')
@view_config(request_method='POST', route_name='employee', renderer='json', xhr=True, permission='EmployeesUpdate')
@view_config(request_method='POST', route_name='employee_id', renderer='json', xhr=True, permission='Employees')
@view_config(request_method='POST', route_name='employee', renderer='json', xhr=True, permission='Employees')
def save_update(request):
try:
id = request.matchdict.get('id', None)
@ -56,7 +56,7 @@ def save_update(request):
return response
@view_config(request_method='DELETE', route_name='employee_id', renderer='json', xhr=True)
@view_config(request_method='DELETE', route_name='employee_id', renderer='json', xhr=True, permission='Employees')
def delete(request):
id = request.matchdict.get('id', None)
if id is None:
@ -69,17 +69,17 @@ def delete(request):
return response
@view_config(request_method='GET', route_name='employee_id', renderer='json', xhr=True)
@view_config(request_method='GET', route_name='employee_id', renderer='json', xhr=True, permission='Employees')
def show_id(request):
return employee_info(uuid.UUID(request.matchdict.get('id', None)))
@view_config(request_method='GET', route_name='employee', renderer='json', xhr=True)
@view_config(request_method='GET', route_name='employee', renderer='json', xhr=True, permission='Employees')
def show_blank(request):
return employee_info(None)
@view_config(request_method='GET', route_name='employee', request_param='list', renderer='json', xhr=True)
@view_config(request_method='GET', route_name='employee', request_param='list', renderer='json', xhr=True, permission='Employees')
def show_list(request):
list = Employee.list()
ledgers = []

@ -9,15 +9,15 @@ from brewman.models.validation_exception import ValidationError
@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')
xhr=False, permission='Products')
@view_config(request_method='GET', route_name='product', renderer='brewman:templates/angular_base.mako',
xhr=False, permission='ProductsUpdate')
xhr=False, permission='Products')
def html(request):
return {}
@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)
@view_config(request_method='POST', route_name='product_id', renderer='json', xhr=True, permission='Products')
@view_config(request_method='POST', route_name='product', renderer='json', xhr=True, permission='Products')
def save_update(request):
try:
id = request.matchdict.get('id', None)
@ -48,7 +48,7 @@ def save_update(request):
return response
@view_config(request_method='DELETE', route_name='product_id', renderer='json', xhr=True)
@view_config(request_method='DELETE', route_name='product_id', renderer='json', xhr=True, permission='Products')
def delete(request):
id = request.matchdict.get('id', None)
if id is None:
@ -61,17 +61,17 @@ def delete(request):
return response
@view_config(request_method='GET', route_name='product_id', renderer='json', xhr=True)
@view_config(request_method='GET', route_name='product_id', renderer='json', xhr=True, permission='Products')
def show_id(request):
return product_info(uuid.UUID(request.matchdict.get('id', None)))
@view_config(request_method='GET', route_name='product', renderer='json', xhr=True)
@view_config(request_method='GET', route_name='product', renderer='json', xhr=True, permission='Products')
def show_blank(request):
return product_info(None)
@view_config(request_method='GET', route_name='product', request_param='list', renderer='json', xhr=True)
@view_config(request_method='GET', route_name='product', request_param='list', renderer='json', xhr=True, permission='Products')
def show_list(request):
list = Product.query().order_by(Product.discontinued).order_by(Product.product_group_id).order_by(
Product.name).all()
@ -83,14 +83,6 @@ def show_list(request):
return products
@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,

@ -9,17 +9,17 @@ from brewman.models.master import CostCenter, ProductGroup
from brewman.models.validation_exception import ValidationError
@view_config(route_name='product_group_list', renderer='brewman:templates/angular_base.mako')
@view_config(route_name='product_group_list', renderer='brewman:templates/angular_base.mako', permission='Product Groups')
@view_config(request_method='GET', route_name='product_group_id', renderer='brewman:templates/angular_base.mako',
xhr=False)
xhr=False, permission='Product Groups')
@view_config(request_method='GET', route_name='product_group', renderer='brewman:templates/angular_base.mako',
xhr=False)
xhr=False, permission='Product Groups')
def html(request):
return {}
@view_config(request_method='POST', route_name='product_group_id', renderer='json', xhr=True)
@view_config(request_method='POST', route_name='product_group', renderer='json', xhr=True)
@view_config(request_method='POST', route_name='product_group_id', renderer='json', xhr=True, permission='Product Groups')
@view_config(request_method='POST', route_name='product_group', renderer='json', xhr=True, permission='Product Groups')
def save_update(request):
try:
id = request.matchdict.get('id', None)
@ -38,7 +38,7 @@ def save_update(request):
return response
@view_config(request_method='DELETE', route_name='product_group_id', renderer='json', xhr=True)
@view_config(request_method='DELETE', route_name='product_group_id', renderer='json', xhr=True, permission='Product Groups')
def delete(request):
id = request.matchdict.get('id', None)
if id is None:
@ -50,17 +50,17 @@ def delete(request):
response.status_int = 500
return response
@view_config(request_method='GET', route_name='product_group_id', renderer='json', xhr=True)
@view_config(request_method='GET', route_name='product_group_id', renderer='json', xhr=True, permission='Product Groups')
def show_id(request):
return product_group_info(uuid.UUID(request.matchdict.get('id', None)))
@view_config(request_method='GET', route_name='product_group', renderer='json', xhr=True)
@view_config(request_method='GET', route_name='product_group', renderer='json', xhr=True, permission='Product Groups')
def show_blank(request):
return product_group_info(None)
@view_config(request_method='GET', route_name='product_group', request_param='list', renderer='json', xhr=True)
@view_config(request_method='GET', route_name='product_group', request_param='list', renderer='json', xhr=True, permission='Product Groups')
def show_list(request):
list = ProductGroup.list()
product_groups = []
@ -73,8 +73,6 @@ def product_group_info(id):
if id is None:
return {}
else:
product_group = ProductGroup.by_id(id)
product_group = ProductGroup.by_id(id)
product_group = ProductGroup.by_id(id)
return {'ProductGroupID': product_group.id, 'Name': product_group.name}

@ -0,0 +1,57 @@
import datetime
from sqlalchemy.sql.expression import func, desc
from pyramid.view import view_config
from brewman.models import DBSession
from brewman.models.master import CostCenter, LedgerType, LedgerBase
from brewman.models.voucher import Voucher, Journal, VoucherType, Inventory
from brewman.views.services.session import services_session_period_start, services_session_period_finish
from brewman.views.transactions import get_edit_url
@view_config(request_method='GET', route_name='purchase_entries', renderer='brewman:templates/angular_base.mako',
xhr=False)
def get_html(request):
return {}
@view_config(request_method='GET', route_name='purchase_entries', renderer='json', xhr=True)
def report_blank(request):
return {'StartDate': services_session_period_start(request),
'FinishDate': services_session_period_finish(request), 'Body': [], 'Footer': {}}
@view_config(request_method='GET', route_name='purchase_entries', request_param='StartDate', renderer='json',
xhr=True)
def report_data(request):
print('get report')
start_date = request.GET.get('StartDate', None)
finish_date = request.GET.get('FinishDate', None)
return build_report(request, start_date, finish_date)
def build_report(request, start_date, finish_date):
report = {'StartDate': start_date, 'FinishDate': finish_date, 'Body': []}
start_date = datetime.datetime.strptime(start_date, '%d-%b-%Y')
finish_date = datetime.datetime.strptime(finish_date, '%d-%b-%Y')
query = DBSession.query(Voucher)\
.filter(Voucher.date >= start_date)\
.filter(Voucher.date <= finish_date)\
.filter(Voucher.type == VoucherType.by_name('Purchase').id)\
.order_by(Voucher.date).all()
for voucher in query:
journal = [j for j in voucher.journals if j.debit == -1]
journal = journal[0]
row = {'Date': voucher.date.strftime('%d-%b-%Y'), 'Supplier': journal.ledger.name,
'Url': get_edit_url(request, voucher), 'Products': []}
for item in voucher.inventories:
row['Products'].append(
{'Product': item.product.full_name, 'Quantity': item.quantity, 'Rate': item.rate, 'Tax': item.tax,
'Amount': item.amount})
report['Body'].append(row)
return report

@ -122,21 +122,6 @@ def get_old(request):
return voucher_info(Voucher.by_id(uuid.UUID(id)))
#@view_config(request_method='GET', route_name='voucher_new', renderer='json', xhr=True)
#@view_config(request_method='GET', route_name='voucher', renderer='json', xhr=True)
#def get_old(request):
# id = request.matchdict.get('id', None)
# voucher_type = request.GET.get('type', None)
# if id:
# return voucher_info(Voucher.by_id(uuid.UUID(id)))
# elif voucher_type:
# return blank_voucher(type=voucher_type, date=session_current_date(request))
# else:
# response = Response("Voucher ID and Type, both are Null")
# response.status_int = 500
# return response
def voucher_info(voucher):
json_voucher = {'VoucherID': voucher.id,
'Date': voucher.date.strftime('%d-%b-%Y'),