Free and open source ticket system written in python
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 })