From 4e2c47d00a38c23e6c8b514d80f622a81110f046 Mon Sep 17 00:00:00 2001 From: Christian Cueni Date: Wed, 26 Feb 2020 10:31:35 +0100 Subject: [PATCH] Update user expiry field, fix tests --- .../management/commands/sync_licenses.py | 6 +++- server/users/managers.py | 16 +++++++-- server/users/tests/test_login.py | 35 ++++++++++++++++--- server/users/user_signup_login_handler.py | 7 ++-- 4 files changed, 52 insertions(+), 12 deletions(-) diff --git a/server/users/management/commands/sync_licenses.py b/server/users/management/commands/sync_licenses.py index 544c3332..9dde149a 100644 --- a/server/users/management/commands/sync_licenses.py +++ b/server/users/management/commands/sync_licenses.py @@ -32,5 +32,9 @@ class Command(BaseCommand): product = hep_client.myskillbox_product_for_customer(admin_token, hep_user.hep_id) if product and License.objects.filter(licensee=hep_user, order_id=product['order_id']).count() == 0: - License.objects.create_license_for_role(hep_user, product['activated'], product['raw'], + license = License.objects.create_license_for_role(hep_user, product['activated'], product['raw'], product['edition'], product['order_id']) + + if license.is_valid(): + hep_user.license_expiry_date = license.expire_date + hep_user.save() diff --git a/server/users/managers.py b/server/users/managers.py index 026a504e..90bc85b7 100644 --- a/server/users/managers.py +++ b/server/users/managers.py @@ -133,6 +133,16 @@ class LicenseManager(models.Manager): def _create_license_for_role(self, licensee, expiry_date, raw, role, order_id): return self.create(licensee=licensee, expire_date=expiry_date, raw=raw, for_role=role, order_id=order_id) - def get_active_licenses_for_user(self, user): - return self.filter(licensee=user, expire_date__gte=timezone.now())\ - .filter(expire_date__lt=timezone.now()).order_by('-expire_date') + def get_active_license_for_user(self, user): + licenses = self.filter(licensee=user, expire_date__gte=timezone.now()).order_by('-expire_date') + if len(licenses) == 0: + return None + + license = licenses[0] + + # update license on user + user.license_expiry_date = license.expire_date + user.save() + + return license + diff --git a/server/users/tests/test_login.py b/server/users/tests/test_login.py index d9e8c065..2eab732a 100644 --- a/server/users/tests/test_login.py +++ b/server/users/tests/test_login.py @@ -69,7 +69,7 @@ class LoginTests(TestCase): self.user.save() now = timezone.now() - expiry_date = now + timedelta(365) + expiry_date = now + timedelta(100) LicenseFactory(expire_date=expiry_date, licensee=self.user, for_role=self.teacher_role).save() result = self.make_login_mutation(TOKEN) @@ -77,6 +77,30 @@ class LoginTests(TestCase): self.assertTrue(result.get('data').get('login').get('success')) self.assertTrue(self.user.is_authenticated) + reloaded_user = User.objects.get(pk=self.user.id) + self.assertEqual(reloaded_user.license_expiry_date, expiry_date.date()) + + @patch.object(HepClient, 'customer_me', return_value=ME_DATA) + def test_user_can_login_with_local_user_and_valid_local_licenses(self, me_mock): + + self.user.hep_id = ME_DATA['id'] + self.user.save() + + now = timezone.now() + expiry_date1 = now + timedelta(100) + expiry_date2 = now + timedelta(110) + + LicenseFactory(expire_date=expiry_date1, licensee=self.user, for_role=self.teacher_role).save() + LicenseFactory(expire_date=expiry_date2, licensee=self.user, for_role=self.teacher_role).save() + + result = self.make_login_mutation(TOKEN) + + self.assertTrue(result.get('data').get('login').get('success')) + self.assertTrue(self.user.is_authenticated) + + reloaded_user = User.objects.get(pk=self.user.id) + self.assertEqual(reloaded_user.license_expiry_date, expiry_date2.date()) + @patch.object(HepClient, 'customer_me', return_value=ME_DATA) def test_user_can_login_with_updated_email(self, me_mock): @@ -101,14 +125,17 @@ class LoginTests(TestCase): self.assertTrue(self.user.is_authenticated) @patch.object(HepClient, 'customer_me', return_value=ME_DATA) - def test_user_can_login_with_local_user_and_valid_local_license(self, me_mock): + def test_user_can_login_with_local_user_and_valid_local_licenses(self, me_mock): self.user.hep_id = ME_DATA['id'] self.user.save() now = timezone.now() - expiry_date = now + timedelta(365) - LicenseFactory(expire_date=expiry_date, licensee=self.user, for_role=self.teacher_role).save() + expiry_date1 = now + timedelta(365) + expiry_date2 = now + timedelta(366) + + LicenseFactory(expire_date=expiry_date1, licensee=self.user, for_role=self.teacher_role).save() + LicenseFactory(expire_date=expiry_date2, licensee=self.user, for_role=self.teacher_role).save() result = self.make_login_mutation(TOKEN) diff --git a/server/users/user_signup_login_handler.py b/server/users/user_signup_login_handler.py index c8e14087..4c71c689 100644 --- a/server/users/user_signup_login_handler.py +++ b/server/users/user_signup_login_handler.py @@ -38,10 +38,9 @@ def handle_user_and_verify_products(user_data): except HepClientException: return user, UNKNOWN_ERROR - try: - license = License.objects.get(licensee=user) - # Todo how handle invalid license? Cron Job? How to select correct license? Save all licenses? History? - except License.DoesNotExist: + license = License.objects.get_active_license_for_user(user) + + if not license: license, error_msg = check_and_create_licenses(hep_client, user) if error_msg: