コード例 #1
0
    def email_profile_to(self, to_email):
        message = (f"{self.get_full_name()} has just signed up on the portal."
                   f"Their email is {self.user.email}.")
        email_vars = {
            "preheader": "",
            "title": "New member signup",
            "message": message
        }
        email_string = render_to_string("email_without_button.html", {
            "email": email_vars,
            "config": config
        })
        subject = "A new member signed up! ({})".format(self.get_full_name())

        postmark = PostmarkClient(server_token=config.POSTMARK_API_KEY)
        postmark.emails.send(
            From=config.EMAIL_DEFAULT_FROM,
            To=to_email,
            Subject=subject,
            HtmlBody=email_string,
        )

        log_user_event(
            self.user,
            "Sent email with subject: " + subject,
            "email",
            "Email content: " + email_string,
        )
        return True
コード例 #2
0
def issue(request):
    # Handle submission.
    if request.method == "POST":
        print(request.POST.get("title"))
        if request.POST.get("title") and request.POST.get("description"):
            if "PORTAL_TRELLO_API_KEY" in os.environ and "PORTAL_TRELLO_API_TOKEN" in os.environ:
                issue = request.POST.get("title", "")
                details = request.POST.get("description", "")
                url = "https://api.trello.com/1/cards"
                trelloKey = os.environ.get("PORTAL_TRELLO_API_KEY")
                trelloToken = os.environ.get("PORTAL_TRELLO_API_TOKEN")

                querystring = {"name": issue, "desc": details, "pos": "top", "idList": "5529dd886d658fdace75c830",
                               "keepFromSource": "all", "key": trelloKey, "token": trelloToken}

                response = requests.request("POST", url, params=querystring)

                if response.status_code == 200:
                    log_user_event(request.user, "Submitted issue: " + issue + " Content: " + details, "generic")

                    return render(request, "issue.html", {"message": "Submission Successful!"})
                else:
                    return render(request, "issue.html",
                                  {"error": "Sorry but there was a server side error."})

            else:
                return render(request, "issue.html",
                              {"error": "Sorry but there was a server side error: Trello API is not configured."})

        return render(request, "issue.html", {"error": "Invalid form submission..."})

    # render template normally
    return render(request, "issue.html")
コード例 #3
0
def edit_group(request, group_id):
    """
    The edit group (admin) view.
    :param request:
    :param group_id: group id to edit
    :return:
    """
    group = get_object_or_404(Group, pk=group_id)

    if not request.user.profile.can_manage_groups or group not in request.user.profile.can_manage_group.all():
        return HttpResponseForbidden("You do not have permission to access that.")

    if request.method == "POST":
        form = CauseForm(request.POST, instance=group)
        if form.is_valid():
            # if it was a form submission save it
            form.save()
            log_user_event(
                request.user,
                f"Edited {group.name} {config.GROUP_NAME}.",
                "admin", form)
            return HttpResponseRedirect("%s" % (reverse("manage_groups")))
        else:
            # otherwise return form with errors
            return render(request, "edit_group.html", {"form": form})

    else:
        # if it's not a form submission, return an empty form
        form = CauseForm(instance=Group.objects.get(pk=group_id))
        return render(request, "edit_group.html", {"form": form})
コード例 #4
0
    def email_profile_to(self, to_email):
        message = (f"{self.get_full_name()} has just signed up on the portal."
                   f"Their email is {self.user.email}.")
        email_vars = {
            "preheader": "",
            "title": "New member signup",
            "message": message
        }
        email_string = render_to_string("email_without_button.html", {
            "email": email_vars,
            "config": config
        })
        subject = "A new member signed up! ({})".format(self.get_full_name())

        sg = sendgrid.SendGridAPIClient(config.SENDGRID_API_KEY)

        from_email = From(config.EMAIL_DEFAULT_FROM)
        to_email = To(to_email)
        content = Content("text/html", email_string)
        mail = Mail(from_email, to_email, subject, content)
        response = sg.send(mail)

        if response.status_code == 202:
            log_user_event(
                self.user,
                "Sent email with subject: " + subject,
                "email",
                "Email content: " + email_string,
            )
            return True
コード例 #5
0
ファイル: emailhelpers.py プロジェクト: pbgben/MemberMatters
def send_single_email(user, email, subject, title, message):
    message = escape(message)
    message = message.replace("~br~", "<br>")
    email_vars = {"preheader": "", "title": title, "message": message}
    email_string = render_to_string("email_without_button.html", {
        "email": email_vars,
        "config": config
    })

    if "PORTAL_SENDGRID_API_KEY" in os.environ:
        sg = sendgrid.SendGridAPIClient(
            os.environ.get("PORTAL_SENDGRID_API_KEY"))
        from_email = From(config.EMAIL_DEFAULT_FROM)
        to_email = To(email)
        subject = subject
        content = Content("text/html", email_string)
        mail = Mail(from_email, to_email, subject, content)
        response = sg.send(mail)

        if response.status_code == 202:
            log_user_event(user, "Sent email with subject: " + subject,
                           "email", "Email content: " + message)
            return True
        else:
            return False

    log_user_event(user, "Failed to send email with subject: " + subject,
                   "email", "Email content: " + message)
    raise RuntimeError("No SendGrid API key found in environment variables.")
コード例 #6
0
def edit_profile(request):
    """
    The edit user profile view.
    :param request:
    :return:
    """

    if request.method == "POST":
        user_form = EditUserForm(request.POST, instance=request.user)
        profile_form = EditProfileForm(
            request.POST, instance=request.user.profile)

        if user_form.is_valid() and profile_form.is_valid():
            # if it was a form submission save it
            user_form.save()
            profile_form.save()
            if request.user.profile.must_update_profile:
                request.user.profile.must_update_profile = False
                request.user.profile.save()
            log_user_event(request.user, "User profile edited.", "profile")
            return HttpResponseRedirect("%s" % (reverse("profile")))

    else:
        # if it's not a form submission, return an empty form
        user_form = EditUserForm(instance=request.user)
        profile_form = EditProfileForm(instance=request.user.profile)

    return render(
        request, "edit_profile.html",
        {"user_form": user_form, "profile_form": profile_form})
コード例 #7
0
def send_single_email(
    user: object,
    email: object,
    subject: object,
    title: object,
    message: object,
) -> object:
    message = escape(message)
    message = message.replace("~br~", "<br>")
    email_vars = {"preheader": "", "title": title, "message": message}
    email_string = render_to_string(
        "email_without_button.html", {"email": email_vars, "config": config}
    )

    postmark = PostmarkClient(server_token=config.POSTMARK_API_KEY)
    postmark.emails.send(
        From=config.EMAIL_DEFAULT_FROM, To=email, Subject=subject, HtmlBody=email_string
    )

    log_user_event(
        user,
        "Sent email with subject: " + subject,
        "email",
        "Email content: " + message,
    )
    return True
コード例 #8
0
def admin_add_memberbucks(request, member_id, amount):
    if not request.user.profile.can_see_members_memberbucks:
        return HttpResponseForbidden(permission_message)

    if request.method == "GET":
        user = User.objects.get(pk=member_id)

        # Convert from cents
        amount = round(amount / 100, 2)

        if amount > 50:
            return HttpResponseBadRequest("Invalid amount.")

        transaction = MemberBucks()
        transaction.amount = amount
        transaction.user = user
        transaction.description = "Manually added by administrator."
        transaction.transaction_type = "bank"
        transaction.logging_info = ""
        transaction.save()
        log_user_event(request.user, "Manually added ${} to {}.".format(amount, user.profile.get_full_name()),
                       "memberbucks")
        log_user_event(user, "{} manually added ${} to {}.".format(request.user.profile.get_full_name(), amount,
                                                                   user.profile.get_full_name()), "stripe")

        return JsonResponse({"success": True})

    else:
        return HttpResponseBadRequest("Invalid request method.")
コード例 #9
0
def reboot_door(request, door_id):
    if not request.user.profile.can_manage_doors:
        return HttpResponseForbidden("You do not have permission to access that.")

    door = Doors.objects.get(pk=door_id)
    log_user_event(
        request.user, "Rebooted {} door via API.".format(door.name), "interlock"
    )
    return JsonResponse({"success": door.reboot()})
コード例 #10
0
def resend_welcome_email(request, member_id):
    success = User.objects.get(pk=member_id).email_welcome()
    log_user_event(request.user, "Resent welcome email.", "profile")

    if success:
        return JsonResponse({"message": success})

    else:
        return JsonResponse(
            {"message": "Couldn't email member, unknown error."})
コード例 #11
0
    def reset_password(self):
        log_user_event(self, "Password reset requested", "profile")
        self.password_reset_key = uuid.uuid4()
        self.password_reset_expire = timezone.now() + timedelta(hours=24)
        self.save()
        self.email_password_reset(
            f"{config.SITE_URL}/profile/password/reset/{self.password_reset_key}"
        )

        return True
コード例 #12
0
def delete_group(request, group_id):
    group = get_object_or_404(Group, pk=group_id)

    if not request.user.profile.can_manage_groups or group not in request.user.profile.can_manage_group.all():
        return HttpResponseForbidden("You do not have permission to access that.")

    group.delete()
    log_user_event(request.user, "Deleted {} group.".format(group.name), "admin")

    return HttpResponseRedirect(reverse("manage_groups"))
コード例 #13
0
def sync_xero_accounts(request):
    from .xerohelpers import sync_xero_accounts
    success = sync_xero_accounts(User.objects.all().prefetch_related())
    log_user_event(request.user, "Resynced xero accounts.", "profile")

    if success:
        return JsonResponse({"message": success})

    else:
        return JsonResponse(
            {"message": "Couldn't sync xero accounts, unknown error."})
コード例 #14
0
def change_password(request):
    if request.method == "POST":
        form = PasswordChangeForm(request.user, request.POST)
        if form.is_valid():
            user = form.save()
            update_session_auth_hash(request, user)
            log_user_event(request.user, "User password changed.", "profile")
            return redirect("profile")
        else:
            return render(request, "change_password.html", {"form": form})
    else:
        form = PasswordChangeForm(request.user)

    return render(request, "change_password.html", {"form": form})
コード例 #15
0
def bump_door(request, door_id):
    if not request.user.profile.can_manage_doors:
        return HttpResponseForbidden("You do not have permission to access that.")

    door = Doors.objects.get(pk=door_id)
    if door in request.user.profile.doors.all():
        log_user_event(
            request.user, "Bumped {} door via API.".format(door.name), "door"
        )
        return JsonResponse({"success": door.unlock()})

    return JsonResponse(
        {"success": False, "message": "You are not authorised to access that door."}
    )
コード例 #16
0
 def __send_email(self, subject, body):
     postmark = PostmarkClient(server_token=config.POSTMARK_API_KEY)
     postmark.emails.send(
         From=config.EMAIL_DEFAULT_FROM,
         To=self.email,
         Subject=subject,
         HtmlBody=body,
     )
     log_user_event(
         self,
         "Sent email with subject: " + subject,
         "email",
         "Email content: " + body,
     )
     return True
コード例 #17
0
def send_group_email(user, emails, subject, title, message):
    message = escape(message)
    message = message.replace("~br~", "<br>")
    email_vars = {"preheader": "", "title": title, "message": message}
    email_string = render_to_string("email_without_button.html", {
        "email": email_vars,
        "config": config
    })
    emails.append(config.EMAIL_ADMIN)
    mail = Mail()

    for to_email in emails:
        print(to_email)
        # Create new instance for each email
        personalization = Personalization()
        # Add email addresses to personalization instance
        personalization.add_to(Email(to_email))
        # Add personalization instance to Mail object
        mail.add_personalization(personalization)

    # Add data that is common to all personalizations
    mail.from_email = Email(config.EMAIL_DEFAULT_FROM)
    mail.reply_to = Email(user.email)
    mail.subject = subject
    mail.add_content(Content("text/html", email_string))

    # Send
    sg = sendgrid.SendGridAPIClient(config.SENDGRID_API_KEY)
    response = sg.send(mail)

    if response.status_code == 202:
        log_user_event(
            user,
            "Sent email with subject: " + subject,
            "email",
            "Email content: " + email_string,
        )
        return True
    else:
        log_user_event(
            user,
            "Failed to send email with subject: " + subject,
            "email",
            "Email content: " + email_string,
        )
        return False
コード例 #18
0
    def __send_email(self, subject, body):
        sg = sendgrid.SendGridAPIClient(config.SENDGRID_API_KEY)
        from_email = From(config.EMAIL_DEFAULT_FROM)
        to_email = To(self.email)
        subject = subject
        content = Content("text/html", body)
        mail = Mail(from_email, to_email, subject, content)
        response = sg.send(mail)

        if response.status_code == 202:
            log_user_event(
                self,
                "Sent email with subject: " + subject,
                "email",
                "Email content: " + body,
            )
            return True
コード例 #19
0
    def deactivate(self, request=None):
        if request:
            log_user_event(
                self.user,
                request.user.profile.get_full_name() + " deactivated member",
                "profile",
            )
        else:
            log_user_event(
                self.user,
                "system deactivated member",
                "profile",
            )

        self.user.email_disable_member()
        self.state = "inactive"
        self.save()
        return True
コード例 #20
0
def edit_theme_song(request):
    if request.method == "POST":
        theme_form = ThemeForm(request.POST, request.FILES,
                               instance=request.user.profile)

        if theme_form.is_valid():
            # todo: pass the uploaded file (or removal request) to asterisk
            # handle_uploaded_file(request.FILES["theme"])
            theme_form.save()
            log_user_event(request.user, "User theme updated.", "profile")
            return HttpResponseRedirect("%s" % (reverse("edit_theme_song")))

    else:
        # if it"'s not a form submission, return an empty form
        theme_form = ThemeForm(instance=request.user.profile)

    return render(
        request, "edit_theme_song.html",
        {"theme_form": theme_form}, )
コード例 #21
0
    def email_profile_to(self, to_email):
        groups = self.groups.all()
        groups_string = "none :("

        if groups.count() == 3:
            groups_string = "{}, {} and {}".format(groups[0], groups[1],
                                                   groups[2])
        elif groups.count() == 2:
            groups_string = "{} and {}".format(groups[0], groups[1])
        elif groups.count() == 1:
            groups_string = groups[0]

        message = (
            f"{self.get_full_name()} has just signed up. Their membership level is {self.member_type} and their selected {config.GROUP_NAME} are {groups_string}. "
            f"Their email is {self.user.email}.")
        email_vars = {
            "preheader": "",
            "title": "New member signup",
            "message": message
        }
        email_string = render_to_string("email_without_button.html", {
            "email": email_vars,
            "config": config
        })
        subject = "A new member signed up! ({})".format(self.get_full_name())

        sg = sendgrid.SendGridAPIClient(config.SENDGRID_API_KEY)

        from_email = From(config.EMAIL_DEFAULT_FROM)
        to_email = To(to_email)
        content = Content("text/html", email_string)
        mail = Mail(from_email, to_email, subject, content)
        response = sg.send(mail)

        if response.status_code == 202:
            log_user_event(
                self.user,
                "Sent email with subject: " + subject,
                "email",
                "Email content: " + email_string,
            )
            return True
コード例 #22
0
    def activate(self, request=None):
        if request:
            log_user_event(
                self.user,
                request.user.profile.get_full_name() + " activated member",
                "profile",
            )
        else:
            log_user_event(
                self.user,
                "system activated member",
                "profile",
            )

        if self.state != "noob":
            self.user.email_enable_member()

        self.state = "active"
        self.save()
        return True
コード例 #23
0
def manage_groups(request):
    if not request.user.profile.can_manage_groups:
        return HttpResponseForbidden("You do not have permission to access that.")

    # if we want to add a group
    if request.method == "POST":
        form = CauseForm(request.POST)
        if form.is_valid():
            form.save()
            log_user_event(
                request.user,
                f"Created {form.cleaned_data.get('name')} {config.GROUP_NAME}.",
                "admin", form)
            return HttpResponseRedirect(reverse("manage_groups"))

    else:
        form = CauseForm()

    groups = Group.objects.all()

    return render(request, "manage_groups.html", {"form": form, "groups": groups})
コード例 #24
0
def admin_edit_member(request, member_id):
    """
    Part of the process for our ajax requests for the member list.
    :param request:
    :param member_id:
    :return:
    """
    if not request.user.profile.can_see_members_personal_details:
        return HttpResponseForbidden(permission_message)
    profile = get_object_or_404(Profile, user=member_id)
    data = dict()

    profile_form = AdminEditProfileForm(instance=profile)
    user_form = AdminEditUserForm(instance=profile.user)
    form_valid = False

    if request.method == "POST":
        # if it's a form submission pass it to the form
        profile_form = AdminEditProfileForm(request.POST, instance=profile)
        user_form = AdminEditUserForm(request.POST, instance=profile.user)

        if profile_form.is_valid() and user_form.is_valid():
            # if it's a valid form submission then save and log it
            try:
                profile_form.save()
                user_form.save()
                form_valid = True
                log_user_event(profile.user, request.user.profile.get_full_name() + " edited user profile.", "profile")

            except IntegrityError:
                form_valid = False

    # render the form and return it
    data["form_is_valid"] = form_valid
    data["html_form"] = render_to_string(
        "partial_admin_edit_member.html",
        {"profile_form": profile_form, "user_form": user_form,
         "member_id": member_id, "profile": profile, "config": config}, request=request)
    return JsonResponse(data)
コード例 #25
0
def send_single_email(
    user: object,
    email: object,
    subject: object,
    title: object,
    message: object,
    from_user=False,
) -> object:
    message = escape(message)
    message = message.replace("~br~", "<br>")
    email_vars = {"preheader": "", "title": title, "message": message}
    email_string = render_to_string("email_without_button.html", {
        "email": email_vars,
        "config": config
    })

    sg = sendgrid.SendGridAPIClient(config.SENDGRID_API_KEY)
    from_email = From(config.EMAIL_DEFAULT_FROM)
    to_email = To(email)
    subject = subject
    content = Content("text/html", email_string)
    mail = Mail(from_email, to_email, subject, content)

    if from_user:
        mail.reply_to = ReplyTo(user.email, user.profile.get_full_name())

    response = sg.send(mail)

    if response.status_code == 202:
        log_user_event(
            user,
            "Sent email with subject: " + subject,
            "email",
            "Email content: " + message,
        )
        return True
    else:
        return False
コード例 #26
0
ファイル: views.py プロジェクト: kodaxx/MemberMatters
    def get(self, request):
        profile = request.user.profile

        if not profile.stripe_customer_id:
            try:
                log_user_event(request.user,
                               "Attempting to create stripe customer.",
                               "stripe")
                customer = stripe.Customer.create(
                    email=request.user.email,
                    name=profile.get_full_name(),
                    phone=profile.phone,
                )

                profile.stripe_customer_id = customer.id
                profile.save()

                log_user_event(
                    request.user,
                    f"Created stripe customer {request.user.profile.get_full_name()} (Stripe ID: {customer.id}).",
                    "stripe",
                )

                intent = stripe.SetupIntent.create(
                    customer=profile.stripe_customer_id)

                return Response({"clientSecret": intent.client_secret})

            except stripe.error.StripeError as e:
                log_user_event(
                    request.user,
                    "Unknown stripe while saving payment details.",
                    "stripe",
                    request,
                )

                return Response(
                    {
                        "success": False,
                        "message": str(e),
                    },
                    status=status.HTTP_503_SERVICE_UNAVAILABLE,
                )

            except Exception as e:
                log_user_event(
                    request.user,
                    "Unknown other error while saving payment details.",
                    "stripe",
                    request,
                )
                return Response(
                    {
                        "success": False,
                        "message": "Unknown error (unrelated to stripe).",
                    },
                    status=status.HTTP_503_SERVICE_UNAVAILABLE,
                )

        else:
            intent = stripe.SetupIntent.create(
                customer=profile.stripe_customer_id)

            return Response({"clientSecret": intent.client_secret})
コード例 #27
0
def add_memberbucks(request, amount=None):
    if request.method == "GET":
        if "PORTAL_STRIPE_SECRET_KEY" in os.environ:
            stripe.api_key = os.environ["PORTAL_STRIPE_SECRET_KEY"]
            stripe.default_http_client = stripe.http_client.RequestsClient()
        else:
            return HttpResponseServerError("No stripe API details found.")

        if amount is not None:
            # lets restrict this to something reasonable
            if amount <= 30:
                log_user_event(
                    request.user, "Attempting to charge {} for ${}.".format(
                        request.user.profile.get_full_name(), amount),
                    "stripe")
                charge = stripe.Charge.create(
                    amount=amount * 100,  # convert to cents,
                    currency="aud",
                    description=
                    f"{config.MEMBERBUCKS_NAME} ({request.user.profile.get_full_name()})",
                    customer=request.user.profile.stripe_customer_id,
                    metadata={
                        "Payment By": request.user.profile.get_full_name(),
                        "For": f"{config.MEMBERBUCKS_NAME} Top Up"
                    },
                )

                if charge.paid:
                    transaction = MemberBucks()
                    transaction.amount = amount
                    transaction.user = request.user
                    transaction.description = f"Added {config.MEMBERBUCKS_NAME} via Stripe"
                    transaction.transaction_type = "stripe"
                    transaction.logging_info = charge
                    transaction.save()
                    log_user_event(
                        request.user,
                        "Successfully charged {} for ${}.".format(
                            request.user.profile.get_full_name(),
                            amount), "stripe")
                    subject = f"You just added {config.MEMBERBUCKS_NAME} to your {config.SITE_OWNER} account."
                    request.user.email_notification(
                        subject, subject, subject,
                        f"We just charged you card for ${amount} and "
                        f"added this to your {config.MEMBERBUCKS_NAME} balance."
                        "If this wasn't you, please let us know "
                        "immediately.")

                    return JsonResponse({"success": True})
                else:
                    log_user_event(
                        request.user, "Problem charging {}.".format(
                            request.user.profile.get_full_name()), "stripe")
                    subject = f"Failed to add {config.MEMBERBUCKS_NAME} to your {config.SITE_OWNER} account."
                    request.user.email_notification(
                        subject, subject, subject,
                        "We just tried to charge your card for"
                        f"${amount} for {config.MEMBERBUCKS_NAME} but were not "
                        "successful. If this wasn't you, please "
                        "let us know immediately.")
                    return JsonResponse({"success": False})
            else:
                log_user_event(
                    request.user,
                    f"Tried to add invalid amount {amount} to {config.MEMBERBUCKS_NAME} via stripe.",
                    "stripe")

        return render(
            request, "add_memberbucks.html", {
                "PORTAL_STRIPE_PUBLIC_KEY":
                os.environ["PORTAL_STRIPE_PUBLIC_KEY"],
                "success": False,
                "message": "Invalid amount."
            })
    else:
        return HttpResponseBadRequest("Invalid method")
コード例 #28
0
def memberbucks_debit(request,
                      amount=None,
                      description="No Description",
                      rfid=None):
    if amount is not None:
        if abs(amount / 100) > 10:
            return HttpResponseBadRequest(
                "400 Invalid request. A maximum of $10 may be debited with this API."
            )

    if request.method == "GET":
        if amount is None or rfid is None:
            return HttpResponseBadRequest("400 Invalid request.")

        amount = abs(amount / 100)
        try:
            profile = Profile.objects.get(rfid=rfid)

        except ObjectDoesNotExist:
            return HttpResponseBadRequest(
                "400 Invalid request. User does not exist.")

    elif request.method == "POST":
        details = json.loads(request.body)
        amount = abs(
            details["amount"] / 100
        )  # the abs() stops us accidentally crediting an account if it's negative
        description = details["description"]
        profile = Profile.objects.get(rfid=details["rfid_code"])

    else:
        return HttpResponseBadRequest("400 Invalid request method.")

    if profile.memberbucks_balance >= amount:
        time_dif = (timezone.now() -
                    profile.last_memberbucks_purchase).total_seconds()
        print(time_dif)

        if time_dif > 5:
            transaction = MemberBucks()
            transaction.amount = amount * -1.0
            transaction.user = profile.user
            transaction.description = description.replace("+", " ")
            transaction.transaction_type = "card"
            transaction.save()

            profile.last_memberbucks_purchase = timezone.now()
            profile.save()

            subject = f"You just made a ${amount} {config.MEMBERBUCKS_NAME} purchase."
            message = "Description: {}. Balance Remaining: ${}. If this wasn't you, or you believe there has been an " \
                      "error, please let us know.".format(transaction.description, profile.memberbucks_balance)
            User.objects.get(profile=profile).email_notification(
                subject, subject, subject, message)

            log_user_event(
                profile.user,
                f"Successfully debited ${amount} from {config.MEMBERBUCKS_NAME} account.",
                "memberbucks")

            return JsonResponse({
                "success":
                True,
                "balance":
                round(profile.memberbucks_balance, 2)
            })

        else:
            return JsonResponse({
                "success":
                False,
                "balance":
                round(profile.memberbucks_balance, 2),
                "message":
                "Whoa! Not so fast!!"
            })

    # not enough $$
    log_user_event(
        profile.user,
        f"Not enough funds to debit ${amount} from {config.MEMBERBUCKS_NAME} account.",
        "memberbucks")
    subject = f"Failed to make a ${amount} {config.MEMBERBUCKS_NAME} purchase."
    User.objects.get(profile=profile).email_notification(
        subject, subject, subject,
        f"We just tried to debit ${amount} from your {config.MEMBERBUCKS_NAME} balance but were not successful. "
        f"You currently have ${profile.memberbucks_balance}. If this wasn't you, please let us know "
        "immediately.")

    return JsonResponse({
        "success": False,
        "balance": round(profile.memberbucks_balance, 2)
    })
コード例 #29
0
ファイル: views.py プロジェクト: snoopen/MemberMatters
    def post(self, request):
        body = request.data
        title = body["title"]
        description = request.user.profile.get_full_name(
        ) + ": " + body["description"]

        if not (title and description):
            return Response(status=status.HTTP_400_BAD_REQUEST)

        use_trello = config.ENABLE_TRELLO_INTEGRATION
        trello_key = config.TRELLO_API_KEY
        trello_token = config.TRELLO_API_TOKEN
        trello_id_list = config.TRELLO_ID_LIST

        if use_trello:
            url = "https://api.trello.com/1/cards"

            querystring = {
                "name": title,
                "desc": description,
                "pos": "top",
                "idList": trello_id_list,
                "keepFromSource": "all",
                "key": trello_key,
                "token": trello_token,
            }

            response = requests.request("POST", url, params=querystring)

            if response.status_code == 200:
                log_user_event(
                    request.user,
                    "Submitted issue: " + title + " Content: " + description,
                    "generic",
                )

                return Response(
                    {
                        "success": True,
                        "url": response.json()["shortUrl"]
                    },
                    status=status.HTTP_201_CREATED,
                )

            else:
                return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)

        # if Trello isn't configured, use email instead
        else:
            subject = (
                f"{request.user.profile.get_full_name()} submitted an issue ({title})"
            )

            if send_single_email(
                    request.user,
                    config.EMAIL_ADMIN,
                    subject,
                    subject,
                    description,
                    from_user=True,
            ):
                return Response(
                    {"success": True},
                    status=status.HTTP_201_CREATED,
                )

            else:
                return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)
コード例 #30
0
def add_memberbucks_payment_info(request):
    if request.method == "POST":
        if "PORTAL_STRIPE_SECRET_KEY" in os.environ:
            stripe.api_key = os.environ["PORTAL_STRIPE_SECRET_KEY"]
            stripe.default_http_client = stripe.http_client.RequestsClient()

        else:
            return HttpResponseServerError("Can't find stripe API details.")

        try:
            log_user_event(request.user,
                           "Attempting to create stripe customer.", "stripe")
            customer = stripe.Customer.create(
                source=request.POST.get("stripeToken"),
                email=request.POST.get("stripeEmail"),
            )

            profile = request.user.profile
            profile.stripe_customer_id = customer.id
            profile.stripe_card_expiry = str(
                customer.sources.data[0]["exp_month"]) + "/" + str(
                    customer.sources.data[0]["exp_year"])
            profile.stripe_card_last_digits = customer.sources.data[0]["last4"]
            profile.save()
            log_user_event(
                request.user, "Created stripe customer.".format(
                    request.user.profile.get_full_name()), "stripe")

            subject = f"You just added a payment card to your {config.SITE_OWNER} account."
            request.user.email_notification(
                subject, subject, subject,
                "Don't worry, your card details are stored safe "
                "with Stripe and are not on our servers. You "
                "can remove this card at any time via the "
                f"{config.SITE_NAME}.")

        except stripe.error.CardError as e:
            # Since it's a decline, stripe.error.CardError will be caught
            body = e.json_body
            err = body.get("error", {})

            log_user_event(request.user,
                           "Card declined while saving payment details.",
                           "stripe")

            return render(
                request, "add_memberbucks.html", {
                    "PORTAL_STRIPE_PUBLIC_KEY":
                    os.environ["PORTAL_STRIPE_PUBLIC_KEY"],
                    "success":
                    False,
                    "message":
                    err
                })

        except stripe.error.RateLimitError as e:
            log_user_event(request.user,
                           "Rate limtied while saving payment details.",
                           "stripe")
            return render(
                request, "add_memberbucks.html", {
                    "PORTAL_STRIPE_PUBLIC_KEY":
                    os.environ["PORTAL_STRIPE_PUBLIC_KEY"],
                    "success":
                    False,
                    "message":
                    "Our server is talking to stripe too quickly, try again later."
                })

        except stripe.error.InvalidRequestError as e:
            log_user_event(request.user,
                           "Invalid request while saving payment details.",
                           "stripe", request)
            return render(
                request, "add_memberbucks.html", {
                    "PORTAL_STRIPE_PUBLIC_KEY":
                    os.environ["PORTAL_STRIPE_PUBLIC_KEY"],
                    "success":
                    False,
                    "message":
                    "There was an error with the request details."
                })

        except stripe.error.AuthenticationError as e:
            log_user_event(
                request.user,
                "Can't authenticate with stripe while saving payment details.",
                "stripe")
            return render(
                request, "add_memberbucks.html", {
                    "PORTAL_STRIPE_PUBLIC_KEY":
                    os.environ["PORTAL_STRIPE_PUBLIC_KEY"],
                    "success":
                    False,
                    "message":
                    "Our server was unable to authenticate with the Stripe server."
                })

        except stripe.error.APIConnectionError as e:
            log_user_event(
                request.user,
                "Stripe API connection error while saving payment details.",
                "stripe")
            return render(
                request, "add_memberbucks.html", {
                    "PORTAL_STRIPE_PUBLIC_KEY":
                    os.environ["PORTAL_STRIPE_PUBLIC_KEY"],
                    "success":
                    False,
                    "message":
                    "Our server was unable to communicate with the Stripe server."
                })

        except stripe.error.StripeError as e:
            log_user_event(request.user,
                           "Unkown stripe while saving payment details.",
                           "stripe", request)
            return render(
                request, "add_memberbucks.html", {
                    "PORTAL_STRIPE_PUBLIC_KEY":
                    os.environ["PORTAL_STRIPE_PUBLIC_KEY"],
                    "success":
                    False,
                    "message":
                    e
                })

        except Exception as e:
            log_user_event(request.user,
                           "Unkown other error while saving payment details.",
                           "stripe", request)
            return render(
                request, "add_memberbucks.html", {
                    "PORTAL_STRIPE_PUBLIC_KEY":
                    os.environ["PORTAL_STRIPE_PUBLIC_KEY"],
                    "success":
                    False,
                    "message":
                    "Unkown error (unrelated to stripe)."
                })

        log_user_event(request.user, "Successfully saved payment details.",
                       "stripe")
        return render(
            request, "add_memberbucks.html", {
                "PORTAL_STRIPE_PUBLIC_KEY":
                os.environ["PORTAL_STRIPE_PUBLIC_KEY"],
                "success": True,
                "message": "Your payment details were successfully saved."
            })

    else:
        return redirect(reverse("add_memberbucks"))