Generating vCards using VObject

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
"""
Functions for generating individual and group vCards from Django

The functions assume a "Person" object with the following fields:

  firstname
  lastname
  email
  phone
  id (automatically created by Django)

This code uses VObject: http://vobject.skyhouseconsulting.com/
"""

import vobject

def _vcard_string(person):
    """
    Helper function for vcard views. Accepts a 'person' object 
    with certain attributes (firstname, lastname, email, phone, id)
    and returns a string containing serialized vCard data.
    """
    # vobject API is a bit verbose...
    v = vobject.vCard()
    v.add('n')
    v.n.value = vobject.vcard.Name(family=person.lastname, given=person.firstname)
    v.add('fn')
    v.fn.value = "%s %s" % (person.firstname, person.lastname)
    v.add('email')
    v.email.value = person.email
    v.add('tel')
    v.tel.value = person.phone
    v.tel.type_param = 'WORK'
    v.add('url')
    v.url.value = "http://example.org/people/%s/" % person.id
    output = v.serialize()
    return output
    
def vcard(request, person_id):
    """
    View function for returning single vcard
    """
    person = Person.objects.get(pk=person_id)
    output = _vcard_string(person)
    filename = "%s%s.vcf" % (person.firstname, person.lastname)
    response = HttpResponse(output, mimetype="text/x-vCard")
    response['Content-Disposition'] = 'attachment; filename=%s' % filename
    return response

def group_vcard(request):
    """
    View function for returning group vcard
    """
    all = Person.objects.order_by('lastname', 'firstname')
    output = '\n'.join(_vcard_string(one) for one in all)
    response = HttpResponse(output, mimetype="text/x-vCard")
    response['Content-Disposition'] = 'attachment; filename=example_org_people.vcf'
    return response

More like this

  1. NonceField for disabling autocompletion by johnnoone 4 years, 3 months ago
  2. BBCode templatefilter (generate & strip) by b23 4 years, 10 months ago
  3. Test IP against IP address+Subnet whitelist by mtigas 3 years, 10 months ago
  4. UKPhoneNumberField by Nathan Reynolds 4 years, 6 months ago
  5. Currency formatting filter by rafa 3 years, 5 months ago

Comments

shacker (on December 8, 2010):

This turns out to be a case where a "time saving" library could cost you a lot more time than it saves. It's trivial to generate vcards with standard Django templates, using an existing card as a starter template. No external lib needed. This library is a verbose black box with no benefit that I can see (well, it's good for .ics output, but not helpful for vcard output).

Not only that, but it completely falls down when you try to output multiple phone numbers into a single vcard (at least I couldn't figure it out from the snippet provided).

#

(Forgotten your password?)