diff --git a/abonapp/locale/ru/LC_MESSAGES/django.po b/abonapp/locale/ru/LC_MESSAGES/django.po
index 8db7255..ea1578e 100644
--- a/abonapp/locale/ru/LC_MESSAGES/django.po
+++ b/abonapp/locale/ru/LC_MESSAGES/django.po
@@ -1157,3 +1157,6 @@ msgstr "История задач"
msgid "Charts"
msgstr "Графики"
+
+msgid "Export vCards"
+msgstr "Экспорт в vCards"
diff --git a/abonapp/templates/abonapp/group_list.html b/abonapp/templates/abonapp/group_list.html
index 082329d..a433034 100644
--- a/abonapp/templates/abonapp/group_list.html
+++ b/abonapp/templates/abonapp/group_list.html
@@ -66,6 +66,10 @@
{% trans 'Fin report' %}
{% endif %}
+
+
+ {% trans 'Export vCards' %}
+
diff --git a/abonapp/urls.py b/abonapp/urls.py
index 025b136..1678087 100644
--- a/abonapp/urls.py
+++ b/abonapp/urls.py
@@ -62,6 +62,8 @@ urlpatterns = [
url(r'^ping$', views.abon_ping, name='ping'),
+ url(r'contacts/vcards/$', views.vcards, name='vcards'),
+
# Api's
url(r'^api/abons$', views.abons),
url(r'^api/abon_filter$', views.search_abon),
diff --git a/abonapp/views.py b/abonapp/views.py
index 2c4e9f7..f4eb315 100644
--- a/abonapp/views.py
+++ b/abonapp/views.py
@@ -773,7 +773,49 @@ def abon_ping(request):
}
-@method_decorator((login_required, lib.decorators.only_admins,), name='dispatch')
+@login_required
+def vcards(r):
+ abons = models.Abon.objects.exclude(group=None).select_related('group', 'street').only(
+ 'username', 'fio', 'group__title', 'telephone',
+ 'street__name', 'house'
+ )
+ additional_tels = models.AdditionalTelephone.objects.select_related('abon', 'abon__group', 'abon__street')
+ response = HttpResponse(content_type='text/x-vcard')
+ response['Content-Disposition'] = 'attachment; filename="contacts.vcard"'
+ tmpl = ("BEGIN:VCARD\r\n"
+ "VERSION:4.0\r\n"
+ "FN:%(uname)s. %(group_name)s, %(street)s %(house)s\r\n"
+ "IMPP:sip:%(abon_telephone)s@dial.lo\r\n"
+ "END:VCARD\r\n")
+
+ def _make_vcard():
+ for ab in abons.iterator():
+ tel = ab.telephone
+ if tel:
+ yield tmpl % {
+ 'uname': ab.get_full_name(),
+ 'group_name': ab.group.title,
+ 'street': ab.street.name if ab.street else '',
+ 'house': ab.house,
+ 'abon_telephone': tel
+ }
+ if not additional_tels.exists():
+ return
+ for add_tel in additional_tels.iterator():
+ abon = add_tel.abon
+ yield tmpl % {
+ 'uname': "%s (%s)" % (add_tel.owner_name, abon.get_full_name()),
+ 'group_name': abon.group.title,
+ 'abon_telephone': add_tel.telephone,
+ 'street': abon.street.name if abon.street else '',
+ 'house': abon.house
+ }
+
+ response.content = _make_vcard()
+ return response
+
+
+@method_decorator((login_required, lib.decorators.only_admins), name='dispatch')
class DialsListView(BaseAbonListView):
context_object_name = 'logs'
template_name = 'abonapp/dial_log.html'