def onMemberJoined(obj, event): memberid = obj.getId() portal = obj.restrictedTraverse('@@plone_portal_state').portal() products_and_services = portal._getOb('products_and_services') dao = MemberServicesDataAccess(obj) intids = queryUtility(IIntIds, context=obj) # 30 days free trial with 2 questions today = datetime.date.today() trialend = today + datetime.timedelta(days=30) intelligent_practice_services = ( 'maths-grade10-monthly-practice', 'maths-grade11-monthly-practice', 'maths-grade12-monthly-practice', 'science-grade10-monthly-practice', 'science-grade11-monthly-practice', 'science-grade12-monthly-practice', ) for sid in intelligent_practice_services: related_service = products_and_services[sid] mstitle = '%s for %s' % (related_service.title, memberid) props = {'memberid': memberid, 'title': mstitle, 'related_service_id': intids.getId(related_service), 'expiry_date': trialend, 'service_type': related_service.service_type} ms = dao.add_memberservice(**props) getUtility(IUserCatalog).index(obj)
def add_memberservice(self, related_service, memberid): now = datetime.now().date() dao = MemberServicesDataAccess(self.portal) mstitle = '%s for %s' % (related_service.title, memberid) props = {'memberid': memberid, 'title': mstitle, 'related_service_id': dao.intids.getId(related_service), 'expiry_date': now, 'service_type': related_service.service_type} ms = dao.add_memberservice(**props) return ms
def onOrderPaid(order, event): """ Once the order is paid we create the memberservices. """ if event.action == 'pay': portal = getToolByName(order, 'portal_url').getPortalObject() intids = queryUtility(IIntIds, context=portal) dao = MemberServicesDataAccess(portal) # we cannot use the authenticated user since an admin user might # trigger the workflow. memberid = order.userid now = datetime.datetime.now().date() # grab the services from the orderitems for item in order.order_items(): # try to find the memberservices based on the orderitem # related services. order_related_service = item.related_item.to_object related_service_ids = [intids.getId(order_related_service)] # filter out services that don't have subject or grade set, # eg. discounts service_purchased = item.related_item.to_object if not (service_purchased.grade and service_purchased.subject): continue # add the service siyavula.memberservices uses for trial access related_service_ids.append( service_subject_ids[order_related_service.subject][0] ) memberservices = dao.get_memberservices( related_service_ids, memberid ) tmpservices = [] for ms in memberservices: related_service = ms.related_service(order) if (related_service.subject == service_purchased.subject and related_service.access_path == \ service_purchased.access_path): tmpservices.append(ms) # create a new memberservice if it doesn't exist if len(memberservices) == 0: mstitle = '%s for %s' % (order_related_service.title, memberid) props = {'memberid': memberid, 'title': mstitle, 'related_service_id': intids.getId(order_related_service), 'expiry_date': now, 'service_type': order_related_service.service_type} ms = dao.add_memberservice(**props) tmpservices.append(ms) # update the memberservices with info from the orderitem for ms in tmpservices: # NOTE: remove this when we remove siyavula.what if order_related_service.service_type == 'credit': credits = ms.credits credits += order_related_service.amount_of_credits ms.credits = credits elif order_related_service.service_type == 'subscription': # Always use the current expiry date if it is greater than # 'now', since that gives the user everything he paid for. # Only use 'now' if the related_service has already expired, so we # don't give the user more than he paid for. if now > ms.expiry_date: ms.expiry_date = now expiry_date = ms.expiry_date + datetime.timedelta( order_related_service.subscription_period ) ms.expiry_date = expiry_date dao.update_memberservice(ms) # if we have specific access groups add the user to those here. access_group = order_related_service.access_group if access_group: gt = getToolByName(order, 'portal_groups') # now add the member to the correct group gt.addPrincipalToGroup(memberid, access_group)
class TestMemberServicesIntegration(unittest.TestCase): """Unit test for the MemberService type """ layer = INTEGRATION_TESTING def setUp(self): self.portal = self.layer['portal'] self.services = self.portal._getOb('products_and_services') self.intids = queryUtility(IIntIds, context=self.portal) self.dao = MemberServicesDataAccess(self.portal) setRoles(self.portal, TEST_USER_ID, ['Member']) self.session = SESSION() def tearDown(self): count = self.session.query(MemberService).filter( MemberService.memberid == TEST_USER_ID ).delete() print 'Deleted %s' % count transaction.commit() def test_get_all_memberservices(self): db_ms = self.session.query(MemberService).all() all_ms = self.dao.get_all_memberservices() self.assertEquals(len(db_ms), len(all_ms)) self.assertEquals(all_ms, db_ms) def test_get_memberservices(self): service = self.services.objectValues()[0] ms_args = self.get_ms_args(service, TEST_USER_ID) ms1 = self.dao.add_memberservice(**ms_args) self.session.flush() ms1_db = self.get_memberservice(ms1.id) service_uids = [self.intids.getId(service),] memberid = TEST_USER_ID memberservices = \ self.dao.get_memberservices(service_uids, memberid) self.assertEquals(memberservices, [ms1_db]) def test_get_memberservices_by_subject(self): maths_services = \ [s for s in self.services.objectValues() if 'maths' in s.subject] for count in range(0,3): service = maths_services[count] ms_args = self.get_ms_args(service, TEST_USER_ID) self.dao.add_memberservice(**ms_args) self.session.flush() science_services = \ [s for s in self.services.objectValues() if 'science' in s.subject] for count in range(0,3): service = science_services[count] ms_args = self.get_ms_args(service, TEST_USER_ID) self.dao.add_memberservice(**ms_args) self.session.flush() memberservices = \ self.dao.get_memberservices_by_subject(TEST_USER_ID, 'maths') self.assertEqual(len(memberservices), 3) memberservices = \ self.dao.get_memberservices_by_subject(TEST_USER_ID, 'science') self.assertEqual(len(memberservices), 3) def test_get_memberservices_by_grade(self): grade_10_services = \ [s for s in self.services.objectValues() if s.grade == 'grade-10'] for count in range(0,3): service = grade_10_services[count] ms_args = self.get_ms_args(service, TEST_USER_ID) self.dao.add_memberservice(**ms_args) self.session.flush() memberservices = \ self.dao.get_memberservices_by_grade(TEST_USER_ID, 'grade-10') self.assertEqual(len(memberservices), 3) def test_get_memberservices_by_subject_and_grade(self): grade_10_maths_services = \ [s for s in self.services.objectValues() if s.grade == 'grade-10'] grade_10_maths_services = \ [s for s in grade_10_maths_services if 'maths' in s.subject] for count in range(0,3): service = grade_10_maths_services[count] ms_args = self.get_ms_args(service, TEST_USER_ID) self.dao.add_memberservice(**ms_args) self.session.flush() memberservices = \ self.dao.get_memberservices_by_subject_and_grade(TEST_USER_ID, 'maths', 'grade-10') self.assertEqual(len(memberservices), 3) memberservices = \ self.dao.get_memberservices_by_subject_and_grade(TEST_USER_ID, 'science', 'grade-10') self.assertEqual(len(memberservices), 0) def test_get_active_memberservices(self): for count in range(0,3): service = self.services.objectValues()[count] ms_args = self.get_ms_args(service, TEST_USER_ID) self.dao.add_memberservice(**ms_args) self.session.flush() now = datetime.now().date() td = timedelta(1) yesterday = now - td for count in range(3,6): service = self.services.objectValues()[count] ms_args = self.get_ms_args(service, TEST_USER_ID) ms_args['expiry_date'] = yesterday self.dao.add_memberservice(**ms_args) self.session.flush() active_memberservices = self.dao.get_active_memberservices(TEST_USER_ID) self.assertEquals(len(active_memberservices), 3) for ms in active_memberservices: self.assertEquals(ms.expiry_date, now) def test_get_active_memberservices_by_subject(self): now = datetime.now().date() td = timedelta(1) yesterday = now - td services = \ [s for s in self.services.objectValues() if 'maths' in s.subject] for count in range(0,3): service = services[count] ms_args = self.get_ms_args(service, TEST_USER_ID) ms_args['expiry_date'] = now self.dao.add_memberservice(**ms_args) self.session.flush() services = \ [s for s in self.services.objectValues() if 'science' in s.subject] for count in range(0,3): service = services[count] ms_args = self.get_ms_args(service, TEST_USER_ID) ms_args['expiry_date'] = yesterday self.dao.add_memberservice(**ms_args) self.session.flush() memberservices = \ self.dao.get_active_memberservices_by_subject(TEST_USER_ID, 'maths') self.assertEqual(len(memberservices), 3) for ms in memberservices: self.assertEquals(ms.expiry_date, now) def test_get_active_memberservices_by_grade(self): now = datetime.now().date() td = timedelta(1) yesterday = now - td services = \ [s for s in self.services.objectValues() if s.grade == 'grade-10'] for count in range(0,3): service = services[count] ms_args = self.get_ms_args(service, TEST_USER_ID) ms_args['expiry_date'] = now self.dao.add_memberservice(**ms_args) self.session.flush() services = \ [s for s in self.services.objectValues() if s.grade == 'grade-11'] for count in range(0,3): service = services[count] ms_args = self.get_ms_args(service, TEST_USER_ID) ms_args['expiry_date'] = yesterday self.dao.add_memberservice(**ms_args) self.session.flush() memberservices = \ self.dao.get_active_memberservices_by_grade(TEST_USER_ID, 'grade-10') self.assertEqual(len(memberservices), 3) for ms in memberservices: self.assertEquals(ms.expiry_date, now) def test_get_active_memberservices_by_subject_and_grade(self): now = datetime.now().date() td = timedelta(1) yesterday = now - td grade_10_maths_services = \ [s for s in self.services.objectValues() if \ s.grade == 'grade-10' and 'maths' in s.subject] for count in range(0,3): service = grade_10_maths_services[count] ms_args = self.get_ms_args(service, TEST_USER_ID) ms_args['expiry_date'] = now self.dao.add_memberservice(**ms_args) self.session.flush() grade_10_science_services = \ [s for s in self.services.objectValues() if \ s.grade == 'grade-10' and 'science' in s.subject] for count in range(0,3): service = grade_10_science_services[count] ms_args = self.get_ms_args(service, TEST_USER_ID) ms_args['expiry_date'] = yesterday self.dao.add_memberservice(**ms_args) self.session.flush() memberservices = \ self.dao.get_memberservices_by_subject_and_grade(TEST_USER_ID, 'maths', 'grade-10') self.assertEqual(len(memberservices), 3) for ms in memberservices: self.assertEquals(ms.expiry_date, now) def test_get_expired_memberservices(self): now = datetime.now().date() for count in range(0,3): service = self.services.objectValues()[count] ms_args = self.get_ms_args(service, TEST_USER_ID) ms_args['expiry_date'] = now self.dao.add_memberservice(**ms_args) self.session.flush() td = timedelta(1) yesterday = now - td for count in range(3,6): service = self.services.objectValues()[count] ms_args = self.get_ms_args(service, TEST_USER_ID) ms_args['expiry_date'] = yesterday self.dao.add_memberservice(**ms_args) self.session.flush() expired_memberservices = self.dao.get_expired_memberservices(TEST_USER_ID) self.assertEquals(len(expired_memberservices), 3) for ms in expired_memberservices: self.assertEquals(ms.expiry_date, yesterday) def test_get_expired_memberservices_by_subject(self): now = datetime.now().date() td = timedelta(1) yesterday = now - td services = \ [s for s in self.services.objectValues() if 'maths' in s.subject] for count in range(0,3): service = services[count] ms_args = self.get_ms_args(service, TEST_USER_ID) ms_args['expiry_date'] = now self.dao.add_memberservice(**ms_args) self.session.flush() services = \ [s for s in self.services.objectValues() if 'science' in s.subject] for count in range(0,3): service = services[count] ms_args = self.get_ms_args(service, TEST_USER_ID) ms_args['expiry_date'] = yesterday self.dao.add_memberservice(**ms_args) self.session.flush() memberservices = \ self.dao.get_expired_memberservices_by_subject(TEST_USER_ID, 'science') self.assertEqual(len(memberservices), 3) for ms in memberservices: self.assertEquals(ms.expiry_date, yesterday) def test_get_expired_memberservices_by_grade(self): now = datetime.now().date() td = timedelta(1) yesterday = now - td services = \ [s for s in self.services.objectValues() if s.grade == 'grade-10'] for count in range(0,3): service = services[count] ms_args = self.get_ms_args(service, TEST_USER_ID) ms_args['expiry_date'] = now self.dao.add_memberservice(**ms_args) self.session.flush() services = \ [s for s in self.services.objectValues() if s.grade == 'grade-11'] for count in range(0,3): service = services[count] ms_args = self.get_ms_args(service, TEST_USER_ID) ms_args['expiry_date'] = yesterday self.dao.add_memberservice(**ms_args) self.session.flush() memberservices = \ self.dao.get_expired_memberservices_by_grade(TEST_USER_ID, 'grade-11') self.assertEqual(len(memberservices), 3) for ms in memberservices: self.assertEquals(ms.expiry_date, yesterday) def test_get_expired_memberservices_by_subject_and_grade(self): now = datetime.now().date() td = timedelta(1) yesterday = now - td grade_10_maths_services = \ [s for s in self.services.objectValues() if \ s.grade == 'grade-10' and 'maths' in s.subject] for count in range(0,3): service = grade_10_maths_services[count] ms_args = self.get_ms_args(service, TEST_USER_ID) ms_args['expiry_date'] = now self.dao.add_memberservice(**ms_args) self.session.flush() grade_10_science_services = \ [s for s in self.services.objectValues() if \ s.grade == 'grade-10' and 'science' in s.subject] for count in range(0,3): service = grade_10_science_services[count] ms_args = self.get_ms_args(service, TEST_USER_ID) ms_args['expiry_date'] = yesterday self.dao.add_memberservice(**ms_args) self.session.flush() memberservices = \ self.dao.get_expired_memberservices_by_subject_and_grade( TEST_USER_ID, 'science', 'grade-10') self.assertEqual(len(memberservices), 3) for ms in memberservices: self.assertEquals(ms.expiry_date, yesterday) def test_get_memberservice_by_primary_key(self): service = self.services.objectValues()[0] ms_args = self.get_ms_args(service, TEST_USER_ID) ms1 = self.dao.add_memberservice(**ms_args) self.session.flush() ms1_db = self.dao.get_memberservice_by_primary_key(ms1.id) self.assertEquals(ms1_db, self.get_memberservice(ms1.id)) def test_add_memberservice(self): service = self.services.objectValues()[0] ms_args = self.get_ms_args(service, TEST_USER_ID) ms1 = self.dao.add_memberservice(**ms_args) self.session.flush() ms1_db = self.get_memberservice(ms1.id) self.failUnless(IMemberService.providedBy(ms1_db)) def test_adding_duplicate_memberservices(self): service = self.services.objectValues()[0] ms_args = self.get_ms_args(service, TEST_USER_ID) ms1 = self.dao.add_memberservice(**ms_args) ms2 = self.dao.add_memberservice(**ms_args) self.session.flush() ms1_db = self.get_memberservice(ms1.id) ms2_db = self.get_memberservice(ms2.id) self.failUnless(IMemberService.providedBy(ms1_db)) def test_update_memberservice(self): service = self.services.objectValues()[0] ms_args = self.get_ms_args(service, TEST_USER_ID) ms1 = self.dao.add_memberservice(**ms_args) self.session.flush() ms1_db = self.get_memberservice(ms1.id) ms1_db.title = 'new title' self.dao.update_memberservice(ms1_db) self.session.flush() ms1_db = self.get_memberservice(ms1.id) self.assertEquals(ms1_db.title, 'new title') def test_delete_memberservice(self): service = self.services.objectValues()[0] ms_args = self.get_ms_args(service, TEST_USER_ID) ms1 = self.dao.add_memberservice(**ms_args) self.session.flush() ms1_db = self.get_memberservice(ms1.id) self.dao.delete_memberservice(ms1_db) ms1_db = self.get_memberservice(ms1.id) self.assertEquals(ms1_db, None) def test_related_service(self): service = self.services.objectValues()[0] ms_args = self.get_ms_args(service, TEST_USER_ID) ms1 = self.dao.add_memberservice(**ms_args) self.session.flush() ms1_db = self.get_memberservice(ms1.id) self.failUnless(self.dao.related_service(ms1_db), service) def test_fti(self): fti = queryUtility(IDexterityFTI, name='emas.app.memberservice') self.assertEquals(None, fti) def test_schema(self): fti = queryUtility(IDexterityFTI, name='emas.app.memberservice') schema = fti.lookupSchema() self.assertEquals(None, schema) def test_factory(self): fti = queryUtility(IDexterityFTI, name='emas.app.memberservice') factory = fti.factory self.assertEquals(factory, None) def get_memberservice(self, memberservice_id): memberservices = self.session.query(MemberService).filter_by( id = memberservice_id).all() return memberservices and memberservices[0] or None def create_services(self): subjects = ['maths', 'science'] grades = ['10', '11', '12'] for subject in subjects: for count, grade in grades: props = {'service_type' : 'subscription', 'grade' : grade, 'subject' : subject, 'price' : '111'} s_id = self.services.invokeFactory('emas.app.service', '%s-%s' % (subject, grade), **props) service = self.services._getOb(s_id) service.subject = props['subject'] def get_ms_args(self, service, memberid): ms_args = { 'memberid': memberid, 'title': '%s for %s' % (service.title, memberid), 'related_service_id': self.intids.getId(service), 'expiry_date': datetime.now(), } return ms_args