def partner_get_records(request): if request.method == "GET": prm_worthy(request) dt_range, date_str, records = get_records_from_request(request) records = records.exclude(contact_type="job") email = records.filter(contact_type="email").count() email += records.filter(contact_type="pssemail").count() phone = records.filter(contact_type="phone").count() meetingorevent = records.filter(contact_type="meetingorevent").count() # figure names if email != 1: email_name = "Emails" else: email_name = "Email" if phone != 1: phone_name = "Phone Calls" else: phone_name = "Phone Call" if meetingorevent != 1: meetingorevent_name = "Meeting or Event" else: meetingorevent_name = "Meetings & Events" data = SortedDict() data["email"] = {"count": email, "name": email_name, "typename": "email"} data["phone"] = {"count": phone, "name": phone_name, "typename": "phone"} data["meetingorevent"] = {"count": meetingorevent, "name": meetingorevent_name, "typename": "meetingorevent"} return HttpResponse(json.dumps(data)) else: raise Http404
def partner_get_referrals(request): if request.method == "GET": prm_worthy(request) dt_range, date_str, records = get_records_from_request(request) # figure names if records.applications != 1: app_name = "Applications" else: app_name = "Application" if records.interviews != 1: interview_name = "Interviews" else: interview_name = "Interview" if records.hires != 1: hire_name = "Hires" else: hire_name = "Hire" data = { "applications": {"count": records.applications, "name": app_name, "typename": "job"}, "interviews": {"count": records.interviews, "name": interview_name, "typename": "job"}, "hires": {"count": records.hires, "name": hire_name, "typename": "job"}, } return HttpResponse(json.dumps(data)) else: raise Http404
def prm_records(request): """ ContactRecord overview and ContactRecord overview from PRM reports. """ company, partner, _ = prm_worthy(request) _, _, contact_records = get_records_from_request(request) paginated_records = add_pagination(request, contact_records) if request.is_ajax(): ctx = {"partner": partner, "records": paginated_records} response = HttpResponse() html = render_to_response("mypartners/includes/contact_record_column.html", ctx, RequestContext(request)) response.content = html.content return response contact_type_choices = (("all", "All"),) + CONTACT_TYPE_CHOICES contact_choices = [ (c, c) for c in contact_records.order_by("contact__name").distinct().values_list("contact__name", flat=True) ] contact_choices.insert(0, ("all", "All")) ctx = { "admin_id": request.REQUEST.get("admin"), "company": company, "contact_choices": contact_choices, "contact_type_choices": contact_type_choices, "partner": partner, "records": paginated_records, "view_name": "PRM", } return render_to_response("mypartners/main_records.html", ctx, RequestContext(request))
def test_get_records_from_request_with_date(self): """ Make sure that the number of days shown in the date drop dwon matches the what was selected by user""" record_types = ["email", "phone", "meetingorevent"] date = ["0", "1", "30", "90", ""] params = product(record_types, date) for record_type, date in params: request = self.request_factory.get( 'prm/view/reports/details/records/', dict( company=self.company.id, partner=self.partner.id, record_type=record_type, date=date, ) ) request.user = self.staff_user response = helpers.get_records_from_request(request) (range_start, range_end), date_str, records = response expected = date_str.split()[0].lstrip("-") if expected.isdigit(): days = int(expected) if days == 1: self.assertEqual("1 Day", date_str) else: self.assertEqual( "%i Days" % (range_end - range_start).days, date_str) else: self.assertEqual("View All", date_str)
def partner_get_referrals(request): if request.method == 'GET': prm_worthy(request) dt_range, date_str, records = get_records_from_request(request) # figure names if records.applications != 1: app_name = 'Applications' else: app_name = 'Application' if records.interviews != 1: interview_name = 'Interviews' else: interview_name = 'Interview' if records.hires != 1: hire_name = 'Hires' else: hire_name = 'Hire' data = { 'applications': {'count': records.applications, 'name': app_name, 'typename': 'job'}, 'interviews': {'count': records.interviews, 'name': interview_name, 'typename': 'job'}, 'hires': {'count': records.hires, 'name': hire_name, 'typename': 'job'}, } return HttpResponse(json.dumps(data)) else: raise Http404
def test_get_records_from_request_with_date(self): """ Make sure that the number of days shown in the date drop dwon matches the what was selected by user""" record_types = ["email", "phone", "meetingorevent"] date = ["0", "1", "30", "90", ""] params = product(record_types, date) for record_type, date in params: request = self.request_factory.get( 'prm/view/reports/details/records/', dict( company=self.company.id, partner=self.partner.id, record_type=record_type, date=date, ) ) request.user = self.staff_user response = helpers.get_records_from_request(request) (range_start, range_end), date_str, records = response expected = date_str.split()[0].lstrip("-") if expected.isdigit(): days = int(expected) if days == 1: self.assertEqual("1 Day", date_str) else: self.assertEqual( "%i Days" % (range_end - range_start).days, date_str) else: self.assertEqual("View All", date_str)
def prm_export(request): #TODO: investigate using django's builtin serialization for XML company, partner, user = prm_worthy(request) file_format = request.REQUEST.get('file_format', 'csv') fields = retrieve_fields(ContactRecord) _, _, records = get_records_from_request(request) if file_format == 'xml': root = etree.Element("contact_records") for record in records: xml_record = etree.SubElement(root, "record") for field in fields: xml = etree.SubElement(xml_record, field) value = getattr(record, field, '') if hasattr(value, 'all'): value = ', '.join([val.name for val in value.all() if val]) xml.text = contact_record_val_to_str(value) response = HttpResponse(etree.tostring(root, pretty_print=True, xml_declaration=True), mimetype='application/force-download') elif file_format == 'printer_friendly': ctx = { 'company': company, 'fields': fields, 'partner': partner, 'records': records, } return render_to_response('mypartners/printer_friendly.html', ctx, RequestContext(request)) # CSV/XLS else: response = HttpResponse(content_type='text/csv') writer = unicodecsv.writer(response, encoding='utf-8') writer.writerow(fields) for record in records: values = [getattr(record, field, '') for field in fields] values = [ contact_record_val_to_str(v) if not hasattr(v, 'all') else ', '.join([val.name for val in v.all() if val]) for v in values ] # Remove the HTML and reformat. values = [strip_tags(v) for v in values] # replaces multiple occurences of space by a single sapce. values = [' '.join(filter(bool, v.split(' '))) for v in values] values = [re.sub('\s+\n\s+', '\n', v) for v in values] writer.writerow(values) response['Content-Disposition'] = 'attachment; ' \ 'filename="company_record_report".%s' \ % file_format return response
def test_start_date_before_end_date(self): request = self.request_factory.get( 'prm/view/reports/details/records/', dict( company=self.company.id, partner=self.partner.id, range_start='02/15/14', range_end='04/15/12')) request.user = self.staff_user response = helpers.get_records_from_request(request) (start_date, end_date), _, _ = response self.assertGreaterEqual(end_date, start_date)
def test_start_date_before_end_date(self): request = self.request_factory.get( 'prm/view/reports/details/records/', dict( company=self.company.id, partner=self.partner.id, range_start='02/15/14', range_end='04/15/12')) request.user = self.staff_user response = helpers.get_records_from_request(request) (start_date, end_date), _, _ = response self.assertGreaterEqual(end_date, start_date)
def get_records(request): """ Returns a json object containing the records matching the search criteria (contact, contact_type, and date_time range) rendered using records.html and the date range and date string required to update the time_filter.html template to match the search. """ company, partner, user = prm_worthy(request) contact = request.REQUEST.get('contact') contact_type = request.REQUEST.get('record_type') contact = None if contact in ['all', 'undefined'] else contact contact_type = None if contact_type in ['all', 'undefined' ] else contact_type dt_range, date_str, records = get_records_from_request(request) ctx = { 'records': records.order_by('-date_time'), 'company': company, 'partner': partner, 'contact_type': None if contact_type == 'all' else contact_type, 'contact_name': None if contact == 'all' else contact, 'view_name': 'PRM' } # Because javascript is going to use this, not a template, # convert to localtime here date_end = localtime(dt_range[1].replace(tzinfo=pytz.utc)) date_start = localtime(dt_range[0].replace(tzinfo=pytz.utc)) data = { 'month_end': date_end.strftime('%m'), 'day_end': date_end.strftime('%d'), 'year_end': date_end.strftime('%Y'), 'month_start': date_start.strftime('%m'), 'day_start': date_start.strftime('%d'), 'year_start': date_start.strftime('%Y'), 'date_str': date_str, 'html': render_to_response('mypartners/records.html', ctx, RequestContext(request)).content, } return HttpResponse(json.dumps(data))
def prm_view_records(request): """ View an individual ContactRecord. """ company, partner, _ = prm_worthy(request) _, _, contact_records = get_records_from_request(request) page_number = int(request.GET.get('page', 1)) record_id = int(request.GET.get('id', 0)) # change number of objects per page paginator = Paginator(contact_records, 1) if record_id: pks = list(contact_records.values_list('pk', flat=True)) if record_id in pks: page_number = pks.index(record_id) + 1 else: page_number = 1 paginator = Paginator( ContactRecord.objects.filter(pk=record_id), 1) paginated_records = paginator.page(page_number) record = paginated_records.object_list[0] attachments = record.prmattachment_set.all() record_history = ContactLogEntry.objects.filter( object_id=record.pk, content_type_id=ContentType.objects.get_for_model( ContactRecord).pk) search_params = request.GET.copy() navigation_params = search_params.copy() navigation_params.pop('id', None) ctx = { 'record': record, 'records': paginated_records, 'partner': partner, 'company': company, 'attachments': attachments, 'record_history': record_history, 'view_name': 'PRM', 'page': page_number, 'search_params': urlencode(search_params), 'navigation_params': urlencode(navigation_params) } return render_to_response('mypartners/view_record.html', ctx, RequestContext(request))
def prm_export(request): # TODO: investigate using django's builtin serialization for XML company, partner, user = prm_worthy(request) file_format = request.REQUEST.get("file_format", "csv") fields = retrieve_fields(ContactRecord) _, _, records = get_records_from_request(request) if file_format == "xml": root = etree.Element("contact_records") for record in records: xml_record = etree.SubElement(root, "record") for field in fields: xml = etree.SubElement(xml_record, field) value = getattr(record, field, "") if hasattr(value, "all"): value = ", ".join([val.name for val in value.all() if val]) xml.text = contact_record_val_to_str(value) response = HttpResponse( etree.tostring(root, pretty_print=True, xml_declaration=True), mimetype="application/force-download" ) elif file_format == "printer_friendly": ctx = {"company": company, "fields": fields, "partner": partner, "records": records} return render_to_response("mypartners/printer_friendly.html", ctx, RequestContext(request)) # CSV/XLS else: response = HttpResponse(content_type="text/csv") writer = unicodecsv.writer(response, encoding="utf-8") writer.writerow(fields) for record in records: values = [getattr(record, field, "") for field in fields] values = [ contact_record_val_to_str(v) if not hasattr(v, "all") else ", ".join([val.name for val in v.all() if val]) for v in values ] # Remove the HTML and reformat. values = [strip_tags(v) for v in values] # replaces multiple occurences of space by a single sapce. values = [" ".join(filter(bool, v.split(" "))) for v in values] values = [re.sub("\s+\n\s+", "\n", v) for v in values] writer.writerow(values) response["Content-Disposition"] = "attachment; " 'filename="company_record_report".%s' % file_format return response
def partner_get_records(request): if request.method == 'GET': prm_worthy(request) dt_range, date_str, records = get_records_from_request(request) records = records.exclude(contact_type='job') email = records.filter(contact_type='email').count() email += records.filter(contact_type='pssemail').count() phone = records.filter(contact_type='phone').count() meetingorevent = records.filter(contact_type='meetingorevent').count() # figure names if email != 1: email_name = 'Emails' else: email_name = 'Email' if phone != 1: phone_name = 'Phone Calls' else: phone_name = 'Phone Call' if meetingorevent != 1: meetingorevent_name = 'Meeting or Event' else: meetingorevent_name = 'Meetings & Events' data = SortedDict() data['email'] = { "count": email, "name": email_name, 'typename': 'email' } data['phone'] = { "count": phone, "name": phone_name, 'typename': 'phone' } data['meetingorevent'] = { "count": meetingorevent, "name": meetingorevent_name, "typename": "meetingorevent" } return HttpResponse(json.dumps(data)) else: raise Http404
def partner_main_reports(request): company, partner, user = prm_worthy(request) dt_range, date_str, records = get_records_from_request(request) ctx = { "admin_id": request.REQUEST.get("admin"), "partner": partner, "company": company, "contacts": records.contacts, "total_records": records.communication_activity.count(), "referral": records.referrals, "top_contacts": records.contacts[:3], "others": sum(contact["records"] for contact in records.contacts[3:]), "view_name": "PRM", "date_start": dt_range[0], "date_end": dt_range[1], "date_display": date_str, } return render_to_response("mypartners/partner_reports.html", ctx, RequestContext(request))
def get_records(request): """ Returns a json object containing the records matching the search criteria (contact, contact_type, and date_time range) rendered using records.html and the date range and date string required to update the time_filter.html template to match the search. """ company, partner, user = prm_worthy(request) contact = request.REQUEST.get("contact") contact_type = request.REQUEST.get("record_type") contact = None if contact in ["all", "undefined"] else contact contact_type = None if contact_type in ["all", "undefined"] else contact_type dt_range, date_str, records = get_records_from_request(request) ctx = { "records": records.order_by("-date_time"), "company": company, "partner": partner, "contact_type": None if contact_type == "all" else contact_type, "contact_name": None if contact == "all" else contact, "view_name": "PRM", } # Because javascript is going to use this, not a template, # convert to localtime here date_end = localtime(dt_range[1].replace(tzinfo=pytz.utc)) date_start = localtime(dt_range[0].replace(tzinfo=pytz.utc)) data = { "month_end": date_end.strftime("%m"), "day_end": date_end.strftime("%d"), "year_end": date_end.strftime("%Y"), "month_start": date_start.strftime("%m"), "day_start": date_start.strftime("%d"), "year_start": date_start.strftime("%Y"), "date_str": date_str, "html": render_to_response("mypartners/records.html", ctx, RequestContext(request)).content, } return HttpResponse(json.dumps(data))
def partner_main_reports(request): company, partner, user = prm_worthy(request) dt_range, date_str, records = get_records_from_request(request) ctx = { 'admin_id': request.REQUEST.get('admin'), 'partner': partner, 'company': company, 'contacts': records.contacts, 'total_records': records.communication_activity.count(), 'referral': records.referrals, 'top_contacts': records.contacts[:3], 'others': sum(contact['records'] for contact in records.contacts[3:]), 'view_name': 'PRM', 'date_start': dt_range[0], 'date_end': dt_range[1], 'date_display': date_str, } return render_to_response('mypartners/partner_reports.html', ctx, RequestContext(request))
def prm_records(request): """ ContactRecord overview and ContactRecord overview from PRM reports. """ company, partner, _ = prm_worthy(request) _, _, contact_records = get_records_from_request(request) paginated_records = add_pagination(request, contact_records) if request.is_ajax(): ctx = { 'partner': partner, 'records': paginated_records } response = HttpResponse() html = render_to_response( 'mypartners/includes/contact_record_column.html', ctx, RequestContext(request)) response.content = html.content return response contact_type_choices = (('all', 'All'),) + CONTACT_TYPE_CHOICES contact_choices = [ (c, c) for c in contact_records.order_by( 'contact__name').distinct().values_list('contact__name', flat=True)] contact_choices.insert(0, ('all', 'All')) ctx = { 'admin_id': request.REQUEST.get('admin'), 'company': company, 'contact_choices': contact_choices, 'contact_type_choices': contact_type_choices, 'partner': partner, 'records': paginated_records, 'view_name': 'PRM', } return render_to_response('mypartners/main_records.html', ctx, RequestContext(request))
def prm_view_records(request): """ View an individual ContactRecord. """ company, partner, _ = prm_worthy(request) _, _, contact_records = get_records_from_request(request) try: page = int(request.GET.get('page', 1)) except ValueError: page = 1 # change number of objects per page paginated_records = add_pagination(request, contact_records, 1) if len(paginated_records.object_list) > 1: record = paginated_records.object_list[page - 1] else: record = paginated_records.object_list[0] attachments = record.prmattachment_set.all() record_history = ContactLogEntry.objects.filter( object_id=record.pk, content_type_id=ContentType.objects.get_for_model( ContactRecord).pk) ctx = { 'record': record, 'records': paginated_records, 'partner': partner, 'company': company, 'attachments': attachments, 'record_history': record_history, 'view_name': 'PRM', 'page': page } return render_to_response('mypartners/view_record.html', ctx, RequestContext(request))
def prm_view_records(request): """ View an individual ContactRecord. """ company, partner, _ = prm_worthy(request) _, _, contact_records = get_records_from_request(request) try: page = int(request.GET.get("page", 1)) except ValueError: page = 1 # change number of objects per page paginated_records = add_pagination(request, contact_records, 1) if len(paginated_records.object_list) > 1: record = paginated_records.object_list[page - 1] else: record = paginated_records.object_list[0] attachments = record.prmattachment_set.all() record_history = ContactLogEntry.objects.filter( object_id=record.pk, content_type_id=ContentType.objects.get_for_model(ContactRecord).pk ) ctx = { "record": record, "records": paginated_records, "partner": partner, "company": company, "attachments": attachments, "record_history": record_history, "view_name": "PRM", "page": page, } return render_to_response("mypartners/view_record.html", ctx, RequestContext(request))