From bc1dc83763b812ddd54052f7f618abeca3970e6e Mon Sep 17 00:00:00 2001 From: fathonidf Date: Wed, 20 Sep 2023 14:19:41 +0700 Subject: [PATCH] tutorial 3 selesai --- db.sqlite3 | Bin 135168 -> 139264 bytes main/migrations/0002_product_user.py | 22 ++++++++ main/models.py | 2 + main/templates/login.html | 45 ++++++++++++++++ main/templates/main.html | 8 +++ main/templates/register.html | 34 ++++++++++++ main/urls.py | 5 +- main/views.py | 51 ++++++++++++++++-- .../__pycache__/settings.cpython-311.pyc | Bin 2675 -> 3131 bytes 9 files changed, 162 insertions(+), 5 deletions(-) create mode 100644 main/migrations/0002_product_user.py create mode 100644 main/templates/login.html create mode 100644 main/templates/register.html diff --git a/db.sqlite3 b/db.sqlite3 index 7eb0d1ec596199e1ec89661e20968bd5b177150c..fc6f722c146118add224469201e6b27b83953221 100644 GIT binary patch delta 1468 zcmah}OKcNI7~a`6j%{L3C<#%8qBtfgAc4K_^}0}4Cr+^AXB;Q7dvMlXKi2Q8-?@aO zJ(UYIsx0+FIrVXAA!@CPRzj!}+z_Zpl|oU)g-4G)ph`&X+6V+xZAY5XX#Rix`R4z= z|3CYg?(8+)`Gfm-1VJq7d@)X4I7R{f^6EvXJ7`o7hYgRn2Zj!#hQ~X^(Dw$G9^QkD z*o2}emv9^>;}xYW)swY&y_!-;oTQH9{BaUDrR)==S?SyLb2jsu9la>HHw>e*X2h3O@yoiw_6#C zCUGJy*0SZ2tmfr4ws6A1*sUDR5{%uTCLD!N5cmZCv9oXWK0KhqMnLap=pZ((e;MJ* zs%A(F;4=h1Q{C>s?Ryu^Ll~yl_k@F}w3&7hgUZY;)5ews?D2gN7HEpjHu##jp5){V zQ^+K^^?Z#;rIKYf)vnvq)|98UlykWPO<4#nq~g`C1@a&E@8tyx^APX(1Y#!IPdyxan$ng3h*omUT|^LbDw8FGN_6 z5}YNI0fiURD^kFPJBT$|SqM4!T-44*BlX}+FzBL*pdfo&N@zLEw5w$=eK;+67L^#s zuQwA+w4ZqbKaSJ=I(beG&8qsi@{Q)a1%ew0oHX6h-_>3>HU~e_4)0mke6shc{*=zO z_XKtm+~~e@8e9V1hdFQyy?px^+Pyvt7=R+d?LP;+-AW0Z2i?1Fun6`a7@e2^oB5iU zD5Uxolu?go|m8%e9IHCVi_p9zL?GyFEBKj0Nhh0N|LLPxj zNXT>@6?&ZZhx>vsifJir*SiWn1{%XdB-wc&g80TJLJy42O@Yk`xg@1py&myee~8Oc zJjJsTE)wjkM#J=iOIUQ7-ToQZirMn2sow=&y=O58{I9!M%ttJ}?h`l2lI192)sDKx zI~S5*?DK~Spwl1-w%h$Z2X10-Z+WPJ(Jhy{*lgfKe(POzH#Md1I*&v!1}q(I0{qx1 z6~GF5)UX47`z!F>HK4;$c&{&S>mkgi|33luYNscC_&~k$3p_H03HpEMyH_Xx?jmqk k^}Y?K4uJt=WI}&bUn^I{7X?aCS-BvVGUlwPh!wH)HzMt%5&!@I delta 431 zcmZoTz|pXPV}i7x5(5K+A`ruX^+X+GMx~7j^Z7Z1d4Yn$-13vz1=KeyDtzSHEHC|t zMHDE=&R@pF|C0X-|8D*={%-zR{3|vK79{XbF4I>L;NfDH=SVCq$%rp4PA%f+p1evw zlu>w-0gJ(AmIv$tjO?2Q8{YFz3}9V!Kw#1V7B)uyI}H4Hfch`-Prfr>K_IapF%M)h zg8+zN;6hTq=>SWE5*N!<27VR3OPp8P4)K=rbg_xBhOil*kOu&V^L-cq diff --git a/main/migrations/0002_product_user.py b/main/migrations/0002_product_user.py new file mode 100644 index 0000000..eab9bf7 --- /dev/null +++ b/main/migrations/0002_product_user.py @@ -0,0 +1,22 @@ +# Generated by Django 4.2.4 on 2023-09-20 07:13 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('main', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='product', + name='user', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + preserve_default=False, + ), + ] diff --git a/main/models.py b/main/models.py index 5f1f117..45b6da8 100644 --- a/main/models.py +++ b/main/models.py @@ -1,6 +1,8 @@ from django.db import models +from django.contrib.auth.models import User class Product(models.Model): + user = models.ForeignKey(User, on_delete=models.CASCADE) name = models.CharField(max_length=255) date_added = models.DateField(auto_now_add=True) price = models.IntegerField() diff --git a/main/templates/login.html b/main/templates/login.html new file mode 100644 index 0000000..ce64cd6 --- /dev/null +++ b/main/templates/login.html @@ -0,0 +1,45 @@ +{% extends 'base.html' %} + +{% block meta %} + Login +{% endblock meta %} + +{% block content %} + + + +{% endblock content %} \ No newline at end of file diff --git a/main/templates/main.html b/main/templates/main.html index c9ab67d..cb660de 100644 --- a/main/templates/main.html +++ b/main/templates/main.html @@ -31,10 +31,18 @@
Class:

+
Sesi terakhir login: {{ last_login }}
+ + + + + {% endblock content %} \ No newline at end of file diff --git a/main/templates/register.html b/main/templates/register.html new file mode 100644 index 0000000..9bed1d0 --- /dev/null +++ b/main/templates/register.html @@ -0,0 +1,34 @@ +{% extends 'base.html' %} + +{% block meta %} + Register +{% endblock meta %} + +{% block content %} + + + +{% endblock content %} \ No newline at end of file diff --git a/main/urls.py b/main/urls.py index 171820e..d831b0a 100644 --- a/main/urls.py +++ b/main/urls.py @@ -1,9 +1,12 @@ from django.urls import path -from main.views import show_main, create_product, show_xml, show_json, show_xml_by_id, show_json_by_id +from main.views import show_main, create_product, show_xml, show_json, show_xml_by_id, show_json_by_id, register, login_user, logout_user app_name = 'main' urlpatterns = [ + path('register/', register, name='register'), + path('login/', login_user, name='login'), + path('logout/', logout_user, name='logout'), path('create-product', create_product, name='create_product'), path('xml/', show_xml, name='show_xml'), path('json/', show_json, name='show_json'), diff --git a/main/views.py b/main/views.py index f353559..85da0f2 100644 --- a/main/views.py +++ b/main/views.py @@ -1,3 +1,4 @@ +import datetime from django.shortcuts import render from django.http import HttpResponseRedirect from main.forms import ProductForm @@ -5,15 +6,22 @@ from main.models import Product from django.http import HttpResponse from django.core import serializers +from django.shortcuts import redirect +from django.contrib.auth.forms import UserCreationForm +from django.contrib import messages +from django.contrib.auth import authenticate, login, logout +from django.contrib.auth.decorators import login_required # Create your views here. +@login_required(login_url='/login') def show_main(request): - products = Product.objects.all() + products = Product.objects.filter(user=request.user) context = { - 'name': 'Daffa Mohamad Fathoni', + 'name': request.user.username, 'class': 'PBP E', - 'products': products + 'products': products, + 'last_login': request.COOKIES['last_login'] } return render(request, "main.html", context) @@ -21,12 +29,47 @@ def create_product(request): form = ProductForm(request.POST or None) if form.is_valid() and request.method == "POST": - form.save() + product = form.save(commit=False) + product.user = request.user + product.save() return HttpResponseRedirect(reverse('main:show_main')) context = {'form': form} return render(request, "create_product.html", context) +def register(request): + form = UserCreationForm() + + if request.method == "POST": + form = UserCreationForm(request.POST) + if form.is_valid(): + form.save() + messages.success(request, 'Your account has been successfully created!') + return redirect('main:login') + context = {'form':form} + return render(request, 'register.html', context) + +def login_user(request): + if request.method == 'POST': + username = request.POST.get('username') + password = request.POST.get('password') + user = authenticate(request, username=username, password=password) + if user is not None: + login(request, user) + response = HttpResponseRedirect(reverse("main:show_main")) + response.set_cookie('last_login', str(datetime.datetime.now())) + return response + else: + messages.info(request, 'Sorry, incorrect username or password. Please try again.') + context = {} + return render(request, 'login.html', context) + +def logout_user(request): + logout(request) + response = HttpResponseRedirect(reverse('main:login')) + response.delete_cookie('last_login') + return response + def show_xml(request): data = Product.objects.all() return HttpResponse(serializers.serialize("xml", data), content_type="application/xml") diff --git a/shopping_list/__pycache__/settings.cpython-311.pyc b/shopping_list/__pycache__/settings.cpython-311.pyc index 7eefb50e53c784d055195fb32d1dab007d59c917..a04bd29c0033814d8ad4467d661e13e44c4a24cc 100644 GIT binary patch delta 849 zcmZ8f&r2IY6rR~#vzy)Q=9k7qts14$q+lsg=|O~Owlw`=YO+#0g$CnW(oJJhqDb-L z7CcxH)b2qkLW2iO>7fUY{SQhHrUWW`@=pl#ALt|!v3)adzPB^q_vXD}|8#y2DxYOp zMATyISbyl=SAvs2FhU0i5J7-}DdJ^@Ft{1BMV7EF!3m~sc2<0*GpwKh-F*Y!GjyS6EgO_xI5B!wXNm&~Rx{eqFlP+DZ41tdp5@=s_ z9U<^h_P3+!NNXMZ?-d3hOa_6?pvcf^KTcpgYvq`PY>Q9Rsl@z@mQ2mwKRsc-uwmPk zh->lbct*|6rytwyxR!d7oXMuuxp_6CWh(B|Imb;b*p8Le#Z_a;TH^;sB4L})W}&>4 z&D#8%#no3uBUfQ*Nj9&S){IKIWHaRz>l;5Z$f~6^o29$9m{Dias+N7EKDW7Cxm>Jp zRAF842FpOsdLU$iTr-!=70O1*mNHsgYZj79Y1T*KtvEs1&3|X*r`6{id2x;uvo+3< z(`=1~1Gzj~V|&8;shz3cQuvn?u1Ul7=8V>*yQXmN@S6F}*YB1$mrb^zASI1Wk*XB$ z?!xxMUa_jy ybuM@oiq^Q>4Ugp%pWV7pJUjW_;&$=yUUi|SjMkM=Q)-APFn)%7m$NcP8~F?2bjFqd delta 418 zcmYL_J4*vW5XX1!&b!=RZu7V###dnz2}(K(vGNfS1(hg>+nkR%&I=b$q9Vk?FJKe4 zuuxD^C}NpX8#_zud;qZw3f8WQILyp{cjh;{%Rb~kGVIp2DUo)u3EqO;WcjgoxjQFF zI6*)qgqp$?APVsmPrU&`?q&Siwbp!cnzxD5YR_Nkf5mlFxq%vwVUG{o^a<)M;8dz1 z)xsE$qv`2L8x|oxpoW(0#aj>n+LxM~v5|3x2~0{V^-W>=QVD=3(7}wP9L)aY(cF*p z2H$cV#4 zV+gBTdwx{H?NTj5FFYts2maL2VKf(bAubhrJBI6GwBx!RV}I*#Hw?DxsyswI#|jo* zEzeZSYwlusLohQCCuT*wn#Z&#f$wiSSQb7lh$}j*cNt+75O4Gf`o*KQ?sO^1jlYoe Juh&N;{ssN}W5WOd