Files
modoboa/modoboa/webmail/serializers.py
T
2025-05-01 18:00:00 +02:00

170 lines
5.7 KiB
Python

"""Webmail serializers."""
from rest_framework import serializers
from modoboa.lib import email_utils
from modoboa.webmail import constants
from modoboa.webmail.lib import imapheader
class GlobalParametersSerializer(serializers.Serializer):
max_attachment_size = serializers.CharField(default="2048")
imap_server = serializers.CharField(default="127.0.0.1")
imap_secured = serializers.BooleanField(default=False)
imap_port = serializers.IntegerField(default=143)
smtp_server = serializers.CharField(default="127.0.0.1")
smtp_secured_mode = serializers.ChoiceField(
default=constants.SmtpConnectionMode.NONE.value,
choices=constants.SMTP_CONNECTION_MODES,
)
smtp_port = serializers.IntegerField(default=25)
smtp_authentication = serializers.BooleanField(default=False)
class UserPreferencesSerializer(serializers.Serializer):
displaymode = serializers.ChoiceField(
default=constants.DisplayMode.PLAIN.value, choices=constants.DISPLAY_MODES
)
enable_links = serializers.BooleanField(default=False)
messages_per_page = serializers.IntegerField(default=40)
refresh_interval = serializers.IntegerField(default=300)
mboxes_col_width = serializers.IntegerField(default=200)
trash_folder = serializers.CharField(default="Trash")
sent_folder = serializers.CharField(default="Sent")
drafts_folder = serializers.CharField(default="Drafts")
junk_folder = serializers.CharField(default="Junk")
editor = serializers.ChoiceField(
default=constants.DisplayMode.PLAIN.value, choices=constants.DISPLAY_MODES
)
signature = serializers.CharField(required=False)
class UserMailboxSerializer(serializers.Serializer):
name = serializers.CharField()
path = serializers.CharField(required=False)
label = serializers.CharField()
type = serializers.ChoiceField(choices=constants.MAILBOX_TYPES)
unseen = serializers.IntegerField(default=0)
removed = serializers.BooleanField(default=False)
sub = serializers.SerializerMethodField()
def get_sub(self, obj):
if "sub" in obj:
return UserMailboxSerializer(obj["sub"], many=True).data
return None
class EmailAddressSerializer(serializers.Serializer):
fulladdress = serializers.CharField()
address = serializers.CharField()
name = serializers.CharField(required=False)
class AttachmentSerializer(serializers.Serializer):
name = serializers.CharField()
partnum = serializers.CharField()
class EmailHeadersSerializer(serializers.Serializer):
imapid = serializers.CharField()
subject = serializers.SerializerMethodField()
from_address = serializers.SerializerMethodField()
date = serializers.SerializerMethodField()
size = serializers.IntegerField()
answered = serializers.BooleanField(default=False)
attachments = serializers.BooleanField(default=False)
forwarded = serializers.BooleanField(default=False)
flagged = serializers.BooleanField(default=False)
style = serializers.CharField(required=False)
def get_subject(self, obj) -> str:
return imapheader.parse_subject(obj["Subject"])
def get_from_address(self, obj):
return imapheader.parse_address(obj["From"])
def get_date(self, obj) -> str:
return imapheader.parse_date(obj["Date"])
class PaginatedEmailListSerializer(serializers.Serializer):
count = serializers.IntegerField()
first_index = serializers.IntegerField()
last_index = serializers.IntegerField()
prev_page = serializers.IntegerField()
next_page = serializers.IntegerField()
results = EmailHeadersSerializer(many=True)
class EmailSerializer(serializers.Serializer):
subject = serializers.CharField(source="Subject")
from_address = EmailAddressSerializer(source="From")
to = EmailAddressSerializer(source="To", many=True)
body = serializers.CharField()
date = serializers.CharField(source="Date")
attachments = serializers.SerializerMethodField()
def get_attachments(self, email):
result = []
if email.attachments:
for partnum, name in email.attachments.items():
data = {"name": name, "partnum": partnum}
result.append(data)
return result
class MoveSelectionSerializer(serializers.Serializer):
mailbox = serializers.CharField()
selection = serializers.ListField(child=serializers.CharField())
def validate_selection(self, value):
return [item for item in value if item.isdigit()]
class FlagSelectionSerializer(serializers.Serializer):
mailbox = serializers.CharField()
selection = serializers.ListField(child=serializers.CharField())
status = serializers.ChoiceField(
choices=[
("read", "Read"),
("unread", "Unread"),
("flagged", "Flagged"),
("unflagged", "Unflagged"),
]
)
def validate_selection(self, value):
return [item for item in value if item.isdigit()]
class SendEmailSerializer(serializers.Serializer):
sender = serializers.EmailField()
to = serializers.ListField(child=serializers.EmailField())
cc = serializers.ListField(child=serializers.EmailField(), required=False)
bcc = serializers.ListField(child=serializers.EmailField(), required=False)
subject = serializers.CharField(required=False)
body = serializers.CharField(required=False)
def validate_sender(self, value):
return value
def validate_to(self, value):
return email_utils.prepare_addresses(value, "envelope")
def validate_cc(self, value):
return email_utils.prepare_addresses(value, "envelope")
def validate_bcc(self, value):
return email_utils.prepare_addresses(value, "envelope")