Example #1
0
    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
Example #2
0
    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
Example #4
0
    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