def test_completed(self): """ overdue step in two memberships (different members) """ now = timezone.now() step = models.Step(donor_id=self.donor1, date=now - timedelta(days=3), completed=now) step.save() step = models.Step(donor_id=self.donor3, date=now - timedelta(days=9), completed=now) step.save() self.assertEqual(len(mail.outbox), 0) response = self.client.get(self.url, follow=True) self.assertEqual(response.status_code, 200) self.assertEqual(len(mail.outbox), 0)
def test_same_member(self): """ overdue step in two memberships for same member """ donor = models.Donor(membership_id=self.post_id, firstname='Other') donor.save() step = models.Step(donor_id=self.donor1, date=timezone.now() - timedelta(days=3)) step.save() step = models.Step(donor=donor, date=timezone.now() - timedelta(days=9)) step.save() self.assertEqual(len(mail.outbox), 0) response = self.client.get(self.url, follow=True) self.assertEqual(response.status_code, 200) self.assertEqual(len(mail.outbox), 2)
def test_several_per_donor(self): """ Two overdue steps for one membership; expect only one email """ step = models.Step(donor_id=self.donor1, date=timezone.now() - timedelta(days=3)) step.save() step = models.Step(donor_id=self.donor2, date=timezone.now() - timedelta(days=9)) step.save() self.assertEqual(len(mail.outbox), 0) response = self.client.get(self.url, follow=True) self.assertEqual(response.status_code, 200) self.assertEqual(len(mail.outbox), 1) membership = models.Membership.objects.get(pk=self.pre_id) self.assertEqual(membership.emailed.day, datetime.today().day) # stored in UTC
def test_several(self): """ overdue step in two memberships (different members) """ step = models.Step(donor_id=self.donor1, date=timezone.now() - timedelta(days=3)) step.save() step = models.Step(donor_id=self.donor3, date=timezone.now() - timedelta(days=9)) step.save() self.assertEqual(len(mail.outbox), 0) response = self.client.get(self.url, follow=True) self.assertEqual(response.status_code, 200) self.assertEqual(len(mail.outbox), 2) # doesn't send emails again response = self.client.get(self.url, follow=True) self.assertEqual(response.status_code, 200) self.assertEqual(len(mail.outbox), 2)
def add_mult_step(request): initial_form_data = [] # list of dicts for form initial donor_list = [] # list of donors for zipping to formset size = 0 membership = request.membership suggested = membership.giving_project.get_suggested_steps() for donor in membership.donor_set.order_by('-added'): if donor.received( ) == 0 and donor.promised is None and donor.get_next_step() is None: initial_form_data.append({'donor': donor}) donor_list.append(donor) size = size + 1 if size > 9: break step_formset = formset_factory(forms.MassStep, extra=0) if request.method == 'POST': membership.last_activity = timezone.now() membership.save(skip=True) formset = step_formset(request.POST) logger.debug('Multiple steps - posted: ' + str(request.POST)) if formset.is_valid(): logger.debug( 'Multiple steps - is_valid passed, cycling through forms') for form in formset.cleaned_data: if form: step = models.Step(donor=form['donor'], date=form['date'], description=form['description']) step.save() logger.info('Multiple steps - step created') return HttpResponse("success") else: logger.info('Multiple steps invalid') else: # GET formset = step_formset(initial=initial_form_data) logger.debug('Multiple steps - loading initial formset, size %s', size) formset_with_donors = zip(formset, donor_list) return render( request, 'fund/forms/add_mult_step.html', { 'size': size, 'formset': formset, 'fd': formset_with_donors, 'multi': True, 'suggested': suggested })
def setup_member(self, member): self.member_id = member.pk post_gp = models.GivingProject.objects.get(title="Post training") post_ship = models.Membership(giving_project=post_gp, member=member, approved=True) post_ship.save() if member.first_name == 'current': self.ship_id = post_ship.pk member.current = post_ship.pk member.save() # create donor & step donor = models.Donor(membership=post_ship, firstname='Anna', amount=500, talked=True, likelihood=50) donor.save() step = models.Step(donor=donor, description='Talk to about project', created=timezone.now(), date='2013-04-06') step.save() self.donor_id = donor.pk self.step_id = step.pk elif member.first_name == 'new': self.post_id = post_ship.pk pre_gp = models.GivingProject.objects.get(title='Pre training') pre_ship = models.Membership(giving_project=pre_gp, member=member, approved=True) pre_ship.save() self.pre_id = self.ship_id = pre_ship.pk member.current = pre_ship.pk member.save() else: raise Exception('setup_member got unexpected name: {}'.format( member.first_name))
def test_basic(self): # membership with a few donors, some progress self.login_as_member('new') ship_id = self.post_id # first donor donor = models.Donor(membership_id=ship_id, firstname='Alice', amount=240, likelihood=75, talked=True) donor.save() step = models.Step(donor=donor, date='2015-04-01', description='Talk', completed='2015-04-01') step.save() step = models.Step(donor=donor, date='2015-5-25', description='Ask') step.save() # second donor donor = models.Donor(membership_id=ship_id, firstname='Bab', talked=True, amount=300, likelihood=50, asked=True, promised=300, received_this=100, received_next=100) donor.save() step = models.Step(donor=donor, date='2015-04-01', description='Ask', completed='2015-04-01', asked=True) step.save() step = models.Step(donor=donor, date='2015-04-08', description='Follow upt', completed='2015-04-08', promised=300) step.save() step = models.Step(donor=donor, date='2015-5-25', description='Thank') step.save() donors = models.Donor.objects.filter( membership_id=ship_id).prefetch_related('step_set') progress, incomplete_steps = _compile_membership_progress(donors) self.assertIsInstance(progress, dict) self.assertEqual(progress['estimated'], 330) self.assertEqual(progress['contacts'], 2) self.assertEqual(progress['asked'], 1) self.assertEqual(progress['talked'], 1) self.assertEqual(progress['promised'], 100) self.assertEqual(progress['received'], 200) self.assertEqual(progress['contacts_remaining'], 0) self.assertEqual(progress['togo'], 30) self.assertEqual(len(incomplete_steps), 2) for donor in donors: self.assertIsInstance(donor.next_step, models.Step) self.assertIs(type(donor.completed_steps), list) self.assertTrue(len(donor.completed_steps) > 0)