Esempio n. 1
0
    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
Esempio n. 2
0
    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
Esempio n. 3
0
    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
Esempio n. 4
0
    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
Esempio n. 5
0
    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
Esempio n. 6
0
    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
Esempio n. 7
0
    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
Esempio n. 8
0
    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
Esempio n. 9
0
    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
Esempio n. 10
0
 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
Esempio n. 11
0
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))
Esempio n. 12
0
    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
Esempio n. 13
0
    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
Esempio n. 14
0
 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
Esempio n. 15
0
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))
Esempio n. 16
0
    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
Esempio n. 17
0
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)