You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
160 lines
5.5 KiB
160 lines
5.5 KiB
# -*- coding: utf-8 -*-
|
|
import simplejson as json
|
|
|
|
from django.shortcuts import get_object_or_404
|
|
from django.http import HttpResponseBadRequest, HttpResponse
|
|
from django.template import RequestContext
|
|
from django.views.decorators.http import require_POST
|
|
from django.views.decorators.csrf import csrf_protect
|
|
from django.contrib.auth.decorators import login_required
|
|
from django.template.loader import render_to_string
|
|
|
|
from customer import models, forms
|
|
from docs.models import Invoice, Faktura, AktRabot, AktSverki, Nakladn, Platejka, Dover
|
|
from customer.decorators import license_required
|
|
from customer.utils import raise_if_no_profile
|
|
|
|
|
|
@login_required
|
|
def clients_get_ajax(request, id):
|
|
"""Получить контрагента - AJAX.
|
|
Если в форме редактирования контрагента задан атрибут Meta.fields, то дампит только поля, перечисленные в нём.
|
|
Иначе дампит вообще все поля, которые есть в модели.
|
|
"""
|
|
if not request.is_ajax():
|
|
return HttpResponseBadRequest()
|
|
|
|
raise_if_no_profile(request)
|
|
|
|
try:
|
|
fields_list = forms.ClientForm.Meta.fields
|
|
except AttributeError:
|
|
fields_list = []
|
|
|
|
client = get_object_or_404(models.Client.objects.values(*fields_list), pk=id, company=request.user.profile)
|
|
|
|
return HttpResponse(json.dumps(client), mimetype='application/json')
|
|
|
|
|
|
@login_required
|
|
@require_POST
|
|
@csrf_protect
|
|
def clients_add_ajax(request):
|
|
"""Добавить контрагента - AJAX."""
|
|
if not request.is_ajax():
|
|
return HttpResponseBadRequest()
|
|
|
|
raise_if_no_profile(request)
|
|
|
|
form_class = forms.ClientForm
|
|
|
|
new_client_id = None
|
|
new_client_str = None
|
|
form = form_class(data=request.POST)
|
|
|
|
new_client_id = None
|
|
html = ''
|
|
if form.is_valid():
|
|
new_client = form.save(commit=False)
|
|
new_client.company = request.user.profile
|
|
new_client_str = new_client.name
|
|
new_client.save()
|
|
new_client_id = new_client.id
|
|
html = render_to_string('customer/clients/list_item.html',
|
|
{'obj': new_client}, RequestContext(request))
|
|
|
|
non_field_errors = form.non_field_errors()
|
|
if not form.is_valid():
|
|
non_field_errors.append(u'Заполните/исправьте выделенные поля.')
|
|
|
|
data = {
|
|
'success': form.is_valid(),
|
|
'field_errors': form.errors, # ошибки полей
|
|
'form_errors': non_field_errors, # ошибки формы
|
|
#'reload': form.is_valid() and 'reload_on_success' in request.GET
|
|
'reload': False,
|
|
'id': new_client_id,
|
|
'name': new_client_str,
|
|
'action': 'client-add',
|
|
'row_html': html,
|
|
}
|
|
return HttpResponse(json.dumps(data), mimetype='application/json')
|
|
|
|
|
|
@login_required
|
|
@require_POST
|
|
@csrf_protect
|
|
def clients_edit_ajax(request, id):
|
|
"""Редактировать контрагента - AJAX."""
|
|
if not request.is_ajax():
|
|
return HttpResponseBadRequest()
|
|
|
|
raise_if_no_profile(request)
|
|
|
|
form_class = forms.ClientForm
|
|
|
|
client = get_object_or_404(models.Client, pk=id, company=request.user.profile)
|
|
|
|
form = form_class(data=request.POST, instance=client)
|
|
if form.is_valid():
|
|
client = form.save()
|
|
|
|
non_field_errors = form.non_field_errors()
|
|
html = render_to_string('customer/clients/list_item.html',
|
|
{'obj': client}, RequestContext(request))
|
|
if not form.is_valid():
|
|
non_field_errors.append(u'Заполните/исправьте выделенные поля.')
|
|
|
|
data = {
|
|
'success': form.is_valid(),
|
|
'field_errors': form.errors, # ошибки полей
|
|
'form_errors': non_field_errors, # ошибки формы
|
|
'reload': False,
|
|
'id': client.id,
|
|
'name': client.name,
|
|
'contact': client.contact_name,
|
|
'phone': client.contact_phone,
|
|
'action': 'client-edit',
|
|
'row_html': html,
|
|
}
|
|
return HttpResponse(json.dumps(data), mimetype='application/json')
|
|
|
|
|
|
@login_required
|
|
@require_POST
|
|
@csrf_protect
|
|
def clients_delete_ajax(request, id):
|
|
"""Удалить контрагента - AJAX."""
|
|
if not request.is_ajax():
|
|
return HttpResponseBadRequest()
|
|
|
|
raise_if_no_profile(request)
|
|
|
|
client = get_object_or_404(models.Client, pk=id, company=request.user.profile)
|
|
client_docs = []
|
|
doc_list = [(Invoice, u'счета'), (Faktura, u'счета-фактуры'), (Nakladn, u'накладные'),
|
|
(AktRabot, u'акты выполненных работ'), (Platejka, u'платёжные поручения'),
|
|
(Dover, u'доверенности'), (AktSverki, u'акты сверки')]
|
|
for doc in doc_list:
|
|
docs = doc[0].objects.filter(client=client)
|
|
if docs:
|
|
client_docs.append(doc[1])
|
|
|
|
if not client_docs:
|
|
client.delete()
|
|
success = True
|
|
message = {'title': u'Инфо', 'msg': u'Контрагент удалён.'}
|
|
del_id = id
|
|
else:
|
|
success = True
|
|
message = {'title': u'Инфо', 'msg': u'Контрагент не удалён. Есть выписанные документы: %s.' % ','.join(client_docs)}
|
|
del_id = None
|
|
|
|
data = {
|
|
'success': success,
|
|
'message': message,
|
|
'reload': False,
|
|
'action': 'client-delete',
|
|
'id': del_id,
|
|
}
|
|
return HttpResponse(json.dumps(data), mimetype='application/json')
|
|
|