prepping to merge apps
This commit is contained in:
parent
c952b7102b
commit
7b81cb364a
27 changed files with 1006 additions and 850 deletions
|
|
@ -148,11 +148,13 @@
|
|||
<label for="exampleInputEmail1">Attachment</label>
|
||||
<input type="file" name="account_attachment">
|
||||
{% if account_obj.account_attachment.count %}
|
||||
{% for i in account_obj.account_attachment.all %}
|
||||
<span id="attachment{{i.id}}">
|
||||
<a target="_blank" href="{{ i.attachment.url }}">{{ i.file_name }}</a>
|
||||
<a class="action btn primary_btn" onclick="remove_attachment({{i.id}})">X</a>
|
||||
</span>
|
||||
{% for attachment in account_obj.account_attachment.all %}
|
||||
<div id="attachment{{attachment.id}}" class="mt-2">
|
||||
<a target="_blank" href="{{ attachment.attachment.url }}">{{ attachment.file_name }}</a>
|
||||
{% if not attachment.created_by.role == 'ADMIN' or attachment.created_by.role == request.user.role %}
|
||||
<a class="action btn primary_btn" onclick="remove_attachment({{attachment.id}})">X</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
<span class="error"></span>
|
||||
|
|
@ -284,4 +286,4 @@
|
|||
}
|
||||
});
|
||||
</script>
|
||||
{% endblock js_block %}
|
||||
{% endblock js_block %}
|
||||
|
|
@ -57,7 +57,8 @@ class AccountsListView(LoginRequiredMixin, TemplateView):
|
|||
context['close_accounts'] = close_accounts
|
||||
context["industries"] = INDCHOICES
|
||||
context["per_page"] = self.request.POST.get('per_page')
|
||||
context["tags"] = Tags.objects.all()
|
||||
tag_ids = list(set(Account.objects.values_list('tags', flat=True)))
|
||||
context["tags"] = Tags.objects.filter(id__in=tag_ids)
|
||||
|
||||
search = False
|
||||
if (
|
||||
|
|
|
|||
|
|
@ -26,28 +26,28 @@
|
|||
<div class="form-group">
|
||||
<label for="id_name" class="required">Name{% if case_form.name.field.required %}<span class="error">*</span>{% endif %}</label>
|
||||
{{ case_form.name }}
|
||||
<span class="error">{{ case_form.name.errors }}</span>
|
||||
<span class="error error_message" id="error_id_name">{{ case_form.name.errors }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter_col col-md-12">
|
||||
<div class="form-group">
|
||||
<label for="id_status" class="required">Status{% if case_form.status.field.required %}<span class="error">*</span>{% endif %}</label>
|
||||
{{ case_form.status }}
|
||||
<span class="error">{{ case_form.status.errors }}</span>
|
||||
<span class="error error_message" id="error_id_status">{{ case_form.status.errors }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter_col col-md-12">
|
||||
<div class="form-group">
|
||||
<label for="id_priority" class="required">Priority{% if case_form.priority.field.required %}<span class="error">*</span>{% endif %}</label>
|
||||
{{ case_form.priority }}
|
||||
<span class="error">{{ case_form.priority.errors }}</span>
|
||||
<span class="error error_message" id="error_id_priority">{{ case_form.priority.errors }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter_col col-md-12">
|
||||
<div class="form-group">
|
||||
<label for="id_case_type">Type of Case{% if case_form.case_type.field.required %}<span class="error">*</span>{% endif %}</label>
|
||||
{{ case_form.case_type }}
|
||||
<span class="error">{{ case_form.case_type.errors }}</span>
|
||||
<span class="error error_message" id="error_id_case_type">{{ case_form.case_type.errors }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -61,7 +61,7 @@
|
|||
<span class="glyphicon glyphicon-calendar"></span>
|
||||
</span>
|
||||
</div>
|
||||
<span class="error">{{ case_form.closed_on.errors }}</span>
|
||||
<span class="error error_message" id="error_id_closed_on">{{ case_form.closed_on.errors }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter_col col-md-12">
|
||||
|
|
@ -72,7 +72,7 @@
|
|||
<option value="{{user.id}}" {% if user in case_obj.assigned_to.all or user.id in assignedto_list %} selected="" {% endif %}>{{user.email}}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
<span class="error">{{ case_form.assigned_to.errors }}</span>
|
||||
<span class="error error_message" id="error_id_assigned_to">{{ case_form.assigned_to.errors }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter_col col-md-12">
|
||||
|
|
@ -85,22 +85,24 @@
|
|||
{% else %}
|
||||
{{case_form.account}}
|
||||
{% endif %}
|
||||
<span class="error">{{case_form.account.errors}}</span>
|
||||
<span class="error error_message" id="error_id_account">{{case_form.account.errors}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter_col col-md-12">
|
||||
<div class="form-group">
|
||||
<label for="exampleInputEmail1">Attachment</label>
|
||||
<input type="file" name="case_attachment">
|
||||
<input type="file" name="case_attachment" id="case_attachment">
|
||||
{% if case_obj.case_attachment.count %}
|
||||
{% for i in case_obj.case_attachment.all %}
|
||||
<span id="attachment{{i.id}}">
|
||||
<a target="_blank" href="{{i.attachment.url}}">{{i.file_name}}</a>
|
||||
<a class="action btn primary_btn" onclick="remove_attachment({{i.id}})">X</a>
|
||||
</span>
|
||||
{% for attachment in case_obj.case_attachment.all %}
|
||||
<div id="attachment{{attachment.id}}" class="mt-2">
|
||||
<a target="_blank" href="{{ attachment.attachment.url }}">{{ attachment.file_name }}</a>
|
||||
{% if not attachment.created_by.role == 'ADMIN' or attachment.created_by.role == request.user.role %}
|
||||
<a class="action btn primary_btn" onclick="remove_attachment({{attachment.id}})">X</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
<span class="error"></span>
|
||||
<span class="error error_message" id="error_id_case_attachment"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -109,14 +111,14 @@
|
|||
<div class="form-group">
|
||||
<label for="id_contacts">Contacts{% if case_form.contacts.field.required %}<span class="error">*</span>{% endif %}</label>
|
||||
{{ case_form.contacts }}
|
||||
<span class="error">{{case_form.contacts.errors}}</span>
|
||||
<span class="error error_message" id="error_id_contacts">{{case_form.contacts.errors}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter_col col-md-12">
|
||||
<div class="form-group">
|
||||
<label for="id_description">Description{% if case_form.description.field.required %}<span class="error">*</span>{% endif %}</label>
|
||||
{{ case_form.description }}
|
||||
<span class="error">{{ case_form.description.errors }}</span>
|
||||
<span class="error error_message" id="error_id_description">{{ case_form.description.errors }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -127,7 +129,7 @@
|
|||
<input type="hidden" id="save_new_form" name="savenewform">
|
||||
<div class="col-md-12">
|
||||
<div class="row marl buttons_row text-center form_btn_row">
|
||||
<button class="btn btn-default save" type="submit">Save</button>
|
||||
<button class="btn btn-default save" type="submit" id="submit_btn">Save</button>
|
||||
{% if not case_obj %}
|
||||
<button class="btn btn-success save savenew" type="submit">Save & New</button>
|
||||
{% endif %}
|
||||
|
|
@ -141,10 +143,77 @@
|
|||
<br clear="all">
|
||||
</div>
|
||||
</form>
|
||||
<div class="row marl justify-content-center text-center mt-5 mb-5" id="progress_bar">
|
||||
<!-- <div class="mt-5 mb-5"></div> -->
|
||||
<div class="progress position-relative" style="width:40%;height:1.5rem;">
|
||||
<span class="justify-content-center d-flex position-absolute w-100 percent">0%</span>
|
||||
<div class="progress-bar bar"></div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block js_block %}
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script>
|
||||
<script src="https://malsup.github.io/jquery.form.js"></script>
|
||||
<script type="text/javascript">
|
||||
|
||||
var bar = $('.bar');
|
||||
var percent = $('.percent');
|
||||
|
||||
$('#progress_bar').hide()
|
||||
|
||||
$('form#submitForm').ajaxForm({
|
||||
type:'POST',
|
||||
dataType:'json',
|
||||
url: ".",
|
||||
data:$('#submitForm').serialize(),
|
||||
beforeSubmit: disableButton,
|
||||
beforeSend: function() {
|
||||
var percentVal = '0%';
|
||||
bar.width(percentVal);
|
||||
percent.html(percentVal);
|
||||
},
|
||||
uploadProgress: function(event, position, total, percentComplete) {
|
||||
var percentVal = percentComplete + '%';
|
||||
bar.width(percentVal);
|
||||
if (percentVal == '100%'){
|
||||
percent.html('Uploading ...')
|
||||
}
|
||||
else{
|
||||
percent.html(percentVal);
|
||||
}
|
||||
},
|
||||
success: function(data) {
|
||||
if(data.error){
|
||||
$('#progress_bar').hide()
|
||||
$('.error_message').html('')
|
||||
for (var key in data.errors) {
|
||||
$('#error_id_'+key).html("<p>" + data.errors[key][0] + "</p>");
|
||||
};
|
||||
$('#submit_btn').removeAttr('disabled')
|
||||
}
|
||||
else{
|
||||
window.location = data.success_url;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
$('#submit_btn').click(function() {
|
||||
var file = $('#case_attachment')[0].files[0];
|
||||
if(file && file.name.length>0){
|
||||
var percentVal = '0%';
|
||||
bar.width(percentVal);
|
||||
percent.html(percentVal);
|
||||
$('#progress_bar').show()
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
function disableButton(){
|
||||
// $('#progress_bar').show()
|
||||
$('#submit_btn').attr('disabled','disabled')
|
||||
}
|
||||
|
||||
$(function () {
|
||||
var date = new Date();
|
||||
var today = new Date(date.getFullYear(), date.getMonth(), date.getDate());
|
||||
|
|
@ -165,16 +234,15 @@
|
|||
});
|
||||
|
||||
$('#id_account').change(function(){
|
||||
var account = $("#id_account").val()
|
||||
$.get("{% url 'cases:select_contacts' %}", {"account":account}, function(data){
|
||||
$("#id_contacts").html("")
|
||||
$.each(data, function (index, value) {
|
||||
$("#id_contacts").append("<option value="+index+">"+value+"</option>")
|
||||
});
|
||||
})
|
||||
var account = $("#id_account").val()
|
||||
$.get("{% url 'cases:select_contacts' %}", {"account":account}, function(data){
|
||||
$("#id_contacts").html("")
|
||||
$.each(data, function (index, value) {
|
||||
$("#id_contacts").append("<option value="+index+">"+value+"</option>")
|
||||
});
|
||||
})
|
||||
});
|
||||
</script>
|
||||
<script>
|
||||
|
||||
function remove_attachment(x) {
|
||||
const con = confirm("Do you want to Delete it for Sure!?");
|
||||
if (con == true) {
|
||||
|
|
|
|||
|
|
@ -96,7 +96,8 @@ class CaseCreationUrlTestCase(CaseCreation, TestCase):
|
|||
'contacts': [self.contacts.id],
|
||||
'priority': "Low",
|
||||
'description': "something"})
|
||||
self.assertTemplateUsed(response, 'create_cases.html')
|
||||
# self.assertTemplateUsed(response, 'create_cases.html')
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
|
||||
class CaseShowTestCase(CaseCreation, TestCase):
|
||||
|
|
@ -142,7 +143,8 @@ class CaseUpdateTestCase(CaseCreation, TestCase):
|
|||
response = self.client.post(
|
||||
'/cases/' + str(self.case.id) + '/edit_case/',
|
||||
{'hiddenval': self.case.id})
|
||||
self.assertTemplateUsed(response, 'create_cases.html')
|
||||
# self.assertTemplateUsed(response, 'create_cases.html')
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
|
||||
class CaseModelTestCase(CaseCreation, TestCase):
|
||||
|
|
|
|||
|
|
@ -1,20 +1,20 @@
|
|||
from django.urls import path
|
||||
from cases.views import (
|
||||
CasesListView, CreateCaseView, CaseDetailView, UpdateCaseView, RemoveCaseView,
|
||||
CloseCaseView, SelectContactsView, GetCasesView, AddCommentView,
|
||||
CasesListView, create_case, CaseDetailView, update_case, RemoveCaseView,
|
||||
CloseCaseView, select_contact, GetCasesView, AddCommentView,
|
||||
UpdateCommentView, DeleteCommentView, AddAttachmentView, DeleteAttachmentsView)
|
||||
|
||||
app_name = 'cases'
|
||||
|
||||
urlpatterns = [
|
||||
path('list/', CasesListView.as_view(), name='list'),
|
||||
path('create/', CreateCaseView.as_view(), name='add_case'),
|
||||
path('create/', create_case, name='add_case'),
|
||||
path('<int:pk>/view/', CaseDetailView.as_view(), name="view_case"),
|
||||
path('<int:pk>/edit_case/', UpdateCaseView.as_view(), name="edit_case"),
|
||||
path('<int:pk>/edit_case/', update_case, name="edit_case"),
|
||||
path('<int:case_id>/remove/', RemoveCaseView.as_view(), name="remove_case"),
|
||||
|
||||
path('close_case/', CloseCaseView.as_view(), name="close_case"),
|
||||
path('select_contacts/', SelectContactsView.as_view(), name="select_contacts"),
|
||||
path('select_contacts/', select_contact, name="select_contacts"),
|
||||
path('get/list/', GetCasesView.as_view(), name="get_cases"),
|
||||
|
||||
path('comment/add/', AddCommentView.as_view(), name="add_comment"),
|
||||
|
|
|
|||
355
cases/views.py
355
cases/views.py
|
|
@ -4,9 +4,9 @@ from django.contrib.sites.shortcuts import get_current_site
|
|||
from django.core.mail import EmailMessage
|
||||
from django.db.models import Q
|
||||
from django.http import JsonResponse
|
||||
from django.shortcuts import get_object_or_404, redirect
|
||||
from django.shortcuts import get_object_or_404, redirect, render
|
||||
from django.template.loader import render_to_string
|
||||
from django.views.generic import CreateView, UpdateView, DetailView, ListView, TemplateView, View
|
||||
from django.views.generic import CreateView, DetailView, ListView, TemplateView, View
|
||||
|
||||
from cases.models import Case
|
||||
from cases.forms import CaseForm, CaseCommentForm, CaseAttachmentForm
|
||||
|
|
@ -74,99 +74,81 @@ class CasesListView(LoginRequiredMixin, TemplateView):
|
|||
return self.render_to_response(context)
|
||||
|
||||
|
||||
class CreateCaseView(LoginRequiredMixin, CreateView):
|
||||
model = Case
|
||||
form_class = CaseForm
|
||||
def create_case(request):
|
||||
users = User.objects.filter(is_active=True).order_by('email')
|
||||
accounts = Account.objects.filter(status="open")
|
||||
contacts = Contact.objects.all()
|
||||
if request.user.role != "ADMIN" and not request.user.is_superuser:
|
||||
accounts = Account.objects.filter(
|
||||
created_by=request.user)
|
||||
contacts = Contact.objects.filter(
|
||||
Q(assigned_to__in=[request.user]) | Q(created_by=request.user))
|
||||
kwargs_data = {
|
||||
"assigned_to": users, "account": accounts, "contacts": contacts}
|
||||
form = CaseForm(**kwargs_data)
|
||||
template_name = "create_cases.html"
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
self.users = User.objects.filter(is_active=True).order_by('email')
|
||||
self.accounts = Account.objects.filter(status="open")
|
||||
self.contacts = Contact.objects.all()
|
||||
if self.request.user.role != "ADMIN" and not self.request.user.is_superuser:
|
||||
self.accounts = Account.objects.filter(
|
||||
created_by=self.request.user)
|
||||
self.contacts = Contact.objects.filter(
|
||||
Q(assigned_to__in=[self.request.user]) | Q(created_by=self.request.user))
|
||||
return super(CreateCaseView, self).dispatch(request, *args, **kwargs)
|
||||
|
||||
def get_form_kwargs(self):
|
||||
kwargs = super(CreateCaseView, self).get_form_kwargs()
|
||||
kwargs.update({"assigned_to": self.users, "account": self.accounts,
|
||||
"contacts": self.contacts})
|
||||
return kwargs
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
self.object = None
|
||||
form = self.get_form()
|
||||
if request.POST:
|
||||
form = CaseForm(request.POST, request.FILES, **kwargs_data)
|
||||
if form.is_valid():
|
||||
return self.form_valid(form)
|
||||
case = form.save(commit=False)
|
||||
case.created_by = request.user
|
||||
case.save()
|
||||
if request.POST.getlist('assigned_to', []):
|
||||
case.assigned_to.add(*request.POST.getlist('assigned_to'))
|
||||
assigned_to_list = request.POST.getlist('assigned_to')
|
||||
current_site = get_current_site(request)
|
||||
for assigned_to_user in assigned_to_list:
|
||||
user = get_object_or_404(User, pk=assigned_to_user)
|
||||
mail_subject = 'Assigned to case.'
|
||||
message = render_to_string('assigned_to/cases_assigned.html', {
|
||||
'user': user,
|
||||
'domain': current_site.domain,
|
||||
'protocol': request.scheme,
|
||||
'case': case
|
||||
})
|
||||
email = EmailMessage(mail_subject, message, to=[user.email])
|
||||
email.content_subtype = "html"
|
||||
email.send()
|
||||
|
||||
return self.form_invalid(form)
|
||||
if request.POST.getlist('contacts', []):
|
||||
case.contacts.add(*request.POST.getlist('contacts'))
|
||||
if request.FILES.get('case_attachment'):
|
||||
attachment = Attachments()
|
||||
attachment.created_by = request.user
|
||||
attachment.file_name = request.FILES.get(
|
||||
'case_attachment').name
|
||||
attachment.case = case
|
||||
attachment.attachment = request.FILES.get('case_attachment')
|
||||
attachment.save()
|
||||
success_url = reverse('cases:list')
|
||||
if request.POST.get("savenewform"):
|
||||
success_url = reverse("cases:add_case")
|
||||
if request.POST.get('from_account'):
|
||||
from_account = request.POST.get('from_account')
|
||||
success_url = reverse("accounts:view_account", pk=from_account)
|
||||
return JsonResponse({'error': False, "success_url": success_url})
|
||||
|
||||
def form_valid(self, form):
|
||||
case = form.save(commit=False)
|
||||
case.created_by = self.request.user
|
||||
case.save()
|
||||
if self.request.POST.getlist('assigned_to', []):
|
||||
case.assigned_to.add(*self.request.POST.getlist('assigned_to'))
|
||||
assigned_to_list = self.request.POST.getlist('assigned_to')
|
||||
current_site = get_current_site(self.request)
|
||||
for assigned_to_user in assigned_to_list:
|
||||
user = get_object_or_404(User, pk=assigned_to_user)
|
||||
mail_subject = 'Assigned to case.'
|
||||
message = render_to_string('assigned_to/cases_assigned.html', {
|
||||
'user': user,
|
||||
'domain': current_site.domain,
|
||||
'protocol': self.request.scheme,
|
||||
'case': case
|
||||
})
|
||||
email = EmailMessage(mail_subject, message, to=[user.email])
|
||||
email.content_subtype = "html"
|
||||
email.send()
|
||||
else:
|
||||
return JsonResponse({'error': True, 'errors': form.errors})
|
||||
|
||||
if self.request.POST.getlist('contacts', []):
|
||||
case.contacts.add(*self.request.POST.getlist('contacts'))
|
||||
if self.request.FILES.get('case_attachment'):
|
||||
attachment = Attachments()
|
||||
attachment.created_by = self.request.user
|
||||
attachment.file_name = self.request.FILES.get(
|
||||
'case_attachment').name
|
||||
attachment.case = case
|
||||
attachment.attachment = self.request.FILES.get('case_attachment')
|
||||
attachment.save()
|
||||
if self.request.is_ajax():
|
||||
return JsonResponse({'error': False})
|
||||
if self.request.POST.get("savenewform"):
|
||||
return redirect("cases:add_case")
|
||||
if self.request.POST.get('from_account'):
|
||||
from_account = self.request.POST.get('from_account')
|
||||
return redirect("accounts:view_account", pk=from_account)
|
||||
|
||||
return redirect('cases:list')
|
||||
|
||||
def form_invalid(self, form):
|
||||
if self.request.is_ajax():
|
||||
return JsonResponse({'error': True, 'case_errors': form.errors})
|
||||
return self.render_to_response(self.get_context_data(form=form))
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(CreateCaseView, self).get_context_data(**kwargs)
|
||||
context["case_form"] = context["form"]
|
||||
context["accounts"] = self.accounts
|
||||
if self.request.GET.get('view_account'):
|
||||
else:
|
||||
context = {}
|
||||
context["case_form"] = form
|
||||
context["accounts"] = accounts
|
||||
if request.GET.get('view_account'):
|
||||
context['account'] = get_object_or_404(
|
||||
Account, id=self.request.GET.get('view_account'))
|
||||
context["contacts"] = self.contacts
|
||||
context["users"] = self.users
|
||||
Account, id=request.GET.get('view_account'))
|
||||
context["contacts"] = contacts
|
||||
context["users"] = users
|
||||
context["case_types"] = CASE_TYPE
|
||||
context["case_priority"] = PRIORITY_CHOICE
|
||||
context["case_status"] = STATUS_CHOICE
|
||||
context["assignedto_list"] = [
|
||||
int(i) for i in self.request.POST.getlist('assigned_to', []) if i]
|
||||
int(i) for i in request.POST.getlist('assigned_to', []) if i]
|
||||
context["contacts_list"] = [
|
||||
int(i) for i in self.request.POST.getlist('contacts', []) if i]
|
||||
return context
|
||||
int(i) for i in request.POST.getlist('contacts', []) if i]
|
||||
return render(request, template_name, context)
|
||||
|
||||
|
||||
class CaseDetailView(LoginRequiredMixin, DetailView):
|
||||
|
|
@ -180,7 +162,7 @@ class CaseDetailView(LoginRequiredMixin, DetailView):
|
|||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(CaseDetailView, self).get_context_data(**kwargs)
|
||||
user_assgn_list = [i.id for i in context['object'].assigned_to.all()]
|
||||
user_assgn_list = [assigned_to.id for assigned_to in context['object'].assigned_to.all()]
|
||||
if self.request.user == context['object'].created_by:
|
||||
user_assgn_list.append(self.request.user.id)
|
||||
if self.request.user.role != "ADMIN" and not self.request.user.is_superuser:
|
||||
|
|
@ -199,120 +181,105 @@ class CaseDetailView(LoginRequiredMixin, DetailView):
|
|||
return context
|
||||
|
||||
|
||||
class UpdateCaseView(LoginRequiredMixin, UpdateView):
|
||||
model = Case
|
||||
form_class = CaseForm
|
||||
def update_case(request, pk):
|
||||
case_object = Case.objects.filter(pk=pk).first()
|
||||
users = User.objects.filter(is_active=True).order_by('email')
|
||||
accounts = Account.objects.filter(status="open")
|
||||
contacts = Contact.objects.all()
|
||||
if request.user.role != "ADMIN" and not request.user.is_superuser:
|
||||
accounts = Account.objects.filter(
|
||||
created_by=request.user)
|
||||
contacts = Contact.objects.filter(
|
||||
Q(assigned_to__in=[request.user]) | Q(created_by=request.user))
|
||||
kwargs_data = {"assigned_to": users, "account": accounts, "contacts": contacts}
|
||||
form = CaseForm(instance=case_object, **kwargs_data)
|
||||
template_name = "create_cases.html"
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
self.users = User.objects.filter(is_active=True).order_by('email')
|
||||
self.accounts = Account.objects.filter(status="open")
|
||||
self.contacts = Contact.objects.all()
|
||||
if self.request.user.role != "ADMIN" and not self.request.user.is_superuser:
|
||||
self.accounts = Account.objects.filter(
|
||||
created_by=self.request.user)
|
||||
self.contacts = Contact.objects.filter(
|
||||
Q(assigned_to__in=[self.request.user]) | Q(created_by=self.request.user))
|
||||
return super(UpdateCaseView, self).dispatch(request, *args, **kwargs)
|
||||
|
||||
def get_form_kwargs(self):
|
||||
kwargs = super(UpdateCaseView, self).get_form_kwargs()
|
||||
kwargs.update({"assigned_to": self.users, "account": self.accounts,
|
||||
"contacts": self.contacts})
|
||||
return kwargs
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
self.object = self.get_object()
|
||||
form = self.get_form()
|
||||
if request.POST:
|
||||
form = CaseForm(request.POST, request.FILES, instance=case_object, **kwargs_data)
|
||||
if form.is_valid():
|
||||
return self.form_valid(form)
|
||||
assigned_to_ids = case_object.assigned_to.all().values_list('id', flat=True)
|
||||
case_obj = form.save(commit=False)
|
||||
case_obj.contacts.clear()
|
||||
case_obj.save()
|
||||
all_members_list = []
|
||||
|
||||
return self.form_invalid(form)
|
||||
if request.POST.getlist('assigned_to', []):
|
||||
current_site = get_current_site(request)
|
||||
|
||||
def form_valid(self, form):
|
||||
assigned_to_ids = self.get_object().assigned_to.all().values_list('id', flat=True)
|
||||
case_obj = form.save(commit=False)
|
||||
case_obj.contacts.clear()
|
||||
case_obj.save()
|
||||
all_members_list = []
|
||||
assigned_form_users = form.cleaned_data.get(
|
||||
'assigned_to').values_list('id', flat=True)
|
||||
all_members_list = list(
|
||||
set(list(assigned_form_users)) - set(list(assigned_to_ids)))
|
||||
|
||||
if self.request.POST.getlist('assigned_to', []):
|
||||
current_site = get_current_site(self.request)
|
||||
if len(all_members_list):
|
||||
for assigned_to_user in all_members_list:
|
||||
user = get_object_or_404(User, pk=assigned_to_user)
|
||||
mail_subject = 'Assigned to case.'
|
||||
message = render_to_string('assigned_to/cases_assigned.html', {
|
||||
'user': user,
|
||||
'domain': current_site.domain,
|
||||
'protocol': request.scheme,
|
||||
'case': case_obj
|
||||
})
|
||||
email = EmailMessage(
|
||||
mail_subject, message, to=[user.email])
|
||||
email.content_subtype = "html"
|
||||
email.send()
|
||||
|
||||
assigned_form_users = form.cleaned_data.get(
|
||||
'assigned_to').values_list('id', flat=True)
|
||||
all_members_list = list(
|
||||
set(list(assigned_form_users)) - set(list(assigned_to_ids)))
|
||||
case_obj.assigned_to.clear()
|
||||
case_obj.assigned_to.add(*request.POST.getlist('assigned_to'))
|
||||
else:
|
||||
case_obj.assigned_to.clear()
|
||||
|
||||
if len(all_members_list):
|
||||
for assigned_to_user in all_members_list:
|
||||
user = get_object_or_404(User, pk=assigned_to_user)
|
||||
mail_subject = 'Assigned to case.'
|
||||
message = render_to_string('assigned_to/cases_assigned.html', {
|
||||
'user': user,
|
||||
'domain': current_site.domain,
|
||||
'protocol': self.request.scheme,
|
||||
'case': case_obj
|
||||
})
|
||||
email = EmailMessage(
|
||||
mail_subject, message, to=[user.email])
|
||||
email.content_subtype = "html"
|
||||
email.send()
|
||||
if request.POST.getlist('contacts', []):
|
||||
case_obj.contacts.add(*request.POST.getlist('contacts'))
|
||||
|
||||
success_url = reverse("cases:list")
|
||||
if request.POST.get('from_account'):
|
||||
from_account = request.POST.get('from_account')
|
||||
success_url = reverse("accounts:view_account", pk=from_account)
|
||||
if request.FILES.get('case_attachment'):
|
||||
attachment = Attachments()
|
||||
attachment.created_by = request.user
|
||||
attachment.file_name = request.FILES.get(
|
||||
'case_attachment').name
|
||||
attachment.case = case_obj
|
||||
attachment.attachment = request.FILES.get('case_attachment')
|
||||
attachment.save()
|
||||
|
||||
return JsonResponse({'error': False, 'success_url': success_url})
|
||||
|
||||
case_obj.assigned_to.clear()
|
||||
case_obj.assigned_to.add(*self.request.POST.getlist('assigned_to'))
|
||||
else:
|
||||
case_obj.assigned_to.clear()
|
||||
return JsonResponse({'error': True, 'errors': form.errors})
|
||||
|
||||
if self.request.POST.getlist('contacts', []):
|
||||
case_obj.contacts.add(*self.request.POST.getlist('contacts'))
|
||||
|
||||
if self.request.POST.get('from_account'):
|
||||
from_account = self.request.POST.get('from_account')
|
||||
return redirect("accounts:view_account", pk=from_account)
|
||||
if self.request.FILES.get('case_attachment'):
|
||||
attachment = Attachments()
|
||||
attachment.created_by = self.request.user
|
||||
attachment.file_name = self.request.FILES.get(
|
||||
'case_attachment').name
|
||||
attachment.case = case_obj
|
||||
attachment.attachment = self.request.FILES.get('case_attachment')
|
||||
attachment.save()
|
||||
|
||||
if self.request.is_ajax():
|
||||
return JsonResponse({'error': False})
|
||||
return redirect("cases:list")
|
||||
|
||||
def form_invalid(self, form):
|
||||
if self.request.is_ajax():
|
||||
return JsonResponse({'error': True, 'case_errors': form.errors})
|
||||
return self.render_to_response(self.get_context_data(form=form))
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(UpdateCaseView, self).get_context_data(**kwargs)
|
||||
context["case_obj"] = self.object
|
||||
else:
|
||||
context = {}
|
||||
context["case_obj"] = case_object
|
||||
user_assgn_list = [
|
||||
i.id for i in context["case_obj"].assigned_to.all()]
|
||||
if self.request.user == context['case_obj'].created_by:
|
||||
user_assgn_list.append(self.request.user.id)
|
||||
if self.request.user.role != "ADMIN" and not self.request.user.is_superuser:
|
||||
if self.request.user.id not in user_assgn_list:
|
||||
assgined_to.id for assgined_to in context["case_obj"].assigned_to.all()]
|
||||
|
||||
if request.user == case_object.created_by:
|
||||
user_assgn_list.append(request.user.id)
|
||||
if request.user.role != "ADMIN" and not request.user.is_superuser:
|
||||
if request.user.id not in user_assgn_list:
|
||||
raise PermissionDenied
|
||||
context["case_form"] = context["form"]
|
||||
context["accounts"] = self.accounts
|
||||
if self.request.GET.get('view_account'):
|
||||
context["case_form"] = form
|
||||
context["accounts"] = accounts
|
||||
if request.GET.get('view_account'):
|
||||
context['account'] = get_object_or_404(
|
||||
Account, id=self.request.GET.get('view_account'))
|
||||
context["contacts"] = self.contacts
|
||||
context["users"] = self.users
|
||||
Account, id=request.GET.get('view_account'))
|
||||
context["contacts"] = contacts
|
||||
context["users"] = users
|
||||
context["case_types"] = CASE_TYPE
|
||||
context["case_priority"] = PRIORITY_CHOICE
|
||||
context["case_status"] = STATUS_CHOICE
|
||||
context["assignedto_list"] = [
|
||||
int(i) for i in self.request.POST.getlist('assigned_to', []) if i]
|
||||
int(i) for i in request.POST.getlist('assigned_to', []) if i]
|
||||
context["contacts_list"] = [
|
||||
int(i) for i in self.request.POST.getlist('contacts', []) if i]
|
||||
return context
|
||||
int(i) for i in request.POST.getlist('contacts', []) if i]
|
||||
|
||||
return render(request, template_name, context)
|
||||
|
||||
|
||||
class RemoveCaseView(LoginRequiredMixin, View):
|
||||
|
|
@ -323,7 +290,10 @@ class RemoveCaseView(LoginRequiredMixin, View):
|
|||
if request.GET.get('view_account'):
|
||||
account = request.GET.get('view_account')
|
||||
return redirect("accounts:view_account", pk=account)
|
||||
if self.request.user.role == "ADMIN" or self.request.user.is_superuser or self.request.user == self.object.created_by:
|
||||
if (
|
||||
self.request.user.role == "ADMIN" or self.request.user.is_superuser or
|
||||
self.request.user == self.object.created_by
|
||||
):
|
||||
self.object.delete()
|
||||
return redirect("cases:list")
|
||||
else:
|
||||
|
|
@ -349,7 +319,10 @@ class CloseCaseView(LoginRequiredMixin, View):
|
|||
def post(self, request, *args, **kwargs):
|
||||
case_id = request.POST.get("case_id")
|
||||
self.object = get_object_or_404(Case, id=case_id)
|
||||
if self.request.user.role == "ADMIN" or self.request.user.is_superuser or self.request.user == self.object.created_by:
|
||||
if (
|
||||
self.request.user.role == "ADMIN" or self.request.user.is_superuser or
|
||||
self.request.user == self.object.created_by
|
||||
):
|
||||
self.object.status = "Closed"
|
||||
self.object.save()
|
||||
data = {'status': "Closed", "cid": case_id}
|
||||
|
|
@ -358,17 +331,15 @@ class CloseCaseView(LoginRequiredMixin, View):
|
|||
raise PermissionDenied
|
||||
|
||||
|
||||
class SelectContactsView(LoginRequiredMixin, View):
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
contact_account = request.GET.get("account")
|
||||
if contact_account:
|
||||
account = get_object_or_404(Account, id=contact_account)
|
||||
contacts = Contact.objects.filter(account=account)
|
||||
else:
|
||||
contacts = Contact.objects.all()
|
||||
data = {i.pk: i.first_name for i in contacts.distinct()}
|
||||
return JsonResponse(data)
|
||||
def select_contact(request):
|
||||
contact_account = request.GET.get("account")
|
||||
if contact_account:
|
||||
account = get_object_or_404(Account, id=contact_account)
|
||||
contacts = account.contacts.all()
|
||||
else:
|
||||
contacts = Contact.objects.all()
|
||||
data = {contact.pk: contact.first_name for contact in contacts.distinct()}
|
||||
return JsonResponse(data)
|
||||
|
||||
|
||||
class GetCasesView(LoginRequiredMixin, ListView):
|
||||
|
|
|
|||
|
|
@ -127,6 +127,14 @@ class LoginForm(forms.ModelForm):
|
|||
self.request = kwargs.pop("request", None)
|
||||
super(LoginForm, self).__init__(*args, **kwargs)
|
||||
|
||||
def clean_password(self):
|
||||
password = self.cleaned_data.get('password')
|
||||
if password:
|
||||
if len(password) < 4:
|
||||
raise forms.ValidationError(
|
||||
'Password must be at least 4 characters long!')
|
||||
return password
|
||||
|
||||
def clean(self):
|
||||
email = self.cleaned_data.get("email")
|
||||
password = self.cleaned_data.get("password")
|
||||
|
|
@ -202,8 +210,10 @@ class UserCommentForm(forms.ModelForm):
|
|||
def find_urls(string):
|
||||
# website_regex = "^((http|https)://)?([A-Za-z0-9.-]+\.[A-Za-z]{2,63})?$" # (http(s)://)google.com or google.com
|
||||
# website_regex = "^https?://([A-Za-z0-9.-]+\.[A-Za-z]{2,63})?$" # (http(s)://)google.com
|
||||
website_regex = "^https?://[A-Za-z0-9.-]+\.[A-Za-z]{2,63}$" # http(s)://google.com
|
||||
website_regex_port = "^https?://[A-Za-z0-9.-]+\.[A-Za-z]{2,63}:[0-9]{2,4}$" # http(s)://google.com:8000
|
||||
# http(s)://google.com
|
||||
website_regex = "^https?://[A-Za-z0-9.-]+\.[A-Za-z]{2,63}$"
|
||||
# http(s)://google.com:8000
|
||||
website_regex_port = "^https?://[A-Za-z0-9.-]+\.[A-Za-z]{2,63}:[0-9]{2,4}$"
|
||||
url = re.findall(website_regex, string)
|
||||
url_port = re.findall(website_regex_port, string)
|
||||
if len(url) > 0 and url[0] != '':
|
||||
|
|
|
|||
|
|
@ -183,5 +183,4 @@
|
|||
$('#docs_filter').submit();
|
||||
});
|
||||
</script>
|
||||
{% endblock js_block %}
|
||||
|
||||
{% endblock js_block %}
|
||||
|
|
@ -87,7 +87,7 @@
|
|||
<a href="{% url 'common:edit_user' user.id %}" class="btn btn-success edit action"><i class="fas fa-pencil-alt"></i>Edit</a>
|
||||
{% endif %}
|
||||
<a href="{% url 'common:remove_user' user.id %}" class="btn btn-danger trash action" {% if request.user.email == user.email %} style="visibility: hidden;" {% endif %}><i class="fas fa-trash-alt"></i>Delete</a>
|
||||
{% if user.email != admin_email or request.user != user %}
|
||||
{% if user.email != admin_email and request.user != user %}
|
||||
<a style="color:black;margin-bottom: -11px;" data-id="{{user.id}}" href="" class="fa-passwd-reset fa-stack" ><i class="fa fa-undo fa-stack-2x"></i><i class="fa fa-lock fa-stack-1x"></i></a>{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
|
|
|
|||
|
|
@ -91,14 +91,14 @@
|
|||
e.preventDefault();
|
||||
$form = $(this)
|
||||
$.post("", $form.serialize(), function(response){
|
||||
$(".error").remove();
|
||||
$(".error_message").remove();
|
||||
if(response.error){
|
||||
$.each(response.errors, function(field_name, error){
|
||||
if (field_name == '__all__'){
|
||||
error = "<span class=\"error\" style=color:red>" + error + "</span>"
|
||||
error = "<span class=\"error_message\" style=color:red>" + error + "</span>"
|
||||
$("span.__all__").after(error)
|
||||
}else{
|
||||
error = "<span class=\"error\" style=color:red>" + error + "</span>"
|
||||
error = "<span class=\"error_message\" style=color:red>" + error + "</span>"
|
||||
$form.find("[name="+field_name + "]").after(error)
|
||||
}
|
||||
})
|
||||
|
|
@ -148,4 +148,3 @@
|
|||
|
||||
</script>
|
||||
{% endblock js_block %}
|
||||
|
||||
|
|
|
|||
|
|
@ -85,5 +85,4 @@
|
|||
window.location = $(this).attr('href')
|
||||
});
|
||||
</script>
|
||||
{% endblock js_block %}
|
||||
|
||||
{% endblock js_block %}
|
||||
|
|
@ -91,14 +91,14 @@
|
|||
e.preventDefault();
|
||||
$form = $(this)
|
||||
$.post("", $form.serialize(), function(response){
|
||||
$(".error").remove();
|
||||
$(".error_message").remove();
|
||||
if(response.error){
|
||||
$.each(response.errors, function(field_name, error){
|
||||
if (field_name == '__all__'){
|
||||
error = "<span class=\"error\" style=color:red>" + error + "</span>"
|
||||
error = "<span class=\"error_message\" style=color:red>" + error + "</span>"
|
||||
$("span.__all__").after(error)
|
||||
}else{
|
||||
error = "<span class=\"error\" style=color:red>" + error + "</span>"
|
||||
error = "<span class=\"error_message\" style=color:red>" + error + "</span>"
|
||||
$form.find("[name="+field_name + "]").after(error)
|
||||
}
|
||||
})
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ from django.urls import path
|
|||
from common.views import (
|
||||
HomeView, LoginView, ForgotPasswordView, LogoutView, ChangePasswordView, ProfileView,
|
||||
UsersListView, CreateUserView, UpdateUserView, UserDetailView, UserDeleteView, PasswordResetView,
|
||||
DocumentListView, DocumentCreateView, UpdateDocumentView, DocumentDetailView, DocumentDeleteView,
|
||||
DocumentListView, document_create, document_update, DocumentDetailView, DocumentDeleteView,
|
||||
download_document, change_user_status, download_attachment, add_comment, edit_comment, remove_comment,
|
||||
api_settings, add_api_settings, view_api_settings, update_api_settings, delete_api_settings,
|
||||
change_passsword_by_admin, google_login
|
||||
|
|
@ -42,8 +42,8 @@ urlpatterns = [
|
|||
|
||||
# Document
|
||||
path('documents/list/', DocumentListView.as_view(), name='doc_list'),
|
||||
path('documents/create/', DocumentCreateView.as_view(), name='create_doc'),
|
||||
path('documents/<int:pk>/edit/', UpdateDocumentView.as_view(), name="edit_doc"),
|
||||
path('documents/create/', document_create, name='create_doc'),
|
||||
path('documents/<int:pk>/edit/', document_update, name="edit_doc"),
|
||||
path('documents/<int:pk>/view/', DocumentDetailView.as_view(), name='view_doc'),
|
||||
path('documents/<int:pk>/delete/',
|
||||
DocumentDeleteView.as_view(), name='remove_doc'),
|
||||
|
|
|
|||
115
common/views.py
115
common/views.py
|
|
@ -168,8 +168,9 @@ class LoginView(TemplateView):
|
|||
"ENABLE_GOOGLE_LOGIN": settings.ENABLE_GOOGLE_LOGIN,
|
||||
"GP_CLIENT_SECRET": settings.GP_CLIENT_SECRET,
|
||||
"GP_CLIENT_ID": settings.GP_CLIENT_ID,
|
||||
"error": True,
|
||||
"message": "Your username and password didn't match. Please try again."
|
||||
# "error": True,
|
||||
# "message": "Your username and password didn't match. Please try again."
|
||||
"form": form
|
||||
})
|
||||
|
||||
|
||||
|
|
@ -332,48 +333,33 @@ class PasswordResetView(PasswordResetView):
|
|||
email_template_name = 'registration/password_reset_email.html'
|
||||
|
||||
|
||||
class DocumentCreateView(LoginRequiredMixin, CreateView):
|
||||
model = Document
|
||||
form_class = DocumentForm
|
||||
def document_create(request):
|
||||
template_name = "doc_create.html"
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
self.users = User.objects.filter(is_active=True).order_by('email')
|
||||
return super(DocumentCreateView, self).dispatch(request, *args, **kwargs)
|
||||
|
||||
def get_form_kwargs(self):
|
||||
kwargs = super(DocumentCreateView, self).get_form_kwargs()
|
||||
kwargs.update({'users': self.users})
|
||||
return kwargs
|
||||
|
||||
def form_valid(self, form):
|
||||
doc = form.save(commit=False)
|
||||
doc.created_by = self.request.user
|
||||
doc.save()
|
||||
if self.request.POST.getlist('shared_to'):
|
||||
doc.shared_to.add(*self.request.POST.getlist('shared_to'))
|
||||
|
||||
if self.request.is_ajax():
|
||||
users = User.objects.filter(is_active=True).order_by('email')
|
||||
form = DocumentForm(users=users)
|
||||
if request.POST:
|
||||
form = DocumentForm(request.POST, request.FILES, users=users)
|
||||
if form.is_valid():
|
||||
doc = form.save(commit=False)
|
||||
doc.created_by = request.user
|
||||
doc.save()
|
||||
if request.POST.getlist('shared_to'):
|
||||
doc.shared_to.add(*request.POST.getlist('shared_to'))
|
||||
data = {'success_url': reverse_lazy(
|
||||
'common:doc_list'), 'error': False}
|
||||
return JsonResponse(data)
|
||||
return super(DocumentCreateView, self).form_valid(form)
|
||||
|
||||
def form_invalid(self, form):
|
||||
response = super(DocumentCreateView, self).form_invalid(form)
|
||||
if self.request.is_ajax():
|
||||
else:
|
||||
return JsonResponse({'error': True, 'errors': form.errors})
|
||||
return response
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(DocumentCreateView, self).get_context_data(**kwargs)
|
||||
context["doc_form"] = context["form"]
|
||||
context["users"] = self.users
|
||||
else:
|
||||
context = {}
|
||||
context["doc_form"] = form
|
||||
context["users"] = users
|
||||
context["sharedto_list"] = [
|
||||
int(i) for i in self.request.POST.getlist('assigned_to', []) if i]
|
||||
if "errors" in kwargs:
|
||||
context["errors"] = kwargs["errors"]
|
||||
return context
|
||||
int(i) for i in request.POST.getlist('assigned_to', []) if i]
|
||||
context["errors"] = form.errors
|
||||
return render(request, template_name, context)
|
||||
|
||||
|
||||
class DocumentListView(LoginRequiredMixin, TemplateView):
|
||||
|
|
@ -446,6 +432,42 @@ class DocumentDeleteView(LoginRequiredMixin, DeleteView):
|
|||
return redirect("common:doc_list")
|
||||
|
||||
|
||||
def document_update(request, pk):
|
||||
template_name = "doc_create.html"
|
||||
users = User.objects.filter(is_active=True).order_by('email')
|
||||
form = DocumentForm(users=users)
|
||||
document = Document.objects.filter(id=pk).first()
|
||||
|
||||
if request.POST:
|
||||
form = DocumentForm(request.POST, request.FILES, instance=document, users=users)
|
||||
if form.is_valid():
|
||||
doc = form.save(commit=False)
|
||||
doc.save()
|
||||
|
||||
doc.shared_to.clear()
|
||||
if request.POST.getlist('shared_to'):
|
||||
doc.shared_to.add(*request.POST.getlist('shared_to'))
|
||||
|
||||
data = {'success_url': reverse_lazy(
|
||||
'common:doc_list'), 'error': False}
|
||||
return JsonResponse(data)
|
||||
|
||||
else:
|
||||
return JsonResponse({'error': True, 'errors': form.errors})
|
||||
|
||||
else:
|
||||
context = {}
|
||||
context["doc_obj"] = document
|
||||
context["doc_form"] = form
|
||||
context["doc_file_name"] = context["doc_obj"].document_file.name.split(
|
||||
"/")[-1]
|
||||
context["users"] = users
|
||||
context["sharedto_list"] = [
|
||||
int(i) for i in request.POST.getlist('shared_to', []) if i]
|
||||
context["errors"] = form.errors
|
||||
return render(request, template_name, context)
|
||||
|
||||
|
||||
class UpdateDocumentView(LoginRequiredMixin, UpdateView):
|
||||
model = Document
|
||||
form_class = DocumentForm
|
||||
|
|
@ -524,7 +546,7 @@ def download_document(request, pk):
|
|||
if doc_obj:
|
||||
if not request.user.role == 'ADMIN':
|
||||
if (not request.user == doc_obj.created_by and
|
||||
request.user not in doc_obj.shared_to.all()):
|
||||
request.user not in doc_obj.shared_to.all()):
|
||||
raise PermissionDenied
|
||||
path = doc_obj.document_file.path
|
||||
file_path = os.path.join(settings.MEDIA_ROOT, path)
|
||||
|
|
@ -698,7 +720,7 @@ def update_api_settings(request, pk):
|
|||
else:
|
||||
data = {
|
||||
'form': form, "setting": api_settings, 'users': users, 'assign_to_list': assign_to_list,
|
||||
'assigned_to_list': json.dumps([i.id for i in api_settings.lead_assigned_to.all() if i])
|
||||
'assigned_to_list': json.dumps([setting.id for setting in api_settings.lead_assigned_to.all() if setting])
|
||||
}
|
||||
return render(request, 'settings/update.html', data)
|
||||
|
||||
|
|
@ -759,11 +781,16 @@ def google_login(request):
|
|||
link = user_document['link'] if 'link' in user_document.keys(
|
||||
) else link
|
||||
|
||||
verified_email = user_document['verified_email'] if 'verified_email' in user_document.keys() else ''
|
||||
name = user_document['name'] if 'name' in user_document.keys() else 'name'
|
||||
first_name = user_document['given_name'] if 'given_name' in user_document.keys() else 'first_name'
|
||||
last_name = user_document['family_name'] if 'family_name' in user_document.keys() else 'last_name'
|
||||
email = user_document['email'] if 'email' in user_document.keys() else 'email@dummy.com'
|
||||
verified_email = user_document['verified_email'] if 'verified_email' in user_document.keys(
|
||||
) else ''
|
||||
name = user_document['name'] if 'name' in user_document.keys(
|
||||
) else 'name'
|
||||
first_name = user_document['given_name'] if 'given_name' in user_document.keys(
|
||||
) else 'first_name'
|
||||
last_name = user_document['family_name'] if 'family_name' in user_document.keys(
|
||||
) else 'last_name'
|
||||
email = user_document['email'] if 'email' in user_document.keys(
|
||||
) else 'email@dummy.com'
|
||||
|
||||
user = User.objects.filter(email=user_document['email'])
|
||||
|
||||
|
|
@ -777,7 +804,7 @@ def google_login(request):
|
|||
email=email,
|
||||
first_name=first_name,
|
||||
last_name=last_name,
|
||||
role="User"
|
||||
role="USER"
|
||||
)
|
||||
|
||||
google, created = Google.objects.get_or_create(user=user)
|
||||
|
|
|
|||
|
|
@ -107,11 +107,13 @@
|
|||
<label for="exampleInputEmail1">Attachment</label>
|
||||
<input type="file" name="contact_attachment">
|
||||
{% if contact_obj.contact_attachment.count %}
|
||||
{% for i in contact_obj.contact_attachment.all %}
|
||||
<span id="attachment{{i.id}}">
|
||||
<a target="_blank" href="{{i.attachment.url}}">{{i.file_name}}</a>
|
||||
<a class="action btn primary_btn" onclick="remove_attachment({{i.id}})">X</a>
|
||||
</span>
|
||||
{% for attachment in contact_obj.contact_attachment.all %}
|
||||
<div id="attachment{{attachment.id}}" class="mt-2">
|
||||
<a target="_blank" href="{{ attachment.attachment.url }}">{{ attachment.file_name }}</a>
|
||||
{% if not attachment.created_by.role == 'ADMIN' or attachment.created_by.role == request.user.role %}
|
||||
<a class="action btn primary_btn" onclick="remove_attachment({{attachment.id}})">X</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
<span class="error"></span>
|
||||
|
|
|
|||
|
|
@ -176,7 +176,7 @@ class ContactDetailView(LoginRequiredMixin, DetailView):
|
|||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(ContactDetailView, self).get_context_data(**kwargs)
|
||||
user_assgn_list = [i.id for i in context['object'].assigned_to.all()]
|
||||
user_assgn_list = [assigned_to.id for assigned_to in context['object'].assigned_to.all()]
|
||||
if self.request.user == context['object'].created_by:
|
||||
user_assgn_list.append(self.request.user.id)
|
||||
if self.request.user.role != "ADMIN" and not self.request.user.is_superuser:
|
||||
|
|
@ -285,7 +285,7 @@ class UpdateContactView(LoginRequiredMixin, UpdateView):
|
|||
context = super(UpdateContactView, self).get_context_data(**kwargs)
|
||||
context["contact_obj"] = self.object
|
||||
user_assgn_list = [
|
||||
i.id for i in context["contact_obj"].assigned_to.all()]
|
||||
assigned_to.id for assigned_to in context["contact_obj"].assigned_to.all()]
|
||||
if self.request.user == context['contact_obj'].created_by:
|
||||
user_assgn_list.append(self.request.user.id)
|
||||
if self.request.user.role != "ADMIN" and not self.request.user.is_superuser:
|
||||
|
|
@ -477,4 +477,3 @@ class DeleteAttachmentsView(LoginRequiredMixin, View):
|
|||
|
||||
data = {'error': "You don't have permission to delete this attachment."}
|
||||
return JsonResponse(data)
|
||||
|
||||
|
|
|
|||
|
|
@ -13,12 +13,9 @@
|
|||
{% endblock %}
|
||||
{%block content%}
|
||||
<head>
|
||||
<link rel="stylesheet" type="text/css" href="//xoxco.com/projects/code/tagsinput/jquery.tagsinput.css" />
|
||||
<script type="text/javascript" src="//xoxco.com/projects/code/tagsinput/jquery.tagsinput.js"></script>
|
||||
<script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/jquery-ui.min.js'></script>
|
||||
<link rel="stylesheet" type="text/css" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/themes/start/jquery-ui.css" />
|
||||
</head>
|
||||
<form id="add_form" method="POST" action="" novalidate enctype="multipart/form-data">
|
||||
<form id="lead_form" method="POST" action="" novalidate enctype="multipart/form-data">
|
||||
<div class="overview_form_block row marl justify-content-center">
|
||||
<div class="col-md-9">
|
||||
<div class="card">
|
||||
|
|
@ -34,12 +31,12 @@
|
|||
<div class="filter_col col-md-6">
|
||||
<label for="exampleInputEmail1" class="name" >First Name{% if lead_form.first_name.field.required %}<span class="error">*</span>{% endif %}</label>
|
||||
{{ lead_form.first_name }}
|
||||
<span class="error">{{ lead_form.first_name.errors }}</span>
|
||||
<span class="error error_message" id="error_id_first_name">{{ lead_form.first_name.errors }}</span>
|
||||
</div>
|
||||
<div class="filter_col col-md-6">
|
||||
<label for="exampleInputEmail1" class="name" >Last Name{% if lead_form.last_name.field.required %}<span class="error">*</span>{% endif %}</label>
|
||||
{{ lead_form.last_name }}
|
||||
<span class="error">{{ lead_form.last_name.errors }}</span>
|
||||
<span class="error error_message" id="error_id_last_name">{{ lead_form.last_name.errors }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -48,9 +45,9 @@
|
|||
<div class="form-group">
|
||||
<label for="exampleInputEmail1" {% if request.POST.status == "converted" %} class="required" {% endif %}>Account Name{% if lead_form.account_name.field.required %}<span class="error">*</span>{% endif %}</label>
|
||||
{{ lead_form.account_name }}
|
||||
<span class="error">{{ lead_form.account_name.errors }}</span>
|
||||
<span class="error error_message" id="error_id_account_name">{{ lead_form.account_name.errors }}</span>
|
||||
{% if error %}
|
||||
<span class="error">{{ error }}</span>
|
||||
<span class="error error_message" id="error_id_}">{{ error }}</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -58,23 +55,23 @@
|
|||
<div class="form-group">
|
||||
<label for="exampleInputEmail1">Title{% if lead_form.title.field.required %}<span class="error">*</span>{% endif %}</label>
|
||||
{{ lead_form.title }}
|
||||
<span class="error">{{ lead_form.title.errors }}</span>
|
||||
<span class="error error_message" id="error_id_title">{{ lead_form.title.errors }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter_col col-md-12">
|
||||
<div class="form-group ">
|
||||
<label for="exampleInputEmail1">Phone{% if lead_form.phone.field.required %}<span class="error">*</span>{% endif %}</label>
|
||||
{{ lead_form.phone }}
|
||||
<span class="error">{{ lead_form.phone.errors }}</span>
|
||||
<span class="error error_message" id="error_id_phone">{{ lead_form.phone.errors }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter_col col-md-12">
|
||||
<div class="form-group ">
|
||||
<label for="exampleInputEmail1" class="required">Email Address{% if lead_form.email.field.required %}<span class="error">*</span>{% endif %}</label>
|
||||
{{ lead_form.email }}
|
||||
<span class="error">{{ lead_form.email.errors }}</span>
|
||||
<span class="error error_message" id="error_id_email">{{ lead_form.email.errors }}</span>
|
||||
{% if error %}
|
||||
<span class="error">{{ error }}</span>
|
||||
<span class="error error_message" id="error_id_}">{{ error }}</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -82,13 +79,15 @@
|
|||
<div class="filter_col col-md-12">
|
||||
<div class="form-group">
|
||||
<label for="exampleInputEmail1">Attachment</label>
|
||||
<input type="file" name="lead_attachment">
|
||||
<input type="file" name="lead_attachment" id="lead_attachment">
|
||||
{% if lead_obj.lead_attachment.count %}
|
||||
{% for i in lead_obj.lead_attachment.all %}
|
||||
<span id="attachment{{i.id}}">
|
||||
<a target="_blank" href="{{i.attachment.url}}">{{i.file_name}}</a>
|
||||
<a class="action btn primary_btn" onclick="remove_attachment({{i.id}})">X</a>
|
||||
</span>
|
||||
{% for attachment in lead_obj.lead_attachment.all %}
|
||||
<div id="attachment{{attachment.id}}" class="mt-2">
|
||||
<a target="_blank" href="{{ attachment.attachment.url }}">{{ attachment.file_name }}</a>
|
||||
{% if not attachment.created_by.role == 'ADMIN' or attachment.created_by.role == request.user.role %}
|
||||
<a class="action btn primary_btn" onclick="remove_attachment({{attachment.id}})">X</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
<span class="error"></span>
|
||||
|
|
@ -100,14 +99,14 @@
|
|||
<div class="form-group">
|
||||
<label for="exampleInputEmail1">Website{% if lead_form.website.field.required %}<span class="error">*</span>{% endif %}</label>
|
||||
{{ lead_form.website }}
|
||||
<span class="error">{{ lead_form.website.errors }}</span>
|
||||
<span class="error error_message" id="error_id_website">{{ lead_form.website.errors }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter_col col-md-12">
|
||||
<div class="form-group">
|
||||
<label for="exampleInputEmail1" >Description{% if lead_form.description.field.required %}<span class="error">*</span>{% endif %}</label>
|
||||
{{ lead_form.description }}
|
||||
<span class="error">{{ lead_form.description.errors }}</span>
|
||||
<span class="error error_message" id="error_id_description">{{ lead_form.description.errors }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
@ -119,14 +118,14 @@
|
|||
<option value="{{user.id}}" {% if user in lead_obj.assigned_to.all or user.id in assignedto_list %} selected="" {% endif %}>{{user.email}}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
<span class="error">{{ lead_form.assigned_to.errors }}</span>
|
||||
<span class="error error_message" id="error_id_assigned_to">{{ lead_form.assigned_to.errors }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter_col col-md-12">
|
||||
<div class="form-group">
|
||||
<label for="exampleInputEmail1"/>Status{% if lead_form.status.field.required %}<span class="error">*</span>{% endif %}</label>
|
||||
{{ lead_form.status }}
|
||||
<span class="error">{{ lead_form.status.errors }}</span>
|
||||
<span class="error error_message" id="error_id_status">{{ lead_form.status.errors }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -135,34 +134,34 @@
|
|||
<div class="form-group">
|
||||
<label for="exampleInputEmail1"/>Source{% if lead_form.source.field.required %}<span class="error">*</span>{% endif %}</label>
|
||||
{{ lead_form.source }}
|
||||
<span class="error">{{ lead_form.source.errors }}</span>
|
||||
<span class="error error_message" id="error_id_source">{{ lead_form.source.errors }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter_col col-md-12">
|
||||
<div class="form-group">
|
||||
<label for="exampleInputEmail1" >Address</label>
|
||||
{{ lead_form.address_line }}
|
||||
<span class="error">{{ lead_form.address_line.errors }}</span>
|
||||
<span class="error error_message" id="error_id_address_line">{{ lead_form.address_line.errors }}</span>
|
||||
</div>
|
||||
{{ lead_form.street }}
|
||||
<span class="error">{{ lead_form.street.errors }}</span>
|
||||
<span class="error error_message" id="error_id_street">{{ lead_form.street.errors }}</span>
|
||||
<div class="row" style="margin-top:10px;">
|
||||
<div class="col-md-4">
|
||||
{{ lead_form.city }}
|
||||
<span class="error">{{ lead_form.city.errors }}</span>
|
||||
<span class="error error_message" id="error_id_city">{{ lead_form.city.errors }}</span>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
{{ lead_form.state }}
|
||||
<span class="error">{{ lead_form.state.errors }}</span>
|
||||
<span class="error error_message" id="error_id_state">{{ lead_form.state.errors }}</span>
|
||||
</div>
|
||||
|
||||
<div class="col-md-4">
|
||||
{{ lead_form.postcode }}
|
||||
<span class="error">{{ lead_form.postcode.errors }}</span>
|
||||
<span class="error error_message" id="error_id_postcode">{{ lead_form.postcode.errors }}</span>
|
||||
</div>
|
||||
<div class="col-md-12" style="margin-top:10px;">
|
||||
{{ lead_form.country }}
|
||||
<span class="error">{{ lead_form.country.errors }}</span>
|
||||
<span class="error error_message" id="error_id_country">{{ lead_form.country.errors }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -177,7 +176,7 @@
|
|||
</div>
|
||||
<div class="col-md-12">
|
||||
<div class="row marl buttons_row text-center form_btn_row">
|
||||
<button class="btn btn-default save" type="submit">Save</button>
|
||||
<button class="btn btn-default save" type="submit" id="submit_btn">Save</button>
|
||||
{% if not lead_obj %}
|
||||
<button class="btn btn-success save savenew" type="submit">Save & New</button>
|
||||
{% endif %}
|
||||
|
|
@ -191,16 +190,84 @@
|
|||
<input type="hidden" id="save_new_form" name="savenewform">
|
||||
</div>
|
||||
</form>
|
||||
<div class="row marl justify-content-center text-center mt-5 mb-5" id="progress_bar">
|
||||
<!-- <div class="mt-5 mb-5"></div> -->
|
||||
<div class="progress position-relative" style="width:40%;height:1.5rem;">
|
||||
<span class="justify-content-center d-flex position-absolute w-100 percent">0%</span>
|
||||
<div class="progress-bar bar"></div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block js_block %}
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script>
|
||||
<link href="https://cdnjs.cloudflare.com/ajax/libs/jquery-tagsinput/1.3.6/jquery.tagsinput.min.css" rel="stylesheet">
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-tagsinput/1.3.6/jquery.tagsinput.min.js"></script>
|
||||
<script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/jquery-ui.min.js'></script>
|
||||
<script src="https://malsup.github.io/jquery.form.js"></script>
|
||||
<script type="text/javascript">
|
||||
|
||||
var bar = $('.bar');
|
||||
var percent = $('.percent');
|
||||
|
||||
$('#progress_bar').hide()
|
||||
|
||||
$('form#lead_form').ajaxForm({
|
||||
type:'POST',
|
||||
dataType:'json',
|
||||
url: ".",
|
||||
data:$('#lead_form').serialize(),
|
||||
beforeSubmit: disableButton,
|
||||
beforeSend: function() {
|
||||
var percentVal = '0%';
|
||||
bar.width(percentVal);
|
||||
percent.html(percentVal);
|
||||
},
|
||||
uploadProgress: function(event, position, total, percentComplete) {
|
||||
var percentVal = percentComplete + '%';
|
||||
bar.width(percentVal);
|
||||
if (percentVal == '100%'){
|
||||
percent.html('Uploading ...')
|
||||
}
|
||||
else{
|
||||
percent.html(percentVal);
|
||||
}
|
||||
},
|
||||
success: function(data) {
|
||||
if(data.error){
|
||||
$('#progress_bar').hide()
|
||||
$('.error_message').html('')
|
||||
for (var key in data.errors) {
|
||||
$('#error_id_'+key).html("<p>" + data.errors[key][0] + "</p>");
|
||||
};
|
||||
$('#submit_btn').removeAttr('disabled')
|
||||
}
|
||||
else{
|
||||
window.location = data.success_url;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
$('#submit_btn').click(function() {
|
||||
var file = $('#lead_attachment')[0].files[0];
|
||||
if(file && file.name.length>0){
|
||||
var percentVal = '0%';
|
||||
bar.width(percentVal);
|
||||
percent.html(percentVal);
|
||||
$('#progress_bar').show()
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
function disableButton(){
|
||||
// $('#progress_bar').show()
|
||||
$('#submit_btn').attr('disabled','disabled')
|
||||
}
|
||||
|
||||
$(".savenew").on('click', function(e){
|
||||
e.preventDefault()
|
||||
$("#save_new_form").val('true')
|
||||
$('#add_form').submit()
|
||||
$('#lead_form').submit()
|
||||
});
|
||||
$(document).ready(function() {
|
||||
$('.assigned_users').select2();
|
||||
|
|
|
|||
|
|
@ -115,7 +115,8 @@ class LeadsCreateUrlTestCase(TestLeadModel, TestCase):
|
|||
'state': "Telangana", 'postcode': "500079", 'country': "AD",
|
||||
'website': "www.gmail.com", 'status': "assigned",
|
||||
"source": "Call", 'opportunity_amount': "700", 'description': "Iam an Lead", 'created_by': self.user})
|
||||
self.assertTemplateUsed(response, 'create_lead.html')
|
||||
# self.assertTemplateUsed(response, 'create_lead.html')
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
|
||||
class LeadsEditUrlTestCase(TestLeadModel, TestCase):
|
||||
|
|
@ -195,7 +196,8 @@ class UpdateLeadTestCase(TestLeadModel, TestCase):
|
|||
'phone': "+917894563452", 'website': "www.gmail.com", 'status': "assigned",
|
||||
'source': "", 'opportunity_amount': "700", 'description': "Iam an Lead", 'created_by': self.user}
|
||||
response = self.client.post(url, data)
|
||||
self.assertEqual(response.status_code, 302)
|
||||
# self.assertEqual(response.status_code, 302)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
|
||||
class LeadDetailTestCase(TestLeadModel, TestCase):
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
from django.urls import path
|
||||
from leads.views import (
|
||||
LeadListView, CreateLeadView, LeadDetailView, UpdateLeadView, DeleteLeadView, ConvertLeadView,
|
||||
LeadListView, create_lead, LeadDetailView, update_lead, DeleteLeadView, convert_lead,
|
||||
GetLeadsView, AddCommentView, UpdateCommentView, DeleteCommentView,
|
||||
AddAttachmentsView, DeleteAttachmentsView, create_lead_from_site
|
||||
)
|
||||
|
|
@ -11,14 +11,14 @@ app_name = 'leads'
|
|||
|
||||
urlpatterns = [
|
||||
path('list/', LeadListView.as_view(), name='list'),
|
||||
path('create/', CreateLeadView.as_view(), name='add_lead'),
|
||||
path('create/', create_lead, name='add_lead'),
|
||||
# create_lead_from_site
|
||||
path('create/from-site/', create_lead_from_site,
|
||||
name="create_lead_from_site"),
|
||||
path('<int:pk>/view/', LeadDetailView.as_view(), name="view_lead"),
|
||||
path('<int:pk>/edit/', UpdateLeadView.as_view(), name="edit_lead"),
|
||||
path('<int:pk>/edit/', update_lead, name="edit_lead"),
|
||||
path('<int:pk>/delete/', DeleteLeadView.as_view(), name="remove_lead"),
|
||||
path('<int:pk>/convert/', ConvertLeadView.as_view(), name="leads_convert"),
|
||||
path('<int:pk>/convert/', convert_lead, name="leads_convert"),
|
||||
|
||||
path('get/list/', GetLeadsView.as_view(), name="get_lead"),
|
||||
|
||||
|
|
|
|||
510
leads/views.py
510
leads/views.py
|
|
@ -5,7 +5,7 @@ from django.core.mail import EmailMessage
|
|||
from django.db.models import Q
|
||||
from django.forms.models import modelformset_factory
|
||||
from django.http import HttpResponseRedirect, JsonResponse
|
||||
from django.shortcuts import get_object_or_404, redirect
|
||||
from django.shortcuts import get_object_or_404, redirect, render
|
||||
from django.template.loader import render_to_string
|
||||
from django.urls import reverse
|
||||
from django.views.generic import (
|
||||
|
|
@ -84,7 +84,8 @@ class LeadListView(LoginRequiredMixin, TemplateView):
|
|||
|
||||
context["search"] = search
|
||||
|
||||
context['tags'] = Tags.objects.all()
|
||||
tag_ids = list(set(Lead.objects.values_list('tags', flat=True)))
|
||||
context["tags"] = Tags.objects.filter(id__in=tag_ids)
|
||||
|
||||
tab_status = 'Open'
|
||||
if self.request.POST.get('tab_status'):
|
||||
|
|
@ -98,124 +99,110 @@ class LeadListView(LoginRequiredMixin, TemplateView):
|
|||
return self.render_to_response(context)
|
||||
|
||||
|
||||
class CreateLeadView(LoginRequiredMixin, CreateView):
|
||||
model = Lead
|
||||
form_class = LeadForm
|
||||
def create_lead(request):
|
||||
template_name = "create_lead.html"
|
||||
users = User.objects.filter(is_active=True).order_by('email')
|
||||
form = LeadForm(assigned_to=users)
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
self.users = User.objects.filter(is_active=True).order_by('email')
|
||||
return super(CreateLeadView, self).dispatch(request, *args, **kwargs)
|
||||
|
||||
def get_form_kwargs(self):
|
||||
kwargs = super(CreateLeadView, self).get_form_kwargs()
|
||||
kwargs.update({"assigned_to": self.users})
|
||||
return kwargs
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
self.object = None
|
||||
form = self.get_form()
|
||||
if request.POST:
|
||||
form = LeadForm(request.POST, request.FILES, assigned_to=users)
|
||||
if form.is_valid():
|
||||
return self.form_valid(form)
|
||||
|
||||
return self.form_invalid(form)
|
||||
|
||||
def form_valid(self, form):
|
||||
|
||||
lead_obj = form.save(commit=False)
|
||||
lead_obj.created_by = self.request.user
|
||||
lead_obj.save()
|
||||
if self.request.POST.get('tags', ''):
|
||||
tags = self.request.POST.get("tags")
|
||||
splitted_tags = tags.split(",")
|
||||
for t in splitted_tags:
|
||||
tag = Tags.objects.filter(name=t)
|
||||
if tag:
|
||||
tag = tag[0]
|
||||
else:
|
||||
tag = Tags.objects.create(name=t)
|
||||
lead_obj.tags.add(tag)
|
||||
if self.request.POST.getlist('assigned_to', []):
|
||||
lead_obj.assigned_to.add(*self.request.POST.getlist('assigned_to'))
|
||||
assigned_to_list = self.request.POST.getlist('assigned_to')
|
||||
current_site = get_current_site(self.request)
|
||||
for assigned_to_user in assigned_to_list:
|
||||
user = get_object_or_404(User, pk=assigned_to_user)
|
||||
mail_subject = 'Assigned to lead.'
|
||||
message = render_to_string('assigned_to/leads_assigned.html', {
|
||||
'user': user,
|
||||
'domain': current_site.domain,
|
||||
'protocol': self.request.scheme,
|
||||
'lead': lead_obj
|
||||
})
|
||||
email = EmailMessage(mail_subject, message, to=[user.email])
|
||||
email.content_subtype = "html"
|
||||
email.send()
|
||||
|
||||
if self.request.FILES.get('lead_attachment'):
|
||||
attachment = Attachments()
|
||||
attachment.created_by = self.request.user
|
||||
attachment.file_name = self.request.FILES.get(
|
||||
'lead_attachment').name
|
||||
attachment.lead = lead_obj
|
||||
attachment.attachment = self.request.FILES.get('lead_attachment')
|
||||
attachment.save()
|
||||
|
||||
if self.request.POST.get('status') == "converted":
|
||||
account_object = Account.objects.create(
|
||||
created_by=self.request.user, name=lead_obj.account_name,
|
||||
email=lead_obj.email, phone=lead_obj.phone,
|
||||
description=self.request.POST.get('description'),
|
||||
website=self.request.POST.get('website'),
|
||||
)
|
||||
account_object.billing_address_line = lead_obj.address_line
|
||||
account_object.billing_street = lead_obj.street
|
||||
account_object.billing_city = lead_obj.city
|
||||
account_object.billing_state = lead_obj.state
|
||||
account_object.billing_postcode = lead_obj.postcode
|
||||
account_object.billing_country = lead_obj.country
|
||||
for tag in lead_obj.tags.all():
|
||||
account_object.tags.add(tag)
|
||||
|
||||
if self.request.POST.getlist('assigned_to', []):
|
||||
# account_object.assigned_to.add(*self.request.POST.getlist('assigned_to'))
|
||||
assigned_to_list = self.request.POST.getlist('assigned_to')
|
||||
current_site = get_current_site(self.request)
|
||||
lead_obj = form.save(commit=False)
|
||||
lead_obj.created_by = request.user
|
||||
lead_obj.save()
|
||||
if request.POST.get('tags', ''):
|
||||
tags = request.POST.get("tags")
|
||||
splitted_tags = tags.split(",")
|
||||
for t in splitted_tags:
|
||||
tag = Tags.objects.filter(name=t)
|
||||
if tag:
|
||||
tag = tag[0]
|
||||
else:
|
||||
tag = Tags.objects.create(name=t)
|
||||
lead_obj.tags.add(tag)
|
||||
if request.POST.getlist('assigned_to', []):
|
||||
lead_obj.assigned_to.add(*request.POST.getlist('assigned_to'))
|
||||
assigned_to_list = request.POST.getlist('assigned_to')
|
||||
current_site = get_current_site(request)
|
||||
for assigned_to_user in assigned_to_list:
|
||||
user = get_object_or_404(User, pk=assigned_to_user)
|
||||
mail_subject = 'Assigned to account.'
|
||||
message = render_to_string('assigned_to/account_assigned.html', {
|
||||
mail_subject = 'Assigned to lead.'
|
||||
message = render_to_string('assigned_to/leads_assigned.html', {
|
||||
'user': user,
|
||||
'domain': current_site.domain,
|
||||
'protocol': self.request.scheme,
|
||||
'account': account_object
|
||||
'protocol': request.scheme,
|
||||
'lead': lead_obj
|
||||
})
|
||||
email = EmailMessage(
|
||||
mail_subject, message, to=[user.email])
|
||||
email.content_subtype = "html"
|
||||
email.send()
|
||||
|
||||
account_object.save()
|
||||
if self.request.POST.get("savenewform"):
|
||||
return redirect("leads:add_lead")
|
||||
return redirect('leads:list')
|
||||
if request.FILES.get('lead_attachment'):
|
||||
attachment = Attachments()
|
||||
attachment.created_by = request.user
|
||||
attachment.file_name = request.FILES.get(
|
||||
'lead_attachment').name
|
||||
attachment.lead = lead_obj
|
||||
attachment.attachment = request.FILES.get('lead_attachment')
|
||||
attachment.save()
|
||||
|
||||
def form_invalid(self, form):
|
||||
return self.render_to_response(
|
||||
self.get_context_data(form=form))
|
||||
if request.POST.get('status') == "converted":
|
||||
account_object = Account.objects.create(
|
||||
created_by=request.user, name=lead_obj.account_name,
|
||||
email=lead_obj.email, phone=lead_obj.phone,
|
||||
description=request.POST.get('description'),
|
||||
website=request.POST.get('website'),
|
||||
)
|
||||
account_object.billing_address_line = lead_obj.address_line
|
||||
account_object.billing_street = lead_obj.street
|
||||
account_object.billing_city = lead_obj.city
|
||||
account_object.billing_state = lead_obj.state
|
||||
account_object.billing_postcode = lead_obj.postcode
|
||||
account_object.billing_country = lead_obj.country
|
||||
for tag in lead_obj.tags.all():
|
||||
account_object.tags.add(tag)
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(CreateLeadView, self).get_context_data(**kwargs)
|
||||
context["lead_form"] = context["form"]
|
||||
if request.POST.getlist('assigned_to', []):
|
||||
# account_object.assigned_to.add(*request.POST.getlist('assigned_to'))
|
||||
assigned_to_list = request.POST.getlist('assigned_to')
|
||||
current_site = get_current_site(request)
|
||||
for assigned_to_user in assigned_to_list:
|
||||
user = get_object_or_404(User, pk=assigned_to_user)
|
||||
mail_subject = 'Assigned to account.'
|
||||
message = render_to_string('assigned_to/account_assigned.html', {
|
||||
'user': user,
|
||||
'domain': current_site.domain,
|
||||
'protocol': request.scheme,
|
||||
'account': account_object
|
||||
})
|
||||
email = EmailMessage(
|
||||
mail_subject, message, to=[user.email])
|
||||
email.content_subtype = "html"
|
||||
email.send()
|
||||
|
||||
account_object.save()
|
||||
success_url = reverse('leads:list')
|
||||
if request.POST.get("savenewform"):
|
||||
success_url = reverse("leads:add_lead")
|
||||
return JsonResponse({'error': False, 'success_url': success_url})
|
||||
|
||||
else:
|
||||
return JsonResponse({'error': True, 'errors': form.errors})
|
||||
|
||||
else:
|
||||
context = {}
|
||||
context["lead_form"] = form
|
||||
context["accounts"] = Account.objects.filter(status="open")
|
||||
context["users"] = self.users
|
||||
context["users"] = users
|
||||
context["countries"] = COUNTRIES
|
||||
context["status"] = LEAD_STATUS
|
||||
context["source"] = LEAD_SOURCE
|
||||
context["assignedto_list"] = [
|
||||
int(i) for i in self.request.POST.getlist('assigned_to', []) if i]
|
||||
int(i) for i in request.POST.getlist('assigned_to', []) if i]
|
||||
|
||||
return context
|
||||
return render(request, template_name, context)
|
||||
|
||||
|
||||
class LeadDetailView(LoginRequiredMixin, DetailView):
|
||||
|
|
@ -225,7 +212,8 @@ class LeadDetailView(LoginRequiredMixin, DetailView):
|
|||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(LeadDetailView, self).get_context_data(**kwargs)
|
||||
user_assgn_list = [i.id for i in context['object'].assigned_to.all()]
|
||||
user_assgn_list = [
|
||||
assigned_to.id for assigned_to in context['object'].assigned_to.all()]
|
||||
if self.request.user == context['object'].created_by:
|
||||
user_assgn_list.append(self.request.user.id)
|
||||
if self.request.user.role != "ADMIN" and not self.request.user.is_superuser:
|
||||
|
|
@ -262,168 +250,150 @@ class LeadDetailView(LoginRequiredMixin, DetailView):
|
|||
return context
|
||||
|
||||
|
||||
class UpdateLeadView(LoginRequiredMixin, UpdateView):
|
||||
model = Lead
|
||||
form_class = LeadForm
|
||||
def update_lead(request, pk):
|
||||
lead_record = Lead.objects.filter(pk=pk).first()
|
||||
template_name = "create_lead.html"
|
||||
users = User.objects.filter(is_active=True).order_by('email')
|
||||
status = request.GET.get('status', None)
|
||||
initial = {}
|
||||
if status and status == "converted":
|
||||
error = "This field is required."
|
||||
lead_record.status = "converted"
|
||||
initial.update({
|
||||
"status": status, "lead": lead_record.id})
|
||||
error = ""
|
||||
form = LeadForm(instance=lead_record, initial=initial, assigned_to=users)
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
self.error = ""
|
||||
self.users = User.objects.filter(is_active=True).order_by('email')
|
||||
return super(UpdateLeadView, self).dispatch(request, *args, **kwargs)
|
||||
|
||||
def get_initial(self):
|
||||
initial = super(UpdateLeadView, self).get_initial()
|
||||
status = self.request.GET.get('status', None)
|
||||
if status:
|
||||
initial.update({"status": status})
|
||||
return initial
|
||||
|
||||
def get_form_kwargs(self):
|
||||
kwargs = super(UpdateLeadView, self).get_form_kwargs()
|
||||
kwargs.update({"assigned_to": self.users})
|
||||
return kwargs
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
self.object = self.get_object()
|
||||
status = request.GET.get('status', None)
|
||||
if status:
|
||||
self.error = "This field is required."
|
||||
self.object.status = "converted"
|
||||
return super(UpdateLeadView, self).get(request, *args, **kwargs)
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
self.object = self.get_object()
|
||||
form = self.get_form()
|
||||
if request.POST:
|
||||
form = LeadForm(request.POST, request.FILES,
|
||||
instance=lead_record, initial=initial, assigned_to=users)
|
||||
|
||||
if request.POST.get('status') == "converted":
|
||||
form.fields['account_name'].required = True
|
||||
form.fields['email'].required = True
|
||||
else:
|
||||
form.fields['account_name'].required = False
|
||||
form.fields['email'].required = False
|
||||
if form.is_valid():
|
||||
return self.form_valid(form)
|
||||
assigned_to_ids = lead_record.assigned_to.all().values_list('id', flat=True)
|
||||
lead_obj = form.save(commit=False)
|
||||
lead_obj.save()
|
||||
lead_obj.tags.clear()
|
||||
all_members_list = []
|
||||
if request.POST.get('tags', ''):
|
||||
tags = request.POST.get("tags")
|
||||
splitted_tags = tags.split(",")
|
||||
for t in splitted_tags:
|
||||
tag = Tags.objects.filter(name=t)
|
||||
if tag:
|
||||
tag = tag[0]
|
||||
else:
|
||||
tag = Tags.objects.create(name=t)
|
||||
lead_obj.tags.add(tag)
|
||||
if request.POST.getlist('assigned_to', []):
|
||||
if request.POST.get('status') != "converted":
|
||||
|
||||
return self.form_invalid(form)
|
||||
current_site = get_current_site(request)
|
||||
|
||||
def form_valid(self, form):
|
||||
assigned_to_ids = self.get_object().assigned_to.all().values_list('id', flat=True)
|
||||
lead_obj = form.save(commit=False)
|
||||
lead_obj.save()
|
||||
lead_obj.tags.clear()
|
||||
all_members_list = []
|
||||
if self.request.POST.get('tags', ''):
|
||||
tags = self.request.POST.get("tags")
|
||||
splitted_tags = tags.split(",")
|
||||
for t in splitted_tags:
|
||||
tag = Tags.objects.filter(name=t)
|
||||
if tag:
|
||||
tag = tag[0]
|
||||
else:
|
||||
tag = Tags.objects.create(name=t)
|
||||
lead_obj.tags.add(tag)
|
||||
if self.request.POST.getlist('assigned_to', []):
|
||||
if self.request.POST.get('status') != "converted":
|
||||
assigned_form_users = form.cleaned_data.get(
|
||||
'assigned_to').values_list('id', flat=True)
|
||||
all_members_list = list(
|
||||
set(list(assigned_form_users)) - set(list(assigned_to_ids)))
|
||||
if len(all_members_list):
|
||||
for assigned_to_user in all_members_list:
|
||||
user = get_object_or_404(User, pk=assigned_to_user)
|
||||
mail_subject = 'Assigned to lead.'
|
||||
message = render_to_string('assigned_to/leads_assigned.html', {
|
||||
'user': user,
|
||||
'domain': current_site.domain,
|
||||
'protocol': request.scheme,
|
||||
'lead': lead_obj
|
||||
})
|
||||
email = EmailMessage(
|
||||
mail_subject, message, to=[user.email])
|
||||
email.content_subtype = "html"
|
||||
email.send()
|
||||
|
||||
current_site = get_current_site(self.request)
|
||||
lead_obj.assigned_to.clear()
|
||||
lead_obj.assigned_to.add(*request.POST.getlist('assigned_to'))
|
||||
else:
|
||||
lead_obj.assigned_to.clear()
|
||||
|
||||
assigned_form_users = form.cleaned_data.get(
|
||||
'assigned_to').values_list('id', flat=True)
|
||||
all_members_list = list(
|
||||
set(list(assigned_form_users)) - set(list(assigned_to_ids)))
|
||||
if len(all_members_list):
|
||||
for assigned_to_user in all_members_list:
|
||||
if request.FILES.get('lead_attachment'):
|
||||
attachment = Attachments()
|
||||
attachment.created_by = request.user
|
||||
attachment.file_name = request.FILES.get(
|
||||
'lead_attachment').name
|
||||
attachment.lead = lead_obj
|
||||
attachment.attachment = request.FILES.get('lead_attachment')
|
||||
attachment.save()
|
||||
|
||||
if request.POST.get('status') == "converted":
|
||||
account_object = Account.objects.create(
|
||||
created_by=request.user, name=lead_obj.account_name,
|
||||
email=lead_obj.email, phone=lead_obj.phone,
|
||||
description=request.POST.get('description'),
|
||||
website=request.POST.get('website'),
|
||||
lead=lead_obj
|
||||
)
|
||||
account_object.billing_address_line = lead_obj.address_line
|
||||
account_object.billing_street = lead_obj.street
|
||||
account_object.billing_city = lead_obj.city
|
||||
account_object.billing_state = lead_obj.state
|
||||
account_object.billing_postcode = lead_obj.postcode
|
||||
account_object.billing_country = lead_obj.country
|
||||
for tag in lead_obj.tags.all():
|
||||
account_object.tags.add(tag)
|
||||
if request.POST.getlist('assigned_to', []):
|
||||
# account_object.assigned_to.add(*request.POST.getlist('assigned_to'))
|
||||
assigned_to_list = request.POST.getlist('assigned_to')
|
||||
current_site = get_current_site(request)
|
||||
for assigned_to_user in assigned_to_list:
|
||||
user = get_object_or_404(User, pk=assigned_to_user)
|
||||
mail_subject = 'Assigned to lead.'
|
||||
message = render_to_string('assigned_to/leads_assigned.html', {
|
||||
mail_subject = 'Assigned to account.'
|
||||
message = render_to_string('assigned_to/account_assigned.html', {
|
||||
'user': user,
|
||||
'domain': current_site.domain,
|
||||
'protocol': self.request.scheme,
|
||||
'lead': lead_obj
|
||||
'protocol': request.scheme,
|
||||
'account': account_object
|
||||
})
|
||||
email = EmailMessage(
|
||||
mail_subject, message, to=[user.email])
|
||||
email.content_subtype = "html"
|
||||
email.send()
|
||||
|
||||
lead_obj.assigned_to.clear()
|
||||
lead_obj.assigned_to.add(*self.request.POST.getlist('assigned_to'))
|
||||
account_object.save()
|
||||
status = request.GET.get('status', None)
|
||||
success_url = reverse('leads:list')
|
||||
if status:
|
||||
success_url = reverse('accounts:list')
|
||||
return JsonResponse({'error': False, 'success_url': success_url})
|
||||
|
||||
else:
|
||||
lead_obj.assigned_to.clear()
|
||||
return JsonResponse({'error': True, 'errors': form.errors})
|
||||
|
||||
if self.request.FILES.get('lead_attachment'):
|
||||
attachment = Attachments()
|
||||
attachment.created_by = self.request.user
|
||||
attachment.file_name = self.request.FILES.get(
|
||||
'lead_attachment').name
|
||||
attachment.lead = lead_obj
|
||||
attachment.attachment = self.request.FILES.get('lead_attachment')
|
||||
attachment.save()
|
||||
|
||||
if self.request.POST.get('status') == "converted":
|
||||
account_object = Account.objects.create(
|
||||
created_by=self.request.user, name=lead_obj.account_name,
|
||||
email=lead_obj.email, phone=lead_obj.phone,
|
||||
description=self.request.POST.get('description'),
|
||||
website=self.request.POST.get('website')
|
||||
)
|
||||
account_object.billing_address_line = lead_obj.address_line
|
||||
account_object.billing_street = lead_obj.street
|
||||
account_object.billing_city = lead_obj.city
|
||||
account_object.billing_state = lead_obj.state
|
||||
account_object.billing_postcode = lead_obj.postcode
|
||||
account_object.billing_country = lead_obj.country
|
||||
for tag in lead_obj.tags.all():
|
||||
account_object.tags.add(tag)
|
||||
if self.request.POST.getlist('assigned_to', []):
|
||||
# account_object.assigned_to.add(*self.request.POST.getlist('assigned_to'))
|
||||
assigned_to_list = self.request.POST.getlist('assigned_to')
|
||||
current_site = get_current_site(self.request)
|
||||
for assigned_to_user in assigned_to_list:
|
||||
user = get_object_or_404(User, pk=assigned_to_user)
|
||||
mail_subject = 'Assigned to account.'
|
||||
message = render_to_string('assigned_to/account_assigned.html', {
|
||||
'user': user,
|
||||
'domain': current_site.domain,
|
||||
'protocol': self.request.scheme,
|
||||
'account': account_object
|
||||
})
|
||||
email = EmailMessage(
|
||||
mail_subject, message, to=[user.email])
|
||||
email.content_subtype = "html"
|
||||
email.send()
|
||||
|
||||
account_object.save()
|
||||
status = self.request.GET.get('status', None)
|
||||
if status:
|
||||
return redirect('accounts:list')
|
||||
|
||||
return redirect('leads:list')
|
||||
|
||||
def form_invalid(self, form):
|
||||
return self.render_to_response(
|
||||
self.get_context_data(form=form))
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(UpdateLeadView, self).get_context_data(**kwargs)
|
||||
context["lead_obj"] = self.object
|
||||
else:
|
||||
context = {}
|
||||
context["lead_obj"] = lead_record
|
||||
user_assgn_list = [
|
||||
i.id for i in context["lead_obj"].assigned_to.all()]
|
||||
if self.request.user == context['lead_obj'].created_by:
|
||||
user_assgn_list.append(self.request.user.id)
|
||||
if self.request.user.role != "ADMIN" and not self.request.user.is_superuser:
|
||||
if self.request.user.id not in user_assgn_list:
|
||||
assigned_to.id for assigned_to in lead_record.assigned_to.all()]
|
||||
if request.user == lead_record.created_by:
|
||||
user_assgn_list.append(request.user.id)
|
||||
if request.user.role != "ADMIN" and not request.user.is_superuser:
|
||||
if request.user.id not in user_assgn_list:
|
||||
raise PermissionDenied
|
||||
context["lead_form"] = context["form"]
|
||||
|
||||
context["lead_form"] = form
|
||||
context["accounts"] = Account.objects.filter(status="open")
|
||||
context["users"] = self.users
|
||||
context["users"] = users
|
||||
context["countries"] = COUNTRIES
|
||||
context["status"] = LEAD_STATUS
|
||||
context["source"] = LEAD_SOURCE
|
||||
context["error"] = self.error
|
||||
context["error"] = error
|
||||
context["assignedto_list"] = [
|
||||
int(i) for i in self.request.POST.getlist('assigned_to', []) if i]
|
||||
int(i) for i in request.POST.getlist('assigned_to', []) if i]
|
||||
|
||||
return context
|
||||
return render(request, template_name, context)
|
||||
|
||||
|
||||
class DeleteLeadView(LoginRequiredMixin, View):
|
||||
|
|
@ -433,52 +403,54 @@ class DeleteLeadView(LoginRequiredMixin, View):
|
|||
|
||||
def post(self, request, *args, **kwargs):
|
||||
self.object = get_object_or_404(Lead, id=kwargs.get("pk"))
|
||||
if self.request.user.role == "ADMIN" or self.request.user.is_superuser or self.request.user == self.object.created_by:
|
||||
if (
|
||||
self.request.user.role == "ADMIN" or self.request.user.is_superuser or
|
||||
self.request.user == self.object.created_by
|
||||
):
|
||||
self.object.delete()
|
||||
return redirect("leads:list")
|
||||
else:
|
||||
raise PermissionDenied
|
||||
|
||||
|
||||
class ConvertLeadView(LoginRequiredMixin, View):
|
||||
def convert_lead(request, pk):
|
||||
lead_obj = get_object_or_404(Lead, id=pk)
|
||||
if lead_obj.account_name and lead_obj.email:
|
||||
lead_obj.status = 'converted'
|
||||
lead_obj.save()
|
||||
account_object = Account.objects.create(
|
||||
created_by=request.user, name=lead_obj.account_name,
|
||||
email=lead_obj.email, phone=lead_obj.phone,
|
||||
description=lead_obj.description,
|
||||
website=lead_obj.website,
|
||||
billing_address_line=lead_obj.address_line,
|
||||
billing_street=lead_obj.street,
|
||||
billing_city=lead_obj.city,
|
||||
billing_state=lead_obj.state,
|
||||
billing_postcode=lead_obj.postcode,
|
||||
billing_country=lead_obj.country,
|
||||
lead=lead_obj
|
||||
)
|
||||
contacts_list = lead_obj.contacts.all().values_list('id', flat=True)
|
||||
account_object.contacts.add(*contacts_list)
|
||||
account_object.save()
|
||||
current_site = get_current_site(request)
|
||||
for assigned_to_user in lead_obj.assigned_to.all().values_list('id', flat=True):
|
||||
user = get_object_or_404(User, pk=assigned_to_user)
|
||||
mail_subject = 'Assigned to account.'
|
||||
message = render_to_string('assigned_to/account_assigned.html', {
|
||||
'user': user,
|
||||
'domain': current_site.domain,
|
||||
'protocol': request.scheme,
|
||||
'account': account_object
|
||||
})
|
||||
email = EmailMessage(mail_subject, message, to=[user.email])
|
||||
email.content_subtype = "html"
|
||||
email.send()
|
||||
return redirect("accounts:list")
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
lead_obj = get_object_or_404(Lead, id=kwargs.get("pk"))
|
||||
if lead_obj.account_name:
|
||||
lead_obj.status = 'converted'
|
||||
lead_obj.save()
|
||||
account_object = Account.objects.create(
|
||||
created_by=request.user, name=lead_obj.account_name,
|
||||
email=lead_obj.email, phone=lead_obj.phone,
|
||||
description=lead_obj.description,
|
||||
website=lead_obj.website,
|
||||
billing_address_line=lead_obj.address_line,
|
||||
billing_street=lead_obj.street,
|
||||
billing_city=lead_obj.city,
|
||||
billing_state=lead_obj.state,
|
||||
billing_postcode=lead_obj.postcode,
|
||||
billing_country=lead_obj.country
|
||||
)
|
||||
assignedto_list = lead_obj.assigned_to.all().values_list('id', flat=True)
|
||||
# account_object.assigned_to.add(*assignedto_list)
|
||||
account_object.save()
|
||||
current_site = get_current_site(self.request)
|
||||
for assigned_to_user in assignedto_list:
|
||||
user = get_object_or_404(User, pk=assigned_to_user)
|
||||
mail_subject = 'Assigned to account.'
|
||||
message = render_to_string('assigned_to/account_assigned.html', {
|
||||
'user': user,
|
||||
'domain': current_site.domain,
|
||||
'protocol': self.request.scheme,
|
||||
'account': account_object
|
||||
})
|
||||
email = EmailMessage(mail_subject, message, to=[user.email])
|
||||
email.content_subtype = "html"
|
||||
email.send()
|
||||
return redirect("accounts:list")
|
||||
|
||||
return HttpResponseRedirect(
|
||||
reverse('leads:edit_lead', kwargs={'pk': lead_obj.id}) + '?status=converted')
|
||||
return HttpResponseRedirect(
|
||||
reverse('leads:edit_lead', kwargs={'pk': lead_obj.id}) + '?status=converted')
|
||||
|
||||
|
||||
class AddCommentView(LoginRequiredMixin, CreateView):
|
||||
|
|
|
|||
|
|
@ -13,12 +13,10 @@
|
|||
{% endblock %}
|
||||
{% block content %}
|
||||
<head>
|
||||
<link rel="stylesheet" type="text/css" href="//xoxco.com/projects/code/tagsinput/jquery.tagsinput.css" />
|
||||
<script type="text/javascript" src="//xoxco.com/projects/code/tagsinput/jquery.tagsinput.js"></script>
|
||||
<script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/jquery-ui.min.js'></script>
|
||||
<link rel="stylesheet" type="text/css" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/themes/start/jquery-ui.css" />
|
||||
<link href="https://cdnjs.cloudflare.com/ajax/libs/jquery-tagsinput/1.3.6/jquery.tagsinput.min.css" rel="stylesheet">
|
||||
</head>
|
||||
<form class= "form_user" method="POST" action="" novalidate enctype="multipart/form-data">
|
||||
<form id="id_opportunity_form" class="form_user" method="POST" action="" novalidate enctype="multipart/form-data">
|
||||
<div class="overview_form_block row marl justify-content-center">
|
||||
<div class="col-md-9">
|
||||
<div class="card">
|
||||
|
|
@ -32,7 +30,7 @@
|
|||
<div class="form-group">
|
||||
<label for="exampleInputEmail1" class="required">Name{% if opportunity_form.name.field.required %}<span class="error">*</span>{% endif %}</label>
|
||||
{{ opportunity_form.name }}
|
||||
<span class="error">{{opportunity_form.name.errors}}</span>
|
||||
<span class="error error_message" id="error_id_name">{{opportunity_form.name.errors}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter_col col-md-12">
|
||||
|
|
@ -45,28 +43,28 @@
|
|||
{% else %}
|
||||
{{opportunity_form.account}}
|
||||
{% endif %}
|
||||
<span class="error">{{opportunity_form.account.errors}}</span>
|
||||
<span class="error error_message" id="error_id_account">{{opportunity_form.account.errors}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter_col col-md-12">
|
||||
<div class="form-group">
|
||||
<label for="exampleInputEmail1">Amount</label>
|
||||
{{ opportunity_form.amount }}
|
||||
<span class="error">{{opportunity_form.amount.errors}}</span>
|
||||
<span class="error error_message" id="error_id_amount">{{opportunity_form.amount.errors}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter_col col-md-12">
|
||||
<div class="form-group">
|
||||
<label for="exampleInputEmail1">Currency</label>
|
||||
{{ opportunity_form.currency }}
|
||||
<span class="error">{{opportunity_form.currency.errors}}</span>
|
||||
<span class="error error_message" id="error_id_currency">{{opportunity_form.currency.errors}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter_col col-md-12">
|
||||
<div class="form-group">
|
||||
<label for="exampleInputEmail1" class="required">Stage{% if opportunity_form.stage.field.required %}<span class="error">*</span>{% endif %}</label>
|
||||
{{ opportunity_form.stage }}
|
||||
<span class="error">{{opportunity_form.stage.errors}}</span>
|
||||
<span class="error error_message" id="error_id_stage">{{opportunity_form.stage.errors}}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -75,14 +73,14 @@
|
|||
<div class="form-group">
|
||||
<label for="exampleInputEmail1">Lead Source{% if opportunity_form.lead_source.field.required %}<span class="error">*</span>{% endif %}</label>
|
||||
{{ opportunity_form.lead_source }}
|
||||
<span class="error">{{opportunity_form.lead_source.errors}}</span>
|
||||
<span class="error error_message" id="error_id_lead_source">{{opportunity_form.lead_source.errors}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter_col col-md-12">
|
||||
<div class="form-group">
|
||||
<label for="exampleInputEmail1">Probability %{% if opportunity_form.probability.field.required %}<span class="error">*</span>{% endif %}</label>
|
||||
{{ opportunity_form.probability }}
|
||||
<span class="error">{{opportunity_form.probability.errors}}</span>
|
||||
<span class="error error_message" id="error_id_probability">{{opportunity_form.probability.errors}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter_col col-md-12">
|
||||
|
|
@ -99,7 +97,7 @@
|
|||
<div class="form-group">
|
||||
<label for="exampleInputEmail1">Contacts{% if opportunity_form.contacts.field.required %}<span class="error">*</span>{% endif %}</label>
|
||||
{{ opportunity_form.contacts }}
|
||||
<span class="error">{{opportunity_form.contacts.errors}}</span>
|
||||
<span class="error error_message" id="error_id_contacts">{{opportunity_form.contacts.errors}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter_col col-md-12">
|
||||
|
|
@ -111,7 +109,7 @@
|
|||
<span class="glyphicon glyphicon-calendar"></span>
|
||||
</span>
|
||||
</div>
|
||||
<span class="error">{{opportunity_form.closed_on.errors}}</span>
|
||||
<span class="error error_message" id="error_id_closed_on">{{opportunity_form.closed_on.errors}}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -126,18 +124,20 @@
|
|||
<div class="form-group col-md-12">
|
||||
<label for="exampleInputEmail1" >Description{% if opportunity_form.description.field.required %}<span class="error">*</span>{% endif %}</label>
|
||||
{{ opportunity_form.description }}
|
||||
<span class="error">{{opportunity_form.description.errors}}</span>
|
||||
<span class="error error_message" id="error_id_description">{{opportunity_form.description.errors}}</span>
|
||||
</div>
|
||||
<div class="filter_col col-md-12">
|
||||
<div class="form-group">
|
||||
<label for="exampleInputEmail1">Attachment</label>
|
||||
<input type="file" name="oppurtunity_attachment">
|
||||
<input type="file" name="oppurtunity_attachment" id="oppurtunity_attachment">
|
||||
{% if opportunity_obj.opportunity_attachment.count %}
|
||||
{% for i in opportunity_obj.opportunity_attachment.all %}
|
||||
<span id="attachment{{i.id}}">
|
||||
<a target="_blank" href="{{i.attachment.url}}">{{i.file_name}}</a>
|
||||
<a class="action btn primary_btn" onclick="remove_attachment({{i.id}})">X</a>
|
||||
</span>
|
||||
{% for attachment in opportunity_obj.opportunity_attachment.all %}
|
||||
<div id="attachment{{attachment.id}}" class="mt-2">
|
||||
<a target="_blank" href="{{ attachment.attachment.url }}">{{ attachment.file_name }}</a>
|
||||
{% if not attachment.created_by.role == 'ADMIN' or attachment.created_by.role == request.user.role %}
|
||||
<a class="action btn primary_btn" onclick="remove_attachment({{attachment.id}})">X</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
<span class="error"></span>
|
||||
|
|
@ -154,7 +154,7 @@
|
|||
</div>
|
||||
<!-- overview ends here -->
|
||||
<div class="row marl buttons_row text-center form_btn_row">
|
||||
<button class=" btn btn-default save" type="submit" id="saveform">Save</button>
|
||||
<button class=" btn btn-default save" type="submit" id="submit_btn">Save</button>
|
||||
{% if not opportunity_obj %}
|
||||
<button class="btn btn-success save savenew" type="submit">Save & New</button>
|
||||
{% endif %}
|
||||
|
|
@ -164,12 +164,77 @@
|
|||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div class="row marl justify-content-center text-center mt-5 mb-5" id="progress_bar">
|
||||
<!-- <div class="mt-5 mb-5"></div> -->
|
||||
<div class="progress position-relative" style="width:40%;height:1.5rem;">
|
||||
<span class="justify-content-center d-flex position-absolute w-100 percent">0%</span>
|
||||
<div class="progress-bar bar"></div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block js_block %}
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script>
|
||||
<link href="https://cdnjs.cloudflare.com/ajax/libs/jquery-tagsinput/1.3.6/jquery.tagsinput.min.css" rel="stylesheet">
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-tagsinput/1.3.6/jquery.tagsinput.min.js"></script>
|
||||
<script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/jquery-ui.min.js'></script>
|
||||
<script src="https://malsup.github.io/jquery.form.js"></script>
|
||||
<script type="text/javascript">
|
||||
var bar = $('.bar');
|
||||
var percent = $('.percent');
|
||||
|
||||
$('#progress_bar').hide()
|
||||
|
||||
$('form#id_opportunity_form').ajaxForm({
|
||||
type:'POST',
|
||||
dataType:'json',
|
||||
url: ".",
|
||||
data:$('#id_opportunity_form').serialize(),
|
||||
beforeSubmit: disableButton,
|
||||
beforeSend: function() {
|
||||
var percentVal = '0%';
|
||||
bar.width(percentVal);
|
||||
percent.html(percentVal);
|
||||
},
|
||||
uploadProgress: function(event, position, total, percentComplete) {
|
||||
var percentVal = percentComplete + '%';
|
||||
bar.width(percentVal);
|
||||
if (percentVal == '100%'){
|
||||
percent.html('Uploading ...')
|
||||
}
|
||||
else{
|
||||
percent.html(percentVal);
|
||||
}
|
||||
},
|
||||
success: function(data) {
|
||||
if(data.error){
|
||||
$('#progress_bar').hide()
|
||||
$('.error_message').html('')
|
||||
for (var key in data.errors) {
|
||||
$('#error_id_'+key).html("<p>" + data.errors[key][0] + "</p>");
|
||||
};
|
||||
$('#submit_btn').removeAttr('disabled')
|
||||
}
|
||||
else{
|
||||
window.location = data.success_url;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$('#submit_btn').click(function() {
|
||||
var file = $('#oppurtunity_attachment')[0].files[0];
|
||||
if(file && file.name.length>0){
|
||||
var percentVal = '0%';
|
||||
bar.width(percentVal);
|
||||
percent.html(percentVal);
|
||||
$('#progress_bar').show()
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
function disableButton(){
|
||||
// $('#progress_bar').show()
|
||||
$('#submit_btn').attr('disabled','disabled')
|
||||
}
|
||||
|
||||
$(function () {
|
||||
var date = new Date();
|
||||
var today = new Date(date.getFullYear(), date.getMonth(), date.getDate());
|
||||
|
|
@ -182,7 +247,7 @@
|
|||
$(".savenew").on('click', function(e){
|
||||
e.preventDefault()
|
||||
$("#save_new_form").val('true')
|
||||
$('.form_user').submit()
|
||||
$('#id_opportunity_form').submit()
|
||||
});
|
||||
$(document).ready(function() {
|
||||
$('.assigned_users').select2();
|
||||
|
|
|
|||
|
|
@ -68,7 +68,8 @@ class OpportunityCreateTestCase(OpportunityModel, TestCase):
|
|||
url = '/opportunities/create/'
|
||||
data = {'name': "meghana", 'amount': "500", 'stage': "CLOSED WON"}
|
||||
response = self.client.post(url, data)
|
||||
self.assertEqual(response.status_code, 302)
|
||||
# self.assertEqual(response.status_code, 302)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
def test_opportunity_invalid(self):
|
||||
url = '/opportunities/create/'
|
||||
|
|
@ -114,7 +115,8 @@ class EditOpportunityTestCase(OpportunityModel, TestCase):
|
|||
'name': "madhurima", 'amount': "478", 'stage': "QUALIFICATION",
|
||||
'probability': "58", 'closed_on': "2016-05-04", 'description': "hgfdxc"}
|
||||
response = self.client.post(url, data)
|
||||
self.assertEqual(response.status_code, 302)
|
||||
# self.assertEqual(response.status_code, 302)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
def test_update_opportunity_invalid(self):
|
||||
url = '/opportunities/' + str(self.opportunity.id) + '/edit/'
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
from django.urls import path
|
||||
from opportunity.views import (
|
||||
OpportunityListView, CreateOpportunityView, OpportunityDetailView, UpdateOpportunityView,
|
||||
OpportunityListView, create_opportunity, OpportunityDetailView, update_opportunity,
|
||||
DeleteOpportunityView, GetContactView, GetOpportunitiesView, AddCommentView,
|
||||
UpdateCommentView, DeleteCommentView, AddAttachmentsView)
|
||||
|
||||
|
|
@ -10,9 +10,9 @@ app_name = 'opportunity'
|
|||
|
||||
urlpatterns = [
|
||||
path('list/', OpportunityListView.as_view(), name='list'),
|
||||
path('create/', CreateOpportunityView.as_view(), name='save'),
|
||||
path('create/', create_opportunity, name='save'),
|
||||
path('<int:pk>/view/', OpportunityDetailView.as_view(), name="opp_view"),
|
||||
path('<int:pk>/edit/', UpdateOpportunityView.as_view(), name="opp_edit"),
|
||||
path('<int:pk>/edit/', update_opportunity, name="opp_edit"),
|
||||
path('<int:pk>/delete/', DeleteOpportunityView.as_view(), name="opp_remove"),
|
||||
|
||||
path('contacts/', GetContactView.as_view(), name="contacts"),
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ from django.contrib.auth.mixins import LoginRequiredMixin
|
|||
from django.contrib.sites.shortcuts import get_current_site
|
||||
from django.core.mail import EmailMessage
|
||||
from django.http import JsonResponse
|
||||
from django.shortcuts import get_object_or_404, redirect
|
||||
from django.shortcuts import get_object_or_404, redirect, render
|
||||
from django.template.loader import render_to_string
|
||||
from django.views.generic import CreateView, UpdateView, DetailView, ListView, TemplateView, View
|
||||
from accounts.models import Account, Tags
|
||||
|
|
@ -71,114 +71,98 @@ class OpportunityListView(LoginRequiredMixin, TemplateView):
|
|||
return self.render_to_response(context)
|
||||
|
||||
|
||||
class CreateOpportunityView(LoginRequiredMixin, CreateView):
|
||||
model = Opportunity
|
||||
form_class = OpportunityForm
|
||||
def create_opportunity(request):
|
||||
template_name = "create_opportunity.html"
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
self.users = User.objects.filter(is_active=True).order_by('email')
|
||||
self.accounts = Account.objects.filter(status="open")
|
||||
self.contacts = Contact.objects.all()
|
||||
if self.request.user.role != "ADMIN" and not self.request.user.is_superuser:
|
||||
self.accounts = Account.objects.filter(
|
||||
created_by=self.request.user)
|
||||
self.contacts = Contact.objects.filter(
|
||||
Q(assigned_to__in=[self.request.user]) | Q(created_by=self.request.user))
|
||||
return super(CreateOpportunityView, self).dispatch(request, *args, **kwargs)
|
||||
users = User.objects.filter(is_active=True).order_by('email')
|
||||
accounts = Account.objects.filter(status="open")
|
||||
contacts = Contact.objects.all()
|
||||
if request.user.role != "ADMIN" and not request.user.is_superuser:
|
||||
accounts = Account.objects.filter(
|
||||
created_by=request.user)
|
||||
contacts = Contact.objects.filter(
|
||||
Q(assigned_to__in=[request.user]) | Q(created_by=request.user))
|
||||
|
||||
def get_form_kwargs(self):
|
||||
kwargs = super(CreateOpportunityView, self).get_form_kwargs()
|
||||
kwargs.update({"assigned_to": self.users, "account": self.accounts,
|
||||
"contacts": self.contacts})
|
||||
return kwargs
|
||||
kwargs_data = {"assigned_to": users, "account": accounts, "contacts": contacts}
|
||||
form = OpportunityForm(**kwargs_data)
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
self.object = None
|
||||
form = self.get_form()
|
||||
if request.POST:
|
||||
form = OpportunityForm(request.POST, request.FILES, **kwargs_data)
|
||||
if form.is_valid():
|
||||
return self.form_valid(form)
|
||||
return self.form_invalid(form)
|
||||
opportunity_obj = form.save(commit=False)
|
||||
opportunity_obj.created_by = request.user
|
||||
if request.POST.get('stage') in ['CLOSED WON', 'CLOSED LOST']:
|
||||
opportunity_obj.closed_by = request.user
|
||||
opportunity_obj.save()
|
||||
if request.POST.getlist('assigned_to', []):
|
||||
opportunity_obj.assigned_to.add(
|
||||
*request.POST.getlist('assigned_to'))
|
||||
assigned_to_list = request.POST.getlist('assigned_to')
|
||||
current_site = get_current_site(request)
|
||||
for assigned_to_user in assigned_to_list:
|
||||
user = get_object_or_404(User, pk=assigned_to_user)
|
||||
mail_subject = 'Assigned to opportunity.'
|
||||
message = render_to_string('assigned_to/opportunity_assigned.html', {
|
||||
'user': user,
|
||||
'domain': current_site.domain,
|
||||
'protocol': request.scheme,
|
||||
'opportunity': opportunity_obj
|
||||
})
|
||||
email = EmailMessage(mail_subject, message, to=[user.email])
|
||||
email.content_subtype = "html"
|
||||
email.send()
|
||||
if request.POST.getlist('contacts', []):
|
||||
opportunity_obj.contacts.add(
|
||||
*request.POST.getlist('contacts'))
|
||||
if request.POST.get('tags', ''):
|
||||
tags = request.POST.get("tags")
|
||||
splitted_tags = tags.split(",")
|
||||
for t in splitted_tags:
|
||||
tag = Tags.objects.filter(name=t.lower())
|
||||
if tag:
|
||||
tag = tag[0]
|
||||
else:
|
||||
tag = Tags.objects.create(name=t.lower())
|
||||
opportunity_obj.tags.add(tag)
|
||||
if request.FILES.get('oppurtunity_attachment'):
|
||||
attachment = Attachments()
|
||||
attachment.created_by = request.user
|
||||
attachment.file_name = request.FILES.get(
|
||||
'oppurtunity_attachment').name
|
||||
attachment.opportunity = opportunity_obj
|
||||
attachment.attachment = request.FILES.get(
|
||||
'oppurtunity_attachment')
|
||||
attachment.save()
|
||||
success_url = reverse('opportunities:list')
|
||||
if request.POST.get("savenewform"):
|
||||
success_url = reverse("opportunities:save")
|
||||
if request.POST.get('from_account'):
|
||||
from_account = request.POST.get('from_account')
|
||||
success_url = reverse("accounts:view_account", pk=from_account)
|
||||
return JsonResponse({'error': False, 'success_url': success_url})
|
||||
|
||||
def form_valid(self, form):
|
||||
opportunity_obj = form.save(commit=False)
|
||||
opportunity_obj.created_by = self.request.user
|
||||
if self.request.POST.get('stage') in ['CLOSED WON', 'CLOSED LOST']:
|
||||
opportunity_obj.closed_by = self.request.user
|
||||
opportunity_obj.save()
|
||||
if self.request.POST.getlist('assigned_to', []):
|
||||
opportunity_obj.assigned_to.add(
|
||||
*self.request.POST.getlist('assigned_to'))
|
||||
assigned_to_list = self.request.POST.getlist('assigned_to')
|
||||
current_site = get_current_site(self.request)
|
||||
for assigned_to_user in assigned_to_list:
|
||||
user = get_object_or_404(User, pk=assigned_to_user)
|
||||
mail_subject = 'Assigned to opportunity.'
|
||||
message = render_to_string('assigned_to/opportunity_assigned.html', {
|
||||
'user': user,
|
||||
'domain': current_site.domain,
|
||||
'protocol': self.request.scheme,
|
||||
'opportunity': opportunity_obj
|
||||
})
|
||||
email = EmailMessage(mail_subject, message, to=[user.email])
|
||||
email.content_subtype = "html"
|
||||
email.send()
|
||||
if self.request.POST.getlist('contacts', []):
|
||||
opportunity_obj.contacts.add(
|
||||
*self.request.POST.getlist('contacts'))
|
||||
if self.request.POST.get('tags', ''):
|
||||
tags = self.request.POST.get("tags")
|
||||
splitted_tags = tags.split(",")
|
||||
for t in splitted_tags:
|
||||
tag = Tags.objects.filter(name=t.lower())
|
||||
if tag:
|
||||
tag = tag[0]
|
||||
else:
|
||||
tag = Tags.objects.create(name=t.lower())
|
||||
opportunity_obj.tags.add(tag)
|
||||
if self.request.FILES.get('oppurtunity_attachment'):
|
||||
attachment = Attachments()
|
||||
attachment.created_by = self.request.user
|
||||
attachment.file_name = self.request.FILES.get(
|
||||
'oppurtunity_attachment').name
|
||||
attachment.opportunity = opportunity_obj
|
||||
attachment.attachment = self.request.FILES.get(
|
||||
'oppurtunity_attachment')
|
||||
attachment.save()
|
||||
if self.request.is_ajax():
|
||||
return JsonResponse({'error': False})
|
||||
if self.request.POST.get("savenewform"):
|
||||
return redirect("opportunities:save")
|
||||
if self.request.POST.get('from_account'):
|
||||
from_account = self.request.POST.get('from_account')
|
||||
return redirect("accounts:view_account", pk=from_account)
|
||||
return redirect('opportunities:list')
|
||||
else:
|
||||
return JsonResponse({'error': True, 'errors': form.errors})
|
||||
|
||||
def form_invalid(self, form):
|
||||
if self.request.is_ajax():
|
||||
return JsonResponse({'error': True, 'opportunity_errors': form.errors})
|
||||
return self.render_to_response(
|
||||
self.get_context_data(form=form))
|
||||
else:
|
||||
context = {}
|
||||
context["opportunity_form"] = form
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(CreateOpportunityView, self).get_context_data(**kwargs)
|
||||
context["opportunity_form"] = context["form"]
|
||||
|
||||
context["accounts"] = self.accounts
|
||||
if self.request.GET.get('view_account'):
|
||||
context["accounts"] = accounts
|
||||
if request.GET.get('view_account'):
|
||||
context['account'] = get_object_or_404(
|
||||
Account, id=self.request.GET.get('view_account'))
|
||||
context["contacts"] = self.contacts
|
||||
context["users"] = self.users
|
||||
Account, id=request.GET.get('view_account'))
|
||||
context["contacts"] = contacts
|
||||
context["users"] = users
|
||||
context["currencies"] = CURRENCY_CODES
|
||||
context["stages"] = STAGES
|
||||
context["sources"] = SOURCES
|
||||
context["assignedto_list"] = [
|
||||
int(i) for i in self.request.POST.getlist('assigned_to', []) if i]
|
||||
int(i) for i in request.POST.getlist('assigned_to', []) if i]
|
||||
|
||||
context["contacts_list"] = [
|
||||
int(i) for i in self.request.POST.getlist('contacts', []) if i]
|
||||
return context
|
||||
int(i) for i in request.POST.getlist('contacts', []) if i]
|
||||
return render(request, template_name, context)
|
||||
|
||||
|
||||
class OpportunityDetailView(LoginRequiredMixin, DetailView):
|
||||
|
|
@ -193,7 +177,7 @@ class OpportunityDetailView(LoginRequiredMixin, DetailView):
|
|||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(OpportunityDetailView, self).get_context_data(**kwargs)
|
||||
user_assgn_list = [i.id for i in context['object'].assigned_to.all()]
|
||||
user_assgn_list = [assigned_to.id for assigned_to in context['object'].assigned_to.all()]
|
||||
if self.request.user == context['object'].created_by:
|
||||
user_assgn_list.append(self.request.user.id)
|
||||
if self.request.user.role != "ADMIN" and not self.request.user.is_superuser:
|
||||
|
|
@ -213,133 +197,116 @@ class OpportunityDetailView(LoginRequiredMixin, DetailView):
|
|||
return context
|
||||
|
||||
|
||||
class UpdateOpportunityView(LoginRequiredMixin, UpdateView):
|
||||
model = Opportunity
|
||||
form_class = OpportunityForm
|
||||
def update_opportunity(request, pk):
|
||||
template_name = "create_opportunity.html"
|
||||
opportunity_object = Opportunity.objects.filter(pk=pk).first()
|
||||
users = User.objects.filter(is_active=True).order_by('email')
|
||||
accounts = Account.objects.filter(status="open")
|
||||
contacts = Contact.objects.all()
|
||||
if request.user.role != "ADMIN" and not request.user.is_superuser:
|
||||
accounts = Account.objects.filter(
|
||||
created_by=request.user)
|
||||
contacts = Contact.objects.filter(
|
||||
Q(assigned_to__in=[request.user]) | Q(created_by=request.user))
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
self.users = User.objects.filter(is_active=True).order_by('email')
|
||||
self.accounts = Account.objects.filter(status="open")
|
||||
self.contacts = Contact.objects.all()
|
||||
if self.request.user.role != "ADMIN" and not self.request.user.is_superuser:
|
||||
self.accounts = Account.objects.filter(
|
||||
created_by=self.request.user)
|
||||
self.contacts = Contact.objects.filter(
|
||||
Q(assigned_to__in=[self.request.user]) | Q(created_by=self.request.user))
|
||||
return super(UpdateOpportunityView, self).dispatch(request, *args, **kwargs)
|
||||
kwargs_data = {"assigned_to": users, "account": accounts, "contacts": contacts}
|
||||
form = OpportunityForm(instance=opportunity_object, **kwargs_data)
|
||||
|
||||
def get_form_kwargs(self):
|
||||
kwargs = super(UpdateOpportunityView, self).get_form_kwargs()
|
||||
kwargs.update({"assigned_to": self.users, "account": self.accounts,
|
||||
"contacts": self.contacts})
|
||||
return kwargs
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
self.object = self.get_object()
|
||||
form = self.get_form()
|
||||
if request.POST:
|
||||
form = form = OpportunityForm(request.POST, request.FILES, instance=opportunity_object, **kwargs_data)
|
||||
if form.is_valid():
|
||||
return self.form_valid(form)
|
||||
return self.form_invalid(form)
|
||||
assigned_to_ids = opportunity_object.assigned_to.all().values_list('id', flat=True)
|
||||
opportunity_obj = form.save(commit=False)
|
||||
if request.POST.get('stage') in ['CLOSED WON', 'CLOSED LOST']:
|
||||
opportunity_obj.closed_by = request.user
|
||||
opportunity_obj.save()
|
||||
|
||||
def form_valid(self, form):
|
||||
assigned_to_ids = self.get_object().assigned_to.all().values_list('id', flat=True)
|
||||
opportunity_obj = form.save(commit=False)
|
||||
if self.request.POST.get('stage') in ['CLOSED WON', 'CLOSED LOST']:
|
||||
opportunity_obj.closed_by = self.request.user
|
||||
opportunity_obj.save()
|
||||
opportunity_obj.contacts.clear()
|
||||
all_members_list = []
|
||||
if request.POST.getlist('assigned_to', []):
|
||||
current_site = get_current_site(request)
|
||||
assigned_form_users = form.cleaned_data.get(
|
||||
'assigned_to').values_list('id', flat=True)
|
||||
all_members_list = list(
|
||||
set(list(assigned_form_users)) - set(list(assigned_to_ids)))
|
||||
if len(all_members_list):
|
||||
for assigned_to_user in all_members_list:
|
||||
user = get_object_or_404(User, pk=assigned_to_user)
|
||||
mail_subject = 'Assigned to opportunity.'
|
||||
message = render_to_string('assigned_to/opportunity_assigned.html', {
|
||||
'user': user,
|
||||
'domain': current_site.domain,
|
||||
'protocol': request.scheme,
|
||||
'opportunity': opportunity_obj
|
||||
})
|
||||
email = EmailMessage(
|
||||
mail_subject, message, to=[user.email])
|
||||
email.content_subtype = "html"
|
||||
email.send()
|
||||
|
||||
opportunity_obj.contacts.clear()
|
||||
all_members_list = []
|
||||
if self.request.POST.getlist('assigned_to', []):
|
||||
current_site = get_current_site(self.request)
|
||||
assigned_form_users = form.cleaned_data.get(
|
||||
'assigned_to').values_list('id', flat=True)
|
||||
all_members_list = list(
|
||||
set(list(assigned_form_users)) - set(list(assigned_to_ids)))
|
||||
if len(all_members_list):
|
||||
for assigned_to_user in all_members_list:
|
||||
user = get_object_or_404(User, pk=assigned_to_user)
|
||||
mail_subject = 'Assigned to opportunity.'
|
||||
message = render_to_string('assigned_to/opportunity_assigned.html', {
|
||||
'user': user,
|
||||
'domain': current_site.domain,
|
||||
'protocol': self.request.scheme,
|
||||
'opportunity': opportunity_obj
|
||||
})
|
||||
email = EmailMessage(
|
||||
mail_subject, message, to=[user.email])
|
||||
email.content_subtype = "html"
|
||||
email.send()
|
||||
opportunity_obj.assigned_to.clear()
|
||||
opportunity_obj.assigned_to.add(
|
||||
*request.POST.getlist('assigned_to'))
|
||||
else:
|
||||
opportunity_obj.assigned_to.clear()
|
||||
|
||||
if request.POST.getlist('contacts', []):
|
||||
opportunity_obj.contacts.add(
|
||||
*request.POST.getlist('contacts'))
|
||||
opportunity_obj.tags.clear()
|
||||
if request.POST.get('tags', ''):
|
||||
tags = request.POST.get("tags")
|
||||
splitted_tags = tags.split(",")
|
||||
for t in splitted_tags:
|
||||
tag = Tags.objects.filter(name=t.lower())
|
||||
if tag:
|
||||
tag = tag[0]
|
||||
else:
|
||||
tag = Tags.objects.create(name=t.lower())
|
||||
opportunity_obj.tags.add(tag)
|
||||
if request.FILES.get('oppurtunity_attachment'):
|
||||
attachment = Attachments()
|
||||
attachment.created_by = request.user
|
||||
attachment.file_name = request.FILES.get(
|
||||
'oppurtunity_attachment').name
|
||||
attachment.opportunity = opportunity_obj
|
||||
attachment.attachment = request.FILES.get(
|
||||
'oppurtunity_attachment')
|
||||
attachment.save()
|
||||
success_url = reverse('opportunities:list')
|
||||
if request.POST.get('from_account'):
|
||||
from_account = request.POST.get('from_account')
|
||||
success_url = reverse("accounts:view_account", pk=from_account)
|
||||
return JsonResponse({'error': False, 'success_url': success_url})
|
||||
|
||||
opportunity_obj.assigned_to.clear()
|
||||
opportunity_obj.assigned_to.add(
|
||||
*self.request.POST.getlist('assigned_to'))
|
||||
else:
|
||||
opportunity_obj.assigned_to.clear()
|
||||
|
||||
if self.request.POST.getlist('contacts', []):
|
||||
opportunity_obj.contacts.add(
|
||||
*self.request.POST.getlist('contacts'))
|
||||
opportunity_obj.tags.clear()
|
||||
if self.request.POST.get('tags', ''):
|
||||
tags = self.request.POST.get("tags")
|
||||
splitted_tags = tags.split(",")
|
||||
for t in splitted_tags:
|
||||
tag = Tags.objects.filter(name=t.lower())
|
||||
if tag:
|
||||
tag = tag[0]
|
||||
else:
|
||||
tag = Tags.objects.create(name=t.lower())
|
||||
opportunity_obj.tags.add(tag)
|
||||
if self.request.FILES.get('oppurtunity_attachment'):
|
||||
attachment = Attachments()
|
||||
attachment.created_by = self.request.user
|
||||
attachment.file_name = self.request.FILES.get(
|
||||
'oppurtunity_attachment').name
|
||||
attachment.opportunity = opportunity_obj
|
||||
attachment.attachment = self.request.FILES.get(
|
||||
'oppurtunity_attachment')
|
||||
attachment.save()
|
||||
if self.request.POST.get('from_account'):
|
||||
from_account = self.request.POST.get('from_account')
|
||||
return redirect("accounts:view_account", pk=from_account)
|
||||
if self.request.is_ajax():
|
||||
return JsonResponse({'error': False})
|
||||
return redirect('opportunities:list')
|
||||
|
||||
def form_invalid(self, form):
|
||||
if self.request.is_ajax():
|
||||
return JsonResponse({'error': True, 'opportunity_errors': form.errors})
|
||||
return self.render_to_response(
|
||||
self.get_context_data(form=form))
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(UpdateOpportunityView, self).get_context_data(**kwargs)
|
||||
context["opportunity_obj"] = self.object
|
||||
return JsonResponse({'error': True, 'errors': form.errors})
|
||||
else:
|
||||
context = {}
|
||||
context["opportunity_obj"] = opportunity_object
|
||||
user_assgn_list = [
|
||||
i.id for i in context["opportunity_obj"].assigned_to.all()]
|
||||
if self.request.user == context['opportunity_obj'].created_by:
|
||||
user_assgn_list.append(self.request.user.id)
|
||||
if self.request.user.role != "ADMIN" and not self.request.user.is_superuser:
|
||||
if self.request.user.id not in user_assgn_list:
|
||||
assigned_to.id for assigned_to in context["opportunity_obj"].assigned_to.all()]
|
||||
if request.user == context['opportunity_obj'].created_by:
|
||||
user_assgn_list.append(request.user.id)
|
||||
if request.user.role != "ADMIN" and not request.user.is_superuser:
|
||||
if request.user.id not in user_assgn_list:
|
||||
raise PermissionDenied
|
||||
context["opportunity_form"] = context["form"]
|
||||
context["accounts"] = self.accounts
|
||||
if self.request.GET.get('view_account'):
|
||||
context["opportunity_form"] = form
|
||||
context["accounts"] = accounts
|
||||
if request.GET.get('view_account'):
|
||||
context['account'] = get_object_or_404(
|
||||
Account, id=self.request.GET.get('view_account'))
|
||||
context["contacts"] = self.contacts
|
||||
context["users"] = self.users
|
||||
Account, id=request.GET.get('view_account'))
|
||||
context["contacts"] = contacts
|
||||
context["users"] = users
|
||||
context["currencies"] = CURRENCY_CODES
|
||||
context["stages"] = STAGES
|
||||
context["sources"] = SOURCES
|
||||
context["assignedto_list"] = [
|
||||
int(i) for i in self.request.POST.getlist('assigned_to', []) if i]
|
||||
int(i) for i in request.POST.getlist('assigned_to', []) if i]
|
||||
context["contacts_list"] = [
|
||||
int(i) for i in self.request.POST.getlist('contacts', []) if i]
|
||||
int(i) for i in request.POST.getlist('contacts', []) if i]
|
||||
|
||||
return context
|
||||
return render(request, template_name, context)
|
||||
|
||||
|
||||
class DeleteOpportunityView(LoginRequiredMixin, View):
|
||||
|
|
@ -369,10 +336,10 @@ class GetContactView(LoginRequiredMixin, View):
|
|||
account_id = request.GET.get("account")
|
||||
if account_id:
|
||||
account = get_object_or_404(Account, id=account_id)
|
||||
contacts = Contact.objects.filter(account=account)
|
||||
contacts = account.contacts.all()
|
||||
else:
|
||||
contacts = Contact.objects.all()
|
||||
data = {i.pk: i.first_name for i in contacts.distinct()}
|
||||
data = {contact.pk: contact.first_name for contact in contacts.distinct()}
|
||||
return JsonResponse(data)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -157,7 +157,7 @@ $("body").on("click", ".viewthis", function (e, from_edit_this) {
|
|||
e.preventDefault();
|
||||
callID = $(this).closest("tr")[0].id;
|
||||
call = callID.match(/\d+/)[0];
|
||||
$("#model-form").append("<input type="hidden" name="callID" value="" + call + "">");
|
||||
$("#model-form").append('<input type="hidden" name="callID" value="' + call + '">');
|
||||
$("#gocreatecall").attr("id", "editcall").text("Edit");
|
||||
$("#selectedleads").html("");
|
||||
$("#selectedcontacts").html("");
|
||||
|
|
@ -228,7 +228,7 @@ $("body").on("click", "#editcall", function (e) {
|
|||
$("#model-form").attr({"id": "update-form", "type": "submit"});
|
||||
$("#editcall").attr({"id": "update", "type": "submit"}).text("Update");
|
||||
$("#modeldialogclosed").attr({"id": "modeldialogclosed"});
|
||||
$("#modelbody").append("<input type="hidden" value="" + callID + "">");
|
||||
$("#modelbody").append('<input type="hidden" value="' + callID + '">');
|
||||
});
|
||||
$("body").on("click", "#updatemodeldialogclosed", function (e) {
|
||||
e.preventDefault();
|
||||
|
|
@ -238,7 +238,7 @@ $("body").on("click", "#updatemodeldialogclosed", function (e) {
|
|||
$("#model-form").find("input[type=text], textarea").val("");
|
||||
$("#update-form").attr({"id": "model-form"});
|
||||
$("#updatemodeldialogclosed").attr({"id": "model-form"});
|
||||
$(".reminderslist[style="display:inline-flex"]").remove();
|
||||
$(".reminderslist[style='display:inline-flex']").remove();
|
||||
|
||||
});
|
||||
$("body").on("click", "#createcall", function (e) {
|
||||
|
|
@ -273,7 +273,7 @@ $("body").on("submit", "#update-form", function (e) {
|
|||
$("#update-form").attr({"id": "model-form"});
|
||||
$("#model-form").find("input[type=text], textarea").val("");
|
||||
$("#updatemodeldialogclosed").attr({"id": "modeldialogclosed"});
|
||||
$(".reminderslist[style="display:inline-flex"]").remove();
|
||||
$(".reminderslist[style='display:inline-flex']").remove();
|
||||
$(".selected-assigned-users").html("");
|
||||
$(".selectedcontacts").html("");
|
||||
$(".selectedusers").html("");
|
||||
|
|
|
|||
|
|
@ -181,7 +181,7 @@ $("body").on("click", ".viewthis", function (e, from_edit_this) {
|
|||
$(".selectedusers").html("")
|
||||
meetingID = $(this).closest("tr")[0].id
|
||||
meet = meetingID.match(/\d+/)[0]
|
||||
$("#model-form").append("<input type="hidden" name="meetingID" value="" + meet + "">");
|
||||
$("#model-form").append('<input type="hidden" name="meetingID" value="' + meet + '">');
|
||||
$("#gocreatemeeting").attr("id", "editmeeting").text("Edit");
|
||||
$.post(
|
||||
"/planner/get/meeting/",
|
||||
|
|
@ -244,7 +244,7 @@ $("body").on("click", "#editmeeting", function (e) {
|
|||
$("#model-form").attr({"id": "update-form", "type": "submit"});
|
||||
$("#editmeeting").attr({"id": "update", "type": "submit"}).text("Update");
|
||||
$("#modeldialogclosed").attr({"id": "modeldialogclosed"});
|
||||
$("#modelbody").append("<input type="hidden" value="" + meetingID + "">")
|
||||
$("#modelbody").append("<input type='hidden' value='" + meetingID + "'>")
|
||||
});
|
||||
$("body").on("click", "#updatemodeldialogclosed", function (e) {
|
||||
e.preventDefault();
|
||||
|
|
@ -254,7 +254,7 @@ $("body").on("click", "#updatemodeldialogclosed", function (e) {
|
|||
$("#model-form").find("input[type=text], textarea").val("");
|
||||
$("#update-form").attr({"id": "model-form"})
|
||||
$("#updatemodeldialogclosed").attr({"id": "model-form"})
|
||||
$(".reminderslist[style="display:inline-flex"]").remove();
|
||||
$(".reminderslist[style='display:inline-flex']").remove();
|
||||
|
||||
});
|
||||
$("body").on("click", "#createmeeting", function (e) {
|
||||
|
|
@ -292,7 +292,7 @@ $("body").on("submit", "#update-form", function (e) {
|
|||
$("#update-form").attr({"id": "model-form"})
|
||||
$("#model-form").find("input[type=text], textarea").val("");
|
||||
$("#updatemodeldialogclosed").attr({"id": "modeldialogclosed"})
|
||||
$(".reminderslist[style="display:inline-flex"]").remove();
|
||||
$(".reminderslist[style='display:inline-flex']").remove();
|
||||
}
|
||||
else if (data["auth"] == "NO") {
|
||||
alert("Not Authanticated!!")
|
||||
|
|
|
|||
|
|
@ -30,9 +30,11 @@
|
|||
<form method="POST" action="">
|
||||
<div class="form-group">
|
||||
<input type="text" class="form-control" id="exampleInputEmail1" placeholder="Email" name="email">
|
||||
<span class = "error">{{form.email.errors}}</span>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<input type="password" class="form-control" id="exampleInputPassword1" placeholder="Password" name="password">
|
||||
<span class = "error">{{form.password.errors}}</span>
|
||||
</div>
|
||||
<div class="forgot">Forgot Password <a href="{% url "common:password_reset" %}">Click Here?</a></div>
|
||||
{% if error %}
|
||||
|
|
|
|||
Loading…
Reference in a new issue