mirror of
https://github.com/OCA/knowledge.git
synced 2025-07-26 02:18:40 -06:00
Dedicated tree for attachments, some view tweaks and renaming task
object
This commit is contained in:
parent
afa5dc454a
commit
8d38f72cfb
@ -27,8 +27,9 @@ class IrAttachment(models.Model):
|
|||||||
_inherit = 'ir.attachment'
|
_inherit = 'ir.attachment'
|
||||||
|
|
||||||
sync_date = fields.Datetime()
|
sync_date = fields.Datetime()
|
||||||
parse_state = fields.Selection([
|
state = fields.Selection([
|
||||||
('pending', 'Pending'),
|
('pending', 'Pending'),
|
||||||
('failed', 'Failed'),
|
('failed', 'Failed'),
|
||||||
('done', 'Done'),
|
('done', 'Done'),
|
||||||
], readonly=True, required=True, default='pending')
|
], readonly=True, required=True, default='pending')
|
||||||
|
state_message = fields.Text()
|
||||||
|
@ -8,11 +8,50 @@
|
|||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<field name="url" position="after">
|
<field name="url" position="after">
|
||||||
<field name="sync_date"/>
|
<field name="sync_date"/>
|
||||||
<field name="parse_state"/>
|
<field name="state"/>
|
||||||
|
<field name="state_message"/>
|
||||||
</field>
|
</field>
|
||||||
|
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
<record id="view_external_attachment_tree" model="ir.ui.view">
|
||||||
|
<field name="model">ir.attachment</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<tree string="Attachments" >
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="datas_fname"/>
|
||||||
|
<field name="res_model"/>
|
||||||
|
<field name="res_id"/>
|
||||||
|
<field name="type"/>
|
||||||
|
<field name="company_id" groups="base.group_multi_company"/>
|
||||||
|
<field name="create_uid"/>
|
||||||
|
<field name="create_date"/>
|
||||||
|
<field name="state"/>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="action_attachment" model="ir.actions.act_window">
|
||||||
|
<field name="name">Attachments</field>
|
||||||
|
<field name="type">ir.actions.act_window</field>
|
||||||
|
<field name="res_model">ir.attachment</field>
|
||||||
|
<field name="view_type">form</field>
|
||||||
|
<field name="view_mode">kanban,tree,form</field>
|
||||||
|
<field name="view_id" eval="False"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="ir_attachment_view1" model="ir.actions.act_window.view">
|
||||||
|
<field eval="1" name="sequence"/>
|
||||||
|
<field name="view_mode">tree</field>
|
||||||
|
<field name="view_id" ref="view_external_attachment_tree"/>
|
||||||
|
<field name="act_window_id" ref="action_attachment"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<menuitem id="menu_ir_attachment"
|
||||||
|
parent="menu_file_exchange"
|
||||||
|
sequence="20"
|
||||||
|
action="action_attachment"/>
|
||||||
|
|
||||||
</data>
|
</data>
|
||||||
</openerp>
|
</openerp>
|
||||||
|
@ -34,6 +34,7 @@ class Location(models.Model):
|
|||||||
port = fields.Integer()
|
port = fields.Integer()
|
||||||
login = fields.Char()
|
login = fields.Char()
|
||||||
password = fields.Char()
|
password = fields.Char()
|
||||||
|
task_ids = fields.One2many('external.file.task', 'location_id')
|
||||||
|
|
||||||
|
|
||||||
def _get_protocol(self):
|
def _get_protocol(self):
|
||||||
|
@ -14,7 +14,17 @@
|
|||||||
<field name="address" colspan="2"/>
|
<field name="address" colspan="2"/>
|
||||||
<field name="port" colspan="2"/>
|
<field name="port" colspan="2"/>
|
||||||
<field name="login" colspan="4"/>
|
<field name="login" colspan="4"/>
|
||||||
<field name="password" colspan="4"/>
|
<field name="password" password="1" colspan="4"/>
|
||||||
|
<separator string="Tasks" colspan="4"/>
|
||||||
|
<field name="task_ids" colspan="4" nolabel="1">
|
||||||
|
<tree>
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="method"/>
|
||||||
|
<field name="filename"/>
|
||||||
|
<field name="filepath"/>
|
||||||
|
<button name="run" type="object" string="Run"/>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
</group>
|
</group>
|
||||||
</sheet>
|
</sheet>
|
||||||
</form>
|
</form>
|
||||||
@ -28,9 +38,7 @@
|
|||||||
<field name="name" select="1"/>
|
<field name="name" select="1"/>
|
||||||
<field name="protocol"/>
|
<field name="protocol"/>
|
||||||
<field name="address"/>
|
<field name="address"/>
|
||||||
<field name="port"/>
|
|
||||||
<field name="login"/>
|
<field name="login"/>
|
||||||
<field name="password"/>
|
|
||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
@ -26,7 +26,7 @@ from abstract_task import AbstractTask
|
|||||||
|
|
||||||
|
|
||||||
class Task(models.Model):
|
class Task(models.Model):
|
||||||
_name = 'ir.location.task'
|
_name = 'external.file.task'
|
||||||
_description = 'Description'
|
_description = 'Description'
|
||||||
|
|
||||||
name = fields.Char()
|
name = fields.Char()
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
<data>
|
<data>
|
||||||
|
|
||||||
<record id="view_task_form" model="ir.ui.view">
|
<record id="view_task_form" model="ir.ui.view">
|
||||||
<field name="model">ir.location.task</field>
|
<field name="model">external.file.task</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<form string="Tasks" version="7.0">
|
<form string="Tasks" version="7.0">
|
||||||
<sheet>
|
<sheet>
|
||||||
@ -22,7 +22,7 @@
|
|||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="view_task_tree" model="ir.ui.view">
|
<record id="view_task_tree" model="ir.ui.view">
|
||||||
<field name="model">ir.location.task</field>
|
<field name="model">external.file.task</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="Tasks" >
|
<tree string="Tasks" >
|
||||||
<field name="name" select="1"/>
|
<field name="name" select="1"/>
|
||||||
@ -36,12 +36,12 @@
|
|||||||
<record id="action_task" model="ir.actions.act_window">
|
<record id="action_task" model="ir.actions.act_window">
|
||||||
<field name="name">Tasks</field>
|
<field name="name">Tasks</field>
|
||||||
<field name="type">ir.actions.act_window</field>
|
<field name="type">ir.actions.act_window</field>
|
||||||
<field name="res_model">ir.location.task</field>
|
<field name="res_model">external.file.task</field>
|
||||||
<field name="view_type">form</field>
|
<field name="view_type">form</field>
|
||||||
<field name="view_id" eval="False"/>
|
<field name="view_id" eval="False"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<menuitem id="menu_ir_location_task"
|
<menuitem id="menu_external_file_task"
|
||||||
parent="menu_file_exchange"
|
parent="menu_file_exchange"
|
||||||
sequence="20"
|
sequence="20"
|
||||||
action="action_task"/>
|
action="action_task"/>
|
||||||
|
@ -23,6 +23,7 @@ from ..abstract_task import AbstractTask
|
|||||||
from base64 import b64decode
|
from base64 import b64decode
|
||||||
import ftputil
|
import ftputil
|
||||||
import ftputil.session
|
import ftputil.session
|
||||||
|
from ftputil.error import FTPIOError
|
||||||
import logging
|
import logging
|
||||||
_logger = logging.getLogger(__name__)
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -132,16 +133,21 @@ class FtpExportTask(FtpTask):
|
|||||||
raise Exception("%s already exists" % target_name)
|
raise Exception("%s already exists" % target_name)
|
||||||
|
|
||||||
def _handle_new_target(self, ftp_conn, target_name, filedata):
|
def _handle_new_target(self, ftp_conn, target_name, filedata):
|
||||||
with ftp_conn.open(target_name, mode='wb') as fileobj:
|
try:
|
||||||
fileobj.write(filedata)
|
with ftp_conn.open(target_name, mode='wb') as fileobj:
|
||||||
_logger.info('wrote %s, size %d', target_name, len(filedata))
|
fileobj.write(filedata)
|
||||||
# return file_id
|
_logger.info('wrote %s, size %d', target_name, len(filedata))
|
||||||
|
self.attachment_id.state = 'done'
|
||||||
|
except FTPIOError:
|
||||||
|
self.attachment_id.state = 'failed'
|
||||||
|
self.attachment_id.state_message = (
|
||||||
|
'The directory doesn\'t exist or had insufficient rights')
|
||||||
|
|
||||||
def _target_name(self, ftp_conn, upload_directory, filename):
|
def _target_name(self, ftp_conn, upload_directory, filename):
|
||||||
return upload_directory + '/' + filename
|
return upload_directory + '/' + filename
|
||||||
|
|
||||||
def _upload_file(self, host, port, user, pwd, path, filename, filedata):
|
def _upload_file(self, host, port, user, pwd, path, filename, filedata):
|
||||||
upload_directory = path
|
upload_directory = path or './'
|
||||||
port_session_factory = ftputil.session.session_factory(port=port)
|
port_session_factory = ftputil.session.session_factory(port=port)
|
||||||
with ftputil.FTPHost(host, user, pwd,
|
with ftputil.FTPHost(host, user, pwd,
|
||||||
session_factory=port_session_factory) as ftp_conn:
|
session_factory=port_session_factory) as ftp_conn:
|
||||||
|
Loading…
Reference in New Issue
Block a user