diff --git a/users/admin.py b/users/admin.py index 8c38f3f..123dd95 100644 --- a/users/admin.py +++ b/users/admin.py @@ -1,3 +1,5 @@ from django.contrib import admin +from .models import Profile # Register your models here. +admin.site.register(Profile) diff --git a/users/forms.py b/users/forms.py new file mode 100644 index 0000000..b3f1a74 --- /dev/null +++ b/users/forms.py @@ -0,0 +1,26 @@ +from django import forms +from django.contrib.auth.models import User +from django.contrib.auth.forms import UserCreationForm +from .models import Profile + + +class UserRegisterForm(UserCreationForm): + email = forms.EmailField() + + class Meta: + model = User + fields = ['username', 'email', 'password1', 'password2'] + + +class UserUpdateForm(forms.ModelForm): + email = forms.EmailField() + + class Meta: + model = User + fields = ['username', 'email'] + + +class ProfileUpdateForm(forms.ModelForm): + class Meta: + model = Profile + fields = ['profile_pic'] diff --git a/users/migrations/0001_initial.py b/users/migrations/0001_initial.py new file mode 100644 index 0000000..19e2497 --- /dev/null +++ b/users/migrations/0001_initial.py @@ -0,0 +1,25 @@ +# Generated by Django 3.1 on 2020-08-15 06:28 + +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='Profile', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('image', models.ImageField(default='default.jpg', upload_to='profile_pics')), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/users/migrations/0002_auto_20200815_0300.py b/users/migrations/0002_auto_20200815_0300.py new file mode 100644 index 0000000..502a8cc --- /dev/null +++ b/users/migrations/0002_auto_20200815_0300.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1 on 2020-08-15 07:00 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0001_initial'), + ] + + operations = [ + migrations.RenameField( + model_name='profile', + old_name='image', + new_name='pfp', + ), + ] diff --git a/users/migrations/0003_auto_20200815_0302.py b/users/migrations/0003_auto_20200815_0302.py new file mode 100644 index 0000000..8284d9e --- /dev/null +++ b/users/migrations/0003_auto_20200815_0302.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1 on 2020-08-15 07:02 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0002_auto_20200815_0300'), + ] + + operations = [ + migrations.RenameField( + model_name='profile', + old_name='pfp', + new_name='profile_pic', + ), + ] diff --git a/users/models.py b/users/models.py index 71a8362..c677c3e 100644 --- a/users/models.py +++ b/users/models.py @@ -1,3 +1,25 @@ from django.db import models # Create your models here. + +from django.db import models +from django.contrib.auth.models import User +from PIL import Image + + +class Profile(models.Model): + user = models.OneToOneField(User, on_delete=models.CASCADE) + profile_pic = models.ImageField(default='default.jpg', upload_to='profile_pics') + + def __str__(self): + return f'{self.user.username} Profile' + + def save(self, *args, **kwargs): + super().save(*args, **kwargs) + + img = Image.open(self.profile_pic.path) + + if img.height > 300 or img.width > 300: + output_size = (300, 300) + img.thumbnail(output_size) + img.save(self.profile_pic.path) diff --git a/users/signals.py b/users/signals.py new file mode 100644 index 0000000..cb32c48 --- /dev/null +++ b/users/signals.py @@ -0,0 +1,13 @@ +from django.db.models.signals import post_save +from django.contrib.auth.models import User +from django.dispatch import receiver +from .models import Profile + +@receiver(post_save, sender=User) +def create_profile(sender, instance, created, **kwargs): + if created: + Profile.objects.create(user=instance) + +@receiver(post_save, sender=User) +def save_profile(sender, instance, **kwargs): + instance.profile.save() diff --git a/users/templates/users/login.html b/users/templates/users/login.html new file mode 100644 index 0000000..4d8b33a --- /dev/null +++ b/users/templates/users/login.html @@ -0,0 +1,28 @@ +{% extends "news/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +
+
+ {% csrf_token %} +
+ Log In + {{ form|crispy }} +
+
+ + + Forgot Password? + +
+
+
+ + Need An Account? Sign Up Now + +
+
+ + Login with Google + Login with GitHub
+ Login with Facebook +{% endblock content %} diff --git a/users/templates/users/logout.html b/users/templates/users/logout.html new file mode 100644 index 0000000..2edbc24 --- /dev/null +++ b/users/templates/users/logout.html @@ -0,0 +1,9 @@ +{% extends "news/base.html" %} +{% block content %} +

You have been logged out

+
+ + Log In Again + +
+{% endblock content %} diff --git a/users/templates/users/profile.html b/users/templates/users/profile.html new file mode 100644 index 0000000..ecbc3b1 --- /dev/null +++ b/users/templates/users/profile.html @@ -0,0 +1,25 @@ +{% extends "news/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +
+
+ +
+ +

{{ user.email }}

+
+
+
+ {% csrf_token %} +
+ Your profile + {{ userForm|crispy}} + {{ profileForm|crispy }} +
+
+ +
+
+
+
+{% endblock content %} diff --git a/users/templates/users/register.html b/users/templates/users/register.html new file mode 100644 index 0000000..fc16e5a --- /dev/null +++ b/users/templates/users/register.html @@ -0,0 +1,22 @@ +{% extends "news/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +
+
+ {% csrf_token %} +
+ Join Today + {{ form|crispy }} +
+
+ +
+
+
+ + Already Have An Account? Sign In + +
+
+{% endblock content %} +© 2020 GitHub, Inc. diff --git a/users/views.py b/users/views.py index 91ea44a..73fbd06 100644 --- a/users/views.py +++ b/users/views.py @@ -1,3 +1,41 @@ -from django.shortcuts import render +from django.shortcuts import render, redirect +from django.contrib import messages +from django.contrib.auth.decorators import login_required +from .forms import UserRegisterForm, UserUpdateForm, ProfileUpdateForm -# Create your views here. +def register(request): + if request.method == 'POST': + form = UserRegisterForm(request.POST) + if form.is_valid(): + form.save() + username = form.cleaned_data.get('username') + messages.success(request, f'Your account has been created! You are now able to log in') + return redirect('login') + else: + form = UserRegisterForm() + return render(request, 'users/register.html', {'form': form}) + + +@login_required +def profile(request): + if request.method == "POST": + userForm = UserUpdateForm(request.POST, instance=request.user) + profileForm = ProfileUpdateForm(request.POST, + request.FILES, + instance=request.user.profile) + + if userForm.is_valid() and profileForm.is_valid(): + userForm.save() + profileForm.save() + messages.success(request, "Your account has been updated!") + return redirect('profile') + else: + userForm = UserUpdateForm(instance=request.user) + profileForm = ProfileUpdateForm(instance=request.user.profile) + + context = { + 'userForm': userForm, + 'profileForm': profileForm + } + + return render(request, 'users/profile.html', context)