Invoice number and taxes amounts creating invoices from custom Odoo module - python-2.7

I'm migrating invoices from OpenERP 7 database to Odoo8. I'm retrieving OERP7 data with psycopg2 and then using envs and model.create() to insert invoices into Odoo8 database. In general, the code works fine, but Odoo8 is not generating the invoice number (associated to account_move table) and amount_tax.
My codes are the following:
Import Account Invoice
class ImportAccountInvoice(Command):
"""Import account invoices from source DB"""
def process_account_invoice(self, model, data):
if not data:
return
# Model structure
model.create({
'account_id': data['account_id'],
'amount_tax': data['amount_tax'],
'amount_total': data['amount_total'],
'amount_untaxed': data['amount_untaxed'],
'check_total': data['check_total'],
'company_id': data['company_id'],
'currency_id': data['currency_id'],
'date_due': data['date_due'],
'date_invoice': data['date_invoice'],
'fiscal_position': data['fiscal_position'],
'internal_number': data['internal_number'],
'move_name': data['move_name'],
'name': data['name'],
'origin': data['origin'],
'partner_id': data['partner_id'],
'period_id': data['period_id'],
'reconciled': data['reconciled'],
'reference': data['reference'],
'residual': data['residual'],
'state': data['state'],
'type': data['type'],
'ship_addr_city': data['ship_addr_city'],
'ship_addr_name': data['ship_addr_name'],
'client_notes': data['client_notes'],
'ship_addr_state': data['ship_addr_state'],
'ship_addr_street': data['ship_addr_street'],
'ship_addr_phone': data['ship_addr_phone'],
'ship_addr_zip': data['ship_addr_zip'],
'drupal_order_name': data['drupal_order_name'],
'payment_method': data['payment_method'],
'drupal_total': data['drupal_total']
})
def run(self, cmdargs):
print "Importing account invoices"
execute_old_database_query("""
SELECT i.id, i.account_id, i.amount_tax, i.amount_total, i.amount_untaxed, i.check_total, i.company_id, i.currency_id, i.date_due,
i.date_invoice, i.fiscal_position, i.internal_number, i.journal_id, i.move_name, i.name, i.origin, i.partner_id, i.period_id,
i.reconciled, i.reference, i.residual, i.sent, i.state, i.type, i.x_dir_city, i.x_dir_name, i.x_dir_observations,
i.x_dir_state, i.x_dir_street, i.x_dir_telephone, i.x_dir_zip, i.x_drupal_order, i.x_pago, i.x_total,
rp.id, rp.email, rp.name, rp.type, rp.vat, rp.street,
rc.id, rc.name,
aa.id, aa.code, aa.name,
ap.id, ap.code, ap.name, ap.date_start, ap.date_stop,
aj.type, aj.code,
fp.name
FROM account_invoice i
LEFT JOIN res_partner rp
ON rp.id = i.partner_id
LEFT JOIN res_currency rc
ON rc.id = i.currency_id
LEFT JOIN account_account aa
ON aa.id = i.account_id
LEFT JOIN account_period ap
ON ap.id = i.partner_id
LEFT JOIN account_journal aj
ON aj.id = i.journal_id
LEFT JOIN account_fiscal_position fp
ON fp.id = i.fiscal_position
ORDER BY i.id;
""")
openerp.tools.config.parse_config(cmdargs)
dbname = openerp.tools.config['db_name']
r = modules.registry.RegistryManager.get(dbname)
cr = r.cursor()
with api.Environment.manage():
env = api.Environment(cr, 1, {})
# Define target model
account_invoice = env['account.invoice']
id_ptr = None
c_data = {}
while True:
r = src_cr.fetchone()
if not r:
self.process_account_invoice(account_invoice, c_data)
break
print r
account = env['account.account'].search([('code','=',r[43]),('name','=',r[44]),])
currency = env['res.currency'].search([('name','=',r[41]),])
period = match_account_period(env,code=r[46],name=r[47],date_start=r[48],date_stop=r[49])
journal = match_account_journal(env,type=r[50],code=r[51])
fiscal_position = match_account_fiscal_position(env,name=r[52])
company_id = 1
if r[38] is not None and r[39] is not None:
partner = env['res.partner'].search([('email','=',r[35]),('name','=',r[36]),('type','=',r[37]),('vat','=',r[38]),('street','=',r[39])])
elif r[38] is not None:
partner = env['res.partner'].search([('email','=',r[35]),('name','=',r[36]),('type','=',r[37]),('vat','=',r[38])])
elif r[39] is not None:
partner = env['res.partner'].search([('email','=',r[35]),('name','=',r[36]),('type','=',r[37]),('street','=',r[39])])
else:
partner = env['res.partner'].search([('email','=',r[35]),('name','=',r[36]),('type','=',r[37])])
# Take one when partners are duplicated
partner_id = partner.id if len(list(partner)) <= 1 else partner[0].id
fiscal_position_id = fiscal_position.id if fiscal_position else None
if id_ptr != r[0]:
self.process_account_invoice(account_invoice, c_data)
id_ptr = r[0]
c_data = {
'id': r[0],
'account_id': account.id,
'amount_tax': r[2],
'amount_total': r[3],
'amount_untaxed': r[4],
'check_total': r[5],
'company_id': company_id,
'currency_id': currency.id,
'date_due': r[8],
'date_invoice': r[9],
'fiscal_position': fiscal_position_id,
'internal_number': r[11],
'journal_id': journal.id,
'move_name': r[13],
'name': r[14],
'origin': r[15],
'partner_id': partner_id,
'partner_invoice_id': partner_id,
'partner_shipping_id': partner_id,
'period_id': period.id,
'reconciled': r[18],
'reference': r[19],
'residual': r[20],
'sent': r[21],
'state': r[22],
'type': r[23],
'ship_addr_city': r[24],
'ship_addr_name': r[25],
'client_notes': r[26],
'ship_addr_state': r[27],
'ship_addr_country': '',
'ship_addr_street': r[28],
'ship_addr_phone': r[29],
'ship_addr_zip': r[30],
'drupal_order_name': r[31],
'payment_method': r[32],
'drupal_total': r[33]
}
cr.commit()
cr.close()
Import Account Invoice Lines
class ImportAccountInvoiceLine(Command):
"""Import account invoice lines from source DB"""
def process_account_invoice_line(self, model, data):
if not data:
return
# Model structure
m = {
'account_id': data['account_id'],
'create_date': data['create_date'],
'company_id': data['company_id'],
'discount': data['discount'],
'invoice_id': data['invoice_id'],
'name': data['name'],
'partner_id': data['partner_id'],
'product_id': data['product_id'],
'quantity': data['quantity'],
'price_unit': data['price_unit'],
'price_subtotal': data['price_subtotal'],
'supplier_name': data['supplier_name'],
'supplier_ref': data['supplier_ref'],
'item_lot_number': data['item_lot_number'],
'item_expiration': data['item_expiration'],
'item_delivery_note': data['item_delivery_note'],
}
if not data['invoice_line_tax_id'] is None:
m['invoice_line_tax_id'] = [(4,data['invoice_line_tax_id'])] # http://stackoverflow.com/questions/31853402/filling-many2many-field-odoo-8
print model.create(m)
def recalculate_tax_amount(self,cr):
with api.Environment.manage():
env = api.Environment(cr, 1, {})
invoices = env['account.invoice'].search([])
account_invoice_tax = env['account.invoice.tax']
print "Recalculating invoice taxes"
for invoice in invoices:
print invoice
print invoice.action_move_create()
# print invoice.button_reset_taxes()
if invoice.id <= 32600:
break
def run(self, cmdargs):
print "Importing account invoice lines"
execute_old_database_query("""
SELECT il.id, il.account_id, il.create_date, il.company_id, il.discount, il.invoice_id, il.name, il.partner_id, il.price_unit,
il.price_subtotal, il.product_id, il.quantity, il.x_prov, il.x_ref_prov, il.x_lote, il.x_caducidad, il.x_albaran,
i.internal_number, i.name, i.origin, i.reference, i.type, i.x_drupal_order, i.date_invoice,
rp.email, rp.name, rp.type, rp.vat, rp.street,
pp.default_code, pp.name_template, pp.x_subcategoria, pp.x_marca,
at.type_tax_use, at.name
FROM account_invoice_line il
LEFT JOIN account_invoice i
ON i.id = il.invoice_id
LEFT JOIN res_partner rp
ON rp.id = il.partner_id
LEFT JOIN product_product pp
ON pp.id = il.product_id
LEFT JOIN account_invoice_line_tax ailt
ON ailt.invoice_line_id = il.id
LEFT JOIN account_tax at
ON at.id = ailt.tax_id
WHERE il.id > 28700
ORDER BY il.id DESC;
""")
openerp.tools.config.parse_config(cmdargs)
dbname = openerp.tools.config['db_name']
r = modules.registry.RegistryManager.get(dbname)
cr = r.cursor()
with api.Environment.manage():
env = api.Environment(cr, 1, {})
# Define target model
account_invoice_line = env['account.invoice.line']
id_ptr = None
c_data = {}
company_id = 1
while True:
r = src_cr.fetchone()
if not r:
self.process_account_invoice_line(account_invoice_line, c_data)
break
print r
print r[17],r[18],r[19],r[20],r[21]
if not (r[17] is None and r[18] is None and r[19] is None and r[20] is None):
account_invoice = env['account.invoice'].search([('internal_number','=',r[17]),('name','=',r[18]),('origin','=',r[19]),('reference','=',r[20]),('type','=',r[21]),('drupal_order_name','=',r[22]),('date_invoice','=',r[23])])
print "normal"
else:
print "parner"
if r[27] is not None and r[28] is not None:
partner = env['res.partner'].search([('email','=',r[24]),('name','=',r[25]),('type','=',r[26]),('vat','=',r[27]),('street','=',r[28])])
elif r[27] is not None:
partner = env['res.partner'].search([('email','=',r[24]),('name','=',r[25]),('type','=',r[26]),('vat','=',r[27])])
elif r[28] is not None:
partner = env['res.partner'].search([('email','=',r[24]),('name','=',r[25]),('type','=',r[26]),('street','=',r[28])])
else:
partner = env['res.partner'].search([('email','=',r[24]),('name','=',r[25]),('type','=',r[26])])
# Take one when partners are duplicated
partner_id = partner.id if len(list(partner)) <= 1 else partner[0].id
account_invoice = env['account.invoice'].search([('internal_number','=',r[17]),('name','=',r[18]),('origin','=',r[19]),('reference','=',r[20]),('type','=',r[21]),('drupal_order_name','=',r[22]),('date_invoice','=',r[23]),('partner_id','=',partner_id)])
if not account_invoice: # If there is not an account_invoice for this partner, continue with the next row
print "^ NO INVOICE FOR THIS LINE ^"
continue
product = env['product.product'].search([('default_code','=',r[29]),('name_template','=',r[30]),('subcategory_txt','=',r[31]),('brand','=',r[32])])
# Take one when invoices are duplicated
invoice = account_invoice if len(list(account_invoice)) <= 1 else account_invoice[0]
# Take one when products are duplicated
product_id = product.id if len(list(product)) <= 1 else product[0].id
print r[33],r[34]
if r[33] is None and r[34] is None:
tax_id = None
else:
tax = match_account_tax(env, r[33], r[34])
tax_id = tax.id
if id_ptr != r[0]:
self.process_account_invoice_line(account_invoice_line, c_data)
id_ptr = r[0]
c_data = {
'id': r[0],
'account_id': invoice.account_id.id,
'create_date': r[2],
'company_id': r[3],
'discount': r[4],
'invoice_id': invoice.id,
'name': r[6],
'partner_id': invoice.partner_id.id,
'price_unit': r[8],
'price_subtotal': r[9],
'product_id': product_id,
'quantity': r[11],
'supplier_name': r[12],
'supplier_ref': r[13],
'item_lot_number': r[14],
'item_expiration': r[15],
'item_delivery_note': r[16],
'invoice_line_tax_id': tax_id
}
cr.commit()
self.recalculate_tax_amount(cr)
cr.close()
I have associated Journals, Periods... but I can't get Odoo creates the account.move and compute all taxes. What should I do?
IMPORTANT: I need to assign the same number each invoice already have in old database.

The solution was to create a function to update invoice taxes and move, at the end of invoice lines insertion and before commit.
The function:
def refresh_invoices_and_recompute_taxes(self, model, invoice_ids):
for i in invoice_ids:
print "Updating invoice", i
invoice = model.browse(i)
print "- Computing taxes"
invoice.button_compute(set_total=True)
invoice.action_date_assign()
print "- Creating account move"
invoice.action_move_create()
print "- Assigning number"
invoice.action_number()
My class:
class ImportAccountInvoiceLine(Command):
"""Import account invoice lines from source DB"""
def process_account_invoice_line(self, model, data):
if not data:
return
m = {
'account_id': data['account_id'],
'create_date': data['create_date'],
'company_id': data['company_id'],
'discount': data['discount'],
'invoice_id': data['invoice_id'],
'name': data['name'],
'partner_id': data['partner_id'],
'product_id': data['product_id'],
'quantity': data['quantity'],
'price_unit': data['price_unit'],
'price_subtotal': data['price_subtotal'],
'supplier_name': data['supplier_name'],
'supplier_ref': data['supplier_ref'],
'item_lot_number': data['item_lot_number'],
'item_expiration': data['item_expiration'],
'item_delivery_note': data['item_delivery_note'],
}
if not data['invoice_line_tax_id'] is None:
m['invoice_line_tax_id'] = [(4,data['invoice_line_tax_id'])] # http://stackoverflow.com/questions/31853402/filling-many2many-field-odoo-8
# Model structure
model.create(m)
def refresh_invoices_and_recompute_taxes(self, model,invoice_ids):
for i in invoice_ids:
print "Updating invoice", i
invoice = model.browse(i)
print "- Computing taxes"
invoice.button_compute(set_total=True)
invoice.action_date_assign()
print "- Creating account move"
invoice.action_move_create()
print "- Assigning number"
invoice.action_number()
def run(self, cmdargs):
print "Importing account invoice lines"
execute_old_database_query("""
SELECT il.id, il.account_id, il.create_date, il.company_id, il.discount, il.invoice_id, il.name, il.partner_id, il.price_unit,
il.price_subtotal, il.product_id, il.quantity, il.x_prov, il.x_ref_prov, il.x_lote, il.x_caducidad, il.x_albaran,
i.internal_number, i.name, i.origin, i.reference, i.type, i.x_drupal_order, i.date_invoice,
rp.email, rp.name, rp.type, rp.vat, rp.street,
pp.default_code, pp.name_template, pp.x_subcategoria, pp.x_marca,
at.type_tax_use, at.name
FROM account_invoice_line il
LEFT JOIN account_invoice i
ON i.id = il.invoice_id
LEFT JOIN res_partner rp
ON rp.id = il.partner_id
LEFT JOIN product_product pp
ON pp.id = il.product_id
LEFT JOIN account_invoice_line_tax ailt
ON ailt.invoice_line_id = il.id
LEFT JOIN account_tax at
ON at.id = ailt.tax_id
ORDER BY il.invoice_id ASC, il.id ASC
LIMIT 10000;
""")
openerp.tools.config.parse_config(cmdargs)
dbname = openerp.tools.config['db_name']
r = modules.registry.RegistryManager.get(dbname)
cr = r.cursor()
invoice_ids = []
inv_id = 0
with api.Environment.manage():
env = api.Environment(cr, 1, {})
# Define target model
account_invoice_line = env['account.invoice.line']
id_ptr = None
c_data = {}
company_id = 1
while True:
r = src_cr.fetchone()
if not r:
self.process_account_invoice_line(account_invoice_line, c_data)
break
if not (r[17] is None and r[18] is None and r[19] is None and r[20] is None):
account_invoice = env['account.invoice'].search([('internal_number','=',r[17]),('name','=',r[18]),('origin','=',r[19]),('reference','=',r[20]),('type','=',r[21]),('drupal_order_name','=',r[22]),('date_invoice','=',r[23])])
else:
if r[27] is not None and r[28] is not None:
partner = env['res.partner'].search([('email','=',r[24]),('name','=',r[25]),('type','=',r[26]),('vat','=',r[27]),('street','=',r[28])])
elif r[27] is not None:
partner = env['res.partner'].search([('email','=',r[24]),('name','=',r[25]),('type','=',r[26]),('vat','=',r[27])])
elif r[28] is not None:
partner = env['res.partner'].search([('email','=',r[24]),('name','=',r[25]),('type','=',r[26]),('street','=',r[28])])
else:
partner = env['res.partner'].search([('email','=',r[24]),('name','=',r[25]),('type','=',r[26])])
# Take one when partners are duplicated
partner_id = partner.id if len(list(partner)) <= 1 else partner[0].id
account_invoice = env['account.invoice'].search([('internal_number','=',r[17]),('name','=',r[18]),('origin','=',r[19]),('reference','=',r[20]),('type','=',r[21]),('drupal_order_name','=',r[22]),('date_invoice','=',r[23]),('partner_id','=',partner_id)])
if not account_invoice: # If there is not an account_invoice for this partner, continue with the next row
print "^ NO INVOICE FOR THIS LINE ^"
continue
product = env['product.product'].search([('default_code','=',r[29]),('name_template','=',r[30]),('subcategory_txt','=',r[31]),('brand','=',r[32])])
# Take one when invoices are duplicated
invoice = account_invoice if len(list(account_invoice)) <= 1 else account_invoice[0]
# Take one when products are duplicated
product_id = product.id if len(list(product)) <= 1 else product[0].id
if not invoice:
continue
else:
if inv_id != invoice.id:
inv_id = invoice.id
invoice_ids.append(inv_id)
tax = match_account_tax(env, r[33], r[34])
tax_id = tax.id if tax is not None and tax else None
if id_ptr != r[0]:
id_ptr = r[0]
c_data = {
'id': r[0],
'account_id': invoice.account_id.id,
'create_date': r[2],
'company_id': r[3],
'discount': r[4],
'invoice_id': invoice.id,
'name': r[6],
'partner_id': invoice.partner_id.id,
'price_unit': r[8],
'price_subtotal': r[9],
'product_id': product_id,
'quantity': r[11],
'supplier_name': r[12],
'supplier_ref': r[13],
'item_lot_number': r[14],
'item_expiration': r[15],
'item_delivery_note': r[16],
'invoice_line_tax_id': tax_id
}
self.process_account_invoice_line(account_invoice_line, c_data)
self.refresh_invoices_and_recompute_taxes(env['account.invoice'], invoice_ids)
cr.commit()
cr.close()

Related

Retrieving Stripe metadata and process it

I am sending cart data from the cookies to Stripe and retrieving it, but I am unable to find a solution to process it correctly.
Please help!
I am learning Django and wanted to save the cart items of non-logged users into the cookies and send it to Stripe, as Metadata.
From there retrieve it and if the checkout is completed to process the order, but I am unsuccessful to process the data that is retrieved to be able to save the order.
Stripe Checkout Session:
#csrf_exempt
def create_checkout_session(request):
stripe.api_key = settings.STRIPE_SECRET_KEY
domain_url = 'http://localhost:8000/checkout/'
if request.user.is_authenticated:
customer = request.user.customer
else:
data = json.loads(request.body)
total = data['form']['total'].replace('.', '')
email = data['form']['email']
first_name = data['form']['first_name']
last_name = data['form']['last_name']
customer, created = Customer.objects.get_or_create(
email=email
)
customer.first_name = first_name
customer.last_name = last_name
customer.save()
cart_info = cart_details(request)
cart_items = cart_info['cart_items']
order = cart_info['order']
items = cart_info['items']
print(items)
if request.method == 'GET':
checkout_session = stripe.checkout.Session.create(
shipping_address_collection={
"allowed_countries":
["US", "CA", "NL", "GB"]
},
client_reference_id=request.user.id,
customer_email=request.user.email,
success_url=domain_url + 'success?session_id={CHECKOUT_SESSION_ID}',
cancel_url=domain_url + 'cancelled/',
payment_method_types=['card'],
mode='payment',
line_items=[
{
'name': 'Kenpachi Katana Store',
'quantity': 1,
'currency': 'usd',
'amount': int(order.get_cart_total*100),
}
]
)
return JsonResponse({'sessionId': checkout_session['id']})
else:
checkout_session = stripe.checkout.Session.create(
shipping_address_collection={
"allowed_countries":
["US", "CA", "NL"]
},
**metadata=[items]**,
client_reference_id=customer.id,
customer_email=email,
success_url=domain_url + 'success?session_id={CHECKOUT_SESSION_ID}',
cancel_url=domain_url + 'cancelled/',
payment_method_types=['card'],
mode='payment',
line_items=[
{
'name': 'Kenpachi Katana Store',
'quantity': 1,
'currency': 'usd',
'amount': total,
}
]
)
return JsonResponse({'sessionId': checkout_session['id']})
Terminal Output with the Cookie Cart variable:
print(type(items))
<class 'list'>
And:
[{'product':
`{'id': 1,
'name': 'Sasuke Katana',
'price': Decimal('270.00'),
'imageURL': '/media/1_ccbb983f-a35d-40f8-8efb-dc55db02ad8f_700x.webp'},
'quantity': 1,
'get_total': Decimal('270.00')},
`
{'product':
{'id': 3,
'name': 'Zoro Katana',
'price': Decimal('260.00'),
'imageURL': '/media/1_466b0afb-d483-4a32-b0bb-89388aeccaa4_700x.webp'},
'quantity': 1,
'get_total': Decimal('260.00')
}]
And it easy to loop through it
for item in items:
print(item)
Output:
enter image description here
After the the order is completed, I retrieve the Stripe Session to fulfill the order
#csrf_exempt
def stripe_webhook(request):
stripe.api_key = settings.STRIPE_SECRET_KEY
endpoint_secret = settings.STRIPE_ENDPOINT_SECRET
payload = request.body
sig_header = request.META['HTTP_STRIPE_SIGNATURE']
event = None
try:
event = stripe.Webhook.construct_event(
payload,
sig_header,
endpoint_secret
)
except ValueError as e:
return HttpResponse(status=400)
except stripe.error.SignatureVerificationError as e:
return HttpResponse(status=400)
if event['type'] == 'checkout.session.completed':
session = event['data']['object']
session = stripe.checkout.Session.retrieve(
event['data']['object']['id'],
expand=['line_items'],
)
stripe_metadata = session['metadata'].setdefault('0')
print(stripe_metadata)
print(type(stripe_metadata))
# Fulfill the purchase...
# TODO: drill down on the metadata from stripe
transaction_id = datetime.datetime.now().timestamp()
total = session['amount_total']
customer_id = session['client_reference_id']
customer = Customer.objects.get(pk=customer_id)
order, created = Order.objects.get_or_create(
customer=customer,
complete=False
)
order.transaction_id = transaction_id
if (total / 100) == int(order.get_cart_total):
order.complete = True
ShippingAddress.objects.create(
customer=customer,
order=order,
address=session['shipping']['address']['line1'],
city=session['shipping']['address']['city'],
state=session['shipping']['address']['state'],
zipcode=session['shipping']['address']['postal_code'],
country=session['shipping']['address']['country'],
)
order.save()
print('Order was added to the database')
return HttpResponse(status=200)
Terminal Output:
enter image description here
What would be the best option to retrieve it in the same format, to be able to iterate through the products of the cart.
Any help would be deeply appreciated.
GitHub repo with the cookie cart function:
https://github.com/GeorgianF/Kenpachi-P5-CI/blob/main/cart/utils.py
Thank you!
Maybe you can try
stripe_metadata = json.loads(str(stripe_metadata))
to convert string to JSON format

Filter Creation Date By Time Range

Im trying to filter my first two IF statement to only show the created_at records from 8 am to 10 am for todays current date, right now it just does the date, i need change date= date to created_at = '' however that would be done in a range. Here is my views.py. How do i add this to my IF statement ? Thanks
views.py
def Student_Progress(request, studentpsid):
if request.method == "GET":
date = datetime.date.today()
# Calculates Points on Student Progress Page
academic = K8Points.objects.values_list('academic', flat=True).filter(
student_name_id=studentpsid).filter(date=date)
behavior = K8Points.objects.values_list('behavior', flat=True).filter(
student_name_id=studentpsid).filter(date=date)
my_class_id = request.session['my_class_id']
academic_total = 0
behav_total = 0
for score in academic:
academic_total += int(score)
for score in behavior:
behav_total += int(score)
grand_total = academic_total + behav_total
counseling = Student.objects.values_list(
'counseling_goal', flat=True).get(studentpsid=studentpsid)
studentid = Student.objects.get(studentpsid=studentpsid)
k8obj = K8Points.objects.filter(
student_name_id=studentpsid, date=date).order_by('time_frame')
# Checks To See If a Student Gets Morning Recess
if grand_total >= 20 and K8Points.objects.filter(time_frame=1).filter(date=date) and K8Points.objects.filter(time_frame=2).filter(date=date) and K8Points.objects.filter(time_frame=3).filter(date=date):
morning_recess = "YES"
context = ({'studentid': studentid, 'date': date, 'counseling': counseling, 'grand_total': grand_total, 'academic_total': academic_total,
'behav_total': behav_total, 'k8obj': k8obj, 'my_class_id': my_class_id, 'morning_recess': morning_recess})
return render(request, 'points/student_progress.html', context)
if grand_total <= 20 and K8Points.objects.filter(time_frame=1) and K8Points.objects.filter(time_frame=2) and K8Points.objects.filter(time_frame=3).filter(date=date):
morning_recess = "NO"
context = ({'studentid': studentid, 'date': date, 'counseling': counseling, 'grand_total': grand_total, 'academic_total': academic_total,
'behav_total': behav_total, 'k8obj': k8obj, 'my_class_id': my_class_id, 'morning_recess': morning_recess})
return render(request, 'points/student_progress.html', context)
else:
context = ({'studentid': studentid, 'date': date, 'counseling': counseling, 'grand_total': grand_total, 'academic_total': academic_total,
'behav_total': behav_total, 'k8obj': k8obj, 'my_class_id': my_class_id, })
return render(request, 'points/student_progress.html', context)
models.py
class K8Points(models.Model):
date = models.DateField(default=datetime.date.today())
class_name = models.ForeignKey(TeacherClass, on_delete = models.PROTECT, default = "",)
student_name = models.ForeignKey(Student,on_delete = models.CASCADE, default ="" ,)
week_of = models.IntegerField(default=weeknumber)
day = models.CharField(max_length= 10, default = dayofweek)
TIME_FRAME_CHOICES = [
(None, 'PLEASE SELECT TIME FRAME'), # THIS IS OPTIONAL
(1, '(1.) 8:45AM - 9:00AM'),
(2, '(2.) 9:00AM - 9:30AM'),
(3, '(3.) 9:30AM - 10:00AM'),
(4, '(4.) REC. I 10:00AM -10:10AM'),
(5, '(5.) 10:10AM-10:40AM'),
(6, '(6.) 10:40AM-11:10AM'),
(7, '(7.) 11:10AM-11:40AM'),
(8, '(8.) REC II LUNCH 11:40AM-12:20PM'),
(9, '(9.) 12:20PM-12:50PM'),
(10,'(10.) 12:50PM-1:20PM'),
(11,'(11.) 1:20PM-1:50PM'),
(12,'(12.) 1:50PM-2:20PM'),
(13,'(13.) REC. III 2:20PM-2:30PM'),
]
time_frame = models.PositiveSmallIntegerField(choices=TIME_FRAME_CHOICES,)
behavior = models.IntegerField(default="", validators=[
MaxValueValidator(5),
MinValueValidator(1)
])
academic = models.IntegerField(default="", validators=[
MaxValueValidator(5),
MinValueValidator(0)
] )
total = models.IntegerField(default=0 )
morning_recess= models.CharField(max_length= 3, blank = True ,default = "" )
created_at = models.DateTimeField(auto_now_add=True)
for today day filter
today_date = datetime.datetime.now().date()
.filter(your_datetime_field__date = today_date)
for hour filter
.filter(your_datetime_field__hour__lte = 10).filter(your_datetime_field__hour__gte = 8)
Keep in mind that 10:59:59 will be in results of this query too.
If you need only 8:00:00 - 9:59:59 use lt instead of lte

Django: raise ValidationError doesn't work

Anyone who can explain me, why my ValidationError in my form doesn't work? I can see "Test" in my terminal, but the ValidationError doesn't show. I am happy to share the full code, but maybe the mistake already lies in the snippet below?
def clean_ticket(self):
ticket = self.cleaned_data['ticket']
if not self.event == ticket.event:
print("Test")
raise forms.ValidationError(
_("The ticket you chose doesn't belong to your event."),
code='ticket_belongs_to_event_validation',
)
return ticket
Full length code:
class ReserveForm(forms.ModelForm):
"""
* Pass inital tickets into form.
* Check if quantity is lower than defined max qty per ticket.
* Check if quantity is available.
* Clean function for quantity field.
"""
class Meta:
model = ReservedItem
fields = ['ticket', 'quantity']
def __init__(self, organizer, event, *args, **kwargs):
self.organizer = organizer
self.event = event
self.ticket = kwargs['initial']['ticket']
super().__init__(*args, **kwargs)
self.fields['ticket'].widget = forms.HiddenInput()
self.fields['quantity'].widget.attrs['placeholder'] = '0'
self.fields['quantity'].widget.attrs['class'] = 'form-control' # TODO Marc
def check_if_qty_lower_than_max_qty_per_ticket(self, new_added_quantity, max_qty_per_ticket):
if new_added_quantity and new_added_quantity > max_qty_per_ticket:
raise forms.ValidationError(
_("You can only buy %(max_quantity)s tickets per ticket type."),
code='max_qty_per_ticket',
params={'max_quantity': max_qty_per_ticket},
)
def check_if_qty_is_available(self, new_added_quantity):
ticket_pk = self.ticket.pk
ticket_name = self.ticket.name
max_quantity = self.ticket.quantity
# Check OrderItem
order_items_qty = OrderItem.objects.filter(
ticket__pk=ticket_pk
).aggregate(Sum('quantity'))
# Check ReservedItem within the last x minutes
time_threshold = timezone.now() - timedelta(minutes=settings.MINUTES_TICKET_RESERVATION)
reserved_items_qty = ReservedItem.objects.filter(
ticket__pk=ticket_pk,
created__gt=time_threshold,
).aggregate(Sum('quantity'))
# Calculate reserved quantity and new quantity
order_items_qty = order_items_qty['quantity__sum']
reserved_items_qty = reserved_items_qty['quantity__sum']
order_items_qty = 0 if not order_items_qty else order_items_qty
reserved_items_qty = 0 if not reserved_items_qty else reserved_items_qty
qty_reserved = order_items_qty + reserved_items_qty
new_quantity = qty_reserved + new_added_quantity
# Validation
if new_quantity > max_quantity:
tickets_left_total = max_quantity - qty_reserved
raise forms.ValidationError(
_("%(ticket_name)s: There are not enough tickets left. Maximum you can choose is %(value)s."),
code='qty_available',
params={'ticket_name': ticket_name, 'value': tickets_left_total},
)
def clean_ticket(self):
ticket = self.cleaned_data['ticket']
if not self.event == ticket.event:
print("Test")
raise forms.ValidationError(
_("The ticket you chose doesn't belong to your event."),
code='ticket_belongs_to_event_validation',
)
return ticket
def clean_quantity(self):
new_added_quantity = self.cleaned_data['quantity']
if new_added_quantity:
self.check_if_qty_lower_than_max_qty_per_ticket(
new_added_quantity=new_added_quantity,
max_qty_per_ticket=self.organizer.max_qty_per_ticket,
)
self.check_if_qty_is_available(
new_added_quantity=new_added_quantity,
)
# Always return a value to use as the new cleaned data, even if
# this method didn't change it.
return new_added_quantity

Odoo - How to get report data based on company_id

I'm trying to get payroll data for each company's employees in a report based on company_id.
Here's my code:
in my wizard:
class hr_wps_report(osv.osv_memory):
_name = 'hr.wps.report'
_description = 'WPS Report'
_columns = {
'date_from':fields.date("Start Date"),
'date_to':fields.date("End Date"),
'company_id': fields.many2one('res.company', 'Company', select=True, required=False),
}
_defaults = {
'date_from': lambda *a: time.strftime('%Y-%m-01'),
'date_to': lambda *a: str(datetime.now() + relativedelta.relativedelta(months=+1, day=1, days=-1))[:10],
'company_id': lambda self, cr, uid, context: self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.id,
}
def print_report(self, cr, uid, ids, data, context=None):
if context is None:
context = {}
data['form'] = self.read(cr, uid, ids, ['date_from', 'date_to', 'company_id'], context=context)[0]
return self.pool['report'].get_action(cr, uid, [], 'hr_wps.report_wpsreport', data=data, context=context)
in my report:
class wpsreport(report_sxw.rml_parse):
def __init__(self, cr, uid, name, context):
super(wpsreport, self).__init__(cr, uid, name, context=context)
self.localcontext.update({
'time': time,
'get_lines': self._get_lines,
})
def set_context(self, objects, data, ids, report_type=None):
self.date_start = data['form'].get('date_from', time.strftime('%Y-%m-%d'))
self.date_end = data['form'].get('date_to', time.strftime('%Y-%m-%d'))
self.company_id = data['form'].get('company_id')
return super(wpsreport, self).set_context(objects, data, ids, report_type=report_type)
def _get_lines(self, form):
res = []
self.cr.execute("""SELECT hr_employee.name_related,
(SELECT hr_payslip_line.total
FROM hr_payslip_line, hr_payslip
WHERE hr_employee.id = hr_payslip.employee_id
AND hr_payslip_line.slip_id = hr_payslip.id
AND hr_payslip_line.code = 'BASIC'
AND hr_payslip.date_from BETWEEN %s AND %s) as basic,
(SELECT hr_payslip_line.total
FROM hr_payslip_line, hr_payslip
WHERE hr_employee.id = hr_payslip.employee_id
AND hr_payslip_line.slip_id = hr_payslip.id
AND hr_payslip_line.code = 'ALLOWANCES'
AND hr_payslip.date_from BETWEEN %s AND %s) as total_allowance,
(SELECT hr_payslip_line.total
FROM hr_payslip_line, hr_payslip
WHERE hr_employee.id = hr_payslip.employee_id
AND hr_payslip_line.slip_id = hr_payslip.id
AND hr_payslip_line.code = 'DEDUCTIONS'
AND hr_payslip.date_from BETWEEN %s AND %s) as total_deduction,
(SELECT hr_payslip_line.total
FROM hr_payslip_line, hr_payslip
WHERE hr_employee.id = hr_payslip.employee_id
AND hr_payslip_line.slip_id = hr_payslip.id
AND hr_payslip_line.code = 'NET'
AND hr_payslip.date_from BETWEEN %s AND %s) as total
FROM hr_employee,
hr_payslip,
res_company
WHERE hr_payslip.employee_id = hr_employee.id
AND hr_payslip.company_id = res_company.id
AND hr_payslip.date_from BETWEEN %s AND %s
AND hr_payslip.company_id = %s""", (self.date_start, self.date_end, self.date_start, self.date_end, self.date_start, self.date_end, self.date_start, self.date_end, self.date_start, self.date_end, self.company_id))
employees = self.cr.dictfetchall()
for emp in employees:
value = {}
value['name_related'] = emp['name_related']
value['basic'] = emp['basic']
value['total_allowance'] = emp['total_allowance']
value['total_deduction'] = emp['total_deduction']
value['total'] = emp['total']
value['No_working_days'] = 30
value['extra_hours'] = 0
res.append(value)
return res
But I'm getting Error of:
QWebException: "invalid input syntax for integer: "Yourcompany"
AND hr_payslip.company_id = ARRAY[9, 'Yourcompany']
How to fix it?
Try with:
hr_payslip.company_id.id
well I found an answer for my problem and it fixed it
instead of self.company_id in the sql query
replace it with self.company_id[0]

Allow user to sign up only for shifts that are not yet claimed?

I have a table of shifts for meals:
class mealShifts(models.Model):
Sunday = "Sunday"
Monday = "Monday"
Tuesday = "Tuesday"
Wednesday = "Wednesday"
Thursday = "Thursday"
Friday = "Friday"
Days = (
(0, "Sunday"),
(1, "Monday"),
(2, "Tuesday"),
(3, "Wednesday"),
(4, "Thursday"),
(5, "Friday"),
(6, "Saturday")
)
Breakfast = "Breakfast"
Dinner = "Dinner"
Meals = (
(Breakfast, "Breakfast"),
(Dinner, "Dinner"),
)
Chef = "Chef"
Sous_Chef = "Sous-Chef"
KP ="KP"
Shifts = (
(Chef, "Chef"),
(Sous_Chef, "Sous_Chef"),
(KP, "KP"),
)
assigned = models.BooleanField(default=False)
day = models.CharField(max_length = 1, choices=Days)
meal = models.CharField(max_length = 10, choices=Meals)
shift = models.CharField(max_length = 10, choices=Shifts, default=KP)
camper = models.OneToOneField(User)
class Meta:
unique_together = ("day", "meal", "shift")
def __str__(self):
return '%s %s %s %s'%(self.day, self.meal, self.shift, self.camper)
And here is my view:
#login_required(login_url='login.html')
def signup(request):
sundayShifts = mealShifts.objects.filter(day="Sunday")
mondayShifts = mealShifts.objects.filter(day="Monday")
#the rest of the shifts will go here
username = None
context = RequestContext(request)
if request.method == 'POST':
form = MealForm(request.POST)
if form.is_valid():
shift = form.save(commit=False)
shift.camper = request.user
shift.save()
return redirect('signup')
else:
print form.errors
else:
form = MealForm()
return render_to_response('signup.html',
RequestContext(request, {'form':form,'username':username, 'sundayShifts':sundayShifts, 'mondayShifts':mondayShifts},))
There are 42 possible meal shifts. How can I create a view that will display only the shift choices that nobody has taken - the possible combinations which aren't yet in the database?
You could do something like:
import itertools
# Ideally, reuse these from the model some how
day_choices = range(0, 6)
meal_choices = [Breakfast, Dinner]
shift_choices = [Chef, Sous_Chef, KP]
shift_options = itertools.product(day_choices, meal_choices, shift_choices)
avaliable_shift_choices = filter(
lambda option: not mealShifts.objects.filter(day=options[0], meal=option[1], shift=option[2]).exists(),
shift_options
)
This will give you combinations of day, meal and shift not currently in the db, without loading too much data, or being too expensive on the db.