from django.db import models from django.conf import settings from django.utils.translation import gettext_lazy as _ from django.core.validators import RegexValidator from phonenumber_field.modelfields import PhoneNumberField from utils.validators import validate_possible_number class AppVersion(models.Model): """ Model for storing mobile application releases and APK downloads """ class AppType(models.TextChoices): GOOGLE_PLAY = 'google_play', _('Google Play') APP_STORE = 'app_store', _('Apple App Store') DIRECT = 'direct', _('Direct Download') version = models.CharField( max_length=20, unique=True, validators=[ RegexValidator( regex=r'^\d+\.\d+\.\d+$', message='Version must be in format X.Y.Z (e.g., 1.0.0)' ) ], verbose_name=_('Version'), help_text=_('Application version in format X.Y.Z (e.g., 1.0.0)') ) apk_file = models.FileField( upload_to='app_versions/', verbose_name=_('APK File'), help_text=_('Application APK / binary file'), null=True, blank=True, ) description = models.TextField( verbose_name=_('Description'), help_text=_('Release notes and changes for this version'), blank=True ) app_type = models.CharField( max_length=20, choices=AppType.choices, default=AppType.GOOGLE_PLAY, verbose_name=_('App Distribution Platform') ) downloads_count = models.PositiveBigIntegerField( default=0, verbose_name=_('Downloads Count') ) is_active = models.BooleanField( default=True, verbose_name=_('Active'), help_text=_('Is this version currently active?') ) created_at = models.DateTimeField( auto_now_add=True, verbose_name=_('Created At') ) updated_at = models.DateTimeField( auto_now=True, verbose_name=_('Updated At') ) class Meta: verbose_name = _('App Version') verbose_name_plural = _('App Versions') ordering = ['-created_at'] def __str__(self): return f'Version {self.version} ({self.get_app_type_display()})' @classmethod def get_latest_active(cls): return cls.objects.filter(is_active=True).order_by('-created_at').first() class SupportMessage(models.Model): """ Model for user contact & support inquiries """ sender_name = models.CharField( max_length=255, verbose_name=_('Sender Name'), ) sender_email = models.EmailField( verbose_name=_('Sender Email'), ) subject = models.CharField( max_length=255, verbose_name=_('Subject'), ) sender_phone = PhoneNumberField( validators=[validate_possible_number], blank=True, null=True, verbose_name=_('Sender Phone'), ) message = models.TextField( verbose_name=_('Message'), ) is_resolved = models.BooleanField( default=False, verbose_name=_('Resolved'), ) created_at = models.DateTimeField( auto_now_add=True, verbose_name=_('Created At'), ) class Meta: verbose_name = _('Support Message') verbose_name_plural = _('Support Messages') ordering = ['-created_at'] def __str__(self): return f'{self.sender_name} - {self.subject}'