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 @@ {% endif %} + + + + 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'