Files
edx-platform/lms/djangoapps/mobile_api/models.py
jawad khan 4f74d8a16a feat: added mobile configs in enrollments api (#31036)
* feat: added mobile configs in enrollments api

Mobile team needs some cnfigs after user has logged in, enrollment api seems to be the best place
to put this data. They can change these flags or values from admin side.
LEARNER-9039
2022-09-26 14:27:23 +05:00

140 lines
4.5 KiB
Python

"""
ConfigurationModel for the mobile_api djangoapp.
"""
from config_models.models import ConfigurationModel
from django.db import models
from model_utils.models import TimeStampedModel
from . import utils
from .mobile_platform import PLATFORM_CLASSES
class MobileApiConfig(ConfigurationModel):
"""
Configuration for the video upload feature.
The order in which the comma-separated list of names of profiles are given
is in priority order.
.. no_pii:
"""
video_profiles = models.TextField(
blank=True,
help_text="A comma-separated list of names of profiles to include for videos returned from the mobile API."
)
class Meta:
app_label = "mobile_api"
@classmethod
def get_video_profiles(cls):
"""
Get the list of profiles in priority order when requesting from VAL
"""
return [profile.strip() for profile in cls.current().video_profiles.split(",") if profile]
class AppVersionConfig(models.Model):
"""
Configuration for mobile app versions available.
.. no_pii:
"""
PLATFORM_CHOICES = tuple((platform, platform) for platform in sorted(PLATFORM_CLASSES.keys()))
platform = models.CharField(max_length=50, choices=PLATFORM_CHOICES, blank=False)
version = models.CharField(
max_length=50,
blank=False,
help_text="Version should be in the format X.X.X.Y where X is a number and Y is alphanumeric"
)
major_version = models.IntegerField()
minor_version = models.IntegerField()
patch_version = models.IntegerField()
expire_at = models.DateTimeField(null=True, blank=True, verbose_name="Expiry date for platform version")
enabled = models.BooleanField(default=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
app_label = "mobile_api"
unique_together = ('platform', 'version',)
ordering = ['-major_version', '-minor_version', '-patch_version']
def __str__(self):
return f"{self.platform}_{self.version}"
@classmethod
def latest_version(cls, platform):
""" Returns latest supported app version for a platform. """
latest_version_config = cls.objects.filter(platform=platform, enabled=True).first()
if latest_version_config:
return latest_version_config.version
@classmethod
def last_supported_date(cls, platform, version):
""" Returns date when app version will get expired for a platform """
parsed_version = utils.parsed_version(version)
active_configs = cls.objects.filter(platform=platform, enabled=True, expire_at__isnull=False).reverse()
for config in active_configs:
if utils.parsed_version(config.version) >= parsed_version:
return config.expire_at
def save(self, *args, **kwargs): # lint-amnesty, pylint: disable=signature-differs
""" parses version into major, minor and patch versions before saving """
self.major_version, self.minor_version, self.patch_version = utils.parsed_version(self.version)
super().save(*args, **kwargs)
class IgnoreMobileAvailableFlagConfig(ConfigurationModel):
"""
Configuration for the mobile_available flag. Default is false.
Enabling this configuration will cause the mobile_available flag check in
access.py._is_descriptor_mobile_available to ignore the mobile_available
flag.
.. no_pii:
"""
class Meta:
app_label = "mobile_api"
class MobileConfig(TimeStampedModel):
"""
Mobile configs to add through admin panel. Config values can be added dynamically.
.. no_pii:
"""
name = models.CharField(max_length=255)
value = models.CharField(max_length=255)
class Meta:
app_label = "mobile_api"
def __str__(self):
return self.name
@classmethod
def get_structured_configs(cls):
"""
Add config values in the following manner:
- If flag name starts with `iap_`, add value to configs['iap_configs']
- Else add values to configs{}
"""
configs = MobileConfig.objects.all().values('name', 'value')
structured_configs = {"iap_configs": {}}
for config in configs:
name = config.get('name')
value = config.get('value')
if name.startswith('iap_'):
structured_configs['iap_configs'][name] = value
else:
structured_configs[name] = value
return structured_configs