136 lines
6.4 KiB
Python
136 lines
6.4 KiB
Python
from django.shortcuts import render, redirect, get_object_or_404
|
|
from django.db.models import Q
|
|
from django.contrib import messages
|
|
from .models import Lead, IDSData
|
|
from .forms import LeadForm
|
|
import csv
|
|
import io
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
def ids_data_detail(request, pk):
|
|
ids_data = get_object_or_404(IDSData, pk=pk)
|
|
return render(request, 'leads/ids_data_detail.html', {'ids_data': ids_data})
|
|
|
|
def lead_list(request):
|
|
query = request.GET.get('q')
|
|
if query:
|
|
leads = Lead.objects.filter(
|
|
Q(name__icontains=query) |
|
|
Q(email__icontains=query) |
|
|
Q(company__icontains=query)
|
|
).order_by('-score')
|
|
else:
|
|
leads = Lead.objects.all().order_by('-score')
|
|
return render(request, 'leads/lead_list.html', {'leads': leads})
|
|
|
|
def lead_detail(request, pk):
|
|
lead = get_object_or_404(Lead, pk=pk)
|
|
return render(request, 'leads/lead_detail.html', {'lead': lead})
|
|
|
|
def lead_create(request):
|
|
if request.method == 'POST':
|
|
form = LeadForm(request.POST)
|
|
if form.is_valid():
|
|
form.save()
|
|
return redirect('lead_list')
|
|
else:
|
|
form = LeadForm()
|
|
return render(request, 'leads/lead_form.html', {'form': form})
|
|
|
|
def lead_update(request, pk):
|
|
lead = get_object_or_404(Lead, pk=pk)
|
|
if request.method == 'POST':
|
|
form = LeadForm(request.POST, instance=lead)
|
|
if form.is_valid():
|
|
form.save()
|
|
return redirect('lead_list')
|
|
else:
|
|
form = LeadForm(instance=lead)
|
|
return render(request, 'leads/lead_form.html', {'form': form})
|
|
|
|
def lead_delete(request, pk):
|
|
lead = get_object_or_404(Lead, pk=pk)
|
|
if request.method == 'POST':
|
|
lead.delete()
|
|
return redirect('lead_list')
|
|
return render(request, 'leads/lead_confirm_delete.html', {'lead': lead})
|
|
|
|
def data_sources(request):
|
|
return render(request, 'leads/data_sources.html')
|
|
|
|
def ids_data(request):
|
|
ids_data = IDSData.objects.all()
|
|
return render(request, 'leads/ids_data.html', {'ids_data': ids_data})
|
|
|
|
def ids_data_import(request):
|
|
if request.method == 'POST':
|
|
csv_file = request.FILES.get('csv_file')
|
|
if csv_file:
|
|
try:
|
|
decoded_file = csv_file.read().decode('utf-8')
|
|
io_string = io.StringIO(decoded_file)
|
|
reader = csv.DictReader(io_string)
|
|
imported_count = 0
|
|
for row in reader:
|
|
try:
|
|
IDSData.objects.update_or_create(
|
|
business_uuid=row['Business UUID'],
|
|
location_uuid=row['Location UUID'],
|
|
defaults={
|
|
'business_name': row['Business Name'],
|
|
'yib': row['YiB'],
|
|
'gbp_business_category': row['GBP Business Category'],
|
|
'gbp_matching_service': row['GBP Matching Service'],
|
|
'gbp_review_rating': float(row['GBP Review Rating']) if row['GBP Review Rating'] else None,
|
|
'gbp_review_count': int(float(row['GBP Review Count'])) if row['GBP Review Count'] else None,
|
|
'gbp_industry_avg_review_rating': float(row['GBP Industry Avg Review Rating']) if row['GBP Industry Avg Review Rating'] else None,
|
|
'gbp_industry_avg_review_count': float(row['GBP Industry Avg Review Count']) if row['GBP Industry Avg Review Count'] else None,
|
|
'gbp_review_rating_offset': float(row['GBP Review Rating Offset fr. Avg']) if row['GBP Review Rating Offset fr. Avg'] else None,
|
|
'gbp_review_count_offset': float(row['GBP Review Count Offset fr. Avg']) if row['GBP Review Count Offset fr. Avg'] else None,
|
|
'gbp_review_rating_health': row['GBP Review Rating Health'],
|
|
'gbp_review_count_health': row['GBP Review Count Health'],
|
|
'gbp_location_municipality': row['GBP Location Municipality'],
|
|
'gbp_location_state': row['GBP Location State'],
|
|
'location_from_gbp_business_name': row['Location from GBP Business Name'],
|
|
'gbp_business_phone': row['GBP Business Phone'],
|
|
'gbp_business_website': row['GBP Business Website'],
|
|
'root_domain': row['Root Domain'],
|
|
'md5_for_scrape': row['MD5 for Scrape'],
|
|
'services_reputation_management': row['Services: Reputation Management'] == 'Yes',
|
|
'services_gbp_optimization': row['Services: GBP Optimization'] == 'Yes',
|
|
'services_needs_website': row['Services: Needs Website'] == 'Yes'
|
|
}
|
|
)
|
|
imported_count += 1
|
|
except Exception as row_error:
|
|
logger.error(f"Error importing row: {row}. Error: {str(row_error)}")
|
|
messages.success(request, f'CSV file imported successfully. {imported_count} records imported or updated.')
|
|
logger.info(f'CSV import completed. {imported_count} records imported or updated.')
|
|
except Exception as e:
|
|
error_message = f'Error importing CSV file: {str(e)}'
|
|
messages.error(request, error_message)
|
|
logger.error(error_message)
|
|
else:
|
|
messages.error(request, 'No CSV file provided.')
|
|
logger.warning('CSV import attempted without file')
|
|
return redirect('ids_data')
|
|
return render(request, 'leads/ids_data_import.html')
|
|
|
|
def ids_data_delete_all(request):
|
|
if request.method == 'POST':
|
|
IDSData.objects.all().delete()
|
|
messages.success(request, 'All IDS Data records have been deleted.')
|
|
return redirect('ids_data')
|
|
return render(request, 'leads/ids_data_delete_confirm.html')
|
|
|
|
def ids_data_delete(request, pk):
|
|
ids_data = get_object_or_404(IDSData, pk=pk)
|
|
if request.method == 'POST':
|
|
business_name = ids_data.business_name
|
|
ids_data.delete()
|
|
messages.success(request, f'IDS Data record "{business_name}" has been deleted.')
|
|
return redirect('ids_data')
|
|
return render(request, 'leads/ids_data_confirm_delete.html', {'ids_data': ids_data})
|