This commit is contained in:
Valentin Chemiere 2015-02-19 18:00:00 +01:00
parent 6fc9c12ecd
commit 6732a07e8a
7 changed files with 183 additions and 69 deletions

Binary file not shown.

Binary file not shown.

View File

@ -2,33 +2,37 @@
# -*- coding: utf-8 -*-
class AbstractConnection(object):
#class AbstractConnection(object):
#
# def __init__(self, host, user, pwd, port=None, allow_dir_creation=False):
# self.host = host
# self.user = user
# self.pwd = pwd
# self.port = port
# self.allow_dir_creation = allow_dir_creation
# self.connection = None
#
# def connect(self):
# return NotImplemented
#
# def close(self):
# return NotImplemented
#
# def get(self, filename, path=None):
# return NotImplemented
#
# def put(self, fileobject, filename, path=None):
# return NotImplemented
#
# def search(self, filename, path=None):
# return NotImplemented
#
# def move(self, filename, oldpath, newpath):
# return NotImplemented
#
# def rename(self, oldfilename, newfilename, path=None):
# return NotImplemented
def __init__(self, host, user, pwd, port=None, allow_dir_creation=False):
self.host = host
self.user = user
self.pwd = pwd
self.port = port
self.allow_dir_creation = allow_dir_creation
self.connection = None
class AbstractTask():
def connect(self):
return NotImplemented
def close(self):
return NotImplemented
def get(self, filename, path=None):
return NotImplemented
def put(self, fileobject, filename, path=None):
return NotImplemented
def search(self, filename, path=None):
return NotImplemented
def move(self, filename, oldpath, newpath):
return NotImplemented
def rename(self, oldfilename, newfilename, path=None):
return NotImplemented

Binary file not shown.

View File

@ -1,24 +1,26 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from ..backend import AbstractConnection
from ..backend import AbstractTask
import sys
import os
from tempfile import TemporaryFile
class AbtractTask()
def __init__(self, cr, uid):
class FileStoreConnection(AbstractTask):
class FileStore(AbstractTask):
_key = "filestore"
_name = "Filestore"
_synchronize_type = None
def __init__(self, host, user, pwd, port=None, allow_dir_creation=False):
super(FilestoreConnection, self).__init__(host, user, pwd, port, allow_dir_creation)
def __init__(self, config):
# super(FilestoreConnection, self).__init__(host, user, pwd, port, allow_dir_creation)
self.host = config.get('host', '')
self.user = config.get('user', '')
self.pwd = config.get('pwd', '')
self.port = config.get('port', '')
self.allow_dir_creation = config.get('allow_dir_creation', '')
self.filename = config.get('filename', '')
self.path = config.get('path', '')
def connect(self):
return NotImplemented
@ -26,41 +28,46 @@ class FileStoreConnection(AbstractTask):
def close(self):
return NotImplemented
def get(self, filename, path=None):
if path:
filepath = "{}/{}".format(path, filename)
def get(self):
if self.path:
filepath = "{}/{}".format(self.path, self.filename)
else:
filepath = filename
filepath = self.filename
return open(filepath, 'r+b')
def put(self, fileobject, filename, path=None):
if path:
filepath = "{}/{}".format(path, filename)
def put(self):
if self.path:
filepath = "{}/{}".format(self.path, self.filename)
else:
filepath = filename
filepath = self.filename
output = open(filepath, 'w+b')
return True
def search(self, filename, path=None):
if path:
filepath = "{}/{}".format(path, filename)
def search(self):
if self.path:
filepath = "{}/{}".format(self.path, self.filename)
else:
filepath = filename
filepath = self.filename
connection_list_result = os.listdir(filepath)
return [x for x in connection_list_result if filename in x]
def move(self, filename, oldpath, newpath):
os.rename(
os.path.join(oldpath, filename),
os.path.join(newpath, filename)
)
def rename(self, oldfilename, newfilename, path=None):
return NotImplemented
class ImportFileStore(FileStoreConnection):
class ImportFileStore(FileStore):
_synchronize_type = "import"
def run():
self.connect()
file = self.get(self.filename)
self.close()
return file
class ExportFileStore(FileStore):
_synchronize_type = "export"
def run():
self.connect()
self.put(self.filename)
self.close()

View File

@ -21,11 +21,12 @@
###############################################################################
from openerp import models, fields
from backend import AbstractTask
class Location(models.Model):
_name = 'ir.location'
_description = 'Description'
name = fields.Char(string='Name')
protocol = fields.Selection(selection='_get_protocol')
address = fields.Char(string='Address')
@ -35,5 +36,49 @@ class Location(models.Model):
def _get_protocol(self):
return [('ftp', 'FTP'), ('sftp', 'SFTP'), ('filestore', 'Filestore')]
res = []
for cls in itersubclasses(AbstractTask):
if not cls._synchronize_type:
cls_info = (cls._key, cls._name)
res.append(cls_info)
return res
def itersubclasses(cls, _seen=None):
"""
itersubclasses(cls)
Generator over all subclasses of a given class, in depth first order.
>>> list(itersubclasses(int)) == [bool]
True
>>> class A(object): pass
>>> class B(A): pass
>>> class C(A): pass
>>> class D(B,C): pass
>>> class E(D): pass
>>>
>>> for cls in itersubclasses(A):
... print(cls.__name__)
B
D
E
C
>>> # get ALL (new-style) classes currently defined
>>> [cls.__name__ for cls in itersubclasses(object)] #doctest: +ELLIPSIS
['type', ...'tuple', ...]
"""
if not isinstance(cls, type):
raise TypeError('itersubclasses must be called with '
'new-style classes, not %.100r' % cls
)
if _seen is None:
_seen = set()
try:
subs = cls.__subclasses__()
except TypeError: # fails only when cls is type
subs = cls.__subclasses__(cls)
for sub in subs:
if sub not in _seen:
_seen.add(sub)
yield sub
for sub in itersubclasses(sub, _seen):
yield sub

View File

@ -28,21 +28,79 @@ class Task(models.Model):
_description = 'Description'
name = fields.Char()
method = fields.Selection([
('ftp_import', 'FTP import'),
('ftp_export', 'FTP export'),
('sftp_import', 'SFTP import'),
('sftp_export', 'SFTP export'),
('filestore_import', 'Filestore import'),
('filestore_export', 'Filestore export'),
])
# method = fields.Selection([
# ('ftp_import', 'FTP import'),
# ('ftp_export', 'FTP export'),
# ('sftp_import', 'SFTP import'),
# ('sftp_export', 'SFTP export'),
# ('filestore_import', 'Filestore import'),
# ('filestore_export', 'Filestore export'),
# ])
method = fields.Selection(selection='_get_method')
filename = fields.Char()
filepath = fields.Char()
location_id = fields.Many2one('ir.location', string='Location')
def _get_method(self):
res = []
for cls in itersubclasses(AbstractTask):
if cls._synchronize_type:
cls_info = (cls._key + cls._synchronize_type, cls._name + cls._synchronize_type)
res.append(cls_info)
return res
def run(self):
connection_class = ...
method_class = getattr(sys.modules[__name__], self.method)
config = {
'host': self.location_id.address,
'user': self.location_id.login,
'pwd': self.location_id.password,
'port': self.location_id.port,
'allow_dir_creation': False,
'filename': self.filename,
'path': self.filepath
}
conn = method_class(config)
conn.run()
def itersubclasses(cls, _seen=None):
"""
itersubclasses(cls)
Generator over all subclasses of a given class, in depth first order.
>>> list(itersubclasses(int)) == [bool]
True
>>> class A(object): pass
>>> class B(A): pass
>>> class C(A): pass
>>> class D(B,C): pass
>>> class E(D): pass
>>>
>>> for cls in itersubclasses(A):
... print(cls.__name__)
B
D
E
C
>>> # get ALL (new-style) classes currently defined
>>> [cls.__name__ for cls in itersubclasses(object)] #doctest: +ELLIPSIS
['type', ...'tuple', ...]
"""
if not isinstance(cls, type):
raise TypeError('itersubclasses must be called with '
'new-style classes, not %.100r' % cls
)
if _seen is None:
_seen = set()
try:
subs = cls.__subclasses__()
except TypeError: # fails only when cls is type
subs = cls.__subclasses__(cls)
for sub in subs:
if sub not in _seen:
_seen.add(sub)
yield sub
for sub in itersubclasses(sub, _seen):
yield sub