From 6732a07e8a5b9728de83cb002f8e7a1cd6960544 Mon Sep 17 00:00:00 2001 From: Valentin Chemiere Date: Thu, 19 Feb 2015 18:00:00 +0100 Subject: [PATCH] WIP --- external_file_location/.location.py.swp | Bin 0 -> 12288 bytes external_file_location/.task.py.swp | Bin 0 -> 12288 bytes external_file_location/backend.py | 60 +++++++------- .../backends/.filestore.py.swo | Bin 0 -> 12288 bytes external_file_location/backends/filestore.py | 67 +++++++++------- external_file_location/location.py | 51 +++++++++++- external_file_location/task.py | 74 ++++++++++++++++-- 7 files changed, 183 insertions(+), 69 deletions(-) create mode 100644 external_file_location/.location.py.swp create mode 100644 external_file_location/.task.py.swp create mode 100644 external_file_location/backends/.filestore.py.swo diff --git a/external_file_location/.location.py.swp b/external_file_location/.location.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..5edb09b8df114ac745293cb315961e388119fa77 GIT binary patch literal 12288 zcmeHNO>88^6|Nk)q+Mf-PJSA_Efd1 zs%;O7!Wof60D-uWDBN-)N{$;ThvXC~Iph*?MSzfy$RVdl5#+1tw#PQ!EJ9pXbW7iK zch##`?|tv5+j0*Vp6PDTW5FW~$Nh|b`r$|YzufUW`(?t|ZZcBZjo;$%a`XF{xrN-% zy0~G@m0~G@m0~G@m0~G@m0~G_` zA_i=BhP@1b?c-H$^e}> zrin-+GWn35nD{!kH&=H0Osurqni5F~zG%W_m~vx;spGOq10#fNEFQD$bVXh=;8Elj zHVzjgu~#pZbz69$LfeszvB1o>aCfvsVQPZG05_#QgFzibg<^b#B{EC>X(l>aE4@f_ z6!RoCq+~j!y|IvPJtc-LWDbqFx#~i%)zg_B-c}f5gsm6T@TC}p-c2RNOty^F%TkMG@M@3p5w0&%I>VG@_cg_E<_+MB|nNFm2&K+7W)tmtN!F2NeVrGH>5NGeW9!GGU5BHM1}!bowV_gJ5uc}p z6q;MaMC}Sq$OBhhWonU%iPI?A_1O=Xny%y`RLYp*L?d^Uj)V@przbW8qXm&JPY{fg z%>eUdGgxw&4?dY!LpZdsxt2K1GT9Bg17iWtG9e=uvq2(b^`#nd>E&loYei(Qi)qu1 z20jUoFDNtJ&zh+W$6CqcB{6VWJ*&t6lL|v)H4kl{o9jpV8Vtqu*9w-M{{!UhAk)gK zP^EPv()iG4mo0ms5({G2x=pY;=DO?=sTzUw(`GWI?QEhetr&@eRcM>Az?pDVBP>ni zXsOmNW@`l#2S&|=dm=?8;`38yXK}SuJLW*S)YbHCnYa32k4;QLin*u_B4I+EWKJc- zYiqOHqTTqoxS2!;2VcC_SW!{y<)^UqiHZbbxZzHYyI89U4S9GS*+9v})6qT>jY2>n zS%l6G1PUe1k`{a#_{|<{j?KYgo+>#i`l%hGxr5@7=97S^>lj;+lWTdlpl zyd zE?wECHf^=H``y)@_4YPx?QCyd>2=_24^F~5@5nH>^lZ0(`N~e8+M8GD+4lA}6kdJ8 z)1)vfT%U2yAeL$3o=043F0FIYtLPu0(mjeJG&!9>F=SCAZs{1|#s$aAfrVnUGd$jM zBjP-5mK2nPG@TE12u@Xw?&ou}L0nEL<#=x)v_pe*E!@u>mu8H8hEu=KB@NelDz>mu z&?S}2$bYZhB!P$MY&kt#M#wt=n;?i;XDT+C;Qit&#*er;m4nzBVoF06oilivyWTk? z$5Fv$)Pldr{v@83L_EcFJH}w|&%YgVV-v8y(rNF|lSY*H!BFu0DSjOd*-;Uy$+9vuyOv!^Qeyq N-ENWm$G~oc{SOeWqp<)0 literal 0 HcmV?d00001 diff --git a/external_file_location/.task.py.swp b/external_file_location/.task.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..5b9a195722af86955c6466f72bdac5ab8c8dc829 GIT binary patch literal 12288 zcmeHNO>87b6|T(!34!pFT!;|T+qG6RlO6YXH%o#{Z0*<{XD70~mS;?~GES?fyLzUx zJzbruYI`REBBZ@=KthUy;KBjHfn3N5DdG?$PMi>kBR3KOXOJKQ0bf=3{Ma6|IphNB zmcE(ks#mYx``&w1<=yHneWkrk&pJ04p3g9*-+Qln^w3w?cOu4)qP~!({Q-}aTfCR5 z2grTH3N}O_MB_-PKK*>PKK*>PK zK*>PKK*_-WJp($uz+Q)!4;7xiTzp?R^6Vj0&UuL3Tx1AGDa+as_Ucm;R~I0Rk*t^!X1e|(s+-vK`aBybb> zEb#8f7<(Id1NbIz2)qEafm^@=@Oj`O@b*U;`!;YN2!U@UD?fH#1bfNkJe;1cjT;IH^cnO^|k2krxXU<-H#xCq#oebAhv zQ_m>kaX>2TvDuDLNYh49LJ=-s;HMvZN^w=i&pNq^^Q5+XV#s_&R?_i;zznQS21KD% zp9pQHutK@EnTat#O{Xw#v_gKY9M{E5VUO!p(UdF3g%O@=>W)(0l2XWJTAki5X9kA`O{|G3Tq!^=dhq+F@;lA&Tp2-VI;!M(EuU37^Uqj85Gy8Y&4tUQ~J% zbJ$~Pt&^eRigRsgNml5JF>_*`^diNlUR5h6BSOPWY3f0h7souH<46yvVn@R=%dm

LB%jqsgvV46`iGV@%zyBuCA`q0fvJ4#2a$gB@-q~<(d2t zy_dPKYlpND2w!uhm+5M2YpcE6X?G^d7O2lPHMh2?I-#OA=7Ri8N?ZU!$O0Zl2@mYJ zb^F<}pBwgb&3?jSN@bL2S|dypCqIAZun=S7v!)8e`%}>FUX7SK(-_Mk_0H&=VrgZarZRLX$DNFsNH47hZxr>7&2^4@BTv`>GHNqyCu^p|4LAnUUtHq@EsBmQi_e=$NZu z=AGHDnU9L;FJ$}niti`6{gR7gG6IlhDDMuB76=jcw4 zgSpZOz%dA)Ga^%5&KnYoew56S9|$$qAS||$Bg_+jbBaOyYm=tg5TFCqh>Lf!sz%Bg ziXe-*IvCgbVLfL&A5uFRV3azp;^m=)9@L_p!la4`y$O{`3MwASbtV&nd6TATmvX!` zx52nhi{VpHTRkIQ~t{Nr&K#C-KmAhs!tLM!o^yi73oB*rkTt(CM z{J$(EJ*B1R>n`pj7ORSJ435IogS<)&DK40Hb0$xaGm}sl5Sl$%Ion<`x{k8KiZ7k9 z1lDLw6(#+Z%2sg`vXc8TE{Umv^?@gg@*7vh+|JyfX;+8Gd0>r=`LC7AjOoRM3pRF# z`Rw^i)s~;aQp9n8)0Rw~Dw`-t+eSrOEljd( zm7K5hq{{O(8o8-LBX?Tg`HUVg!n=ey^p%gP5=2+z-M!fTQk*`>+LO;_byE z>F0+OJ-~@6m7*`bp+nTRrxml>aC&Z_b-LVW93LM${UmdQ>^I`b=LwFWjaA2Lx+5}D z1CinQI`ED-ip}TPzDP%A-_rw5&+qJ0GYq*Dl<$)`7vX z%*N)a&9O2!W4pDteyh3DZLYPq+TA$cbTx0-vjyT7-4 zyVHWR9XJW=tRuZl(~Iryt=s!uYVO>j7n^%~Pb@4B`_<=8)$}=_T4Y zX;pM*s5Ix>04E0-K`~^p+nb>SL>@mpoVYa<N;T z)38QZj41Z-#{l7sp^%xm`>Ekl4KPn{WartGaIGUk4I4RaiYy82)>h+bnVCK=+;{sH4ho|?-+Xbe$>A{-O|~a8wX+)5~x~ zk<|I+PkNrx5!hdAHTUT`#fx{R$Gz;PcNaUFp~4r#RcpjLGEYYRfu`zujjk_UyFtxD th^jM5Jv*{iB$C~DZI<0ek+$}BjWr+c0~;5gT10&W*g=-bUIsQT>_33pg*^ZO literal 0 HcmV?d00001 diff --git a/external_file_location/backend.py b/external_file_location/backend.py index 7555f125..d01c4793 100755 --- a/external_file_location/backend.py +++ b/external_file_location/backend.py @@ -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 + diff --git a/external_file_location/backends/.filestore.py.swo b/external_file_location/backends/.filestore.py.swo new file mode 100644 index 0000000000000000000000000000000000000000..65c54ea1df472a615683a515122d86b055c4d486 GIT binary patch literal 12288 zcmeI2&ub(_6vt~ftpdhc65 zhLGx?esbk8esA|KhH?XAFaQ42>L*8^VXt|NZA5EQQTsl{+AWS#y^r0C*03i-DSI2z zK2l#9-HVjx8{-GVkw}au#=+1})F6{{LV8{r}7LjC}>Z1n+^jz#Cu#WWa#);6ZRJm;%SZ&&L^i6f`| z!`SOUfMsw$Xo0K2Rp8g_82bWz4n73$fB|?4EP>--2K;#~V?Tno!6ooKcof_N?gqDj zDe&1eV;_J^;5l$JI0a6EKc*P_4txu~0iS~R!7D%m4_p8bfK%WkxCu;y%h2d+@G&60 z-UJ~Cz~f*R{01$*2k!z`oB~b(r+`!7a4EoxqD4ID2C>wly}))hvR$=ClWv-sw(Wp! zxh4Kcpo@dLHP|;a)q<;yd{BqI_E(xMN7>ukPA&iWtyQl{M(P+PpB|YcA~1ypp%`$L zCGCY}tXQ(~^dt#}N+!_@!ZVXp@H4z6#;H`M#e&$^nm=M|XE94p&|SoK^^H2AKBy>R zGL>+eOJ*DJ(YQRw0%O>BYhv#bD4ef2_Gq*-_7z*JBHkT)6=)Is(_=o6ijR4e@F15B z*D<{~(#BIlXR+bYz@|vcm8{0kR(<@9!x=7hmwE^z)u!B2-wd}m3uRljma0&l2B^9g zu@=i!t>)6YxYfJ3)#@VhkzdG3V{~$f%g(lkL<&}1GRk|UMWKbSf}!1z4b!@+vh8qW zX0YfGtxQEy<<#Nxo45Dpx5uf)X~!(1sgn6OQY&{zLtga^)PFOBa-TG0a84Sm@mSEs zVi8(hX*%;mnKVCuPjOPzy{grMDaR@wL~C6NXr30(Jf?leobQ_Cnt3_*O)h>M%S{hk z#0!+Lm!NCTdkvbpp`BlIq^3sG&9H8{88#VaTBw>OH8q(IrLGT8O*PXwuCr7qdlcEr z-49nsO}=Lrx}Fy$k@37Xxpz2?*Wu}Ah!3RG;d|A{w;j!VR`orR2o( zGnucVE|sq)P>> 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 diff --git a/external_file_location/task.py b/external_file_location/task.py index c632ec6c..51500cda 100644 --- a/external_file_location/task.py +++ b/external_file_location/task.py @@ -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