Files @ 9d5f83ec3972
Branch filter:

Location: CopyleftConf/copyleftconf-website/pinaxcon/templatetags/nbpy_tags.py

Brett Smith
templatetags: Update donation_income for CopyleftConf 2020.
from registrasion.models import commerce, inventory
from registrasion.controllers.category import CategoryController
from registrasion.controllers.item import ItemController
from registrasion.templatetags import registrasion_tags

from decimal import Decimal
from django import template
from django.conf import settings
from django.db.models import Sum
from urllib import urlencode  # TODO: s/urllib/six.moves.urllib/

register = template.Library()

CENTS_QUANT = Decimal('.01')
VAT_RATE = str(settings.INVOICE_VAT_RATE * 100).rstrip('.0') + '%'

def nonvat_price(product):
    return product.price * (1 - settings.INVOICE_VAT_RATE)

@register.simple_tag
def vat_amount(invoice):
    return (invoice.value * settings.INVOICE_VAT_RATE).quantize(CENTS_QUANT)

@register.simple_tag
def vat_rate():
    return VAT_RATE

@register.simple_tag(takes_context=True)
def donation_income(context, invoice):
    ''' Calculates the donation income for a given invoice.

    Returns:
        the donation income.

    '''

    tickets = inventory.Product.objects.filter(category__id=settings.TICKET_PRODUCT_CATEGORY)
    cheapest_ticket = tickets.order_by('price').first()
    ticket_rbi = nonvat_price(cheapest_ticket)
    return sum(
        (nonvat_price(ticket) - ticket_rbi
         for ticket in invoice.lineitem_set.filter(product__in=tickets)),
        Decimal(0)).quantize(CENTS_QUANT)


# TODO: include van/de/van der/de la/etc etc etc

@register.simple_tag
def name_split(name, split_characters=None):

    tokens = name.split()
    if split_characters is None or len(name) > split_characters:
        even_split = int((len(tokens) + 1) / 2)  # Round up.
    else:
        even_split = len(tokens)

    return {
        "first" : " ".join(tokens[:even_split]),
        "last" : " ".join(tokens[even_split:]),
    }

@register.simple_tag
def company_split(name):
    f =  name_split(name, 18)
    return f


@register.simple_tag(takes_context=True)
def special(context, user):
    organiser = user.groups.filter(name='Conference organisers').exists()
    try:
        speaker = user.speaker_profile.presentations.count() != 0
    except Exception:
        speaker = False
    tt = ticket_type(context)
    volunteer = "Volunteer" in tt

    if organiser:
        return "Organizer"
    elif speaker or "Speaker" in tt:
        return "Speaker"
    elif volunteer:
        return "Staff"
    else:
        return ""


CLEARED = set([
    "BeeWare Project",
    "Project Jupyter",
    "PSF Packaging WG / PyCon 2018 Chair",
    "PyCon Ukraine",
    "PyLadies PDX",
    "Recovered Silver",
    "Twisted",
    "@vmbrasseur",
])

@register.simple_tag
def affiliation(ticket, user):
    aff = user.attendee.attendeeprofilebase.attendeeprofile.company
    if "Individual" not in ticket or "Sponsor" in ticket:
        return aff
    elif ticket == "Individual Supporter" and aff in CLEARED:
        return aff
    else:
        return ""


@register.simple_tag(takes_context=True)
def ticket_type(context):

    items = registrasion_tags.items_purchased(context)
    for item in items:
        if item.product.category.name == "Ticket":
            return item.product.name