def my_shopping(request):
    my_cart = request.cart

    my_orders = Sell.objects.filter(shop=request.shop, bidder=request.user)

    cart_list = []
    for item in my_cart.cartitem_set.all():
        # the product could be removed by the admin
        if item.product == None:
            my_cart.remove(item)
            continue

        if item.product.type() == "Item":
            #url = reverse('bidding_view_item', args=[item.product.id])
            url_remove = reverse('remove_from_cart', args=[item.id])
        else:
            #url = reverse('bidding_view_lot', args=[item.product.id])
            url_remove = ''
        image = item.product.image()
        cart_list.append({
            'url':
            item.product.get_bidding_url(),
            'title':
            item.product.title,
            #'image': item.product.image().image.url_100x100 if item.product.image() else None,
            'price':
            money_format(item.price, request.shop),
            'qty':
            item.qty,
            'sub_total':
            money_format(item.sub_total(), request.shop),
            'can_remove': (item.product.type() == "Item"),
            'url_remove':
            url_remove,
            'image': {
                'original': image.image.url if image else None,
                'small': image.image.url_100x100 if image else None,
                'medium': image.image.url_400x400 if image else None,
            }
        })

    param = {
        'cart_items': cart_list,
        'total_cart': money_format(my_cart.total(), request.shop),
        'total': money_format(my_cart.total(), request.shop),
        'page_title': 'My Shopping',
        'page_description': 'My Shopping',
        'url_checkout': reverse('myshopping_checkout_shipping'),
        'clean_cart_url': reverse('clean_cart'),
    }

    return HttpResponse(my_render(request, param, 'my_shopping'))
Exemple #2
0
def bidding_view_history_lot(request, id):
    #TODO: filter by state lot
    #TODO: add csrf_token to form
    lot = get_object_or_404(Lot, pk=id)
    form = BidForm(lot, request.GET or None)
    if form.is_valid():
        if (not request.user.is_authenticated()
            ) or request.user.is_staff or request.user.is_superuser:
            return HttpResponseRedirect(settings.LOGIN_URL + "?next=" +
                                        request.get_full_path())
        if not (lot.is_active() and lot.shop == request.shop):
            raise Http404

        lot.bid(request.user, form.cleaned_data['amount'],
                request.META['REMOTE_ADDR'])

        request.flash['message'] = unicode(_("Bid successfully registered."))
        request.flash['severity'] = "success"
        return HttpResponseRedirect(
            reverse('bidding_view_history_lot', args=[id]))

    history = []
    for bid in lot.history():
        history.append({
            'bidder_username': bid.bidder.username,
            'bid_amount': money_format(bid.bid_amount, request.shop),
            'bid_time': date(bid.bid_time, 'r'),
        })

    t = loader.get_template('bidding/blocks/view_history_lot_description.html')
    c = RequestContext(request, {'lot': lot, 'form': form})
    block_description = (t.render(c))
    image = lot.image()
    lot_dic = {
        'count_bidders': lot.count_bidders(),
        'count_bids': lot.count_bids(),
        'time_left_long': lot.time_left_long(),
        'title': lot.title,
        'dir_back': reverse('bidding_view_lot', args=[lot.id]),
        'image': {
            'original': image.image.url if image else None,
            'small': image.image.url_100x100 if image else None,
            'medium': image.image.url_400x400 if image else None,
        }
    }

    return HttpResponse(
        my_render(
            request, {
                'history':
                history,
                'description':
                block_description,
                'page_title':
                lot.title,
                'page_description':
                '%s, %s' % (lot.title, striptags(lot.description)),
                'lot':
                lot_dic,
            }, 'view_history_lot'))
def bidding_auctions(request, session_id=None):
    if session_id:
        session = get_object_or_404(AuctionSession, pk=session_id)
        lots = Lot.objects.filter(shop=request.shop, session=session, state='A')
        session_title = session.title
    else:
        session_title = 'Highlights'
        lots = Lot.objects.filter(shop=request.shop, state='A')
        
    pager = Paginator(lots, PAGE_LOTS)  
    try:
        page = int(request.GET.get('page','1'))
    except:
        page = 1        
    try:
        lots = pager.page(page)
    except (EmptyPage, InvalidPage):
        lots = pager.page(pager.num_pages)
    paged = (pager.num_pages > 1)

    lots_list = []
    for lot in lots.object_list:
        image = lot.image()
        lots_list.append({'url': reverse('bidding_view_lot', args=[lot.id]),
                          'title': lot.title,
                          'price': money_format(lot.price(), request.shop),
                          'image': {'original': image.image.url if image else None,
                                    'small': image.image.url_100x100 if image else None,
                                    'medium': image.image.url_400x400 if image else None,
                                   } 
                         })

    sessions = AuctionSession.objects.filter(shop=request.shop, end__gte=datetime.now())
    t = loader.get_template('bidding/blocks/sessions.html')
    c = RequestContext(request, {'sessions': sessions})
    block_sessions = (t.render(c))

    t = loader.get_template('paginator.html')
    c = RequestContext(request, {'objects': lots,
                                 'pages': pager.page_range,
                                 'paged': paged,})
    paginator = (t.render(c))
    
    try:
        page = DynamicPageContent.objects.filter(shop=request.shop, page="auctions").get()
        description = striptags(page.meta_content)
    except DynamicPageContent.DoesNotExist:
        description = "No meta description found"
        
    param = {
             'lots': lots_list,
             'sessions': block_sessions,
             'session_title': session_title,    
             'paginator': paginator,
             'page_title': 'Auctions',
             'page_description': description,
             } 

    return HttpResponse(my_render(request, param, 'auctions'))
def my_shopping(request):
    my_cart = request.cart
    
    my_orders = Sell.objects.filter(shop=request.shop, bidder=request.user)
     
    cart_list = []
    for item in my_cart.cartitem_set.all():
        # the product could be removed by the admin
        if item.product == None:
            my_cart.remove(item)
            continue
        
        if item.product.type() == "Item":
            #url = reverse('bidding_view_item', args=[item.product.id])
            url_remove = reverse('remove_from_cart', args=[item.id])
        else: 
            #url = reverse('bidding_view_lot', args=[item.product.id])
            url_remove = ''
        image = item.product.image()
        cart_list.append({'url': item.product.get_bidding_url(),
                          'title': item.product.title,
                          #'image': item.product.image().image.url_100x100 if item.product.image() else None,
                          'price': money_format(item.price, request.shop),
                          'qty': item.qty,
                          'sub_total': money_format(item.sub_total(), request.shop),
                          'can_remove': (item.product.type() == "Item"),
                          'url_remove': url_remove, 
                          'image': {'original': image.image.url if image else None,
                                    'small': image.image.url_100x100 if image else None,
                                    'medium': image.image.url_400x400 if image else None,
                                   } 
                         })

    param = {
             'cart_items': cart_list,
             'total_cart': money_format(my_cart.total(), request.shop),
             'total': money_format(my_cart.total(), request.shop),
             'page_title': 'My Shopping',
             'page_description': 'My Shopping',
             'url_checkout': reverse('myshopping_checkout_shipping'),
             'clean_cart_url': reverse('clean_cart'),
             }
    
    return HttpResponse(my_render(request, param, 'my_shopping'))
Exemple #5
0
def bidding_for_sale(request):
    items_list = Item.objects.filter(shop=request.shop, qty__gte=0, show=True)
    shop_categories = request.shop.categories_list()
    shop_subcategories = request.shop.sub_categories_list()

    pager = Paginator(items_list, PAGE_LOTS)
    try:
        page = int(request.GET.get('page', '1'))
    except:
        page = 1
    try:
        items = pager.page(page)
    except (EmptyPage, InvalidPage):
        items = pager.page(pager.num_pages)
    paged = (pager.num_pages > 1)

    items_list = []
    for item in items.object_list:
        image = item.image()
        items_list.append({
            'url': reverse('bidding_view_item', args=[item.id]),
            'title': item.title,
            'price': money_format(item.price, request.shop),
            'image': {
                'original': image.image.url if image else None,
                'small': image.image.url_100x100 if image else None,
                'medium': image.image.url_400x400 if image else None,
            }
        })

    t = loader.get_template('paginator.html')
    c = RequestContext(request, {
        'objects': items,
        'pages': pager.page_range,
        'paged': paged,
    })
    paginator = (t.render(c))

    try:
        page = DynamicPageContent.objects.filter(shop=request.shop,
                                                 page="for_sale").get()
        description = striptags(page.meta_content)
    except DynamicPageContent.DoesNotExist:
        description = "No meta description found"

    param = {
        'items': items_list,
        'shop_categories': shop_categories,
        'shop_subcategories': shop_subcategories,
        'paginator': paginator,
        'page_title': 'For Sale',
        'page_description': description,
    }
    return HttpResponse(my_render(request, param, 'for_sale'))
def bidding_for_sale(request):
    items_list = Item.objects.filter(shop=request.shop, qty__gte=0, show=True)
    shop_categories = request.shop.categories_list()
    shop_subcategories = request.shop.sub_categories_list()
    
    pager = Paginator(items_list, PAGE_LOTS)
    try:
        page = int(request.GET.get('page','1'))
    except:
        page = 1        
    try:
        items = pager.page(page)
    except (EmptyPage, InvalidPage):
        items = pager.page(pager.num_pages)
    paged = (pager.num_pages > 1)
    
    items_list = []
    for item in items.object_list:
        image = item.image()
        items_list.append({'url': reverse('bidding_view_item', args=[item.id]),
                          'title': item.title,
                          'price': money_format(item.price, request.shop),
                          'image': {'original': image.image.url if image else None,
                                    'small': image.image.url_100x100 if image else None,
                                    'medium': image.image.url_400x400 if image else None,
                                    } 
                          })

    t = loader.get_template('paginator.html')
    c = RequestContext(request, {'objects': items,
                                 'pages': pager.page_range,
                                 'paged': paged,})
    paginator = (t.render(c))
    
    try:
        page = DynamicPageContent.objects.filter(shop=request.shop, page="for_sale").get()
        description = striptags(page.meta_content)
    except DynamicPageContent.DoesNotExist:
        description = "No meta description found"
    
    param = {
             'items': items_list,
             'shop_categories': shop_categories,
             'shop_subcategories': shop_subcategories,
             'paginator': paginator,
             'page_title': 'For Sale',
             'page_description': description,
             } 
    return HttpResponse(my_render(request, param, 'for_sale'))
def bidding_view_history_lot(request, id):
    #TODO: filter by state lot
    #TODO: add csrf_token to form    
    lot = get_object_or_404(Lot, pk=id)
    form = BidForm(lot, request.GET or None)
    if form.is_valid():
        if (not request.user.is_authenticated()) or request.user.is_staff or request.user.is_superuser:
            return HttpResponseRedirect(settings.LOGIN_URL+"?next="+request.get_full_path())
        if not (lot.is_active() and lot.shop == request.shop):
            raise Http404
        
        lot.bid(request.user, form.cleaned_data['amount'], request.META['REMOTE_ADDR'])

        request.flash['message'] = unicode(_("Bid successfully registered."))
        request.flash['severity'] = "success"
        return HttpResponseRedirect(reverse('bidding_view_history_lot', args=[id]))

    history = []
    for bid in lot.history():
        history.append({'bidder_username': bid.bidder.username,
                        'bid_amount': money_format(bid.bid_amount, request.shop),
                        'bid_time': date(bid.bid_time, 'r'),
                        }) 

    t = loader.get_template('bidding/blocks/view_history_lot_description.html')
    c = RequestContext(request, {'lot': lot, 'form': form})
    block_description = (t.render(c))
    image = lot.image()
    lot_dic = {'count_bidders': lot.count_bidders(),
               'count_bids': lot.count_bids(),
               'time_left_long': lot.time_left_long(),
               'title': lot.title,
               'dir_back': reverse('bidding_view_lot', args=[lot.id]),
               'image': {'original': image.image.url if image else None,
                         'small': image.image.url_100x100 if image else None,
                         'medium': image.image.url_400x400 if image else None,
                        }
             } 

    return HttpResponse(my_render(request, {
                                         'history': history,
                                         'description': block_description,
                                         'page_title': lot.title,
                                         'page_description': '%s, %s' % (lot.title, striptags(lot.description)),
                                         'lot': lot_dic, 
                                        }, 'view_history_lot'))
            payment_buttons.append(button)
    except Exception, e:
        logging.error(e)


#    t = loader.get_template('my_shopping/blocks/confirm.html')
#    c = RequestContext(request, {'cart' : cart,
#                                 'payment_buttons': payment_buttons,})
#    block_confirm = (t.render(c))
    items = []
    for item in cart.cartitem_set.all():
        image = item.product.image()
        items.append({
            #'image': item.product.image().image.url_100x100 if item.product.image() else None,
            'title': item.product.title,
            'price': money_format(item.price, shop),
            'qty': item.qty,
            'sub_total': money_format(item.sub_total(), shop),
            'image': {
                'original': image.image.url if image else None,
                'small': image.image.url_100x100 if image else None,
                'medium': image.image.url_400x400 if image else None,
            },
            'id': item.id,
        })

    shippingdata = ({
        'first_name': cart.shippingdata.first_name.title(),
        'last_name': cart.shippingdata.last_name.title(),
        'street_address': cart.shippingdata.street_address.title(),
        'city': cart.shippingdata.city.title(),
Exemple #9
0
def my_render(request, param, name_page=None):
    """ news_items """
    items = Item.objects.filter(shop=request.shop).order_by('-id')[:10]
    new_items = []
    for i in items:
        image = i.image()
        plain_item = {
            'title': i.title,
            'description': i.description,
            'price': money_format(i.price, request.shop),
            'url': reverse('bidding_view_item', args=[i.id]),
            'image': {
                'original': image.image.url if image else "",
                'small': image.image.url_100x100 if image else "",
                'medium': image.image.url_400x400 if image else "",
            }
        }
        new_items.append(plain_item)
    """ Sessions """
    sessions = AuctionSession.objects.filter(shop=request.shop,
                                             end__gte=datetime.now())
    sessions_list = []
    sessions_list.append({
        'title': 'Highlights',
        'url': reverse('bidding_auctions')
    })
    for session in sessions:
        sessions_list.append({
            'title':
            session.title,
            'url':
            reverse('bidding_auctions_id', args=[session.id]),
        })
    """ Menu """
    t = loader.get_template('bidding/blocks/menu_menu.html')
    c = RequestContext(request, {'shop': request.shop})
    menu = (t.render(c))
    """ Policies """
    policies = ShopPolicies.objects.filter(shop=request.shop)
    t = loader.get_template('bidding/blocks/policy.html')
    c = RequestContext(request, {'shop': request.shop})
    policies = (t.render(c))
    """ Header """
    t = loader.get_template('bidding/blocks/header.html')
    c = RequestContext(request, {'shop': request.shop})
    header = (t.render(c))
    """ Footer """
    t = loader.get_template('bidding/blocks/footer.html')
    c = RequestContext(request, {'shop': request.shop})
    footer = (t.render(c))

    about = request.shop.about.body
    links = []

    menus = request.shop.menu_set.all()
    if menus.count() > 0:
        for link in menus[0].links():
            if link.to == "/auctions/" and not request.shop.auctions_feature_enabled(
            ):
                continue
            links.append({
                'to': link.to,
                'name': link.name,
            })
    """ Flash """
    t = loader.get_template('bidding/blocks/flash.html')
    c = RequestContext(request, {})
    flash = (t.render(c))
    """ Posts """
    last = request.shop.last_post()
    if last:
        last_post = {
            'url': reverse('bidding_view_post', args=[last.id]),
            'title': last.title,
            'body': last.body,
            'date_time': date(last.date_time, 'F j, Y'),
        }
    else:
        last_post = {}

    env = Environment(loader=ThemeLoader(request.shop, request.is_secure()))
    env.filters['asset_url'] = env.loader.asset_url

    if name_page:
        try:
            template = env.get_template(name_page)
            content = template.render(param)
        except Exception, e:
            return HttpResponse("Error in template %s. %s" % (name_page, e))
Exemple #10
0
def bidding_auctions(request, session_id=None):
    if session_id:
        session = get_object_or_404(AuctionSession, pk=session_id)
        lots = Lot.objects.filter(shop=request.shop,
                                  session=session,
                                  state='A')
        session_title = session.title
    else:
        session_title = 'Highlights'
        lots = Lot.objects.filter(shop=request.shop, state='A')

    pager = Paginator(lots, PAGE_LOTS)
    try:
        page = int(request.GET.get('page', '1'))
    except:
        page = 1
    try:
        lots = pager.page(page)
    except (EmptyPage, InvalidPage):
        lots = pager.page(pager.num_pages)
    paged = (pager.num_pages > 1)

    lots_list = []
    for lot in lots.object_list:
        image = lot.image()
        lots_list.append({
            'url': reverse('bidding_view_lot', args=[lot.id]),
            'title': lot.title,
            'price': money_format(lot.price(), request.shop),
            'image': {
                'original': image.image.url if image else None,
                'small': image.image.url_100x100 if image else None,
                'medium': image.image.url_400x400 if image else None,
            }
        })

    sessions = AuctionSession.objects.filter(shop=request.shop,
                                             end__gte=datetime.now())
    shop_categories = request.shop.categories_list()
    shop_subcategories = request.shop.sub_categories_list()

    t = loader.get_template('bidding/blocks/sessions.html')
    c = RequestContext(request, {'sessions': sessions})
    block_sessions = (t.render(c))

    t = loader.get_template('paginator.html')
    c = RequestContext(request, {
        'objects': lots,
        'pages': pager.page_range,
        'paged': paged,
    })
    paginator = (t.render(c))

    try:
        page = DynamicPageContent.objects.filter(shop=request.shop,
                                                 page="auctions").get()
        description = striptags(page.meta_content)
    except DynamicPageContent.DoesNotExist:
        description = "No meta description found"

    param = {
        'lots': lots_list,
        'sessions': block_sessions,
        'session_title': session_title,
        'paginator': paginator,
        'page_title': 'Auctions',
        'page_description': description,
        'shop_categories': shop_categories,
        'shop_subcategories': shop_subcategories,
    }

    return HttpResponse(my_render(request, param, 'auctions'))
Exemple #11
0
def bidding_home(request):
    from shops.forms import MailingListMemberForm

    logging.critical(request.GET.get("u", None))
    shop = request.shop
    if request.method == "POST":

        form = MailingListMemberForm(request.POST)
        if form.is_valid():
            member = form.save(commit=False)
            member.shop = shop
            member.save()
            request.flash['message'] = unicode(
                _("Email successfully registered."))
            request.flash['severity'] = "success"
            return HttpResponseRedirect(reverse("home"))
    else:
        form = MailingListMemberForm()

    t = loader.get_template('bidding/blocks/mailing_list_form.html')
    c = RequestContext(request, {'form': form})
    block_mailing_list = (t.render(c))

    home = Home.objects.filter(shop=request.shop).get()

    #TODO: replace collections
    """ news_items """
    items = Item.objects.filter(shop=request.shop).order_by('-id')[:10]
    new_items = []
    for i in items:
        image = i.image()
        new_items.append({
            'title': i.title,
            'description': i.description,
            'price': money_format(i.price, request.shop),
            'url': reverse('bidding_view_item', args=[i.id]),
            'image': {
                'original': image.image.url if image else "",
                'small': image.image.url_100x100 if image else "",
                'medium': image.image.url_400x400 if image else "",
            }
        })

    last = request.shop.last_post()
    if last:
        last_post = {
            'url': reverse('bidding_view_post', args=[last.id]),
            'title': last.title,
            'body': last.body,
            'date_time': date(last.date_time, 'F j, Y'),
        }
    else:
        last_post = {}
    """ Sessions """
    sessions = AuctionSession.objects.filter(shop=request.shop,
                                             end__gte=datetime.now())
    new_sessions = []
    new_sessions.append({
        'title': 'Highligths',
        'url': reverse('bidding_auctions')
    })
    for session in sessions:
        new_sessions.append({
            'title':
            session.title,
            'url':
            reverse('bidding_auctions_id', args=[session.id]),
        })

    about = request.shop.about.body

    param = {
        'about': about,
        'home': {
            'title': home.title,
            'body': home.body,
            'image': home.image
        },
        'new_items': new_items,
        'mailing_list': block_mailing_list,
        'page_title': 'Home',
        'page_title': 'Home',
        'page_description': striptags(home.meta_content),
        'sessions': new_sessions,
        'url_refund': reverse('bidding_refund'),
        'url_privacy_policy': reverse('bidding_privacy_policy'),
        'url_terms_of_service': reverse('bidding_terms_of_service'),
    }

    return HttpResponse(my_render(request, param, 'home'))
def success(request):    
    from payments.gateways.paypal import PayPalGateway
    from payments.models import PayPalShopSettings, PayPalToken, PayPalTransaction
    from preferences.models import Preference
    from sell.templatetags.sell_tags import money_format

    
    if request.method == 'GET':
        payerid = request.GET.get('PayerID', None)
        token = request.GET.get('token', None)
    else:
        payerid = request.POST.get('PayerID', None)
        token = request.POST.get('token', None)
    
    if None in (token, payerid):
        request.flash['message'] = unicode(_("Payment failed, try other method."))
        request.flash['severity'] = "error"
        return HttpResponseRedirect(reverse('my_shopping'))
    
    shop = request.shop   
    paypal_settings = PayPalShopSettings.objects.filter(shop = shop).get()
    profile = request.user.get_profile()
    
    
    try:
        paypaltoken = PayPalToken.objects.filter(token=token).get()
    except PayPalToken.DoesNotExist:
        request.flash['message'] = unicode(_("Payment failed, try other method."))
        request.flash['severity'] = "error"
        return HttpResponseRedirect(reverse('my_shopping'))

    if paypaltoken.confirmed == True:
        request.flash['message'] = unicode(_("Payment is already confirmed!"))
        request.flash['severity'] = "notice"
        return HttpResponseRedirect(reverse('my_shopping'))

    cart = paypaltoken.cart
    #currency = Preference.get_preference(shop).checkout_currency
    total_amount = "%0.2f" % cart.total_with_taxes()
    
    
    if request.method != 'POST':
        
        t = loader.get_template('payments/payment_paypal_confirm.html')
        c = RequestContext(request, {
                                     'payerid': payerid,
                                     'token': token,
                                    })
        block = (t.render(c))
        
        param = {'total_amount': money_format(total_amount, shop),
                 'paypaltoken': paypaltoken,
                 'cart': cart,
                 'cancel_url': reverse('payments_cancel'),
                 'form_paypal_confirm': block,
                }
        
        return HttpResponse(my_render(request, param, 'payment_paypal_confirm'))        
    
    
    action = request.POST.get('action', 'cancel').lower()
    
    if action == 'confirm':
        
        paypal_gw = PayPalGateway(username=settings.PAYPAL_USERNAME,
                                  password=settings.PAYPAL_PASSWORD,
                                  sign=settings.PAYPAL_SIGNATURE,
                                  debug=settings.PAYPAL_DEBUG)
       
        token_data = paypal_gw.GetExpressCheckoutDetails("http://www.google.com", "http://www.google.com", paypaltoken.token)
        ack = paypal_gw.api_response['ACK'][0]
        
        try:
            amount = decimal.Decimal(paypal_gw.api_response['AMT'][0])
        except KeyError:
            logging.critical("Fail when trying to read the payment amount. The API response don't have an AMT key. RESPONSE: %s" % paypal_gw.api_response)    
            request.flash['message'] = unicode(_("We have found an error when trying to validate your purchase!"))
            request.flash['severity'] = "error"
            return HttpResponseRedirect(reverse('my_shopping'))
        
        if ack != "Success":
            request.flash['message'] = unicode(_("Fail when trying to validate your PayPal Token. Please contact admin to complete your purchase!"))
            request.flash['severity'] = "error"
            return HttpResponseRedirect(reverse('my_shopping'))
        
        if amount != cart.total_with_taxes():
            request.flash['message'] = unicode(_("You have authorized us to charge you just $%s, but you want buy $%s! Please contact admin if you think this is a mistake!" % (amount, cart.total_with_taxes())))
            request.flash['severity'] = "error"
            return HttpResponseRedirect(reverse('my_shopping'))
    
        payment_request = {
            'PAYMENTREQUEST_0_PAYMENTACTION': 'Sale',
            'PAYMENTREQUEST_0_AMT': "%0.2f" % cart.total_with_taxes(), 
            #'PAYMENTREQUEST_0_TAXAMT': "%0.2f" % cart.taxes(),
            #'PAYMENTREQUEST_n_SHIPPINGAMT': "%0.2f" % cart.shipping_charge(),
            #'PAYMENTREQUEST_0_ITEMAMT': "%0.2f" % cart.total(),
            'PAYMENTREQUEST_0_CURRENCYCODE': Preference.get_preference(shop).checkout_currency,
            'PAYMENTREQUEST_0_NOTIFYURL': request.build_absolute_uri(reverse("payments_paypal_ipn")),
            'SUBJECT': paypal_settings.email
        }
        success = paypal_gw.DoExpressCheckoutPayment(payment_request, paypaltoken.token, payerid)
        
        
        if success:
            #Close and clean the cart
            sell = cart.close("PayPal")
            #Set the sell payments as paid
            sell.payment.pay()
            paypaltoken.confirmed = True
            paypaltoken.save()
            
            # {'PAYMENTINFO_0_TRANSACTIONTYPE': 'expresscheckout', 'ACK': 'Success', 'PAYMENTINFO_0_PAYMENTTYPE': 'instant', 'PAYMENTINFO_0_REASONCODE': 'None', 'SHIPPINGOPTIONISDEFAULT': 'false', 'INSURANCEOPTIONSELECTED': 'false', 'CORRELATIONID': '8d20dfd3e3575', 'PAYMENTINFO_0_TAXAMT': '0.00', 'PAYMENTINFO_0_TRANSACTIONID': '6MH53467HE876651A', 'PAYMENTINFO_0_PENDINGREASON': 'None', 'PAYMENTINFO_0_AMT': '57.00', 'PAYMENTINFO_0_PROTECTIONELIGIBILITY': 'Ineligible', 'PAYMENTINFO_0_ERRORCODE': '0', 'TOKEN': 'EC-7MR99474WD5992801', 'VERSION': '63.0', 'SUCCESSPAGEREDIRECTREQUESTED': 'false', 'BUILD': '1482946', 'PAYMENTINFO_0_CURRENCYCODE': 'USD', 'PAYMENTINFO_0_FEEAMT': '1.95', 'TIMESTAMP': '2010-09-08T18:03:24Z', 'PAYMENTINFO_0_ACK': 'Success', 'PAYMENTINFO_0_ORDERTIME': '2010-09-08T18:03:23Z', 'PAYMENTINFO_0_PAYMENTSTATUS': 'Completed'}
            txn_id = paypal_gw.api_response['PAYMENTINFO_0_TRANSACTIONID']
            
            transaction = PayPalTransaction()
            transaction.transaction_id = txn_id
            transaction.sell = sell
            transaction.save()
            
            return HttpResponseRedirect(reverse('payments_success'))
        else:
            request.flash['message'] = unicode(_("Payment Failed!"))
            request.flash['severity'] = "error"
            return HttpResponseRedirect(reverse('my_shopping'))
    else:
        paypaltoken.delete()
        request.flash['message'] = unicode(_("Payment cancel!"))
        request.flash['severity'] = "notice"
        return HttpResponseRedirect(reverse('my_shopping'))
def my_render(request, param, name_page=None):
    """ news_items """
    items = Item.objects.filter(shop=request.shop).order_by('-id')[:10] 
    new_items = []
    for i in items:
        image = i.image()
        plain_item = {
            'title': i.title,
            'description': i.description,
            'price': money_format(i.price, request.shop), 
            'url': reverse('bidding_view_item', args=[i.id]),
            'image': {'original': image.image.url if image else "",
                      'small': image.image.url_100x100 if image else "",
                      'medium': image.image.url_400x400 if image else "",
                      } 
        }
        new_items.append(plain_item)

    """ Sessions """
    sessions = AuctionSession.objects.filter(shop=request.shop, end__gte=datetime.now())        
    sessions_list = []
    sessions_list.append({'title': 'Highlights', 'url': reverse('bidding_auctions')})
    for session in sessions:
        sessions_list.append({
                             'title': session.title,
                             'url': reverse('bidding_auctions_id', args=[session.id]),
                             })
   
    """ Menu """
    t = loader.get_template('bidding/blocks/menu_menu.html')
    c = RequestContext(request, {'shop':request.shop})
    menu = (t.render(c))

    """ Header """
    t = loader.get_template('bidding/blocks/header.html')
    c = RequestContext(request, {'shop':request.shop})
    header = (t.render(c))

    """ Footer """
    t = loader.get_template('bidding/blocks/footer.html')
    c = RequestContext(request, {'shop':request.shop})
    footer = (t.render(c))
    
    about = request.shop.about.body
    links = []
    
    menus = request.shop.menu_set.all()
    if menus.count() > 0:
        for link in menus[0].links():
            links.append({
                         'to': link.to,
                         'name': link.name,
                         }) 
    
    """ Flash """
    t = loader.get_template('bidding/blocks/flash.html')
    c = RequestContext(request, {})
    flash = (t.render(c))

    """ Posts """
    last = request.shop.last_post()
    if last:
        last_post = {'url': reverse('bidding_view_post', args=[last.id]),
                     'title': last.title,
                     'body': last.body,
                     'date_time': date(last.date_time,'F j, Y'),
                    }
    else:
        last_post = {}

    env = Environment(loader=ThemeLoader(request.shop, request.is_secure()))
    env.filters['asset_url'] = env.loader.asset_url
    

    if name_page:
        try:
            template = env.get_template(name_page)
            content = template.render(param)
        except Exception, e:
            return HttpResponse("Error in template %s. %s" % (name_page, e))
def my_orders(request):
    my_orders = Sell.objects.filter(shop=request.shop, bidder=request.user)

    inner_q = BidHistory.objects.filter(
        bidder=request.user,
        lot__state='A').values_list('lot').distinct().query
    lots_in_auctions = Lot.objects.filter(pk__in=inner_q)

    bids_list = []
    for lot in lots_in_auctions:
        history = []
        for bid in lot.history():
            history.append({
                'bidder_username':
                bid.bidder.username,
                'bid_amount':
                money_format(bid.bid_amount, request.shop),
                'bid_time':
                date(bid.bid_time, 'r'),
            })
        image = lot.image()
        bids_list.append({
            'url': reverse('bidding_view_lot', args=[lot.id]),
            #'image': lot.image().image.url_100x100 if lot.image() else None,
            'title': lot.title,
            'is_active': lot.is_active(),
            'count_bids': lot.count_bids(),
            'current_bid': lot.current_bid(),
            'time_left': lot.time_left(),
            'history': history,
            'image': {
                'original': image.image.url if image else None,
                'small': image.image.url_100x100 if image else None,
                'medium': image.image.url_400x400 if image else None,
            }
        })

    my_orders_list = []
    for sell in my_orders:
        items = []
        for item in sell.sellitem_set.all():
            image = item.product.image()
            items.append({
                #'image': item.product.image().image.url_100x100 if item.product.image() else None,
                'url': item.product.get_bidding_url(),
                'title': item.product.title,
                'price': money_format(item.price, request.shop),
                'image': {
                    'original': image.image.url if image else None,
                    'small': image.image.url_100x100 if image else None,
                    'medium': image.image.url_400x400 if image else None,
                }
            })
        payment_history = []
        for payment in sell.payment.paymenthistory_set.all():
            payment_history.append({
                'date_time': date(payment.date_time, 'r'),
                'state': payment.get_state_display(),
            })

        shipping_history = []
        for shipping in sell.shipping.shippinghistory_set.all():
            shipping_history.append({
                'date_time': date(shipping.date_time, 'r'),
                'state': shipping.get_state_display(),
            })

        my_orders_list.append({
            'id': sell.id,
            'date_time': date(sell.date_time, 'r'),
            'total': money_format(sell.total, request.shop),
            'payment_history': payment_history,
            'shipping_history': shipping_history,
            'item_set': items,
        })

    param = {
        'bids': bids_list,
        'my_orders': my_orders_list,
        'page_title': 'My Orders',
        'page_description': 'My Orders',
    }

    return HttpResponse(my_render(request, param, 'my_orders'))
def bidding_home(request):
    from shops.forms import MailingListMemberForm
    shop = request.shop
    if request.method == "POST":
        
        form = MailingListMemberForm(request.POST)
        if form.is_valid():
            member = form.save(commit=False)
            member.shop = shop
            member.save()
            request.flash['message'] = unicode(_("Email successfully registered."))
            request.flash['severity'] = "success"
            return HttpResponseRedirect(reverse("home"))
    else:
        form = MailingListMemberForm()

    t = loader.get_template('bidding/blocks/mailing_list_form.html')
    c = RequestContext(request, {'form' : form})
    block_mailing_list = (t.render(c))
    
    home = Home.objects.filter(shop=request.shop).get()
    
    #TODO: replace collections
    """ news_items """
    items = Item.objects.filter(shop=request.shop).order_by('-id')[:10] 
    new_items = []
    for i in items:
        image = i.image()
        new_items.append({
            'title': i.title,
            'description': i.description,
            'price': money_format(i.price, request.shop), 
            'url': reverse('bidding_view_item', args=[i.id]),
            'image': {'original': image.image.url if image else "",
                      'small': image.image.url_100x100 if image else "",
                      'medium': image.image.url_400x400 if image else "",
                      } 
            })

    last = request.shop.last_post()
    if last:
        last_post = {'url': reverse('bidding_view_post', args=[last.id]),
                     'title': last.title,
                     'body': last.body,
                     'date_time': date(last.date_time,'F j, Y'),
                    }
    else:
        last_post = {}        
        
    """ Sessions """
    sessions = AuctionSession.objects.filter(shop=request.shop, end__gte=datetime.now())        
    new_sessions = []
    new_sessions.append({'title': 'Highligths', 'url': reverse('bidding_auctions')})
    for session in sessions:
        new_sessions.append({
                             'title': session.title,
                             'url': reverse('bidding_auctions_id', args=[session.id]),
                             })        

    about = request.shop.about.body

    param = {
             'about': about,
             'home': 
                {
                 'title': home.title, 
                 'body': home.body, 
                 'image': home.image
                 },
             'last_post': last_post,
             'mailing_list': block_mailing_list,
             'new_items': new_items,
             'page_title': 'Home',
             'page_description': striptags(home.meta_content),
             'sessions': new_sessions,
            }
        
    return HttpResponse(my_render(request, param, 'home'))
def my_orders(request):
    my_orders = Sell.objects.filter(shop=request.shop, bidder=request.user)

    inner_q = BidHistory.objects.filter(bidder=request.user, lot__state='A').values_list('lot').distinct().query
    lots_in_auctions = Lot.objects.filter(pk__in=inner_q)
    
    bids_list = []
    for lot in lots_in_auctions:
        history = []    
        for bid in lot.history():
            history.append({'bidder_username': bid.bidder.username,
                            'bid_amount': money_format(bid.bid_amount, request.shop),
                            'bid_time': date(bid.bid_time, 'r'),
                            })      
        image = lot.image()   
        bids_list.append({'url': reverse('bidding_view_lot', args=[lot.id]),
                          #'image': lot.image().image.url_100x100 if lot.image() else None,
                          'title': lot.title,
                          'is_active': lot.is_active(),
                          'count_bids': lot.count_bids(),
                          'current_bid': lot.current_bid(),
                          'time_left': lot.time_left(),
                          'history': history,
                          'image': {
                                    'original': image.image.url if image else None,
                                    'small': image.image.url_100x100 if image else None,
                                    'medium': image.image.url_400x400 if image else None,
                                   }
                          })

    my_orders_list = []
    for sell in my_orders:
        items = []
        for item in sell.sellitem_set.all():
            image = item.product.image()
            items.append({
                          #'image': item.product.image().image.url_100x100 if item.product.image() else None,
                          'url': item.product.get_bidding_url(),
                          'title': item.product.title,
                          'price': money_format(item.price, request.shop),
                          'image': {
                                    'original': image.image.url if image else None,
                                    'small': image.image.url_100x100 if image else None,
                                    'medium': image.image.url_400x400 if image else None,
                                   }
                          })
        payment_history = []    
        for payment in sell.payment.paymenthistory_set.all():
            payment_history.append({
                                    'date_time': date(payment.date_time, 'r'),
                                    'state': payment.get_state_display(),
                                    })

        shipping_history = []    
        for shipping in sell.shipping.shippinghistory_set.all():
            shipping_history.append({
                                    'date_time': date(shipping.date_time, 'r'),
                                    'state': shipping.get_state_display(),
                                    })
            
        my_orders_list.append({'id': sell.id,
                               'date_time': date(sell.date_time, 'r'),
                               'total': money_format(sell.total, request.shop),
                               'payment_history': payment_history,
                               'shipping_history': shipping_history,
                               'item_set': items,
                              })
        
    param = {
             'bids': bids_list,
             'my_orders': my_orders_list,
             'page_title': 'My Orders',
             'page_description': 'My Orders',
             }
    
    return HttpResponse(my_render(request, param, 'my_orders'))        
            logging.debug(button)
            payment_buttons.append(button)
    except Exception, e:
        logging.error(e)
    
#    t = loader.get_template('my_shopping/blocks/confirm.html')
#    c = RequestContext(request, {'cart' : cart,
#                                 'payment_buttons': payment_buttons,})
#    block_confirm = (t.render(c))
    items = []
    for item in cart.cartitem_set.all():
        image = item.product.image()
        items.append({
                      #'image': item.product.image().image.url_100x100 if item.product.image() else None,
                      'title': item.product.title,
                      'price': money_format(item.price, shop),
                      'qty': item.qty,
                      'sub_total': money_format(item.sub_total(), shop),
                      'image': {'original': image.image.url if image else None,
                                'small': image.image.url_100x100 if image else None,
                                'medium': image.image.url_400x400 if image else None,
                               } 
                      })
    
    shippingdata =({'street_address': cart.shippingdata.street_address.title(),
                     'city': cart.shippingdata.city.title(),
                     'state': cart.shippingdata.state.upper(),
                     'zip': cart.shippingdata.zip,
                     'country': cart.shippingdata.country.upper(),
                     })
    
def success(request):    
    from payments.gateways.paypal import PayPalGateway
    from payments.models import PayPalShopSettings, PayPalToken, PayPalTransaction
    from preferences.models import Preference
    from sell.templatetags.sell_tags import money_format

    cart = request.cart
    
    #### Verify Products Availability
    if not cart.is_available():
        request.flash['message'] = 'Items not longer available: '
        for item in cart.items_not_availables():
            request.flash['message'] += item.product.title
        cart.remove_not_available_items()
        
        return HttpResponseRedirect(reverse('my_shopping'))
    
    if request.method == 'GET':
        payerid = request.GET.get('PayerID', None)
        token = request.GET.get('token', None)
    else:
        payerid = request.POST.get('PayerID', None)
        token = request.POST.get('token', None)
    
    if None in (token, payerid):
        request.flash['message'] = unicode(_("Payment failed, try other method."))
        request.flash['severity'] = "error"
        return HttpResponseRedirect(reverse('my_shopping'))
    
    shop = request.shop   
    paypal_settings = PayPalShopSettings.objects.filter(shop = shop).get()
    
    try:
        paypaltoken = PayPalToken.objects.filter(token=token).get()
    except PayPalToken.DoesNotExist:
        request.flash['message'] = unicode(_("Payment failed, try other method."))
        request.flash['severity'] = "error"
        return HttpResponseRedirect(reverse('my_shopping'))

    if paypaltoken.confirmed == True:
        request.flash['message'] = unicode(_("Payment is already confirmed!"))
        request.flash['severity'] = "notice"
        return HttpResponseRedirect(reverse('my_shopping'))

    cart = paypaltoken.cart
    #currency = Preference.get_preference(shop).checkout_currency
    total_amount = "%0.2f" % cart.total_with_taxes()
    
    
    if request.method != 'POST':
        
        t = loader.get_template('payments/payment_paypal_confirm.html')
        c = RequestContext(request, {
                                     'payerid': payerid,
                                     'token': token,
                                     #'api_signature': settings.PAYPAL_SIGNATURE,                                                                   
                                     #'api_user': settings.PAYPAL_USERNAME,
                                     #'api_password': settings.PAYPAL_PASSWORD
                                    })
        block = (t.render(c))
        
        param = {'total_amount': money_format(total_amount, shop),
                 'paypaltoken': paypaltoken,
                 'cart': cart,
                 'cancel_url': reverse('payments_cancel'),
                 'form_paypal_confirm': block,
                }
        
        return HttpResponse(my_render(request, param, 'payment_paypal_confirm'))        
    
    
    action = request.POST.get('action', 'cancel').lower()
    
    if action == 'confirm':
        
        paypal_gw = PayPalGateway(username=settings.PAYPAL_USERNAME,
                                  password=settings.PAYPAL_PASSWORD,
                                  sign=settings.PAYPAL_SIGNATURE,
                                  debug=settings.PAYPAL_DEBUG)
       
        #return_url = request.build_absolute_uri(reverse("paypal_success"))
        #cancel_url = request.build_absolute_uri(reverse("paypal_cancel"))
        is_token_data = paypal_gw.GetExpressCheckoutDetails(paypaltoken.token, subject=paypal_settings.email)
        
        if not is_token_data:
            logging.critical("Error found when trying to do a GetExpressCheckoutDetails api call on Paypal. RESPONSE: %s" % paypal_gw.api_response)
            request.flash['message'] = unicode(_("Could not get transaction data from PayPal. Please contact admin to complete your purchase!"))
            request.flash['severity'] = "error"
            return HttpResponseRedirect(reverse('my_shopping'))
        
        
        ack = paypal_gw.api_response['ACK'][0]            
        
        if ack != "Success":
            logging.critical("Paypal Api Response Failure. RESPONSE: %s" % paypal_gw.api_response)
            request.flash['message'] = unicode(_("There was an error when trying to get data from PayPal. Please contact admin to complete your purchase!"))
            request.flash['severity'] = "error"
            return HttpResponseRedirect(reverse('my_shopping'))
        
        try:
            amount = decimal.Decimal(paypal_gw.api_response['PAYMENTREQUEST_0_AMT'][0])
        except KeyError:
            logging.critical("Fail when trying to read the payment amount. The API response don't have an AMT key. RESPONSE: %s" % paypal_gw.api_response)    
            request.flash['message'] = unicode(_("We have found an error when trying to validate your purchase!"))
            request.flash['severity'] = "error"
            return HttpResponseRedirect(reverse('my_shopping'))
        
        if amount != cart.total_with_taxes():
            request.flash['message'] = unicode(_("You have authorized us to charge you just $%s, but you want buy $%s! Please contact admin if you think this is a mistake!" % (amount, cart.total_with_taxes())))
            request.flash['severity'] = "error"
            return HttpResponseRedirect(reverse('my_shopping'))
        
    
        payment_request = {
            'PAYMENTREQUEST_0_PAYMENTACTION': 'Sale',
            'PAYMENTREQUEST_0_AMT': "%0.2f" % cart.total_with_taxes(), 
            #'PAYMENTREQUEST_0_TAXAMT': "%0.2f" % cart.taxes(),
            #'PAYMENTREQUEST_n_SHIPPINGAMT': "%0.2f" % cart.shipping_charge(),
            #'PAYMENTREQUEST_0_ITEMAMT': "%0.2f" % cart.total(),
            'PAYMENTREQUEST_0_CURRENCYCODE': Preference.get_preference(shop).checkout_currency,
            'PAYMENTREQUEST_0_NOTIFYURL': request.build_absolute_uri(reverse("payments_paypal_ipn")),
            'SUBJECT': paypal_settings.email
        }
        success = paypal_gw.DoExpressCheckoutPayment(payment_request, paypaltoken.token, payerid)
        
        
        if success:
            #Close and clean the cart
            sell = cart.close("PayPal")
            #Set the sell payments as paid
            sell.payment.pay()
            paypaltoken.confirmed = True
            paypaltoken.save()
            
            # {'PAYMENTINFO_0_TRANSACTIONTYPE': 'expresscheckout', 'ACK': 'Success', 'PAYMENTINFO_0_PAYMENTTYPE': 'instant', 'PAYMENTINFO_0_REASONCODE': 'None', 'SHIPPINGOPTIONISDEFAULT': 'false', 'INSURANCEOPTIONSELECTED': 'false', 'CORRELATIONID': '8d20dfd3e3575', 'PAYMENTINFO_0_TAXAMT': '0.00', 'PAYMENTINFO_0_TRANSACTIONID': '6MH53467HE876651A', 'PAYMENTINFO_0_PENDINGREASON': 'None', 'PAYMENTINFO_0_AMT': '57.00', 'PAYMENTINFO_0_PROTECTIONELIGIBILITY': 'Ineligible', 'PAYMENTINFO_0_ERRORCODE': '0', 'TOKEN': 'EC-7MR99474WD5992801', 'VERSION': '63.0', 'SUCCESSPAGEREDIRECTREQUESTED': 'false', 'BUILD': '1482946', 'PAYMENTINFO_0_CURRENCYCODE': 'USD', 'PAYMENTINFO_0_FEEAMT': '1.95', 'TIMESTAMP': '2010-09-08T18:03:24Z', 'PAYMENTINFO_0_ACK': 'Success', 'PAYMENTINFO_0_ORDERTIME': '2010-09-08T18:03:23Z', 'PAYMENTINFO_0_PAYMENTSTATUS': 'Completed'}
            txn_id = paypal_gw.api_response['PAYMENTINFO_0_TRANSACTIONID']
            
            transaction = PayPalTransaction()
            transaction.transaction_id = txn_id
            transaction.sell = sell
            transaction.save()
            
            return HttpResponseRedirect(reverse('payments_success'))
        else:
            request.flash['message'] = unicode(_("Payment Failed!"))
            request.flash['severity'] = "error"
            return HttpResponseRedirect(reverse('my_shopping'))
    else:
        paypaltoken.delete()
        request.flash['message'] = unicode(_("Payment cancel!"))
        request.flash['severity'] = "notice"
        return HttpResponseRedirect(reverse('my_shopping'))