def save(request, values, row=None): if not row: row = APInvoice() row.from_dict(values) if not row.no_urut: row.no_urut = APInvoice.max_no_urut(row.tahun_id,row.unit_id)+1; if not row.kode: tahun = request.session['tahun'] unit_kd = request.session['unit_kd'] no_urut = row.no_urut no = "0000%d" % no_urut nomor = no[-5:] row.kode = "%d" % tahun + "-%s" % unit_kd + "-%s" % nomor j='3' j1 = row.jenis if j1 != j: row.no_bku = None row.tgl_bku = None DBSession.add(row) DBSession.flush() return row
def view_act(self): ses = self.request.session req = self.request params = req.params url_dict = req.matchdict if url_dict['act']=='grid': columns = [] columns.append(ColumnDT('id')) columns.append(ColumnDT('kode')) columns.append(ColumnDT('uraian')) columns.append(ColumnDT('units.nama')) columns.append(ColumnDT('disabled')) query = DBSession.query(AsetRuang) rowTable = DataTables(req, AsetRuang, query, columns) return rowTable.output_result() elif url_dict['act']=='headofnama': term = 'term' in params and params['term'] or '' q = DBSession.query(AsetRuang.id,AsetRuang.kode,AsetRuang.uraian).\ filter(#AsetRuang.unit_id == ses['unit_id'], AsetRuang.uraian.ilike('%%%s%%' % term)).\ order_by(AsetRuang.uraian) rows = q.all() r = [] for k in rows: d={} d['id'] = k[0] d['value'] = k[2] d['kode'] = k[1] d['uraian'] = k[2] r.append(d) return r
def view_delete(request): q = query_id(request) kegiatan_sub_id = request.matchdict['kegiatan_sub_id'] row = q.first() if not row: return id_not_found(request,kegiatan_sub_id) ## Cek sudah Posting atau belum q = DBSession.query(KegiatanSub.disabled).filter(KegiatanSub.id==request.matchdict['kegiatan_sub_id']) rowsub = q.first() if rowsub.disabled: request.session.flash('Data tidak dapat dihapus karena sudah Posting', 'error') return route_list(request, kegiatan_sub_id) form = Form(colander.Schema(), buttons=('hapus','cancel')) values= {} if request.POST: if 'hapus' in request.POST: msg = '%s berhasil.' % (request.title) DBSession.query(KegiatanAsistensi).filter(KegiatanAsistensi.id==request.matchdict['id']).delete() DBSession.flush() request.session.flash(msg) return route_list(request,kegiatan_sub_id) return dict(row=row, form=form.render())
def save(values, request, user, row=None): if not row: row = KegiatanAsistensi() row.created = datetime.now() row.create_uid = user.id # isikan user update dan tanggal update row.updated = datetime.now() row.update_uid = user.id ag_step_id = request.session['ag_step_id'] if not values['catatan_1']: values['catatan_1']='-' if not values['catatan_2']: values['catatan_2']='-' if not values['catatan_3']: values['catatan_3']='-' if not values['catatan_4']: values['catatan_4']='-' row.from_dict(values) DBSession.add(row) DBSession.flush() return row
def gaji_routes_act(self): ses = self.request.session req = self.request params = req.params url_dict = req.matchdict if url_dict['act']=='grid': columns = [] columns.append(ColumnDT('id')) columns.append(ColumnDT('kode')) columns.append(ColumnDT('nama')) columns.append(ColumnDT('path')) columns.append(ColumnDT('factory')) columns.append(ColumnDT('perm_name')) columns.append(ColumnDT('disabled')) query = DBSession.query(Route) rowTable = DataTables(req, Route, query, columns) return rowTable.output_result() elif url_dict['act']=='headof': term = 'term' in params and params['term'] or '' rows = DBSession.query(Route.id, Route.nama ).filter( Route.nama.ilike('%%%s%%' % term), Route.perm_name != None).\ order_by(Route.path).all() r = [] for k in rows: d={} d['id'] = k[0] d['value'] = k[1] r.append(d) return r
def save(self, values, row=None): if not row: row = Sp2d() row.created = datetime.now() row.create_uid = self.request.user.id row.from_dict(values) row.updated = datetime.now() row.update_uid = self.request.user.id row.posted = 0 row.disabled = 'disabled' in values and 1 or 0 row.status_giro = 0 row.status_advist = 0 if not row.kode: tahun = self.session['tahun'] unit_kd = self.session['unit_kd'] unit_id = self.session['unit_id'] no_urut = Sp2d.get_norut(tahun, unit_id)+1 no = "0000%d" % no_urut nomor = no[-5:] row.kode = "%d" % tahun + "-%s" % unit_kd + "-%s" % nomor DBSession.add(row) DBSession.flush() #Untuk update status disabled pada SPM row1 = DBSession.query(Spm).filter(Spm.id==row.ap_spm_id).first() row1.disabled=1 self.save_request3(row1) return row
def view_delete(request): q = query_id(request) row = q.first() if not row: return id_not_found(request) if row.posted: request.session.flash('Data sudah diposting', 'error') return route_list(request) if row.status_spp: request.session.flash('Data sudah masuk di SPP', 'error') return route_list(request) if row.status_pay: request.session.flash('Data sudah masuk di Pembayaran Tagihan', 'error') return route_list(request) if row.amount: request.session.flash('Data tidak bisa dihapus, karena memiliki data items', 'error') return route_list(request) form = Form(colander.Schema(), buttons=('hapus','cancel')) values= {} if request.POST: if 'hapus' in request.POST: msg = '%s dengan kode %s telah berhasil.' % (request.title, row.kode) DBSession.query(APInvoice).filter(APInvoice.id==request.matchdict['id']).delete() DBSession.flush() request.session.flash(msg) return route_list(request) return dict(row=row, form=form.render())
def view_filing(self): req = self.request ses = req.session form = self.get_form(AddSchema) page = {} rowpage = 1 cpage = 'page' in req.POST and req.POST['page'] or 1 if cpage<1: cpage = 1 page['current']=int(cpage) offset = (page['current']-1) * rowpage if 'data' in req.POST: page['row'] = DBSession.query(func.count(Filing.id)).\ filter(or_(Filing.tag.like('%%%s%%' % req.POST['data']), Filing.nama.like('%%%s%%' % req.POST['data'])),).scalar() or 0 rows = DBSession.query(Filing).\ filter(or_(Filing.tag.like('%%%s%%' % req.POST['data']), Filing.nama.like('%%%s%%' % req.POST['data'])),).\ limit(rowpage).offset(offset) else: rows = DBSession.query(Filing).\ limit(rowpage).offset(offset) page['row'] = DBSession.query(func.count(Filing.id)).scalar() or 0 count = page['row'] / int(rowpage) page['count'] = count if count < page['row']/float(rowpage): page['count']=count+1 return dict(form=form, rows=rows, page=page)
def save(self, values, row=None): if not row: row = Giro() row.created = datetime.now() row.create_uid = self.request.user.id row.from_dict(values) row.updated = datetime.now() row.update_uid = self.request.user.id row.posted=0 row.disabled = 'disabled' in values and 1 or 0 if not row.no_urut: row.no_urut = Giro.max_no_urut(row.tahun_id)+1; if not row.kode: tahun = self.session['tahun'] #unit_kd = self.session['unit_kd'] #unit_id = self.session['unit_id'] #no_urut = Giro.get_norut(tahun, unit_id)+1 no_urut = row.no_urut no = "00000%d" % no_urut nomor = no[-6:] row.kode = "%s" % nomor + "-BUD-%d" % tahun #no_urut = row.no_urut #no = "00000%d" % no_urut #nomor = no[-5:] #row.kode = "%d" % tahun + "-%s" % unit_kd + "-BUD-%s" % nomor DBSession.add(row) DBSession.flush() return row
def view_fungsi_edit(self): request = self.request row = self.query_id().first() uid = row.id kode = row.kode if not row: return id_not_found(request) form = self.get_form(EditSchema) if request.POST: if 'simpan' in request.POST: controls = request.POST.items() print controls #Cek Kode Sama ato tidak a = form.validate(controls) b = a['kode'] c = "%s" % b cek = DBSession.query(Fungsi).filter(Fungsi.kode==c).first() if cek: kode1 = DBSession.query(Fungsi).filter(Fungsi.id==uid).first() d = kode1.kode if d!=c: self.request.session.flash('Data sudah ada', 'error') return HTTPFound(location=request.route_url('fungsi-edit',id=row.id)) try: c = form.validate(controls) except ValidationFailure, e: request.session[SESS_EDIT_FAILED] = e.render() return HTTPFound(location=request.route_url('fungsi-edit', id=row.id)) self.save_request(dict(controls), row) return self.route_list()
def save(values, request, row=None): if not row: row = KegiatanItem() ag_step_id = request.session['ag_step_id'] if ag_step_id<2: values['vol_2_1'] = values['vol_%s_1' % ag_step_id] values['vol_2_2'] = values['vol_%s_2' % ag_step_id] values['sat_2_1'] = values['sat_%s_1' % ag_step_id] values['sat_2_2'] = values['sat_%s_2' % ag_step_id] values['hsat_2'] = values['hsat_%s' % ag_step_id] if ag_step_id<4: values['vol_3_1'] = values['vol_%s_1' % ag_step_id] values['vol_3_2'] = values['vol_%s_2' % ag_step_id] values['sat_3_1'] = values['sat_%s_1' % ag_step_id] values['sat_3_2'] = values['sat_%s_2' % ag_step_id] values['hsat_3'] = values['hsat_%s' % ag_step_id] if ag_step_id<5: values['vol_4_1'] = values['vol_%s_1' % ag_step_id] values['vol_4_2'] = values['vol_%s_2' % ag_step_id] values['sat_4_1'] = values['sat_%s_1' % ag_step_id] values['sat_4_2'] = values['sat_%s_2' % ag_step_id] values['hsat_4'] = values['hsat_%s' % ag_step_id] row.from_dict(values) if not row.no_urut: row.no_urut = KegiatanItem.max_no_urut(values['kegiatan_sub_id'],values['rekening_id'])+1; DBSession.add(row) DBSession.flush() return row
def gaji_group_act(request): ses = request.session req = request params = req.params url_dict = req.matchdict if url_dict['act']=='grid': columns = [] columns.append(ColumnDT('id')) columns.append(ColumnDT('email')) columns.append(ColumnDT('user_name')) columns.append(ColumnDT('status')) columns.append(ColumnDT('last_login_date')) columns.append(ColumnDT('registered_date')) query = DBSession.query(User) rowTable = DataTables(req, User, query, columns) return rowTable.output_result() elif url_dict['act']=='headofnama': term = 'term' in params and params['term'] or '' rows = DBSession.query(User.id, User.user_name ).filter( User.user_name.ilike('%%%s%%' % term) ).all() r = [] for k in rows: d={} d['id'] = k[0] d['value'] = k[1] r.append(d) return r
def import_data(adata): for i in range(len(adata)): if i>0: j = adata[i] row = query_gaji_pegawai(j[0],j[1],j[2]) id = row.id if row: potongan = query_gaji_potongan(id) potongan_dict = potongan.to_dict() if len(j)==10: #Pembantu Bendahara for k in range(6): xfield=str(k+7).zfill(2) print xfield potongan_dict['amount_%s' % xfield]= int(float(j[k+4])) elif len(j)==9: #Bendahara for k in range(5): xfield=str(k+2).zfill(2) potongan_dict['amount_%s' % xfield]= int(float(j[k+4])) elif len(j)==5 or len(j)==6: #Bank potongan_dict['amount_01'] = int(float(j[4])) for k in range(11): if (row.gaji_bersih-sum_of_potongan(potongan_dict))<15000: xfield = str(12 - k).zfill(2) potongan_dict['amount_%s' % xfield] = 0 potongan.from_dict(potongan_dict) DBSession.add(potongan) DBSession.flush()
def view_delete(request): q = query_id(request) row = q.first() if not row: return id_not_found(request) if row.posted: request.session.flash('Data sudah diposting', 'error') return route_list(request) if row.status_spp: request.session.flash('Data sudah di SPP', 'error') return route_list(request) """ if row.amount: request.session.flash('Data tidak bisa dihapus, karena memiliki data items', 'error') return route_list(request) """ form = Form(colander.Schema(), buttons=('hapus','cancel')) values= {} if request.POST: if 'hapus' in request.POST: msg = '%s dengan kode %s telah berhasil.' % (request.title, row.kode) DBSession.query(APPayment).filter(APPayment.id==request.matchdict['id']).delete() DBSession.flush() request.session.flash(msg) #Untuk update status posted dan status_pay pada APInvoice inv_id = row.invoice_id row = DBSession.query(APInvoice).filter(APInvoice.id==inv_id).first() row.status_pay = 0 save_request2(row) return route_list(request) return dict(row=row, form=form.render())
def save(self, values, user, row=None): if not row: row = ARPaymentItem() row.created = datetime.now() row.create_uid = user.id row.from_dict(values) row.updated = datetime.now() row.update_uid = user.id tanggal = datetime.strptime(values['tanggal'], '%Y-%m-%d') row.tahun = tanggal.year row.bulan = tanggal.month row.hari = tanggal.day row.minggu = tanggal.isocalendar()[1] row.disabled = 'disabled' in values and values['disabled'] and 1 or 0 row.is_kota = 'is_kota' in values and values['is_kota'] and 1 or 0 row.posted1 = 'posted1' in values and values['posted1'] and 1 or 0 tahun = self.session['tahun'] unit_id = self.session['unit_id'] if not row.no_urut: row.no_urut = ARPaymentItem.max_no_urut(tahun,unit_id)+1; if not row.ref_kode: tahun = self.session['tahun'] unit_kd = self.session['unit_kd'] unit_id = self.session['unit_id'] #no_urut = ARPaymentItem.get_norut(tahun, unit_id)+1 no_urut = row.no_urut no = "0000%d" % no_urut nomor = no[-5:] row.ref_kode = "%d" % tahun + "-%s" % unit_kd + "-%s" % nomor DBSession.add(row) DBSession.flush() return row
def view_ar_payment_item_delete(self): request = self.request q = self.query_id() row = q.first() if not row: return self.id_not_found(request) if row.posted: request.session.flash('Data sudah diposting', 'error') return self.route_list() if row.posted1: request.session.flash('Data sudah diposting rekap', 'error') return self.route_list() form = Form(colander.Schema(), buttons=('hapus','batal')) if request.POST: if 'hapus' in request.POST: msg = 'TBP ID %d %s sudah dihapus.' % (row.id, row.ref_nama) try: q.delete() DBSession.flush() except: msg = 'TBP ID %d %s tidak dapat dihapus.' % (row.id, row.ref_nama) request.session.flash(msg) return self.route_list() return dict(row=row, form=form.render())
def form_validator(form, value): def err_email(): raise colander.Invalid(form, 'Email %s sudah digunakan oleh user ID %d' % ( value['email'], found.id)) def err_name(): raise colander.Invalid(form, 'Nama user %s sudah digunakan oleh ID %d' % ( value['user_name'], found.id)) if 'id' in form.request.matchdict: uid = form.request.matchdict['id'] q = DBSession.query(User).filter_by(id=uid) user = q.first() else: user = None q = DBSession.query(User).filter_by(email=value['email']) found = q.first() if user: if found and found.id != user.id: err_email() elif found: err_email() if 'user_name' in value: # optional found = User.get_by_name(value['user_name']) if user: if found and found.id != user.id: err_name() elif found: err_name()
def save(self, values, user, row=None): if not row: row = Jurnal() row.created = datetime.now() row.create_uid = user.id row.from_dict(values) tanggal = datetime.strptime(values['tanggal'], '%Y-%m-%d') row.tahun_id = tanggal.year row.periode = tanggal.month row.updated = datetime.now() row.update_uid = user.id row.disabled = 'disabled' in values and values['disabled'] and 1 or 0 row.posted = 'posted' in values and values['posted'] and 1 or 0 row.tgl_transaksi = datetime.now() if not row.kode: tahun = self.session['tahun'] unit_kd = self.session['unit_kd'] is_skpd = row.is_skpd jv_type = row.jv_type tipe = Jurnal.get_tipe(jv_type) no_urut = Jurnal.get_norut(row.tahun_id,row.unit_id)+1 no = "0000%d" % no_urut nomor = no[-5:] row.kode = "%d" % tahun + "-%s" % is_skpd + "-%s" % unit_kd + "-%s" % tipe + "-%s" % nomor DBSession.add(row) DBSession.flush() return row
def view_delete(request): q = query_id(request) row = q.first() if not row: return self.id_not_found() query_id(request).delete() DBSession.flush() r = DBSession.query(SpdItem)\ .join(KegiatanSub)\ .outerjoin(Kegiatan)\ .filter(SpdItem.kegiatan_sub_id==row.kegiatan_sub_id, SpdItem.kegiatan_sub_id==KegiatanSub.id, KegiatanSub.kegiatan_id==Kegiatan.id, Kegiatan.kode=='0.00.00.21')\ .first() if r: bl = "%s" % Spd.get_nilai1(row.ap_spd_id) btl = "%s" % Spd.get_nilai2(row.ap_spd_id) else: bl = "%s" % Spd.get_nilai1(row.ap_spd_id) btl = "%s" % Spd.get_nilai2(row.ap_spd_id) return {'success': True, 'msg':'Sukses Hapus Data', 'jml_total1':bl, 'jml_total2':btl}
def gaji_group_act(self): ses = self.request.session req = self.request params = req.params url_dict = req.matchdict if url_dict['act']=='grid': columns = [] columns.append(ColumnDT('id')) columns.append(ColumnDT('group_name')) columns.append(ColumnDT('description')) columns.append(ColumnDT('member_count')) query = DBSession.query(Group) rowTable = DataTables(req, Group, query, columns) return rowTable.output_result() elif url_dict['act']=='headofnama': term = 'term' in params and params['term'] or '' rows = DBSession.query(Group.id, Group.group_name ).filter( Group.group_name.ilike('%%%s%%' % term) ).all() r = [] for k in rows: d={} d['id'] = k[0] d['value'] = k[1] r.append(d) return r
def view_edit(self): request = self.request row = self.query_id().first() uid = row.id kode = row.kode if not row: return id_not_found(request) form = self.get_form(EditSchema) if request.POST: if 'simpan' in request.POST: controls = request.POST.items() #Cek Kode Sama ato tidak a = form.validate(controls) b = a['kode'] c = "%s" % b cek = DBSession.query(Giro).filter(Giro.kode==c).first() if cek: kode1 = DBSession.query(Giro).filter(Giro.id==uid).first() d = kode1.kode if d!=c: self.request.session.flash('Kode Giro sudah ada', 'error') return HTTPFound(location=request.route_url('ap-giro-edit',id=row.id)) try: c = form.validate(controls) except ValidationFailure, e: return dict(form=form) self.save_request(dict(controls), row) return self.route_list()
def view_delete(request): q = query_id(request) row = q.first() if not row: return id_not_found(request) # Cek posting #if row.disabled: # request.session.flash('Data tidak dapat dihapus karena sudah Posting', 'error') # return route_list(request) ses = request.session ## variabel ag_step_id ag_step_id = ses['ag_step_id'] if row.disabled == 1 and row.approval==4: request.session.flash('Data tidak dapat dihapus karena sudah Posting', 'error') return route_list1(request,row.id) if row.approval==3: request.session.flash('Data tidak dapat dihapus karena sudah di Approval oleh Dispenda', 'error') return route_list1(request,row.id) if row.approval==2: request.session.flash('Data tidak dapat dihapus karena sudah di Approval oleh Bappeda', 'error') return route_list1(request,row.id) form = Form(colander.Schema(), buttons=('hapus','cancel')) values= {} if request.POST: if 'hapus' in request.POST: msg = '%s Kode %s No. %s %s sudah dihapus.' % (request.title, row.kode, row.no_urut, row.nama) DBSession.query(KegiatanSub).filter(KegiatanSub.id==request.matchdict['id']).delete() DBSession.flush() request.session.flash(msg) return route_list(request) return dict(row=row, form=form.render())
def view_delete(self): q = self.query_id() row = q.first() request=self.request if not row: return id_not_found(request) if row.posted: request.session.flash('Data sudah diposting', 'error') return self.route_list() if row.status_giro: request.session.flash('Data masih terdapat pada Giro', 'error') return self.route_list() form = Form(colander.Schema(), buttons=('hapus','cancel')) values= {} if request.POST: if 'hapus' in request.POST: #Untuk menghapus SP2D msg = '%s dengan kode %s telah berhasil.' % (request.title, row.kode) DBSession.query(Sp2d).filter(Sp2d.id==request.matchdict['id']).delete() DBSession.flush() request.session.flash(msg) #Untuk update status posted dan disabled pada SPM row = DBSession.query(Spm).filter(Spm.id==row.ap_spm_id).first() row.posted=0 row.disabled=0 self.save_request3(row) return self.route_list() return dict(row=row,form=form.render())
def gaji_act(self): ses = self.request.session req = self.request params = req.params url_dict = req.matchdict if url_dict['act']=='grid': columns = [] columns.append(ColumnDT('id')) columns.append(ColumnDT('kode')) columns.append(ColumnDT('nama')) columns.append(ColumnDT('programs.nama')) columns.append(ColumnDT('disabled')) query = Kegiatan.query() #DBSession.query(Kegiatan) rowTable = DataTables(req, Kegiatan, query, columns) return rowTable.output_result() elif url_dict['act']=='headofkode': term = 'term' in params and params['term'] or '' rows = DBSession.query(Kegiatan.id, Kegiatan.kode, Kegiatan.nama ).join(Program).filter( Program.kode!="0.00.00", Kegiatan.kode.ilike('%%%s%%' % term) ).all() r = [] for k in rows: d={} d['id'] = k[0] d['value'] = k[1] d['kode'] = k[1] d['nama'] = k[2] r.append(d) return r elif url_dict['act']=='headofnama': term = 'term' in params and params['term'] or '' rows = DBSession.query(Kegiatan.id, Kegiatan.kode, Kegiatan.nama ).join(Program).filter( Program.kode!="0.00.00", Kegiatan.nama.ilike('%%%s%%' % term) ).all() r = [] for k in rows: d={} d['id'] = k[0] d['value'] = k[2] d['kode'] = k[1] d['nama'] = k[2] r.append(d) return r elif url_dict['act']=='headofnama1': term = 'term' in params and params['term'] or '' rows = DBSession.query(Kegiatan.id, Kegiatan.kode, Kegiatan.nama ).join(Program).filter( #Program.kode!="0.00.00", Kegiatan.nama.ilike('%%%s%%' % term) ).all() r = [] for k in rows: d={} d['id'] = k[0] d['value'] = k[2] d['kode'] = k[1] d['nama'] = k[2] r.append(d) return r
def view_delete(request): q = query_id(request) row = q.first() if not row: return id_not_found(request) if row.posted: request.session.flash('Data sudah diposting SKPD', 'error') return route_list(request) if row.posted1: request.session.flash('Data sudah diposting PPKD', 'error') return route_list(request) if row.nominal: request.session.flash('Data tidak bisa dihapus, karena memiliki data items', 'error') return route_list(request) form = Form(colander.Schema(), buttons=('hapus','cancel')) values= {} if request.POST: if 'hapus' in request.POST: msg = '%s dengan kode %s telah berhasil.' % (request.title, row.kode) DBSession.query(Sts).filter(Sts.id==request.matchdict['id']).delete() DBSession.flush() request.session.flash(msg) return route_list(request) return dict(row=row, form=form.render())
def view_edit(request): row = query_id(request).first() uid = row.id kode = row.kode if not row: return id_not_found(request) if row.posted: request.session.flash('Data sudah diposting', 'error') return route_list(request) form = get_form(request, EditSchema) if request.POST: if 'simpan' in request.POST: controls = request.POST.items() #Cek Kode Sama ato tidak a = form.validate(controls) b = a['kode'] c = "%s" % b cek = DBSession.query(Sts).filter(Sts.kode==c).first() if cek: kode1 = DBSession.query(Sts).filter(Sts.id==uid).first() d = kode1.kode if d!=c: request.session.flash('Kode Sts sudah ada', 'error') return HTTPFound(location=request.route_url('ar-sts-edit',id=row.id)) try: c = form.validate(controls) except ValidationFailure, e: return dict(form=form) save_request(dict(controls), request, row) return route_list(request)
def save(self, values, user, row=None): if not row: row = FungsiUrusan() row.from_dict(values) DBSession.add(row) DBSession.flush() return row
def save(values, user, row=None): if not row: row = UserGroup() row.from_dict(values) DBSession.add(row) query_group_member(values) DBSession.flush() return row
def save(self, values, user, row=None): if not row: row = RekeningSap() row.from_dict(values) DBSession.add(row) DBSession.flush() return row
def save(values, row=None): if not row: row = KegiatanSub() row.from_dict(values) if not row.no_urut: row.no_urut = KegiatanSub.max_no_urut(row.tahun_id,row.unit_id,row.kegiatan_id)+1; DBSession.add(row) DBSession.flush() return row