aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--blog/templates/account.html77
-rw-r--r--blog/urls.py1
-rw-r--r--blog/views.py12
-rw-r--r--users/admin.py3
-rw-r--r--users/migrations/0001_initial.py29
-rw-r--r--users/models.py17
6 files changed, 138 insertions, 1 deletions
diff --git a/blog/templates/account.html b/blog/templates/account.html
new file mode 100644
index 00000000..fb33478b
--- /dev/null
+++ b/blog/templates/account.html
@@ -0,0 +1,77 @@
+{% extends 'partials/base.html' %} {% block content %}
+<div class="main">
+ <h1>My Account</h1>
+ <p>You can change account settings for <strong>{{ user.username }}</strong> here. If you wish to have additional support, please contact me at <a href="mailto:[email protected]?subject=[URGENT]%20Support%20Request%20for%20{{ user.username }}">[email protected]</a>. Please take care of the following points before you submit your support request:</p>
+ <ul>
+ <li>Please do not edit the subject line.</li>
+ <li>As an individual monitoring this email, I request you to refrain yourself from spamming.</li>
+ <li>Please do not include any sensitive information (like credit card numbers, passwords, etc.) in the email.</li>
+ <li>Allow me upto 48 hours to respond to your support request.</li>
+ <li>Do not send multiple support requests.</li>
+ <li>Please note that this is a support request related to your account. Please do not file any bugs here. If you have noticed a bug, please report it to the <a href="https://github.com/luciferreeves/thatcomputerscientist/issues">GitHub Issues</a> page.</li>
+ </ul>
+ <p>Your avatar is fetched from gravatar. Update your gravatar email to fetch the avatar. If you don't have an account, you can sign up for one <a href="https://en.gravatar.com/" target="_blank">here</a>. If you haven't set up your gravatar email, we would try to fetch your profile picture from your account email, by default. If your account email and gravatar email are the same, you do not need to set a gravatar email.</p>
+ <div class="account">
+ <div class="ac-sidebar">
+ <fieldset>
+ <legend>Avatar</legend>
+ <img src="https://www.gravatar.com/avatar/{{avatar}}?s=200" alt="{{ user.username }}'s avatar" width="200" height="200"/>
+ </fieldset>
+ <form method="post" onsubmit="event.preventDefault();">
+ <fieldset>
+ <legend>Change Password</legend>
+ <label for="password">Current Password</label>
+ <input type="password" name="password" id="password" placeholder="Current Password" />
+ <label for="new_password">New Password</label>
+ <input type="password" name="new_password" id="new_password" placeholder="New Password" />
+ <input type="submit" value="Change Password" />
+ </fieldset>
+ </form>
+ <form method="post" onsubmit="event.preventDefault();">
+ <fieldset>
+ <legend class="error">Delete Account</legend>
+ <input type="submit" value="Delete Account" />
+ </fieldset>
+ </form>
+ </div>
+ <div class="ac-main">
+ <form method="post" onsubmit="event.preventDefault();">
+ <fieldset>
+ <legend>Account Details</legend>
+ <label for="firstname">First Name</label>
+ <input type="text" name="firstname" id="firstname" value="{{ user.first_name }}" placeholder="First Name" />
+ <label for="lastname">Last Name</label>
+ <input type="text" name="lastname" id="lastname" value="{{ user.last_name }}" placeholder="Last Name" />
+ <label for="gravatarEmail">Gravatar Email</label>
+ <input type="text" name="gravatarEmail" id="gravatarEmail" value="{{ user_profile.gravatar_email }}" placeholder="Gravatar Email" />
+ <label for="location">Location</label>
+ <input type="text" name="location" id="location" value="{{ user_profile.location }}" placeholder="Location" />
+ <label for="bio">Bio</label>
+ <textarea name="bio" id="bio" placeholder="Bio">{{ user_profile.bio }}</textarea>
+ <label for="isPublic">Account Visibility</label>
+ <select name="isPublic" id="isPublic">
+ <option value="1"{% if user_profile.is_public %} selected{% endif %}>Public</option>
+ <option value="0"{% if not user_profile.is_public %} selected{% endif %}>Private</option>
+ </select>
+ {% if user_profile.is_public %}
+ <label for="emailPublic">Email Visibility</label>
+ <select name="emailPublic" id="emailPublic">
+ <option value="1"{% if user_profile.email_public %} selected{% endif %}>Public</option>
+ <option value="0"{% if not user_profile.email_public %} selected{% endif %}>Private</option>
+ </select>
+ {% endif %}
+ <input type="submit" value="Update Account" />
+ </fieldset>
+ </form>
+ <form method="post" onsubmit="event.preventDefault();">
+ <fieldset>
+ <legend>Change Email</legend>
+ <label for="email">Your current registered email is <em><u>{{ user.email }}</u></em>. Please note that a verification email will be sent to the new email address in order to update the current email address. Please provide the new email address in the box below:</label>
+ <input type="email" name="email" id="email" placeholder="New Email" />
+ <input type="submit" value="Change Email" />
+ </fieldset>
+ </form>
+ </div>
+ </div>
+</div>
+{% endblock %}
diff --git a/blog/urls.py b/blog/urls.py
index 9ec83613..65508982 100644
--- a/blog/urls.py
+++ b/blog/urls.py
@@ -3,4 +3,5 @@ from . import views
urlpatterns = [
path('', views.home, name='home'),
+ path('account', views.account, name='account'),
]
diff --git a/blog/views.py b/blog/views.py
index 699940a6..1e01248e 100644
--- a/blog/views.py
+++ b/blog/views.py
@@ -1,6 +1,18 @@
from django.shortcuts import render
+from users.models import UserProfile
+import hashlib
# Create your views here.
def home(request):
return render(request, 'home.html', {'title': 'Home'})
+
+def account(request):
+ user = request.user
+ try:
+ user_profile = UserProfile.objects.get(user=user)
+ avatar = hashlib.md5(str(user_profile.gravatar_email).lower().encode('utf-8')).hexdigest() if user_profile.gravatar_email else hashlib.md5(str(user.email).lower().encode()).hexdigest()
+ except UserProfile.DoesNotExist:
+ user_profile = None
+ avatar = hashlib.md5(str(user.email).lower().encode()).hexdigest()
+ return render(request, 'account.html', {'title': 'Account', 'user_profile': user_profile, 'avatar': avatar})
diff --git a/users/admin.py b/users/admin.py
index 8c38f3f3..f5116502 100644
--- a/users/admin.py
+++ b/users/admin.py
@@ -1,3 +1,6 @@
from django.contrib import admin
# Register your models here.
+from .models import UserProfile
+
+admin.site.register(UserProfile)
diff --git a/users/migrations/0001_initial.py b/users/migrations/0001_initial.py
new file mode 100644
index 00000000..fd66accf
--- /dev/null
+++ b/users/migrations/0001_initial.py
@@ -0,0 +1,29 @@
+# Generated by Django 4.0.6 on 2022-07-29 15:58
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='UserProfile',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('location', models.CharField(blank=True, max_length=50)),
+ ('bio', models.TextField(blank=True)),
+ ('gravatar_email', models.EmailField(blank=True, max_length=254)),
+ ('is_public', models.BooleanField(default=False)),
+ ('email_public', models.BooleanField(default=False)),
+ ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+ ],
+ ),
+ ]
diff --git a/users/models.py b/users/models.py
index 71a83623..b67b1274 100644
--- a/users/models.py
+++ b/users/models.py
@@ -1,3 +1,18 @@
+from django.conf import settings
from django.db import models
-# Create your models here.
+# User Profile Model
+class UserProfile(models.Model):
+ user = models.ForeignKey(
+ settings.AUTH_USER_MODEL,
+ on_delete=models.CASCADE,
+ )
+ location = models.CharField(max_length=50, blank=True)
+ bio = models.TextField(blank=True)
+ gravatar_email = models.EmailField(blank=True)
+ is_public = models.BooleanField(default=False)
+ email_public = models.BooleanField(default=False)
+
+ def __str__(self):
+ return self.user.username
+