# -*- coding: utf-8 -*- ############################################################################## # # OpenERP, Open Source Management Solution # Copyright (C) 2004-2010 Tiny SPRL (). # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # ############################################################################## # # Does not properly work concurrently !!! # from osv import fields,osv from tools.translate import _ import base64 import httplib import mimetypes import netsvc import threading class auction_lots_send_aie(osv.osv_memory): _name = 'auction.lots.send.aie' _descritption = 'Send to website' def _date_get(self, cr, uid, context=None): selection = context and context.get('selection') if selection: return [('','')] + selection return [('','')] _columns = { 'uname': fields.char('Login', size=64), 'password': fields.char('Password', size=64), 'objects': fields.integer('# of objects', readonly=True), 'lang': fields.selection([('fr','fr'),('ned','ned'),('eng','eng'),('de','de')],'Language'), 'numerotation': fields.selection([('prov','Provisoire'),('definite','Definitive (ordre catalogue)')],'Numerotation'), 'dates': fields.selection(_date_get,'Auction Date'), 'img_send': fields.boolean('Send Image also ?'), } def default_get(self, cr, uid, fields, context=None): """ To get default values for the object. @param self: The object pointer. @param cr: A database cursor @param uid: ID of the user currently logged in @param fields: List of fields for which we want default values @param context: A standard dictionary @return: A dictionary which of fields with values. """ if context is None: context = {} res = super(auction_lots_send_aie, self).default_get(cr, uid, fields, context=context) if 'uname' in fields and context.get('uname',False): res['uname'] = context.get('uname') if 'password' in fields and context.get('password',False): res['password'] = context.get('password') return res def _catalog_send(uname, passwd, lang, did, catalog): def post_multipart(host, selector, fields, files): def encode_multipart_formdata(fields, files): BOUNDARY = '----------ThIs_Is_tHe_bouNdaRY_$' CRLF = '\r\n' L = [] for (key, value) in fields: L.append('--' + BOUNDARY) L.append('Content-Disposition: form-data; name="%s"' % key) L.append('') L.append(value) for (key,value) in files: L.append('--' + BOUNDARY) L.append('Content-Disposition: form-data; name="%s"; filename="%s"' % (key, key+'.pickle')) L.append('Content-Type: application/octet-stream') L.append('') L.append(value) L.append('--' + BOUNDARY + '--') L.append('') body = CRLF.join(L) content_type = 'multipart/form-data; boundary=%s' % BOUNDARY return content_type, body content_type, body = encode_multipart_formdata(fields, files) import httplib headers = {"Content-type": content_type, "Accept": "*/*"} conn = httplib.HTTPConnection(host) conn.request("POST", '/bin/catalog.cgi', body, headers = headers) response = conn.getresponse() val = response.status conn.close() return val return post_multipart('auction-in-europe.com', "/bin/catalog.cgi", (('uname',uname),('password',passwd),('did',did),('lang',lang)),(('file',catalog),)) def _photo_bin_send(uname, passwd, ref, did, photo_name, photo_data): def get_content_type(filename): return mimetypes.guess_type(filename)[0] or 'application/octet-stream' def post_multipart(host, selector, fields, files): def encode_multipart_formdata(fields, files): BOUNDARY = '----------ThIs_Is_tHe_bouNdaRY_$' CRLF = '\r\n' L = [] for (key, value) in fields: L.append('--' + BOUNDARY) L.append('Content-Disposition: form-data; name="%s"' % key) L.append('') L.append(value) for (key, filename, data) in files: L.append('--' + BOUNDARY) L.append('Content-Disposition: form-data; name="%s"; filename="%s"' % (key, filename)) L.append('Content-Type: %s' % get_content_type(filename)) L.append('') L.append(data) L.append('--' + BOUNDARY + '--') L.append('') body = CRLF.join(L) content_type = 'multipart/form-data; boundary=%s' % BOUNDARY return content_type, body content_type, body = encode_multipart_formdata(fields, files) headers = {"Content-type": content_type, "Accept": "*/*"} conn = httplib.HTTPConnection(host) conn.request("POST", '/bin/photo.cgi', body, headers = headers) response = conn.getresponse() val = response.status conn.close() return val return post_multipart('auction-in-europe.com', "/bin/photo.cgi", (('uname',uname),('ref',ref),('passwd',passwd),('did',did)),(('file',photo_name,photo_data),)) def _photos_send(cr, uid, uname, passwd, did, ids): service = netsvc.LocalService("object_proxy") for (ref,id) in ids: datas = service.execute(cr.db_name, uid, 'auction.lots', 'read', [id], ['name','image']) if len(datas): bin = base64.decodestring(datas[0]['image']) fname = datas[0]['name'] self._photo_bin_send(uname, passwd, ref, did, fname, bin) def get_dates(self, cr, uid, ids, context=None): if context is None: context = {} import httplib data_obj = self.pool.get('ir.model.data') conn = httplib.HTTPConnection('www.auction-in-europe.com') datas = self.read(cr, uid, ids[0],['uname','password']) conn.request("GET", "/aie_upload/dates_get.php?uname=%s&passwd=%s" % (datas['uname'], datas['password'])) response = conn.getresponse() if response.status == 200: def _date_decode(x): return (x.split(' - ')[0], (' - '.join(x.split(' - ')[1:]).decode('latin1','replace').encode('utf-8','replace'))) context['selection'] = map(_date_decode, response.read().split('\n')) self._date_get(cr, uid, context=context) else: raise osv.except_osv(_('Error'), _("Connection to WWW.Auction-in-Europe.com failed !")) id1 = data_obj._get_id(cr, uid, 'auction', 'view_auction_lots_send') res_id = data_obj.browse(cr, uid, id1, context=context).res_id context.update(datas) return { 'view_type': 'form', 'view_mode': 'form', 'res_model': 'auction.lots.send.aie', 'views': [(res_id,'form')], 'type': 'ir.actions.act_window', 'target':'new', 'context': context } def _send(self, cr, uid, ids, context=None): import pickle, thread, sql_db cr.execute('select name,aie_categ from auction_lot_category') vals = dict(cr.fetchall()) cr.close() if context is None: context = {} service = netsvc.LocalService("object_proxy") lots = service.execute(cr.dbname, uid, 'auction.lots', 'read', context.get('active_ids',[]), ['obj_num','lot_num','obj_desc','bord_vnd_id','lot_est1','lot_est2','artist_id','lot_type','aie_categ']) lots_ids = [] datas = self.read(cr, uid, ids[0],['uname','login','lang','numerotation','dates']) for l in lots: if datas['numerotation']=='prov': l['ref']='%s%03d' % (l['bord_vnd_id'][1],l['lot_num']) l['ref2']='%s%03d' % (l['bord_vnd_id'][1],l['lot_num']) else: l['ref']='%04d' % (l['obj_num'],) l['ref2']='%s%03d' % (l['bord_vnd_id'][1],l['lot_num']) if l['artist_id']: l['artist_id'] = l['artist_id'][1] else: l['artist_id'] = '' for n in ('obj_desc','artist_id','lot_type'): try: l[n]=l[n].decode('utf-8','replace').encode('latin1','replace') except: l[n]='' del l['lot_num'] del l['obj_num'] del l['bord_vnd_id'] l['aie_categ'] = vals.get(l['lot_type'], False) lots_ids.append((l['ref'], l['id'])) args = pickle.dumps(lots) thread.start_new_thread(_catalog_send, (datas['uname'],datas['password'],datas['lang'],datas['dates'], args)) if(datas['form']['img_send']==True): thread.start_new_thread(_photos_send, (cr.dbname, uid, datas['uname'], datas['password'],datas['dates'], lots_ids)) return {} def send_pdf(self, cr, uid, ids, context=None): threaded_calculation = threading.Thread(target=self._send, args=(cr, uid, ids, context)) threaded_calculation.start() return {} auction_lots_send_aie() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: