diff --git a/bestoon/settings.py.sample b/bestoon/settings.py.sample index 84197fe..8cbccaf 100644 --- a/bestoon/settings.py.sample +++ b/bestoon/settings.py.sample @@ -120,9 +120,18 @@ USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.10/howto/static-files/ +PROJECT_DIR = os.path.dirname(os.path.abspath(__file__)) +STATIC_ROOT = os.path.join(PROJECT_DIR, 'web/static') STATIC_URL = '/static/' +RECAPTCHA_PRIVATE_KEY = 'your private key' +RECAPTCHA_PUBLIC_KEY = 'your public key' +RECAPTCHA_DEFAULT_ACTION = 'generic' +RECAPTCHA_SCORE_THRESHOLD = 0.5 -RECAPTCHA_SECRET_KEY = '' -POSTMARK_API_TOKEN='' +EMAIL_HOST = '' +EMAIL_USE_TLS = True +EMAIL_PORT = 587 +EMAIL_HOST_USER = '' +EMAIL_HOST_PASSWORD = '' diff --git a/fandogh.yml b/fandogh.yml new file mode 100644 index 0000000..8482f7b --- /dev/null +++ b/fandogh.yml @@ -0,0 +1,17 @@ +kind: ExternalService +name: bestoon +spec: + image_pull_policy: Always + port: 80 + source: + context: . + media_path: '' + project_type: django + python_version: '3.7' + static_path: static + wsgi: bestoon.wsgi + volume_mounts: + - mount_path: /usr/src/app/bestoon/web/static/ + sub_path: static + domains: + - name: rayakade.ir diff --git a/requirements.txt b/requirements.txt index 7915b5d..70aac0c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ Django>=1.11.27 -python-postmark==0.4.10 requests==2.20.0 django-cors-middleware +django-recaptcha3 diff --git a/web/models.py b/web/models.py index 14ed45c..659c3ba 100644 --- a/web/models.py +++ b/web/models.py @@ -32,7 +32,7 @@ class Expense(models.Model): text = models.CharField(max_length=255) date = models.DateTimeField() amount = models.BigIntegerField() - user = models.ForeignKey(User) + user = models.ForeignKey(User, on_delete=models.CASCADE) def __unicode__(self): return "{}-{}-{}".format(self.date, self.user, self.amount) @@ -42,7 +42,7 @@ class Income(models.Model): text = models.CharField(max_length=255) date = models.DateTimeField() amount = models.BigIntegerField() - user = models.ForeignKey(User) + user = models.ForeignKey(User, on_delete=models.CASCADE) def __unicode__(self): return "{}-{}-{}".format(self.date, self.user, self.amount) diff --git a/web/static/css/style.css b/web/static/css/style.css index 50cbc19..f8544ad 100644 --- a/web/static/css/style.css +++ b/web/static/css/style.css @@ -1,5 +1,5 @@ @import url(http://fonts.googleapis.com/earlyaccess/droidarabicnaskh.css); -@import url('https://fontup.ir/css?fonts=Samim:400'); +/*@import url('https://fontup.ir/css?fonts=Samim:400');*/ @import url(http://weloveiconfonts.com/api/?family=fontawesome); [class*="fontawesome-"]:before { diff --git a/web/templates/index.html b/web/templates/index.html index 8bb8b32..bb31661 100644 --- a/web/templates/index.html +++ b/web/templates/index.html @@ -1,5 +1,5 @@ {% extends "template.html"%} -{% load staticfiles %} +{% load static %} {% block content %} diff --git a/web/templates/login.html b/web/templates/login.html index 3b3af47..577f18d 100644 --- a/web/templates/login.html +++ b/web/templates/login.html @@ -1,5 +1,5 @@ {% extends "template.html"%} -{% load staticfiles %} +{% load static %} {% block content %}
diff --git a/web/templates/register.html b/web/templates/register.html index 33e0a04..caa2495 100644 --- a/web/templates/register.html +++ b/web/templates/register.html @@ -1,9 +1,7 @@ {% extends "template.html"%} -{% load staticfiles %} +{% load static %} {% block content %} - -
@@ -52,6 +50,7 @@

ثبت نام

{% csrf_token %} + {{ form }}
@@ -72,12 +71,7 @@

ثبت نام

-
- -
-
-
-
+ diff --git a/web/templates/resetpassword.html b/web/templates/resetpassword.html index d6daa88..9e2abe5 100644 --- a/web/templates/resetpassword.html +++ b/web/templates/resetpassword.html @@ -1,8 +1,7 @@ {% extends "template.html"%} -{% load staticfiles %} +{% load static %} {% block content %} -
@@ -45,6 +44,7 @@

بازیابی کلمهٔ عبور

{% csrf_token %} + {{ form }}
@@ -59,12 +59,7 @@

بازیابی کلمهٔ عبور

-
- -
-
-
-
+ diff --git a/web/templates/template.html b/web/templates/template.html index bf72fea..c287d17 100644 --- a/web/templates/template.html +++ b/web/templates/template.html @@ -1,4 +1,5 @@ -{% load staticfiles %} +{% load static %} +{% load recaptcha3 %} @@ -17,11 +18,21 @@ + + {% recaptcha_init %} + {% recaptcha_ready action_name='homepage' %} + + + @@ -42,7 +53,7 @@ - + بستون
diff --git a/web/views.py b/web/views.py index ae78883..770295d 100644 --- a/web/views.py +++ b/web/views.py @@ -15,13 +15,14 @@ from django.views.decorators.csrf import csrf_exempt from django.contrib.auth.hashers import make_password, check_password from django.views.decorators.http import require_POST - +from django.core.mail import send_mail +from django.forms import Form from .models import User, Token, Expense, Income, Passwordresetcodes, News # Create your views here. -from postmark import PMMail -from .utils import grecaptcha_verify, RateLimited +from .utils import RateLimited +# from snowpenguin.django.recaptcha3.fields import ReCaptchaField # create random string for Toekn random_str = lambda N: ''.join( @@ -43,7 +44,9 @@ def news(request): @require_POST def login(request): # check if POST objects has username and password - if request.POST.has_key('username') and request.POST.has_key('password'): + keys = list(request.POST.keys()) + + if ('username' in keys) and ('password' in keys): username = request.POST['username'] password = request.POST['password'] this_user = get_object_or_404(User, username=username) @@ -66,13 +69,9 @@ def login(request): def register(request): - if request.POST.has_key( - 'requestcode'): # form is filled. if not spam, generate code and save in db, wait for email confirmation, return message - # is this spam? check reCaptcha - if not grecaptcha_verify(request): # captcha was not correct - context = { - 'message': 'کپچای گوگل درست وارد نشده بود. شاید ربات هستید؟ کد یا کلیک یا تشخیص عکس زیر فرم را درست پر کنید. ببخشید که فرم به شکل اولیه برنگشته!'} # TODO: forgot password - return render(request, 'register.html', context) + keys = list(request.POST.keys()) + keys_get = list(request.GET.keys()) + if 'requestcode' in keys: # form is filled. if not spam, generate code and save in db, wait for email confirmation, return message # duplicate email if User.objects.filter(email=request.POST['email']).exists(): @@ -90,18 +89,13 @@ def register(request): temporarycode = Passwordresetcodes( email=email, time=now, code=code, username=username, password=password) temporarycode.save() - #message = PMMail(api_key=settings.POSTMARK_API_TOKEN, - # subject="فعالسازی اکانت بستون", - # sender="jadi@jadi.net", - # to=email, - # text_body=" برای فعال کردن اکانت بستون خود روی لینک روبرو کلیک کنید: {}?code={}".format( - # request.build_absolute_uri('/accounts/register/'), code), - # tag="account request") - #message.send() + + send_mail("فعالسازی اکانت بستون", + " برای فعال کردن اکانت بستون خود روی لینک روبرو کلیک کنید: {}?code={}".format( + request.build_absolute_uri('/accounts/register/'), code) + , 'info@rayakade.ir', [email], fail_silently = False) message = 'ایمیلی حاوی لینک فعال سازی اکانت به شما فرستاده شده، لطفا پس از چک کردن ایمیل، روی لینک کلیک کنید.' - message = 'قدیم ها ایمیل فعال سازی می فرستادیم ولی الان شرکتش ما رو تحریم کرده (: پس راحت و بی دردسر' - body = " برای فعال کردن اکانت بستون خود روی لینک روبرو کلیک کنید: لینک رو به رو ".format(request.build_absolute_uri('/accounts/register/'), code) - message = message + body + context = { 'message': message } return render(request, 'index.html', context) @@ -110,7 +104,7 @@ def register(request): 'message': 'متاسفانه این نام کاربری قبلا استفاده شده است. از نام کاربری دیگری استفاده کنید. ببخشید که فرم ذخیره نشده. درست می شه'} # TODO: forgot password # TODO: keep the form data return render(request, 'register.html', context) - elif request.GET.has_key('code'): # user clicked on code + elif 'code' in keys_get: # user clicked on code code = request.GET['code'] if Passwordresetcodes.objects.filter( code=code).exists(): # if code is in temporary db, read the data and create the user @@ -140,7 +134,8 @@ def register(request): @csrf_exempt @require_POST def whoami(request): - if request.POST.has_key('token'): + keys = request.POST.keys() + if 'token' in keys: this_token = request.POST['token'] # TODO: Check if there is no `token`- done-please Check it # Check if there is a user with this token; will retun 404 instead. this_user = get_object_or_404(User, token__token=this_token) @@ -220,7 +215,7 @@ def edit_expense(request): this_pk = request.POST['id'] if 'id' in request.POST else "-1" this_token = request.POST['token'] if 'token' in request.POST else "" this_user = get_object_or_404(User, token__token=this_token) - + this_expense = get_object_or_404(Expense, pk=this_pk, user=this_user) this_expense.text = this_text this_expense.amount = this_amount @@ -232,7 +227,7 @@ def edit_expense(request): @csrf_exempt @require_POST def edit_income(request): - """ edit an income """ + """ edit an income """ this_text = request.POST['text'] if 'text' in request.POST else "" this_amount = request.POST['amount'] if 'amount' in request.POST else "0" this_pk = request.POST['id'] if 'id' in request.POST else "0"