コード例 #1
0
ファイル: eventhandlers.py プロジェクト: Siyavula/emas.app
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)
コード例 #2
0
 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
コード例 #3
0
ファイル: eventhandlers.py プロジェクト: Siyavula/emas.app
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)
コード例 #4
0
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