From f536da4e013ead5a127e30547819cbd77d7c4598 Mon Sep 17 00:00:00 2001 From: Tomislav R Date: Wed, 4 May 2016 20:11:15 +0200 Subject: [PATCH 1/4] Updated INSTALLATION doc --- INSTALLATION.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/INSTALLATION.rst b/INSTALLATION.rst index 26a4ae0e..3ea52569 100644 --- a/INSTALLATION.rst +++ b/INSTALLATION.rst @@ -43,6 +43,21 @@ After You have complited the task create a pull request and ask someone to revie `read more about getting code from upstream here `_ +*merging your branch* +**IMPORTANT** +Before You make a pull request from Your forked branch to the ungleich make sure You did merge and resolve any conflicts You may find and that the application is running bug free. +Also You can run + +``./manage test`` + +To merge upstream branch run this git commands. + +``git fetch upstream`` +``git checkout your_feature_branch`` +``git merge remotes/upstream/develop`` + + + From 9cfdeb73c6b5dee47cf8db46b4b74dc974a9936e Mon Sep 17 00:00:00 2001 From: Tomislav R Date: Wed, 4 May 2016 20:12:58 +0200 Subject: [PATCH 2/4] Updated INSTALLATION doc --- INSTALLATION.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/INSTALLATION.rst b/INSTALLATION.rst index 3ea52569..3696b446 100644 --- a/INSTALLATION.rst +++ b/INSTALLATION.rst @@ -45,15 +45,19 @@ After You have complited the task create a pull request and ask someone to revie *merging your branch* **IMPORTANT** + Before You make a pull request from Your forked branch to the ungleich make sure You did merge and resolve any conflicts You may find and that the application is running bug free. Also You can run ``./manage test`` + To merge upstream branch run this git commands. ``git fetch upstream`` + ``git checkout your_feature_branch`` + ``git merge remotes/upstream/develop`` From 5480b51e928e3cea7d84aee618fd23213a73aed5 Mon Sep 17 00:00:00 2001 From: Tomislav R Date: Wed, 4 May 2016 20:13:31 +0200 Subject: [PATCH 3/4] Updated INSTALLATION doc --- INSTALLATION.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALLATION.rst b/INSTALLATION.rst index 3696b446..ee36b3ad 100644 --- a/INSTALLATION.rst +++ b/INSTALLATION.rst @@ -44,7 +44,7 @@ After You have complited the task create a pull request and ask someone to revie `read more about getting code from upstream here `_ *merging your branch* -**IMPORTANT** +(**IMPORTANT**) Before You make a pull request from Your forked branch to the ungleich make sure You did merge and resolve any conflicts You may find and that the application is running bug free. Also You can run From e137e8a26ee0b9aa9a518d99782eecfc45a0151a Mon Sep 17 00:00:00 2001 From: Tomislav R Date: Sat, 7 May 2016 23:05:46 +0200 Subject: [PATCH 4/4] resolve base.py conflict --- dynamicweb/settings/base.py | 76 ++++++++++++++++++------------------- dynamicweb/settings/prod.py | 2 + membership/models.py | 7 ++-- utils/mailer.py | 52 +++++++++++++++++++++++++ utils/stripe_utils.py | 4 +- 5 files changed, 97 insertions(+), 44 deletions(-) create mode 100644 utils/mailer.py diff --git a/dynamicweb/settings/base.py b/dynamicweb/settings/base.py index 9d64dc60..54e39c9a 100644 --- a/dynamicweb/settings/base.py +++ b/dynamicweb/settings/base.py @@ -30,7 +30,7 @@ dotenv.read_dotenv("{0}/.env".format(PROJECT_DIR)) SITE_ID = 1 APP_ROOT_ENDPOINT = "/" -APPEND_SLASH=True +APPEND_SLASH = True LOGIN_URL = None LOGOUT_URL = None @@ -43,7 +43,7 @@ SECRET_KEY = env('DJANGO_SECRET_KEY') # Application definition INSTALLED_APPS = ( - #1st migrate + # 1st migrate 'membership', 'django.contrib.admin', 'django.contrib.auth', @@ -79,26 +79,26 @@ INSTALLED_APPS = ( 'menus', # helper for model independent hierarchical website navigation 'cmsplugin_filer_image', - #2nd migrate + # 2nd migrate # django-cms plugins - 'djangocms_file', - 'djangocms_picture', - 'djangocms_video', - # 'djangocms_flash', - # 'djangocms_googlemap', - # 'djangocms_inherit', - # 'djangocms_link', - # 'djangocms_teaser', - 'djangocms_page_meta', - 'djangocms_text_ckeditor', - 'djangocms_admin_style', - 'cmsplugin_filer_file', - 'cmsplugin_filer_folder', - 'cmsplugin_filer_link', - # 'cmsplugin_filer_teaser', - 'cmsplugin_filer_video', + 'djangocms_file', + 'djangocms_picture', + 'djangocms_video', + # 'djangocms_flash', + # 'djangocms_googlemap', + # 'djangocms_inherit', + # 'djangocms_link', + # 'djangocms_teaser', + 'djangocms_page_meta', + 'djangocms_text_ckeditor', + 'djangocms_admin_style', + 'cmsplugin_filer_file', + 'cmsplugin_filer_folder', + 'cmsplugin_filer_link', + # 'cmsplugin_filer_teaser', + 'cmsplugin_filer_video', # - #blog + # blog # versioning 'reversion', # ungleich @@ -128,18 +128,17 @@ MIDDLEWARE_CLASSES = ( ROOT_URLCONF = 'dynamicweb.urls' - TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [os.path.join(PROJECT_DIR,'cms_templates/'), - os.path.join(PROJECT_DIR,'cms_templates/djangocms_blog/'), - os.path.join(PROJECT_DIR,'membership'), - os.path.join(PROJECT_DIR,'ungleich/templates/djangocms_blog/'), - os.path.join(PROJECT_DIR,'ungleich/templates/cms/ungleichch'), - os.path.join(PROJECT_DIR,'ungleich/templates/ungleich') + 'DIRS': [os.path.join(PROJECT_DIR, 'cms_templates/'), + os.path.join(PROJECT_DIR, 'cms_templates/djangocms_blog/'), + os.path.join(PROJECT_DIR, 'membership'), + os.path.join(PROJECT_DIR, 'ungleich/templates/djangocms_blog/'), + os.path.join(PROJECT_DIR, 'ungleich/templates/cms/ungleichch'), + os.path.join(PROJECT_DIR, 'ungleich/templates/ungleich') - ], + ], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ @@ -170,7 +169,7 @@ CMS_TEMPLATES = ( ('letscowork.html', gettext('DG.CoWork')), # ('detail.html', gettext('DG.Detail')), ('one_column.html', gettext('DG.OneColumn')), - #ungleich + # ungleich ('blog_ungleich.html', gettext('Blog')), ('page.html', gettext('Page')), ) @@ -204,8 +203,8 @@ LANGUAGES = ( LANGUAGE_CODE = 'en-us' LOCALE_PATHS = [ - - os.path.join(PROJECT_DIR,'digitalglarus/locale'), + + os.path.join(PROJECT_DIR, 'digitalglarus/locale'), ] CMS_PLACEHOLDER_CONF = { @@ -332,9 +331,9 @@ STATICFILES_FINDERS = ( 'compressor.finders.CompressorFinder', ) -#COMPRESS_PRECOMPILERS = ( +# COMPRESS_PRECOMPILERS = ( # ('text/less', 'lesscpy {infile}'), -#) +# ) THUMBNAIL_PROCESSORS = ( 'easy_thumbnails.processors.colorspace', @@ -446,14 +445,15 @@ AUTH_USER_MODEL = 'membership.CustomUser' # PAYMENT -STRIPE_API_PUBLIC_KEY = 'pk_test_QqBZ50Am8KOxaAlOxbcm9Psl' # used in frontend to call from user browser -STRIPE_API_PRIVATE_KEY = 'sk_test_dqAmbKAij12QCGfkYZ3poGt2' # used in backend payment STRIPE_DESCRIPTION_ON_PAYMENT = "Payment for ungleich GmbH services" # EMAIL MESSAGES REGISTRATION_MESSAGE = {'subject': "Validation mail", - 'message': 'Please validate Your account under this link http://localhost:8000/en-us/validate/{}', - 'from': 'test@test.com'} + 'message': 'Thank You for registering for account on Digital Glarus.\nPlease verify Your account under following link http://{host}/en-us/digitalglarus/login/validate/{slug}', + } + +STRIPE_API_PRIVATE_KEY = env('STRIPE_API_PRIVATE_KEY') +STRIPE_API_PUBLIC_KEY = env('STRIPE_API_PUBLIC_KEY') DEBUG = True @@ -461,5 +461,3 @@ if DEBUG: from .local import * else: from .prod import * -#dont migrate test -# SOUTH_TESTS_MIGRATE = False diff --git a/dynamicweb/settings/prod.py b/dynamicweb/settings/prod.py index 2577bfe5..1f21ca46 100644 --- a/dynamicweb/settings/prod.py +++ b/dynamicweb/settings/prod.py @@ -8,6 +8,8 @@ ADMINS = ( MANAGERS = ADMINS +REGISTRATION_MESSAGE['message'] = REGISTRATION_MESSAGE['message'].format(host='digitalglarus.ungleich.ch',slug='{slug}') + ALLOWED_HOSTS = [ ".ungleich.ch", "digital.glarus.ungleich.ch" , diff --git a/membership/models.py b/membership/models.py index 75962660..d9861166 100644 --- a/membership/models.py +++ b/membership/models.py @@ -4,12 +4,12 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ from django.contrib.auth.models import User, AbstractBaseUser, BaseUserManager, AbstractUser from django.contrib.auth.hashers import make_password -from django.core.mail import send_mail from django.core.validators import RegexValidator from django.contrib.auth.models import User from django.contrib.sites.models import Site from utils.stripe_utils import StripeUtils +from utils.mailer import DigitalGlarusRegistrationMailer REGISTRATION_MESSAGE = {'subject': "Validation mail", 'message': 'Please validate Your account under this link http://localhost:8000/en-us/digitalglarus/login/validate/{}', @@ -72,9 +72,8 @@ class CustomUser(AbstractBaseUser): if not user: user = cls.objects.create_user(name=name, email=email, password=password) if user: - send_mail(REGISTRATION_MESSAGE['subject'], - REGISTRATION_MESSAGE['message'].format(user.validation_slug), - REGISTRATION_MESSAGE['from'], [user.email], fail_silently=False) + dg = DigitalGlarusRegistrationMailer(user.validation_slug) + dg.send_mail(to=user.email) return user else: return None diff --git a/utils/mailer.py b/utils/mailer.py new file mode 100644 index 00000000..a12ffba6 --- /dev/null +++ b/utils/mailer.py @@ -0,0 +1,52 @@ +import six +from django.core.mail import send_mail + +from django.conf import settings + + +class BaseMailer(object): + def __init__(self): + self._slug = None + self.no_replay_mail = 'no-replay@ungleich.ch' + + if not hasattr(self, '_to'): + self._to = None + + @property + def slug(self): + return self._slug + + @slug.setter + def slug(self, val): + assert isinstance(val, six.string_types), "slug is not string: %r" % val + self._slug = val + + @property + def registration(self): + return self.message + + @registration.setter + def registration(self, val): + msg = "registration is not dict with fields subject,message" + assert type(val) is dict, msg + assert val.get('subject') and val.get('message'), msg + self._message, self._subject, self._from = ( + val.get('message'), val.get('subject'), val.get('from')) + assert isinstance(self.slug, six.string_types), 'slug not set' + + def send_mail(self, to=None): + if not to: + to = self._to + if not self.message: + raise NotImplementedError + send_mail(self._subject, self._message, self.no_replay_mail, [to]) + + +class DigitalGlarusRegistrationMailer(BaseMailer): + message = settings.REGISTRATION_MESSAGE + + def __init__(self, slug): + self.slug = slug + self.registration = self.message + self._message = self._message.format(slug=self._slug) + super().__init__() diff --git a/utils/stripe_utils.py b/utils/stripe_utils.py index ce14d417..fb0a328e 100644 --- a/utils/stripe_utils.py +++ b/utils/stripe_utils.py @@ -1,6 +1,5 @@ import stripe from django.conf import settings - stripe.api_key = settings.STRIPE_API_PRIVATE_KEY @@ -122,3 +121,6 @@ class StripeUtils(object): name=name, currency=self.CURRENCY, id=id) + + +