Hey guys please help. I have created a controller in odoo17 and when try to POST a request using postman I am getting the error below.
2025-06-23 08:15:22,702 18051 INFO ? werkzeug: 127.0.0.1 - - [23/Jun/2025 08:15:22] "POST /api/student/create HTTP/1.1" 404 - 1 0.003 0.042
I have also imported my file in the __init__.py
from . import student_api_controller
Here is the url I am using in postman
http://localhost:8069/api/student/create
Here is my controller
from odoo import http
from odoo.http import request
import json
import urllib
import logging
_logger = logging.getLogger(__name__)
class StudentAPI(http.Controller):
@http.route('/api/student/create', type='http', auth='public', methods=['POST'], csrf=False)
def create_student(self, **kw):
try:
# Manually parse JSON data from the request body
data = json.loads(request.httprequest.data.decode('utf-8'))
# Ensure the data is a list
if not isinstance(data, list):
response = {"success": False, "error": "Data should be a list of students."}
return request.make_response(json.dumps(response), headers={'Content-Type': 'application/json'})
study_mode_mapping = {
'Distance': 'distance',
'Fulltime': 'full_time',
'Parttime': 'part_time'
}
nationality_mapping = {
'Local': 'local',
'SADC': 'sadc',
'International': 'international'
}
responses = []
for student_data in data:
for key in student_data:
if isinstance(student_data[key], str):
student_data[key] = urllib.parse.unquote_plus(student_data[key])
_logger.info("Received data: %s", student_data)
study_mode = student_data.get('study_mode')
if study_mode:
student_data['study_mode'] = study_mode_mapping.get(study_mode, 'distance')
nationality = student_data.get('nationality')
if nationality:
student_data['nationality'] = nationality_mapping.get(nationality, 'local')
required_fields = ['student_id', 'government_id', 'address', 'study_mode', 'email', 'name', 'mobile', 'nationality']
missing_fields = [field for field in required_fields if field not in student_data]
if missing_fields:
responses.append({"success": False, "error": f"Missing fields: {', '.join(missing_fields)}"})
continue
taken_reg = request.env['res.partner'].sudo().search([
('government_id', '=', student_data.get('government_id')),
('is_student', '=', True)
], limit=1)
taken_id = request.env['res.partner'].sudo().search([
('student_id', '=', student_data.get('student_id')),
('is_student', '=', True)
], limit=1)
if taken_id:
responses.append({"success": False, "error": "Another Student with this Student ID already exists!"})
continue
if taken_reg:
responses.append({"success": False, "error": "Another Student with this Government ID already exists!"})
continue
student = request.env['res.partner'].sudo().create({
'is_student': True,
'student_id': student_data.get('student_id'),
'government_id': student_data.get('government_id'),
'street': student_data.get('address'),
'study_mode': student_data.get('study_mode'),
'email': student_data.get('email'),
'name': student_data.get('name'),
'mobile': student_data.get('mobile'),
'nationality': student_data.get('nationality'),
})
responses.append({'success': True, 'student_id': student.id})
return request.make_response(json.dumps(responses), headers={'Content-Type': 'application/json'})
except Exception as e:
_logger.error("Error processing request: %s", str(e))
response = {"success": False, "error": str(e)}
return request.make_response(json.dumps(response), headers={'Content-Type': 'application/json'})