def import_web_letter(self, child_code, sponsor_ref, name, email, original_text, template_name, pdf_url, attachment_url, ext, utm_source, utm_medium, utm_campaign): """ Call when a letter is set on web site: - add web letter to an import set with import letter config 'Web letter' """ logger.info("New webletter from Wordpress : %s - %s", sponsor_ref, child_code) try: name = escape(name) original_text = escape(original_text) # Find existing config or create a new one web_letter_id = self.env.ref('sbc_switzerland.web_letter').id import_config = self.search([('config_id', '=', web_letter_id), ('state', '!=', 'done')], limit=1) if not import_config: import_config = self.create({ 'config_id': web_letter_id, 'state': 'open' }) # Retrieve child code and find corresponding id child_field = 'local_id' if len(child_code) == 9: child_field = 'code' model_child = self.env['compassion.child'].search([ (child_field, '=', child_code) ]) child_id = model_child.id # Retrieve sponsor reference and find corresponding id model_sponsor = self.env['res.partner'].search([ '|', ('ref', '=', sponsor_ref), ('global_id', '=', sponsor_ref) ]) if not model_sponsor: model_sponsor = model_sponsor.search([('email', '=', email)]) if len(model_sponsor) > 1: model_sponsor = model_sponsor.filtered('has_sponsorships') sponsor_id = model_sponsor[:1].id lang = self.env['correspondence'].detect_lang(original_text) lang_id = lang and lang.id # Retrieve template name and find corresponding id template = self.env['correspondence.template'].search( [('name', '=', template_name)], limit=1) # save_letter pdf pdf_data = urllib2.urlopen(pdf_url).read() filename = 'WEB_' + sponsor_ref + '_' + \ child_code + '_' + str(time.time())[:10] + '.pdf' pdf_letter = self.analyze_webletter(pdf_data) # analyze attachment to check template and create image preview line_vals = func.analyze_attachment(self.env, pdf_letter, filename, template) # Check UTM internet_id = self.env.ref('utm.utm_medium_website').id utms = self.env['utm.mixin'].get_utms(utm_source, utm_medium, utm_campaign) for i in xrange(0, len(line_vals)): line_vals[i].update({ 'import_id': import_config.id, 'partner_id': sponsor_id, 'child_id': child_id, 'letter_language_id': lang_id, 'original_text': original_text, 'source': 'website', 'source_id': utms['source'], 'medium_id': utms.get('medium', internet_id), 'campaign_id': utms['campaign'], 'email': email, 'partner_name': name }) self.env['import.letter.line'].create(line_vals[i]) import_config.import_completed = True logger.info("Try to copy file {} !".format(filename)) # Copy file in attachment in the done letter folder share_nas = self.env.ref('sbc_switzerland.share_on_nas').value import_letter_path = self.env.ref( 'sbc_switzerland.scan_letter_imported').value + filename file_pdf = BytesIO(pdf_letter) smb_conn = self._get_smb_connection() if smb_conn and smb_conn.connect(SmbConfig.smb_ip, SmbConfig.smb_port): smb_conn.storeFile(share_nas, import_letter_path, file_pdf) # save eventual attachment if attachment_url: attachment_data = urllib2.urlopen(attachment_url).read() filename_attachment = filename.replace(".pdf", "." + ext) logger.info( "Try save attachment {} !".format(filename_attachment)) import_letter_path = self.env.ref( 'sbc_switzerland.scan_letter_imported').value + \ filename_attachment file_attachment = BytesIO(attachment_data) smb_conn.storeFile(share_nas, import_letter_path, file_attachment) smb_conn.close() # Accept privacy statement model_sponsor[:1].set_privacy_statement(origin='new_letter') return True except: logger.error("Failed to create webletter", exc_info=True) return False
def import_web_letter(self, child_code, sponsor_ref, original_text, template_name, pdf_filename, attachment_filename, ext, utm_source, utm_medium, utm_campaign): """ Call when a letter is set on web site: - add web letter to an import set with import letter config 'Web letter' """ try: # Find existing config or create a new one web_letter_id = self.env.ref('sbc_switzerland.web_letter').id import_config = self.search([ ('config_id', '=', web_letter_id), ('state', '!=', 'done')], limit=1) if not import_config: import_config = self.create({ 'config_id': web_letter_id, 'state': 'open'}) # Find child if child_code: # Retrieve child code and find corresponding id child_field = 'local_id' if len(child_code) == 9: child_field = 'code' model_child = self.env['compassion.child'].search( [(child_field, '=', child_code), ('state', '=', 'P')]) child_id = model_child.id if sponsor_ref: # Retrieve sponsor reference and find corresponding id model_sponsor = self.env['res.partner'].search( ['|', ('ref', '=', sponsor_ref), ('global_id', '=', sponsor_ref)]) if len(model_sponsor) > 1: model_sponsor = model_sponsor.filtered('has_sponsorships') sponsor_id = model_sponsor.id # Check if a sponsorship exists current_date = datetime.now() limit_date = current_date + timedelta(weeks=12) self.env['recurring.contract'].search( [ ('child_id', '=', child_id), ('correspondant_id', '=', sponsor_id), '|', ('end_date', '=', False), ('end_date', '<=', fields.Datetime.to_string(limit_date)) ], limit=1).ensure_one() lang = self.env['correspondence'].detect_lang(original_text) lang_id = None if lang: lang_id = lang.id template = None if template_name: # Retrieve template name and find corresponding id template = self.env['correspondence.template'].search( [('name', '=', template_name)], limit=1) # save_letter pdf sftp_host = config.get('wp_sftp_host') sftp_user = config.get('wp_sftp_user') sftp_pw = config.get('wp_sftp_pwd') sftp = pysftp.Connection(sftp_host, sftp_user, password=sftp_pw) pdf_data = sftp.open(pdf_filename).read() filename = 'WEB_' + sponsor_ref + '_' + \ child_code + '_' + str(time.time())[:10] + '.pdf' pdf_letter = self.analyze_webletter(pdf_data) # analyze attachment to check template and create image preview line_vals, document_vals = func.analyze_attachment( self.env, pdf_letter, filename, template) # Check UTM internet_id = self.env.ref('utm.utm_medium_website').id utms = self.env['utm.mixin'].get_utms( utm_source, utm_medium, utm_campaign) for i in xrange(0, len(line_vals)): line_vals[i].update({ 'import_id': import_config.id, 'partner_id': sponsor_id, 'child_id': child_id, 'letter_language_id': lang_id, 'original_text': original_text, 'source': 'website', 'source_id': utms['source'], 'medium_id': utms.get('medium', internet_id), 'campaign_id': utms['campaign'], }) letters_line = self.env[ 'import.letter.line'].create(line_vals[i]) document_vals[i].update({ 'res_id': letters_line.id, 'res_model': 'import.letter.line' }) letters_line.letter_image = self.env[ 'ir.attachment'].create(document_vals[i]) import_config.import_completed = True logger.info("Try to copy file {} !".format(filename)) # Copy file in attachment in the done letter folder share_nas = self.env.ref('sbc_switzerland.share_on_nas').value import_letter_path = self.env.ref( 'sbc_switzerland.scan_letter_imported').value + filename file_pdf = BytesIO(pdf_letter) smb_conn = self._get_smb_connection() if smb_conn and smb_conn.connect( SmbConfig.smb_ip, SmbConfig.smb_port): smb_conn.storeFile(share_nas, import_letter_path, file_pdf) # save eventual attachment if attachment_filename: attachment_data = sftp.open(attachment_filename).read() filename_attachment = filename.replace(".pdf", "." + ext) logger.info("Try save attachment {} !" .format(filename_attachment)) import_letter_path = self.env.ref( 'sbc_switzerland.scan_letter_imported').value + \ filename_attachment file_attachment = BytesIO(attachment_data) smb_conn.storeFile( share_nas, import_letter_path, file_attachment) smb_conn.close() sftp.close() return True except: logger.error("Failed to create webletter", exc_info=True) return False
def import_web_letter(self, child_code, sponsor_ref, name, email, original_text, template_name, pdf_filename, attachment_filename, ext, utm_source, utm_medium, utm_campaign): """ Call when a letter is set on web site: - add web letter to an import set with import letter config 'Web letter' """ try: # Find existing config or create a new one web_letter_id = self.env.ref('sbc_switzerland.web_letter').id import_config = self.search([ ('config_id', '=', web_letter_id), ('state', '!=', 'done')], limit=1) if not import_config: import_config = self.create({ 'config_id': web_letter_id, 'state': 'open'}) # Retrieve child code and find corresponding id child_field = 'local_id' if len(child_code) == 9: child_field = 'code' model_child = self.env['compassion.child'].search( [(child_field, '=', child_code)]) child_id = model_child.id # Retrieve sponsor reference and find corresponding id model_sponsor = self.env['res.partner'].search( ['|', ('ref', '=', sponsor_ref), ('global_id', '=', sponsor_ref)]) if not model_sponsor: model_sponsor = model_sponsor.search([('email', '=', email)]) if len(model_sponsor) > 1: model_sponsor = model_sponsor.filtered('has_sponsorships') sponsor_id = model_sponsor[:1].id lang = self.env['correspondence'].detect_lang(original_text) lang_id = lang and lang.id # Retrieve template name and find corresponding id template = self.env['correspondence.template'].search( [('name', '=', template_name)], limit=1) # save_letter pdf sftp_host = config.get('wp_sftp_host') sftp_user = config.get('wp_sftp_user') sftp_pw = config.get('wp_sftp_pwd') sftp = pysftp.Connection(sftp_host, sftp_user, password=sftp_pw) pdf_data = sftp.open(pdf_filename).read() filename = 'WEB_' + sponsor_ref + '_' + \ child_code + '_' + str(time.time())[:10] + '.pdf' pdf_letter = self.analyze_webletter(pdf_data) # analyze attachment to check template and create image preview line_vals = func.analyze_attachment( self.env, pdf_letter, filename, template) # Check UTM internet_id = self.env.ref('utm.utm_medium_website').id utms = self.env['utm.mixin'].get_utms( utm_source, utm_medium, utm_campaign) for i in xrange(0, len(line_vals)): line_vals[i].update({ 'import_id': import_config.id, 'partner_id': sponsor_id, 'child_id': child_id, 'letter_language_id': lang_id, 'original_text': original_text, 'source': 'website', 'source_id': utms['source'], 'medium_id': utms.get('medium', internet_id), 'campaign_id': utms['campaign'], 'email': email, 'partner_name': name }) self.env['import.letter.line'].create(line_vals[i]) import_config.import_completed = True logger.info("Try to copy file {} !".format(filename)) # Copy file in attachment in the done letter folder share_nas = self.env.ref('sbc_switzerland.share_on_nas').value import_letter_path = self.env.ref( 'sbc_switzerland.scan_letter_imported').value + filename file_pdf = BytesIO(pdf_letter) smb_conn = self._get_smb_connection() if smb_conn and smb_conn.connect( SmbConfig.smb_ip, SmbConfig.smb_port): smb_conn.storeFile(share_nas, import_letter_path, file_pdf) # save eventual attachment if attachment_filename: attachment_data = sftp.open(attachment_filename).read() filename_attachment = filename.replace(".pdf", "." + ext) logger.info("Try save attachment {} !" .format(filename_attachment)) import_letter_path = self.env.ref( 'sbc_switzerland.scan_letter_imported').value + \ filename_attachment file_attachment = BytesIO(attachment_data) smb_conn.storeFile( share_nas, import_letter_path, file_attachment) smb_conn.close() sftp.close() # Accept privacy statement model_sponsor[:1].set_privacy_statement( origin='new_letter') return True except: logger.error("Failed to create webletter", exc_info=True) return False
def import_web_letter( self, child_code, sponsor_ref, name, email, original_text, template_name, pdf_url, attachment_url, ext, utm_source, utm_medium, utm_campaign, ): """ Called when a letter is sent from the Wordpress web site: - add the letter into an import set with import letter config 'Web letter' """ logger.info("New webletter from Wordpress : %s - %s", sponsor_ref, child_code) try: name = escape(name) original_text = escape(original_text) # Find existing config or create a new one web_letter_id = self.env.ref("sbc_switzerland.web_letter").id import_config = self.search( [("config_id", "=", web_letter_id), ("state", "!=", "done")], limit=1 ) if not import_config: import_config = self.create( {"config_id": web_letter_id, "state": "open"} ) # Retrieve child id child_id = func.find_child(self.env, child_code) # Retrieve sponsor id sponsor_id = func.find_partner(self.env, sponsor_ref, email) # Detect original language of the text lang = self.env["crm.claim"].detect_lang(original_text) lang_id = lang and lang.id # Retrieve the template given its name template = self.env["correspondence.template"].search( [("name", "=", template_name)], limit=1 ) # Retrieve the PDF generated and hosted by WP pdf_data = request.urlopen(pdf_url).read() filename = ( "WEB_" + sponsor_ref + "_" + child_code + "_" + str(time.time())[:10] + ".pdf" ) # Append a second (blank) page if necessary to the pdf pdf_letter = self.analyze_webletter(pdf_data) # here, "attachment" is the PDF # analyze "attachment" to check template and create image preview line_vals = func.analyze_attachment( self.env, pdf_letter, filename, template )[0] # Check UTM internet_id = self.env.ref("utm.utm_medium_website").id utms = self.env["utm.mixin"].get_utms(utm_source, utm_medium, utm_campaign) line_vals.update( { "import_id": import_config.id, "partner_id": sponsor_id.id, "child_id": child_id.id, "letter_language_id": lang_id, "original_text": original_text, "source": "website", "source_id": utms["source"], "medium_id": utms.get("medium", internet_id), "campaign_id": utms["campaign"], "email": email, "partner_name": name, } ) # Here, "attachment" is the image uploaded by the sponsor if attachment_url: attachment_data = request.urlopen(attachment_url).read() filename_attachment = filename.replace(".pdf", ".%s" % ext) line_vals.update( { "original_attachment_ids": [ ( 0, 0, { "datas_fname": filename_attachment, "datas": base64.b64encode(attachment_data), "name": filename_attachment, "res_model": "import.letter.line", }, ) ] } ) self.env["import.letter.line"].create(line_vals) import_config.import_completed = True # Copy file in attachment in the done letter folder share_nas = self.env.ref("sbc_switzerland.share_on_nas").value import_letter_path = ( self.env.ref( "sbc_switzerland.scan_letter_imported").value + filename ) file_pdf = BytesIO(pdf_letter) smb_conn = self._get_smb_connection() if smb_conn and smb_conn.connect(SmbConfig.smb_ip, SmbConfig.smb_port): smb_conn.storeFile(share_nas, import_letter_path, file_pdf) # save eventual attachment if attachment_url: import_letter_path = ( self.env.ref("sbc_switzerland.scan_letter_imported").value + filename_attachment ) file_attachment = BytesIO(attachment_data) smb_conn.storeFile(share_nas, import_letter_path, file_attachment) smb_conn.close() # Accept privacy statement sponsor_id.set_privacy_statement(origin="new_letter") return True except Exception as e: logger.error(str(e)) logger.error("Failed to create webletter", exc_info=True) return False