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))
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()
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
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()
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']
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 )
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'], ]
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)