def put_model_records(self, model, **post): try: data = post['data'] except KeyError: msg = "`data` parameter is not found on PUT request body" raise exceptions.ValidationError(msg) try: model_to_put = request.env[model] except KeyError: msg = "The model `%s` does not exist." % model raise exceptions.ValidationError(msg) # TODO: Handle errors on filter filters = post["filter"] if "context" in post: recs = model_to_put.with_context(**post["context"])\ .search(filters) else: recs = model_to_put.search(filters) # TODO: Handle data validation for field in data: if isinstance(data[field], dict): operations = [] for operation in data[field]: if operation == "push": operations.extend( (4, rec_id, _) for rec_id in data[field].get("push")) elif operation == "pop": operations.extend((3, rec_id, _) for rec_id in data[field].get("pop")) elif operation == "delete": operations.extend( (2, rec_id, _) for rec_id in data[field].get("delete")) else: pass # Invalid operation data[field] = operations elif isinstance(data[field], list): data[field] = [(6, _, data[field])] # Replace operation else: pass if recs.exists(): try: return recs.write(data) except Exception as e: # TODO: Return error message(e.msg) on a response return False else: # No records to update return True
def put_model_record(self, model, rec_id, **post): try: data = post['data'] except KeyError: msg = "`data` parameter is not found on PUT request body" raise exceptions.ValidationError(msg) try: model_to_put = request.env[model] except KeyError: msg = "The model `%s` does not exist." % model raise exceptions.ValidationError(msg) if "context" in post: # TODO: Handle error raised by `ensure_one` rec = model_to_put.with_context(**post["context"])\ .browse(rec_id).ensure_one() else: rec = model_to_put.browse(rec_id).ensure_one() # TODO: Handle data validation for field in data: if isinstance(data[field], dict): operations = [] for operation in data[field]: if operation == "push": operations.extend( (4, rec_id, _) for rec_id in data[field].get("push")) elif operation == "pop": operations.extend((3, rec_id, _) for rec_id in data[field].get("pop")) elif operation == "delete": operations.extend( (2, rec_id, _) for rec_id in data[field].get("delete")) else: data[field].pop(operation) # Invalid operation data[field] = operations elif isinstance(data[field], list): data[field] = [(6, _, data[field])] # Replace operation else: pass try: return rec.write(data) except Exception as e: # TODO: Return error message(e.msg) on a response return False
def _check_validity(self): """ Verifies the validity of the attendance record compared to the others from the same employee. For the same employee we must have : * maximum 1 "open" attendance record (without check_out) * no overlapping time slices with previous employee records """ for attendance in self: # we take the latest attendance before our check_in time and check it doesn't overlap with ours last_attendance_before_check_in = self.env['hr.attendance'].search([ ('employee_id', '=', attendance.employee_id.id), ('check_in', '<=', attendance.check_in), ('id', '!=', attendance.id), ], order='check_in desc', limit=1) if last_attendance_before_check_in and last_attendance_before_check_in.check_out and last_attendance_before_check_in.check_out > attendance.check_in: raise exceptions.ValidationError(_("Cannot create new attendance record for %(empl_name)s, the employee was already checked in on %(datetime)s") % { 'empl_name': attendance.employee_id.name, 'datetime': fields.Datetime.to_string(fields.Datetime.context_timestamp(self, fields.Datetime.from_string(attendance.check_in))), }) if not attendance.check_out: # if our attendance is "open" (no check_out), we verify there is no other "open" attendance no_check_out_attendances = self.env['hr.attendance'].search([ ('employee_id', '=', attendance.employee_id.id), ('check_out', '=', False), ('id', '!=', attendance.id), ], order='check_in desc', limit=1) if no_check_out_attendances: raise exceptions.ValidationError(_("Cannot create new attendance record for %(empl_name)s, the employee hasn't checked out since %(datetime)s") % { 'empl_name': attendance.employee_id.name, 'datetime': fields.Datetime.to_string(fields.Datetime.context_timestamp(self, fields.Datetime.from_string(no_check_out_attendances.check_in))), }) else: # we verify that the latest attendance with check_in time before our check_out time # is the same as the one before our check_in time computed before, otherwise it overlaps last_attendance_before_check_out = self.env['hr.attendance'].search([ ('employee_id', '=', attendance.employee_id.id), ('check_in', '<', attendance.check_out), ('id', '!=', attendance.id), ], order='check_in desc', limit=1) if last_attendance_before_check_out and last_attendance_before_check_in != last_attendance_before_check_out: raise exceptions.ValidationError(_("Cannot create new attendance record for %(empl_name)s, the employee was already checked in on %(datetime)s") % { 'empl_name': attendance.employee_id.name, 'datetime': fields.Datetime.to_string(fields.Datetime.context_timestamp(self, fields.Datetime.from_string(last_attendance_before_check_out.check_in))), })
def post_model_data(self, model, **post): try: data = post['data'] except KeyError: msg = "`data` parameter is not found on POST request body" raise exceptions.ValidationError(msg) try: model_to_post = request.env[model] except KeyError: msg = "The model `%s` does not exist." % model raise exceptions.ValidationError(msg) # TODO: Handle data validation if "context" in post: context = post["context"] record = model_to_post.with_context(**context).create(data) else: record = model_to_post.create(data) return record.id
def _check_validity_check_in_check_out(self): """ verifies if check_in is earlier than check_out. """ for attendance in self: if attendance.check_in and attendance.check_out: if attendance.check_out < attendance.check_in: raise exceptions.ValidationError(_('"Check Out" time cannot be earlier than "Check In" time.'))
def unlink(self): if any(self.get_external_id().values()) and not self._context.get(MODULE_UNINSTALL_FLAG): raise exceptions.ValidationError("You can not delete activity type that are used as master data.") return super(MailActivityType, self).unlink()