added email_sent field to student model, do not send mail twice if not needed
This commit is contained in:
@@ -31,6 +31,7 @@ def send_mail_password(request: HttpRequest, queryset: QuerySet[Student]) -> Non
|
|||||||
img.add_header("Content-Disposition", "inline", filename="cantorair.png")
|
img.add_header("Content-Disposition", "inline", filename="cantorair.png")
|
||||||
|
|
||||||
# build mail list filling template
|
# build mail list filling template
|
||||||
|
queryset = queryset.filter(mail_sent=False)
|
||||||
mails: List[EmailMultiAlternatives] = []
|
mails: List[EmailMultiAlternatives] = []
|
||||||
for student in queryset:
|
for student in queryset:
|
||||||
if not student.user or not student.email: # skip student if has not an associated user
|
if not student.user or not student.email: # skip student if has not an associated user
|
||||||
@@ -56,18 +57,25 @@ def send_mail_password(request: HttpRequest, queryset: QuerySet[Student]) -> Non
|
|||||||
mail.attach(filename=img)
|
mail.attach(filename=img)
|
||||||
mail.attach_alternative(content=html_message, mimetype="text/html")
|
mail.attach_alternative(content=html_message, mimetype="text/html")
|
||||||
mails.append(mail)
|
mails.append(mail)
|
||||||
|
student.mail_sent = True
|
||||||
|
student.save()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
messages.error(request=request, message=f"General Error: {e}")
|
messages.error(request=request, message=f"General Error: {e}")
|
||||||
|
|
||||||
|
if len(mails) == 0:
|
||||||
|
messages.warning(request=request, message="No email will be sent")
|
||||||
|
return
|
||||||
|
|
||||||
# Open only one conenction and send mass email
|
# Open only one conenction and send mass email
|
||||||
try:
|
try:
|
||||||
|
sent: int = 0
|
||||||
with get_connection() as conn:
|
with get_connection() as conn:
|
||||||
conn.send_messages(mails)
|
sent = conn.send_messages(mails)
|
||||||
except SMTPException as e:
|
except SMTPException as e:
|
||||||
messages.error(request=request, message=f"Send Mail SMTP error: {e.strerror}")
|
messages.error(request=request, message=f"Send Mail SMTP error: {e.strerror}")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
messages.error(request=request, message=f"Send Mail General error: {e}")
|
messages.error(request=request, message=f"Send Mail General error: {e}")
|
||||||
else:
|
else:
|
||||||
messages.success(request=request, message=f"Successfully sent {len(mails)} messages")
|
messages.success(request=request, message=f"Successfully sent {sent} messages")
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ class ChangeAircraftForm(AdminActionForm):
|
|||||||
|
|
||||||
class StudentAdmin(ImportMixin, AdminConfirmMixin, AdminActionFormsMixin, admin.ModelAdmin):
|
class StudentAdmin(ImportMixin, AdminConfirmMixin, AdminActionFormsMixin, admin.ModelAdmin):
|
||||||
model = Student
|
model = Student
|
||||||
list_display = ("surname", "name", "course", "course_color", "email", "phone", "username", "password", "active", )
|
list_display = ("surname", "name", "course", "course_color", "email", "phone", "username", "password", "active", "mail_sent")
|
||||||
list_filter = ("course", "active", )
|
list_filter = ("course", "active", )
|
||||||
search_fields = ("surname", "name", "phone", "email", )
|
search_fields = ("surname", "name", "phone", "email", )
|
||||||
actions = ("change_course", "deactivate_students", "change_aircraft", "send_mail", )
|
actions = ("change_course", "deactivate_students", "change_aircraft", "send_mail", )
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# Generated by Django 5.2.8 on 2025-12-10 10:28
|
||||||
|
|
||||||
|
import phonenumber_field.modelfields
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('flightslot', '0030_weekpreference_inserted_alter_availability_week_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='student',
|
||||||
|
name='mail_sent',
|
||||||
|
field=models.BooleanField(default=False),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='student',
|
||||||
|
name='phone',
|
||||||
|
field=phonenumber_field.modelfields.PhoneNumberField(db_index=True, max_length=128, null=True, region=None, unique=True),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -19,6 +19,7 @@ class Student(models.Model):
|
|||||||
|
|
||||||
phone = modelfields.PhoneNumberField(
|
phone = modelfields.PhoneNumberField(
|
||||||
null=True,
|
null=True,
|
||||||
|
db_index=True,
|
||||||
unique=True
|
unique=True
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -54,6 +55,11 @@ class Student(models.Model):
|
|||||||
Aircraft
|
Aircraft
|
||||||
)
|
)
|
||||||
|
|
||||||
|
mail_sent = models.BooleanField(
|
||||||
|
null=False,
|
||||||
|
default=False
|
||||||
|
)
|
||||||
|
|
||||||
def default_password(self) -> str: # Maximum 4 digits for passowrd
|
def default_password(self) -> str: # Maximum 4 digits for passowrd
|
||||||
if self.pk:
|
if self.pk:
|
||||||
return f"{self.name.lower()[0]}{self.surname.lower()}{self.id % 10000}"
|
return f"{self.name.lower()[0]}{self.surname.lower()}{self.id % 10000}"
|
||||||
|
|||||||
Reference in New Issue
Block a user