Skip to content

Commit b32af3f

Browse files
committed
.
1 parent 6718ea8 commit b32af3f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+1447
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
*/db.sqlite3

mail/Pipfile

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
[[source]]
2+
name = "pypi"
3+
url = "https://pypi.org/simple"
4+
verify_ssl = true
5+
6+
[dev-packages]
7+
8+
[packages]
9+
django = "*"
10+
11+
[requires]
12+
python_version = "3.8"

mail/Pipfile.lock

Lines changed: 52 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mail/mail/__init__.py

Whitespace-only changes.

mail/mail/admin.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from django.contrib import admin
2+
3+
from .models import Email
4+
5+
admin.site.register(Email)

mail/mail/apps.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from django.apps import AppConfig
2+
3+
4+
class MailConfig(AppConfig):
5+
name = 'mail'
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# Generated by Django 3.0.8 on 2020-07-13 07:50
2+
3+
from django.conf import settings
4+
import django.contrib.auth.models
5+
import django.contrib.auth.validators
6+
from django.db import migrations, models
7+
import django.db.models.deletion
8+
import django.utils.timezone
9+
10+
11+
class Migration(migrations.Migration):
12+
13+
initial = True
14+
15+
dependencies = [
16+
('auth', '0011_update_proxy_permissions'),
17+
]
18+
19+
operations = [
20+
migrations.CreateModel(
21+
name='User',
22+
fields=[
23+
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
24+
('password', models.CharField(max_length=128, verbose_name='password')),
25+
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
26+
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
27+
('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')),
28+
('first_name', models.CharField(blank=True, max_length=30, verbose_name='first name')),
29+
('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')),
30+
('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')),
31+
('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
32+
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
33+
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
34+
('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')),
35+
('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')),
36+
],
37+
options={
38+
'verbose_name': 'user',
39+
'verbose_name_plural': 'users',
40+
'abstract': False,
41+
},
42+
managers=[
43+
('objects', django.contrib.auth.models.UserManager()),
44+
],
45+
),
46+
migrations.CreateModel(
47+
name='Email',
48+
fields=[
49+
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
50+
('subject', models.CharField(max_length=255)),
51+
('body', models.TextField(blank=True)),
52+
('timestamp', models.DateTimeField(auto_now_add=True)),
53+
('read', models.BooleanField(default=False)),
54+
('archived', models.BooleanField(default=False)),
55+
('recipients', models.ManyToManyField(related_name='emails_received', to=settings.AUTH_USER_MODEL)),
56+
('sender', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='emails_sent', to=settings.AUTH_USER_MODEL)),
57+
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='emails', to=settings.AUTH_USER_MODEL)),
58+
],
59+
),
60+
]

mail/mail/migrations/__init__.py

Whitespace-only changes.

mail/mail/models.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
from django.contrib.auth.models import AbstractUser
2+
from django.db import models
3+
4+
5+
class User(AbstractUser):
6+
pass
7+
8+
9+
class Email(models.Model):
10+
user = models.ForeignKey(
11+
"User", on_delete=models.CASCADE, related_name="emails")
12+
sender = models.ForeignKey(
13+
"User", on_delete=models.PROTECT, related_name="emails_sent")
14+
recipients = models.ManyToManyField("User", related_name="emails_received")
15+
subject = models.CharField(max_length=255)
16+
body = models.TextField(blank=True)
17+
timestamp = models.DateTimeField(auto_now_add=True)
18+
read = models.BooleanField(default=False)
19+
archived = models.BooleanField(default=False)
20+
21+
def serialize(self):
22+
return {
23+
"id": self.id,
24+
"sender": self.sender.email,
25+
"recipients": [user.email for user in self.recipients.all()],
26+
"subject": self.subject,
27+
"body": self.body,
28+
"timestamp": self.timestamp.strftime("%b %-d %Y, %-I:%M %p"),
29+
"read": self.read,
30+
"archived": self.archived
31+
}
32+
33+
def __str__(self):
34+
return f"From: {self.sender}, Sub: {self.subject}"

mail/mail/static/mail/compose.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
document.addEventListener(
2+
"DOMContentLoaded",
3+
function () {
4+
const form = document.querySelector("#compose-form");
5+
const msg = document.querySelector("#message");
6+
form.addEventListener("submit", (event) => {
7+
event.preventDefault();
8+
to = document.querySelector("#compose-recipients");
9+
subject = document.querySelector("#compose-subject");
10+
body = document.querySelector("#compose-body");
11+
if (from.length == 0 && to.length == 0) return;
12+
13+
fetch("/emails", {
14+
method: "POST",
15+
body: JSON.stringify({
16+
recipients: to.value,
17+
subject: subject.value,
18+
body: body.value,
19+
}),
20+
})
21+
.then((response) => response.json())
22+
.then((result) => {
23+
console.log(result.status);
24+
if (result.status == 201) {
25+
load_mailbox("sent");
26+
} else {
27+
msg.innerHTML = `<div class="alert alert-danger" role="alert">
28+
${result.error}
29+
</div>`;
30+
}
31+
});
32+
});
33+
},
34+
false
35+
);

0 commit comments

Comments
 (0)