Создать экспорт в формате CSV, загружаемый в Odoo

У меня проблема с созданием загружаемого экспорта в файл CSV, кто-нибудь знает проблему? это моя временная модель


class ReportPatientWizard(models.TransientModel):
    _name = "report.patient.wizard"
    _description = "Patient Reports"

    patient_id = fields.Many2one('hospital.patient', string='Patient', readonly=True)
    gender_filter = fields.Selection([('male', 'Male'), ('female', 'Female'), ('other', 'Other')],
                                     string='Gender Filter')

    def _prepare_csv_data(self, patients):
        field_names = ['Name', 'Age', 'Gender']  # Field names for CSV headers
        data = io.StringIO()
        writer = csv.DictWriter(data, fieldnames=field_names)

        writer.writeheader()  # Write CSV header

        for patient in patients:
            row = {
                'Name': patient.name,
                'Age': patient.age,
                'Gender': patient.gender,
                # Add other fields as needed
            }
            writer.writerow(row)

        return data.getvalue()

    @api.multi
    def download_patient_report(self):
        # Ambil data pasien berdasarkan ID yang dipilih
        patient = self.patient_id

        # Filter data berdasarkan gender jika gender_filter dipilih
        if self.gender_filter:
            patients = self.env['hospital.patient'].search([('gender', '=', self.gender_filter)])
        else:
            patients = self.env['hospital.patient'].search([])

        if not patients:
            raise UserError(_('No patients found matching the criteria.'))

        csv_data = self._prepare_csv_data(patients)

        print(f"Records: {patients}")

        # Prepare file name
        filename = f'patient_report_{fields.Date.today()}.csv'

        # Return a response to download the CSV file
        return {
            'type': 'ir.actions.act_url',
            'url': 'web/content/?model=report.patient.wizard&id = {}&filename = {}&field=file'.format(self.id, filename),
            'target': 'current',
        }

    def print_patient_report(self):
        # Generate and download patient report as CSV
        return self.download_patient_report()

и это view.xml

<record id = "report_patient_view" model = "ir.ui.view">
        <field name = "name">Report Patient</field>
         <field name = "model">report.patient.wizard</field>
        <field name = "arch" type = "xml">
            <form string = "Report Patient">
<!--                <field name = "patient_id"/>-->
                <group col = "1">
<!--                    <field name = "is_gender"/>-->
                    <field name = "gender_filter"/>
                </group>
<!--                <field name = "journal_ids" required = "0" invisible = "1"/>-->
                <footer>
                    <button name = "download_patient_report" string = "Download" type = "object" class = "oe_highlight"/>
                    <button string = "Cancel" class = "btn btn-default" special = "cancel"/>
                </footer>
            </form>
        </field>
    </record>

    <record id = "action_report_patient_view" model = "ir.actions.act_window">
        <field name = "name">Report Patient</field>
        <field name = "res_model">report.patient.wizard</field>
        <field name = "type">ir.actions.act_window</field>
        <field name = "view_mode">form</field>
        <field name = "view_id" ref = "report_patient_view"/>
        <field name = "target">new</field>
    </record>

    <menuitem id = "menu_report"
              name = "Report Patients"
              parent = "menu_hospital_operations"
              action = "action_report_patient_view"
              sequence = "15"/>

здесь я хочу создать фильтр формы, чтобы пользователь мог выбрать, какого пола он хочет получить данные, но после того, как я нажал кнопку загрузки, появилась проблема это ошибка

я ожидал, что когда я нажму кнопку загрузки, начнется загрузка

Привет, я ничего не знаю о фреймворке, поэтому, возможно, я упускаю что-то, что кажется мне незаметным (очевидным для других), но после этого csv_data = self._prepare_csv_data(patients) я не вижу, чтобы что-то произошло с csv_data var. Как используется эта переменная?

Zach Young 06.03.2024 05:43

Вопрос отмечен тегом odoo-16, но вы использовали @api.multi, проверьте Миграция на версию-13.0

Kenly 06.03.2024 09:48

извини @api.multi, я забыл удалить, но это тоже не помогает

Han0505 06.03.2024 10:35
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
3
114
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы указали поле в маршруте, но у вас нет поля с именем file. Вам нужно добавить двоичное поле и установить его содержимое сразу после имени файла.

Пример:

# Prepare file name
filename = f'patient_report_{fields.Date.today()}.csv'
self.file = base64.b64encode(csv_data.encode('utf-8'))

Вы можете добавить self.ensure_one() в начало функции download_patient_report, чтобы убедиться, что self содержит одну запись.

Другие вопросы по теме