diff --git a/.gitignore b/.gitignore index d78b703..491a287 100644 --- a/.gitignore +++ b/.gitignore @@ -17,10 +17,9 @@ yandex_money.log /static/ /src/dokumentor/media/ /tmp/ -/conf/env.local /data/ /public/ - +conf/env !local.py !parts !.gitkeep diff --git a/Dockerfile b/Dockerfile index ff29005..ec863d7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,9 @@ FROM python:3.6 ENV PYTHONUNBUFFERED 1 COPY requirements /opt/app/requirements -RUN apt-get update && \ - apt-get -y install ghostscript libfreetype6-dev nginx supervisor make && \ +RUN apt-get update -y && \ + apt-get upgrade -y && \ + apt-get -y install ghostscript libfreetype6-dev python3-dev nginx supervisor make && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* && \ diff --git a/conf/env b/conf/env index ffb6ae2..34b7fc2 100644 --- a/conf/env +++ b/conf/env @@ -2,6 +2,8 @@ DJANGO_SETTINGS_MODULE='dokumentor.settings.local' DJANGO_SECRET='CHANGE_ME_IN_PRODUCTION' +SSL=False + DJANGO_DB='postgres://dokumentor:dokumentor@localhost:5432/dokumentor' DJANGO_DB_sqlite3='sqlite:////Users/mitri4/Projects/dokumentor/db.sqlite3' diff --git a/conf/env.local b/conf/env.local index ffb6ae2..34b7fc2 100644 --- a/conf/env.local +++ b/conf/env.local @@ -2,6 +2,8 @@ DJANGO_SETTINGS_MODULE='dokumentor.settings.local' DJANGO_SECRET='CHANGE_ME_IN_PRODUCTION' +SSL=False + DJANGO_DB='postgres://dokumentor:dokumentor@localhost:5432/dokumentor' DJANGO_DB_sqlite3='sqlite:////Users/mitri4/Projects/dokumentor/db.sqlite3' diff --git a/conf/env.stage b/conf/env.stage index afdfd12..d8f22b4 100644 --- a/conf/env.stage +++ b/conf/env.stage @@ -1,5 +1,7 @@ DJANGO_SETTINGS_MODULE=dokumentor.settings.stage +SSL=False + DJANGO_SECRET='CHANGE_ME_IN_PRODUCTION' DJANGO_DB='postgres://dokumentor:dokumentor@db:5432/dokumentor' diff --git a/conf/env.template b/conf/env.template index bd0ccc7..41b9593 100644 --- a/conf/env.template +++ b/conf/env.template @@ -16,4 +16,4 @@ CELERY_BROKER_URL='amqp://guest:guest@localhost:5672//' CELERY_RESULT_BACKEND='amqp://guest:guest@localhost:5672//' CALLBACK_EMAIL_SENDER='' -CALLBACK_MANAGERS_EMAILS=[] +CALLBACK_MANAGERS_EMAILS=() diff --git a/conf/nginx_vds.conf b/conf/nginx_vds.conf new file mode 100644 index 0000000..10df4b3 --- /dev/null +++ b/conf/nginx_vds.conf @@ -0,0 +1,20 @@ +upstream onpoint-dev { + server localhost:32768; +} + +server { + client_max_body_size 175M; + listen 0.0.0.0:80; + server_name www.dev.dokumentor.mitri4.pro dev.dokumentor.mitri4.pro; + + location / { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Host $http_host; + proxy_set_header X-NginX-Proxy true; + + proxy_pass http://onpoint-dev/; + proxy_redirect off; + } + +} diff --git a/docker-compose.yml b/docker-compose.yml index 22315f6..72630d5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,7 +6,8 @@ services: volumes: - ./:/opt/app ports: - - "80:80" + - "32768:80" + - "8000:8000" env_file: conf/env.stage environment: - REDIS_URL=redis://redis:6379/1 diff --git a/src/customer/forms.py b/src/customer/forms.py index 5000224..8886e8f 100644 --- a/src/customer/forms.py +++ b/src/customer/forms.py @@ -8,7 +8,9 @@ from yandex_money.forms import PaymentForm from commons.forms import MyBaseModelForm, set_field_error from customer import consts, models +from django.forms.utils import ErrorList +from django.forms.forms import NON_FIELD_ERRORS FILE_UPLOAD_MAX_MEMORY_SIZE = getattr(settings, 'FILE_UPLOAD_MAX_MEMORY_SIZE ', 2621440) # default 2.5Mb @@ -238,15 +240,14 @@ class ClientForm(forms.ModelForm): self.fields['okpo'].widget.attrs.update(_numeric(self.fields['okpo'])) def clean(self): - if self.instance: + + if self.instance.inn: return self.cleaned_data inn = self.cleaned_data.get('inn') partner_exists = models.Client.objects.filter(inn=inn, company=self.request.user.profile) if partner_exists: if 'inn' not in self._errors: - from django.forms.util import ErrorList - from django.forms.forms import NON_FIELD_ERRORS error = 'Контрагент с ИНН {} уже существует'.format(inn) self._errors['inn'] = ErrorList() self._errors['inn'].append(error) diff --git a/src/docs/views/base_views.py b/src/docs/views/base_views.py index 6a26762..dc4e0e1 100644 --- a/src/docs/views/base_views.py +++ b/src/docs/views/base_views.py @@ -12,7 +12,7 @@ from django.contrib import messages from django.db import DatabaseError from django.shortcuts import render, get_object_or_404, redirect -from django.http import HttpResponseServerError, HttpResponseBadRequest, HttpResponse +from django.http import HttpResponseBadRequest, HttpResponse from django.utils.decorators import method_decorator from django.views.decorators.http import require_POST from django.views.decorators.csrf import csrf_protect @@ -21,7 +21,6 @@ from django.forms.models import inlineformset_factory, model_to_dict from django.template.loader import render_to_string from django.core.mail import EmailMessage from django.utils.encoding import smart_str -from django.conf import settings from commons.utils import dthandler from commons.paginator import pagination, save_per_page_value @@ -33,11 +32,10 @@ from customer.forms import ClientsListForm, ClientForm from docs.as_xls import render_xls_to_string from docs.forms import EmailForm, InvoicesListForm -from docs import filters - from customer.decorators import license_required from customer.utils import raise_if_no_profile from django.conf import settings +import traceback DEBUG = getattr(settings, 'DEBUG', False) @@ -47,6 +45,8 @@ MEDIA_URL = getattr(settings, 'MEDIA_URL', '') ORDER_VAR = 'o' ORDER_TYPE_VAR = 'ot' +# GHOSTSCRIPTCMD = 'gs' +GHOSTSCRIPTCMD = '/usr/bin/gs' class Ordering(object): @@ -409,7 +409,9 @@ class BaseViews(object): f.write(pdf) f.close() - args = ["gs", + print(filename) + + args = [GHOSTSCRIPTCMD, "-q", "-dNOPAUSE", "-dBATCH", "-dSAFER", "-sDEVICE=png16m", @@ -418,10 +420,19 @@ class BaseViews(object): "-f", filename ] try: + + print("Running command:\n%s" % ' '.join(args)) + p = s.Popen(args=args, stdout=s.PIPE, stderr=s.PIPE) p.wait() - except OSError: - sys.exit("Error executing Ghostscript. Is it in your PATH?") + except OSError as e: + sys.exit("{}\nError executing Ghostscript {}. " + "Is it in your PATH?".format(e, GHOSTSCRIPTCMD)) + + except: + print("Error while running Ghostscript subprocess. Traceback:") + print("Traceback:\n%s" % traceback.format_exc()) + os.remove(filename) filename = '%s.pdf' % self.get_filename(*args, **kwargs) imgs = glob.glob(os.path.join(tmp_dir, '*.png')) diff --git a/src/dokumentor/settings/base.py b/src/dokumentor/settings/common.py similarity index 99% rename from src/dokumentor/settings/base.py rename to src/dokumentor/settings/common.py index 904aad9..3035bed 100644 --- a/src/dokumentor/settings/base.py +++ b/src/dokumentor/settings/common.py @@ -20,6 +20,7 @@ SECRET_KEY = e.get('DJANGO_SECRET') DEBUG = False +SSL = e.get('SSL', default=False) # 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 diff --git a/src/dokumentor/settings/local.py b/src/dokumentor/settings/local.py index ed83245..44a4fd3 100644 --- a/src/dokumentor/settings/local.py +++ b/src/dokumentor/settings/local.py @@ -2,13 +2,14 @@ import dj_database_url -from dokumentor.settings.base import * +from dokumentor.settings.common import * def custom_show_toolbar(self): return True DEBUG = True +TEMPLATES[0]['OPTIONS']['debug'] = DEBUG if DEBUG: INSTALLED_APPS.append('debug_toolbar') diff --git a/src/dokumentor/settings/production.py b/src/dokumentor/settings/production.py index e291bfd..493f192 100644 --- a/src/dokumentor/settings/production.py +++ b/src/dokumentor/settings/production.py @@ -2,9 +2,10 @@ import dj_database_url -from dokumentor.settings.base import * +from dokumentor.settings.common import * DEBUG = False +TEMPLATES[0]['OPTIONS']['debug'] = DEBUG ADMINS = [] @@ -16,6 +17,12 @@ DATABASES = { 'default': dj_database_url.parse(e.get('DJANGO_DB')), } +if SSL: + SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') + SECURE_SSL_REDIRECT = True + SESSION_COOKIE_SECURE = True + CSRF_COOKIE_SECURE = True + DEFAULT_FROM_EMAIL = e.get('DJANGO_FROM_EMAIL') SERVER_EMAIL = DEFAULT_FROM_EMAIL EMAIL_HOST = e.get('DJANGO_EMAIL_HOST') diff --git a/src/dokumentor/settings/stage.py b/src/dokumentor/settings/stage.py index e2f5481..c11b41c 100644 --- a/src/dokumentor/settings/stage.py +++ b/src/dokumentor/settings/stage.py @@ -2,9 +2,10 @@ import dj_database_url -from dokumentor.settings.base import * +from dokumentor.settings.common import * DEBUG = False +TEMPLATES[0]['OPTIONS']['debug'] = DEBUG ADMINS = [ ('Dmitriy Shesterkin', 'mitri4@bk.ru'), @@ -13,7 +14,7 @@ ADMINS = [ MANAGERS = ADMINS -ALLOWED_HOSTS = ['dokumentor.mitri4.pro'] +ALLOWED_HOSTS = ['dokumentor.mitri4.pro', '127.0.0.1', 'dev.dokumentor.mitri4.pro'] DATABASES = { 'default': dj_database_url.parse(e.get('DJANGO_DB')),