def save(self, commit=True): # self.instance is a Contact instance company_id = self.data['company_id'] partner_url = self.cleaned_data.get('partnerurl', '') partner_source = self.cleaned_data.get('partnersource', '') status = Status.objects.create(approved_by=self.user) partner = Partner.objects.create(name=self.cleaned_data['partnername'], uri=partner_url, owner_id=company_id, data_source=partner_source, approval_status=status) log_change(partner, self, self.user, partner, partner.name, action_type=ADDITION) create_contact = any( self.cleaned_data.get(field) for field in self.__CONTACT_FIELDS if self.cleaned_data.get(field)) if create_contact: create_location = any( self.cleaned_data.get(field) for field in self.__LOCATION_FIELDS if self.cleaned_data.get(field)) self.instance.partner = partner instance = super(NewPartnerForm, self).save(commit) partner.primary_contact = instance if create_location: location = Location.objects.create( **{ field: self.cleaned_data[field] for field in self.__LOCATION_FIELDS }) if location not in instance.locations.all(): instance.locations.add(location) # Tag creation tag_data = filter(bool, self.cleaned_data['partner-tags'].split(',')) tags = tag_get_or_create(company_id, tag_data) partner.tags = tags partner.save() self.instance.tags = tags log_change(instance, self, self.user, partner, instance.name, action_type=ADDITION) return instance # No contact was created return None
def save(self, user, partner, commit=True): new_or_change = CHANGE if self.instance.pk else ADDITION self.instance.partner = partner if new_or_change == ADDITION: self.instance.created_by = user instance = super(ContactRecordForm, self).save(commit) self.instance.tags = self.cleaned_data.get('tags') attachments = self.cleaned_data.get('attachment', None) for attachment in attachments: if attachment: prm_attachment = PRMAttachment(attachment=attachment, contact_record=self.instance) prm_attachment.partner = self.instance.partner prm_attachment.save() for attachment in self.cleaned_data.get('attach_delete', []): PRMAttachment.objects.get(pk=attachment).delete() identifier = instance.contact.name log_change(instance, self, user, partner, identifier, action_type=new_or_change) return instance
def save(self, commit=True): self.instance.feed = self.cleaned_data.get('feed') self.instance.update_last_action_time(False) is_new_or_change = CHANGE if self.instance.pk else ADDITION if not self.instance.pk: self.instance.sort_by = 'Date' instance = super(PartnerSavedSearchForm, self).save(commit) tags = self.cleaned_data.get('tags') self.instance.tags = tags if is_new_or_change == ADDITION: invite_args = { 'invitee_email': instance.email, 'invitee': instance.user, 'inviting_user': instance.created_by, 'inviting_company': instance.partner.owner, } invitation = Invitation.objects.create(**invite_args) invitation.send(instance) # Default sort_by for new Partner Saved Searches, see PD-912 partner = instance.partner contact = Contact.objects.filter(partner=partner, user=instance.user).first() log_change(instance, self, instance.created_by, partner, contact.email, action_type=is_new_or_change, impersonator=self.request.impersonator) return instance
def save(self, user, partner, commit=True): new_or_change = CHANGE if self.instance.pk else ADDITION partner = Partner.objects.get(id=self.data['partner']) self.instance.partner = partner self.instance.update_last_action_time(False) contact = None if not self.instance.pk: contact = Contact.objects.filter( partner=partner, name=self.instance.name, email=self.instance.email).first() if contact: contact.phone = contact.phone or self.instance.phone contact.notes = contact.notes or self.instance.notes contact.archived_on = None contact.save() self.instance = contact contact = contact or super(ContactForm, self).save(commit) if any(self.cleaned_data.get(field) for field in self.__LOCATION_FIELDS if self.cleaned_data.get(field)): location = Location.objects.create(**{ field: self.cleaned_data[field] for field in self.__LOCATION_FIELDS}) if location not in contact.locations.all(): contact.locations.add(location) log_change(contact, self, user, partner, contact.name, action_type=new_or_change) return contact
def save(self, commit=True): self.instance.feed = self.cleaned_data.get('feed') is_new_or_change = CHANGE if self.instance.pk else ADDITION if not self.instance.pk: self.instance.sort_by = 'Date' instance = super(PartnerSavedSearchForm, self).save(commit) tags = self.cleaned_data.get('tags') self.instance.tags = tags if is_new_or_change == ADDITION: invite_args = { 'invitee_email': instance.email, 'invitee': instance.user, 'inviting_user': instance.created_by, 'inviting_company': instance.partner.owner, 'added_saved_search': instance, } Invitation(**invite_args).save() # Default sort_by for new Partner Saved Searches, see PD-912 partner = instance.partner contact = Contact.objects.filter(partner=partner, user=instance.user)[0] log_change(instance, self, instance.created_by, partner, contact.email, action_type=is_new_or_change) return instance
def save(self, request, partner, commit=True): new_or_change = CHANGE if self.instance.pk else ADDITION self.instance.partner = partner self.instance.update_last_action_time(False) if new_or_change == ADDITION: self.instance.created_by = request.user instance = super(ContactRecordForm, self).save(commit) self.instance.tags = self.cleaned_data.get('tags') attachments = self.cleaned_data.get('attachment', None) prm_attachments = [PRMAttachment(attachment=attachment, contact_record=self.instance) for attachment in attachments if attachment] PRMAttachment.objects.bulk_create(prm_attachments) PRMAttachment.objects.filter( pk__in=self.cleaned_data.get('attach_delete', [])).delete() if instance.contact: identifier = instance.contact.name else: identifier = {'email': instance.contact_email, 'phone': instance.contact_phone}.get( instance.contact_type, 'unknown contact') log_change(instance, self, request.user, partner, identifier, action_type=new_or_change, impersonator=request.impersonator) return instance
def save(self, request, commit=True): new_or_change = CHANGE if self.instance.pk else ADDITION instance = super(LocationForm, self).save(commit) _, partner, _ = prm_worthy(request) log_change(instance, self, request.user, partner, instance.label, action_type=new_or_change) return instance
def save(self, commit=True): # self.instance is a Contact instance company_id = self.data['company_id'] partner_url = self.data.get('partnerurl', '') partner_source = self.data.get('partnersource', '') status = Status.objects.create(approved_by=self.user) partner = Partner.objects.create(name=self.data['partnername'], uri=partner_url, owner_id=company_id, data_source=partner_source, approval_status=status) log_change(partner, self, self.user, partner, partner.name, action_type=ADDITION) self.data = remove_partner_data(self.data, ['partnername', 'partnerurl', 'csrfmiddlewaretoken', 'company', 'company_id', 'ct']) create_contact = any(self.cleaned_data.get(field) for field in self.__CONTACT_FIELDS if self.cleaned_data.get(field)) if create_contact: create_location = any(self.cleaned_data.get(field) for field in self.__LOCATION_FIELDS if self.cleaned_data.get(field)) self.instance.partner = partner instance = super(NewPartnerForm, self).save(commit) partner.primary_contact = instance if create_location: location = Location.objects.create(**{ field: self.cleaned_data[field] for field in self.__LOCATION_FIELDS}) if location not in instance.locations.all(): instance.locations.add(location) # Tag creation tag_data = filter(bool, self.cleaned_data['partner-tags'].split(',')) tags = tag_get_or_create(company_id, tag_data) partner.tags = tags partner.save() self.instance.tags = tags log_change(instance, self, self.user, partner, instance.name, action_type=ADDITION) return instance # No contact was created return None
def save(self, user, commit=True): new_or_change = CHANGE if self.instance.pk else ADDITION self.instance.update_last_action_time(False) instance = super(PartnerForm, self).save(commit) # Explicity set the primary_contact for the partner and re-save. try: instance.primary_contact = Contact.objects.get( pk=self.data['primary_contact'], partner=self.instance) except (Contact.DoesNotExist, ValueError): instance.primary_contact = None instance.save() log_change(instance, self, user, instance, instance.name, action_type=new_or_change) return instance
def delete_prm_item(request): """ Deletes Partners and Contacts """ company = get_company_or_404(request) partner_id = request.REQUEST.get('partner') partner_id = get_int_or_none(partner_id) item_id = request.REQUEST.get('id') contact_id = get_int_or_none(item_id) content_id = request.REQUEST.get('ct') content_id = get_int_or_none(content_id) if content_id == ContentType.objects.get_for_model(Partner).id: partner = get_object_or_404(Partner, id=partner_id, owner=company) log_change(partner, None, request.user, partner, partner.name, action_type=DELETION) partner.archive() return HttpResponseRedirect(reverse('prm') + '?company=' + str(company.id)) elif content_id == ContentType.objects.get_for_model(ContactRecord).id: contact_record = get_object_or_404(ContactRecord, partner=partner_id, id=item_id) partner = get_object_or_404(Partner, id=partner_id, owner=company) # At one point, contacts could be deleted. The previous functionality # at this location couldn't handle that, accessing # contact_record.contact.name directly. Chaining getattr may not be # pretty but it ensures that we will never be accessing nonexistent # attributes. contact_name = getattr(getattr(contact_record, 'contact', None), 'name', '') log_change(contact_record, None, request.user, partner, contact_name, action_type=DELETION) contact_record.archive() return HttpResponseRedirect(reverse('partner_records')+'?company=' + str(company.id)+'&partner=' + str(partner_id)) elif content_id == ContentType.objects.get_for_model(PartnerSavedSearch).id: saved_search = get_object_or_404(PartnerSavedSearch, id=item_id) partner = get_object_or_404(Partner, id=partner_id, owner=company) log_change(saved_search, None, request.user, partner, saved_search.email, action_type=DELETION) saved_search.delete() return HttpResponseRedirect(reverse('partner_searches')+'?company=' + str(company.id)+'&partner=' + str(partner_id)) else: partner = get_object_or_404(Partner, id=partner_id, owner=company) contact = get_object_or_404(Contact, id=contact_id) log_change(contact, None, request.user, partner, contact.name, action_type=DELETION) contact.archive() return HttpResponseRedirect(reverse('partner_details')+'?company=' + str(company.id)+'&partner=' + str(partner_id))
def save(self, request, commit=True): new_or_change = CHANGE if self.instance.pk else ADDITION instance = super(LocationForm, self).save(commit) for contact in instance.contacts.all(): contact.update_last_action_time() _, partner, _ = prm_worthy(request) log_change(instance, self, request.user, partner, instance.label, action_type=new_or_change) return instance
def save(self, request, partner, commit=True): new_or_change = CHANGE if self.instance.pk else ADDITION partner = Partner.objects.get(id=self.data['partner']) self.instance.partner = partner self.instance.update_last_action_time(False) contact = None if not self.instance.pk: contact = Contact.objects.filter( partner=partner, name=self.instance.name, email=self.instance.email).first() if contact: contact.phone = contact.phone or self.instance.phone contact.notes = contact.notes or self.instance.notes contact.archived_on = None contact.save() self.instance = contact contact = contact or super(ContactForm, self).save(commit) if any( self.cleaned_data.get(field) for field in self.__LOCATION_FIELDS if self.cleaned_data.get(field)): location = Location.objects.create( **{ field: self.cleaned_data[field] for field in self.__LOCATION_FIELDS }) if location not in contact.locations.all(): contact.locations.add(location) log_change(contact, self, request.user, partner, contact.name, action_type=new_or_change, impersonator=request.impersonator) return contact
def save(self, request, commit=True): new_or_change = CHANGE if self.instance.pk else ADDITION self.instance.update_last_action_time(False) instance = super(PartnerForm, self).save(commit) # Explicity set the primary_contact for the partner and re-save. try: instance.primary_contact = Contact.objects.get( pk=self.data['primary_contact'], partner=self.instance) except (Contact.DoesNotExist, ValueError): instance.primary_contact = None instance.save() log_change(instance, self, request.user, instance, instance.name, action_type=new_or_change, impersonator=request.impersonator) return instance
def delete_prm_item(request): """ Deletes Partners and Contacts """ company = get_company_or_404(request) partner_id = request.REQUEST.get('partner') partner_id = get_int_or_none(partner_id) item_id = request.REQUEST.get('id') contact_id = get_int_or_none(item_id) content_id = request.REQUEST.get('ct') content_id = get_int_or_none(content_id) if content_id == ContentType.objects.get_for_model(Partner).id: partner = get_object_or_404(Partner, id=partner_id, owner=company) Contact.objects.filter(partner=partner).delete() log_change(partner, None, request.user, partner, partner.name, action_type=DELETION) partner.delete() return HttpResponseRedirect(reverse('prm') + '?company=' + str(company.id)) elif content_id == ContentType.objects.get_for_model(ContactRecord).id: contact_record = get_object_or_404(ContactRecord, partner=partner_id, id=item_id) partner = get_object_or_404(Partner, id=partner_id, owner=company) log_change(contact_record, None, request.user, partner, contact_record.contact.name, action_type=DELETION) contact_record.delete() return HttpResponseRedirect(reverse('partner_records')+'?company=' + str(company.id)+'&partner=' + str(partner_id)) elif content_id == ContentType.objects.get_for_model(PartnerSavedSearch).id: saved_search = get_object_or_404(PartnerSavedSearch, id=item_id) partner = get_object_or_404(Partner, id=partner_id, owner=company) log_change(saved_search, None, request.user, partner, saved_search.email, action_type=DELETION) saved_search.delete() return HttpResponseRedirect(reverse('partner_searches')+'?company=' + str(company.id)+'&partner=' + str(partner_id)) else: partner = get_object_or_404(Partner, id=partner_id, owner=company) contact = get_object_or_404(Contact, id=contact_id) log_change(contact, None, request.user, partner, contact.name, action_type=DELETION) contact.delete() return HttpResponseRedirect(reverse('partner_details')+'?company=' + str(company.id)+'&partner=' + str(partner_id))
def save(self, request, partner, commit=True): new_or_change = CHANGE if self.instance.pk else ADDITION self.instance.partner = partner self.instance.update_last_action_time(False) if new_or_change == ADDITION: self.instance.created_by = request.user instance = super(ContactRecordForm, self).save(commit) self.instance.tags = self.cleaned_data.get('tags') attachments = self.cleaned_data.get('attachment', None) prm_attachments = [ PRMAttachment(attachment=attachment, contact_record=self.instance) for attachment in attachments if attachment ] PRMAttachment.objects.bulk_create(prm_attachments) PRMAttachment.objects.filter( pk__in=self.cleaned_data.get('attach_delete', [])).delete() if instance.contact: identifier = instance.contact.name else: identifier = { 'email': instance.contact_email, 'phone': instance.contact_phone }.get(instance.contact_type, 'unknown contact') log_change(instance, self, request.user, partner, identifier, action_type=new_or_change, impersonator=request.impersonator) return instance
def process_email(request): """ Creates a contact record from an email received via POST. """ if request.method != 'POST': return HttpResponse(status=200) admin_email = request.REQUEST.get('from') headers = request.REQUEST.get('headers') key = request.REQUEST.get('key') subject = request.REQUEST.get('subject') email_text = request.REQUEST.get('text') if key != settings.EMAIL_KEY: return HttpResponse(status=200) if headers: parser = HeaderParser() headers = parser.parsestr(headers) if headers and 'Date' in headers: try: date_time = get_datetime_from_str(headers.get('Date')) except Exception: date_time = now() else: date_time = now() to = request.REQUEST.get('to', '') cc = request.REQUEST.get('cc', '') recipient_emails_and_names = getaddresses(["%s, %s" % (to, cc)]) admin_email = getaddresses([admin_email])[0][1] contact_emails = filter(None, [email[1] for email in recipient_emails_and_names]) if contact_emails == [] or (len(contact_emails) == 1 and contact_emails[0].lower() == '*****@*****.**'): # If [email protected] is the only contact, assume it's a forward. fwd_headers = build_email_dicts(email_text) try: recipient_emails_and_names = fwd_headers[0]['recipients'] contact_emails = [recipient[1] for recipient in recipient_emails_and_names] date_time = fwd_headers[0]['date'] except IndexError: contact_emails = [] # Prevent duplicate contact records for an email address because # the address was in both To and CC. contact_emails = list(set(contact_emails)) validated_contacts = [] for element in contact_emails: if not element.lower() == '*****@*****.**' and validate_email(element): validated_contacts.append(element) contact_emails = validated_contacts try: contact_emails.remove(admin_email) except ValueError: pass admin_user = User.objects.get_email_owner(admin_email) if admin_user is None: return HttpResponse(status=200) if admin_user.company_set.count() > 1: error = "Your account is setup as the admin for multiple companies. " \ "Because of this we cannot match this email with a " \ "specific partner on a specific company with 100% certainty. " \ "You will need to login to My.jobs and go to " \ "https://secure.my.jobs/prm to create your record manually." send_contact_record_email_response([], [], [], contact_emails, error, admin_email) return HttpResponse(status=200) partners = list(chain(*[company.partner_set.all() for company in admin_user.company_set.all()])) possible_contacts, created_contacts, unmatched_contacts = [], [], [] for contact in contact_emails: try: matching_contacts = Contact.objects.filter(email=contact, partner__in=partners) [possible_contacts.append(x) for x in matching_contacts] if not matching_contacts: poss_partner = find_partner_from_email(partners, contact) if poss_partner: new_contact = Contact.objects.create(name=contact, email=contact, partner=poss_partner) change_msg = "Contact was created from email." log_change(new_contact, None, admin_user, new_contact.partner, new_contact.name, action_type=ADDITION, change_msg=change_msg) created_contacts.append(new_contact) else: unmatched_contacts.append(contact) except ValueError: unmatched_contacts.append(contact) num_attachments = int(request.POST.get('attachments', 0)) attachments = [] for file_number in range(1, num_attachments+1): try: attachment = request.FILES['attachment%s' % file_number] except KeyError: error = "There was an issue with the email attachments. The " \ "contact records for the email will need to be created " \ "manually." send_contact_record_email_response([], [], [], contact_emails, error, admin_email) return HttpResponse(status=200) attachments.append(attachment) created_records = [] attachment_failures = [] date_time = now() if not date_time else date_time all_contacts = possible_contacts + created_contacts if not all_contacts: error = "No contacts or contact records could be created " \ "from this email. You will need to log in and manually " \ "create contact records for this email." send_contact_record_email_response([], [], [], contact_emails, error, admin_email) return HttpResponse(status=200) for contact in all_contacts: change_msg = "Email was sent by %s to %s" % \ (admin_user.get_full_name(), contact.name) record = ContactRecord.objects.create(partner=contact.partner, contact_type='email', contact=contact, contact_email=contact.email, contact_phone=contact.phone, created_by=admin_user, date_time=date_time, subject=subject, notes=force_text(email_text)) try: for attachment in attachments: prm_attachment = PRMAttachment() prm_attachment.attachment = attachment prm_attachment.contact_record = record setattr(prm_attachment, 'partner', contact.partner) prm_attachment.save() # The file pointer for this attachment is now at the end of the # file; reset it to the beginning for future use. attachment.seek(0) except AttributeError: attachment_failures.append(record) log_change(record, None, admin_user, contact.partner, contact.name, action_type=ADDITION, change_msg=change_msg) created_records.append(record) send_contact_record_email_response(created_records, created_contacts, attachment_failures, unmatched_contacts, None, admin_email) return HttpResponse(status=200)