diff --git a/server/users/admin.py b/server/users/admin.py index 60efb7f1..00fa9251 100644 --- a/server/users/admin.py +++ b/server/users/admin.py @@ -77,7 +77,7 @@ class UserSettingAdmin(admin.ModelAdmin): @admin.register(License) class LicenseAdmin(admin.ModelAdmin): - list_display = ('licensee', 'for_role', 'expire_date', 'isbn') + list_display = ('licensee', 'for_role', 'expire_date', 'isbn', 'hep_created_at') list_filter = ('licensee', 'expire_date') raw_id_fields = ('licensee',) diff --git a/server/users/management/commands/move_new_raw_to_field.py b/server/users/management/commands/move_new_raw_to_field.py new file mode 100644 index 00000000..e69de29b diff --git a/server/users/management/commands/reset_license_duration.py b/server/users/management/commands/reset_license_duration.py index 0716f683..bf5f1587 100644 --- a/server/users/management/commands/reset_license_duration.py +++ b/server/users/management/commands/reset_license_duration.py @@ -5,7 +5,7 @@ from django.utils.timezone import now from django.core.management.base import BaseCommand from users.licenses import MYSKILLBOX_LICENSES -from users.models import License +from users.models import License, NO_DATE YEARLY_ISBNS = ["978-3-0355-1860-3", "978-3-0355-1823-8"] LONGER_DURATION = 455 @@ -47,7 +47,7 @@ class Command(BaseCommand): such it the longer duration was set as duration """ return user_join_delta == LONGER_DURATION or duration_in_days == LONGER_DURATION \ - or start_date == License.NO_DATE + or start_date == NO_DATE def _update_expiry_date(self, license: License, standard_duration: int, dry_run: bool): new_expiry_date = license.expire_date - timedelta(LONGER_DURATION - standard_duration) diff --git a/server/users/managers.py b/server/users/managers.py index b0a6578b..a4308a23 100644 --- a/server/users/managers.py +++ b/server/users/managers.py @@ -147,15 +147,16 @@ class LicenseManager(models.Manager): else: user_role = Role.objects.get_default_student_role() - new_license = self._create_license_for_role(licensee, expiry_date, raw, user_role, order_id, isbn) + new_license = self._create_license_for_role(licensee, expiry_date, raw, user_role, order_id, isbn, + activation_date) new_license.licensee.license_expiry_date = new_license.expire_date new_license.licensee.save() return new_license - def _create_license_for_role(self, licensee, expiry_date, raw, role, order_id, isbn): - return self.create(licensee=licensee, expire_date=expiry_date, raw=raw, for_role=role, order_id=order_id, - isbn=isbn) + def _create_license_for_role(self, licensee, expiry_date, raw, role, order_id, isbn, activation_date): + return self.create(licensee=licensee, expire_date=expiry_date, new_api_raw=raw, for_role=role, order_id=order_id, + isbn=isbn, hep_created_at=activation_date) def get_active_license_for_user(self, user): licenses = self.filter(licensee=user, expire_date__gte=timezone.now()).order_by('-expire_date') diff --git a/server/users/migrations/0028_auto_20210922_0550.py b/server/users/migrations/0028_auto_20210922_0550.py new file mode 100644 index 00000000..657c7743 --- /dev/null +++ b/server/users/migrations/0028_auto_20210922_0550.py @@ -0,0 +1,25 @@ +# Generated by Django 2.2.24 on 2021-09-22 05:50 + +import datetime +from django.db import migrations, models +from django.utils.timezone import utc + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0027_auto_20210414_2116'), + ] + + operations = [ + migrations.AddField( + model_name='license', + name='hep_created_at', + field=models.DateTimeField(default=datetime.datetime(1, 1, 1, 0, 0, tzinfo=utc)), + ), + migrations.AddField( + model_name='license', + name='new_api_raw', + field=models.TextField(default=''), + ), + ] diff --git a/server/users/migrations/0028_license_created_at.py b/server/users/migrations/0029_auto_20210922_0550.py similarity index 54% rename from server/users/migrations/0028_license_created_at.py rename to server/users/migrations/0029_auto_20210922_0550.py index 41e2bb22..433e5c75 100644 --- a/server/users/migrations/0028_license_created_at.py +++ b/server/users/migrations/0029_auto_20210922_0550.py @@ -1,25 +1,21 @@ -# Generated by Django 2.2.24 on 2021-09-09 11:39 +# Generated by Django 2.2.24 on 2021-09-22 05:50 -from datetime import datetime from django.db import migrations, models -from django.utils.timezone import make_aware -from users.models import NO_DATE - -MIN_DATE = datetime.combine(NO_DATE, datetime.min.time()) +from users.models import AWARE_NO_DATETIME class Migration(migrations.Migration): dependencies = [ - ('users', '0027_auto_20210414_2116'), + ('users', '0028_auto_20210922_0550'), ] operations = [ migrations.AddField( model_name='license', name='created_at', - field=models.DateTimeField(auto_now_add=True, default=make_aware(MIN_DATE)), + field=models.DateTimeField(auto_now_add=True, default=AWARE_NO_DATETIME), preserve_default=False, ), ] diff --git a/server/users/models.py b/server/users/models.py index 8475a501..dbe4e7cf 100644 --- a/server/users/models.py +++ b/server/users/models.py @@ -18,7 +18,9 @@ from users.licenses import MYSKILLBOX_LICENSES from users.managers import LicenseManager, RoleManager, UserManager, UserRoleManager DEFAULT_SCHOOL_ID = 1 -NO_DATE = date(MINYEAR, 1, 1) # date to tag licenses without tag +NO_DATE = date(MINYEAR, 1, 1) # date to tag licenses without date +NO_DATETIME = datetime.combine(NO_DATE, datetime.min.time()) +AWARE_NO_DATETIME = make_aware(NO_DATETIME) class User(AbstractUser): @@ -308,11 +310,11 @@ class License(models.Model): isbn = models.CharField(max_length=50, blank=False, null=False, default=list(MYSKILLBOX_LICENSES.keys())[0]) # student license created_at = models.DateTimeField(auto_now_add=True) + hep_created_at = models.DateTimeField(default=AWARE_NO_DATETIME) + new_api_raw = models.TextField(default='') objects = LicenseManager() - NO_DATE = NO_DATE - def is_teacher_license(self): return self.for_role.key == RoleManager.TEACHER_KEY @@ -330,7 +332,7 @@ class License(models.Model): date_string = hep_data['created_at'] return datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S').date() - return License.NO_DATE + return NO_DATE def get_hep_isbn(self) -> str: hep_data = self._read_as_json(self.raw)