From 8aee2d7e9c322c898cc4418a0860a8bb4f149b24 Mon Sep 17 00:00:00 2001
From: adu013
Date: Thu, 5 Sep 2019 23:16:47 +0530
Subject: [PATCH] Initial Commit
---
.gitignore | 2 +
requirements.txt | 3 +
website/accounts/__init__.py | 0
.../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 159 bytes
.../accounts/__pycache__/admin.cpython-37.pyc | Bin 0 -> 200 bytes
.../accounts/__pycache__/apps.cpython-37.pyc | Bin 0 -> 379 bytes
.../accounts/__pycache__/forms.cpython-37.pyc | Bin 0 -> 753 bytes
.../__pycache__/models.cpython-37.pyc | Bin 0 -> 197 bytes
.../__pycache__/tokens.cpython-37.pyc | Bin 0 -> 681 bytes
.../accounts/__pycache__/urls.cpython-37.pyc | Bin 0 -> 1180 bytes
.../accounts/__pycache__/views.cpython-37.pyc | Bin 0 -> 1993 bytes
website/accounts/admin.py | 3 +
website/accounts/apps.py | 5 +
website/accounts/forms.py | 11 ++
website/accounts/migrations/__init__.py | 0
.../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 170 bytes
website/accounts/models.py | 3 +
.../templates/accounts/acc_active_email.html | 5 +
.../accounts/templates/accounts/login.html | 17 +++
.../accounts/password-reset-complete.html | 3 +
.../accounts/password-reset-confirm.html | 17 +++
.../accounts/password-reset-done.html | 3 +
.../templates/accounts/password-reset.html | 17 +++
.../accounts/templates/accounts/signup.html | 19 +++
website/accounts/tests.py | 3 +
website/accounts/tokens.py | 13 ++
website/accounts/urls.py | 35 ++++++
website/accounts/views.py | 52 ++++++++
website/db.sqlite3 | Bin 0 -> 131072 bytes
website/manage.py | 21 ++++
website/website/__init__.py | 0
.../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 158 bytes
.../__pycache__/settings.cpython-37.pyc | Bin 0 -> 2157 bytes
.../website/__pycache__/urls.cpython-37.pyc | Bin 0 -> 347 bytes
.../website/__pycache__/wsgi.cpython-37.pyc | Bin 0 -> 561 bytes
website/website/settings.py | 116 ++++++++++++++++++
website/website/urls.py | 7 ++
website/website/wsgi.py | 16 +++
38 files changed, 371 insertions(+)
create mode 100644 .gitignore
create mode 100644 requirements.txt
create mode 100644 website/accounts/__init__.py
create mode 100644 website/accounts/__pycache__/__init__.cpython-37.pyc
create mode 100644 website/accounts/__pycache__/admin.cpython-37.pyc
create mode 100644 website/accounts/__pycache__/apps.cpython-37.pyc
create mode 100644 website/accounts/__pycache__/forms.cpython-37.pyc
create mode 100644 website/accounts/__pycache__/models.cpython-37.pyc
create mode 100644 website/accounts/__pycache__/tokens.cpython-37.pyc
create mode 100644 website/accounts/__pycache__/urls.cpython-37.pyc
create mode 100644 website/accounts/__pycache__/views.cpython-37.pyc
create mode 100644 website/accounts/admin.py
create mode 100644 website/accounts/apps.py
create mode 100644 website/accounts/forms.py
create mode 100644 website/accounts/migrations/__init__.py
create mode 100644 website/accounts/migrations/__pycache__/__init__.cpython-37.pyc
create mode 100644 website/accounts/models.py
create mode 100644 website/accounts/templates/accounts/acc_active_email.html
create mode 100644 website/accounts/templates/accounts/login.html
create mode 100644 website/accounts/templates/accounts/password-reset-complete.html
create mode 100644 website/accounts/templates/accounts/password-reset-confirm.html
create mode 100644 website/accounts/templates/accounts/password-reset-done.html
create mode 100644 website/accounts/templates/accounts/password-reset.html
create mode 100644 website/accounts/templates/accounts/signup.html
create mode 100644 website/accounts/tests.py
create mode 100644 website/accounts/tokens.py
create mode 100644 website/accounts/urls.py
create mode 100644 website/accounts/views.py
create mode 100644 website/db.sqlite3
create mode 100755 website/manage.py
create mode 100644 website/website/__init__.py
create mode 100644 website/website/__pycache__/__init__.cpython-37.pyc
create mode 100644 website/website/__pycache__/settings.cpython-37.pyc
create mode 100644 website/website/__pycache__/urls.cpython-37.pyc
create mode 100644 website/website/__pycache__/wsgi.cpython-37.pyc
create mode 100644 website/website/settings.py
create mode 100644 website/website/urls.py
create mode 100644 website/website/wsgi.py
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..82ba409
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+env
+**/.DS_Store
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..4c2e358
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,3 @@
+Django==2.2.5
+pytz==2019.2
+sqlparse==0.3.0
diff --git a/website/accounts/__init__.py b/website/accounts/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/website/accounts/__pycache__/__init__.cpython-37.pyc b/website/accounts/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4b702327346a1a61f6c2773784a9a3d83424f910
GIT binary patch
literal 159
zcmZ?b<>g`kf~Zybu^{>}h=2h`Aj1KOi&=m~3PUi1CZpd9XR@xQuk@S&v_2esfGMgCqeiD)|
zo1&Nim3aEoiuBbt|H{a$32{b*fUE(_1Y>~N0m}SMQz%(Cl4yw7`6v*V4eR`z)9gERY0!wm#K>-0-1vQh5!5v_N`~#31_ReL3={@8p
zKhy;|>n5wVy|vA*+!yg>G)7=a?$0S0kPLw)ndF$zH1Ez-Y)1
H&W!&7TSZ$Q
literal 0
HcmV?d00001
diff --git a/website/accounts/__pycache__/forms.cpython-37.pyc b/website/accounts/__pycache__/forms.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0808111ccab2e41af7850d5f9a5d4976acbb0630
GIT binary patch
literal 753
zcmZuv&2H2%5cW@!W}|M43POS>AO{k`i36$-rR4%WQ1ucCS#Ip^ri$aOov4Ltx$+>K
zcnzMxS5AEePRt}Mt4ej`(dU`*eBX@oc0SJttj9m?=MR*S-*{NB2*4ZI{uLNS6m5y2
z6{Uz-%M7phhd2>8@6T(*-5kLPFGm>_7_~O(ogzw
zXq;9#3z?DEqSf7^UxwLIw=2=>>;4WeOkwK!(H-6jc&k`3=!k#a-Eb5ibuaTMqyse2
zNuxuojcnR5TS@P)tWz&G@a1uygj5L36Cz|n7^{XB@wO0`gKVdW!{$Q_LEVPrywR=l
zKZx4{?`ZxUmN+k8O4pR{Y&{s=^}bXWvRl~aN*n7-)HA~JN}u_r*QKm$J7C`U5XI_C
zh*10ts(K_$X+#}%eVlK(Idbiw*+s*^gzOMIJ3=`Qf15FRqiRAAF%W}EVE?PT!$uF(
z4ap>OD)?kN6t(So*PIn{=$FN)&T+UMp57N9r{c#EjaBax5YpGvWcTqoJxbZ8@bSM-
CoVq&z
literal 0
HcmV?d00001
diff --git a/website/accounts/__pycache__/models.cpython-37.pyc b/website/accounts/__pycache__/models.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6640ffaaff09e119f2216485edfa929d88c92938
GIT binary patch
literal 197
zcmZ?b<>g`kf~Zybv6evkF^B^LOhASM5Elyoi4=wu#vF!R#wbQch7_h?22JLdKv4!w
z##?N;`6;P6#eSMhw>VR>67$mY^-_|GK$=%F6tMs)F!9SxKeRZts8~O-C{y1hKe;qF
zHLs*tAEH4wB{es{Sicmg0L;`cPfaS$EJ@W*Ois=(1*wDBp;u6Oi^B%UF3m}`V+0yq
H48#lo7A-P_
literal 0
HcmV?d00001
diff --git a/website/accounts/__pycache__/tokens.cpython-37.pyc b/website/accounts/__pycache__/tokens.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0d00b3a71e8cb1ed89ab31663ac2629de640316f
GIT binary patch
literal 681
zcmZ8f&2H2%5Vqs&YFo0Xhe{wgAaToqjl>zDiXwWe5I>hl$a3R>O*e@bkJD}uxAsBc
zhQbc9rl^Z`K$Hx?c_$I%~
z)8xAx5UuyNXNoaZlgD}LIWg`8*aRIe))15RD(=*%O%>`h$W=@cnvXH<5j^qg7BHB0
z{X_UWl==5n@t!WQFupEcx~gxX3s~4w(|vMJEVK>_&KzKI4kuU#C`?tko_T?1f{XP<
z+|#XDfnFM1>NC^yFl8aENF@96%cI+}7yq+KNt|ijnHIE;yIQx-_6_4q>(9Mu#v4DU
zdPCzkLdIwO(u5rOBh2KmKhCG|!6;=>xi0wnWMTTST#RjdrpD}=(1*IgVVXm3yniin
i9Ha@g>-3O!<7J+p=jY?>+1T)N`WXeX_Dp7KZ}tyQ0b^Sst39p>#;%2z@%1SQ9H1y6F9UPG{I+JGj35gaFIrIY!UaQjcx2)
z=rC)-tb6@pZ#f#=4kH$$p@z+XAjl|xPkdk8WFdSvk
zX_ygz{n_qT9^s=WkGDT=cu!w=LFg63eed9YU;482GfDn(9emq-u=(iRyIL&B!;SMk
z=s0!S!ivSA{bDX0jnX{HxG%xrIHNIaqmvQXH|P(=eo9k1i{7LvkH>_o>$=*is=`3Z^+>Zw@Nfu2dYFv;VIT@sIqw@^$q;GTK<+QjbE(Yq)>$@
zk;OV+B~m$yrJ7H5)E6!8-JDjfPQs$vj%iWFjEnsuCNZc
zT)Dy-i;f0io*fTl8!@=N8Z(8lgt3Kjz?2#jH=K#f%sK+tAs>pE(gi)Z0~uin|E{qG
zu|k;NJN^ew823XK`8(+-r$lsy()KW+Dfe?&Acy`LIpPs?=(G&t6objv(%GUZ&SSDI
d`kfEJv{4(a8f~MC4AesNr~$tgvKs$?{{f*(ZA$zO7_Y)_aO
zr`yW85UzVg9QKeNk@yaLkGXQ%ufT~n<18#-%WvMi_dN6bd%rjStkdx=xL*FwzW>;>
ztUvVR)n$Y75FYUh2x1YGSviUj(z>15xf3}#jxfv}g0n{MMy~NSvS#i@p3&W`mHUyO
zx1+Y1H?tt`M4h}Fb1sUcMjggC3C1Pge8>
z>5?rN4@mFS>Tkb5sXg!531_zoKH!3PJm}aycys<;vrfq?{)5C8`7c({x-sogXuv
z!)v`Um7}EO5G_X{mHO581>*@FonJ{RlwVIIeI~)RSMp567vPKqy?<{+i-ZySKQp1)
zte3B|7)dq~lBdNOYzJ|YuoAY56PYeznX&@>Gg^QTKNXb27#!tsnte%yh{rV1nd=Km
zWS-Aq6u*I}tSJ;`X7isV0^MGrC92Tcxv}_*3QaMwiSrySZDLpUs8QK#d}AR?x|Icy
zP_`wOO#=4HnR>D%{mP!US7?P~uXdV{y~03@
zyuYj5oXQC!+=Y7Z9th>7Vzh`e$OemeK~)Rprq+}
zwB~~f5=gwDWJF>aD+j2`w{#2^z-_J@lsh2$o@#RXLrEdy18v;VLBZ>+jslI_NR;PO
zXa&{GYi21Ah-r}E`|!@M7JnCpKaYl*hJZUyhmTlN=Fl8sNTzWyW*-uoGcnZ28+CX|
z&voDEB578O;UcA%Vlcl_ZVi|IEb##d3;A$+C_pYq4`F1R8-t~12cUOt5Bau>`1=r@
z=x@_k1D-ZKhW0;#a&<>qKzJakrm?iA&J+^HaHWkb7kiKB@PBi19afXt1P
zKH_gfE@#)rXOp;?X;y_miPzb+A)H~+AUt80CMb!E5O|&zb?64S!S&&$7vMYyvlLcL
zMVJorV*hGP8&zYC_wh4wnXe~<6!pj|CA%?x2`@g7W-
zw>i|PuAtDQvY@U3+Cc|U`(0Cc;DF6P0?$eRP1UYx1wAF_X1}Pnv4{!dGAX4nBg`kf~Zybu^{>}h=2h`Aj1KOi&=m~3PUi1CZpd&M4u=4F<|$LkeT-r}&y%}*)KNwou6Rt&@p01@vjZ2$lO
literal 0
HcmV?d00001
diff --git a/website/accounts/models.py b/website/accounts/models.py
new file mode 100644
index 0000000..71a8362
--- /dev/null
+++ b/website/accounts/models.py
@@ -0,0 +1,3 @@
+from django.db import models
+
+# Create your models here.
diff --git a/website/accounts/templates/accounts/acc_active_email.html b/website/accounts/templates/accounts/acc_active_email.html
new file mode 100644
index 0000000..afe40da
--- /dev/null
+++ b/website/accounts/templates/accounts/acc_active_email.html
@@ -0,0 +1,5 @@
+{% autoescape off %}
+Hi {{ user.username }},
+Please click on the link to confirm your registration,
+http://{{ domain }}{% url 'activate' uidb64=uid token=token %}
+{% endautoescape %}
diff --git a/website/accounts/templates/accounts/login.html b/website/accounts/templates/accounts/login.html
new file mode 100644
index 0000000..46236fd
--- /dev/null
+++ b/website/accounts/templates/accounts/login.html
@@ -0,0 +1,17 @@
+
+
+
+
+ Need An Account? Signup
+
+
+
diff --git a/website/accounts/templates/accounts/password-reset-complete.html b/website/accounts/templates/accounts/password-reset-complete.html
new file mode 100644
index 0000000..740106b
--- /dev/null
+++ b/website/accounts/templates/accounts/password-reset-complete.html
@@ -0,0 +1,3 @@
+
+ your password is reset.
+
diff --git a/website/accounts/templates/accounts/password-reset-confirm.html b/website/accounts/templates/accounts/password-reset-confirm.html
new file mode 100644
index 0000000..76c0eab
--- /dev/null
+++ b/website/accounts/templates/accounts/password-reset-confirm.html
@@ -0,0 +1,17 @@
+
diff --git a/website/accounts/templates/accounts/password-reset-done.html b/website/accounts/templates/accounts/password-reset-done.html
new file mode 100644
index 0000000..2443e8b
--- /dev/null
+++ b/website/accounts/templates/accounts/password-reset-done.html
@@ -0,0 +1,3 @@
+
+ An email has been sent. Please click on the link to reset your password
+
diff --git a/website/accounts/templates/accounts/password-reset.html b/website/accounts/templates/accounts/password-reset.html
new file mode 100644
index 0000000..76c0eab
--- /dev/null
+++ b/website/accounts/templates/accounts/password-reset.html
@@ -0,0 +1,17 @@
+
diff --git a/website/accounts/templates/accounts/signup.html b/website/accounts/templates/accounts/signup.html
new file mode 100644
index 0000000..86d8083
--- /dev/null
+++ b/website/accounts/templates/accounts/signup.html
@@ -0,0 +1,19 @@
+{% block content %}
+ Sign up
+
+ {% endfor %}
+
+
+{% endblock %}
diff --git a/website/accounts/tests.py b/website/accounts/tests.py
new file mode 100644
index 0000000..7ce503c
--- /dev/null
+++ b/website/accounts/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/website/accounts/tokens.py b/website/accounts/tokens.py
new file mode 100644
index 0000000..074849e
--- /dev/null
+++ b/website/accounts/tokens.py
@@ -0,0 +1,13 @@
+from django.contrib.auth.tokens import PasswordResetTokenGenerator
+from django.utils import six
+
+
+class TokenGenerator(PasswordResetTokenGenerator):
+ def _make_hash_value(self, user, timestamp):
+ return(
+ six.text_type(user.pk) + six.text_type(timestamp) +
+ six.text_type(user.is_active)
+ )
+
+
+account_activation_token = TokenGenerator()
diff --git a/website/accounts/urls.py b/website/accounts/urls.py
new file mode 100644
index 0000000..7f26e2d
--- /dev/null
+++ b/website/accounts/urls.py
@@ -0,0 +1,35 @@
+from django.urls import path
+from django.conf.urls import url
+from django.contrib.auth.views import (
+ LoginView, PasswordResetView, PasswordResetDoneView,
+ PasswordResetConfirmView, PasswordResetCompleteView
+)
+from . import views
+
+
+urlpatterns = [
+ url(r'^signup/$', views.signup, name='signup'),
+ url(r'^activate/(?P[0-9A-Za-z_\-]+)/(?P[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$',
+ views.activate, name='activate'),
+ path('login/', LoginView.as_view(template_name='accounts/login.html'), name='login'),
+ path(
+ 'password-reset/',
+ PasswordResetView.as_view(template_name='accounts/password-reset.html'),
+ name='password_reset'
+ ),
+ path(
+ 'password-reset/done/',
+ PasswordResetDoneView.as_view(template_name='accounts/password-reset-done.html'),
+ name='password_reset_done'
+ ),
+ path(
+ 'password-reset-confirm///',
+ PasswordResetConfirmView.as_view(template_name='accounts/password-reset-confirm.html'),
+ name='password_reset_confirm'
+ ),
+ path(
+ 'password-reset-complete',
+ PasswordResetCompleteView.as_view(template_name='accounts/password-reset-complete.html'),
+ name='password_reset_complete'
+ ),
+]
diff --git a/website/accounts/views.py b/website/accounts/views.py
new file mode 100644
index 0000000..c4e731f
--- /dev/null
+++ b/website/accounts/views.py
@@ -0,0 +1,52 @@
+from django.http import HttpResponse
+from django.shortcuts import render, redirect
+from .forms import SignUpForm
+from django.contrib.sites.shortcuts import get_current_site
+from django.utils.encoding import force_bytes, force_text
+from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
+from django.template.loader import render_to_string
+from .tokens import account_activation_token
+from django.contrib.auth.models import User
+from django.core.mail import EmailMessage
+
+
+def signup(request):
+ if request.method == 'POST':
+ form = SignUpForm(request.POST)
+ if form.is_valid():
+ user = form.save(commit=False)
+ user.is_active = False
+ user.save()
+ current_site = get_current_site(request)
+ mail_subject = 'Activate your blog account'
+ message = render_to_string(
+ 'accounts/acc_active_email.html', {
+ 'user': user,
+ 'domain': current_site.domain,
+ 'uid': urlsafe_base64_encode(force_bytes(user.pk)),
+ 'token': account_activation_token.make_token(user),
+ })
+ to_email = form.cleaned_data.get('email')
+ email = EmailMessage(
+ mail_subject, message, to=[to_email]
+ )
+ email.send()
+ return HttpResponse('Please confirm your email address to complete teh registration')
+ else:
+ form = SignUpForm()
+ return render(request, 'accounts/signup.html', {'form':form})
+
+
+def activate(request, uidb64, token):
+ try:
+ uid = force_text(urlsafe_base64_decode(uidb64))
+ user = User.objects.get(pk=uid)
+ except(TypeError, ValueError, OverflowError, User.DoesNotExist):
+ user = None
+ if user is not None and account_activation_token.check_token(user, token):
+ user.is_active = True
+ user.save()
+ login(request, user)
+ return HttpResponse('Thank you for your email confirmation. Now you can login your account.')
+ else:
+ return HttpResponse('Activation link is invalid!')
diff --git a/website/db.sqlite3 b/website/db.sqlite3
new file mode 100644
index 0000000000000000000000000000000000000000..3f7f454f678b4424be74b248ec1d2ab7ed712dc9
GIT binary patch
literal 131072
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
XLO$V_i@9tviUssA969ucw#oPphUn8k
literal 0
HcmV?d00001
diff --git a/website/website/__pycache__/urls.cpython-37.pyc b/website/website/__pycache__/urls.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..047d19f257e8f0301a827a5b2930a5958259805b
GIT binary patch
literal 347
zcmX|*y-ve06ovhlq@@kwH8K#tK!p%6vmlm83~p?dM6q4ju@G7FG;GXByogsOUV(}0
z(sCuAdwg~L`QDV}8G`!wv`_EQztZJY49qngzX6d*;sI&gV4OS|h^7tItYH`_CaI#5
z&3Go@Gll!C&u6kDO(F9KR2APqKoyRekh(J!iA87HAxIV3UX0JvQnalNX7qe2Pqq$j
z@Kb(x!SAa@b1r*fcD8P<8C|z^1ekGk9Hy|NFmY+^$b2^fJWb;Y6n+_%GyV;^WeO$v
zx#f>uInRab_?>NoR%wGj;H6aBdLAHfu>3`B6Z5|(biIF#i;cE24C)F4(&r#+d_mXv
E7r9hn2mk;8
literal 0
HcmV?d00001
diff --git a/website/website/__pycache__/wsgi.cpython-37.pyc b/website/website/__pycache__/wsgi.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b502e7a0e4e0a7fa9effa9b602dbc9deb35b2ed1
GIT binary patch
literal 561
zcmYjOO=}x55Y@^~Y_?6wq2#Qqp;?6-ODX+uVq9A1;Dmyqtd-SxEu+;eE7?wR&7psz
zJvM(Ru-BgY7kcWfozM(uJ|xY1Poocedod$By2EeZBgTF=#iO+;c}L41k<)C#bfmeB
zCK1J!CG@z?QSC^B?2lZzQvVhxwx1Q2C~
z3&=te$HO4tszeW7ggJ<9gR)j#S`f+$B?{C_3x^g~V8u#RW^?3J0a{F_sw}O^R50kK
zQ^GqXmI5mf#t~t$IS}Xw+;}lF7G4Pt5YIy>{c9;TWZc$&T$=3
zYA7vU7vO?i``pO*4~>J3dQtr{hmbaV=@S|CLI2bH(cml{pPZi$M}u+t<*a}4`Q&E*
z;q{4!5RA)xuTyu@lq95S&C%EUTOmnC`jZB>;zU$;z^zP$u8yfu!%Qu0sGmJy{Kcx~
z6F2VfM|t6)@{$H6`c6%<&rLJQu(0he