示例#1
0
 def has_membership_type(self, codename):
     """Returns True if this member has the Focus membership type service of
     the given codename. Note: Don't call this with the 'household'
     membership type; having the membership type is NOT the only definition
     of a household member. Call `is_related_household_member` instead."""
     return (self.membership_type()
             == get_membership_type_by_codename(codename))
示例#2
0
    def setUp(self):
        self.actor = actor(memberid=123)
        self.actor.save()
        self.zipcode = zipcode()
        self.zipcode.save()
        self.actor_address = actor_address(self.actor, self.zipcode)
        self.actor_address.country_code = 'SE'
        self.actor_address.save()

        actor_service(actor=self.actor, code=get_membership_type_by_codename('main')['code']).save()
        actor_service(actor=self.actor, code=FOREIGN_POSTAGE_SERVICE_CODES[0]).save()
示例#3
0
    def get_children_pending(self):
        """Returns existing single members who are *due to become* family members in this users' family"""
        from user.models import User

        children_pending = cache.get('actor.%s.children_pending' % self.actor.memberid)
        if children_pending is None:
            actors = Actor.get_personal_members().filter(
                pending_family_parent=self.actor.memberid,
            ).exclude(
                memberid=self.actor.memberid,
            ).exclude(
                # Exclude any actual family members. This is necessary because Focus doesn't clear the appropriate
                # fields when converting pending family members to actual family members.
                Q(services__code=get_membership_type_by_codename('family_household')['code']) |
                Q(services__code=get_membership_type_by_codename('family_primary')['code'])
            ).order_by('first_name', 'last_name')
            children_pending = [User.get_or_create_inactive(memberid=actor.memberid) for actor in actors]
            cache.set(
                'actor.%s.children_pending' % self.actor.memberid,
                children_pending,
                settings.FOCUS_MEMBER_CACHE_PERIOD,
            )
        return children_pending
示例#4
0
    def setUp(self):
        self.user_parent = user_member(memberid=100)
        self.user_parent.save()
        self.actor_parent = actor(memberid=self.user_parent.memberid)
        self.actor_parent.save()
        family_primary = get_membership_type_by_codename('family_primary')
        actor_service(actor=self.actor_parent, code=family_primary['code']).save()

        self.user_child1 = user_member(memberid=101)
        self.user_child1.save()
        self.actor_child1 = actor(memberid=self.user_child1.memberid)
        self.actor_child1.parent = self.actor_parent.memberid
        self.actor_child1.save()
        family_household = get_membership_type_by_codename('family_household')
        actor_service(actor=self.actor_child1, code=family_household['code']).save()

        self.user_child2 = user_member(memberid=102)
        self.user_child2.save()
        self.actor_child2 = actor(memberid=self.user_child2.memberid)
        self.actor_child2.parent = self.actor_parent.memberid
        self.actor_child2.save()
        self.actor_child2_service = actor_service(actor=self.actor_child2, code=family_household['code'])
        self.actor_child2_service.save()
示例#5
0
 def focus_type(self):
     if self.enrollment.relation_type == 'family':
         if self.is_related_member():
             return get_membership_type_by_codename('family_household')['code']
         else:
             return get_membership_type_by_codename('family_primary')['code']
     else:
         if self.is_related_member() and self.household_offer_is_cheaper():
             return get_membership_type_by_codename('household')['code']
         elif self.get_age() >= settings.MEMBERSHIP['AGES']['SENIOR']:
             return get_membership_type_by_codename('senior')['code']
         elif self.get_age() >= settings.MEMBERSHIP['AGES']['MAIN']:
             return get_membership_type_by_codename('main')['code']
         elif self.get_age() >= settings.MEMBERSHIP['AGES']['YOUTH']:
             return get_membership_type_by_codename('youth')['code']
         elif self.get_age() >= settings.MEMBERSHIP['AGES']['SCHOOL']:
             return get_membership_type_by_codename('school')['code']
         else:
             return get_membership_type_by_codename('child')['code']
示例#6
0
def verification(request):
    enrollment = get_or_create_enrollment(request)

    if enrollment.state == 'payment':
        # Payment has been initiated but the user goes back here - why?
        # Reset the state and let them reinitiate payment when they're ready.
        enrollment.state = 'registration'
        enrollment.save()
    elif enrollment.state == 'complete':
        # A previous registration has been completed, so why would the user come directly here?
        # Just redirect them back to registration which will restart a new registration.
        return redirect("enrollment:registration")

    # If existing member is specified, save details and change to that address
    existing_name = ''
    if enrollment.existing_memberid != '':
        user = User.get_or_create_inactive(memberid=enrollment.existing_memberid)
        existing_name = user.get_full_name()
        enrollment.country = user.address.country.code
        if user.address.country.code == 'NO':
            enrollment.address1 = user.address.field1
        elif user.address.country.code in ['DK', 'SE']:
            # Don't change the user-provided address.
            # The user might potentially provide a different address than the existing member, which isn't allowed,
            # but this is preferable to trying to parse the existing address into zipcode, area etc. In order to
            # enforce the same address, the address logic for DK and SE in enrollment.User.save_to_focus would have to
            # be rewritten.
            pass
        else:
            # Uppercase the country code as Focus doesn't use consistent casing
            enrollment.country = user.address.country.code
            enrollment.address1 = user.address.field1
            enrollment.address2 = user.address.field2
            enrollment.address3 = user.address.field3

    # Get the area name for this zipcode
    if enrollment.country == 'NO':
        enrollment.area = Zipcode.get_by_zipcode(zipcode=enrollment.zipcode).area

    # Figure out which forening this member/these members will belong to
    if enrollment.existing_memberid != '':
        # Use main members' forening if applicable
        existing_user = User.get_or_create_inactive(memberid=enrollment.existing_memberid)
        forening = existing_user.main_forening(convert_dnt_oslo_for_youth=False)
    else:
        if enrollment.country == 'NO':
            focus_forening_id = cache.get('focus.zipcode_forening.%s' % enrollment.zipcode)
            if focus_forening_id is None:
                focus_forening_id = FocusZipcode.objects.get(zipcode=enrollment.zipcode).main_forening_id
                cache.set('focus.zipcode_forening.%s' % enrollment.zipcode, focus_forening_id, 60 * 60 * 24 * 7)
            forening = cache.get('forening.focus.%s' % focus_forening_id)
            if forening is None:
                forening = Forening.objects.get(focus_id=focus_forening_id)
                cache.set('forening.focus.%s' % focus_forening_id, forening, 60 * 60 * 24 * 7)
        else:
            # Foreign members are registered with DNT Oslo og Omegn
            forening = cache.get('forening.%s' % Forening.DNT_OSLO_ID)
            if forening is None:
                forening = Forening.objects.get(id=Forening.DNT_OSLO_ID)
                cache.set('forening.%s' % Forening.DNT_OSLO_ID, forening, 60 * 60 * 24 * 7)
    enrollment.forening = forening
    enrollment.save()

    context = {
        'enrollment': enrollment,
        'existing_name': existing_name,
        'age_senior': settings.MEMBERSHIP['AGES']['SENIOR'],
        'age_main': settings.MEMBERSHIP['AGES']['MAIN'],
        'age_youth': settings.MEMBERSHIP['AGES']['YOUTH'],
        'age_school': settings.MEMBERSHIP['AGES']['SCHOOL'],
        'membership_type_names': {
            'family_primary': get_membership_type_by_codename('family_primary')['name'],
            'main': get_membership_type_by_codename('main')['name'],
            'youth': get_membership_type_by_codename('youth')['name'],
            'senior': get_membership_type_by_codename('senior')['name'],
            'child': get_membership_type_by_codename('child')['name'],
            'school': get_membership_type_by_codename('school')['name'],
            'household': get_membership_type_by_codename('household')['name'],
            'family_household': get_membership_type_by_codename('family_household')['name'],
        },
        'foreign_shipment_price': FOREIGN_SHIPMENT_PRICE,
    }
    context.update(current_template_layout(request))
    return render(request, 'central/enrollment/verification.html', context)
def membership_price(request, version, format):
    if request.method == 'GET':
        require_focus(request)
        librato.increment('sherpa.api.tailored.medlemskapspris.request')

        if not 'postnummer' in request.GET:
            librato.increment('sherpa.api.tailored.medlemskapspris.response.400')
            raise BadRequest(
                "Missing required 'postnummer' parameter",
                code=error_codes.MISSING_REQUIRED_PARAMETER,
                http_code=400
            )

        try:
            # Get focus zipcode-forening ID
            focus_forening_id = cache.get('focus.zipcode_forening.%s' % request.GET['postnummer'])
            if focus_forening_id is None:
                focus_forening_id = FocusZipcode.objects.get(zipcode=request.GET['postnummer']).main_forening_id
                cache.set('focus.zipcode_forening.%s' % request.GET['postnummer'], focus_forening_id, 60 * 60 * 24 * 7)

            # Get forening based on zipcode-ID
            forening = Forening.objects.get(focus_id=focus_forening_id)
            price = forening.get_focus_price()

            # Success, return the appropriate data
            librato.increment('sherpa.api.tailored.medlemskapspris.response.200')
            return HttpResponse(json.dumps({
                'forening': {'sherpa_id': forening.id, 'navn': forening.name},
                'pristabell': {
                    'main': {
                        'navn': str(get_membership_type_by_codename('main')['name']),
                        'pris': price.main,
                    },
                    'youth': {
                        'navn': str(get_membership_type_by_codename('youth')['name']),
                        'pris': price.youth,
                    },
                    'senior': {
                        'navn': str(get_membership_type_by_codename('senior')['name']),
                        'pris': price.senior,
                    },
                    'lifelong': {
                        'navn': str(get_membership_type_by_codename('lifelong')['name']),
                        'pris': price.lifelong,
                    },
                    'child': {
                        'navn': str(get_membership_type_by_codename('child')['name']),
                        'pris': price.child,
                    },
                    'school': {
                        'navn': str(get_membership_type_by_codename('school')['name']),
                        'pris': price.school,
                    },
                    'household': {
                        'navn': str(get_membership_type_by_codename('household')['name']),
                        'pris': price.household,
                    },
                }
            }))

        except FocusZipcode.DoesNotExist:
            # The Zipcode doesn't exist in Focus, but if it exists in our Zipcode model, Focus is just not updated
            if Zipcode.objects.filter(zipcode=request.GET['postnummer']).exists():
                logger.warning(
                    "Postnummer finnes i Zipcode, men ikke i Focus!",
                    exc_info=sys.exc_info(),
                    extra={
                        'request': request,
                        'postnummer': request.GET['postnummer']
                    }
                )
                librato.increment('sherpa.api.tailored.medlemskapspris.response.404')
                raise BadRequest(
                    "The postal code '%s' exists, but isn't connected to a Forening. It should be, and we've logged this occurrence." %
                        request.GET['postnummer'],
                    code=error_codes.RESOURCE_NOT_FOUND,
                    http_code=404
                )
            else:
                # This *could* be an entirely new Zipcode, or just an invalid one.
                librato.increment('sherpa.api.tailored.medlemskapspris.response.404')
                raise BadRequest(
                    "The postal code '%s' isn't registered in our database." %
                        request.GET['postnummer'],
                    code=error_codes.RESOURCE_NOT_FOUND,
                    http_code=404
                )

        except Forening.DoesNotExist:
            logger.warning(
                "Focus-postnummer mangler foreningstilknytning!",
                exc_info=sys.exc_info(),
                extra={'request': request}
            )
            librato.increment('sherpa.api.tailored.medlemskapspris.response.404')
            raise BadRequest(
                "The postal code '%s' exists, but isn't connected to a Forening. It should be, and we've logged this occurrence." %
                    request.GET['postnummer'],
                code=error_codes.RESOURCE_NOT_FOUND,
                http_code=404
            )

    else:
        librato.increment('sherpa.api.tailored.medlemskapspris.response.400')
        raise BadRequest(
            "Unsupported HTTP verb",
            code=error_codes.UNSUPPORTED_HTTP_VERB,
            http_code=400
        )
示例#8
0
 def is_family_member(self):
     """Returns True if this member is part of a family membership"""
     return self.enrollment.get_type() in [
         get_membership_type_by_codename('family_primary')['code'],
         get_membership_type_by_codename('family_household')['code'],
     ]
示例#9
0
文件: views.py 项目: simensma/sherpa
def verification(request):
    enrollment = get_or_create_enrollment(request)

    validation = validate(enrollment, require_location=True, require_existing=True)
    if not validation['valid']:
        if 'message' in validation:
            messages.error(request, validation['message'])
        return redirect(*validation['redirect'])

    if enrollment.state == 'payment':
        # Payment has been initiated but the user goes back here - why?
        # Reset the state and let them reinitiate payment when they're ready.
        enrollment.state = 'registration'
        enrollment.save()
    elif enrollment.state == 'complete':
        # A previous registration has been completed, so why would the user come directly here?
        # Just redirect them back to registration which will restart a new registration.
        return redirect("enrollment.views.registration")

    # If existing member is specified, save details and change to that address
    existing_name = ''
    if enrollment.existing_memberid != '':
        actor = Actor.get_personal_members().get(memberid=enrollment.existing_memberid)
        existing_name = "%s %s" % (actor.first_name, actor.last_name)
        enrollment.country = actor.get_clean_address().country.code
        if actor.get_clean_address().country.code == 'NO':
            enrollment.address1 = actor.get_clean_address().field1
        elif actor.get_clean_address().country.code == 'DK' or actor.get_clean_address().country.code == 'SE':
            # Don't change the user-provided address.
            # The user might potentially provide a different address than the existing
            # member, which isn't allowed, but this is preferable to trying to parse the
            # existing address into zipcode, area etc.
            # In order to enforce the same address, the address logic for DK and SE in
            # add_focus_user would have to be rewritten.
            pass
        else:
            # Uppercase the country code as Focus doesn't use consistent casing
            enrollment.country = actor.get_clean_address().country.code
            enrollment.address1 = actor.get_clean_address().field1
            enrollment.address2 = actor.get_clean_address().field2
            enrollment.address3 = actor.get_clean_address().field3

    # Get the area name for this zipcode
    if enrollment.country == 'NO':
        enrollment.area = Zipcode.objects.get(zipcode=enrollment.zipcode).area

    # Figure out which forening this member/these members will belong to
    if enrollment.existing_memberid != '':
        # Use main members' forening if applicable
        focus_forening_id = Actor.get_personal_members().get(memberid=enrollment.existing_memberid).main_forening_id
        forening = cache.get('forening.focus.%s' % focus_forening_id)
        if forening is None:
            forening = Forening.objects.get(focus_id=focus_forening_id)
            cache.set('forening.focus.%s' % focus_forening_id, forening, 60 * 60 * 24 * 7)
    else:
        if enrollment.country == 'NO':
            focus_forening_id = cache.get('focus.zipcode_forening.%s' % enrollment.zipcode)
            if focus_forening_id is None:
                focus_forening_id = FocusZipcode.objects.get(zipcode=enrollment.zipcode).main_forening_id
                cache.set('focus.zipcode_forening.%s' % enrollment.zipcode, focus_forening_id, 60 * 60 * 24 * 7)
            forening = cache.get('forening.focus.%s' % focus_forening_id)
            if forening is None:
                forening = Forening.objects.get(focus_id=focus_forening_id)
                cache.set('forening.focus.%s' % focus_forening_id, forening, 60 * 60 * 24 * 7)
        else:
            # Foreign members are registered with DNT Oslo og Omegn
            forening = cache.get('forening.%s' % Forening.DNT_OSLO_ID)
            if forening is None:
                forening = Forening.objects.get(id=Forening.DNT_OSLO_ID)
                cache.set('forening.%s' % Forening.DNT_OSLO_ID, forening, 60 * 60 * 24 * 7)
    enrollment.forening = forening
    enrollment.save()

    keycount = 0
    youth_or_older_count = 0
    main = None
    for user in enrollment.users.all():
        if main is None or (user.get_age() < main.get_age() and user.get_age() >= AGE_YOUTH):
            # The cheapest option will be to set the youngest member, 19 or older, as main member
            main = user
        if user.get_age() >= AGE_YOUTH:
            youth_or_older_count += 1
        if user.key:
            keycount += 1
    keyprice = keycount * KEY_PRICE
    multiple_main = youth_or_older_count > 1
    context = {
        'enrollment': enrollment,
        'existing_name': existing_name,
        'keycount': keycount,
        'keyprice': keyprice,
        'multiple_main': multiple_main,
        'main': main,
        'age_senior': AGE_SENIOR,
        'age_main': AGE_MAIN,
        'age_youth': AGE_YOUTH,
        'age_school': AGE_SCHOOL,
        'membership_type_names': {
            'senior': get_membership_type_by_codename('senior')['name'],
            'main': get_membership_type_by_codename('main')['name'],
            'youth': get_membership_type_by_codename('youth')['name'],
            'school': get_membership_type_by_codename('school')['name'],
            'child': get_membership_type_by_codename('child')['name'],
            'household': get_membership_type_by_codename('household')['name'],
        },
        'foreign_shipment_price': FOREIGN_SHIPMENT_PRICE,
    }
    context.update(current_template_layout(request))
    return render(request, 'central/enrollment/verification.html', context)