예제 #1
0
def cabin_visit(product_data, user):
    # Create an order with a cabin settlement product
    order = Order(
        amount=0, # Default to 0 and update to correct amount later
        language_code=product_data['språk'],
    )
    if not user.is_anonymous():
        order.user = user
    order.save() # Save to DB in order to create relations, even though we'll have to do an UPDATE later

    cabin_settlement = CabinSettlement(order=order)
    if 'brukerdata' in product_data:
        cabin_settlement.name = product_data['brukerdata']['navn']
        cabin_settlement.email = product_data['brukerdata']['epost']
    cabin_settlement.save()

    amount = 0
    for cabin in product_data['hytter']:
        sted = Sted.get(cabin['id'])
        # @TODO: Use private fields to get the appropriate owner: first forening of privat.juridisk_eier,
        # privat.vedlikeholdes_av
        forening = Forening.objects.get(turbasen_object_id=sted['grupper'][0])

        cabin_visit = CabinVisit(
            cabin_settlement=cabin_settlement,
            cabin_object_id=sted['_id'],
        )
        cabin_visit.save()

        for losji in cabin['losji']:
            # Business rule: Anyone claiming to be a member will get the membership price
            pays_membership_price = losji['ermedlem']

            lodging = Lodging.objects.get(
                id=losji['id'],
                forening=forening.id,
            )

            if losji['antall'] < 0:
                raise PermissionDenied

            # Try to relate this visitor to a user
            user = None
            memberid_unrecognized = None
            if losji['medlemsnummer'] is not None:
                try:
                    user = User.get_or_create_inactive(memberid=losji['medlemsnummer'])
                    # Note that this is where we could verify that the member has paid their annual fee, but it is
                    # currently ignored
                except User.DoesNotExist:
                    # We received an unrecognized memberid, but we'll still allow the purchase, so save the given
                    # memberid for future reference, whatever it is
                    memberid_unrecognized = losji['medlemsnummer']

            # Save the visitor details
            cabin_visitor = CabinVisitor(
                cabin_visit=cabin_visit,
                protocol_number=losji['protokollnummer'],
                user=user,
                memberid_unrecognized=memberid_unrecognized,
                lodging_type=lodging.name,
                price=lodging.get_price(pays_membership_price),
                nights=losji['antall'],
                paid_membership_price=pays_membership_price,
            )
            cabin_visitor.save()

            # Now calculate the lodging price and add it to the total amount
            amount += lodging.get_price(pays_membership_price) * losji['antall']

        for proviant in cabin['proviant']:
            # Business rule: The client decides whether or not supplies should have membership price
            pays_membership_price = product_data['medlemspris']

            supply = Supply.objects.get(
                id=proviant['id'],
                supply_category__forening=forening.id,
            )

            if proviant['antall'] < 0:
                raise PermissionDenied

            # Save a copy of the current products and prices
            supply_purchase = SupplyPurchase(
                cabin_visit=cabin_visit,
                category=supply.supply_category.name,
                name=supply.name,
                price=supply.get_price(pays_membership_price),
                count=proviant['antall'],
                paid_membership_price=pays_membership_price,
            )
            supply_purchase.save()

            # Now calculate the supplies price and add it to the total amount
            amount += supply.get_price(pays_membership_price) * proviant['antall']

    # Save the total amount in øre
    amount *= 100
    order.amount = amount
    order.save()
    return order
예제 #2
0
def prices(request, version, format):
    def format_prices(forening, lang):
        return {
            'overnatting': [{
                'id': lodging.id,
                'navn': lodging.name_eng if lang == 'en' else lodging.name,
                'pris_medlem': lodging.price_member,
                'pris_ikkemedlem': lodging.price_nonmember,
            } for lodging in forening.lodging_prices.all()],

            'proviant': [{
                supply_category.name_eng if lang == 'en' else supply_category.name: [{
                    'id': supply.id,
                    'navn': supply.name_eng if lang == 'en' else supply.name,
                    'pris_medlem': supply.price_member,
                    'pris_ikkemedlem': supply.price_nonmember,
                } for supply in supply_category.supplies.all()]
            } for supply_category in forening.supply_categories.all()]
        }

    librato.increment('sherpa.api.tailored.priser.request')

    if request.method != 'GET':
        librato.increment('sherpa.api.tailored.priser.response.400')
        raise BadRequest(
            "Unsupported HTTP verb '%s'" % request.method,
            code=error_codes.UNSUPPORTED_HTTP_VERB,
            http_code=400,
        )

    if request.GET.get('språk', 'nb').lower().startswith('en'):
        lang = 'en'
    else:
        lang = 'nb'

    if 'forening' in request.GET:
        try:
            forening = Forening.objects.get(turbasen_object_id=request.GET['forening'])
            return HttpResponse(json.dumps(format_prices(forening, lang)))
        except Forening.DoesNotExist:
            librato.increment('sherpa.api.tailored.priser.response.404')
            raise BadRequest(
                "A forening with object id '%s', does not exist." % request.GET['forening'],
                code=error_codes.RESOURCE_NOT_FOUND,
                http_code=404,
            )
    elif 'hytte' in request.GET:
        try:
            sted = Sted.get(request.GET['hytte'])
            # @TODO: Use private fields to get the appropriate owner: first forening of privat.juridisk_eier,
            # privat.vedlikeholdes_av
            forening = Forening.objects.get(turbasen_object_id=sted['grupper'][0])
            librato.increment('sherpa.api.tailored.priser.response.200')
            return HttpResponse(json.dumps(format_prices(forening, lang)))
        except DocumentNotFound:
            librato.increment('sherpa.api.tailored.priser.response.404')
            raise BadRequest(
                "A cabin with object id '%s', does not exist." % request.GET['hytte'],
                code=error_codes.RESOURCE_NOT_FOUND,
                http_code=404,
            )
    else:
        librato.increment('sherpa.api.tailored.priser.response.200')
        return HttpResponse(json.dumps([{
            'object_id': forening.turbasen_object_id,
            'navn': forening.name,
            'priser': format_prices(forening, lang),
        } for forening in Forening.objects.filter(type='forening')]))
예제 #3
0
 def get_cabin(self):
     return Sted.get(self.cabin_object_id)