123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551 |
- import json
- from django.core.mail import send_mail
- import locale
- import logging
- from django.contrib.auth import login
- from django.core.serializers.json import DjangoJSONEncoder
- from django.core.urlresolvers import reverse
- from django.conf import settings
- from django.forms import model_to_dict
- from django.http import HttpResponseRedirect, HttpResponse
- from django.shortcuts import render_to_response, get_object_or_404
- from django.template import RequestContext
- from accounts.forms import (
- ProfileSecondaryAddressForm,
- ProfileUpdateForm,
- ProfileCreateForm,
- )
- from accounts.profile import get_profile, get_profile_secondary_address
- from accounts import utils as account_utils
- from cart.cart import add_to_cart, remove_subscriptions
- from catalog import models as catalog_models
- from catalog.models import Subscription
- from catalog.utils import get_type_by_profile, get_type
- from . import constants
- from . import forms
- from . import utils
- LOG = logging.getLogger(__name__)
- STOREFRONT_HELP_TO = getattr(settings, "STOREFRONT_HELP_TO")
- def storefront_help(request):
- """ Store Help """
- form = forms.HelpForm(request.POST or None)
- if request.method == "POST":
- if form.is_valid():
- message = "".join(
- [
- "{0}: {1}\n".format(key, value)
- for key, value in form.cleaned_data.iteritems()
- ]
- )
- LOG.info(
- "Help Form Contents (Sending To: {0}): {1}".format(
- STOREFRONT_HELP_TO, message
- )
- )
- send_mail(
- "PBP Community Storefront Feedback",
- message,
- "subscriptions@pbp.me",
- [STOREFRONT_HELP_TO],
- fail_silently=True,
- )
- return HttpResponseRedirect(reverse("help_confirm"))
- return render_to_response(
- "storefront/help.html", {"form": form}, context_instance=RequestContext(request)
- )
- def storefront_help_confirm(request):
- """ Store Help Confirmation Page"""
- return render_to_response(
- "storefront/help_confirm.html", context_instance=RequestContext(request)
- )
- def storefront_privacy(request):
- """ Store Help """
- return render_to_response(
- "storefront/privacy.html", context_instance=RequestContext(request)
- )
- def storefront_index(request):
- """ Store Front Home page """
- return render_to_response(
- "storefront/index.html", context_instance=RequestContext(request)
- )
- def category(request, category):
- """ Category page """
- # TODO: security, etc
- # TODO: sorting by price, or title.
- config = {
- "movie": catalog_models.Movie,
- "book": catalog_models.Book,
- "map": catalog_models.Map,
- }
- sort_type = {"p": "price", "-p": "-price", "t": "title", "-t": "-title"}
- sort = request.GET.get("sort", "t")
- sort_by = sort_type.get(sort)
- model = config.get(category)
- # sort by title or price, asc or desc default to title asc
- items = model.objects.active().order_by(sort_by)
- return render_to_response(
- "storefront/category.html",
- {"items": items, "category": category, "sort_by": sort_by},
- context_instance=RequestContext(request),
- )
- def item_price(request):
- """ Ajax call to return the item price """
- def _currency(value):
- """ convert value to a nice looking currency """
- try:
- locale.setlocale(locale.LC_ALL, "en_US.UTF-8")
- except Exception:
- locale.setlocale(locale.LC_ALL, "")
- loc = locale.localeconv()
- return locale.currency(value, loc["currency_symbol"], grouping=True)
- response_data = "$N/A"
- if request.method == "POST":
- try:
- LOG.debug("Post info: {0}".format(request.POST))
- # use the form data to determine the shipping_type
- region1 = request.POST.get("region1", None)
- postal_code1 = request.POST.get("postal_code1", None)
- country_code1 = request.POST.get("country_code1", None)
- region2 = request.POST.get("region2", None)
- postal_code2 = request.POST.get("postal_code2", None)
- country_code2 = request.POST.get("country_code2", None)
- shipping_type = get_type(
- postal_code1,
- region1,
- country_code1,
- postal_code2=postal_code2,
- region2=region2,
- country_code2=country_code2,
- )
- LOG.debug("Found shipping type as: {0}".format(shipping_type))
- # Recast the id values to searchable values
- title = request.POST.get("title", None)
- duration = request.POST.get("duration", None)
- shipping_method = request.POST.get("shipping_method", None)
- title = utils.get_value_by_index(utils.unique_titles(shipping_type), title)
- duration = utils.get_value_by_index(
- utils.unique_durations(shipping_type), duration
- )
- shipping_method = utils.get_value_by_index(
- utils.unique_shipping_methods(), shipping_method
- )
- LOG.debug(
- "{0}, {1}, {2}, {3}".format(
- title, duration, shipping_method, shipping_type
- )
- )
- try:
- # Renewals are the same price as regular. This might
- # need to change if that changes
- subscription = Subscription.objects.get(
- title=title,
- duration=duration,
- shipping_type=shipping_type,
- shipping_method=shipping_method,
- renewal=False,
- )
- response_data = _currency(subscription.price)
- except Subscription.DoesNotExist:
- pass
- except Exception, e:
- LOG.error(e)
- raise e
- return HttpResponse(
- json.dumps(response_data, cls=DjangoJSONEncoder),
- content_type="application/json",
- )
- def item_detail(request, sku):
- item = get_object_or_404(catalog_models.Item, sku=sku).child
- return render_to_response(
- "storefront/item_detail.html",
- {"item": item},
- context_instance=RequestContext(request),
- )
- def subscription_home(request):
- """ Subscription Home page """
- return render_to_response(
- "storefront/subscriptions_home.html", context_instance=RequestContext(request)
- )
- def choose_new_subscription(request, template="storefront/subscriptions_new.html"):
- """ View used to manage a new subscription """
- def _render(request, form, user_form, second_address_form, shipping_type):
- return render_to_response(
- template,
- {
- "form": form,
- "userform": user_form,
- "second_address": second_address_form,
- "type": shipping_type,
- },
- context_instance=RequestContext(request),
- )
- # set some sane defaults
- user = request.user
- subscription_initial = {"duration": 1}
- primary_initial = {"region": "ME", "country": "US"}
- secondary_initial = {}
- shipping_type = get_type(None, "ME", "US")
- if user.is_authenticated():
- profile = get_profile(user)
- secondary_address = get_profile_secondary_address(user)
- shipping_type = get_type_by_profile(profile)
- primary_initial = model_to_dict(user)
- primary_initial.update(model_to_dict(profile))
- secondary_initial = model_to_dict(secondary_address)
- user_form = ProfileUpdateForm(
- user, request.POST or None, initial=primary_initial, prefix="form2"
- )
- else:
- user_form = ProfileCreateForm(
- request.POST or None, initial=primary_initial, prefix="form2"
- )
- form = forms.SubscriptionForm(
- request.POST or None,
- initial=subscription_initial,
- shipping_type=shipping_type,
- prefix="form1",
- )
- second_address_form = ProfileSecondaryAddressForm(
- request.POST or None, initial=secondary_initial, prefix="form3"
- )
- if (
- request.method == "POST"
- and user_form.is_valid()
- and second_address_form.is_valid()
- ):
- # we've called is_valid for both the profile and address forms
- shipping_type = get_type(
- user_form.cleaned_data.get("postal_code", None),
- user_form.cleaned_data.get("region", None),
- user_form.cleaned_data.get("country", None),
- postal_code2=second_address_form.cleaned_data.get("postal_code", None),
- region2=second_address_form.cleaned_data.get("region", None),
- country_code2=second_address_form.cleaned_data.get("country", None),
- )
- form = forms.SubscriptionForm(
- request.POST or None,
- shipping_type=shipping_type,
- initial=subscription_initial,
- prefix="form1",
- )
- if form.is_valid():
- user = user_form.save(request=request)
- second_address_form.save(user=user)
- subscription = form.save()
- remove_subscriptions(request)
- add_to_cart(request, subscription, quantity=1)
- return HttpResponseRedirect(reverse("checkout"))
- return _render(request, form, user_form, second_address_form, shipping_type)
- def choose_gift_subscription(
- request, template="storefront/subscriptions_gift_subs.html"
- ):
- def render(subscription_form, gift_from_form, gift_to_form, gift_info_form):
- return render_to_response(
- template,
- {
- "form": subscription_form,
- "gift_from": gift_from_form,
- "gift_to": gift_to_form,
- "gift_info_form": gift_info_form,
- },
- context_instance=RequestContext(request),
- )
- # set some sane defaults
- shipping_type = get_type(None, "ME", "US")
- subscription_initial = {"duration": 1}
- gift_from_initial = {"region": "ME", "country": "US"}
- gift_to_initial = {"region": "ME", "country": "US"}
- user = request.user
- LOG.debug("Checking authentication status...")
- if user.is_authenticated():
- LOG.debug("User is authenticated...creating user specific forms.")
- gift_from_initial = model_to_dict(user)
- gift_from_initial.update(model_to_dict(user.get_profile()))
- shipping_type = get_type_by_profile(get_profile(user))
- gift_from_form = ProfileUpdateForm(
- user, request.POST or None, initial=gift_from_initial, prefix="form5"
- )
- else:
- LOG.debug("User is not authenticated...creating user creation forms.")
- gift_from_form = ProfileCreateForm(
- request.POST or None, initial=gift_from_initial, prefix="form5"
- )
- subscription_form = forms.SubscriptionForm(
- request.POST or None,
- shipping_type=shipping_type,
- initial=subscription_initial,
- prefix="form1",
- )
- gift_to_form = forms.GiftToForm(
- request.POST or None, initial=gift_to_initial, prefix="form2"
- )
- gift_info_form = forms.GiftInformationForm(request.POST or None, prefix="form4")
- if request.method == "POST" and gift_from_form.is_valid():
- LOG.debug("Processing POST data...")
- # we've called is_valid on the gift from form and since we are
- # here..it is. We intentionally have not called saved so that a user
- # isn't created yet as this would cause confusion if the other forms
- # do not validate. We need the data from the cleaned form to pass to
- # the Subscription form which will determine if the subscription type
- # is valid.
- shipping_type = get_type(
- gift_from_form.cleaned_data.get("postal_code", None),
- gift_from_form.cleaned_data.get("region", None),
- gift_from_form.cleaned_data.get("country", None),
- )
- subscription_form = forms.SubscriptionForm(
- request.POST or None,
- shipping_type=shipping_type,
- initial=subscription_initial,
- prefix="form1",
- )
- LOG.debug("Checking validity of forms....")
- if (
- gift_to_form.is_valid()
- and subscription_form.is_valid()
- and gift_info_form.is_valid()
- and gift_from_form.is_valid()
- ):
- LOG.debug("Forms are valid...processing.")
- gift_from_form.save(request=request)
- subscription = subscription_form.save()
- gift_to_form.save()
- gift_detail = gift_to_form.cleaned_data or {}
- gift_detail.update(gift_info_form.cleaned_data)
- remove_subscriptions(request)
- add_to_cart(request, subscription, gift_detail=gift_detail, quantity=1)
- return HttpResponseRedirect(reverse("checkout"))
- else:
- LOG.debug("Forms are not valid.")
- LOG.debug("subscription_form: {0}".format(subscription_form))
- LOG.debug("gift_from_form: {0}".format(gift_from_form))
- LOG.debug("gift_to_form: {0}".format(gift_to_form))
- LOG.debug("gift_info_form: {0}".format(gift_info_form))
- return render(subscription_form, gift_from_form, gift_to_form, gift_info_form)
- def change_of_address(request, template="storefront/subscriptions_change_address.html"):
- """ Submits a change of address form. If the user is not logged in, it
- also creates a new user account.
- """
- # set some sane defaults
- user = request.user
- primary_initial = {"region": "ME", "country": "US"}
- old_address_initial = {"region": "ME", "country": "US"}
- form = forms.ChangeOfAddressForm(
- request.POST or None, initial={"date_effective": constants.NEXT_ISSUE}
- )
- if user.is_authenticated():
- profile = get_profile(user)
- old_address_initial = model_to_dict(user)
- old_address_initial.update(model_to_dict(profile))
- old_address = forms.AddressForm(
- request.POST or None, initial=old_address_initial, prefix="form5"
- )
- new_address = ProfileUpdateForm(
- user, request.POST or None, initial=primary_initial, prefix="form2"
- )
- else:
- old_address = forms.AddressForm(
- request.POST or None, initial=old_address_initial, prefix="form5"
- )
- new_address = ProfileCreateForm(
- request.POST or None, initial=primary_initial, prefix="form2"
- )
- if request.method == "POST":
- if form.is_valid() and old_address.is_valid() and new_address.is_valid():
- new_address.save(request=request)
- # recast the title index from the form to the
- # actual title
- raw_title = form.cleaned_data.get("title", None)
- title = utils.get_value_by_index(utils.unique_titles(), raw_title)
- old_address_initial.update(old_address.cleaned_data)
- account_utils.send_change_of_address_email(
- title,
- form.cleaned_data.get("account_number", None),
- form.cleaned_data.get("date_effective", None),
- form.cleaned_data.get("from_date", None),
- form.cleaned_data.get("to_date", None),
- old_address_initial,
- new_address.cleaned_data,
- )
- return HttpResponseRedirect(
- reverse("subscriptions_address_change_complete")
- )
- return render_to_response(
- template,
- {"form": form, "old_address": old_address, "new_address": new_address},
- context_instance=RequestContext(request),
- )
- def change_of_address_complete(
- request, template="storefront/subscriptions_change_address_complete.html"
- ):
- user = request.user
- new_address_initial = model_to_dict(user)
- new_address_initial.update(model_to_dict(user.get_profile()))
- new_address = forms.AddressForm(initial=new_address_initial)
- return render_to_response(
- template, {"new_address": new_address}, context_instance=RequestContext(request)
- )
- def subscriptions_renew(request, template="storefront/subscriptions_renewals.html"):
- def _render(request, form, userform, second_address_form, shipping_type):
- return render_to_response(
- template,
- {
- "form": form,
- "userform": userform,
- "second_address": second_address_form,
- "type": shipping_type,
- },
- context_instance=RequestContext(request),
- )
- # set some sane defaults
- user = request.user
- subscription_initial = {"duration": 1}
- primary_initial = {"region": "ME", "country": "US"}
- secondary_initial = {}
- shipping_type = get_type(None, "ME", "US")
- if user.is_authenticated():
- profile = get_profile(user)
- secondary_address = get_profile_secondary_address(user)
- shipping_type = get_type_by_profile(profile)
- primary_initial = model_to_dict(user)
- primary_initial.update(model_to_dict(profile))
- secondary_initial = model_to_dict(secondary_address)
- userform = ProfileUpdateForm(
- user, request.POST or None, initial=primary_initial, prefix="form2"
- )
- else:
- userform = ProfileCreateForm(
- request.POST or None, initial=primary_initial, prefix="form2"
- )
- subscription_form = forms.SubscriptionForm(
- request.POST or None,
- initial=subscription_initial,
- shipping_type=shipping_type,
- prefix="form1",
- use_account_number=True,
- renewal=True,
- )
- second_address_form = ProfileSecondaryAddressForm(
- request.POST or None, initial=secondary_initial, prefix="form3"
- )
- if (
- request.method == "POST"
- and userform.is_valid()
- and second_address_form.is_valid()
- ):
- # we've called is_valid for both the profile and address forms
- shipping_type = get_type(
- userform.cleaned_data.get("postal_code", None),
- userform.cleaned_data.get("region", None),
- userform.cleaned_data.get("country", None),
- postal_code2=second_address_form.cleaned_data.get("postal_code", None),
- region2=second_address_form.cleaned_data.get("region", None),
- country_code2=second_address_form.cleaned_data.get("country", None),
- )
- subscription_form = forms.SubscriptionForm(
- request.POST or None,
- shipping_type=shipping_type,
- initial=subscription_initial,
- prefix="form1",
- use_account_number=True,
- renewal=True,
- )
- if subscription_form.is_valid():
- user = userform.save(request=request)
- if not user.is_authenticated():
- login(request, user)
- second_address_form.save(user=user)
- subscription = subscription_form.save()
- account_number = subscription_form.cleaned_data["account_number"]
- remove_subscriptions(request)
- add_to_cart(
- request, subscription, account_number=account_number, quantity=1
- )
- return HttpResponseRedirect(reverse("checkout"))
- return _render(
- request, subscription_form, userform, second_address_form, shipping_type
- )
|