From 912634b206cc6f101805518f60812fc9934c5928 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Fri, 12 Dec 2025 13:17:36 +0000 Subject: [PATCH] Register and login work...sort of --- cookies.txt | 2 +- core/__pycache__/forms.cpython-311.pyc | Bin 2354 -> 2595 bytes core/__pycache__/urls.cpython-311.pyc | Bin 597 -> 686 bytes core/__pycache__/views.cpython-311.pyc | Bin 1690 -> 2602 bytes core/forms.py | 5 +- core/migrations/0001_initial.py | 44 +++++++++++++++--- .../__pycache__/0001_initial.cpython-311.pyc | Bin 1812 -> 5061 bytes core/templates/core/dashboard.html | 15 ++++++ core/templates/core/login.html | 16 +++++-- core/urls.py | 3 +- core/views.py | 26 ++++++++--- 11 files changed, 92 insertions(+), 19 deletions(-) create mode 100644 core/templates/core/dashboard.html diff --git a/cookies.txt b/cookies.txt index 4133569..34ed13f 100644 --- a/cookies.txt +++ b/cookies.txt @@ -2,4 +2,4 @@ # https://curl.se/docs/http-cookies.html # This file was generated by libcurl! Edit at your own risk. -127.0.0.1 FALSE / TRUE 1796991812 csrftoken cXuPVQPkN93dgAsbLP1e8OsLOYhW3Mkl +127.0.0.1 FALSE / TRUE 1796993740 csrftoken O0Vgh9DkmoXw8WCtMNdqOcunv8UiueAy diff --git a/core/__pycache__/forms.cpython-311.pyc b/core/__pycache__/forms.cpython-311.pyc index d1f8e917d69168bc0ae8cc0ea90fa2cf3277c95a..04258752a02d21b518a8db262180f73c3926be13 100644 GIT binary patch delta 906 zcmZuvO=}ZT6n$@IGGA?Mj5eCu>iALVNJT_k6pOaRRxEWAs$DoJL(II^l$ngYNx_vy z5W!`bMcoTZ=t{+ZpbK}!mArr8PQjHc?|qS?Y3Jkc?z!jPJLkT6UwnNy|2Chu30$v6 zXPaByeA#;e!4?TgNFx$cpHf^akrJ!E8f(4=u^MVoF4lcLHhhB;h1?)v?l}o{roK@L z*@m}&`DXXgv6>|X76@#n4G8RT=r(bOzoXuzBDa?CICT|KSWOwPa8_?Olhz`TqBy_V ze#lzwX5-yPKDmU;;g3$EoIRfpTHW&QDOx_BdVuq5TqK!j^lLrQOr8oC-q4coAv0Op1}_y zSwuL5fMQ-oZ~#R9ZS7dh=CFc;PQTLC93rHf!DV)bh?m#NLMoUi*z+#Iq;?t1$N=V_X6=5wW>rHv6 zo~sT{alrIttcifO(h-2p?)^HU@f-$voP;b& z`$LiT<@}`s+2sGmzs*_Luo?T~$*?4y~?j8SU+AbVk_aOx-0 KzxK(=@Bag}eYV>G delta 642 zcmZXQOH15P6vyw$o!lg&(NSkw2VcQg8~UItS7HUxG9WXc<0c3}CK(VC25wLag|>oU zV7QB}x+sN~p_@Jy{RG{M%WS&t&ZTzcId?>q3CWLh{^x(sxhJ2?KgZp#u3KdI9E;V% zX4kF0Yh&_(MJ$4Zr4Rs6Y$Qg?1CB9|3P~X~12YwY0A{dPEHY17Bx3%BGxiO?{u5Zb zW?{`9sM(RT%lzU$vigvl?T$<{3`%<IX;v@;f9>_P<iR^Qs*+pKSF?#OvkEy4m}k+6gqSh8!Ktm*!b z$>I~9knhgbpOZ+?i$A4IpCGC3JL=qiww{Z$6U9l^zm6WPH`Zq>w@2vD{M|8^PL5^_@Dljd>1s3CrEXG$@j6ZO*@iR4WgJ6*W&?W$@5Jv_8 delta 194 zcmZ3-dX+_eIWI340}!aQ*<^AuGB7*_abSQ0%J@8OqPqITpe(s`mMHcV-e3kzzLy{= zO~zX+1&JjYFM%2vG+8EoQJ5^xXu<5K$uT*bQFroOMqdv>pbSX1cm|O8z|6?Vc!NRa f0xEjIU~qvDnry)oB=CWgm7l4B8w88^f#v}KMrACl diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index cdb0bc946d5dcc7dc7d8e16376974adf4ab107b4..4390aa411e069292c9afd256e4b5fb6ed84b4407 100644 GIT binary patch literal 2602 zcmbtV-D}%c6u;M&CEIdhXKL%LDRWsH8nZY~yOy=INf}E<$3`~D#)cUb)lw6+mgHT@ zNk5#@K_A>vXgdbU+x$>6mz2?`(LX~9f*OIJMj!eXD1*_boqKJowwsQQ9ps7i`+s5QQ-j-iU7zdQNST31~{z57g1JxPLIike4eO=q7pw! zR7E3d(T1@|$z0M5KOtA_W!12?qHL?rG1U+IBcGUhSvIaNYD>m9POg?Bn4|B2*{EEZlabra_@*UHtC8vPs}-7?gb2^|9giKc66C&Ma@`Zw;&1F zmJ9*3ttUxn`a(yAP-CKWvd^k1SIm22-r@3O1Sb2e;$eV!whG=@M^$tQ2HK+F%gm?b zzD+ecQl&b9uOEf_eZPjQxZb1PU4_slG`E5-xmd-QXjGZhsV83(CA8E&I`mr4mEdRX->sb(iA^YEUB`gD(Bg0 z;U(23G#mUlW$<~n8KEI!yvat$Fm3Or@X7{`+Gx@69i+n2kVPFxR*R$xu9+V5(i2b9liTUZ zM!`*=^wKA5=XM`$NtwpzlXH$V?@IHYG+&!*CM74CX{GjWd{m!vQ&}&SbyC?@I#UJK}UpI$Zzu!S}9o%#)7Q=4x}#q$3UCQNoo@c+v^T;9fq2 zW7(#ZUO)Bosr#pYIbEA;CHCE0t#fW-+)Io*iSd>+w(+?uO?c9TlbF~MK>x2eN*#8S z<6d$+NbuZa{t4H(;fk}KIO}k;uO~RYJiXJST$FLmaMrePE9!W6Ao?Xtr{NE6wQ&=P3% z1e(=A`fjsllEsZ#^ANE!S?zimJ)@gSrKHZ14?vUh&uRedgfYfVlyi3bn&@L^x37uj poi~3w9L7^SC;%SgY1-`opTM&_D1ZYA40SPp0~jBp%7ege@(&@h8;bw{ delta 629 zcmZvY&ubJh6vro>Ofs{bUDs~Kf>;OLp$>&ELJ?|-3O$rS|A3yl;LVfCR1~ox`H+`<^L;Px+w8}B<4e6>Gt}52 zYvH0Vn*Pv_J zZuV2)oh%$AqhaMO@kR=9P?IF)`DV)Cijqllz;mG5($=9JX0Nt-QOG3DdRzQFHP+Xr zLSTZc_j6i`N7;1_nLhWt-(Mu>`CwihHpC~|yW=0XuI{but`w^uR^L88aWB7L7%v~X z-jVB-u6NS9Hhyy0Y9F=QrQ4oR)A2>e_GweSe-=!OGyCpCY3aJNzeQI6gBc~M@_bd@ z(0kqEpY~duvQfnE!z~r+=4bE3wsZ5gUmE|+W8+?V(G;cQEh4luG5&zK=)uJJA6434 D*9@IS diff --git a/core/forms.py b/core/forms.py index f4ce4f5..3beef9e 100644 --- a/core/forms.py +++ b/core/forms.py @@ -1,5 +1,5 @@ from django import forms -from django.contrib.auth.forms import UserCreationForm +from django.contrib.auth.forms import UserCreationForm, AuthenticationForm from .models import User, Profile class CompanySignUpForm(UserCreationForm): @@ -27,3 +27,6 @@ class InfluencerSignUpForm(UserCreationForm): user.save() Profile.objects.create(user=user) return user + +class LoginForm(AuthenticationForm): + pass diff --git a/core/migrations/0001_initial.py b/core/migrations/0001_initial.py index 65701c9..075908a 100644 --- a/core/migrations/0001_initial.py +++ b/core/migrations/0001_initial.py @@ -1,6 +1,10 @@ -# Generated by Django 5.2.7 on 2025-12-12 12:06 +# Generated by Django 5.2.7 on 2025-12-12 12:58 +import django.contrib.auth.models +import django.contrib.auth.validators import django.db.models.deletion +import django.utils.timezone +from django.conf import settings from django.db import migrations, models @@ -9,26 +13,54 @@ class Migration(migrations.Migration): initial = True dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), ] operations = [ migrations.CreateModel( - name='Influencer', + name='User', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255)), - ('bio', models.TextField()), - ('profile_picture', models.ImageField(blank=True, null=True, upload_to='influencer_profile_pictures/')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('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')), + ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')), + ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), + ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')), + ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), + ('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')), + ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), + ('role', models.CharField(choices=[('COMPANY', 'Company'), ('INFLUENCER', 'Influencer')], max_length=50)), + ('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')), + ('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')), + ], + options={ + 'verbose_name': 'user', + 'verbose_name_plural': 'users', + 'abstract': False, + }, + managers=[ + ('objects', django.contrib.auth.models.UserManager()), ], ), migrations.CreateModel( name='Profile', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('bio', models.TextField(blank=True)), + ('profile_picture', models.ImageField(blank=True, null=True, upload_to='profile_pictures/')), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='SocialProfile', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('platform', models.CharField(max_length=255)), ('handle', models.CharField(max_length=255)), ('url', models.URLField()), - ('influencer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='profiles', to='core.influencer')), + ('profile', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='social_profiles', to='core.profile')), ], ), ] diff --git a/core/migrations/__pycache__/0001_initial.cpython-311.pyc b/core/migrations/__pycache__/0001_initial.cpython-311.pyc index 590cb8493027574ae15e92593b411d80d97220e7..1ad14ab6f4229e010f890e69837a90aac2282869 100644 GIT binary patch literal 5061 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 literal 1812 zcmb6ZJ8UCGbarj8y^a&x`Ps&p9LPmB;o=?J23Qf!STJ1D7kp?9Q9_n|YskZ+;#g zjsrTriY&{2gaP==C4v#@BbVzG`2j!x83mLXy0Qw}43$I8a5>BX7CZzn^c{d<6lw%} zz-b78GdlfIjzDG?2$AP5xg)S7-jwUQWXhUq5U!~~q!`t{uD6WziOWA3*EaI(mRZP@ zLv>INvj9aJT(AMMFhn`gMr^=gAOpiNa?YL7sLts0M~#J1Pm>QgFm}$LQX6M<4s_z4 zj+YsicS`4(FQky3G33dI0v5H!z{L6Re`Bt(_3-(~DNFa#=?}W^-+m|mhu^7N_?^Cm z&Zwu82t2wG+n6UG4&-R0kqq!gbbzG>SUSMqIGi}2ype;*t2wB%M3NB2 zZ!Af1L#I?!R%MeWha@0sAr;cR%E-{&h9pC4UN*PguG8JtAc>FU`YO%yh8qdt*Y+j7 zkM5yE(?{c*O{tE2Jofo#TYc^ZbziQlkLZ1Hupy~+jj*snVqO5Wy-9R!b$4xb{bLf> zTBzUhzko|>7QFnhw68T$$*NeYX_e3+s!}KP(qm0OFj`U-mE7c%uAhq1{QUequ^-x8 z>qvK>01vp8X{fY^PX^z!kB6)01kTJnY1^5Zi}3G7 zTo$pa~KFOyIH}` z3OF@GgT_d-4a{|4{5r+7!b zPqCM=WxuK)=nIr|A7-OMffHgF#^C_-HU@Y6zXzuA>wbsJGn@l%f+ul1Rea$Ju3jVc GeE0|FrRWC$ diff --git a/core/templates/core/dashboard.html b/core/templates/core/dashboard.html new file mode 100644 index 0000000..16ec8bf --- /dev/null +++ b/core/templates/core/dashboard.html @@ -0,0 +1,15 @@ +{% extends "base.html" %} +{% load static %} + +{% block title %}Dashboard - MarketMatchr{% endblock %} + +{% block content %} +
+
+
+

Welcome, {{ user.username }}!

+

This is your dashboard. You are logged in as a {{ user.role }}.

+
+
+
+{% endblock %} diff --git a/core/templates/core/login.html b/core/templates/core/login.html index 61faa81..d96d7f1 100644 --- a/core/templates/core/login.html +++ b/core/templates/core/login.html @@ -4,10 +4,18 @@ {% block content %}
-
-
-

Login

-

This is a placeholder for the login page.

+
+
+
+
+

Login

+
+ {% csrf_token %} + {{ form.as_p }} + +
+
+
diff --git a/core/urls.py b/core/urls.py index 2d1f36c..f891ab5 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,10 +1,11 @@ from django.urls import path -from .views import index, pricing, login, signup +from .views import index, pricing, login, signup, dashboard urlpatterns = [ path("", index, name="index"), path("pricing/", pricing, name="pricing"), path("login/", login, name="login"), path("signup/", signup, name="signup"), + path("dashboard/", dashboard, name="dashboard"), ] diff --git a/core/views.py b/core/views.py index 02b3f65..e450b28 100644 --- a/core/views.py +++ b/core/views.py @@ -1,6 +1,6 @@ from django.shortcuts import render, redirect -from django.contrib.auth import login -from .forms import CompanySignUpForm, InfluencerSignUpForm +from django.contrib.auth import login as auth_login, authenticate +from .forms import CompanySignUpForm, InfluencerSignUpForm, LoginForm def index(request): return render(request, 'core/index.html') @@ -9,7 +9,18 @@ def pricing(request): return render(request, 'core/pricing.html') def login(request): - return render(request, 'core/login.html') + if request.method == 'POST': + form = LoginForm(request, data=request.POST) + if form.is_valid(): + username = form.cleaned_data.get('username') + password = form.cleaned_data.get('password') + user = authenticate(username=username, password=password) + if user is not None: + auth_login(request, user) + return redirect('dashboard') + else: + form = LoginForm() + return render(request, 'core/login.html', {'form': form}) def signup(request): if request.method == 'POST': @@ -19,8 +30,11 @@ def signup(request): form = InfluencerSignUpForm(request.POST) if form.is_valid(): user = form.save() - login(request, user) - return redirect('index') + auth_login(request, user) + return redirect('dashboard') else: form = InfluencerSignUpForm() - return render(request, 'core/signup.html', {'form': form}) \ No newline at end of file + return render(request, 'core/signup.html', {'form': form}) + +def dashboard(request): + return render(request, 'core/dashboard.html') \ No newline at end of file