diff --git a/bahmni_api_feed/models/api_event_worker.py b/bahmni_api_feed/models/api_event_worker.py index 8ebbc64..64712fb 100644 --- a/bahmni_api_feed/models/api_event_worker.py +++ b/bahmni_api_feed/models/api_event_worker.py @@ -53,12 +53,12 @@ def _create_or_update_customer(self, vals): for rec in customer_vals.keys(): if not customer_vals[rec]: del customer_vals[rec] - existing_customer = self.env['res.partner'].sudo().search([('ref', '=', patient_ref)]) + existing_customer = self.env['res.partner'].search([('ref', '=', patient_ref)]) if existing_customer: existing_customer.write(customer_vals) self._create_or_update_person_attributes(existing_customer.id,vals) else: - customer = self.env['res.partner'].sudo().create(customer_vals) + customer = self.env['res.partner'].create(customer_vals) self._create_or_update_person_attributes(customer.id,vals) @api.model @@ -94,7 +94,7 @@ def _get_address_details(self, address): @api.model def _find_country(self, address): - return self.env['res.company'].sudo().search([], limit=1).partner_id.country_id + return self.env['res.company'].search([], limit=1).partner_id.country_id @api.model def _find_or_create_level3(self, state, district, level_name, auto_create_customer_address_levels): @@ -154,32 +154,32 @@ def _create_or_update_person_attributes(self, cust_id, vals): address_data = vals.get('preferredAddress') if address_data.get('cityVillage') and cust_id: village_master = self.env['village.village'] - customer_master = self.env['res.partner'].sudo().search([('id', '=', cust_id)]) - identified_village = village_master.sudo().search([('name', '=', address_data.get('cityVillage'))], limit=1) + customer_master = self.env['res.partner'].search([('id', '=', cust_id)]) + identified_village = village_master.search([('name', '=', address_data.get('cityVillage'))], limit=1) if identified_village and customer_master: customer_master.village_id = identified_village.id else: - created_village = village_master.sudo().create({'name': address_data.get('cityVillage')}) + created_village = village_master.create({'name': address_data.get('cityVillage')}) customer_master.village_id = created_village.id if attributes['email'] and cust_id: - customer_master = self.env['res.partner'].sudo().search([('id', '=', cust_id)]) + customer_master = self.env['res.partner'].search([('id', '=', cust_id)]) if customer_master: customer_master.email = attributes['email'] customer_master.customer_rank = 1 ##Make a partner as a customer if address_data.get('country') and cust_id: country_master = self.env['res.country'] - customer_master = self.env['res.partner'].sudo().search([('id', '=', cust_id)]) - identified_country = country_master.sudo().search([('name', '=', address_data.get('country'))], limit=1) + customer_master = self.env['res.partner'].search([('id', '=', cust_id)]) + identified_country = country_master.search([('name', '=', address_data.get('country'))], limit=1) if identified_country: customer_master.country_id = identified_country.id for key in attributes: if key in [key for key in attributes]: column_dict = {'partner_id': cust_id} - existing_attribute = self.env['res.partner.attributes'].sudo().search([('partner_id', '=', cust_id),('name', '=', key)]) + existing_attribute = self.env['res.partner.attributes'].search([('partner_id', '=', cust_id),('name', '=', key)]) if any(existing_attribute): existing_attribute.unlink() column_dict.update({"name": key, "value" : attributes[key]}) - self.env['res.partner.attributes'].sudo().create(column_dict) + self.env['res.partner.attributes'].create(column_dict) diff --git a/bahmni_api_feed/models/drug_data_service.py b/bahmni_api_feed/models/drug_data_service.py index 1779ffa..5eff194 100644 --- a/bahmni_api_feed/models/drug_data_service.py +++ b/bahmni_api_feed/models/drug_data_service.py @@ -14,8 +14,8 @@ class DrugDataService(models.Model): def create_or_update_drug_category(self, vals): '''Method to create or update the child product category, under drug category''' drug_categ = json.loads(vals.get("drug_category")) - exist_categ = self.env["product.category"].sudo().search([('uuid', '=', drug_categ.get("id"))]) - parent_categ = self.env["product.category"].sudo().search([('name', '=', "Drug")], limit=1) + exist_categ = self.env["product.category"].search([('uuid', '=', drug_categ.get("id"))]) + parent_categ = self.env["product.category"].search([('name', '=', "Drug")], limit=1) updated_categ = self._fill_drug_category(drug_categ, parent_categ.id) if exist_categ: _logger.info("\nupdated : drug_category :\n") @@ -42,27 +42,27 @@ def _fill_drug_category(self, drug_categ_from_feed, parent_id=None): @api.model def create_or_update_drug(self, vals): '''Method for creating/updating a new product under drug category''' - products = self.env['product.product'].sudo().search([('uuid', '=', vals.get("uuid"))]) + products = self.env['product.product'].search([('uuid', '=', vals.get("uuid"))]) updated_drug = self._fill_drug_object(vals, products.ids) if products: - product = self.env['product.product'].sudo().browse(products.ids[0:1]) - product.sudo().write(updated_drug) + product = self.env['product.product'].browse(products.ids[0:1]) + product.write(updated_drug) else: - self.env['product.product'].sudo().create(updated_drug) + self.env['product.product'].create(updated_drug) @api.model def _fill_drug_object(self, drug_from_feed, drug_ids_from_db): '''Method which returns the values for creation/updation of product under drug category''' drug = {} category_name = drug_from_feed.get("dosageForm") - category = self.env["product.category"].sudo().search([('name', '=', category_name)]) + category = self.env["product.category"].search([('name', '=', category_name)]) if category.read([]): category_from_db = category.read([])[0] categ_id = category_from_db and category_from_db.get('id') or self._create_in_drug_category(category_name) else: - categ_parent_id = self.env['product.category'].sudo().search([('complete_name', '=', 'All / Saleable / Drugs')], limit=1).id - categ_id = self.env["product.category"].sudo().create({'name':category_name, 'parent_id': categ_parent_id}).id - list_price = drug_ids_from_db and self.env['product.product'].sudo().browse(drug_ids_from_db[0]).list_price or 0.0 + categ_parent_id = self.env['product.category'].search([('complete_name', '=', 'All / Saleable / Drugs')], limit=1).id + categ_id = self.env["product.category"].create({'name':category_name, 'parent_id': categ_parent_id}).id + list_price = drug_ids_from_db and self.env['product.product'].browse(drug_ids_from_db[0]).list_price or 0.0 drug["uuid"] = drug_from_feed.get("uuid") drug["name"] = drug_from_feed.get("name") drug["default_code"] = drug_from_feed.get("shortName") @@ -79,9 +79,9 @@ def _fill_drug_object(self, drug_from_feed, drug_ids_from_db): @api.model def _create_in_drug_category(self, categ_name): '''Method to create a new category, while creating a product, if category does not exists''' - parent_categ = self.env["product.category"].sudo().search([('name', '=', "Drug")]) + parent_categ = self.env["product.category"].search([('name', '=', "Drug")]) category = {'name': categ_name} if(parent_categ): category['parent_id'] = parent_categ.id - return self.env['product.category'].sudo().create(category).id + return self.env['product.category'].create(category).id diff --git a/bahmni_api_feed/models/order_save_service.py b/bahmni_api_feed/models/order_save_service.py index 33724e1..54fa7f9 100644 --- a/bahmni_api_feed/models/order_save_service.py +++ b/bahmni_api_feed/models/order_save_service.py @@ -27,9 +27,9 @@ def _get_openerp_orders(self, vals): def _get_warehouse_id(self, location, order_type_ref): _logger.info("\n identifying warehouse for warehouse %s, location %s", order_type_ref, location) if location: - operation_types = self.env['stock.picking.type'].sudo().search([('default_location_src_id', '=', location.id)]) + operation_types = self.env['stock.picking.type'].search([('default_location_src_id', '=', location.id)]) if operation_types: - mapping = self.env['order.picking.type.mapping'].sudo().search([('order_type_id', '=', order_type_ref.id), + mapping = self.env['order.picking.type.mapping'].search([('order_type_id', '=', order_type_ref.id), ('picking_type_id', 'in', operation_types.ids)], limit=1) if mapping: @@ -39,7 +39,7 @@ def _get_warehouse_id(self, location, order_type_ref): else: # either location should exist as stock location of a warehouse. - warehouse = self.env['stock.warehouse'].sudo().search([('lot_stock_id', '=', location.id)]) + warehouse = self.env['stock.warehouse'].search([('lot_stock_id', '=', location.id)]) if warehouse: return warehouse.id else: @@ -59,28 +59,28 @@ def _get_shop_and_location_id(self, orderType, location_name, order_type_record) SaleShop = self.env['sale.shop'] shop_list_with_order_type = None if location_name: - shop_list_with_order_type = OrderTypeShopMap.sudo().search( + shop_list_with_order_type = OrderTypeShopMap.search( [('order_type', '=', order_type_record.id), ('location_name', '=', location_name)]) _logger.info("\nFor specified order location name [%s], shop_list_with_orderType : %s", location_name, shop_list_with_order_type) if not shop_list_with_order_type: _logger.info("\nCouldn't identify OrderType-Shop mapping for specified order location name [%s], " "searching for default OrderType-Shop map", location_name) - shop_list_with_order_type = OrderTypeShopMap.sudo().search( + shop_list_with_order_type = OrderTypeShopMap.search( [('order_type', '=', order_type_record.id), ('location_name', '=', None)]) _logger.info("\nOrderType-Shop mappings without order location name specified: %s", shop_list_with_order_type) if not shop_list_with_order_type: _logger.info("\nCouldn't identify OrderType-Shop mapping for Order Type [%s]", orderType) - order_type = self.env['order.type'].sudo().search([('name', '=', orderType)], limit=1) - location_rec = self.env['stock.location'].sudo().search([('name', '=', location_name)], limit=1) + order_type = self.env['order.type'].search([('name', '=', orderType)], limit=1) + location_rec = self.env['stock.location'].search([('name', '=', location_name)], limit=1) if not location_rec: raise UserError("Location(Sales shop) does not exist in ERP") - shop_list_with_order_type = OrderTypeShopMap.sudo().create({ - "order_type": order_type.id if order_type else self.env['order.type'].sudo().create({'name': OrderType}), + shop_list_with_order_type = OrderTypeShopMap.create({ + "order_type": order_type.id if order_type else self.env['order.type'].create({'name': OrderType}), "location_name": location_name, - "shop_id": self.env['sale.shop'].sudo().search([('location_id', '=', location_rec.id)], limit=1).id, + "shop_id": self.env['sale.shop'].search([('location_id', '=', location_rec.id)], limit=1).id, "location_id": location_rec.id}) order_shop_map_object = shop_list_with_order_type[0] @@ -88,13 +88,13 @@ def _get_shop_and_location_id(self, orderType, location_name, order_type_record) if order_shop_map_object.shop_id: shop_id = order_shop_map_object.shop_id.id else: - shop_records = SaleShop.sudo().search([]) + shop_records = SaleShop.search([]) first_shop = shop_records[0] shop_id = first_shop.id if order_shop_map_object.location_id: location_id = order_shop_map_object.location_id.id else: - location_id = SaleShop.sudo().search([('id','=',shop_id)]).location_id.id + location_id = SaleShop.search([('id','=',shop_id)]).location_id.id _logger.info("\n__get_shop_and_location_id() returning shop_id: %s, location_id: %s", shop_id, location_id) return shop_id, location_id @@ -105,15 +105,15 @@ def create_orders(self, vals): location_name = vals.get("locationName") all_orders = self._get_openerp_orders(vals) - customer_ids = self.env['res.partner'].sudo().search([('ref', '=', customer_id)]) + customer_ids = self.env['res.partner'].search([('ref', '=', customer_id)]) if customer_ids: cus_id = customer_ids[0] for orderType, ordersGroup in groupby(all_orders, lambda order: order.get('type')): - order_type_def = self.env['order.type'].sudo().search([('name','=',orderType)]) + order_type_def = self.env['order.type'].search([('name','=',orderType)]) if (not order_type_def): - self.env['order.type'].sudo().create({"name" : orderType}) + self.env['order.type'].create({"name" : orderType}) _logger.info("\nOrder Type is not defined. Ignoring %s for Customer %s",orderType,cus_id) #continue @@ -133,7 +133,7 @@ def create_orders(self, vals): raise Warning(err_message) - shop_obj = self.env['sale.shop'].sudo().search([('id','=',shop_id)]) + shop_obj = self.env['sale.shop'].search([('id','=',shop_id)]) if shop_obj: pass else: @@ -153,7 +153,7 @@ def create_orders(self, vals): unprocessed_non_dispensed_order.append(unprocessed_order) if(len(unprocessed_non_dispensed_order) > 0): _logger.debug("\n Processing Unprocessed non dispensed Orders: %s", list(unprocessed_non_dispensed_order)) - sale_order_ids = self.env['sale.order'].sudo().search([('partner_id', '=', cus_id.id), + sale_order_ids = self.env['sale.order'].search([('partner_id', '=', cus_id.id), ('shop_id', '=', shop_id),#shop_id), ('state', '=', 'draft'), ('origin', '=', 'API FEED SYNC')]) @@ -177,7 +177,7 @@ def create_orders(self, vals): } if shop_obj.pricelist_id: sale_order_vals.update({'pricelist_id': shop_obj.pricelist_id.id}) - sale_order = self.env['sale.order'].sudo().create(sale_order_vals) + sale_order = self.env['sale.order'].create(sale_order_vals) _logger.debug("\n Created a new Sale Order for non dispensed orders. ID: %s. Processing order lines ..", sale_order.id) for rec in unprocessed_non_dispensed_order: self._process_orders(sale_order, unprocessed_non_dispensed_order, rec) @@ -185,7 +185,7 @@ def create_orders(self, vals): # Non Dispensed Update # replaced update_sale_order method call for order in sale_order_ids: - order.sudo().write({'care_setting': care_setting, 'provider_name': provider_name}) + order.write({'care_setting': care_setting, 'provider_name': provider_name}) for rec in unprocessed_non_dispensed_order: self._process_orders(order, unprocessed_non_dispensed_order, rec) # break from the outer loop @@ -231,7 +231,7 @@ def create_orders(self, vals): 'origin': 'API FEED SYNC'} if shop_obj.pricelist_id: sale_order_dict.update({'pricelist_id': shop_obj.pricelist_id.id}) - new_sale_order = self.env['sale.order'].sudo().create(sale_order_dict) + new_sale_order = self.env['sale.order'].create(sale_order_dict) _logger.debug("\n Created a new Sale Order. ID: %s. Processing order lines ..", new_sale_order.id) for line in unprocessed_dispensed_order: self._process_orders(new_sale_order, unprocessed_dispensed_order, line) @@ -270,7 +270,7 @@ def create_orders(self, vals): if shop_obj.pricelist_id: sales_order_obj.update({'pricelist_id': shop_obj.pricelist_id.id}) - sale_order_to_process = self.env['sale.order'].sudo().create(sales_order_obj) + sale_order_to_process = self.env['sale.order'].create(sales_order_obj) _logger.info("\n DEBUG: Created a new Sale Order. ID: %s", sale_order_to_process.id) _logger.debug("\n Processing dispensed lines. Appending to Order ID %s", sale_order_to_process.id) @@ -320,7 +320,7 @@ def _process_orders(self, sale_order, all_orders, order): parent_order = self._fetch_parent(all_orders, order) if(parent_order): self._process_orders(sale_order, all_orders, parent_order) - parent_order_line = self.env['sale.order.line'].sudo().search([('external_order_id', '=', order['previousOrderId'])]) + parent_order_line = self.env['sale.order.line'].search([('external_order_id', '=', order['previousOrderId'])]) if(order["voided"] or order.get('action', "") == "DISCONTINUE"): self._delete_sale_order_line(parent_order_line) elif(order.get('action', "") == "REVISE" and order_dispensed == "false"): @@ -348,17 +348,17 @@ def _create_sale_order_line(self, sale_order, order): @api.model def _get_order_quantity(self, order, default_quantity_value): - if(not self.env['syncable.units.mapping'].sudo().search([('name', '=', order['quantityUnits'])])): + if(not self.env['syncable.units.mapping'].search([('name', '=', order['quantityUnits'])])): return default_quantity_value return order['quantity'] @api.model def _get_order_line_uom(self, order_line, product_default_uom): - uom_ids = self.env['syncable.units.mapping'].sudo().search([('name', '=', order_line['quantityUnits'])]) + uom_ids = self.env['syncable.units.mapping'].search([('name', '=', order_line['quantityUnits'])]) if(uom_ids): uom_id = uom_ids.ids[0] - uom_obj = self.env['syncable.units.mapping'].sudo().browse(uom_id) + uom_obj = self.env['syncable.units.mapping'].browse(uom_id) if(uom_obj.unit_of_measure): return uom_obj.unit_of_measure.id return product_default_uom @@ -368,7 +368,7 @@ def _create_sale_order_line_function(self, sale_order, order): stored_prod_ids = self._get_product_ids(order) if(stored_prod_ids): prod_id = stored_prod_ids - prod_obj = self.env['product.product'].sudo().browse(prod_id) + prod_obj = self.env['product.product'].browse(prod_id) sale_order_line_obj = self.env['sale.order.line'] prod_lot = sale_order_line_obj.get_available_batch_details(prod_id, sale_order) @@ -404,8 +404,8 @@ def _create_sale_order_line_function(self, sale_order, order): 'expiry_date': prod_lot.expiration_date if prod_lot else False, } - sale_obj = self.env['sale.order'].sudo().browse(sale_order) - sale_line = sale_order_line_obj.sudo().create(sale_order_line) + sale_obj = self.env['sale.order'].browse(sale_order) + sale_line = sale_order_line_obj.create(sale_order_line) sale_line._compute_tax_id() if sale_obj.pricelist_id: @@ -417,7 +417,7 @@ def _create_sale_order_line_function(self, sale_order, order): pricelist = sale_obj.pricelist_id.id, uom = prod_obj.uom_id.id ) - price = self.env['account.tax'].sudo()._fix_tax_included_price_company(sale_line._get_display_price(), prod_obj.taxes_id, sale_line.tax_id, sale_line.company_id) + price = self.env['account.tax']._fix_tax_included_price_company(sale_line._get_display_price(), prod_obj.taxes_id, sale_line.tax_id, sale_line.company_id) sale_line.price_unit = price if product_uom_qty != order['quantity']: @@ -434,7 +434,7 @@ def _is_order_revised_processed(self, all_orders, order_to_process): parent_order_line = None for order in all_orders: if order.get('previousOrderId', '') == order_to_process.get('orderId'): - parent_order_line = self.env['sale.order.line'].sudo().search([('external_order_id', '=', order.get('orderId'))]) + parent_order_line = self.env['sale.order.line'].search([('external_order_id', '=', order.get('orderId'))]) break return True if parent_order_line and any(parent_order_line) else False @@ -447,7 +447,7 @@ def _filter_processed_orders(self, orders): if self._is_order_revised_processed(orders, order): continue dispensed_status = order.get('dispensed') == 'true' - existing_order_line = self.env['sale.order.line'].sudo().search([('external_order_id', '=', order['orderId'])]) + existing_order_line = self.env['sale.order.line'].search([('external_order_id', '=', order['orderId'])]) if not existing_order_line: unprocessed_orders.append(order) else: @@ -460,11 +460,11 @@ def _filter_processed_orders(self, orders): @api.model def _order_already_processed(self, external_order_id, dispensed_status): dispensed = True if dispensed_status == 'true' else False - existing_order_line = self.env['sale.order.line'].sudo().search([('external_order_id', '=', external_order_id)]) + existing_order_line = self.env['sale.order.line'].search([('external_order_id', '=', external_order_id)]) if not existing_order_line: return False elif any(existing_order_line): ###HARI - sale_order = self.env['sale.order'].sudo().search([('id', '=', existing_order_line[0].order_id.id)]) + sale_order = self.env['sale.order'].search([('id', '=', existing_order_line[0].order_id.id)]) _logger.info("\n Checking for order line's parent Order state") if sale_order.state not in ['draft']: return False @@ -486,11 +486,11 @@ def _filter_products_undefined(self, orders): @api.model def _get_product_ids(self, order): if order['productId']: - prod_ids = self.env['product.product'].sudo().search([('uuid', '=', order['productId'])]) + prod_ids = self.env['product.product'].search([('uuid', '=', order['productId'])]) if not prod_ids: raise UserError ("Product does not exits in ERP or Inactivated in ERP master.") else: - prod_ids = self.env['product.template'].sudo().search([('name', '=', order['conceptName'])]) + prod_ids = self.env['product.template'].search([('name', '=', order['conceptName'])]) return prod_ids.ids diff --git a/bahmni_api_feed/models/reference_data_service.py b/bahmni_api_feed/models/reference_data_service.py index ce11dd6..2abed75 100644 --- a/bahmni_api_feed/models/reference_data_service.py +++ b/bahmni_api_feed/models/reference_data_service.py @@ -13,12 +13,12 @@ class ReferenceDataService(models.Model): @api.model def create_or_update_ref_data(self, vals, category_name): product_obj = self.env["product.product"].with_context( - {"active_test": False}).sudo().search([('uuid', '=', vals.get("uuid"))], limit=1) + {"active_test": False}).search([('uuid', '=', vals.get("uuid"))], limit=1) updated_data = self._fill_data(vals, category=category_name) if product_obj: product_obj.write(updated_data) else: - self.env['product.product'].sudo().create(updated_data) + self.env['product.product'].create(updated_data) @api.model def _fill_data(self, vals, category=None): @@ -29,13 +29,13 @@ def _fill_data(self, vals, category=None): if specified_product_category: category_name = specified_product_category _logger.info("\n******* Creating Product with Category: %s, hierarchy: %s", category_name, category_hierarchy) - category_obj = self.env['product.category'].sudo().search([('name', '=', category_name)]) + category_obj = self.env['product.category'].search([('name', '=', category_name)]) if category_obj.read(): category_from_db = category_obj.read()[0] categ_id = category_from_db and category_from_db.get('id') or \ self._create_category_in_hierarchy(category_name, category_hierarchy).id else: - categ_id = self.env['product.category'].sudo().create({'name': category_name}).id + categ_id = self.env['product.category'].create({'name': category_name}).id data["uuid"] = vals.get("uuid") data["name"] = vals.get("name") @@ -63,14 +63,14 @@ def _get_category_hierarchy(self, category): def _create_category_in_hierarchy(self, category_name, category_hierarchy): _logger.info("\n creating product category %s, under hierarchy %s", category_name, category_hierarchy) if len(category_hierarchy) > 0: - category_ids = self.env['product.category'].sudo().search([('name', '=', category_hierarchy[0])]).ids + category_ids = self.env['product.category'].search([('name', '=', category_hierarchy[0])]).ids if len(category_ids) > 0: parent_id = category_ids[0] else: parent_category_name = category_hierarchy[0] del category_hierarchy[0] parent_id = self._create_category_in_hierarchy(parent_category_name, category_hierarchy) - return self.env['product.category'].sudo().create({'name': category_name, + return self.env['product.category'].create({'name': category_name, 'parent_id': parent_id}) else: - return self.env['product.category'].sudo().create({'name': category_name}) + return self.env['product.category'].create({'name': category_name}) diff --git a/bahmni_sale/models/sale_config_settings.py b/bahmni_sale/models/sale_config_settings.py index 3525358..dd1fe0e 100644 --- a/bahmni_sale/models/sale_config_settings.py +++ b/bahmni_sale/models/sale_config_settings.py @@ -17,7 +17,7 @@ class SaleConfigSettings(models.TransientModel): auto_create_customer_address_levels = fields.Boolean(string="Automatically create customer address for state, district, level3") def set_convert_dispensed(self): - return self.env['ir.values'].sudo().set_default( + return self.env['ir.values'].set_default( 'sale.config.settings', 'convert_dispensed', self.convert_dispensed) @api.model diff --git a/bahmni_sale/models/sale_order_line.py b/bahmni_sale/models/sale_order_line.py index 82dd027..dbbfe03 100644 --- a/bahmni_sale/models/sale_order_line.py +++ b/bahmni_sale/models/sale_order_line.py @@ -34,10 +34,10 @@ def onchange_product_id_inherit(self): @api.model def get_available_batch_details(self, product_id, sale_order): context = self._context.copy() or {} - sale_order = self.env['sale.order'].sudo().browse(sale_order) + sale_order = self.env['sale.order'].browse(sale_order) context['location_id'] = sale_order.location_id and sale_order.location_id.id or False context['search_in_child'] = True - stock_prod_lot = self.env['stock.lot'].sudo().search([('product_id','=', product_id.id if type(product_id) != list else product_id[0])]) + stock_prod_lot = self.env['stock.lot'].search([('product_id','=', product_id.id if type(product_id) != list else product_id[0])]) already_used_batch_ids = [] for line in sale_order.order_line: @@ -48,7 +48,7 @@ def get_available_batch_details(self, product_id, sale_order): ('id', 'not in', already_used_batch_ids if already_used_batch_ids else False)]\ if len(already_used_batch_ids) > 0 else [('product_id','=', product_id.id if type(product_id) != list else product_id[0])] - for prodlot in stock_prod_lot.sudo().search(query, order='expiration_date asc'): + for prodlot in stock_prod_lot.search(query, order='expiration_date asc'): if(prodlot.expiration_date and datetime.strptime(str(prodlot.expiration_date), DTF) > datetime.today()): return prodlot return None diff --git a/restful_api/__init__.py b/restful_api/__init__.py index 6bfba60..28bdaa9 100644 --- a/restful_api/__init__.py +++ b/restful_api/__init__.py @@ -1,4 +1,2 @@ -from . import controllers from . import models from . import common -from . import data diff --git a/restful_api/controllers/__init__.py b/restful_api/controllers/__init__.py deleted file mode 100644 index 9bac3fc..0000000 --- a/restful_api/controllers/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from . import token -from . import main diff --git a/restful_api/controllers/main.py b/restful_api/controllers/main.py deleted file mode 100755 index 8f0c827..0000000 --- a/restful_api/controllers/main.py +++ /dev/null @@ -1,262 +0,0 @@ -"""Part of odoo. See LICENSE file for full copyright and licensing details.""" - -import functools -import logging -import werkzeug.wrappers -import json -import datetime - -from odoo import http -from odoo.addons.restful_api.common import ( - extract_arguments, - invalid_response, - valid_response, -) -from odoo.http import request - -_logger = logging.getLogger(__name__) - -def default(o): - if isinstance(o, (datetime.date, datetime.datetime)): - return o.isoformat() - -def validate_token(func): - """.""" - - @functools.wraps(func) - def wrap(self, *args, **kwargs): - """.""" - access_token = request.httprequest.headers.get("Authorization") - if not access_token: - return invalid_response( - 401, "missing http request (or) access token",) - - access_token_data = ( - request.env["api.access_token"] - .sudo() - .search([("token", "=", access_token)], order="id DESC", limit=1) - ) - - if ( - access_token_data.find_one_or_create_token(user_id=access_token_data.user_id.id) - != access_token - ): - return invalid_response("401", "token seems to have expired or invalid") - - request.session.uid = access_token_data.user_id.id - request.uid = access_token_data.user_id.id - return func(self, *args, **kwargs) - - return wrap - -_routes = ["/api/", "/api//", "/api///"] - -#-------------------------------- example of api methods ----------------------------------------# - -class APIController(http.Controller): - """.""" - - def __init__(self): - self._model = "ir.model" - - @validate_token - @http.route(_routes, type="http", auth="none", methods=["GET","OPTIONS"], csrf=True, cors='*') - - def get(self, model=None, id=None, **payload): - ioc_name = model - model = request.env[self._model].sudo().search([("model", "=", model)], limit=1) - if model: - domain, fields, offset, limit, order = extract_arguments(payload) - data = ( - request.env[model.model] - .sudo() - .search_read( - domain=domain, - fields=fields, - offset=offset, - limit=limit, - order=order, - ) - ) - if id: - domain = [("id", "=", int(id))] - data = ( - request.env[model.model] - .sudo() - .search_read( - domain=domain, - fields=fields, - offset=offset, - limit=limit, - order=order, - ) - ) - if data: - return werkzeug.wrappers.Response( - status=200, - content_type="application/json; charset=utf-8", - headers=[("Cache-Control", "no-store"),('Access-Control-Allow-Headers', 'Origin, Content-Type, X-Auth-Token, charset'),('Access-Control-Allow-Methods','POST, GET, OPTIONS, DELETE, PUT'), ('Access-Control-Allow-Origin'), ("Pragma", "no-cache")], - response=json.dumps(data, default=default), - - ) - #return response - else: - return werkzeug.wrappers.Response( - status=200, - content_type="application/json; charset=utf-8", - headers=[("Cache-Control", "no-store"),('Access-Control-Allow-Headers', 'Origin, Content-Type, X-Auth-Token, charset'),('Access-Control-Allow-Methods','POST, GET, OPTIONS, DELETE, PUT'), ('Access-Control-Allow-Origin'), ("Pragma", "no-cache")], - response=json.dumps(data, default=default), - - ) - return werkzeug.wrappers.Response( - status=401, - content_type="application/json; charset=utf-8", - headers=[("Cache-Control", "no-store"),('Access-Control-Allow-Headers', 'Origin, Content-Type, X-Auth-Token, charset'),('Access-Control-Allow-Methods','POST, GET, OPTIONS, DELETE, PUT'), ('Access-Control-Allow-Origin'), ("Pragma", "no-cache")], - response=json.dumps( - { - "status": 401, - "message": "The %s is not available in the registry." % ioc_name - }, - default=datetime.datetime.isoformat, - ), - ) - - @validate_token - @http.route(_routes, type="http", auth="none", methods=["POST"], csrf=True, cors='*') - def post(self, model=None, id=None, **payload): - """Create a new record. - Basic sage: - import requests - - headers = { - 'content-type': 'application/x-www-form-urlencoded', - 'charset': 'utf-8', - 'access-token': 'access_token' - } - data = { - 'name': 'Babatope Ajepe', - 'country_id': 105, - 'child_ids': [ - { - 'name': 'Contact', - 'type': 'contact' - }, - { - 'name': 'Invoice', - 'type': 'invoice' - } - ], - 'category_id': [{'id': 9}, {'id': 10}] - } - req = requests.post('%s/api/res.partner/' % - base_url, headers=headers, data=data) - - """ - ioc_name = model - model = request.env[self._model].sudo().search([("model", "=", model)], limit=1) - if model: - try: - resource = request.env[model.model].sudo().create(payload) - except Exception as e: - return invalid_response("params", e) - else: - data = {"id": resource.id} - if resource: - return valid_response(data) - else: - return valid_response(data) - return invalid_response( - # "invalid object model", - 401, - "The model %s is not available in the registry." % ioc_name, - ) - - @validate_token - @http.route(_routes, type="http", auth="none", methods=["PUT"], csrf=True, cors='*') - def put(self, model=None, id=None, **payload): - """.""" - try: - _id = int(id) - except Exception as e: - return invalid_response( - "invalid object id", "invalid literal %s for id with base " % id - ) - _model = ( - request.env[self._model].sudo().search([("model", "=", model)], limit=1) - ) - if not _model: - return invalid_response( - 404, - "The model %s is not available in the registry." % model, - ) - try: - if "data" in payload: - temp=json.loads(payload['data'].replace("\'", '"')) - request.env[_model.model].sudo().browse(_id).write(temp) - else: - request.env[_model.model].sudo().browse(_id).write(payload) - - except Exception as e: - return invalid_response(payload, e) - else: - return valid_response( - payload - ) - - @validate_token - @http.route(_routes, type="http", auth="none", methods=["DELETE"], csrf=True, cors='*') - def delete(self, model=None, id=None, **payload): - """.""" - try: - _id = int(id) - except Exception as e: - return invalid_response( - "invalid object id", "invalid literal %s for id with base " % id - ) - try: - record = request.env[model].sudo().search([("id", "=", _id)]) - if record: - record.unlink() - else: - return invalid_response( - "missing_record", - "record object with id %s could not be found" % _id, - 404, - ) - except Exception as e: - return invalid_response("exception", e.name, 503) - else: - return valid_response("record %s has been successfully deleted" % record.id) - - @validate_token - @http.route(_routes, type="http", auth="none", methods=["PATCH"], csrf=True, cors='*') - def patch(self, model=None, id=None, action=None, **payload): - """.""" - try: - _id = int(id) - except Exception as e: - return invalid_response( - "invalid object id", "invalid literal %s for id with base " % id - ) - try: - record = request.env[model].sudo().search([("id", "=", _id)]) - _callable = action in [ - method for method in dir(record) if callable(getattr(record, method)) - ] - if record and _callable: - # action is a dynamic variable. - getattr(record, action)() - else: - return invalid_response( - "missing_record", - "record object with id %s could not be found or %s object has no method %s" - % (_id, model, action), - 404, - ) - except Exception as e: - return invalid_response("exception", e, 503) - else: - return valid_response("record %s has been successfully patched" % record.id) - - -############################################################################################## diff --git a/restful_api/controllers/token.py b/restful_api/controllers/token.py deleted file mode 100755 index 04d5896..0000000 --- a/restful_api/controllers/token.py +++ /dev/null @@ -1,98 +0,0 @@ -# Part of odoo. See LICENSE file for full copyright and licensing details. -import json -import logging -from urllib import response -import werkzeug.wrappers -import hashlib -import os -from base64 import b64encode -from os import urandom - -from odoo import http -from odoo.addons.restful_api.common import invalid_response, valid_response -from odoo.http import request -from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT -import datetime - -_logger = logging.getLogger(__name__) - -def default(o): - if isinstance(o, (datetime.date, datetime.datetime)): - return o.isoformat() - -expires_in = "restful_api.access_token_expires_in" - -#--------------------------------- Access_Key Login url ----------------------------------------# - -class AccessToken(http.Controller): - """.""" - - def __init__(self): - - self._token = request.env["api.access_token"] - self._expires_in = request.env.ref(expires_in).sudo().value - - @http.route("/api/odoo-login", methods=["POST","OPTIONS"], type="json", auth="none", csrf=True, cors='*') - def token(self, **post): - try: - json_data = json.loads(request.httprequest.data) - input_user_name = json_data.get("username"), - input_password = json_data.get("password") - if input_user_name[0] != None and input_user_name[0] != None: - res_usersss = request.env['res.users'].sudo().search([ - ('active','=',True), - ('login','=',input_user_name[0])]) - - if res_usersss: - assert input_password - request.env.cr.execute( - "SELECT COALESCE(password, '') FROM res_users WHERE id=%s", - [res_usersss.id] - ) - [hashed] = request.env.cr.fetchone() - valid, replacement = res_usersss._crypt_context()\ - .verify_and_update(input_password, hashed) - if replacement is not None: - res_usersss._set_encrypted_password(res_usersss.id, replacement) - if not valid: - return { - "error": { - "status":401, - "code": "invalid_credentials", - "message": "Incorrect password. Please provide the correct password." - } - } - request.env.company_id = 1 ###set company_id based logic users - exp = datetime.datetime.utcnow() + datetime.timedelta(days=1) - - rbytes = os.urandom(64) - random_pass = str(hashlib.sha256(rbytes).hexdigest()) - - token_values = request.env['api.access_token'].sudo().create({ - 'user_id': res_usersss.id, - 'expires': exp.strftime(DEFAULT_SERVER_DATETIME_FORMAT), - 'token': str(random_pass)}) - - token_key_visible = { - "status":200, - "message":"Success", - "data": - { - "user_id": res_usersss.id, - "username": input_user_name[0], - "access_token": str(random_pass), - } - } - - - return token_key_visible - - else: - return {'status':401,'message':'Wrong Username & Password. Check the account is in ERP once and try again.'} - else : - return {'status':401,'message':'Username & Password is must'} - - except Exception as e: - return {'error': 'An unexpected error occurred: ' + str(e)} -###################################################################################### - diff --git a/restful_api/data/ir_config_param.xml b/restful_api/data/ir_config_param.xml index 2039ca7..6f6c033 100755 --- a/restful_api/data/ir_config_param.xml +++ b/restful_api/data/ir_config_param.xml @@ -1,10 +1,5 @@ - - - access_token_expires_in - - 86400 - + diff --git a/restful_api/demo/demo.xml b/restful_api/demo/demo.xml deleted file mode 100644 index a31dfcf..0000000 --- a/restful_api/demo/demo.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/restful_api/models/__init__.py b/restful_api/models/__init__.py index d9dd642..577ae66 100644 --- a/restful_api/models/__init__.py +++ b/restful_api/models/__init__.py @@ -1,3 +1 @@ -from . import access_token -from . import ir_model from . import api_data_feed diff --git a/restful_api/models/access_token.py b/restful_api/models/access_token.py deleted file mode 100755 index 37e9253..0000000 --- a/restful_api/models/access_token.py +++ /dev/null @@ -1,71 +0,0 @@ -import hashlib -import logging -import os -from datetime import datetime, timedelta -import random -import base64 - -from odoo import api, fields, models -from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT - -_logger = logging.getLogger(__name__) - -expires_in = "restful_api.access_token_expires_in" - -class APIAccessToken(models.Model): - _name = "api.access_token" - - token = fields.Char("Access Token", required=True) - user_id = fields.Many2one("res.users", string="User", required=True) - expires = fields.Datetime("Expires", required=True) - - def find_one_or_create_token(self, user_id=None, create=False): - if not user_id: - user_id = self.env.user.id - - access_token = ( - self.env["api.access_token"] - .sudo() - .search([("user_id", "=", user_id)], order="id DESC", limit=1) - ) - if access_token: - access_token = access_token[0] - if access_token.has_expired(): - access_token = None - if not access_token and create: - expires = datetime.now() + timedelta( - seconds=int(self.env.ref(expires_in).sudo().value) - ) - - if not access_token: - return None - return access_token.token - - def is_valid(self, scopes=None): - """ - Checks if the access token is valid. - - :param scopes: An iterable containing the scopes to check or None - """ - self.ensure_one() - return not self.has_expired() and self._allow_scopes(scopes) - - def has_expired(self): - self.ensure_one() - return datetime.now() > fields.Datetime.from_string(self.expires) - - def _allow_scopes(self, scopes): - self.ensure_one() - if not scopes: - return True - - provided_scopes = set(self.scope.split()) - resource_scopes = set(scopes) - - return resource_scopes.issubset(provided_scopes) - -class Users(models.Model): - _inherit = "res.users" - token_ids = fields.One2many("api.access_token", "user_id", string="Access Tokens") - -########################################################################################### diff --git a/restful_api/models/api_data_feed.py b/restful_api/models/api_data_feed.py index 4a43a5c..7cf2229 100644 --- a/restful_api/models/api_data_feed.py +++ b/restful_api/models/api_data_feed.py @@ -19,36 +19,8 @@ def default(o): if isinstance(o, (datetime.date, datetime.datetime)): return o.isoformat() -def validate_token(func): - """.""" - @functools.wraps(func) - def wrap(self, *args, **kwargs): - """.""" - access_token = request.httprequest.headers.get("Authorization") - if not access_token: - return invalid_response(401, "Missing access token",) - - access_token_data = (request.env["api.access_token"].sudo().search([("token", "=", access_token)], order="id DESC", limit=1)) - - if (access_token_data.find_one_or_create_token(user_id=access_token_data.user_id.id) - != access_token): - - return invalid_response( - 401, "Missing access token", - ) - - request.session.uid = access_token_data.user_id.id - request.id = access_token_data.user_id.id - return func(self, *args, **kwargs) - - return wrap - -_routes = ["/api/", "/api//", "/api///"] - - class RestFullService(http.Controller): @http.route('/api/bahmni-saleorder', type="json", auth="user", methods=["POST","OPTIONS"], csrf=True, cors='*') - # @validate_token def bahmni_saleorder_creation(self, **kw): """ API Sale order creation from bahmin to Odoo """ json_data = json.loads(request.httprequest.data) @@ -62,7 +34,6 @@ def bahmni_saleorder_creation(self, **kw): } @http.route('/api/bahmni-customer', type="json", auth="user", methods=["POST","OPTIONS"], csrf=True, cors='*') - # @validate_token def bahmni_customer_feed(self, **kw): """ API customer feed from bahmin to Odoo """ json_data = json.loads(request.httprequest.data) @@ -76,7 +47,6 @@ def bahmni_customer_feed(self, **kw): } @http.route('/api/bahmni-drug', type="json", auth="user", methods=["POST","OPTIONS"], csrf=True, cors='*') - # @validate_token def bahmni_drug_feed(self, **kw): """ API Drug feed from bahmin to Odoo """ json_data = json.loads(request.httprequest.data) @@ -90,7 +60,6 @@ def bahmni_drug_feed(self, **kw): } @http.route('/api/bahmni-radiology-test', type="json", auth="user", methods=["POST","OPTIONS"], csrf=True, cors='*') - # @validate_token def bahmni_rediology_test(self, **kw): """ Rediology test API """ json_data = json.loads(request.httprequest.data) @@ -104,7 +73,6 @@ def bahmni_rediology_test(self, **kw): } @http.route('/api/bahmni-lab-test', type="json", auth="user", methods=["POST","OPTIONS"], csrf=True, cors='*') - # @validate_token def bahmni_lab_test(self, **kw): """ Lab test API """ json_data = json.loads(request.httprequest.data) @@ -118,7 +86,6 @@ def bahmni_lab_test(self, **kw): } @http.route('/api/bahmni-lab-panel', type="json", auth="user", methods=["POST","OPTIONS"], csrf=True, cors='*') - # @validate_token def bahmni_lab_panel(self, **kw): """ Lab Panel API """ json_data = json.loads(request.httprequest.data) @@ -132,7 +99,6 @@ def bahmni_lab_panel(self, **kw): } @http.route('/api/bahmni-service-sale', type="json", auth="user", methods=["POST","OPTIONS"], csrf=True, cors='*') - # @validate_token def bahmni_service_sale(self, **kw): """ Service Sale API """ json_data = json.loads(request.httprequest.data) diff --git a/restful_api/models/ir_model.py b/restful_api/models/ir_model.py deleted file mode 100755 index 0c8be24..0000000 --- a/restful_api/models/ir_model.py +++ /dev/null @@ -1,12 +0,0 @@ -# Part of odoo. See LICENSE file for full copyright and licensing details. - -from odoo import fields, models - -class IrModel(models.Model): - """Enable all models to be available for API request.""" - - _inherit = "ir.model" - - rest_api = fields.Boolean( - "REST API", default=True, help="Allow this model to be fetched through REST API" - ) diff --git a/restful_api/security/ir.model.access.csv b/restful_api/security/ir.model.access.csv deleted file mode 100644 index 331b3c2..0000000 --- a/restful_api/security/ir.model.access.csv +++ /dev/null @@ -1,2 +0,0 @@ -id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -access_restful_api_restful_api,restful_api.restful_api,model_restful_api_restful_api,base.group_user,1,1,1,1 \ No newline at end of file