Exemplo n.º 1
0
    def clean_params(self, request):
        """
        Parameters for put and post.
        """
        kw = json.loads(request.raw_post_data)
        kw["sender"] = request.user
        if kw.get("type", None) == "waitlist":
            kw["is_postcard"] = True
        if "recipient_id" in kw:
            kw["recipient"] = utils.mail_filter_or_404(request.user, Profile, pk=kw.pop("recipient_id")).user
        elif "recipient" in kw:
            kw["recipient"] = utils.mail_filter_or_404(request.user, Profile, pk=kw.pop("recipient")["id"]).user
        if "recipient" not in kw:
            raise Http404
        if "org_id" in kw:
            kw["org"] = utils.mail_filter_or_404(request.user, Organization, pk=kw.pop("org_id"))
        else:
            raise Http404

        kw.pop("order_date", None)  # added by CorrespondenceList
        for datefield in ("created", "sent"):
            if datefield in kw:
                if kw[datefield] is None:
                    continue
                if kw[datefield] == True:
                    kw[datefield] = datetime.datetime.now()
                else:
                    kw[datefield] = kw[datefield].split(".")[0].replace("T", " ")
                    kw[datefield] = datetime.datetime.strptime(kw[datefield], "%Y-%m-%d %H:%M:%S")
        return kw
Exemplo n.º 2
0
def preview_letter(request):
    if request.method == "POST":
        letter = Letter.objects.create(
            type="letter",
            recipient=utils.mail_filter_or_404(request.user, Profile, pk=request.POST.get("recipient_id")).user,
            org=utils.mail_filter_or_404(request.user, Organization, pk=request.POST.get("org_id")),
            body=request.POST.get("body"),
            sender=request.user,
            send_anonymously=not request.POST.get("signed"),
            sent=datetime.datetime.now(),
        )
        response = show_letter(request, letter.pk)
        letter.delete()
        return response
Exemplo n.º 3
0
Arquivo: views.py Projeto: catstar/btb
def comment_removal_letter_preview_frame(request, comment_id):
    comment = utils.mail_filter_or_404(request.user, Comment, pk=comment_id)
    recipient = comment.document.author
    org = comment.document.author.organization_set.get()
    error = None
    if request.method == "POST":
        letter = Letter.objects.create(type="comment_removal",
                                       recipient=recipient,
                                       org=org,
                                       body=request.POST.get("body"),
                                       sender=request.user,
                                       send_anonymously=True,
                                       sent=datetime.datetime.now())
        letter.comments.add(comment)
        response = None
        try:
            response = show_letter(request, letter.pk)
        except utils.LatexCompileError as e:
            error = e
        finally:
            letter.delete()
        if response:
            return response
    return render(request,
                  "correspondence/comment_removal_letter_preview_frame.html", {
                      'comment': comment,
                      'recipient': recipient,
                      'org': org,
                      'error': error,
                  })
Exemplo n.º 4
0
def comment_removal_letter_preview_frame(request, comment_id):
    comment = utils.mail_filter_or_404(request.user, Comment, pk=comment_id)
    recipient = comment.document.author
    org = comment.document.author.organization_set.get()
    error = None
    if request.method == "POST":
        letter = Letter.objects.create(
            type="comment_removal",
            recipient=recipient,
            org=org,
            body=request.POST.get("body"),
            sender=request.user,
            send_anonymously=True,
            sent=datetime.datetime.now(),
        )
        letter.comments.add(comment)
        response = None
        try:
            response = show_letter(request, letter.pk)
        except utils.LatexCompileError as e:
            error = e
        finally:
            letter.delete()
        if response:
            return response
    return render(
        request,
        "correspondence/comment_removal_letter_preview_frame.html",
        {"comment": comment, "recipient": recipient, "org": org, "error": error},
    )
Exemplo n.º 5
0
    def clean_params(self, request):
        """
        Parameters for put and post.
        """
        kw = json.loads(request.raw_post_data)
        # TODO: Remove this at the client side.
        for key in ('order_date', 'org', 'document', 'recipient_address',
                    'sender'):
            kw.pop(key, None)
        self.whitelist_attrs(kw)
        kw['sender'] = request.user
        if kw.get('type', None) == 'waitlist':
            kw['is_postcard'] = True
        if 'recipient_id' in kw:
            kw['recipient'] = utils.mail_filter_or_404(
                request.user, Profile, pk=kw.pop('recipient_id')).user
        elif 'recipient' in kw:
            kw['recipient'] = utils.mail_filter_or_404(
                request.user, Profile, pk=kw.pop('recipient')['id']).user
        if 'recipient' not in kw:
            raise Http404
        if 'document_id' in kw:
            try:
                kw['document'] = Document.objects.org_filter(
                    request.user, pk=kw.pop('document_id')).get()
            except Document.DoesNotExist:
                raise Http404
        if 'org_id' in kw:
            kw['org'] = utils.mail_filter_or_404(request.user,
                                                 Organization,
                                                 pk=kw.pop('org_id'))
        else:
            raise Http404

        kw.pop('order_date', None)  # added by CorrespondenceList
        for datefield in ('created', 'sent'):
            if datefield in kw:
                if kw[datefield] is None:
                    continue
                if kw[datefield] == True:
                    kw[datefield] = datetime.datetime.now()
                else:
                    kw[datefield] = kw[datefield].split(".")[0].replace(
                        'T', ' ')
                    kw[datefield] = datetime.datetime.strptime(
                        kw[datefield], "%Y-%m-%d %H:%M:%S")
        return kw
Exemplo n.º 6
0
 def clean_params(self, request):
     """
     Parameters for put and post.
     """
     kw = json.loads(request.body)
     # TODO: Remove this at the client side.
     for key in ('order_date', 'org', 'document', 'recipient_address', 'sender'):
         kw.pop(key, None)
     self.whitelist_attrs(kw)
     kw['sender'] = request.user
     if kw.get('type', None) == 'waitlist':
         kw['is_postcard'] = True
     if 'recipient_id' in kw:
         kw['recipient'] = utils.mail_filter_or_404(
                 request.user, Profile, pk=kw.pop('recipient_id')
         ).user
     elif 'recipient' in kw:
         kw['recipient'] = utils.mail_filter_or_404(
                 request.user, Profile, pk=kw.pop('recipient')['id']
         ).user
     if 'recipient' not in kw:
         raise Http404
     if 'document_id' in kw:
         try:
             kw['document'] = Document.objects.org_filter(
                     request.user, pk=kw.pop('document_id')
             ).get()
         except Document.DoesNotExist:
             raise Http404
     if 'org_id' in kw:
         kw['org'] = utils.mail_filter_or_404(
                 request.user, Organization, pk=kw.pop('org_id')
         )
     else:
         raise Http404
     
     kw.pop('order_date', None) # added by CorrespondenceList
     for datefield in ('created', 'sent'):
         if datefield in kw:
             if kw[datefield] is None:
                 continue
             if kw[datefield] == True:
                 kw[datefield] = datetime.datetime.now()
             else:
                 kw[datefield] = kw[datefield].split(".")[0].replace('T', ' ')
                 kw[datefield] = datetime.datetime.strptime(kw[datefield], "%Y-%m-%d %H:%M:%S")
     return kw
Exemplo n.º 7
0
def preview_letter(request):
    if request.method == "POST":
        letter = Letter.objects.create(
            type="letter",
            recipient=utils.mail_filter_or_404(
                request.user, Profile,
                pk=request.POST.get("recipient_id")).user,
            org=utils.mail_filter_or_404(request.user,
                                         Organization,
                                         pk=request.POST.get("org_id")),
            body=request.POST.get("body"),
            sender=request.user,
            send_anonymously=not request.POST.get("signed"),
            sent=datetime.datetime.now())
        response = show_letter(request, letter.pk)
        letter.delete()
        return response
Exemplo n.º 8
0
 def get(self, request, mailing_id=None):
     mailing_id = mailing_id or request.GET.get('mailing_id', None)
     if mailing_id is None:
         return self.get_list(request)
     mailing = utils.mail_filter_or_404(request.user,
                                        Mailing,
                                        pk=mailing_id)
     return self.json_response(mailing.to_dict())
Exemplo n.º 9
0
def get_mailing_file(request, mailing_id):
    mailing = utils.mail_filter_or_404(request.user, Mailing, pk=mailing_id)
    if mailing.has_file():
        response = HttpResponse(mimetype='application/zip')
        filename = mailing.get_file()

        # Compile special instructions
        special_instructions = []
        for letter in mailing.letters.all():
            if letter.recipient and letter.recipient.profile.special_mail_handling:
                special_instructions.append(letter.recipient.profile)
        if special_instructions:
            # Add/replace special instructions manifest.
            tmpdir = tempfile.mkdtemp()
            subdir = os.path.join(
                tmpdir,
                os.path.splitext(os.path.basename(filename))[0])
            os.makedirs(subdir)
            instructions_path = os.path.join(
                tmpdir,
                os.path.splitext(os.path.basename(filename))[0],
                "special_instructions.csv")
            rows = [["Name", "Address", "Special instructions"]]
            for profile in special_instructions:
                rows.append([
                    profile.display_name,
                    profile.mailing_address,
                    profile.special_mail_handling,
                ])
            utils.write_csv(rows, instructions_path)
            proc = subprocess.Popen([
                "zip",
                os.path.splitext(filename)[0],
                os.path.relpath(instructions_path, tmpdir),
            ],
                                    cwd=tmpdir)
            proc.communicate()
            shutil.rmtree(tmpdir)
        else:
            # No special instructions: remove them.
            proc = subprocess.Popen([
                "zip", "-d", filename,
                os.path.splitext(os.path.basename(filename))[0] +
                "/special_instructions.csv"
            ])
            proc.communicate()

        if settings.X_SENDFILE_ENABLED:
            response['X-Sendfile'] = filename
        else:
            with open(mailing.get_file()) as fh:
                response.write(fh.read())
        response['Content-Disposition'] = 'attachment; filename={0}'.format(
            os.path.basename(mailing.get_file()))
        return response
    task_id = tasks.generate_collation_task.delay(mailing.pk, request.path)
    return redirect("moderation.wait_for_processing", task_id)
Exemplo n.º 10
0
    def get(self, request, letter_id=None):
        if letter_id:
            letter = utils.mail_filter_or_404(request.user, Letter, pk=letter_id)
            return self.json_response(letter.to_dict())

        letters = Letter.objects.mail_filter(request.user).filter(
                recipient__profile__lost_contact=False
             ).extra(
                select={
                    'date_order': 
                        'COALESCE("{0}"."sent", "{0}"."created")'.format(
                            Letter._meta.db_table
                        )

                },
                order_by=('-date_order',)
            ).distinct()
        if "sent" in request.GET:
            letters = letters.filter(sent__isnull=False)
        if "unsent" in request.GET:
            letters = letters.filter(sent__isnull=True)
        if "mailing_id" in request.GET:
            mid = request.GET.get("mailing_id")
            if mid == "null":
                letters = letters.filter(mailing__isnull=True)
            else:
                letters = letters.filter(mailing__pk=mid)
        if 'text' in request.GET:
            parts = [p.strip() for p in request.GET.get('text').split()]
            q = Q()
            for part in parts:
                q = q & (
                    Q(recipient__profile__display_name__icontains=part) | 
                    Q(recipient__profile__mailing_address__icontains=part) |
                    Q(body__icontains=part) |
                    Q(comments__comment__icontains=part)
                )
            letters = letters.filter(q)

        # Get counts by type first....
        counts = letters.values('type').annotate(
            count=Count('type')
        ).order_by()
        by_type = {
            'counts': dict((c['type'], c['count']) for c in counts)
        }
        # ... then filter by type, so the counts aren't affected by that.
        if 'types' in request.GET:
            types = request.GET.get('types').split(",")
            q = Q()
            for type_ in types:
                q = q | Q(type=type_)
            letters = letters.filter(q)

        return self.paginated_response(request, letters, 
                extra=by_type)
Exemplo n.º 11
0
def clear_mailing_cache(request, mailing_id):
    mailing = utils.mail_filter_or_404(request.user, Mailing, pk=mailing_id)
    if mailing.file and os.path.exists(mailing.file.path):
        os.remove(mailing.file.path)
    mailing.file = ""
    mailing.save()
    for letter in mailing.letters.all():
        if letter.file and os.path.exists(letter.file.path):
            os.remove(letter.file.path)
        letter.file = ""
        letter.save()
    return HttpResponse("success")
Exemplo n.º 12
0
def clear_mailing_cache(request, mailing_id):
    mailing = utils.mail_filter_or_404(request.user, Mailing, pk=mailing_id)
    if mailing.file and os.path.exists(mailing.file.path):
        os.remove(mailing.file.path)
    mailing.file = ""
    mailing.save()
    for letter in mailing.letters.all():
        if letter.file and os.path.exists(letter.file.path):
            os.remove(letter.file.path)
        letter.file = ""
        letter.save()
    return HttpResponse("success")
Exemplo n.º 13
0
    def clean_params(self, request):
        """
        Parameters for put and post.
        """
        kw = json.loads(request.body)
        # TODO: Remove this at the client side.
        for key in ("order_date", "org", "document", "recipient_address", "sender"):
            kw.pop(key, None)
        self.whitelist_attrs(kw)
        kw["sender"] = request.user
        if kw.get("type", None) == "waitlist":
            kw["is_postcard"] = True
        if "recipient_id" in kw:
            kw["recipient"] = utils.mail_filter_or_404(request.user, Profile, pk=kw.pop("recipient_id")).user
        elif "recipient" in kw:
            kw["recipient"] = utils.mail_filter_or_404(request.user, Profile, pk=kw.pop("recipient")["id"]).user
        if "recipient" not in kw:
            raise Http404
        if "document_id" in kw:
            try:
                kw["document"] = Document.objects.org_filter(request.user, pk=kw.pop("document_id")).get()
            except Document.DoesNotExist:
                raise Http404
        if "org_id" in kw:
            kw["org"] = utils.mail_filter_or_404(request.user, Organization, pk=kw.pop("org_id"))
        else:
            raise Http404

        kw.pop("order_date", None)  # added by CorrespondenceList
        for datefield in ("created", "sent"):
            if datefield in kw:
                if kw[datefield] is None:
                    continue
                if kw[datefield] == True:
                    kw[datefield] = datetime.datetime.now()
                else:
                    kw[datefield] = kw[datefield].split(".")[0].replace("T", " ")
                    kw[datefield] = datetime.datetime.strptime(kw[datefield], "%Y-%m-%d %H:%M:%S")
        return kw
Exemplo n.º 14
0
 def put(self, request, letter_id=None):
     kw = self.clean_params(request)
     letter = utils.mail_filter_or_404(request.user, Letter, pk=kw["id"])
     comments = kw.pop("comments", [])
     for param, val in kw.iteritems():
         setattr(letter, param, val)
     error = self.validate(letter)
     if error:
         return error
     else:
         letter.save()
         letter.comments = [Comment.objects.mail_filter(request.user).get(pk=c["id"]) for c in comments]
         return self.json_response(letter.to_dict())
Exemplo n.º 15
0
def get_mailing_file(request, mailing_id):
    mailing = utils.mail_filter_or_404(request.user, Mailing, pk=mailing_id)
    if mailing.has_file():
        response = HttpResponse(mimetype='application/zip')
        filename = mailing.get_file()

        # Compile special instructions
        special_instructions = []
        for letter in mailing.letters.all():
            if letter.recipient and letter.recipient.profile.special_mail_handling:
                special_instructions.append(letter.recipient.profile)
        if special_instructions:
            # Add/replace special instructions manifest.
            tmpdir = tempfile.mkdtemp()
            subdir = os.path.join(tmpdir, os.path.splitext(os.path.basename(filename))[0])
            os.makedirs(subdir)
            instructions_path = os.path.join(tmpdir, os.path.splitext(os.path.basename(filename))[0], 
                    "special_instructions.csv")
            rows = [["Name", "Address", "Special instructions"]]
            for profile in special_instructions:
                rows.append([
                    profile.display_name,
                    profile.mailing_address,
                    profile.special_mail_handling,
                ])
            utils.write_csv(rows, instructions_path)
            proc = subprocess.Popen(["zip", 
                os.path.splitext(filename)[0], 
                os.path.relpath(instructions_path, tmpdir),
            ], cwd=tmpdir)
            proc.communicate()
            shutil.rmtree(tmpdir)
        else:
            # No special instructions: remove them.
            proc = subprocess.Popen(["zip", "-d",
                filename,
                os.path.splitext(os.path.basename(filename))[0] + "/special_instructions.csv"
            ])
            proc.communicate()

        if settings.X_SENDFILE_ENABLED:
            response['X-Sendfile'] = filename
        else:
            with open(mailing.get_file()) as fh:
                response.write(fh.read())
        response['Content-Disposition'] = 'attachment; filename={0}'.format(
            os.path.basename(mailing.get_file())
        )
        return response
    task_id = tasks.generate_collation_task.delay(mailing.pk, request.path)
    return redirect("moderation.wait_for_processing", task_id)
Exemplo n.º 16
0
    def get(self, request, letter_id=None):
        if letter_id:
            letter = utils.mail_filter_or_404(request.user,
                                              Letter,
                                              pk=letter_id)
            return self.json_response(letter.to_dict())

        letters = Letter.objects.mail_filter(
            request.user).filter(recipient__profile__lost_contact=False).extra(
                select={
                    'date_order':
                    'COALESCE("{0}"."sent", "{0}"."created")'.format(
                        Letter._meta.db_table)
                },
                order_by=('-date_order', )).distinct()
        if "sent" in request.GET:
            letters = letters.filter(sent__isnull=False)
        if "unsent" in request.GET:
            letters = letters.filter(sent__isnull=True)
        if "mailing_id" in request.GET:
            mid = request.GET.get("mailing_id")
            if mid == "null":
                letters = letters.filter(mailing__isnull=True)
            else:
                letters = letters.filter(mailing__pk=mid)
        if 'text' in request.GET:
            parts = [p.strip() for p in request.GET.get('text').split()]
            q = Q()
            for part in parts:
                q = q & (Q(recipient__profile__display_name__icontains=part) |
                         Q(recipient__profile__mailing_address__icontains=part)
                         | Q(body__icontains=part)
                         | Q(comments__comment__icontains=part))
            letters = letters.filter(q)

        # Get counts by type first....
        counts = letters.values('type').annotate(
            count=Count('type')).order_by()
        by_type = {'counts': dict((c['type'], c['count']) for c in counts)}
        # ... then filter by type, so the counts aren't affected by that.
        if 'types' in request.GET:
            types = request.GET.get('types').split(",")
            q = Q()
            for type_ in types:
                q = q | Q(type=type_)
            letters = letters.filter(q)

        return self.paginated_response(request, letters, extra=by_type)
Exemplo n.º 17
0
 def put(self, request, letter_id=None):
     kw = self.clean_params(request)
     letter = utils.mail_filter_or_404(request.user, Letter, pk=kw['id'])
     comments = kw.pop('comments', [])
     for param, val in kw.iteritems():
         setattr(letter, param, val)
     error = self.validate(letter)
     if error:
         return error
     else:
         letter.save()
         letter.comments = [
             Comment.objects.mail_filter(request.user).get(pk=c['id'])
             for c in comments
         ]
         return self.json_response(letter.to_dict())
Exemplo n.º 18
0
def print_envelope(request, user_id=None, reverse=None, address=None):
    if user_id:
        user = utils.mail_filter_or_404(request.user, Profile, pk=user_id).user
        to_address = user.profile.full_address()
    else:
        to_address = request.GET.get("address", address)
    if not to_address:
        raise Http404
    from_address = user.organization_set.get().mailing_address
    if reverse:
        from_address, to_address = to_address, from_address

    stringio = utils.build_envelope(to_address=to_address, from_address=from_address)
    response = HttpResponse(content_type="image/jpeg")
    response.write(stringio.getvalue())
    response["Content-Disposition"] = "attachment; filename=%s-envelope.jpg" % slugify(to_address.split("\n")[0])
    return response
Exemplo n.º 19
0
def show_letter(request, letter_id=None):
    letter = utils.mail_filter_or_404(request.user, Letter, pk=letter_id)
    # Run this as an out-of-process task because WSGI borks on the subprocess
    # invocation for pdftk. http://stackoverflow.com/questions/7543452/
    filename = tasks.generate_letter_task.delay(letter_id=letter_id).get()
    basename, ext = os.path.splitext(filename)
    if ext == ".pdf":
        mimetype = 'application/pdf'
    elif ext == ".jpg":
        mimetype = 'image/jpeg'
    else:
        raise NotImplementedError("Unknown extention {0}".format(ext))

    response = HttpResponse(mimetype=mimetype)
    response['Content-Disposition'] = 'attachment; filename=%s-%s.%s' % (
        slugify(letter.recipient.profile.display_name), letter.type, ext)
    with open(filename) as fh:
        response.write(fh.read())
    return response
Exemplo n.º 20
0
def print_envelope(request, user_id=None, reverse=None, address=None):
    if user_id:
        user = utils.mail_filter_or_404(request.user, Profile, pk=user_id).user
        to_address = user.profile.full_address()
    else:
        to_address = request.GET.get('address', address)
    if not to_address:
        raise Http404
    from_address = user.organization_set.get().mailing_address
    if reverse:
        from_address, to_address = to_address, from_address

    stringio = utils.build_envelope(to_address=to_address,
                                    from_address=from_address)
    response = HttpResponse(mimetype='image/jpeg')
    response.write(stringio.getvalue())
    response['Content-Disposition'] = 'attachment; filename=%s-envelope.jpg' % \
            slugify(to_address.split('\n')[0])
    return response
Exemplo n.º 21
0
def show_letter(request, letter_id=None):
    letter = utils.mail_filter_or_404(request.user, Letter, pk=letter_id)
    # Run this as an out-of-process task because WSGI borks on the subprocess
    # invocation for pdftk. http://stackoverflow.com/questions/7543452/
    filename = tasks.generate_letter_task.delay(letter_id=letter_id).get()
    basename, ext = os.path.splitext(filename)
    if ext == ".pdf":
        content_type = "application/pdf"
    elif ext == ".jpg":
        content_type = "image/jpeg"
    else:
        raise NotImplementedError("Unknown extention {0}".format(ext))

    response = HttpResponse(content_type=content_type)
    response["Content-Disposition"] = "attachment; filename=%s-%s.%s" % (
        slugify(letter.recipient.profile.display_name),
        letter.type,
        ext,
    )
    with open(filename) as fh:
        response.write(fh.read())
    return response
Exemplo n.º 22
0
 def delete(self, request, letter_id=None):
     letter = utils.mail_filter_or_404(request.user, Letter, pk=letter_id)
     letter.delete()
     return self.json_response(["success"])
Exemplo n.º 23
0
 def get(self, request, mailing_id=None):
     mailing_id = mailing_id or request.GET.get("mailing_id", None)
     if mailing_id is None:
         return self.get_list(request)
     mailing = utils.mail_filter_or_404(request.user, Mailing, pk=mailing_id)
     return self.json_response(mailing.to_dict())
Exemplo n.º 24
0
 def delete(self, request, letter_id=None):
     letter = utils.mail_filter_or_404(request.user, Letter, pk=letter_id)
     letter.delete()
     return self.json_response(["success"])