From 429236eac218a1e8f2c2ac2a041b613062602c2f Mon Sep 17 00:00:00 2001 From: ya_dim4ik Date: Sun, 2 Oct 2016 15:17:11 +0300 Subject: [PATCH] 1581 --- accounts/views.py | 10 +- emencia/django/newsletter/forms.py | 54 +- static/mailing_settings/js/main.js | 12 +- support/d_dev/settings.py | 591 ++++++++++++++++++ .../client/accounts/mailing_settings.html | 6 + 5 files changed, 657 insertions(+), 16 deletions(-) create mode 100644 support/d_dev/settings.py diff --git a/accounts/views.py b/accounts/views.py index 66203e8e..ff4b0119 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -107,13 +107,21 @@ class MailingSettings(ContextMixin, AjaxableResponseMixin, CreateUpdateView): instance = Contact.objects.get(user=self.request.user) except Contact.DoesNotExist: instance = None + if instance is not None: + self.extra_ctx.update({ + 'checked_f_countries': instance.f_countries.values_list('pk', flat=True), + 'checked_r_cities': instance.r_cities.values_list('pk', flat=True), + 'checked_tg': instance.tags.values_list('pk', flat=True), + 'checked_th': instance.themes.values_list('pk', flat=True), + }) + return instance def form_valid(self, form): print(form.cleaned_data) print(form.errors) print(self.request.POST) - import pdb; pdb.set_trace() + # import pdb; pdb.set_trace() return super(MailingSettings, self).form_valid(form) def form_invalid(self, form): diff --git a/emencia/django/newsletter/forms.py b/emencia/django/newsletter/forms.py index 41e9bf28..05a15b4e 100644 --- a/emencia/django/newsletter/forms.py +++ b/emencia/django/newsletter/forms.py @@ -7,6 +7,7 @@ import xlrd from django import forms from django.core.exceptions import ValidationError from django.db.models import Sum +from django.forms.models import ModelChoiceIterator from django.http import Http404 from django.utils import translation from django.utils.translation import ugettext_lazy as _ @@ -68,12 +69,31 @@ class MailingListSubscriptionForm(forms.ModelForm): exclude = ('email',) +class CustomModelChoiceIterator(ModelChoiceIterator): + def __init__(self, field): + self.field = field + self.queryset = getattr(field, 'c_queryset', field.queryset.none()) + + class ML_ModelMultipleChoiceField(forms.ModelMultipleChoiceField): ''' use it with field.queryset = Model.objects.none() ''' def _get_choices(self): - return [] + # If self._choices is set, then somebody must have manually set + # the property self.choices. In this case, just return self._choices. + if hasattr(self, '_choices'): + return self._choices + + # Otherwise, execute the QuerySet in self.queryset to determine the + # choices dynamically. Return a fresh ModelChoiceIterator that has not been + # consumed. Note that we're instantiating a new ModelChoiceIterator *each* + # time _get_choices() is called (and, thus, each time self.choices is + # accessed) so that we can ensure the QuerySet has not been consumed. This + # construct might look complicated but it allows for lazy evaluation of + # the queryset. + return CustomModelChoiceIterator(self) + choices = property(_get_choices, forms.ChoiceField._set_choices) # def clean(self, value): @@ -131,24 +151,29 @@ class MailingSettingsForm(forms.ModelForm): 'content_articles': forms.CheckboxInput(), } - # def __init__(self, *args, **kwargs): - # super(MailingSettingsForm, self).__init__(*args, **kwargs) + def __init__(self, *args, **kwargs): + super(MailingSettingsForm, self).__init__(*args, **kwargs) # self.fields['f_countries'].queryset = Country.objects.none() # self.fields['r_cities'].queryset = City.objects.none() - # self.fields['tags'].queryset = Tag.objects.none() - # self.fields['themes'].queryset = Theme.objects.none() - # if self.instance and self.instance.pk: - # if self.instance.f_countries: - # self.fields['f_countries'].queryset = self.instance.f_countries.distinct() - # if self.instance.r_cities: - # self.fields['r_cities'].queryset = self.instance.r_cities.distinct() - # if self.instance.tags: - # self.fields['tags'].queryset = self.instance.tags.distinct() - # if self.instance.themes: - # self.fields['themes'].queryset = self.instance.themes.distinct() + # self.fields['tg'].queryset = Tag.objects.none() + # self.fields['th'].queryset = Theme.objects.none() + + if self.instance and self.instance.pk: + if self.instance.f_countries: + self.fields['f_countries'].c_queryset = self.instance.f_countries.distinct() + if self.instance.r_cities: + self.fields['r_cities'].c_queryset = self.instance.r_cities.distinct() + if self.instance.tags: + self.fields['tg'].c_queryset = self.instance.tags.distinct() + if self.instance.themes: + self.fields['th'].c_queryset = self.instance.themes.distinct() + # import pdb; + # pdb.set_trace(); def save(self): obj = super(MailingSettingsForm, self).save(commit=False) + if not obj.pk: + obj.save() # В форме можеть быть выбрана: # 1. Area и внутри для уточнения не выбрана ни одна страна @@ -176,6 +201,7 @@ class MailingSettingsForm(forms.ModelForm): obj.save() return obj + class AllMailingListSubscriptionForm(MailingListSubscriptionForm): """Form for subscribing to all mailing list""" diff --git a/static/mailing_settings/js/main.js b/static/mailing_settings/js/main.js index d12c8b31..1aff1cbc 100644 --- a/static/mailing_settings/js/main.js +++ b/static/mailing_settings/js/main.js @@ -94,7 +94,15 @@ } $.fancybox.close(); - }) + }); + + if (checked_th.length){ + $.each(checked_th, function (i,val) { + console.log(val); + $('input[name="th"][value=' + val + ']').prop('checked', true); + + }); + } })(); @@ -246,4 +254,6 @@ $(function () { }); $('.scroll-container').mCustomScrollbar(); + + }); diff --git a/support/d_dev/settings.py b/support/d_dev/settings.py new file mode 100644 index 00000000..cf8381fa --- /dev/null +++ b/support/d_dev/settings.py @@ -0,0 +1,591 @@ +# -*- coding: utf-8 -*- +# Django settings for proj project. +import os +import django +from django.utils.translation import ugettext_lazy as _ + + +DJANGO_ROOT = os.path.dirname(os.path.realpath(django.__file__)) +SITE_ROOT = os.path.split(os.path.dirname(os.path.realpath(__file__)))[0] + +DEBUG = False + + +ADMINS = ( + # ('Your Name', 'your_email@example.com'), +) + +MANAGERS = ADMINS + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.mysql', + 'NAME': 'expomap', + 'USER': 'kotzilla', + 'PASSWORD': 'qazedc', + 'HOST': '', + 'PORT': '', + } +} + + +CACHES = { + "default": { + "BACKEND": "redis_cache.cache.RedisCache", + "LOCATION": "/tmp/redis.sock", + "OPTIONS": { + "CLIENT_CLASS": "redis_cache.client.DefaultClient", + }, + } +} + + +# Hosts/domain names that are valid for this site; required if DEBUG is False +# See https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts +ALLOWED_HOSTS = ['hit.expomap.ru', '195.66.79.152', '195.66.79.145', 'expomap.ru', '195.66.79.148'] + +# Local time zone for this installation. Choices can be found here: +# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name +# although not all choices may be available on all operating systems. +# In a Windows environment this must be set to your system time zone. +TIME_ZONE = 'UTC' + +# Language code for this installation. All choices can be found here: +# http://www.i18nguy.com/unicode/language-identifiers.html +LANGUAGE_CODE = 'ru' + +DEFAULT_LANGUAGE = 'ru' + +LANGUAGES = ( + ('ru', _('Russian')), + ('en', _('English')), +) + +LOCALE_PATHS = ( + os.path.join(SITE_ROOT, 'locale'), +) + +DEFAULT_CHARSET = 'utf-8' + +SITE_ID = 1 + +# If you set this to False, Django will make some optimizations so as not +# to load the internationalization machinery. +USE_I18N = True + +# If you set this to False, Django will not format dates, numbers and +# calendars according to the current locale. +USE_L10N = False + +# If you set this to False, Django will not use timezone-aware datetimes. +USE_TZ = False + + +MEDIA_ROOT = os.path.join(SITE_ROOT, 'media/') +CKEDITOR_UPLOAD_PATH = os.path.join(SITE_ROOT, 'media/upload') + + +CKEDITOR_CONFIGS = { + 'default': { + 'toolbar': 'standart', + 'height': 200, + 'width': 565, + 'resize_enabled' : True, + 'autoGrow_onStartup' : False, + 'autoGrow_bottomSpace' : 300, + 'fillEmptyBlocks' : False, + 'autoParagraph' : False, + }, + 'newsletters': { + 'toolbar': 'standart', + 'height': 600, + 'width': 750, + 'resize_enabled' : True, + 'autoGrow_onStartup' : False, + 'autoGrow_bottomSpace' : 300, + 'fillEmptyBlocks' : False, + 'autoParagraph' : False, + }, + +} + +MEDIA_URL = '/media/' + +# STATIC_ROOT = os.path.join(SITE_ROOT, 'static') +STATIC_URL = '/static/' +STATICFILES_DIRS = ( + os.path.join(SITE_ROOT, 'static'), +) + +STATICFILES_FINDERS = ( + 'django.contrib.staticfiles.finders.FileSystemFinder', + 'django.contrib.staticfiles.finders.AppDirectoriesFinder', + #'django.contrib.staticfiles.finders.DefaultStorageFinder', +) + +# Make this unique, and don't share it with anybody. +SECRET_KEY = '=yz1@ko%1s8bmel)c84#s*xpxn%4(1e+smdnh*@rdm*5%v!mln' + + +TEMPLATE_CONTEXT_PROCESSORS = ( + "django.contrib.auth.context_processors.auth", + "django.core.context_processors.debug", + "django.core.context_processors.i18n", + "django.core.context_processors.media", + "django.core.context_processors.static", + "django.core.context_processors.tz", + "django.contrib.messages.context_processors.messages", + "django.core.context_processors.request", + 'social.apps.django_app.context_processors.backends', + 'social.apps.django_app.context_processors.login_redirect', + 'django_messages.context_processors.inbox', + "proj.views.expo_context" +) +#LOGIN_REDIRECT_URL = '/' + +MIDDLEWARE_CLASSES = ( +# 'django.middleware.cache.UpdateCacheMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'solid_i18n.middleware.SolidLocaleMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'social.apps.django_app.middleware.SocialAuthExceptionMiddleware', +# 'django.middleware.cache.FetchFromCacheMiddleware', + # Uncomment the next line for simple clickjacking protection: + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'django.contrib.redirects.middleware.RedirectFallbackMiddleware', + 'proj.middleware.ExpoRedirectFallbackMiddleware', + +) + + +ROOT_URLCONF = 'proj.urls' + +# Python dotted path to the WSGI application used by Django's runserver. +WSGI_APPLICATION = 'proj.wsgi.application' + +TEMPLATE_DIRS = ( + # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". + # Always use forward slashes, even on Windows. + # Don't forget to use absolute paths, not relative paths. + # os.path.join(SITE_ROOT, 'templates/debug_toolbar'), + os.path.join(SITE_ROOT, 'templates/c_admin'), + os.path.join(SITE_ROOT, 'templates/c_admin/accounts'), + os.path.join(SITE_ROOT, 'templates/c_admin/article'), + os.path.join(SITE_ROOT, 'templates/c_admin/country'), + os.path.join(SITE_ROOT, 'templates/c_admin/city'), + os.path.join(SITE_ROOT, 'templates/c_admin/company'), + os.path.join(SITE_ROOT, 'templates/c_admin/conference'), + os.path.join(SITE_ROOT, 'templates/c_admin/directories'), + os.path.join(SITE_ROOT, 'templates/c_admin/exposition'), + os.path.join(SITE_ROOT, 'templates/c_admin/forms'), + os.path.join(SITE_ROOT, 'templates/c_admin/import templates'), + os.path.join(SITE_ROOT, 'templates/c_admin/news'), + os.path.join(SITE_ROOT, 'templates/c_admin/organiser'), + os.path.join(SITE_ROOT, 'templates/c_admin/place_conference'), + os.path.join(SITE_ROOT, 'templates/c_admin/place_exposition'), + os.path.join(SITE_ROOT, 'templates/c_admin/page'), + os.path.join(SITE_ROOT, 'templates/c_admin/photoreport'), + os.path.join(SITE_ROOT, 'templates/c_admin/settings'), + os.path.join(SITE_ROOT, 'templates/c_admin/seminar'), + os.path.join(SITE_ROOT, 'templates/c_admin/service'), + os.path.join(SITE_ROOT, 'templates/c_admin/theme'), + os.path.join(SITE_ROOT, 'templates/c_admin/translator'), + os.path.join(SITE_ROOT, 'templates/c_admin/webinar'), + + os.path.join(SITE_ROOT, 'templates/client'), + os.path.join(SITE_ROOT, 'templates/client/exposition'), + os.path.join(SITE_ROOT, 'templates/client/photoreport'), + os.path.join(SITE_ROOT, 'templates/client/includes'), + os.path.join(SITE_ROOT, 'templates'), + #os.path.join(SITE_ROOT, 'templates/client/popups'), +) + +AUTH_USER_MODEL = 'accounts.User' +LOGIN_URL='/' +#registration info +ACCOUNT_ACTIVATION_DAYS=2 +# mail settings +EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' +EMAIL_HOST = 'localhost' +EMAIL_HOST_USER = '' +EMAIL_HOST_PASSWORD = '' +EMAIL_USE_TLS = True +EMAIL_PORT = 25 +DEFAULT_FROM_EMAIL = "expomap.ru" + + +AUTHENTICATION_BACKENDS = ( + 'social.backends.open_id.OpenIdAuth', + 'social.backends.vk.VKOAuth2', + 'social.backends.facebook.FacebookOAuth2', + 'social.backends.twitter.TwitterOAuth', + 'social.backends.google.GoogleOAuth', + 'social.backends.linkedin.LinkedinOAuth', + 'social.backends.odnoklassniki.OdnoklassnikiOAuth2', + 'social.backends.mailru.MailruOAuth2', + 'django.contrib.auth.backends.ModelBackend', +) + +SOCIAL_AUTH_LOGIN_URL = '/' +SOCIAL_AUTH_USER_MODEL = 'accounts.User' +SOCIAL_AUTH_LOGIN_REDIRECT_URL = '/logged-in/' +# The user will be redirected to this URL when a social account is disconnected +SOCIAL_AUTH_INACTIVE_USER_URL = '/inactive-user/' +# #Used to redirect the user once the auth process ended successfully. The value of ?next=/foo is used if it was present +# SOCIAL_AUTH_LOGIN_ERROR_URL = '/login-error/' +# #URL where the user will be redirected in case of an error +# SOCIAL_AUTH_LOGIN_URL = '/login-url/' +# #Is used as a fallback for LOGIN_ERROR_URL +# SOCIAL_AUTH_NEW_USER_REDIRECT_URL = '/new-users-redirect-url/' +# # Used to redirect new registered users, will be used in place of SOCIAL_AUTH_LOGIN_REDIRECT_URL if defined. +# Note that ?next=/foo is appended if present, if you want new users to go to next, you’ll need to do it yourself. +# SOCIAL_AUTH_NEW_ASSOCIATION_REDIRECT_URL = '/new-association-redirect-url/' +# # Like SOCIAL_AUTH_NEW_USER_REDIRECT_URL but for new associated accounts (user is already logged in). +# Used in place of SOCIAL_AUTH_LOGIN_REDIRECT_URL +# SOCIAL_AUTH_DISCONNECT_REDIRECT_URL = '/account-disconnected-redirect-url/' + +# Inactive users can be redirected to this URL when trying to authenticate. +# SOCIAL_AUTH_UID_LENGTH = +# SOCIAL_AUTH_NONCE_SERVER_URL_LENGTH = +# SOCIAL_AUTH_ASSOCIATION_SERVER_URL_LENGTH = +# SOCIAL_AUTH_FORCE_EMAIL_VALIDATION = True + +SOCIAL_AUTH_USERNAME_IS_FULL_EMAIL = True + +SOCIAL_AUTH_PIPELINE = ( + 'social.pipeline.social_auth.social_details', + 'social.pipeline.social_auth.social_uid', + 'functions.pipeline.load_user', + 'social.pipeline.social_auth.auth_allowed', + 'social.pipeline.social_auth.social_user', + 'social.pipeline.user.get_username', + 'functions.pipeline.require_email', + #'social.pipeline.mail.mail_validation', + 'functions.pipeline.create_user', + #'social.pipeline.user.create_user', + 'social.pipeline.social_auth.associate_by_email', + 'social.pipeline.social_auth.associate_user', + 'social.pipeline.social_auth.load_extra_data', + 'social.pipeline.user.user_details' + +) + +REQUIRES_EMAIL_VALIDATION = True +SOCIAL_AUTH_EMAIL_VALIDATION_FUNCTION = 'functions.pipeline.SendVerificationEmail' +SOCIAL_AUTH_EMAIL_VALIDATION_URL = '/email_verify_sent/' + + +SOCIAL_AUTH_VK_OAUTH2_KEY = '3393841' +SOCIAL_AUTH_VK_OAUTH2_SECRET = '2P19EBUEpLZifaabbREv' +SOCIAL_AUTH_VK_OAUTH2_SCOPE =['email'] +SOCIAL_AUTH_VK_OAUTH2_PROFILE_EXTRA_PARAMS = { + 'fields': 'email' +} + +SOCIAL_AUTH_FACEBOOK_KEY = '133775720059470' +SOCIAL_AUTH_FACEBOOK_SECRET = '434edf89c24a290497646a739df656c6' +SOCIAL_AUTH_FACEBOOK_SCOPE = ['email', 'publish_actions'] + +SOCIAL_AUTH_TWITTER_KEY = 'S6NX33FazTcWuqnXQhlOdg' +SOCIAL_AUTH_TWITTER_SECRET = 'MxUGfySQmLI5kvqSoAtWsGje2eAHQL7Jo8mXuIZ4D0' +SOCIAL_AUTH_TWITTER_SCOPE = ['email'] + +SOCIAL_AUTH_GOOGLE_OAUTH_KEY = '1044044901114.apps.googleusercontent.com' +SOCIAL_AUTH_GOOGLE_OAUTH_SECRET = 'j_McErlPPof88eNrmOXI-ZXI' +SOCIAL_AUTH_GOOGLE_OAUTH_SCOPE = ['email'] + +SOCIAL_AUTH_MAILRU_OAUTH2_KEY = '697945' +SOCIAL_AUTH_MAILRU_OAUTH2_SECRET = '343581b9e31961b334532cc1880066e8' +SOCIAL_AUTH_MAILRU_OAUTH2_SCOPE = ['email'] + +SOCIAL_AUTH_ODNOKLASSNIKI_OAUTH2_KEY = 'CBAQDCKIABABABABA' +SOCIAL_AUTH_ODNOKLASSNIKI_OAUTH2_SECRET = '814CDDCD3E2D2F278EF1591B' +SOCIAL_AUTH_ODNOKLASSNIKI_OAUTH2_PUBLIC_NAME = '128007936' +SOCIAL_AUTH_ODNOKLASSNIKI_OAUTH2_PUBLIC_SCOPE = ['email'] + +SOCIAL_AUTH_LINKEDIN_KEY = 'jt9xwquj1fkd' +SOCIAL_AUTH_LINKEDIN_SECRET = 'GvM2xQCNADaBfiMy' +SOCIAL_AUTH_LINKEDIN_SCOPE = ['email'] + + + +INSTALLED_APPS = ( + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.sites', + 'django.contrib.redirects', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'django.contrib.humanize', + 'django.contrib.sitemaps', + 'haystack', + #custom modules + 'redirects', + 'stats_collector', + 'emencia.django.newsletter', + 'accounts', + 'article', + 'city', + 'company', + 'conference', + 'core', + 'country', + 'directories', + 'expobanner', + 'exposition', + 'file', + 'import_xls', + 'news', + 'note', + 'organiser', + 'place_conference', + 'place_exposition', + 'photoreport', + 'registration', + 'review', + 'seminar', + 'service', + 'settings', + 'theme', + 'translator', + 'webinar', + 'meta', + 'events', + #django modules + 'django_crontab', + 'sorl.thumbnail', # for logos + 'photologue', # photogallery + 'sortedm2m', # photologue dependence + 'hvad', # + 'tinymce', # ??? + 'ckeditor', # wysiwig editor in admin + 'django_messages', # messages + 'bitfield', + 'djutils', # ?? + 'pytils', # ?? + 'pymorphy', # ?? + 'password_reset', # reset password + 'social.apps.django_app.default', # social auth + 'core', + 'specialist_catalog', + 'south', + 'rosetta', +) + +CRONJOBS = [ + ('8 * * * *', 'django.core.management.call_command', ['send_newsletter']), + + ('0 * * * *', 'django.core.management.call_command', ['update_index', 'conference', '--remove', '--age=6']), + ('5 * * * *', 'django.core.management.call_command', ['update_index', 'exposition', '--remove', '--age=6']), + ('0 1,13 * * *', 'django.core.management.call_command', ['update_index', 'place_exposition', '--remove', '--age=24']), + ('0 3 * * *', 'django.core.management.call_command', ['update_index', 'company', '--remove', '--age=48']), + ('0 4 * * *', 'django.core.management.call_command', ['update_index', 'theme', '--remove', '--age=48']), + ('0 5 * * * ', 'django.core.management.call_command', ['update_index', 'tag', '--remove', '--age=48']), + ('0 6 * * *', 'django.core.management.call_command', ['update_index', 'country', '--remove', '--age=48']), + ('0 7 * * *', 'django.core.management.call_command', ['update_index', 'city', '--remove', '--age=48']), + + ('10 * * * *', 'django.core.management.call_command', ['banner_log_update']), + ('20 2,14 * * *', 'django.core.management.call_command', ['banner_log_check_previous_day']), + ('*/5 * * * *', 'django.core.management.call_command', ['update_views_cache']), + + ('40 6 * * * ', 'django.core.management.call_command', ['newsletter_contacts_remove_notactivated']), + ('41 5 * * *', 'django.core.management.call_command', ['newsletter_create_announce']), + + ('12 4 * * *', 'django.core.management.call_command', ['stats_daily']), + ('5 10 * * *', 'django.core.management.call_command', ['update_events_filter_fields']), +] + +PYMORPHY_DICTS = { + 'ru': { 'dir': os.path.join(SITE_ROOT, 'settings/russian_dicts')} #'/home/www/proj/settings/russian_dicts' }, +} + +# search backend +HAYSTACK_CONNECTIONS = { + 'default': { + 'ENGINE': 'haystack.backends.solr_backend.SolrEngine', + 'URL': 'http://localhost:8983/solr' + # ...or for multicore... + # 'URL': 'http://127.0.0.1:8983/solr/mysite', + }, +} + + +# A sample logging configuration. The only tangible logging +# performed by this configuration is to send an email to +# the site admins on every HTTP 500 error when DEBUG=False. +# See http://docs.djangoproject.com/en/dev/topics/logging for +# more details on how to customize your logging configuration. +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'filters': { + 'require_debug_false': { + '()': 'django.utils.log.RequireDebugFalse' + } + }, + 'handlers': { + 'mail_admins': { + 'level': 'ERROR', + 'filters': ['require_debug_false'], + 'class': 'django.utils.log.AdminEmailHandler' + } + }, + 'loggers': { + 'django.request': { + 'handlers': ['mail_admins'], + 'level': 'ERROR', + 'propagate': True, + }, + } +} + +# TODO automate crons +""" +# update search indexes +0 * * * * /usr/bin/python /var/www/proj/manage.py update_index conference --remove --age=6 +0 * * * * /usr/bin/python /var/www/proj/manage.py update_index exposition --remove --age=6 +0 1,13 * * * /usr/bin/python /var/www/proj/manage.py update_index place_exposition --remove --age=24 +0 3 * * * /usr/bin/python /var/www/proj/manage.py update_index company --remove --age=48 +0 4 * * * /usr/bin/python /var/www/proj/manage.py update_index theme --remove --age=48 +0 5 * * * /usr/bin/python /var/www/proj/manage.py update_index tag --remove --age=48 +0 6 * * * /usr/bin/python /var/www/proj/manage.py update_index country --remove --age=48 +0 7 * * * /usr/bin/python /var/www/proj/manage.py update_index city --remove --age=48 +# update banner logs +10 * * * * /usr/bin/python /var/www/proj/manage.py banner_log_update +20 2,14 * * * /usr/bin/python /var/www/proj/manage.py banner_log_check_previous_day +# update hotels prices +20 1 * * 6 /usr/bin/python /var/www/proj/manage.py update_hotels_price +# newsletter +20 * * * * /usr/bin/python /var/www/proj/manage.py send_newsletter +40 6 * * * /usr/bin/python /var/www/proj/manage.py newsletter_contacts_remove_notactivated + +""" + +THUMBNAIL_DEBUG = DEBUG + +CALLBACK_EMAIL = 'kotzilla@ukr.net' + +BOOKING_AID = '333667' +try: + from functions.overrides import SeoPaginator as Paginator +except ImportError: + from django.core.paginator import Paginator +DEFAULT_PAGINATOR = Paginator +ADMIN_PAGINATION = 20 +CLIENT_PAGINATION = 25 + +TEMPLATE_DEBUG = DEBUG +NO_LOGO = '/static/client/img/no-logo.png' + +# events settings +CURRENCY = ('RUB', 'USD', 'EUR', 'RMB', 'GBP', 'AED', 'SGD', 'TRY', 'CZK', 'CHF', 'SEK', 'LKR', 'UAH', 'IDR', 'PLN','JPY') +BIT_AUDIENCE = (('experts', _(u'Специалисты')), ('experts and consumers', _(u'Специалисты и потребители')), + ('general public', _(u'Широкая публика'))) + +MONTHES = {'jan': {'value': 1, 'name': _(u'Январь')}, 'feb': {'value': 2, 'name': _(u'Февраль')}, + 'mar': {'value': 3, 'name': _(u'Март')}, 'apr': {'value': 4, 'name': _(u'Апрель')}, + 'may': {'value': 5, 'name': _(u'Май')}, 'jun': {'value': 6, 'name': _(u'Июнь')}, + 'jul': {'value': 7, 'name': _(u'Июль')}, 'aug': {'value': 8, 'name': _(u'Август')}, + 'sep': {'value': 9, 'name': _(u'Сентябрь')}, 'oct': {'value': 10, 'name': _(u'Октябрь')}, + 'nov': {'value': 11, 'name': _(u'Ноябрь')}, 'dec': {'value': 12, 'name': _(u'Декабрь')}} + +SNG_COUNTRIES = [159, 186, 31, 6, 99, 13, 189, 64] +RUSSIA_PK = 159 +MOSCOW_PK = -2960561 + + +CLIENT_DATE_FORMAT = ["%d.%m.%Y"] + +# cache pages in random seconds. random in this range +CACHE_RANGE = [60, 120] + +DEFAULT_POPUP_COOKIE = 'expo_b_default_popup' + +try: + from local import * +except ImportError, e: + pass +# save sessions in redis +SESSION_ENGINE = 'django.contrib.sessions.backends.cache' +if not DEBUG: + # cache template loading + TEMPLATE_LOADERS = ( + ('django.template.loaders.cached.Loader', ( + 'django.template.loaders.filesystem.Loader', + 'django.template.loaders.app_directories.Loader', + )), + ) +else: + TEMPLATE_LOADERS = ( + 'django.template.loaders.filesystem.Loader', + 'django.template.loaders.app_directories.Loader', + ) + +# debug_toolbar settings + +if DEBUG: + DEBUG_TOOLBAR_PATCH_SETTINGS = False + INTERNAL_IPS = ('127.0.0.1','176.121.5.82', '176.121.11.162', '77.123.47.46') + + MIDDLEWARE_CLASSES += ( + 'debug_toolbar.middleware.DebugToolbarMiddleware', + ) + + INSTALLED_APPS += ( + 'debug_toolbar', + ) + JQUERY_URL = os.path.join(SITE_ROOT, 'static/client/js/jquery-ui-1.10.4.custom.min.js'), + DEBUG_TOOLBAR_PANELS = [ + #'debug_toolbar.panels.versions.VersionsPanel', + 'debug_toolbar.panels.timer.TimerPanel', + 'debug_toolbar.panels.settings.SettingsPanel', + 'debug_toolbar.panels.headers.HeadersPanel', + 'debug_toolbar.panels.request.RequestPanel', + 'debug_toolbar.panels.sql.SQLPanel', + 'debug_toolbar.panels.staticfiles.StaticFilesPanel', + 'debug_toolbar.panels.templates.TemplatesPanel', + 'debug_toolbar.panels.cache.CachePanel', + 'debug_toolbar.panels.signals.SignalsPanel', + 'debug_toolbar.panels.logging.LoggingPanel', + 'debug_toolbar.panels.redirects.RedirectsPanel', +] + + +# logging +U_LOGFILE_SIZE = 1 * 1024 * 1024 +U_LOGFILE_COUNT = 2 +DEFAULT_LOGGER_NAME = 'django' +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'formatters': { + 'verbose': { + 'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s \n' + }, + 'simple': { + 'format': '%(levelname)s %(message)s' + }, + }, + 'handlers': { + 'file': { + 'level': 'INFO', + 'filename': os.path.join(SITE_ROOT, 'logs/django.log'), + 'formatter': 'verbose', + 'class':'logging.handlers.RotatingFileHandler', + 'maxBytes': U_LOGFILE_SIZE, + 'backupCount': U_LOGFILE_COUNT, + }, + }, + 'loggers': { + 'django': { + 'handlers': ['file'], + 'propagate': True, + 'level': 'DEBUG', + }, + } +} diff --git a/templates/client/accounts/mailing_settings.html b/templates/client/accounts/mailing_settings.html index 70d4e46c..68be3828 100644 --- a/templates/client/accounts/mailing_settings.html +++ b/templates/client/accounts/mailing_settings.html @@ -184,6 +184,12 @@ +