prepping to merge apps

This commit is contained in:
Ashwin 2019-02-27 13:31:32 +05:30
parent c952b7102b
commit 7b81cb364a
27 changed files with 1006 additions and 850 deletions

View file

@ -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 %}

View file

@ -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 (

View file

@ -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) {

View file

@ -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):

View file

@ -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"),

View file

@ -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):

View file

@ -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] != '':

View file

@ -183,5 +183,4 @@
$('#docs_filter').submit();
});
</script>
{% endblock js_block %}
{% endblock js_block %}

View file

@ -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>

View file

@ -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 %}

View file

@ -85,5 +85,4 @@
window.location = $(this).attr('href')
});
</script>
{% endblock js_block %}
{% endblock js_block %}

View file

@ -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)
}
})

View file

@ -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'),

View file

@ -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)

View file

@ -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>

View file

@ -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)

View file

@ -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();

View file

@ -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):

View file

@ -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"),

View file

@ -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):

View file

@ -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();

View file

@ -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/'

View file

@ -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"),

View file

@ -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)

View file

@ -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("");

View file

@ -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!!")

View file

@ -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 %}