frontend for add stamp crop image, test only stamp

prod
Dmitriy Shesterkin 9 years ago
parent 2ba0771c94
commit 2c337b5c1c
  1. 28
      .eslintrc.js
  2. 41
      src/customer/models.py
  3. 127
      src/customer/urls.py
  4. 130
      src/customer/views/profile.py
  5. 77
      src/dokumentor/static/css/style.css
  6. 148
      src/dokumentor/static/js/profile/asset.js
  7. 1
      src/dokumentor/templates/base.html
  8. 38
      src/dokumentor/templates/customer/profile/edit.html

@ -0,0 +1,28 @@
var OFF = 0, WARN = 1, ERROR = 2;
module.exports = exports = {
"root": true,
env: {
'es6': true, // We are writing ES6 code
'browser': true, // for the browser
'commonjs': true // and use require() for stylesheets
},
"parserOptions": {
"ecmaFeatures": {
"modules": true
},
"sourceType": "module"
},
"rules":{
"no-console": OFF,
"jsx-quotes": WARN,
"no-unused-vars": WARN,
"no-undef": WARN
},
"globals": {
"$": true
},
"extends": ["eslint:recommended"]
};

@ -58,17 +58,24 @@ class UserProfile(models.Model):
boss_name = models.CharField(u'Имя', max_length=30, default='') boss_name = models.CharField(u'Имя', max_length=30, default='')
boss_midname = models.CharField(u'Отчество', max_length=30, default='') boss_midname = models.CharField(u'Отчество', max_length=30, default='')
inn = models.CharField(u'ИНН', max_length=12, default='') # длина: 10 для организаций, 12 для ИП # длина: 10 для организаций, 12 для ИП
ogrn = models.CharField(u'ОГРН/ОГРНИП', max_length=15, default='') # длина: 13 для организаций, 15 для ИП inn = models.CharField(u'ИНН', max_length=12, default='')
okpo = models.CharField(u'ОКПО', max_length=10, blank=True, default='') # длина: 8 для организаций, 8 или 10 для ИП # длина: 13 для организаций, 15 для ИП
ogrn = models.CharField(u'ОГРН/ОГРНИП', max_length=15, default='')
glavbuh_surname = models.CharField(u'Фамилия', max_length=30, blank=True, default='', # длина: 8 для организаций, 8 или 10 для ИП
help_text=u'Используется для строки "подпись" в документах.') okpo = models.CharField(u'ОКПО', max_length=10, blank=True, default='')
glavbuh_surname = models.CharField('Фамилия', max_length=30, blank=True, default='',
help_text='Используется для строки "подпись" в документах.')
glavbuh_name = models.CharField(u'Имя', max_length=30, blank=True, default='') glavbuh_name = models.CharField(u'Имя', max_length=30, blank=True, default='')
glavbuh_midname = models.CharField(u'Отчество', max_length=30, blank=True, default='') glavbuh_midname = models.CharField(u'Отчество', max_length=30, blank=True, default='')
address = models.CharField(u'Фактический адрес', max_length=256, default='', address = models.CharField(
help_text=u'Будет подставляться в создаваемые счета, акты и накладные.') 'Фактический адрес',
max_length=256,
default='',
help_text='Будет подставляться в создаваемые счета, акты и накладные.'
)
jur_address = models.CharField(u'Юридический адрес', max_length=256, blank=True, default='', jur_address = models.CharField(u'Юридический адрес', max_length=256, blank=True, default='',
help_text=u'Как в учредительных документах.') help_text=u'Как в учредительных документах.')
@ -86,16 +93,26 @@ class UserProfile(models.Model):
site = models.CharField(u'Сайт', max_length=256, blank=True, default='') site = models.CharField(u'Сайт', max_length=256, blank=True, default='')
# поля, только для ИП # поля, только для ИП
svid_gos_reg = models.CharField(u'Свид-во о гос. регистрации', max_length=256, blank=True, default='', svid_gos_reg = models.CharField(
help_text=u'Требуется для счет-фактуры.') 'Свид-во о гос. регистрации',
max_length=256,
blank=True,
default='',
help_text=u'Требуется для счет-фактуры.'
)
ip_reg_date = models.DateField(u'Дата регистрации ИП', blank=True, null=True) ip_reg_date = models.DateField(u'Дата регистрации ИП', blank=True, null=True)
# поля, только для Организации # поля, только для Организации
name = models.CharField(u'Краткое название организации', max_length=256, default='', name = models.CharField(u'Краткое название организации', max_length=256, default='',
help_text=u'Будет подставляться в создаваемые документы.') help_text=u'Будет подставляться в создаваемые документы.')
full_name = models.CharField(u'Полное название организации', max_length=256, blank=True, default='', full_name = models.CharField(
help_text=u'Как в учредительных документах.') 'Полное название организации',
max_length=256,
blank=True,
default='',
help_text=u'Как в учредительных документах.'
)
kpp = models.CharField(u'КПП', max_length=9, default='') kpp = models.CharField(u'КПП', max_length=9, default='')

@ -6,67 +6,80 @@ from customer.views import profile, profile_ajax, license, documents
from customer.views import bank_accounts, bank_accounts_ajax from customer.views import bank_accounts, bank_accounts_ajax
from customer.views import clients, clients_ajax from customer.views import clients, clients_ajax
urlpatterns = patterns('', urlpatterns = \
# личный кабинет patterns('',
url(r'^$', views.customer_index, name='customer_index'), # личный кабинет
url(r'^$', views.customer_index, name='customer_index'),
# --- профиль # --- профиль
url(r'^profile/$', profile.profile_view, name='customer_profile_view'), url(r'^profile/$', profile.profile_view, name='customer_profile_view'),
url(r'^profile/edit/$', profile.profile_edit, name='customer_profile_edit'), url(r'^profile/edit/$', profile.profile_edit, name='customer_profile_edit'),
url(r'^profile/email/$', profile.profile_email, name='customer_profile_email'), url(r'^profile/email/$', profile.profile_email, name='customer_profile_email'),
url(r'^license/$', license.order_license, name='customer_order_license'), url(r'^license/$', license.order_license, name='customer_order_license'),
url(r'^delete_license/(?P<pk>\d+)/$', license.delete_license, name='customer_delete_license'), url(r'^delete_license/(?P<pk>\d+)/$', license.delete_license,
url(r'^get_doc/(?P<order_num>\d+)/$', documents.get_doc, name='customer_license_get_doc'), name='customer_delete_license'),
url(r'^payment/confirm/(?P<payment_id>\d+)$', license.yandex_pay, name='yamoney_confirm'), url(r'^get_doc/(?P<order_num>\d+)/$', documents.get_doc,
url(r'^payment/result/$', license.payment_result, name='yamoney_result'), name='customer_license_get_doc'),
url(r'^payment/success/$', license.payment_success, name='yamoney_success'), url(r'^payment/confirm/(?P<payment_id>\d+)$', license.yandex_pay,
url(r'^payment/fail/$', license.payment_fail, name='yamoney_fail'), name='yamoney_confirm'),
url(r'^license_list/$', license.license_list, name='customer_license_list'), url(r'^payment/result/$', license.payment_result, name='yamoney_result'),
url(r'^paid_list/$', license.paid_list, name='customer_paid_list'), url(r'^payment/success/$', license.payment_success, name='yamoney_success'),
url(r'^payment/fail/$', license.payment_fail, name='yamoney_fail'),
url(r'^license_list/$', license.license_list, name='customer_license_list'),
url(r'^paid_list/$', license.paid_list, name='customer_paid_list'),
# --- профиль AJAX # --- профиль AJAX
url(r'^profile/filters/edit/ajax/$', profile_ajax.profile_filters_edit_ajax, url(r'^profile/filters/edit/ajax/$', profile_ajax.profile_filters_edit_ajax,
name='customer_profile_filters_edit_ajax'), name='customer_profile_filters_edit_ajax'),
url(r'^profile/email/ajax/$', profile_ajax.profile_email_ajax, url(r'^profile/email/ajax/$', profile_ajax.profile_email_ajax,
name='customer_profile_email_ajax'), name='customer_profile_email_ajax'),
# --- расчетные счета # --- расчетные счета
url(r'^bank-accounts/$', bank_accounts.bank_accounts_list, name='customer_bank_accounts_list'), url(r'^bank-accounts/$', bank_accounts.bank_accounts_list,
url(r'^bank-accounts/page/(?P<page_num>[0-9]+)/$', bank_accounts.bank_accounts_list, name='customer_bank_accounts_list'),
name='customer_bank_accounts_list'), url(r'^bank-accounts/page/(?P<page_num>[0-9]+)/$', bank_accounts.bank_accounts_list,
url(r'^bank-accounts/add/$', bank_accounts.bank_accounts_add, name='customer_bank_accounts_add'), name='customer_bank_accounts_list'),
url(r'^bank-accounts/(?P<id>\d+)/edit/$', bank_accounts.bank_accounts_edit, url(r'^bank-accounts/add/$', bank_accounts.bank_accounts_add,
name='customer_bank_accounts_edit'), name='customer_bank_accounts_add'),
url(r'^bank-accounts/(?P<id>\d+)/delete/$', bank_accounts.bank_accounts_delete, url(r'^bank-accounts/(?P<id>\d+)/edit/$', bank_accounts.bank_accounts_edit,
name='customer_bank_accounts_delete'), name='customer_bank_accounts_edit'),
url(r'^bank-accounts/(?P<id>\d+)/delete/$', bank_accounts.bank_accounts_delete,
name='customer_bank_accounts_delete'),
# --- расчетные счета AJAX # --- расчетные счета AJAX
url(r'^bank-accounts/ajax/$', bank_accounts_ajax.bank_accounts_list_ajax, url(r'^bank-accounts/ajax/$', bank_accounts_ajax.bank_accounts_list_ajax,
name='customer_bank_accounts_list_ajax'), name='customer_bank_accounts_list_ajax'),
url(r'^bank-accounts/(?P<id>\d+)/get/ajax/$', bank_accounts_ajax.bank_accounts_get_ajax, url(r'^bank-accounts/(?P<id>\d+)/get/ajax/$',
name='customer_bank_accounts_get_ajax'), bank_accounts_ajax.bank_accounts_get_ajax,
url(r'^bank-accounts/add/ajax/$', bank_accounts_ajax.bank_accounts_add_ajax, name='customer_bank_accounts_get_ajax'),
name='customer_bank_accounts_add_ajax'), url(r'^bank-accounts/add/ajax/$', bank_accounts_ajax.bank_accounts_add_ajax,
url(r'^bank-accounts/(?P<id>\d+)/edit/ajax/$', bank_accounts_ajax.bank_accounts_edit_ajax, name='customer_bank_accounts_add_ajax'),
name='customer_bank_accounts_edit_ajax'), url(r'^bank-accounts/(?P<id>\d+)/edit/ajax/$',
url(r'^bank-accounts/(?P<id>\d+)/delete/ajax/$', bank_accounts_ajax.bank_accounts_delete_ajax, bank_accounts_ajax.bank_accounts_edit_ajax,
name='customer_bank_accounts_delete_ajax'), name='customer_bank_accounts_edit_ajax'),
url(r'^bank-accounts/(?P<id>\d+)/delete/ajax/$',
bank_accounts_ajax.bank_accounts_delete_ajax,
name='customer_bank_accounts_delete_ajax'),
# --- контрагенты # --- контрагенты
url(r'^clients/$', clients.clients_list, name='customer_clients_list'), url(r'^clients/$', clients.clients_list, name='customer_clients_list'),
url(r'^clients/page/(?P<page_num>[0-9]+)/$', clients.clients_list, name='customer_clients_list'), url(r'^clients/page/(?P<page_num>[0-9]+)/$', clients.clients_list,
url(r'^clients/add/$', clients.clients_add, name='customer_clients_add'), name='customer_clients_list'),
url(r'^clients/(?P<id>\d+)/edit/$', clients.clients_edit, name='customer_clients_edit'), url(r'^clients/add/$', clients.clients_add, name='customer_clients_add'),
url(r'^clients/(?P<id>\d+)/delete/$', clients.clients_delete, name='customer_clients_delete'), url(r'^clients/(?P<id>\d+)/edit/$', clients.clients_edit,
name='customer_clients_edit'),
url(r'^clients/(?P<id>\d+)/delete/$', clients.clients_delete,
name='customer_clients_delete'),
# --- контрагенты AJAX # --- контрагенты AJAX
url(r'^clients/(?P<id>\d+)/get/ajax/$', clients_ajax.clients_get_ajax, url(r'^clients/(?P<id>\d+)/get/ajax/$', clients_ajax.clients_get_ajax,
name='customer_clients_get_ajax'), name='customer_clients_get_ajax'),
url(r'^clients/add/ajax/$', clients_ajax.clients_add_ajax, name='customer_clients_add_ajax'), url(r'^clients/add/ajax/$', clients_ajax.clients_add_ajax,
url(r'^clients/(?P<id>\d+)/edit/ajax/$', clients_ajax.clients_edit_ajax, name='customer_clients_add_ajax'),
name='customer_clients_edit_ajax'), url(r'^clients/(?P<id>\d+)/edit/ajax/$', clients_ajax.clients_edit_ajax,
url(r'^clients/(?P<id>\d+)/delete/ajax/$', clients_ajax.clients_delete_ajax, name='customer_clients_edit_ajax'),
name='customer_clients_delete_ajax'), url(r'^clients/(?P<id>\d+)/delete/ajax/$', clients_ajax.clients_delete_ajax,
name='customer_clients_delete_ajax'),
url(r'^tmp_upload/ajax/$', profile.tmp_upload, name='upload_tmp_file'), url(r'^tmp_upload/ajax/$', profile.tmp_upload, name='upload_tmp_file'),
) )

@ -12,7 +12,7 @@ from django.template.loader import render_to_string
from django.core.mail import EmailMessage from django.core.mail import EmailMessage
from django.utils.encoding import smart_str from django.utils.encoding import smart_str
from django.conf import settings from django.conf import settings
from django.http import Http404, HttpResponse from django.http import HttpResponse
from easy_thumbnails.files import get_thumbnailer from easy_thumbnails.files import get_thumbnailer
@ -21,16 +21,17 @@ from commons.pdf_tools import render_pdf_to_string, pdf_to_response
from customer import models, forms from customer import models, forms
from customer.utils import raise_if_no_profile from customer.utils import raise_if_no_profile
PDF_PROFILE_NAME = u'Реквизиты.pdf' PDF_PROFILE_NAME = 'Реквизиты.pdf'
SUPPORT_EMAIL = getattr(settings, 'SUPPORT_EMAIL', '') SUPPORT_EMAIL = getattr(settings, 'SUPPORT_EMAIL', '')
# -----------------------------------------------------------------------------
@login_required @login_required
@csrf_protect @csrf_protect
def profile_view(request): def profile_view(request):
"""Просмотр профиля пользователя, фильтрация реквизитов, скачать/отправить реквизиты по почте.""" """
Просмотр профиля пользователя, фильтрация реквизитов,
скачать/отправить реквизиты по почте.
"""
raise_if_no_profile(request) raise_if_no_profile(request)
template_name = 'customer/profile/view.html' template_name = 'customer/profile/view.html'
@ -43,19 +44,31 @@ def profile_view(request):
filters = models.UserProfileFilters.objects.get_or_create_filters(user=request.user) filters = models.UserProfileFilters.objects.get_or_create_filters(user=request.user)
if request.method == 'POST': if request.method == 'POST':
filters_form = filters_form_class(data=request.POST, instance=filters, profile=profile, accounts=accounts) filters_form = filters_form_class(
data=request.POST,
instance=filters,
profile=profile,
accounts=accounts
)
if filters_form.is_valid(): if filters_form.is_valid():
filters = filters_form.save() filters = filters_form.save()
if 'download-pdf' in request.POST: if 'download-pdf' in request.POST:
# return _profile_get_pdf(request, profile, filters.bank_account, filters) # для отладки # return _profile_get_pdf(request, profile,
# filters.bank_account, filters) # для отладки
return profile_as_pdf(request, profile, filters.bank_account, filters) return profile_as_pdf(request, profile, filters.bank_account, filters)
elif 'email-pdf' in request.POST: elif 'email-pdf' in request.POST:
return redirect('customer_profile_email') return redirect('customer_profile_email')
return redirect('customer_profile_view') # редирект на себя, чтобы не сабмитили форму по F5 # редирект на себя, чтобы не сабмитили форму по F5
return redirect('customer_profile_view')
else: else:
filters_form = filters_form_class(instance=filters, label_suffix='', profile=profile, accounts=accounts) filters_form = filters_form_class(
instance=filters,
label_suffix='',
profile=profile,
accounts=accounts
)
dictionary = { dictionary = {
'profile': profile, 'profile': profile,
@ -94,13 +107,13 @@ def profile_edit(request):
for img_url in ('tmb_logo', 'tmb_boss_sign', 'tmb_glavbuh_sign', 'tmb_stamp'): for img_url in ('tmb_logo', 'tmb_boss_sign', 'tmb_glavbuh_sign', 'tmb_stamp'):
if form.cleaned_data[img_url]: if form.cleaned_data[img_url]:
# TODO ? # TODO ?
chg_file = open(settings.MEDIA_ROOT + '/cache/imgs/' + \ chg_file = open(settings.MEDIA_ROOT + '/cache/imgs/' +
form.cleaned_data[img_url], mode='rb+') form.cleaned_data[img_url], mode='rb+')
item_attr = img_url[4:] item_attr = img_url[4:]
getattr(item, item_attr).save('%s.%s' % \ getattr(item, item_attr).\
(item_attr, form.cleaned_data[img_url].split('.')[-1]), save('%s.%s' % (item_attr, form.cleaned_data[img_url].split('.')[-1]),
File(chg_file)) File(chg_file))
chg_file.close() chg_file.close()
# #
elif form.cleaned_data: elif form.cleaned_data:
@ -139,32 +152,20 @@ def tmp_upload(request):
open(tmp_dir + '/' + file_.name, "wb+").write(file_.read()) open(tmp_dir + '/' + file_.name, "wb+").write(file_.read())
tmp_url_partial = os.path.basename(tmp_dir) + '/' + file_.name tmp_url_partial = os.path.basename(tmp_dir) + '/' + file_.name
thumbnailer = get_thumbnailer(tmp_dir + '/' + file_.name) thumbnailer = get_thumbnailer(tmp_dir + '/' + file_.name)
# im = get_thumbnail(tmp_dir + '/' + file_.name, SIZES[elm_id], quality=75)
thumbnail_options = {'size': SIZES[elm_id]} thumbnail_options = {'size': SIZES[elm_id]}
im = thumbnailer.get_thumbnail(thumbnail_options) # Возвращает в url полный путь, поэтому придётся резать # Возвращает в url полный путь, поэтому придётся резать
im = thumbnailer.get_thumbnail(thumbnail_options)
im_url = os.path.join(settings.MEDIA_URL, os.path.relpath(im.url, settings.MEDIA_ROOT)) im_url = os.path.join(settings.MEDIA_URL, os.path.relpath(im.url, settings.MEDIA_ROOT))
data = {'res': 'ok', 'pic': im_url, 'full_pic': tmp_url_partial} data = {'res': 'ok', 'pic': im_url, 'full_pic': tmp_url_partial}
data.update(request.REQUEST) data.update(request.REQUEST)
return HttpResponse(json.dumps(data), content_type='application/json') return HttpResponse(json.dumps(data), content_type='application/json')
# TODO ?
def del_tmp_photo(request, article_pk):
# wedding, wedding_guests = get_wedding_n_guests(request)
try:
pass
# article = WedPage.objects.get(pk=article_pk)
# article.main_photo.delete()
except:
return {'res': 'bad'}
return {'res': 'ok'}
#
@login_required @login_required
def _profile_get_pdf(request, profile=None, account=None, filters=None): def _profile_get_pdf(request, profile=None, account=None, filters=None):
"""Создать профиль пользователя в PDF и вернуть как строку.""" """
Создать профиль пользователя в PDF и вернуть как строку.
"""
template_name = 'customer/profile/as_pdf.html' template_name = 'customer/profile/as_pdf.html'
dictionary = { dictionary = {
'profile': profile, 'profile': profile,
@ -176,7 +177,9 @@ def _profile_get_pdf(request, profile=None, account=None, filters=None):
@login_required @login_required
def profile_as_pdf(request, profile=None, account=None, filters=None): def profile_as_pdf(request, profile=None, account=None, filters=None):
"""Вывести профиль пользователя в формате PDF в HttpResponse.""" """
Вывести профиль пользователя в формате PDF в HttpResponse.
"""
pdf = _profile_get_pdf(request, profile, account, filters) pdf = _profile_get_pdf(request, profile, account, filters)
return pdf_to_response(pdf, PDF_PROFILE_NAME) return pdf_to_response(pdf, PDF_PROFILE_NAME)
@ -190,16 +193,20 @@ def _send_profile_email(subject, to, body, pdf_content):
subject=subject, subject=subject,
to=(to,), to=(to,),
body=email_body, body=email_body,
attachments=[(smart_str(Header(PDF_PROFILE_NAME, 'cp1251')), pdf_content, 'application/pdf'), ] attachments=[
(smart_str(Header(PDF_PROFILE_NAME, 'cp1251')),
pdf_content, 'application/pdf'),
]
) )
return email.send() return email.send()
@login_required
@login_required @login_required
@csrf_protect @csrf_protect
def profile_email(request): def profile_email(request):
"""Форма отправки профиля пользователя на email аттачем в PDF.""" """
Форма отправки профиля пользователя на email аттачем в PDF.
"""
raise_if_no_profile(request) raise_if_no_profile(request)
template_name = 'customer/profile/email.html' template_name = 'customer/profile/email.html'
@ -228,58 +235,3 @@ def profile_email(request):
form = form_class() form = form_class()
return render(request, template_name, {'form': form, 'profile': profile, }) return render(request, template_name, {'form': form, 'profile': profile, })
# @login_required
# @csrf_protect
# def profile_settings(request):
# """Редактировать настройки пользователя."""
# template_name='customer/profile/settings.html'
#
# profile = get_object_or_404(models.UserProfile, user=request.user)
# form_class = forms.UserProfileSettingsForm #TODO remove this view
#
# # пути к уже загруженным подписям/штампу
# curr_files = {'boss_sign': None, 'glavbuh_sign': None, 'stamp': None,}
# if profile.boss_sign:
# curr_files['boss_sign'] = profile.boss_sign.path
# if profile.glavbuh_sign:
# curr_files['glavbuh_sign'] = profile.glavbuh_sign.path
# if profile.stamp:
# curr_files['stamp'] = profile.stamp.path
#
# if request.method == "POST" and '_cancel' not in request.POST:
# post = request.POST
# files = request.FILES
# form = form_class(user=request.user, data=post, files=files, instance=profile)
#
# if form.is_valid():
# def delete_file(path):
# """Удалить файл. Если ошибка - сообщить в консоль."""
# try:
# os.remove(path)
# except:
# print "Can't delete file:", path
# # --- удалить старые файлы
# for field, path in curr_files.iteritems():
# if not path:
# continue
# # если стоит галочка 'очистить'
# if '%s-clear' % field in post:
# delete_file(path)
# continue
# # если загружен новый файл
# if field in files:
# delete_file(path)
# continue
# # --- изменить пароль
# if 'new_password1' in post:
# request.user.set_password(post.get('new_password1'))
# request.user.save()
# messages.add_message(request, messages.INFO, u'Пароль успешно изменен.')
#
# form.save()
# return redirect('customer_profile_settings')
# else:
# form = form_class(user=request.user, instance=profile)
#
# return render(request, template_name, {'profile': profile, 'form': form,})

@ -925,3 +925,80 @@ input[type=number] {
font-size: 25px; font-size: 25px;
} }
/* modal dialog upload image */
#containerUpload {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
visibility:hidden;
display:none;
background-color: rgba(22,22,22,0.5);
}
#containerUpload:target {
visibility: visible;
display: block;
}
.modal-upload {
position: relative;
background: #fff;
top: 50%;
left: 50%;
width:500px;
height: 460px;
-ms-transform: translate(-50%,-50%);
-moz-transform:translate(-50%,-50%);
-webkit-transform: translate(-50%,-50%);
transform: translate(-50%,-50%);
}
.modal-upload__wrapper {
padding: 5px;
}
.modal-upload__header {
padding: .4em 1em;
}
.modal-upload__title {
vertical-align: middle;
text-transform: uppercase;
color: #646669;
font-size: 18px;
font-weight: normal;
font-stretch: ultra-condensed;
font-family: "Arial Narrow", Arial, sans-serif;
display: inline-block;
width: 435px;
}
.modal-upload__close-button {
vertical-align: middle;
display: inline-block;
background: url(../img/close.png) no-repeat top;
opacity: 0.5;
width: 22px;
height: 22px;
cursor: pointer;
}
.modal-upload__close-button:hover {
opacity: 1;
}
.modal-upload__body {
padding: .5em 1em;
}
.modal-upload__bottom {
padding: .4em 1em;
}
.modal-upload__bottom button {
font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
font-size: 1em;
}

@ -1,24 +1,128 @@
/** (function($) {
* Created by mitri4 on 23.06.17. $.fn.invisible = function() {
*/ return this.each(function() {
$(this).css("visibility", "hidden");
// $(document).ready(function() { $(this).hide();
// });
// $uploadCrop = $('#stamp').croppie({ };
// enableExif: true, $.fn.visible = function() {
// viewport: { return this.each(function() {
// width: 200, $(this).css("visibility", "visible");
// height: 200, $(this).show();
// type: 'circle' });
// }, };
// boundary: { }(jQuery));
// width: 300,
// height: 300
// }
// });
//
//
//
// });
$(document).ready(function () {
var $uploadCrop,
rawImg,
imagePreview,
imageInputField;
function readFile(input) {
if (input.files && input.files[0]) {
var reader = new FileReader();
reader.onload = function (e) {
$('#imageCropper').addClass('ready');
rawImg = e.target.result;
$('#containerUpload').trigger("ShowModal");
};
reader.readAsDataURL(input.files[0]);
} else {
alert("Sorry - you're browser doesn't support the FileReader API");
}
}
$uploadCrop = $('#imageCropper').croppie({
enableExif: true,
enforceBoundary: false,
viewport: {
width: 200,
height: 200,
type: 'circle'
},
boundary: {
width: 300,
height: 300
}
});
// select file
$('.img_load img').on('click', function() {
var thisId = $(this).closest('.img_load').attr('id');
var tmbId = 'id_tmb_' + thisId.substring(3);
$('#' + tmbId).val('');
$('#id_' + thisId).click();
imagePreview = thisId;
imageInputField = 'id_' + thisId;
// console.log('#id_' + thisId)
});
// set file in input hidden filed
$('.img_load input[type=file]').on('change', function () {readFile(this)});
$('#containerUpload').on("ShowModal", function( ) {
$('#containerUpload').visible();
$uploadCrop.croppie('bind', {
url: rawImg
}).then(function(){
console.log('jQuery bind complete');
});
});
$('#cropImageBtn').on('click', function (ev) {
$uploadCrop.croppie('result', {
type: 'base64',
format: 'png',
size: 'viewport'
}).then(function (resp) {
// console.log(resp);
$('#' + imagePreview + ' img').attr('src', resp);
$('#containerUpload').trigger("CloseModal");
$('#' + imagePreview + ' .del_image').show();
})
});
$('#containerUpload').on("CloseModal", function( ) {
$('#containerUpload').invisible();
$('#' + imageInputField).val('');
});
var closeButtons=document.getElementsByClassName("modal-upload__cleaner-btn");
for (var i = 0; i < closeButtons.length; i++) {
var closeBtn = closeButtons[i];
closeBtn.addEventListener('click',function () {
$('#containerUpload').trigger("CloseModal");
})
}
$('.img_load .del_image').on('click', function(e) {
e.preventDefault();
var this_id = $(this).closest('.img_load').attr('id');
var tmb_id = 'id_tmb_' + this_id.substring(3);
var dlg_msg = $('#dialog-message');
dlg_msg.dialog({
title: 'Удалить изображение?',
buttons:{
'Да': function(){
$('#' + tmb_id).val('');
$('#' + this_id + ' img').attr('src', '/static/img/upload-' + this_id + '.png');
$('#' + this_id + '-clear_id').attr('checked', true);
$('#' + this_id + ' .del_image').hide();
dlg_msg.dialog('close');
},
'Нет': function(){
dlg_msg.dialog('close');
}
}
}).html('Нажмите "Да", чтобы удалить изображение');
dlg_msg.dialog('open');
});
});

@ -134,7 +134,6 @@
<script src="{% static 'js/lib/entertotab.js' %}"></script> <script src="{% static 'js/lib/entertotab.js' %}"></script>
<script src="{% static 'vendor/jquery.cookie/jquery.cookie.js' %}"></script> <script src="{% static 'vendor/jquery.cookie/jquery.cookie.js' %}"></script>
<script src="{% static 'vendor/handlebars/handlebars.min.js' %}"></script> <script src="{% static 'vendor/handlebars/handlebars.min.js' %}"></script>
<script src="{% static 'vendor/Croppie/croppie.min.js' %}"></script>
<script src="{% static 'js/csrf.js' %}?ver={% file_version 'js/csrf.js' %}"></script> <script src="{% static 'js/csrf.js' %}?ver={% file_version 'js/csrf.js' %}"></script>
<script src="{% static 'js/commons.js' %}?ver={% file_version 'js/commons.js' %}"></script> <script src="{% static 'js/commons.js' %}?ver={% file_version 'js/commons.js' %}"></script>
<script src="{% static 'js/dialogs.js' %}?ver={% file_version 'js/dialogs.js' %}"></script> <script src="{% static 'js/dialogs.js' %}?ver={% file_version 'js/dialogs.js' %}"></script>

@ -4,7 +4,7 @@
{% block title %}Редактирование реквизитов{% endblock %} {% block title %}Редактирование реквизитов{% endblock %}
{% block content %} {% block content %}
<h2>Редактирование реквизитов{% if profile.is_ip %} ИП{% elif profile.is_org %} организации{% endif %}</h2> <h2>Редактирование реквизитов{% if profile.is_ip %} ИП{% elif profile.is_org %} организации{% endif %}</h2>
<div class="search-property"> <div class="search-property">
<div id="searchProperty" class="field"> <div id="searchProperty" class="field">
@ -449,6 +449,24 @@
<input type="submit" name="_cancel" value="Отмена" /> <input type="submit" name="_cancel" value="Отмена" />
</div> </div>
</form> </form>
<div id="containerUpload">
<div class="modal-upload" id="modalUpload">
<div class="modal-upload__wrapper">
<div class="modal-upload__header">
<div class="modal-upload__title">Редактирование изображения</div>
<div class="modal-upload__close-button modal-upload__cleaner-btn"></div>
</div>
<div class="modal-upload__body">
<div class="modal-upload__body--editor" id="imageCropper"></div>
</div>
<div class="modal-upload__bottom">
<button class="yellow-btn form__yellow-btn_save" id="cropImageBtn">Сохранить</button>
<button class="close-form modal-upload__cleaner-btn">Отмена</button>
</div>
</div>
</div>
</div>
</div> </div>
{% endblock %} {% endblock %}
@ -482,7 +500,17 @@
{% endblock %} {% endblock %}
{% block js %} {% block js %}
<script type="text/javascript">
var BANK_ACCOUNT = {
'list_url': "{% url 'customer_bank_accounts_list_ajax' %}",
'edit_id_prefix': "account_edit_link_",
'delete_id_prefix': "account_delete_link_",
'bank_id_prefix': "account_bank_name_"
};
</script>
{% comment %}
<script type="text/javascript"> <script type="text/javascript">
var BANK_ACCOUNT = { var BANK_ACCOUNT = {
'list_url': "{% url 'customer_bank_accounts_list_ajax' %}", 'list_url': "{% url 'customer_bank_accounts_list_ajax' %}",
@ -490,6 +518,7 @@
'delete_id_prefix': "account_delete_link_", 'delete_id_prefix': "account_delete_link_",
'bank_id_prefix': "account_bank_name_" 'bank_id_prefix': "account_bank_name_"
}; };
$(function(){ $(function(){
$('.img_load img').on('click', function(e) { $('.img_load img').on('click', function(e) {
var this_id = $(this).closest('.img_load').attr('id'); var this_id = $(this).closest('.img_load').attr('id');
@ -531,8 +560,9 @@
$('.img_load input[type=file]').on('change', function(e){ $('.img_load input[type=file]').on('change', function(e){
e.preventDefault(); e.preventDefault();
var this_id = $(this).attr('id').substring(3); var this_id = $(this).attr('id').substring(3);
// console.log($('#' + this_id + ' img')); console.log($('#' + this_id + ' img'));
$('#' + this_id + ' img').attr('src', '{{ STATIC_URL }}/img/spinner.gif');
$('#' + this_id + ' img').attr('src', "{% static 'img/spinner.gif' %}");
var formData = new FormData(); var formData = new FormData();
formData.append($(this).val(), $(this)[0].files[0]); formData.append($(this).val(), $(this)[0].files[0]);
formData.append('elm_id', $(this).attr('id')); formData.append('elm_id', $(this).attr('id'));
@ -549,9 +579,11 @@
}); });
}) })
</script> </script>
{% endcomment %}
<script src="{% static 'js/customer/profile.edit.js' %}"></script> <script src="{% static 'js/customer/profile.edit.js' %}"></script>
<script src="{% static 'vendor/suggestions.jquery/dist/js/jquery.suggestions.min.js' %}"></script> <script src="{% static 'vendor/suggestions.jquery/dist/js/jquery.suggestions.min.js' %}"></script>
<script src="{% static 'vendor/Croppie/croppie.min.js' %}"></script>
<script> <script>
$(document).ready(function() { $(document).ready(function() {

Loading…
Cancel
Save