Free and open source ticket system written in python
at main 72 lines 2.6 kB view raw
1from django.db import models 2from django.contrib.auth.models import AbstractUser 3from django.utils.translation import gettext_lazy as _ 4from django.dispatch import receiver 5from django.db.models.signals import post_save 6from django.conf import settings 7from django.core.mail import send_mail 8 9 10class PawUser(AbstractUser): 11 profile_picture = models.ImageField( 12 upload_to='profile_pics/', null=True, blank=True) 13 language = models.CharField(max_length=2, default='en') 14 telegram_username = models.CharField(max_length=50, null=True, blank=True) 15 use_darkmode = models.BooleanField(default=False) 16 receive_email_notifications = models.BooleanField(default=True) 17 18 def __str__(self): 19 return self.username 20 21 22class GoogleSSOUser(models.Model): 23 paw_user = models.OneToOneField( 24 PawUser, on_delete=models.CASCADE, primary_key=True) 25 google_id = models.CharField(max_length=255) 26 27 def __str__(self): 28 return self.paw_user.username 29 30 class Meta: 31 db_table = "google_sso_user" 32 verbose_name = _("Google SSO User") 33 34class MailTemplate(models.Model): 35 event = models.CharField(max_length=100) 36 language = models.CharField(max_length=2, default='en', choices=settings.LANGUAGES) 37 name = models.CharField(max_length=200) 38 subject = models.CharField(max_length=200) 39 content = models.TextField() 40 41 @classmethod 42 def get_template(cls, event, language='en'): 43 template = cls.objects.filter(event=event, language=language).first() 44 if not template: 45 template = cls.objects.filter(event=event, language='en').first() 46 return template 47 48 def send_mail(self, to_list: list[str], context): 49 try: 50 send_mail( 51 self.subject.format(**context), 52 self.content.format(**context), 53 settings.DEFAULT_FROM_EMAIL, 54 to_list, 55 fail_silently=False, 56 ) 57 except Exception as e: 58 print(f"Error sending email with type {type(e)}: {e}") 59 60 def __str__(self): 61 return f"{self.name} - [{self.event}]" 62 63@receiver(post_save, sender=PawUser, dispatch_uid="new_user_notification") 64def new_user_notification(sender, instance, created, **kwargs): 65 if not created or not instance.email: 66 return None 67 68 mail_template = MailTemplate.get_template('new_user', instance.language) 69 if not mail_template: 70 return None 71 mail_template.send_mail([instance.email], { 72 'username': instance.username, 'email': instance.email })