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
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
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, })
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}, )
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
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
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
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())
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)
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)
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")
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")
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
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())
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)
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)
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())
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
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
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
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
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"])
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())
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"])