예제 #1
0
    def test_hurryup(self):
        self.audit_activity_normal_lifecycle(['approve'])
        activity = AuditActivity.objects.all()[0]

        token = generateToken(activity.creator)
        client = Client()

        response = client.get(
            '/api/v1/mine-audit-activities',
            content_type='application/json',
            HTTP_AUTHORIZATION=token)
        self.assertEquals(response.status_code, 200)
        result = json.loads(response.content.decode('utf-8'))
        item = result['activities'][0]
        self.assertEqual(item['canHurryup'], True)

        response = client.post(
            '/api/v1/audit-activities/{}/actions/hurryup'.format(activity.pk),
            content_type='application/json',
            HTTP_AUTHORIZATION=token)

        self.assertEquals(response.status_code, 200)
        step = activity.currentStep()
        message = Message.objects.get(profile=step.assignee,
                                      category='hurryup',
                                      activity=activity)
        self.assertEqual(message.read, False)

        response = client.get(
            '/api/v1/mine-audit-activities',
            content_type='application/json',
            HTTP_AUTHORIZATION=token)
        result = json.loads(response.content.decode('utf-8'))
        item = result['activities'][0]
        self.assertEqual(item['canHurryup'], False)
예제 #2
0
    def test_hurryup_twice_one_day(self):
        self.audit_activity_normal_lifecycle(['approve'])
        activity = AuditActivity.objects.all()[0]

        token = generateToken(activity.creator)
        client = Client()
        response = client.post(
            '/api/v1/audit-activities/{}/actions/hurryup'.format(activity.pk),
            content_type='application/json',
            HTTP_AUTHORIZATION=token)

        self.assertEquals(response.status_code, 200)
        step = activity.currentStep()
        message = Message.objects.get(profile=step.assignee,
                                      category='hurryup',
                                      activity=activity)
        self.assertEqual(message.read, False)

        response = client.post(
            '/api/v1/audit-activities/{}/actions/hurryup'.format(activity.pk),
            content_type='application/json',
            HTTP_AUTHORIZATION=token)
        self.assertEquals(response.status_code, 200)
        msgs = Message.objects\
            .filter(profile=step.assignee,
                    category='hurryup',
                    activity=activity)\
            .count()
        self.assertEqual(msgs, 1)
예제 #3
0
def loginWithCode(request):
    data = json.loads(request.body.decode('utf-8'))
    try:
        profile = Profile.objects.get(phone=data['phone'])
        if checkCode(profile.phone, data['code']) and \
                not profile.blocked:
            return JsonResponse({'token': generateToken(profile)})
        else:
            return JsonResponse({'errorId': 'unauthorized'}, status=401)
    except:
        logger.exception('fail to login')
        return JsonResponse({'errorId': 'unauthorized'}, status=401)
예제 #4
0
def login(request):
    data = json.loads(request.body.decode('utf-8'))
    try:
        profile = Profile.objects.get(name=data['name'])
        if profile.user.check_password(data['password']) and \
                not profile.blocked:
            return JsonResponse({'token': generateToken(profile)})
        else:
            return JsonResponse({'errorId': 'unauthorized'}, status=401)
    except:
        logger.exception('fail to login')
        return JsonResponse({'errorId': 'unauthorized'}, status=401)
예제 #5
0
    def test_query_configs(self):
        self.audit_activity_normal_lifecycle([])
        activity = AuditActivity.objects.all()[0]

        token = generateToken(activity.creator)
        client = Client()
        response = client.get(
            '/api/v1/audit-configs',
            HTTP_AUTHORIZATION=token
        )
        self.assertEqual(response.status_code, 200)
        result = json.loads(response.content.decode('utf-8'))
        self.assertEqual(len(result['configs']), 2)
예제 #6
0
    def test_cancel_audit_activity_with_approved_steps(self):
        self.audit_activity_normal_lifecycle(['approve'])
        activity = AuditActivity.objects.all()[0]

        token = generateToken(activity.creator)
        client = Client()
        response = client.post(
            '/api/v1/audit-activities/{}/actions/cancel'.format(activity.pk),
            content_type='application/json',
            HTTP_AUTHORIZATION=token
        )
        self.assertEquals(response.status_code, 400)
        result = json.loads(response.content.decode('utf-8'))
        self.assertEqual(result['errorId'], 'invalid-state')
예제 #7
0
    def test_submit_audit_activity_with_invalid_state(self):
        self.audit_activity_normal_lifecycle([])
        activity = AuditActivity.objects.all()[0]

        token = generateToken(activity.creator)
        client = Client()
        response = client.post(
            '/api/v1/audit-activities/{}/actions/submit-audit'.format(
                str(activity.pk)),
            HTTP_AUTHORIZATION=token
        )
        self.assertEqual(response.status_code, 400)
        result = json.loads(response.content.decode('utf-8'))
        self.assertEqual(result['errorId'], 'invalid-state')
예제 #8
0
    def test_approve_step_with_invalid_profile(self):
        self.audit_activity_normal_lifecycle(['approve', 'approve'])

        activity = AuditActivity.objects.all()[0]
        steps = activity.steps()
        step = steps[2]
        token = generateToken(self.lee)
        client = Client()
        response = client.post(
            '/api/v1/audit-steps/{}/actions/reject'.format(step.pk),
            content_type='application/json',
            HTTP_AUTHORIZATION=token
        )
        self.assertEquals(response.status_code, 400)
        result = json.loads(response.content.decode('utf-8'))
        self.assertEqual(result['errorId'], 'invalid-assignee')
예제 #9
0
    def test_relaunch_activity(self):
        self.audit_activity_normal_lifecycle(['approve', 'reject'])
        activity = AuditActivity.objects.all()[0]

        token = generateToken(activity.creator)
        client = Client()
        response = client.post(
            '/api/v1/audit-activities/{}/actions/relaunch'.format(
                str(activity.pk)),
            HTTP_AUTHORIZATION=token
        )
        self.assertEqual(response.status_code, 200)
        result = json.loads(response.content.decode('utf-8'))

        activity = AuditActivity.objects.get(pk=activity.pk)
        self.assertEqual(activity.archived, True)

        activity = AuditActivity.objects.get(pk=result['id'])
        self.assertEqual(activity.state, AuditActivity.StateDraft)
예제 #10
0
    def test_query_transaction_stat(self):
        self._test_transaction_stat()

        user = User.objects.create(username='******')
        profile = Profile.objects.create(name='jack',
                                         user=user,
                                         phone='foobar')
        token = generateToken(profile)

        client = Client()
        r = client.get('/api/v1/transaction-record-stats',
                       HTTP_AUTHORIZATION=token)
        self.assertEqual(r.status_code, 200)
        result = json.loads(r.content.decode('utf-8'))
        self.assertEqual(result['total'], 3)
        records = result['records']
        actual = [{
            'name': r['name'],
            'income': r['income'],
            'outcome': r['outcome'],
            'balance': r['balance']
        } for r in records]
        expected = [{
            'name': 'fin1',
            'income': '11000.00',
            'outcome': '400.00',
            'balance': '10600.00'
        }, {
            'name': 'fin2',
            'income': '1000.00',
            'outcome': '100.00',
            'balance': '900.00'
        }, {
            'name': 'fin3',
            'income': '0.00',
            'outcome': '0.00',
            'balance': '0.00'
        }]
        self.assertListEqual(actual, expected)
예제 #11
0
    def test_query_processed_activities(self):
        self.audit_activity_normal_lifecycle(['approve'])

        token = generateToken(self.lee)
        client = Client()
        response = client.get(
            '/api/v1/processed-audit-activities?type=baoxiao&creator=jack',
            HTTP_AUTHORIZATION=token
        )
        self.assertEquals(response.status_code, 200)
        result = json.loads(response.content.decode('utf-8'))
        self.assertEqual(result['total'], 1)
        self.assertEqual(len(result['activities']), 1)

        client = Client()
        response = client.get(
            '/api/v1/processed-audit-activities?type=baoxiao&creator=jack&start=20',
            HTTP_AUTHORIZATION=token
        )
        self.assertEquals(response.status_code, 200)
        result = json.loads(response.content.decode('utf-8'))
        self.assertEqual(result['total'], 1)
        self.assertEqual(len(result['activities']), 0)
예제 #12
0
    def test_query_mine_activities(self):
        self.audit_activity_normal_lifecycle([])
        activity = AuditActivity.objects.all()[0]

        token = generateToken(activity.creator)
        client = Client()

        response = client.get(
            '/api/v1/mine-audit-activities?type=baoxiao&state=processing',
            HTTP_AUTHORIZATION=token
        )
        self.assertEqual(response.status_code, 200)
        result = json.loads(response.content.decode('utf-8'))
        self.assertEqual(result['total'], 1)
        self.assertEqual(len(result['activities']), 1)

        response = client.get(
            '/api/v1/mine-audit-activities?start=20',
            HTTP_AUTHORIZATION=token
        )
        self.assertEqual(response.status_code, 200)
        result = json.loads(response.content.decode('utf-8'))
        self.assertEqual(result['total'], 1)
        self.assertEqual(len(result['activities']), 0)
예제 #13
0
 def setUp(self):
     self.profile = helpers.prepareProfile('张三', 'root', '18888888888')
     self.generateToken = generateToken(self.profile)
예제 #14
0
    def audit_activity_normal_lifecycle(self,
                                        actions,
                                        config=None,
                                        submitDirectly=True,
                                        creator=None):
        self.perpareData()

        open_account_config = specs.createAuditConfig(
            spec='fin.open_account:_.owner->fin.owner->root.ceo...')
        baoxiao_config = specs.createAuditConfig(
            spec='fin.baoxiao:_.owner->fin.accountant->root.ceo')

        if config is None:
            config = baoxiao_config
        else:
            config = AuditActivityConfig.objects.get(subtype=config)

        client = Client()

        if creator is not None:
            creator = Profile.objects.get(name=creator)
        else:
            creator = self.jack

        token = generateToken(creator)
        response = client.post(
            '/api/v1/audit-activities',
            json.dumps({
                'config': str(config.pk),
                'submit': submitDirectly,
                'extra': {}
            }),
            content_type='application/json',
            HTTP_AUTHORIZATION=token
        )

        self.assertEquals(response.status_code, 200)
        result = json.loads(response.content.decode('utf-8'))
        self.assertEqual(result['ok'], True)

        activity = AuditActivity.objects.all()[0]
        self.assertEqual(activity.creator, creator)
        if submitDirectly:
            self.assertEqual(activity.state, AuditActivity.StateProcessing)
        else:
            self.assertEqual(activity.state, AuditActivity.StateDraft)
            self.assertEqual(len(activity.steps()), 0)

        if not submitDirectly:
            response = client.post(
                '/api/v1/audit-activities/{}/actions/submit-audit'.format(
                    str(activity.pk)),
                HTTP_AUTHORIZATION=token
            )
            self.assertEquals(response.status_code, 200)
            result = json.loads(response.content.decode('utf-8'))
            self.assertEqual(result['ok'], True)
            activity = AuditActivity.objects.all()[0]
            self.assertEqual(activity.state, AuditActivity.StateProcessing)

        steps = AuditStep.objects \
            .filter(activity=activity) \
            .order_by('position')

        if config.subtype == 'baoxiao':
            if creator.name == 'ceo':
                expect_steps = [
                    {'assignee': self.lucy},
                    {'assignee': self.ceo}
                ]
            else:
                expect_steps = [
                    {'assignee': self.lee},
                    {'assignee': self.lucy},
                    {'assignee': self.ceo}
                ]
        else:
            if creator.department.code == 'fin':
                expect_steps = [
                    {'assignee': self.neo},
                    {'assignee': self.ceo}
                ]
            else:
                expect_steps = [
                    {'assignee': self.lee},
                    {'assignee': self.neo},
                    {'assignee': self.ceo}
                ]

        for step in steps:
            es = expect_steps[step.position]
            self.assertEqual(es['assignee'], step.assignee)
            self.assertEqual(step.state, AuditStep.StatePending)

        for action in actions:
            if action == 'cancel':
                response = client.post(
                    '/api/v1/audit-activities/{}/actions/cancel'.format(
                        activity.pk),
                    content_type='application/json',
                    HTTP_AUTHORIZATION=token
                )
                self.assertEquals(response.status_code, 200)
            if action == 'approve':
                step = activity.currentStep()
                token = generateToken(step.assignee)
                response = client.post(
                    '/api/v1/audit-steps/{}/actions/approve'.format(step.pk),
                    content_type='application/json',
                    HTTP_AUTHORIZATION=token
                )
                self.assertEquals(response.status_code, 200)
            if action == 'reject':
                step = activity.currentStep()
                token = generateToken(step.assignee)
                response = client.post(
                    '/api/v1/audit-steps/{}/actions/reject'.format(step.pk),
                    content_type='application/json',
                    HTTP_AUTHORIZATION=token
                )
                self.assertEquals(response.status_code, 200)
예제 #15
0
    def test_query_taizhang_stats(self):
        self._test_taizhang_stat_and_customer_stat()

        user = User.objects.create(username='******')
        profile = Profile.objects.create(name='jack',
                                         user=user,
                                         phone='foobar')
        token = generateToken(profile)

        client = Client()
        r = client.get('/api/v1/taizhang-stats', HTTP_AUTHORIZATION=token)
        self.assertEqual(r.status_code, 200)
        result = json.loads(r.content.decode('utf-8'))
        self.assertEqual(result['total'], 6)
        stats = result['stats']
        expect = [
            {
                'company': '公司1',
                'asset': '电解铜',
                'xiaoshoue': '1500635.50',
                'lirune': '4985.50',
                'kuchun_liang': '9600.00',
                'zijin_zhanya': '2200.00'
            },
            {
                'company': '公司1',
                'asset': '螺纹钢',
                'xiaoshoue': '19931485.50',
                'lirune': '3985.50',
                'kuchun_liang': '190000.00',
                'zijin_zhanya': '2000.00'
            },
            {
                'company': '公司2',
                'asset': '电解铜',
                'xiaoshoue': '1500635.50',
                'lirune': '4985.50',
                'kuchun_liang': '9600.00',
                'zijin_zhanya': '2200.00'
            },
            {
                'company': '公司2',
                'asset': '螺纹钢',
                'xiaoshoue': '19931485.50',
                'lirune': '3985.50',
                'kuchun_liang': '190000.00',
                'zijin_zhanya': '2000.00'
            },
            {
                'company': '公司3',
                'asset': '电解铜',
                'xiaoshoue': '599817.75',
                'lirune': '1992.75',
                'kuchun_liang': '3800.00',
                'zijin_zhanya': '2000.00'
            },
            {
                'company': '公司3',
                'asset': '螺纹钢',
                'xiaoshoue': '0.00',
                'lirune': '0.00',
                'kuchun_liang': '0.00',
                'zijin_zhanya': '0.00'
            },
        ]
        self.assertListEqual(stats, expect)