Ejemplo n.º 1
0
 def redact_subject(self):
     content = self.subject
     if self.request.user:
         account_service = AccountService(self.request.user)
         content = account_service.apply_message_redaction(content)
     content = redact_content(content)
     return content[:255]
Ejemplo n.º 2
0
    def add_attachments(self, foirequest, message, attachments):
        account_service = AccountService(foirequest.user)
        names = set()

        for i, attachment in enumerate(attachments):
            att = FoiAttachment(
                belongs_to=message,
                name=attachment.name,
                size=attachment.size,
                filetype=attachment.content_type
            )
            if not att.name:
                att.name = _("attached_file_%d") % i

            # Translators: replacement for person name in filename
            repl = str(_('NAME'))
            att.name = account_service.apply_name_redaction(att.name, repl)
            att.name = re.sub(r'[^A-Za-z0-9_\.\-]', '', att.name)
            att.name = att.name[:250]

            # Assure name is unique
            if att.name in names:
                att.name = add_number_to_filename(att.name, i)
            names.add(att.name)

            if foirequest.not_publishable:
                att.can_approve = False

            attachment._committed = False
            att.file = File(attachment)
            att.save()

            if att.can_convert_to_pdf():
                self.trigger_convert_pdf(att.id)
Ejemplo n.º 3
0
    def add_attachments(self, foirequest, message, attachments):
        account_service = AccountService(foirequest.user)
        names = set()

        for i, attachment in enumerate(attachments):
            att = FoiAttachment(belongs_to=message,
                                name=attachment.name,
                                size=attachment.size,
                                filetype=attachment.content_type)
            if not att.name:
                att.name = _("attached_file_%d") % i

            # Translators: replacement for person name in filename
            repl = str(_('NAME'))
            att.name = account_service.apply_name_redaction(att.name, repl)
            att.name = re.sub(r'[^A-Za-z0-9_\.\-]', '', att.name)
            att.name = att.name[:250]

            # Assure name is unique
            if att.name in names:
                att.name = add_number_to_filename(att.name, i)
            names.add(att.name)

            attachment._committed = False
            att.file = File(attachment)
            att.save()
Ejemplo n.º 4
0
    def process(self, request=None):
        data = self.data
        user = data['user']
        user_created = False

        if not user.is_authenticated:
            user_created = True
            user, password = AccountService.create_user(**self.data)
            self.data['user'] = user

        if request is not None:
            extra = registry.run_hook('pre_request_creation',
                                      request,
                                      user=user,
                                      data=data)
            if extra is not None:
                data.update(extra)

        if len(self.data['publicbodies']) > 1:
            foi_object = self.create_project()
        else:
            foi_object = self.create_request(self.data['publicbodies'][0])

            if user_created:
                AccountService(user).send_confirmation_mail(
                    request_id=foi_object.pk,
                    password=password,
                    reference=foi_object.reference,
                    redirect_url=self.data.get('redirect_url'))
        self.post_creation(foi_object)
        return foi_object
Ejemplo n.º 5
0
class PublicBodyUploader:
    def __init__(self, foirequest, token):
        self.foirequest = foirequest
        self.token = token
        self.account_service = AccountService(foirequest.user)

    def create_upload_message(self, upload_list):
        message = FoiMessage.objects.create(
            request=self.foirequest,
            timestamp=timezone.now(),
            is_response=True,
            plaintext='',
            plaintext_redacted='',
            html='',
            kind='upload',
            sender_public_body=self.foirequest.public_body
        )
        self.foirequest.message_received.send(
            sender=self.foirequest, message=message
        )
        self.names = set()
        att_count = 0
        for upload_url in upload_list:
            att = self.create_attachment(message, upload_url)
            if att:
                att_count += 1

        return att_count

    def create_attachment(self, message, upload_url):
        upload = Upload.objects.get_by_url(
            upload_url, token=self.token
        )
        if upload is None:
            return

        name = self.account_service.apply_name_redaction(
            upload.filename, str(_('NAME'))
        )

        name = make_name_unique(name, self.names)
        self.names.add(name)
        att = FoiAttachment.objects.create(
            belongs_to=message,
            name=name,
            size=upload.size,
            filetype=upload.content_type,
            can_approve=True,
            approved=False,
            pending=True,
        )
        upload.ensure_saving()
        upload.save()

        transaction.on_commit(
            lambda: move_upload_to_attachment.delay(
                att.id, upload.id
            )
        )
        return att
Ejemplo n.º 6
0
    def redact_plaintext(self):
        content = self.plaintext

        content = redact_content(content)

        greeting_replacement = str(_("<< Greeting >>"))

        if not settings.FROIDE_CONFIG.get('public_body_officials_public'):
            if self.is_response:
                if settings.FROIDE_CONFIG.get('closings'):
                    content = remove_closing(
                        settings.FROIDE_CONFIG['closings'], content)

            else:
                if settings.FROIDE_CONFIG.get('greetings'):
                    content = replace_custom(
                        settings.FROIDE_CONFIG['greetings'],
                        greeting_replacement, content)

        if self.request.user:
            account_service = AccountService(self.request.user)
            content = account_service.apply_message_redaction(content)

        return content
Ejemplo n.º 7
0
    def process(self, request=None):
        data = self.data
        user = data['user']
        user_created = False
        user_auth = user.is_authenticated

        if not user_auth:
            user, user_created = AccountService.create_user(
                **self.data
            )
            self.data['user'] = user

        if not user_created and not user_auth:
            return self.create_token_draft(user)

        if request is not None:
            extra = registry.run_hook('pre_request_creation',
                request,
                user=user,
                data=data
            )
            if extra is not None:
                data.update(extra)

        if len(self.data['publicbodies']) > 1:
            foi_object = self.create_project()
        else:
            foi_object = self.create_request(self.data['publicbodies'][0])

            if user_created:
                AccountService(user).send_confirmation_mail(
                    request_id=foi_object.pk,
                    reference=foi_object.reference,
                    redirect_url=self.data.get('redirect_url')
                )
        self.post_creation(foi_object)
        return foi_object
Ejemplo n.º 8
0
    def create_token_draft(self, user):
        '''
        User is not authenticated, but has given valid email.
        Create a draft object with a token, send token to email.

        '''
        from .views import MakeRequestView

        data = self.data
        additional_kwargs = dict(
            subject=data.get('subject', ''),
            body=data.get('body', ''),
            full_text=data.get('full_text', False),
            public=data['public'],
            reference=data.get('reference', ''),
            law_type=data.get('law_type', ''),
        )

        flag_keys = set(MakeRequestView.FORM_CONFIG_PARAMS) | {'redirect_url'}
        flags = {k: v for k, v in data.items() if k in flag_keys}
        additional_kwargs['flags'] = flags

        draft = RequestDraft.objects.create(user=None,
                                            token=uuid.uuid4(),
                                            **additional_kwargs)
        draft.publicbodies.set(data['publicbodies'])

        claim_url = reverse('foirequest-claim_draft',
                            kwargs={'token': draft.token})
        AccountService(user).send_confirm_action_mail(
            claim_url,
            draft.subject,
            reference=draft.reference,
            redirect_url=self.data.get('redirect_url'))

        return draft
Ejemplo n.º 9
0
    def add_message_from_email(self, email, publicbody=None):
        from .message import FoiMessage
        from .attachment import FoiAttachment

        message = FoiMessage(request=self)
        message.subject = email['subject'] or ''
        message.subject = message.subject[:250]
        message_id = email.get('message_id', '')
        if message_id:
            message.email_message_id = message_id[:512]
        message.is_response = True
        message.sender_name = email['from'][0]
        message.sender_email = email['from'][1]

        if publicbody is None:
            publicbody = get_publicbody_for_email(message.sender_email, self)
        if publicbody is None:
            publicbody = self.public_body

        message.sender_public_body = publicbody

        if message.sender_public_body == self.law.mediator:
            message.content_hidden = True

        if email['date'] is None:
            message.timestamp = timezone.now()
        else:
            message.timestamp = email['date']
        message.recipient_email = self.secret_address
        message.recipient = self.user.display_name()
        message.plaintext = email['body']
        message.html = email['html']
        if not message.plaintext and message.html:
            message.plaintext = strip_tags(email['html'])
        message.subject_redacted = message.redact_subject()[:250]
        message.plaintext_redacted = message.redact_plaintext()
        message.save()
        self._messages = None
        self.status = 'awaiting_classification'
        self.last_message = message.timestamp
        self.save()
        has_pdf = False

        account_service = AccountService(self.user)

        for i, attachment in enumerate(email['attachments']):
            att = FoiAttachment(belongs_to=message,
                                name=attachment.name,
                                size=attachment.size,
                                filetype=attachment.content_type)
            if not att.name:
                att.name = _("attached_file_%d") % i

            # Translators: replacement for person name in filename
            repl = str(_('NAME'))
            att.name = account_service.apply_name_redaction(att.name, repl)
            att.name = re.sub(r'[^A-Za-z0-9_\.\-]', '', att.name)
            att.name = att.name[:255]
            if att.name.endswith('pdf') or 'pdf' in att.filetype:
                has_pdf = True
            attachment._committed = False
            att.file = File(attachment)
            att.save()
        if (has_pdf and settings.FROIDE_CONFIG.get(
                "mail_managers_on_pdf_attachment", False)):
            mail_managers(_('Message contains PDF'),
                          self.get_absolute_domain_url())
        self.message_received.send(sender=self, message=message)
Ejemplo n.º 10
0
 def __init__(self, foirequest, token):
     self.foirequest = foirequest
     self.token = token
     self.account_service = AccountService(foirequest.user)
Ejemplo n.º 11
0
def confirm_donor_email(donor, request=None):
    if request and request.user.is_staff:
        # Don't trigger things as staff
        return
    is_auth = request and request.user.is_authenticated

    donor.email_confirmed = timezone.now()
    donor.save()
    logger.info('Donor confirmed %s', donor.id)

    # Try finding existing user via email
    new_user = False
    user = None
    if not donor.user:
        users = User.objects.filter(
            email__iexact=donor.email,
            is_active=True
        )
        if len(users) > 1:
            user = users[0]
            new_user = True
        else:
            user = None
        if user is not None:
            donor = assign_and_merge_donors(donor, user)
            if request and is_auth:
                auth.login(request, user)

        elif donor.become_user and not is_auth:
            # Create user
            new_user = True
            user, created = AccountService.create_user(
                user_email=donor.email,
                first_name=donor.first_name,
                last_name=donor.last_name,
                address=donor.get_full_address(),
                private=True
            )
            AccountService(user)._confirm_account()
            donor.user = user
            donor.save()
            logger.info('Donor user created %s for donor %s', user.id, donor.id)
            # Login new user
            if request:
                auth.login(request, user)
    else:
        user = donor.user

    if 'newsletter' in request.GET:
        donor.contact_allowed = True
        donor.save()

    if donor.contact_allowed:
        # Subscribe to normal and donor newsletter
        # TODO: subscribe email address / if different from user?
        subscribe_to_default_newsletter(
            donor.email, user=user,
            name=donor.get_full_name(),
            email_confirmed=True
        )
        subscribe_donor_newsletter(donor, email_confirmed=True)
    if new_user:
        connect_payments_to_user(donor)