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>Tkb*@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 @@ +
+
+ {% csrf_token %} +
+ Reset Password + {{ form }} +
+
+ +
+
+
+ + Need An Account? +
+
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

+
+ {% csrf_token %} + {% for field in form %} +

+ {{ field.label_tag }}
+ {{ field }} + {% if field.help_text %} + {{ field.help_text }} + {% endif %} + {% for error in field.errors %} +

{{ error }}

+ {% endfor %} +

+ {% 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 zcmeI5Uu+x6eaE@vk`yhGBgxj$7oX3xY~3B9v%G(}{G;nNCs{gKXNfx7vSkSkHcN6v zt;ByODOpm00&?zhMf&HVMFKQHd(A^1isqqBTI3X+vma%O(>+wXj4W|uRw;@-SIXVmq`YPnj}>Ji!1@8USu z3z3M+<;v0j*?aRfO+WC>2z}=qpAY(&bB#UwvX>c?pEH|qwUNT z2713rP4EH%5C8!X009sH0T2KI5O~iB$OB&2*^!BwUaJ}9QcVy9Q8h|N-Ovh>Af_$} z^j|C@%Hwi!TuzM%$z)uVUg-C_hGr(T&H5U(7uC&5POIx`rCQ$JQ7d}2Xf(Wa_n;&N z;R>N1=9?Y_RV&o>s+zBsH!EsME9z=d+g1yDDPLdf>LihpJLwY*;ITDw>(o{CNMQfISGXK}Tv-`zB-x|%JQ>UybO->K*|mA04E)rFjh#pKBo z)Wx-?3&mM46HuX?H%e-0v(UY*<(QOAybz#1nr$t_oIYA?%9VQeib!%oNL}fn9-3_} z$W9M>Q8NmMwY4ZG6yd6$I$3H~MY5dOeeFn%Ey$9Tyz2A1MrJ0Q7#T&%w^-h4;Z+%5 z)9HS^$+1*Qky7%k*Xs&XO}U~`qAp~W@}wL!!Ggz@?r7?vPC{ae)l~)rNJ=>fB*=900@8p z2!H?xfB*=900j#08KF=t}X7`RYxzoX*=X{TuXs))A zH(i76P=bA)bB$7LeJ2?9dgP{SYt6)58}ZRnL+vG53g@}pv@RO?s>aqpY6B-|mXA*P z$q&hw$$yeBl0U=ze;+#}fB*=900@8p2!H?xfB*=900@AE#C4WL*B}KACW=M>jC;fyA{V4QS=qsVmhyFD5YN!SkW;MDHLUc$zakH}~-QQ+!~Q zv)nclJ!Ycivzh4b=K~}327p}aR}9$xKNot#6?%iPzZ<{{1V8`;KmY_l00ck)1V8`; zKmY{Z69U}*U)AmX=iJ`;SG*II?O3gPPs(m<*_2S*O0E_12K@!Uj8@#N6y@zoTDq<* zuTK`{*VDz7sg2#`rCUOJaU!-bbxT^9nN`w@h4u8*?Tz%(OGbKk#aNk|7FQN4iP=JG zEqCWe`Hp;hcjeAYtJ>0aW5Jl+p5K|Rb>=M>UtHIu+nXy_X5+KP8+VtNlu~9#Svb>b8t}H1Vv&KE+j>PQNR&#gKg=`^JUcQqq z&#sq^^!lVRzq?XM@6HP=#oKGk#p!zsQ?xeA@c*B@qq?*^$8|n4*8m+^6dT}{6 zf90iA^S24bR76aS$Aob?F&1aP|Cc;LzD1wS_jwojJPq&y0T2KI5C8!X009sH0T2KI z5C8!Xc$5fS^vrXIEqJ)8;ERWeX8ZrH{==-04+0!us0SAy7r$@`xMkza! znp?VlS6{t#XD)MXZfoJ*%JSrFdFj^k&HJnc#d)8#oDgDK)hOk(qLkaL*R?S#_QFn4 zGYVtbaroJ(;y*aslclX8AdQGfncjwn`EEUW74#9F_TuzN8Q<5wz=C8z=!3%Z0 zR&Ns-i-k&m^X!M*2>89_Jd%1id|;aN{|Exc~ofps)Y|5C8!X009sH0T2KI5C8!X0D<>A z0nGp3?=1-ZAOHd&00JNY0w4eaAOHd&00JOzI01J5|7o)6BEO)20q_&@4tbk=m;4v` z2Kg%aC-NooMfzNTzb1c4{+zr{{+Rp``F-*l*&`pJ1@Hm^5C8!X009sH0T2KI5C8!X z009tqFafWJ<9w&hFl>g8nc)x%y{F9Zq!|vH;Q$NyelsLy7&5~k3q5^i*lUI-%rL-0 zcaItR&Cq9tUfvVncoukA;P!X|0qp-jxT%l}0w4eaAOHd&00JNY0w4eaAOHf#fdJe8 z$MgS=LrbC#AOHd&00JNY0w4eaAOHd&00JOzFagZ}4`zcL5C8!X009sH0T2KI5C8!X z009sO5OI>CR!MJ|T^ zE$|KB8^L>hANQT|F7cn}{aN!r_b=TG+#kCB)%ARbpWYw(UhPOi6a+v31b!s~dmkM1 zhc_;9do`n!)3>$F`kJ~~)2nK}THdVG8lR0^BdXF5shF$?Ss|-#mW;cd<|nV*n4Vai zj@(MmUcWURnN3ek--!%&S{>qaII@u5UuZb;%&;lU$PGUm88+onJ;Twx@d1B0pW^m3 zy9SNiie4=mwVF{b)l~a4t3)!ERkA5bH+4-((-M0ICGNyuhaQ{8nB97*>+XNO5{78s7+7kd5SOP9D;PS&+dp+V2lSvuRf z&(gCvF*!Hgy+vsQMvPKj&+FAldSNk=zBM-&dHKfd{KSpr$hGO^$i%J1h1oQ9G(VkQ zr0w490{ctdn0|5k#&r71^i9X17;@H0B2z5)hACt=J-awNF*mntB~DK{`_mB|n?R1{ zIokUa_nlv9fTHjtP2hgI#~)6mxK|SPkZ24Td!*O857$7K;jyo%)y?+z$_EXS)`;C- zY~Lt(7oC|76T4FE+nx2j}nwaU)#?d|w@5NYs+3gFDj&jQ;*xKEKQP??np-S*?`@VnT?GwKd_=}#mdIo*}P45FJdj8(?2ky^# zmbovwx2W0w)7Rdqq(6K!%I&4hrAcc+r>2|xc&ff#F{--C7FSeF$;PF4Ty8gsSPMed z=3RSc*Yb_E#dbrsY~(l=-KdMl{o!boyZ^LvVak%#Ue@1rNy;*1j+>R)(0A;Gq?ll@ zGC6m^=!#R*p4M6$j@0$-dTUXM<~n6|S#^3Y;R`QBIhRS(T6d#M%w;pKwkub~_IS_U zK+GRLf1cYb+H0rgQmehALE39;XFSx(Tl?ags5qfC7L%iNTnx644O#JpXU-o~MO%?7 z+MmyfvM)S+?tz8Oh1o_K_ObV)QOO@ZcaHnmd7B2yFuk%5C%Uj;=?{gXqSb2m%2m3Q z*j$MerKH_QXv-J0T3s!a^G3s&X`WG2Ynya&yK(qTxmDT3x`*}AbsS5rH)%<;WW`)Jpd)MnM&Wwmvd z=-$Pr>BjnK+s3-R)~{yEbkn(1SL-_!o$YBztFc5}k2N-5Y`c)vpw2r1?A!yrICd*+ zYt{)m4ogofH=pu{cSgDU#NLRpi|ji^&H}l+O~~W%I>0I-=_% z*Mzo7QyjfdU}VJ4HU?hd?15q*+8i!+^vN!R#?F1Hq0@=^!FwOpInPM8NHwuY1 zb@%M(UVp^7V{6IMaz&%WPPeTc+pH3g=@~8FY4C(qt@f`V2bXVy-7;fUXXk0Q(H`A< z=A1vQ(oN*+&Yse;-9MURnXI1FGo8}T93suxVC=k@wfr0`v7^Lr^rOH1q zItDb|6fEU+wMf5_YI*9v^ZQsQ5c}lA?rn13e_^3;7O<*&_=%_4Gi>k8yQiE-Xniv| zvR`&Zrs!4+T7EcED{6%Ty*(?kS*jU%dNFQ&hlpIcI(_9DI~O?ZfAjf>5RLA=6sBjj z32yJMeN8jvnt^?4@4P8bT+L*ZRVmvN-56+&0v~Aay$2h1+??0+?6{hB6~rjnhieSH z1*|gkoN;f6-sKUP;O<{Os`j?Z zt71%xXX3JCf5|X?cUI@LRh=&1H@e!l&YurB+PkSJ9nWo^Xw6Ta@`ta}v!&8eadYlc zv+p=bB@`v4#A0?&YFIpWPzxR8pi^(dj`b(=li8K9|KC1sLkt8!00ck)1V8`;KmY_l z00ck)1dbyC%>R#LtD;UI00JNY0w4eaAOHd&00JNY0wB;%0Q3KL9*BVe2!H?xfB*=9 z00@8p2!H?xfWUDiz~=t}@?{tKIr%C15%~f69(jxW2l*OJ!V3gI00ck)1V8`;KmY_l z00ck)1VG@?BjELL93L>l9y9ctq0bDxX2_eN#|+)PhYRqH`Tv_P@(c1a@)Pn7`956% z_%`__dGpb$AQXWB2!H?xfB*=900@8p2!H?xfB*>C1b9z?&g^N>!va4Gd@S&?fMvh5?&wx0w4eaAOHd&00JNY0w4eaAaDqQ zOM!rEV&L&07vLm8OkEP_zgR?!k1L6BQ5cKKNiivlLT$5T)HUAoY!5Xj-OQEoSZpkr ziX{al)wCY-GwZWmoLkm%EFmTmR4th=m0G+ zs(6{;4r?abY5GJzH9hwuXqB%Ipkg zZOO9}pYl@csOV-I?NnyUgxV<=d9N$*v}lT@4{D_kc&_fWq|$_lnevQ>T8%1}P^Xg`k0)tigu^{>}h=2h`Aj1KOi&=m~3PUi1CZpdor-Kxd#tvDMU5+wxd)0~$c1crVJO`fzj- zCi+|YKp&Z5_=EJo3s3wDePSisvB&8Q(T(=@cK5ftx3_nDrBac@?=R`}=RdD-+&{@; z{1uSd#h?9+1UTSrPUi@B!vCI`qFExmO(E80FL?vwI;@7|-$XTa#$ z)4`@m*sk%*wrhN+Maytvx|S#QJU8&^p=g3b-Dqi68V1MF`iwAv5H|?U`h-QdXOxUE zMm_hU!a;>;A!2P75tsq(9Z?%~8)mQPg>Jw^v)^Z;G+I?X_lR22!x7S<05%zzJ`ow| zg+2|=M0Lb8&vnt0*+8Sz#3{Twlue<^7lZUX$MIaTnoj>?%KRg-isUsVgDKOmXL2#I zu+w=+xW<~&9@fHhr+~AY7?*Jx+#Hs63iZ_oHeu7=n-jD5hPsyc!wcVZh|*7ju_@fb zfE+R!5Ha*^7F9-G0^;;-6Qzd;CoV8?q^PAmq>a=po*!E>{YKg)zXe9$_j;J0=d);Y z*55@N5y)X^MGr1v>66otuprtR*(T1?PEJbu0nbUvqn#P!^KyOwFxHiYIKL-VU&*bS zF4XEBH7-c)wvlpqrLEPKmKv>$D>q;kO}ZD$ot|Z!2XbVFc5vSKa5yO>JGHUgJ5dpZ zBfgx8b8>6H-jZXXB{gL~dDEhoGl{1S)HfL$cs>}vnl^#0dy>V!^%xK?mH!GC{Q{P4cCM>$R$>|WMED|CoYdlx;-5%*!p^lVqF zMuiGXACOA4$ef@rT8>F=Jbx!z#f`gQIuHhdxxMpvccLopI-z}r!fKVi%5YqHBhGj% z7W!szj0Z-27q3U0HxF4VDHulbJ{g8y*ppN_Ir_M$%GHjn8L#9Yg`TCs5AQ8%8iNt%=dSK}3_tGzVZlBymkotp7lYSdAwU|*IRQft2}?aM}0 zsmbWJ-joep!A>f4G41;HH?1Mp*nZTCbBRpTaVHu^swUaQCAlfp8%C;WV9LW~vY+_s zgirLHcxg&7&Ss2gD;@0*&cBPTo09kYm83CQ1<#~X^Llu)_{xtSn1?_dk5xi6NZHEh zE}hSe1OYxM}XLYqA2(Kq`ENg=zD7qUV|$YuD+$O#iZ!{@RBt_41m8A}&) 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