From de94f48621889c44659ba20fc290b3cfcc524209 Mon Sep 17 00:00:00 2001 From: Max Yakovenko Date: Tue, 14 Aug 2018 23:17:52 +0300 Subject: [PATCH] add config for recaptcha --- .env.sample | 9 ++- accounts_ext/admin.py | 4 +- accounts_ext/fixtures/accounts.json | 1 + accounts_ext/forms.py | 7 ++- accounts_ext/models.py | 12 +++- accounts_ext/views.py | 4 +- eshop_project/settings/base.py | 56 ++++++++++++++++--- .../settings/development.py.template | 5 ++ templates/bootstrap/forms/registration.html | 4 +- templates/registration/registration.html | 5 +- 10 files changed, 86 insertions(+), 21 deletions(-) create mode 100644 accounts_ext/fixtures/accounts.json diff --git a/.env.sample b/.env.sample index 5fef032..9dab06f 100644 --- a/.env.sample +++ b/.env.sample @@ -17,6 +17,11 @@ DB_PASSWORD=12345678 DB_HOST=localhost DB_PORT=5432 +#RECAPTCHA SETTINGS +RECAPTCHA_DISABLE=False +RECAPTCHA_PRIVATE_KEY = 'your private key' +RECAPTCHA_PUBLIC_KEY = 'your public key' + # EMAIL SETTINGS EMAIL_USE_TLS=True EMAIL_USE_SSL=False @@ -26,8 +31,8 @@ EMAIL_HOST_USER=order@russian-programms.ru EMAIL_HOST_PASSWORD=kziWUX # Celery settings -CELERY_BROKER_URL=amqp://:@localhost:5672// -CELERY_RESULT_BACKEND=amqp://:@localhost:5672// +CELERY_BROKER_URL=amqp://:@:5672// +CELERY_RESULT_BACKEND=amqp://:@:5672// CELERY_ACCEPT_CONTENT=application/json CELERY_TASK_SERIALIZER=json CELERY_RESULT_SERIALIZER=json diff --git a/accounts_ext/admin.py b/accounts_ext/admin.py index 02166ac..47c4d07 100644 --- a/accounts_ext/admin.py +++ b/accounts_ext/admin.py @@ -5,7 +5,7 @@ from django.contrib.auth.admin import UserAdmin as BaseUserAdmin, GroupAdmin from django.urls import reverse_lazy from django.utils.translation import ugettext_lazy as _ from import_export import resources -from jet.filters import RelatedFieldAjaxListFilter, DateRangeFilter +from jet.filters import DateRangeFilter from rangefilter.filter import DateTimeRangeFilter from core.admin import SafeModelAdmin @@ -91,7 +91,6 @@ class ProfileAdmin(admin.ModelAdmin): list_filter = ( ('birthday', DateRangeFilter), ) - readonly_fields = ('first_name', 'last_name', 'phone',) exclude = ('status',) def has_delete_permission(self, request, obj=None): @@ -106,7 +105,6 @@ class CompanyAdmin(admin.ModelAdmin): search_fields = ('company_name', 'inn', 'ogrn'), list_display = ('user', 'company_name', 'type') list_filter = ('type',) - readonly_fields = ('company_name', 'inn', 'ogrn', 'type') def has_delete_permission(self, request, obj=None): return False diff --git a/accounts_ext/fixtures/accounts.json b/accounts_ext/fixtures/accounts.json new file mode 100644 index 0000000..b1002ab --- /dev/null +++ b/accounts_ext/fixtures/accounts.json @@ -0,0 +1 @@ +[{"model": "accounts_ext.user", "pk": 1, "fields": {"password": "pbkdf2_sha256$100000$AAP4DpqYKrFB$mQRKz7qi/1va3Zoh2O3g9j7wYKCBaMLz5LFrbszDNLA=", "last_login": "2018-08-12T20:46:54Z", "create_at": "2018-08-12T20:46:44.961Z", "updated_at": "2018-08-12T20:47:05.733Z", "status": 25, "is_superuser": true, "username": "dimkasp", "email": "dimkasp@mail.ru", "referral_user": null, "confirmed_at": null, "groups": [], "user_permissions": []}}] \ No newline at end of file diff --git a/accounts_ext/forms.py b/accounts_ext/forms.py index f928763..fb8cd1f 100644 --- a/accounts_ext/forms.py +++ b/accounts_ext/forms.py @@ -16,6 +16,9 @@ from django.contrib.auth.forms import ( UserCreationForm as UserCreationFormBase ) from django.contrib.auth.forms import UsernameField +from snowpenguin.django.recaptcha2.fields import ReCaptchaField +from snowpenguin.django.recaptcha2.widgets import ReCaptchaWidget + from core.models import STATUS_ACTIVE from .models import Profile, Company @@ -43,6 +46,8 @@ class RegistrationForm(RegistrationFormUniqueEmail): widget=forms.TextInput(attrs={'class': 'reg__text'})) agreement = forms.BooleanField() + captcha = ReCaptchaField(label=_(''), widget=ReCaptchaWidget()) + title = _('Регистрация') def clean_email(self): @@ -71,7 +76,7 @@ class RegistrationForm(RegistrationFormUniqueEmail): 'username': _('Логин'), } help_texts = { - 'username': _('Не менее 5х символов'), + 'username': _('Не менее 5-и символов'), } widgets = { 'username': forms.TextInput(attrs={'class': 'reg__text-label'}), diff --git a/accounts_ext/models.py b/accounts_ext/models.py index 9d5304d..96b248f 100644 --- a/accounts_ext/models.py +++ b/accounts_ext/models.py @@ -12,8 +12,9 @@ from django.utils.timezone import now as datetime_now from registration.signals import user_activated from core.models import ( - AbstractStatusModel, ActualOnlyManager, STATUS_ACTIVE, CaseInsensitiveQuerySet -) + AbstractStatusModel, ActualOnlyManager, STATUS_ACTIVE, CaseInsensitiveQuerySet, + AbstractDateTimeModel, + City) # Create your models here. @@ -31,7 +32,7 @@ class UserManager(ActualOnlyManager, BaseUserManager): def get_queryset(self): bqs = super().get_queryset() - qs = CaseInsensitiveQuerySet(self.model,bqs.query) + qs = CaseInsensitiveQuerySet(self.model, bqs.query) return qs @@ -98,6 +99,9 @@ class Profile(AbstractStatusModel): message="Phone number must be entered in the format: '+99999999999'. Up to 12 digits allowed.") phone = models.CharField(_('телефон'), validators=[phone_regex], max_length=12, blank=True, null=True) + address = models.TextField(_('aдрес')) + city = models.ForeignKey(City, on_delete=models.SET_NULL, verbose_name=_('город'), blank=True, null=True) + @property def is_valid(self): return self.first_name and self.last_name and self.patronymic @@ -128,6 +132,7 @@ class Company(AbstractStatusModel): user = models.OneToOneField(get_user_model(), on_delete=models.CASCADE, verbose_name=_('username')) company_name = models.CharField(_('компания'), max_length=255, blank=True, null=True) address = models.TextField(_('адрес'), blank=True, null=True) + city = models.ForeignKey(City, on_delete=models.SET_NULL, blank=True, null=True) inn = models.CharField(_('ИНН'), max_length=12, blank=True, null=True) ogrn = models.CharField(_('ОГРН'), max_length=13, blank=True, null=True) type = models.SmallIntegerField(_('тип'), choices=COMPANY_TYPE_CHOICES, default=COMPANY_TYPE_DEFAULT_CHOICE, @@ -158,6 +163,7 @@ def create_user_profile(sender, instance, created, **kwargs): Profile.objects.create(user=instance).save() Company.objects.create(user=instance).save() + @receiver(user_activated) def save_activation_date(sender, user, request, **kwargs): user.confirmed_at = datetime_now() diff --git a/accounts_ext/views.py b/accounts_ext/views.py index 22844f5..ed66f89 100644 --- a/accounts_ext/views.py +++ b/accounts_ext/views.py @@ -21,7 +21,7 @@ from django.urls import reverse_lazy from django.utils.http import is_safe_url, urlencode from django.utils.translation import ugettext_lazy as _ -from core.views import ProtectedView +from core.views import ProtectedTemplateView from .forms import ( PasswordResetRequestForm, SetPasswordForm, RegistrationCompanyForm, AuthenticationForm, @@ -160,5 +160,5 @@ class ResendActivationView(ResendActivationViewBase): return context -class ProfileView(ProtectedView): +class ProfileTemplateView(ProtectedTemplateView): template_name = 'accounts_ext/index.html' diff --git a/eshop_project/settings/base.py b/eshop_project/settings/base.py index 653098c..a1bceb7 100644 --- a/eshop_project/settings/base.py +++ b/eshop_project/settings/base.py @@ -55,6 +55,9 @@ INSTALLED_APPS = [ 'debug_toolbar', 'registration', + 'ckeditor', + 'ckeditor_uploader', + 'snowpenguin.django.recaptcha2', 'crispy_forms', 'mptt', 'import_export', @@ -73,9 +76,7 @@ INSTALLED_APPS = [ 'django.contrib.flatpages', 'django.contrib.admin', - # 'orders', - # 'auth_ext', - # 'discount', + ] MIDDLEWARE = [ @@ -87,7 +88,6 @@ MIDDLEWARE = [ 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware', - 'debug_toolbar.middleware.DebugToolbarMiddleware', 'referral.middleware.ReferralMiddleware', ] @@ -107,10 +107,13 @@ TEMPLATES = [ 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', + 'core.context_processors.breadcrumbs', 'contact_us.context_processors.contact_us_form', 'products.context_processors.product_search_form', - 'products.context_processors.product_root_categories', - # 'cart.context_processors.cart', + 'products.context_processors.product_fitler_formset', + 'products.context_processors.product_categories', + 'products.context_processors.product_manufacture_list', + 'cart.context_processors.cart_basket', ], }, }, @@ -141,6 +144,11 @@ DATABASES = { } } +# RECAPTCHA SETTINGS +RECAPTCHA_DISABLE = env.bool("RECAPTCHA_DISABLE") +RECAPTCHA_PRIVATE_KEY = env.str("RECAPTCHA_PRIVATE_KEY") +RECAPTCHA_PUBLIC_KEY = env.str("RECAPTCHA_PUBLIC_KEY") + # DJANGO REGISTRATION PACKAGE SETTINGS ACCOUNT_ACTIVATION_DAYS = env.int('ACCOUNT_ACTIVATION_DAYS',default=3) ACTIVATION_EMAIL_HTML = 'emails/html/activation_email.html' @@ -264,7 +272,7 @@ USE_L10N = True USE_TZ = True # Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/1.10/howto/static-files/ +# https://docs.djangoproject.com/en/2.0/howto/static-files/ STATIC_URL = '/static/' @@ -278,16 +286,48 @@ MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, "assets", "media") +# CKEDITOR CONFIG +CKEDITOR_UPLOAD_PATH = "uploads/" +CKEDITOR_IMAGE_BACKEND = "pillow" +CKEDITOR_UPLOAD_SLUGIFY_FILENAME = True +CKEDITOR_FILENAME_GENERATOR = 'utils.get_filename' +CKEDITOR_CONFIGS = { + 'awesome_ckeditor': { + 'skin': 'moono-lisa', + 'toolbar': 'advanced', + 'allowedContent': True, + }, +} + + + +#CART SESSION KEY CART_SESSION_ID = 'cart' # for import-export excel data IMPORT_EXPORT_USE_TRANSACTIONS = True # PAGINATION SETTINGS -DEFAULT_PAGE_AMOUNT = 10 +DEFAULT_PAGE_AMOUNT = 1 # DEFAULT REFERRAL POINTS DEFAULT_REFERRAL_POINTS = 120 # CASHBACK RATIO IN PERCENTAGE CASHBACK_RATIO = 4 + + +# REQUISITES +SUPPLIER_INFO = '''ООО "Русские Программы", ИНН 7713409230, КПП 771301001, + 127411, Москва г, Дмитровское ш., дом № 157, корпус 7, тел.: +74957258950''' + +PAY_REQUISITES = { + 'name': 'ООО "Русские Программы"', + 'bank': 'АО "СМП БАНК" Г. МОСКВА', + 'INN': '7713409230', + 'KPP': '771301001', + 'BIK': '44525503', + 'bank_acc': '30101810545250000503', + 'acc': '40702810300750000177', + 'sup_info': SUPPLIER_INFO +} diff --git a/eshop_project/settings/development.py.template b/eshop_project/settings/development.py.template index de91943..ce417f8 100644 --- a/eshop_project/settings/development.py.template +++ b/eshop_project/settings/development.py.template @@ -1,4 +1,5 @@ from .base import * +INTERNAL_IPS = ('127.0.0.1', ) # Debug toolbar DEBUG_TOOLBAR_PANELS = ( @@ -16,4 +17,8 @@ DEBUG_TOOLBAR_PANELS = ( 'debug_toolbar.panels.redirects.RedirectsPanel', ) +MIDDLEWARE = MIDDLEWARE + [ + 'debug_toolbar.middleware.DebugToolbarMiddleware', +] + DEFAULT_FROM_EMAIL = 'order@russian-programms.ru' diff --git a/templates/bootstrap/forms/registration.html b/templates/bootstrap/forms/registration.html index 10425f3..c755a72 100644 --- a/templates/bootstrap/forms/registration.html +++ b/templates/bootstrap/forms/registration.html @@ -12,7 +12,9 @@ и возврата товаров {% else %} - {{ field.label }}{% if field.field.required %}*{% endif %} + {% if field.label %} + {{ field.label }}{% if field.field.required %}*{% endif %} + {% endif %} {% endif %}
diff --git a/templates/registration/registration.html b/templates/registration/registration.html index 70c94e0..bc305b1 100644 --- a/templates/registration/registration.html +++ b/templates/registration/registration.html @@ -1,7 +1,10 @@ {% extends 'base.html' %} {% load static %} +{% load recaptcha2 %} -{% block title %}{{ form.title }}{% endblock %} +{% block extra_head_content %} + {% recaptcha_init 'ru' %} +{% endblock extra_head_content %} {% block content %}